2017-12-11 1 views
0

테스트 목적으로 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이로부터 정보를 얻을 수 있습니까? 링커에서 뭔가 수정하는 것을 잊었을 수도 있습니다.

답변

0

테스트 목적으로 llvm 링커 인 lld가 생성 한 PLT 스텁을 수정했습니다.

크기와 plt 항목의 레이아웃

ABI 석재 (페이지 참조. 79)에 설정되고, 변경 될 수 없다.

이 수정을 사용하여 프로그램을 연결하고 실행하는 것은 정상적으로 작동하는 것 같습니다. 동적 로더가 ABI plt 레이아웃을 가정하고 충돌 및 plt 가짜 주어 졌을 때 점화한다 -

내가 아닌 사소한 프로그램이 수정 제대로 실행됩니다 의심한다.

+0

고마워, 그건 짜증나. 그러나 동적 링커의 소스를 살펴본 결과 GOT 만 건 드리면 PLT의 변경에 영향을받지 않아야합니다. 나는 더 많은 것을 시험 할 것이고, 그것이 깨지면 나는 나의 전략을 바꿀 것이다. Objdump는 PLT 스텁의 고정 크기를 명확하게 가정하므로 잘못된 정보가 표시됩니다. – Banex

관련 문제