108 votes

Comment puis-je examiner le contenu d'une section de données d'un fichier ELF sur Linux?

J'ai utilisé objdump pour examiner le code d'assemblage dans les binaires Linux ELF.

Parfois, il y a un saut indirect à travers une table de saut qui est stockée dans la section rodata (données en lecture seule).

Comment obtenir objdump ou tout autre outil pour me montrer le contenu de cette section de données?

Je pourrais exécuter le programme et examiner les adresses pertinentes dans le débogueur, mais je ne veux pas le faire car cela doit être fait de manière interactive.

La réponse idéale identifiera un outil qui non seulement me montrera le contenu mais me permettra de contrôler le format d'affichage, tout comme le fait od.

135voto

hobbs Points 71946
objdump -s -j .rodata exefile

affiche un dump hexadécimal/côté à côté des contenus de la section rodata comme suit :

Contents of section .rodata :
0000 67452301 efcdab89 67452301 efcdab89 gE#.....gE#.....
0010 64636261 68676665 64636261 68676665 dcbahgfedcbahgfe

Il ne semble pas y avoir de quoi contrôler le formatage, mais c'est un début. Vous pourriez toujours décoder l'hexadécimal et le passer à od, je suppose :)

52voto

Ciro Santilli Points 3341
readelf -x .rodata hello_world.o

donne :

Extrait hexadécimal de la section '.rodata' :
  0x00000000 48656c6c 6f20776f 726c6421 0a       Hello world!.

Vous devriez préférer readelf lorsque c'est possible car objdump ne montre tout simplement pas certaines sections comme .symtab : Pourquoi objdump ne montre pas les sections .bss, .shstratab, .symtab et .strtab ?

Vous pouvez également extraire les octets bruts avec les techniques mentionnées à l'adresse : Comment extraire uniquement le contenu d'une section ELF comme mentionné par ysdx.

21voto

ysdx Points 2444

Vous pouvez obtenir la section RAW (non hexdump-ée) ELF avec :

# Pour un fichier :
objcopy fichier /dev/null --dump-section .text=text.data
# Pour stdout :
objcopy fichier /dev/null --dump-section .text=/dev/stdout | cat

Ici j'utilise | cat afin de forcer stdout à être un pipe. /dev/stdout pourrait fonctionner de manière inattendue si stdout est un fichier. .text=- n'envoie pas vers stdout mais vers le fichier -.

Cependant, objcopy et objdump ont certaines lacunes (car ils sont basés sur BFD qui abstrait différents formats exécutables).

Mise à jour : J'ai écrit un outil pour faire cela qui ne dépend pas de BFD.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X