Chinaunix
标题:
[结贴]在gdb里面无法调用math库函数?
[打印本页]
作者:
asker160
时间:
2016-10-21 11:46
标题:
[结贴]在gdb里面无法调用math库函数?
本帖最后由 asker160 于 2016-10-21 16:51 编辑
编译运行下面一个小程序:
#include<stdlib.h>
#include<math.h>
#include<stdio.h>
int i=3;
void f(){
++i;
printf("%d\n",i);
}
int main(){
double d=cos(0.0);
printf("%f\n",d);
return 0;
}
复制代码
它打印"1.000000",如预期。如果我在gdb命令行调用函数:
(gdb) b main
Breakpoint 1 at 0x40055b: file x.c, line 10.
(gdb) r
Starting program: /home/x/a.out
Breakpoint 1, main () at x.c:10
10 ++i;
(gdb) call f()
4
(gdb) call f() # ok
5
(gdb) call cos(0.0)
No symbol "cos" in current context. # 为什么找不到?
(gdb) call printf("%d\n",i) # ok
5
$1 = 2
(gdb) call putchar('a')
$2 = 97
复制代码
我在编译的时候已经指定了-g,所以有调试信息。为何printf/putchar都可以条用,而math里面的cos却不能调用?
我在ubuntu16.04上
多谢指点!
作者:
MMMIX
时间:
2016-10-21 14:27
回复
1#
asker160
因为你的程序根本没有链接 libm,gdb 找不到其中的符号也是自然的。
链接的时候加上 -lm 就可以了。
BTW,cos(0.0) 会被 gcc 直接换成对应的结果,不会生成对 cos() 的调用。
作者:
asker160
时间:
2016-10-21 16:51
MMMIX 发表于 2016-10-21 14:27
回复 1# asker160
因为你的程序根本没有链接 libm,gdb 找不到其中的符号也是自然的。
嗯,我再补充一点的地方是,-lm似乎仍然不会去链接cos,原因就像你说了的,优化掉了。必须再加上另一个选项-fno-builtin,防止替换式的优化。
问题解决,谢谢!
作者:
MMMIX
时间:
2016-10-21 19:29
回复
3#
asker160
-lm似乎仍然不会去链接cos
可能和工具链(gcc, ld)版本,和/或编译选项有关吧。我测试是可以的。
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2