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

StackOverflow https://stackoverflow.com/questions/1685483

Question

Je me sers objdump de regarder le code assembleur dans les binaires Linux ELF.

Parfois, il y a un saut indirect à travers une table de saut qui est stocké 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 d'examiner les adresses pertinentes dans le débogueur, mais je ne veux pas le faire parce qu'il doit être fait de manière interactive.

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

Était-ce utile?

La solution

objdump -s -j .rodata exefile

donne un hexagone côte à côté / décharge imprimable ASCII du contenu de la section rodata comme:

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

Il ne ressemble pas il y a quelque chose là-dedans pour contrôler la mise en forme, mais il est un bon début. Vous pouvez toujours undump l'hexagone et le nourrir à od, je suppose:)

Autres conseils

readelf -x .rodata hello_world.o

donne:

Hex dump of section '.rodata':
  0x00000000 48656c6c 6f20776f 726c6421 0a       Hello world!.

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

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

Vous pouvez obtenir le RAW (non HexDump-ed) section ELF avec:

# To a file:
objcopy file /dev/null --dump-section .text=text.data
# To stdout:
objcopy file /dev/null --dump-section .text=/dev/stdout | cat

J'utilise ici | cat pour forcer stdout être un tuyau. /dev/stdout pourrait fonctionner de façon inattendue si stdout est un fichier. .text=- n'envoie pas à stdout mais au fichier -.

Cependant objcopy et objdump ont quelques lacunes (parce qu'ils sont basés sur BFD qui fait abstraction de différents formats exécutables).

Mise à jour: J'ai écrit un pour faire ce qui ne repose pas sur BFD.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top