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
,