¿Cómo cargar los símbolos definidos por la biblioteca en una ubicación específica?
La prueba está en Ubuntu 12.04, 32 bits, congcc
4.6.3.
Básicamente estoy haciendo un trabajo de manipulación binaria en los archivos binarios ELF, y lo que tengo que hacer ahora es ensamblar un programa de ensamblaje y garantizar que los símbolos libc se carguen en una dirección predefinida.
Permítanme elaborarlo en un ejemplo simple.
Supongamos en el código original, símbolos libcstdout@GLIBC_2.0
es usado
#include <stdio.h>
int main() {
FILE* fout = stdout;
fprintf( fout, "hello\n" );
}
Cuando lo compilo y verifico la dirección del símbolo usando estos comandos:
gcc main.c
readelf -s a.out | grep stdout
Tengo esto:
0804a020 4 OBJECT GLOBAL DEFAULT 25 stdout@GLIBC_2.0 (2)
0804a020 4 OBJECT GLOBAL DEFAULT 25 stdout@@GLIBC_2.0
y el.bss
La sección es así:
readelf -S a.out | grep bss
[25] .bss NOBITS 0804a020 001014 00000c 00 WA 0 0 32
Ahora lo que intento hacer es cargar elstdout
símbolo en una dirección predefinida, así que hice esto:
echo "stdout = 0x804a024;" > symbolfile
gcc -Wl,--just-symbols=symbolfile main.c
Entonces cuando reviso el.bss
sección y símbolostdout
, Tengo esto:
[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 no cargué correctamente el símbolostdout@@GLIBC_2.0
, pero solo un cablestdout
. (Traté de escribirstdout@@GLIBC_2.0
ensymbolfile
, pero no puede compilar ...)
Parece que, como no lo hice, la dirección inicial de.bss
la sección también ha cambiado, lo que hace que la dirección destdout
símbolo en un área sin sección. Durante el tiempo de ejecución, arroja una falla de segmentación cuando se carga desde0x804a024
.
¿Alguien podría ayudarme a cargar correctamente el símbolo de la biblioteca en una dirección predefinida? ¡Gracias!