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