Почему функция 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, которая содержит адрес функции в разделяемой библиотеке, если она была использована в разделяемой библиотеке или другой части программы.
Но там запись о функции puts, а не printf.

Это уже оптимизация компилятора. Возможно ты не передаешь printf никаких аргументов и он решил, что проще вызвать puts.
Такое поведение уже было описано вот тут :
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.
Похожие вопросы