웹사이트 검색

초보자를 위한 Linux objdump 명령 설명(예제 7개)


이 페이지에서

  1. Linux objdump 명령
  2. Q1. objdump 표시 파일 헤더 내용을 만드는 방법은 무엇입니까?\n
  3. Q2. objdump 표시 개체 형식 특정 파일 헤더 내용을 만드는 방법은 무엇입니까?\n
  4. Q3. 섹션 헤더의 objdump 표시 내용을 만드는 방법은 무엇입니까?\n
  5. Q4. objdump가 모든 헤더를 표시하게 만드는 방법은 무엇입니까?\n
  6. Q5. objdump가 실행 섹션의 어셈블러 내용을 표시하도록 만드는 방법은 무엇입니까?\n
  7. Q6. objdump에서 디버그 정보를 표시하는 방법은 무엇입니까?\n
  8. Q7. 기호 테이블의 objdump 표시 내용을 만드는 방법은 무엇입니까?\n
  9. 결론

Linux 프로그래밍에 관심이 있고 작업이 컴파일러를 중심으로 진행되는 경우 알아야 할 소수의 명령줄 유틸리티가 있습니다. 이러한 도구 중 하나는 objdump입니다. 이 자습서에서는 이해하기 쉬운 몇 가지 예를 사용하여 이 명령의 기본 사항에 대해 설명합니다.

하지만 그 전에 여기에 있는 모든 예제는 Ubuntu 20.04 LTS 시스템과 Debian 10에서 테스트되었음을 언급할 가치가 있습니다.

Linux objdump 명령

이름에서 알 수 있듯이 Linux의 objdump 명령은 개체 파일의 정보를 표시합니다. 다음은 도구 구문입니다.

objdump OPTIONS objfile ...

그리고 매뉴얼 페이지가 그것에 대해 말하는 내용은 다음과 같습니다.

objdump displays information about one or more object files.  The options control what particular 
information to display. This information is mostly useful to programmers who are working on the
compilation tools, as opposed to programmers who just want their program to compile and work.

objfile... are the object files to be examined. When you specify archives, objdump shows
information on each of the member object files.

다음은 objdump의 작동 방식에 대한 더 나은 아이디어를 제공하는 몇 가지 Q&A 스타일의 예입니다.

Q1. objdump 표시 파일 헤더 내용을 만드는 방법은 무엇입니까?

이것은 -f 명령줄 옵션을 사용하여 수행할 수 있습니다.

예를 들어:

objdump -f /bin/ls

위 명령의 출력은 다음과 같습니다.

/bin/ls:     file format elf64-x86-64
architecture: i386:x86-64, flags 0x00000150:
HAS_SYMS, DYNAMIC, D_PAGED
start address 0x00000000000067d0

따라서 ls의 헤더 내용이 출력에 표시된 것을 볼 수 있습니다.

Q2. objdump 표시 개체 형식 특정 파일 헤더 내용을 만드는 방법은 무엇입니까?

이 작업은 -p 명령줄 옵션을 사용하여 수행할 수 있습니다. 예를 들어, 다음 명령:

objdump -p /bin/ls

다음 출력을 생성했습니다.

/bin/ls:     file format elf64-x86-64

Program Header:
    PHDR off    0x0000000000000040 vaddr 0x0000000000000040 paddr 0x0000000000000040 align 2**3
         filesz 0x00000000000001f8 memsz 0x00000000000001f8 flags r-x
  INTERP off    0x0000000000000238 vaddr 0x0000000000000238 paddr 0x0000000000000238 align 2**0
         filesz 0x000000000000001c memsz 0x000000000000001c flags r--
    LOAD off    0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**21
         filesz 0x000000000001e6e8 memsz 0x000000000001e6e8 flags r-x
    LOAD off    0x000000000001eff0 vaddr 0x000000000021eff0 paddr 0x000000000021eff0 align 2**21
         filesz 0x0000000000001278 memsz 0x0000000000002570 flags rw-
 DYNAMIC off    0x000000000001fa38 vaddr 0x000000000021fa38 paddr 0x000000000021fa38 align 2**3
         filesz 0x0000000000000200 memsz 0x0000000000000200 flags rw-
    NOTE off    0x0000000000000254 vaddr 0x0000000000000254 paddr 0x0000000000000254 align 2**2
         filesz 0x0000000000000044 memsz 0x0000000000000044 flags r--
