Como carregar símbolos definidos da biblioteca em um local especificado?
O teste é no Ubuntu 12.04, 32 bits, comgcc
4.6.3
Basicamente, estou fazendo algum trabalho de manipulação binária em binários ELF, e o que tenho que fazer agora é montar um programa de montagem e garantir que os símbolos libc sejam carregados em um endereço predefinido por mim.
Deixe-me elaborá-lo em um exemplo simples.
Suponha no código original, símbolos libcstdout@GLIBC_2.0
é usado.
#include <stdio.h>
int main() {
FILE* fout = stdout;
fprintf( fout, "hello\n" );
}
Quando eu compilar e verificar o endereço do símbolo usando estes comandos:
gcc main.c
readelf -s a.out | grep stdout
Eu tenho esse:
0804a020 4 OBJECT GLOBAL DEFAULT 25 stdout@GLIBC_2.0 (2)
0804a020 4 OBJECT GLOBAL DEFAULT 25 stdout@@GLIBC_2.0
e a.bss
seção é assim:
readelf -S a.out | grep bss
[25] .bss NOBITS 0804a020 001014 00000c 00 WA 0 0 32
Agora, o que estou tentando fazer é carregar ostdout
símbolo em um endereço predefinido, então eu fiz isso:
echo "stdout = 0x804a024;" > symbolfile
gcc -Wl,--just-symbols=symbolfile main.c
Então, quando eu checo o.bss
seção e símbolostdout
, Eu tenho esse:
[25] .bss NOBITS 0804a014 001014 000008 00 WA 0 0 4
4: 0804a024 0 NOTYPE GLOBAL DEFAULT ABS stdout
49: 0804a024 0 NOTYPE GLOBAL DEFAULT ABS stdout
Parece que não carreguei com sucesso o símbolostdout@@GLIBC_2.0
, mas apenas um fiostdout
. (Tentei escreverstdout@@GLIBC_2.0
nosymbolfile
, mas não pode compilar ...)
Parece que como não o fiz, o endereço inicial de.bss
A seção também mudou, o que torna o endereço destdout
símbolo em uma área sem seção. Durante o tempo de execução, gera uma falha de segmentação ao carregar de0x804a024
.
Alguém poderia me ajudar sobre como carregar com êxito o símbolo da biblioteca em um endereço predefinido? Obrigado!