¿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!

Respuestas a la pregunta(0)

Su respuesta a la pregunta