Я пытаюсь выяснить, какая именно функция вызывается (из какого включаемого файла), когда я вызываю библиотечную функцию.
Итак, у меня есть эта программа,
#include <stdio.h>
#include <math.h>
int twice(int input) {
int output;
output = input * 2;
return output;
}
int main(int argc, char **argv) {
printf("Hello World and %f\n", sin(1));
printf("Output: %d\n", twice(3));
printf("Here is the end of the program... %d\n", 3);
}
Я хочу увидеть, какой printf вызывается.(Я знаю, что в данном случае это тот, что в stdio.h, но это только пример.)
Я скомпилирую файл:
g++ -g test.cpp
, а затем сделаю дамп сборкиcode
objdump --source a.out > test.objdump
В test.objdump я вижу строки вроде
int main(int argc, char **argv) {
400528: 55 push %rbp
400529: 48 89 e5 mov %rsp,%rbp
40052c: 48 83 ec 10 sub $0x10,%rsp
400530: 89 7d fc mov %edi,-0x4(%rbp)
400533: 48 89 75 f0 mov %rsi,-0x10(%rbp)
printf("Hello World and %f\n", sin(1));
400537: f2 0f 10 05 91 01 00 movsd 0x191(%rip),%xmm0 #4006d0<__dso_handle+0x50>
40053e: 00
40053f: bf 88 06 40 00 mov $0x400688,%edi
400544: b8 01 00 00 00 mov $0x1,%eax
400549: e8 c2 fe ff ff callq 400410 <printf@plt>
printf("Output: %d\n", twice(3));
40054e: bf 03 00 00 00 mov $0x3,%edi
400553: e8 bc ff ff ff callq 400514 <_Z5twicei>
400558: 89 c6 mov %eax,%esi
40055a: bf 9c 06 40 00 mov $0x40069c,%edi
40055f: b8 00 00 00 00 mov $0x0,%eax
400564: e8 a7 fe ff ff callq 400410 <printf@plt>
printf("Here is the end of the program... %d\n", 3);
400569: be 03 00 00 00 mov $0x3,%esi
40056e: bf a8 06 40 00 mov $0x4006a8,%edi
400573: b8 00 00 00 00 mov $0x0,%eax
400578: e8 93 fe ff ff callq 400410 <printf@plt>
40057d: b8 00 00 00 00 mov $0x0,%eax
}
Кажется, что адрес функции printf указан в строке callq: 400410. Но когда я делаю
addr2line -e a.out 0x400410
(я тоже пробовал 400410 без 0x), я получаю
??:0
, который не дает мне местоположение функции printf.Может кто-нибудь указать на ошибку в моем процессе.Есть ли какая-то опция для g ++, которую я не передаю?
Действительно признателен за помощь.Спасибо!