Написал функцию, где вызываю printf. Скомпилировал все в либу. Разобрал ее как elf образ и добрался до секции rela.plt. Но там запись о функции puts, а не printf. Возможно это потому, что printf лишь функция форматирования строки и она потом в себе вызывает puts, но на каком этапе заменяется тогда printf на puts? Причем если сделать дамп кода ассемблеру: gcc -S src.c -o src.s, то там будет call printf@plt, шо за нах как говорится? Значит она должна быть в таблице.
Это уже оптимизация компилятора. Возможно ты не передаешь 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.
То есть, как я понял, компилятор перегнал в ассемблерный код (отсюда и вызов call printf@PLT в файле .s), а потом на этапе сваливания необходимых либ и проги в одну кучу (команда ld) он увидел, мол нет других аргументов, заменю как я на puts. Тогда понятно.