Si vous aimez programmer sous Linux et que votre travail tourne autour des compilateurs, il existe une poignée d'utilitaires de ligne de commande que vous devez connaître. Un de ces outils est objdump . Dans ce didacticiel, nous aborderons les bases de cette commande à l'aide d'exemples faciles à comprendre.
Mais avant cela, il convient de mentionner que tous les exemples ici ont été testés sur une machine Ubuntu 20.04 LTS et sur Debian 10.
Commande objdump Linux
La commande objdump sous Linux, comme son nom l'indique, affiche des informations à partir de fichiers objets. Voici la syntaxe de l'outil :
objdump OPTIONS fichier obj ...
Et voici ce que dit la page de manuel :
objdump affiche des informations sur un ou plusieurs fichiers objet. Les options contrôlent les informations particulières
à afficher. Ces informations sont surtout utiles aux programmeurs qui travaillent sur les
outils de compilation, par opposition aux programmeurs qui veulent juste que leur programme compile et fonctionne.
objfile... sont les fichiers objet à être examiné. Lorsque vous spécifiez des archives, objdump affiche
des informations sur chacun des fichiers d'objets membres.
Voici quelques exemples sous forme de questions-réponses qui devraient vous donner une meilleure idée du fonctionnement d'objdump.
Q1. Comment faire en sorte que objdump affiche le contenu de l'en-tête du fichier ?
Cela peut être fait en utilisant l'option de ligne de commande -f.
Par exemple :
objdump -f /bin/ls
Et voici le résultat de la commande ci-dessus :
/bin/ls : format de fichier elf64-x86-64
architecture :i386:x86-64, indicateurs 0x00000150 :
HAS_SYMS, DYNAMIC, D_PAGED
adresse de début 0x00000000000067d0
Ainsi, vous pouvez voir que le contenu de l'en-tête de 'ls' a été affiché dans la sortie.
Q2. Comment faire en sorte que objdump affiche un contenu d'en-tête de fichier spécifique au format d'objet ?
Cela peut être fait en utilisant l'option de ligne de commande -p. Par exemple, la commande suivante :
objdump -p /bin/ls
Produit la sortie suivante :
/ bin / ls:format de fichier elf64-x86-64
En-tête du programme:
phdr off 0x0000000000000040 VADDR 0x00000000000040 PADDR 0x0000000000000040 Align 2 ** 3
fichiers 0x00000000000001f8 MEMSZ 0x0000000000000000000000000000000000000001f8 MEMSZ 0x0000000000000000000000000000000000000001F8 MEMSZ 0x00000000000000000000000000000000000001F8 MEMSZ 0X0000000000000000000000000000000001F8 MEMSZ 0X0000000000000000000000000000001 Flags R-X
Interp Off 0x0000000000000238 VADDR 0x0000000000000238 PADDR 0x00000000000238 Align 2 ** 0
Filesz 0x000000000000001C MEMSZ 0x00000000000000001C RADRAC filesz 0x000000000001e6e8 MEMSZ drapeaux 0x000000000001e6e8 r-x
charge hors 0x000000000001eff0 vaddr 0x000000000021eff0 PADDR 0x000000000021eff0 align 2 ** 21
filesz 0x0000000000001278 MEMSZ drapeaux 0x0000000000002570 rw-
DYNAMIC off 0x000000000001fa38 vaddr 0x000000000021fa38 PADDR 0x000000000021fa38 align 2 ** 3
filesz 0x0000000000000200 memsz 0x0000000000000200 flags rw-
REMARQUE off 0x0000000000000254 vaddr 0x 0000000000000254 PADDR 0x0000000000000254 align 2 ** 2
filesz 0x0000000000000044 MEMSZ drapeaux 0x0000000000000044 r--
EH_FRAME hors 0x000000000001b1a0 vaddr 0x000000000001b1a0 PADDR 0x000000000001b1a0 align 2 ** 2
drapeaux filesz 0x0000000000000884 MEMSZ 0x0000000000000884 r -
STACK off 0x0000000000000000 vaddr 0x0000000000000000 PADDR 0x0000000000000000 align 2 ** 4
drapeaux filesz 0x0000000000000000 MEMSZ 0x0000000000000000 rw-
relro off 0x000000000001eff0 vaddr 0x000000000021eff0 PADDR 0x000000000021eff0 align 2 ** 0
filesz 0x0000000000001010 MEMSZ 0x0000000000001010 drapeaux R--
Section dynamique:
LIBSLELINUX.SO.1
nécessaire libc.so.6
init 0x0000000000003758
fin 0x000000000001636c
INIT_ARRAY 0x000000000021eff0
INIT_ARRAYSZ 0x0000000000000008
FINI_ARRAY 0x000000000021eff8
FINI_ARRAYSZ 0x0000000000000008 GNU_HASH 0x0000000000000298
strtab 0x0000000000001180 symtab 0x0000000000000388
STRSZ 0x0000000000000682 SYMENT 0x0000000000000018
DEBUG 0x0000000000000000 PLTGOT 0x000000000021fc38
PLTRELSZ 0x0000000000000a68
PLTREL 0x0000000000000007
JMPREL 0x0000000000002cf0
RELA 0x00000000000019a0
RELASZ 0x0000000000001350
RELAENT 0x0000000000000018
FLAGS 0x0000000000000008
FLAGS_1 0x0000000008000001
VERNEED 0x0000000000001930
Verneednum 0x0000000000000001
Versym 0x00000000001802
Relacount 0x000000000000C1
Références de la version:
requise à partir de libc.so. .6:
0x06969194 0x00 07 glibc_2.14
0x0d696914 0x00 06 glibc_2.4
0x06969197 0x00 05 glibc_2.17
0x09691974 0x00 04 GLIBC_2.3.4 GLIBC_2.2.5
0x0d696913 0x00 02 GLIBC_2.3
Q3. Comment faire en sorte que objdump affiche le contenu des en-têtes de section ?
Cela peut être fait en utilisant l'option de ligne de commande -h. Par exemple, la commande suivante :
objdump -h /bin/ls
produit la sortie suivante sur mon système :
/ bin / ls:format de fichier elf64-x86-64
sections:
idx nom de la taille VMA lma off algn
0 .interp 0000001c 0000000000000238 00000000000238 00000238 2 * * 0
Contenu, alloc, charge, lecture, données
1 .note.abi-tag 00000020 0000000000000254 0000000000000254 00000254 2 ** 2
Contenu, alloc, charge, lecture, données
2 .note.gnu.build-id 00000024 0000000000000274 0000000000000274 00000274 2 ** 2
Contenu, alloc, charge, readonly, data
3 .gnu.hash 00000000EC 00000000000298 0000000000000298 00000298 3 ** 3SOMMAIRE, ALLOC, LOAD, READONLY, DATA
4 .dynsym 00000df8 0000000000000388 0000000000000388 00000388 2 ** 3
CONTENU, ALLOC, LOAD, READONLY, DATA
5 .dynstr 0000000000001180 0000000000001180 00000682 00001180 2**0
CONTENU, ALLOCATION , Charge, readonly, données
6 .gnu.version 0000012A 0000000000001802 0000000000001802 00001802 2 ** 1
Contenu, alloc, charge, readonly, données
7 .GNU.Version_R 00000070 0000000000000000001 ** 3
Contenu, alloc, chargement, readonly, données
8 .rela.dyn 00001350 00000000000019A0 00000000000019A0 000019A0 2 ** 3
Contenu, alloc, charge, lecture, données
9 .rela.plt 00000A68 0000000000002CF0 0000000000002CF0 00002CF0 2 ** 3
Contenu, alloc, chargement, lecture, données
10 .Init 00000017 0000000000000000003758 00000000003758 0000003758 2 **
CONTRÔLE, ALLOCT, ALLOCT, ALLOCT, ALLOCTO , ReadOnly, Code
11 .plt 00000700 0000000000003770 000000000000003770 00003770 2 ** 4
Contenu, alloc, chargement, readonly,
12 .plt.got 00000018 0000000000003e70 000000000000000000000000000000000000000000000000000000003 br /> Contenu, alloc, chargement, readonly, code
13 .text 000124d9 000000000000003E90 0000000000003E90 00003E90 2 ** 4
Contenu, alloc, charge, lecture, code
* 2
Contenu, alloc, chargement, lecture, code
15 .rodata 00004e1d 0000000000016380 0000000000016380 00016380 2 ** 5
Contenu, alloc, charge, readonly, données
16 .EH_FRAME_HDR 00000884 000000000001B1A0 000000000001B1A0 0001B1A0 2 ** 2
Contenu, alloc, chargement, readonly, données
br /> 18 .init_array 00000008 000000000021EFF0 000000000021EFF0 0001EFF0 2 ** 3
Contenu, alloc, chargement, données
19 .Fini_Array 00000008 000000000021EFF8 0000000021F8 0001F8 2 ** 3
TABLE DES MATIERES, ALLOC, CHARGE DE DONNÉES
20 .data.rel.ro 00000a38 000000000021f000 000000000021f000 0001f000 2 ** 5
CONTENU, ALLOC, CHARGE, DE DONNÉES
21 .dynamic 00000200 000000000021fa38 000000000021fa38 0001fa38 2 * * 3
Contenu, alloc, charge, données
22 .got 000003C8 000000000021FC38 000000000021FC38 0001FC38 2 ** 3
Contenu, alloc, charge, données
2 ** 5
CONTENU, ALLOC, LOAD, DATA
24 .bss 000012e0 0000000000220280 0000000000220280 00020268 2 ** 5 ALLOC
25 .gnu_debuglink 00000034 0000000000000000 0000000000000000 00020268 2 ** 2
CONTENU, EN LECTURE SEULE
Q4. Comment faire en sorte que objdump affiche tous les en-têtes ?
Pour que objdump affiche tous les en-têtes, utilisez l'option de ligne de commande -x.
objdump -x /bin/ls
Voici la sortie produite par cette commande sur mon système :
/bin/ls : format de fichier elf64-x86-64
/bin/ls
architecture :i386:x86-64, indicateurs 0x00000150 :
HAS_SYMS, DYNAMIC, D_PAGED
adresse de départ 0x0000000000005850
Programme-tête:
PHDR hors 0x0000000000000040 vaddr 0x0000000000000040 PADDR 0x0000000000000040 align 2 ** 3
filesz 0x00000000000001f8 MEMSZ drapeaux 0x00000000000001f8 r-x
INTERP hors 0x0000000000000238 vaddr 0x0000000000000238 PADDR 0x0000000000000238 Aligner 2 ** 0
Filesz 0x000000000000001C MEMSZ 0x0000000000001C Flags R--
Chargez le désactivation 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ALIGN 2 ** 21 21 OFF 0x000000000001EFF0 VADDR 0x000000000021EFF0 PADDR 0x000000000021EFF0 Align 2 ** 21
Filesz 0x0000000000001278 MEMSZ 0x0000000000002570 FLAGS RW-
Dynamic Off 0x00000000001FA38 VADDR 0x0000000000000000000000000000000000001FA38 LIGN 2 ** 3
filesz 0x0000000000000200 MEMSZ 0x00000000000200 Flags RW-
Remarquez 0x00000000000254 VADDR 0x00000000000254 PADDR 0x0000000000000254 ALIGN 2 ** 2
Fichiers 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002 0x000000000001b1a0 vaddr 0x000000000001b1a0 PADDR 0x000000000001b1a0 align 2 ** 2
filesz 0x0000000000000884 MEMSZ drapeaux 0x0000000000000884 r--
STACK hors 0x0000000000000000 vaddr 0x0000000000000000 PADDR 0x0000000000000000 align 2 ** 4
filesz 0x0000000000000000 MEMSZ 0x0000000000000000 drapeaux rw-
RERRO OFF 0x000000000001EFF0 VADDR 0x000000000021EFF0 PADDR 0x000000000021EFF0 Align 2 ** 0
Filesz 0x0000000000001010 MEMSZ 0x0000000000001010 FLAGS R -
Dynamic Section:
/> NÉCESSAIRE libc.so.6
INIT 0x0000000000003758
FINI 0x000000000001636c
INIT_ARRAY
0x000000000021eff0 INIT_ARRAYSZ 0x0000000000000008
FINI_ARRAY 0x000000000021eff8 FINI_ARRAYSZ 0x0000000000000008
GNU_HASH 0x0000000000000298 strtab 0x0000000000001180
symtab 0x0000000000000388 STRSZ 0x0000000000000682
SYMENT 0x0000000000000018
DEBUG 0x0000000000000000 PLTGOT 0x000000000021fc38
PLTRELSZ 0x0000000000000a68 PLTREL 0x0000000000000007
JMPREL 0x0000000000002cf0 RELA 0x00000000000019a0
RELASZ 0x0000000000001350 RELAENT 0x0000000000000018
RELACOUNT 0x00000000000000C1
Références de la version:
requise de libc.so.6:
0x06969194 0x00 07 GLIBC_2.14
0x0d696914 0x00 06 GLIBC_2.4.4
0x06969197 0x00 05 GLIBC_2.17
0x09691974 0x00 04 GLIBC_2.3.4
0x09691a75 0x00 03 GLIBC_2.2.5
0x0d696913 0x0_0 :0x0d696913 0x0_0
idx Nom Taille VMA LMA Fichier Off Algn
0 .interp 0000001C 000000000000000238 0000000000000238 00000238 2 ** 0
Contenu, alloc, chargement, lecture, données
1 .Note.abi- TAG 00000020 0000000000000254 0000000000000254 00000254 2 ** 2
Contenu, alloc, chargement, readonly, données
2 .note.gnu.build-id 00000024 0000000000000274 000000000274 00000274 2 ** 2
CONTERS, ALLOCOC , CHARGER, LECTURE SEULE, DONNÉES
3 .gnu.hash 000000ec 0000000000000298 0000000000000298 00000298 2**3
SOMMAIRE, ALLOC, LOAD, READONLY, DATA
4 .dynsym 00000df8 0000000000000388 0000000000000388 00000388 2 ** 3
CONTENU, ALLOC, LOAD, READONLY, DATA
5 .dynstr 00000682 0000000000001180 0000000000001180 00001180 2 ** 0
Contenu, alloc, charge, lecture, données
6 .gnu.version 0000012a 000000000000001802 000000000000001802 00001802 2 ** 1
Contentement, alloc, charge, lecture, données7 .gnu.version_r 00000070 0000000000001930 0000000000001930 00001930 2 ** 3
CONTENU, ALLOC, LOAD, READONLY, DATA
8 .rela.dyn 00001350 00000000000019a0 00000000000019a0 000019a0 2 ** 3 SOMMAIRE
, ALLOC, LOAD, READONLY, DATA
9 .rela.plt 00000a68 0000000000002cf0 0000000000002cf0 00002cf0 2 ** 3
CONTENU, ALLOC, LOAD, READONLY, DATA
10 .init 00000017 0000000000003758 0000000000003758 00003758 2 ** 2
Contenu, alloc, charge, lecture, code
11 .plt 00000700 0000000000003770 000000000000003770 00003770 2 ** 4
Contenu, alloc, charge, lecture, code
12 .plt.got 00000018 0000000000003E70 0000000000003E70 00003E70 2 ** 3
Contenu, alloc, chargement, readonly, code
13 .Text 000124d9 000000000000003e90 0000000000003e90 00003e90 2 ** 4
CONTRESS, ALLOC , Readonly, code
14 .fini 00000009 000000000001636C 000000000001636C 0001636C 2 ** 2
Contenu, alloc, charge, lecture, code
15 .rodata 00004e1d 00000000016380 00000000000> Contenu, alloc, chargement, readonly, données
16 .eh_frame_hdr 00000884 000000000001b1a0 000000000001b1a00001b1a0 2 ** 2
contenu, alloc, charge, lecture, donnéesContenu, alloc, chargement, readonly, données
18 .init_array 00000008 00000000000021EFF0 000000000021EFF0 0001EFF0 2 ** 3
Contenu, ALLOC, charge, données
19 19 .fini_array 00000008 000000000021eff8 000000000021eff8 0001eff8 2 ** 3
CONTENU, ALLOC, LOAD, DATA
20 .data.rel.ro 00000a38 0001f000 000000000021f000 000000000021f000 2 ** 5
CONTENU, ALLOC, LOAD, Données
21 .dynamic 00000200 000000000021FA38 000000000021FA38 0001FA38 2 ** 3
Contenu, alloc, charge, données
22 .got 000003C8 000000000021FC38 0000000021FC38000 Charge, données
23 .data 00000268 0000000000220000 000000000022000000020000 2 ** 5
Contenu, alloc, charge, données
24 .BSS 000012E0 000000000000280 0000000022028000020268 2 ** 5
ALLOC
25 .gnu_debuglink 00000034 0000000000000000 0000000000000000 00020268 2**2
CONTENU, EN LECTURE SEULE
SYMBOLE TABLE :
Q5. Comment faire en sorte que objdump affiche le contenu en assembleur des sections exécutables ?
Pour cela, utilisez l'option de ligne de commande -d. Voici un exemple montrant cette option en action :
objdump -d /bin/lsEt voici un extrait du résultat :
/bin/ls : format de fichier elf64-x86-64
Démontage de la section .init :
0000000000003758 <[email protected]@Base> :
3758 : 48 83 ec 08 sub $0x8,%rsp
375c : 48 8b 05 7d c8 21 00 mov 0x21c87d(%rip),%rax 48 85 C0 Test% Rax,% Rax
3766:74 02 JE 376A <[Email Protected] @ Base + 0x12>
3768:FF D0 Callq *% Rax
376a:48 83 C4 08 add $0x8,%rsp
376e : c3 retq
Démontage de la section .plt :
0000000000003770 <[email 3 7 7 > :FF 35 CA C4 21 00 PUSHQ 0X21C4CA (% RIP) # 21FC40 <[Email Protected] @ Base + 0x260>
3776:FF 25 CC C4 21 00 JMPQ * 0X21C4CC (% RIP) # 21FC48 <[Protégé par e-mail * 0x21c4cc (% RIP) # 21FC48 <[Protégé par e-mail * 0x21C4CC (% RIP) # 21FC48 <[Protégé par e-mail * ]@Base+0x268>
377c : 0f 1f 40 00 nopl 0x0(%rax)
0000000000003780 <[email protected]> :
3780 : ff 25 ca c4 21 00 jmpq *0x21c4ca(%rip) # 21fc50 <[email protected]_2.3>
0 0 3786 : 3786 : 0 3786 00 00 pushq $0x0
378b : e9 e0 ff ff ff jmpq 3770 <[email protected]@Base+0x18>
0000000000003790 <[email protected]> : 3 9/> : 37/> FF 25 C2 C4 21 00 JMPQ * 0X21C4C2 (% RIP) # 21FC58 <[Protégé par e-mail] _2.2.5>
3796:68 01 00 00 00 Pushq 0x1
379b:E9 D0 FF FF JMPQ 3770 <[email protected]@Base+0x18>
00000000000037a0 <[email protected]> :
37a0 : ff 25 ba c4 21 00 jmpq *0x21c4ba(%rip) # 21fc60 <[ email protected]_2.2.5>
37a6 : 68 02 00 00 00 pushq $0x2De même, vous pouvez utiliser l'option de ligne de commande -D pour que objdump affiche le contenu de l'assembleur de toutes les sections, et l'option -S pour vous assurer que l'outil mélange le code source avec le désassemblage.
Q6. Comment faire en sorte que objdump affiche les informations de débogage ?
Cela peut être rendu possible en utilisant l'option de ligne de commande -S.
objdump -g /bin/lsVoici un extrait de la sortie produite par cette commande :
Contenu de la section .eh_frame (chargée depuis /bin/ls) :
00000000 0000000000000014 00000000 CIE
Version : 1
Augmentation : "zR"
Facteur d'alignement du code :1
Facteur d'alignement des données :-8
Colonne d'adresse de retour :16
Données d'augmentation : 1b
DW_CFA_def_cfa :r7 (rsp) ofs 8
/> Dw_cfa_offset:r16 (rip) à cfa-8
dw_cfa_undefined:r16 (rip)
00000018 0000000000000014 0000001C FDE CIE =00000000 PC =00000000000000000000..000000000000000087B /> DW_CFA_nop
DW_CFA_nop
DW_CFA_nop
DW_CFA_nop
DW_CFA_nop
DW_CFA_nop
DW_CFA_nop
00000030 0000000000000014 00000000 CIE
Version : > Augmentation : "zR"
Facteur d'alignement du code :1
Facteur d'alignement des données : -8
Colonne d'adresse de retour : 16
Données d'augmentation : 1b
DW_CFA_def_cfa :r7 ( rsp) ofs 8
DW_CFA_offset :r16 (déchirure) à cfa-8Q7. Comment faire en sorte que objdump affiche le contenu de la table des symboles ?
Cela peut être fait en utilisant l'option de ligne de commande -t.
objdump -t /bin/lsConclusion
Nous venons de gratter la surface ici, car la commande objdump offre de nombreuses options de ligne de commande. Une fois que vous avez fini de les pratiquer, vous pouvez en savoir plus sur l'outil en vous rendant sur sa page de manuel.