Что означает @plt здесь?



0x00000000004004b6 <main+30>:   callq  0x400398 <printf@plt>


кто-нибудь знает?



обновление



почему два disas printf дайте мне другой результат?



(gdb) disas printf
Dump of assembler code for function printf@plt:
0x0000000000400398 <printf@plt+0>: jmpq *0x2004c2(%rip) # 0x600860 <_GLOBAL_OFFSET_TABLE_+24>
0x000000000040039e <printf@plt+6>: pushq x0
0x00000000004003a3 <printf@plt+11>: jmpq 0x400388

(gdb) disas printf
Dump of assembler code for function printf:
0x00000037aa44d360 <printf+0>: sub xd8,%rsp
0x00000037aa44d367 <printf+7>: mov %rdx,0x30(%rsp)
0x00000037aa44d36c <printf+12>: movzbl %al,%edx
0x00000037aa44d36f <printf+15>: mov %rsi,0x28(%rsp)
0x00000037aa44d374 <printf+20>: lea 0x0(,%rdx,4),%rax
0x00000037aa44d37c <printf+28>: lea 0x3f(%rip),%rdx # 0x37aa44d3c2 <printf+98>
553   2  

2 ответов:

это способ получить исправления кода (настройка адресов на основе того, где код находится в виртуальной памяти) без необходимости поддерживать отдельную копию кода для каждого процесса. PLT таблица рычага процедуры, одна из структур которая делает динамическую нагрузку и соединять более легкими использовать.

printf@plt на самом деле это небольшой заглушка, которая (в конечном итоге) вызывает реальный .

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

таким образом, чтобы обеспечить надлежащий общий доступ к коду вызывающего кода (левая сторона ниже), вы не хотите применять к нему какие-либо исправления напрямую, так как это ограничит, где он может быть расположен в другое процессы.

The PLT меньше

Не уверен, но, вероятно, то, что вы видели, имеет смысл. При первом запуске команды disas printf еще не вызван, поэтому он не разрешен. Как только ваша программа вызывает метод printf при первом обновлении GOT, и теперь printf разрешен, и GOT указывает на реальную функцию. Таким образом, следующий вызов команды disas показывает реальную сборку printf.

Comments

    Ничего не найдено.