Я пытаюсь выяснить, какая именно функция называется (из которой включает файл), когда я вызываю библиотечную функцию.Какая функция вызывается в программе на C?
Итак, у меня есть эта программа,
#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
, а затем сделать дамп код сборки
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
40057d: b8 00 00 00 00 mov $0x0,%eax
}
Похоже адрес функции PRINTF дается в callq линия: 400410. Но когда я
addr2line -e a.out 0x400410
(я пытался 400410 без 0x тоже), я получаю
??:0
, который не дает мне расположение функции PRINTF. Может кто-нибудь указать на ошибку в моем процессе. Есть ли какой-то вариант g ++, который я не передаю?
Действительно оцените помощь. Спасибо!
N.B: stdio.h содержит * объявление * 'printf()' not a * definition *. В чем проблема * реального *, которую вы пытаетесь решить (и почему вы используете g ++ для компиляции C)? – Johnsyweb
Реальная проблема, которую я хочу решить, находится в большой базе кода. Существует вызов функции (скажем, xyz()), и функция содержится в одном из 100 или около того включенных файлов. Я хочу определить, где находится функция (декларация). –
@Johnsyweb, если стандартная библиотека была скомпилирована с '-g', мы увидели бы соответствующий номер строки? Я думаю, что все. –