Wie lade ich bibliotheksdefinierte Symbole an einen bestimmten Ort?

Der Test läuft unter Ubuntu 12.04, 32-Bit, mitgcc 4.6.3.

rundsätzlich mache ich einige Binärmanipulationsarbeiten an ELF-Binärdateien, und jetzt muss ich ein Assemblierungsprogramm zusammenstellen und sicherstellen, dass die libc-Symbole von mir an eine vordefinierte Adresse geladen werde

Lassen Sie mich das in einem einfachen Beispiel erläutern.

Angenommen, im Originalcode sind die libc-Symbolestdout@GLIBC_2.0 wird genutzt

#include <stdio.h>
int main() {
    FILE* fout = stdout;
    fprintf( fout, "hello\n" );
}

Wenn ich es kompiliere und die Symboladresse mit diesen Befehlen überprüfe:

gcc main.c
readelf -s a.out | grep stdout

Ich schaff das

0804a020     4 OBJECT  GLOBAL DEFAULT   25 stdout@GLIBC_2.0 (2)
0804a020     4 OBJECT  GLOBAL DEFAULT   25 stdout@@GLIBC_2.0

und die.bss Abschnitt ist wie folgt:

  readelf -S a.out | grep bss
  [25] .bss              NOBITS          0804a020 001014 00000c 00  WA  0   0 32

Jetzt versuche ich, das @ zu ladstdout Symbol in einer vordefinierten Adresse, also habe ich das gemacht:

echo "stdout = 0x804a024;" > symbolfile
gcc -Wl,--just-symbols=symbolfile  main.c

Dann, wenn ich das @ überprüf.bss section and symbolstdout, Ich schaff das

 [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

Es scheint, dass ich das Symbol @ nicht erfolgreich geladen hastdout@@GLIBC_2.0, aber nur ein kabelgebundenesstdout. (Ich habe versucht, @ zu schreibstdout@@GLIBC_2.0 imsymbolfile, aber es kann nicht kompiliert werden ...)

Es scheint, als hätte ich es nicht geschafft, die Anfangsadresse von.bss Abschnitt hat sich auch geändert, wodurch die Adresse vonstdout -Symbol in einem Nicht-Abschnittsbereich. Während der Laufzeit wird beim Laden von @ ein Segmentierungsfehler ausgelös0x804a024.

Kann mir jemand helfen, wie man das Bibliothekssymbol an einer vordefinierten Adresse erfolgreich lädt? Vielen Dank

Antworten auf die Frage(0)

Ihre Antwort auf die Frage