Почему функция printf не имеет записи в секции .plt.dyn?

Почему в таблице rela.plt запись для функции puts, а не printf?
  • 16 февраля 2024 г. 16:28
Ответы на вопрос 2
Функция printf не имеет записи в секции .plt.dyn, поскольку она не вызывается напрямую из главной программы. 

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

Таблица rela.plt содержит записи для функций, для которых требуется производить динамическую загрузку (lazy loading), так как адрес функции в разделяемой библиотеке еще неизвестен. Функция printf обычно вызывается напрямую из главной программы, поэтому ее адрес уже известен и не требуется производить динамическую загрузку.

Вместо этого, функция printf может иметь запись в таблице GOT, которая содержит адрес функции в разделяемой библиотеке, если она была использована в разделяемой библиотеке или другой части программы.
<blockquote>Но там запись о функции puts, а не printf.</blockquote> <br/> Это уже оптимизация компилятора. Возможно ты не передаешь printf никаких аргументов и он решил, что проще вызвать puts. <br/> Такое поведение уже было описано <a href="https://wiki.netbsd.org/examples/elf_executables_for_powerpc/" rel="nofollow">вот тут</a> : <br/> <blockquote>The C compiler gcc likes to use its knowledge of builtin functions to manipulate code. The version of gcc in NetBSD 4.0.1/macppc will simplify the printf statement to puts("Greeting, Earth!"); so the main function effectively calls puts(3) once and then returns 0.</blockquote>
Похожие вопросы