Comment charger des symboles définis par la bibliothèque à un emplacement spécifié?

Le test est sur Ubuntu 12.04, 32 bits, avec gcc 4.6.3.

En gros, je fais quelques manipulations binarys sur les binarys ELF et je dois maintenant assembler un programme d’assemblage et garantir que les symboles libc sont chargés sur une adresse prédéfinie.

Laissez-moi élaborer dans un exemple simple.

Supposons que, dans le code d’origine, les symboles libc stdout@GLIBC_2.0 soient utilisés.

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

Lorsque je le comstack et vérifie l’adresse du symbole à l’aide de ces commandes:

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

J’ai eu ceci:

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

et la section .bss est comme ceci:

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

Maintenant, ce que j’essaie de faire, c’est de charger le symbole stdout dans une adresse prédéfinie, alors j’ai fait ceci:

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

Puis, quand j’ai vérifié la section .bss et le symbole stdout , j’ai eu ceci:

  [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 
  1. Il semble que je n’ai pas chargé avec succès le symbole stdout@@GLIBC_2.0 , mais juste un stdout câblé. (J’ai essayé d’écrire stdout@@GLIBC_2.0 en symbolfile , mais la compilation est impossible …)

  2. Il semble que comme je ne l’ai pas fait, l’adresse de début de la section .bss a également changé, ce qui rend l’adresse du symbole stdout dans une zone de non-section. Au cours de l’exécution, une erreur de segmentation est 0x804a024 lors du chargement à partir de 0x804a024 .

Quelqu’un pourrait-il m’aider à charger correctement le symbole de bibliothèque à une adresse prédéfinie? Merci!