EH_FRAME off    0x000000000001b1a0 vaddr 0x000000000001b1a0 paddr 0x000000000001b1a0 align 2**2
         filesz 0x0000000000000884 memsz 0x0000000000000884 flags r--
   STACK off    0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**4
         filesz 0x0000000000000000 memsz 0x0000000000000000 flags rw-
   RELRO off    0x000000000001eff0 vaddr 0x000000000021eff0 paddr 0x000000000021eff0 align 2**0
         filesz 0x0000000000001010 memsz 0x0000000000001010 flags r--

Dynamic Section:
  NEEDED               libselinux.so.1
  NEEDED               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
  FLAGS                0x0000000000000008
  FLAGS_1              0x0000000008000001
  VERNEED              0x0000000000001930
  VERNEEDNUM           0x0000000000000001
  VERSYM               0x0000000000001802
  RELACOUNT            0x00000000000000c1

Version References:
  required from 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
    0x09691a75 0x00 03 GLIBC_2.2.5
    0x0d696913 0x00 02 GLIBC_2.3

Q3. 섹션 헤더의 objdump 표시 내용을 만드는 방법은 무엇입니까?

이것은 -h 명령줄 옵션을 사용하여 수행할 수 있습니다. 예를 들어, 다음 명령:

objdump -h /bin/ls

내 시스템에서 다음 출력을 생성했습니다.

/bin/ls:     file format elf64-x86-64

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .interp       0000001c  0000000000000238  0000000000000238  00000238  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  1 .note.ABI-tag 00000020  0000000000000254  0000000000000254  00000254  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  2 .note.gnu.build-id 00000024  0000000000000274  0000000000000274  00000274  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  3 .gnu.hash     000000ec  0000000000000298  0000000000000298  00000298  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  4 .dynsym       00000df8  0000000000000388  0000000000000388  00000388  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  5 .dynstr       00000682  0000000000001180  0000000000001180  00001180  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  6 .gnu.version  0000012a  0000000000001802  0000000000001802  00001802  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  7 .gnu.version_r 00000070  0000000000001930  0000000000001930  00001930  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  8 .rela.dyn     00001350  00000000000019a0  00000000000019a0  000019a0  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  9 .rela.plt     00000a68  0000000000002cf0  0000000000002cf0  00002cf0  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 10 .init         00000017  0000000000003758  0000000000003758  00003758  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 11 .plt          00000700  0000000000003770  0000000000003770  00003770  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 12 .plt.got      00000018  0000000000003e70  0000000000003e70  00003e70  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 13 .text         000124d9  0000000000003e90  0000000000003e90  00003e90  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 14 .fini         00000009  000000000001636c  000000000001636c  0001636c  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 15 .rodata       00004e1d  0000000000016380  0000000000016380  00016380  2**5
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 16 .eh_frame_hdr 00000884  000000000001b1a0  000000000001b1a0  0001b1a0  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 17 .eh_frame     00002cc0  000000000001ba28  000000000001ba28  0001ba28  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 18 .init_array   00000008  000000000021eff0  000000000021eff0  0001eff0  2**3
                  CONTENTS, ALLOC, LOAD, DATA
 19 .fini_array   00000008  000000000021eff8  000000000021eff8  0001eff8  2**3
                  CONTENTS, ALLOC, LOAD, DATA
 20 .data.rel.ro  00000a38  000000000021f000  000000000021f000  0001f000  2**5
                  CONTENTS, ALLOC, LOAD, DATA
 21 .dynamic      00000200  000000000021fa38  000000000021fa38  0001fa38  2**3
                  CONTENTS, ALLOC, LOAD, DATA
 22 .got          000003c8  000000000021fc38  000000000021fc38  0001fc38  2**3
                  CONTENTS, ALLOC, LOAD, DATA
 23 .data         00000268  0000000000220000  0000000000220000  00020000  2**5
                  CONTENTS, ALLOC, LOAD, DATA
 24 .bss          000012e0  0000000000220280  0000000000220280  00020268  2**5
                  ALLOC
 25 .gnu_debuglink 00000034  0000000000000000  0000000000000000  00020268  2**2
                  CONTENTS, READONLY

