테스트 목적으로 llvm 링커에서 생성 한 PLT 스텁 (lld)을 수정했습니다.objdump가 잘못된 시작 및 끝 주소를 표시합니다.
스텁 전과 :
0xff, 0x25, 0x00, 0x00, 0x00, 0x00, // jmpq *got(%rip)
0x68, 0x00, 0x00, 0x00, 0x00, // pushq <relocation index>
0xe9, 0x00, 0x00, 0x00, 0x00 // jmpq plt[0]
이 (일본어) 스텁 프로그램 링크 및 objdump
으로 검사가 같은 것을 산출한다 : I 단순히 추가하여 PLT 스텁 변성
00000000002012d0 <[email protected]>:
2012d0: ff 25 62 0d 00 00 jmpq *0xd62(%rip) # 202038 <__TMC_END__+0x28>
2012d6: 68 02 00 00 00 pushq $0x2
2012db: e9 c0 ff ff ff jmpq 2012a0 <_fini+0x10>
끝에있는 NOP :
0xff, 0x25, 0x00, 0x00, 0x00, 0x00, // jmpq *got(%rip)
0x68, 0x00, 0x00, 0x00, 0x00, // pushq <relocation index>
0xe9, 0x00, 0x00, 0x00, 0x00, // jmpq plt[0]
0x0f, 0x1f, 0x40, 0x00 // nop
나는 e PltEntrySize
변수가 크기 변경을 반영하도록합니다. 이 수정으로 프로그램을 링크 및 실행하면 정상적으로 작동하는 것 같습니다.
objdump
와 링크 된 프로그램의 분해를 검사 할 때
그러나, 내가 뭔가 이상한 참조 :
은 PLT 스텁의 주소가objdump
에 의해 해석됩니다
00000000002012d0 <[email protected]>:
2012d0: cc int3
2012d1: ff (bad)
2012d2: ff (bad)
2012d3: ff 0f decl (%rdi)
2012d5: 1f (bad)
2012d6: 40 00 ff add %dil,%dil
2012d9: 25 5a 0d 00 00 and $0xd5a,%eax
2012de: 68 02 00 00 00 pushq $0x2
2012e3: e9 b8 ff ff ff jmpq 2012a0 <_fini+0x10>
2012e8: 0f 1f 40 00 nopl 0x0(%rax)
가 0x2012d0
에있을 수있는, 그러나 실제 [email protected]
주소 0x2012d8
에 있습니다! 이것은 readelf -s
에 의해 확인된다
Symbol table '.dynsym' contains 7 entries:
Num: Value Size Type Bind Vis Ndx Name
...
6: 00000000002012d8 0 FUNC GLOBAL DEFAULT UND [email protected]_2.2.5 (2)
어디 objdump
이로부터 정보를 얻을 수 있습니까? 링커에서 뭔가 수정하는 것을 잊었을 수도 있습니다.
고마워, 그건 짜증나. 그러나 동적 링커의 소스를 살펴본 결과 GOT 만 건 드리면 PLT의 변경에 영향을받지 않아야합니다. 나는 더 많은 것을 시험 할 것이고, 그것이 깨지면 나는 나의 전략을 바꿀 것이다. Objdump는 PLT 스텁의 고정 크기를 명확하게 가정하므로 잘못된 정보가 표시됩니다. – Banex