objdump가 ELF 바이너리의 .got 섹션에 대한 항목을 표시하지 않는 이유는 무엇입니까?

objdump가 ELF 바이너리의 .got 섹션에 대한 항목을 표시하지 않는 이유는 무엇입니까?

나는 ELF 바이너리의 .plt와 .got 섹션 사이의 관계를 알고 있습니다. 즉, 동적으로 로드된 각 함수(공유 라이브러리)에 대한 각 섹션에 해당 항목이 있어야 합니다.

실제로 .plt 항목은 printflibc에서 로드되었기 때문에 존재합니다.

nlykkei@ubuntu-dev:~/Tools$ objdump -D -j .plt ~/myprog | grep printf
0000000000400530 <printf@plt>:
  400530:       ff 25 22 07 20 00       jmpq   *0x200722(%rip)        # 600c58 <printf@GLIBC_2.2.5>

해당 .got 항목이 주소에 있는 것을 볼 수 있습니다 0x600c58. .plt 섹션에는 libc의 함수에 대한 총 7개의 항목이 포함되어 있습니다.

그러나 .got 테이블을 표시하면 8바이트만 표시됩니다.

nlykkei@ubuntu-dev:~/Tools$ objdump -D -j .got -z ~/myprog

/home/nlykkei/myprog:     file format elf64-x86-64


Disassembly of section .got:

0000000000600c30 <.got>:
  600c30:       00 00                   add    %al,(%rax)
  600c32:       00 00                   add    %al,(%rax)
  600c34:       00 00                   add    %al,(%rax)
  600c36:       00 00                   add    %al,(%rax)

objdump전체 .got 섹션을 주석(어떤 .got 항목이 어떤 .plt 항목에 해당하는지)과 함께 표시 하면 어떨까요 ?

답변1

PLT에서 사용하는 GOT 항목이 이 .got.plt섹션에 저장됩니다. PLT에서 GOT로 매핑하는 경우 역 매핑을 수행할 수 있는 방법이 없다고 생각하므로 objdump최선을 다하는 것은

$ objdump -d -s -j .plt -j .got.plt sysinfo

sysinfo:     file format elf64-x86-64

Contents of section .plt:
 400420 ff35e20b 2000ff25 e40b2000 0f1f4000  .5.. ..%.. ...@.
 400430 ff25e20b 20006800 000000e9 e0ffffff  .%.. .h.........
 400440 ff25da0b 20006801 000000e9 d0ffffff  .%.. .h.........
Contents of section .got.plt:
 601000 200e6000 00000000 00000000 00000000   .`.............
 601010 00000000 00000000 36044000 00000000  ........6.@.....
 601020 46044000 00000000                    F.@.....        

Disassembly of section .plt:

0000000000400420 <.plt>:
  400420:   ff 35 e2 0b 20 00       pushq  0x200be2(%rip)        # 601008 <_GLOBAL_OFFSET_TABLE_+0x8>
  400426:   ff 25 e4 0b 20 00       jmpq   *0x200be4(%rip)        # 601010 <_GLOBAL_OFFSET_TABLE_+0x10>
  40042c:   0f 1f 40 00             nopl   0x0(%rax)

0000000000400430 <printf@plt>:
  400430:   ff 25 e2 0b 20 00       jmpq   *0x200be2(%rip)        # 601018 <printf@GLIBC_2.2.5>
  400436:   68 00 00 00 00          pushq  $0x0
  40043b:   e9 e0 ff ff ff          jmpq   400420 <.plt>

0000000000400440 <sysinfo@plt>:
  400440:   ff 25 da 0b 20 00       jmpq   *0x200bda(%rip)        # 601020 <sysinfo@GLIBC_2.2.5>
  400446:   68 01 00 00 00          pushq  $0x1
  40044b:   e9 d0 ff ff ff          jmpq   400420 <.plt>

Disassembly of section .got.plt:

0000000000601000 <_GLOBAL_OFFSET_TABLE_>:
  601000:   20 0e 60 00 00 00 00 00 00 00 00 00 00 00 00 00      .`.............
    ...
  601018:   36 04 40 00 00 00 00 00 46 04 40 00 00 00 00 00     [email protected].@.....

관련 정보