objdump показывает неверный начальный и конечный адрес для функций

В целях тестирования я изменил заглушку PLT, сгенерированную компоновщиком llvm, lld.

Заглушка раньше была:

 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 дает что-то вроде этого:

00000000002012d0 <printf@plt>:
  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>

Я изменил заглушку PLT, просто добавив 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

Я убедился, чтобы изменить PltEntrySize переменная, чтобы она отражала изменение размера. Связывание и запуск программ с этой модификацией работает нормально.

Тем не менее, когда я пытаюсь проверить разборку связанной программы с objdumpЯ вижу что-то странное:

00000000002012d0 <printf@plt>:
  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)

Адрес PLT-заглушки интерпретируется objdump бить 0x2012d0но настоящий printf@plt адрес находится на 0x2012d8! Это подтверждается readelf -s:

Symbol table '.dynsym' contains 7 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
    ...
    6: 00000000002012d8     0 FUNC    GLOBAL DEFAULT  UND printf@GLIBC_2.2.5 (2)

Где же objdump получить информацию от? Вполне возможно, что я забыл что-то изменить в компоновщике.

1 ответ

Решение

В целях тестирования я изменил заглушку PLT, сгенерированную компоновщиком llvm, lld.

Размер и расположение plt запись устанавливается камнем ABI (см. стр. 79) и не может быть изменена.

Связывание и запуск программ с этой модификацией работает нормально.

Я сомневаюсь, что любая нетривиальная программа будет работать правильно с вашей модификацией - динамический загрузчик предполагает ABI plt макет, и должен разбиться и сжечь, когда дано поддельным plt,

Другие вопросы по тегам