Q4. objdump가 모든 헤더를 표시하게 만드는 방법은 무엇입니까?

objdump가 모든 헤더를 표시하도록 하려면 -x 명령줄 옵션을 사용합니다.

objdump -x /bin/ls

다음은 이 명령이 내 시스템에서 생성한 출력입니다.

/bin/ls:     file format elf64-x86-64
/bin/ls
architecture: i386:x86-64, flags 0x00000150:
HAS_SYMS, DYNAMIC, D_PAGED
start address 0x0000000000005850

Program Header:
    PHDR off    0x0000000000000040 vaddr 0x0000000000000040 paddr 0x0000000000000040 align 2**3
         filesz 0x00000000000001f8 memsz 0x00000000000001f8 flags r-x
  INTERP off    0x0000000000000238 vaddr 0x0000000000000238 paddr 0x0000000000000238 align 2**0
         filesz 0x000000000000001c memsz 0x000000000000001c flags r--
    LOAD off    0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**21
         filesz 0x000000000001e6e8 memsz 0x000000000001e6e8 flags r-x
    LOAD off    0x000000000001eff0 vaddr 0x000000000021eff0 paddr 0x000000000021eff0 align 2**21
         filesz 0x0000000000001278 memsz 0x0000000000002570 flags rw-
 DYNAMIC off    0x000000000001fa38 vaddr 0x000000000021fa38 paddr 0x000000000021fa38 align 2**3
         filesz 0x0000000000000200 memsz 0x0000000000000200 flags rw-
    NOTE off    0x0000000000000254 vaddr 0x0000000000000254 paddr 0x0000000000000254 align 2**2
         filesz 0x0000000000000044 memsz 0x0000000000000044 flags r--
EH_FRAME off    0x000000000001b1a0 vaddr 0x000000000001b1a0 paddr 0x000000000001b1a0 align 2**2
         filesz 0x0000000000000884 memsz 0x0000000000000884 flags r--
   STACK off    0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**4
         filesz 0x0000000000000000 memsz 0x0000000000000000 flags rw-
   RELRO off    0x000000000001eff0 vaddr 0x000000000021eff0 paddr 0x000000000021eff0 align 2**0
         filesz 0x0000000000001010 memsz 0x0000000000001010 flags r--

Dynamic Section:
  NEEDED               libselinux.so.1
  NEEDED               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
  FLAGS                0x0000000000000008
  FLAGS_1              0x0000000008000001
  VERNEED              0x0000000000001930
  VERNEEDNUM           0x0000000000000001
  VERSYM               0x0000000000001802
  RELACOUNT            0x00000000000000c1

Version References:
  required from 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
    0x09691a75 0x00 03 GLIBC_2.2.5
    0x0d696913 0x00 02 GLIBC_2.3

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .interp       0000001c  0000000000000238  0000000000000238  00000238  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  1 .note.ABI-tag 00000020  0000000000000254  0000000000000254  00000254  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  2 .note.gnu.build-id 00000024  0000000000000274  0000000000000274  00000274  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  3 .gnu.hash     000000ec  0000000000000298  0000000000000298  00000298  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  4 .dynsym       00000df8  0000000000000388  0000000000000388  00000388  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  5 .dynstr       00000682  0000000000001180  0000000000001180  00001180  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  6 .gnu.version  0000012a  0000000000001802  0000000000001802  00001802  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  7 .gnu.version_r 00000070  0000000000001930  0000000000001930  00001930  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  8 .rela.dyn     00001350  00000000000019a0  00000000000019a0  000019a0  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  9 .rela.plt     00000a68  0000000000002cf0  0000000000002cf0  00002cf0  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 10 .init         00000017  0000000000003758  0000000000003758  00003758  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 11 .plt          00000700  0000000000003770  0000000000003770  00003770  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 12 .plt.got      00000018  0000000000003e70  0000000000003e70  00003e70  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 13 .text         000124d9  0000000000003e90  0000000000003e90  00003e90  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 14 .fini         00000009  000000000001636c  000000000001636c  0001636c  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 15 .rodata       00004e1d  0000000000016380  0000000000016380  00016380  2**5
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 16 .eh_frame_hdr 00000884  000000000001b1a0  000000000001b1a0  0001b1a0  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 17 .eh_frame     00002cc0  000000000001ba28  000000000001ba28  0001ba28  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 18 .init_array   00000008  000000000021eff0  000000000021eff0  0001eff0  2**3
                  CONTENTS, ALLOC, LOAD, DATA
 19 .fini_array   00000008  000000000021eff8  000000000021eff8  0001eff8  2**3
                  CONTENTS, ALLOC, LOAD, DATA
 20 .data.rel.ro  00000a38  000000000021f000  000000000021f000  0001f000  2**5
                  CONTENTS, ALLOC, LOAD, DATA
 21 .dynamic      00000200  000000000021fa38  000000000021fa38  0001fa38  2**3
                  CONTENTS, ALLOC, LOAD, DATA
 22 .got          000003c8  000000000021fc38  000000000021fc38  0001fc38  2**3
                  CONTENTS, ALLOC, LOAD, DATA
 23 .data         00000268  0000000000220000  0000000000220000  00020000  2**5
                  CONTENTS, ALLOC, LOAD, DATA
 24 .bss          000012e0  0000000000220280  0000000000220280  00020268  2**5
                  ALLOC
 25 .gnu_debuglink 00000034  0000000000000000  0000000000000000  00020268  2**2
                  CONTENTS, READONLY
SYMBOL TABLE:
no symbols

Q5. objdump가 실행 섹션의 어셈블러 내용을 표시하도록 만드는 방법은 무엇입니까?

이를 위해 -d 명령줄 옵션을 사용합니다. 다음은 이 옵션을 실제로 보여주는 예입니다.

objdump -d /bin/ls

출력에서 발췌한 내용은 다음과 같습니다.

/bin/ls:     file format elf64-x86-64


Disassembly of section .init:

0000000000003758 <_2.2.5>
    37a6:    68 02 00 00 00           pushq  $0x2

마찬가지로 -D 명령줄 옵션을 사용하여 objdump가 모든 섹션의 어셈블러 내용을 표시하도록 하고 -S 옵션을 사용하여 도구가 소스 코드를 디스어셈블리와 혼합하도록 할 수 있습니다.

Q6. objdump에서 디버그 정보를 표시하는 방법은 무엇입니까?

이것은 -S 명령줄 옵션을 사용하여 가능하게 만들 수 있습니다.

objdump -g /bin/ls

다음은 이 명령으로 생성된 출력에서 발췌한 것입니다.

Contents of the .eh_frame section (loaded from /bin/ls):


00000000 0000000000000014 00000000 CIE
  Version:               1
  Augmentation:          "zR"
  Code alignment factor: 1
  Data alignment factor: -8
  Return address column: 16
  Augmentation data:     1b
  DW_CFA_def_cfa: r7 (rsp) ofs 8
  DW_CFA_offset: r16 (rip) at cfa-8
  DW_CFA_undefined: r16 (rip)

00000018 0000000000000014 0000001c FDE cie=00000000 pc=0000000000005850..000000000000587b
  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:               1
  Augmentation:          "zR"
  Code alignment factor: 1
  Data alignment factor: -8
  Return address column: 16
  Augmentation data:     1b
  DW_CFA_def_cfa: r7 (rsp) ofs 8
  DW_CFA_offset: r16 (rip) at cfa-8

Q7. 기호 테이블의 objdump 표시 내용을 만드는 방법은 무엇입니까?

이것은 -t 명령줄 옵션을 사용하여 수행할 수 있습니다.

objdump -t /bin/ls

결론

objdump 명령은 많은 명령줄 옵션을 제공하므로 여기서는 표면을 긁었습니다. 이러한 연습을 마치면 매뉴얼 페이지로 이동하여 도구에 대해 자세히 알아볼 수 있습니다.