如何知道我的程序在 运行 时调用了哪个 'sin' 函数?
How to know which 'sin' function does my program invoke when running?
我正在使用不同版本的 libm.a。我正在玩的一个是 fdlibm 的 libm.a(来自 Sun)。
问题是我感觉我的程序没有调用fdlibm的libm.a中的函数,而是调用了系统glibc的libm.a.
中的函数
#include "fdlibm.h"
int main(){
double x = sin(3);
}
程序是编译好的C++程序(因为要和其他c++程序链接):
g++ prog.cpp libm.a
其中 libm.a 是 fdlibm 的。 (来自太阳,http://www.netlib.org/fdlibm/readme)
问题 1
我怎么知道 sin
在 运行 时实际调用了什么?我听说过各种工具,例如 objdump、gdb...我的案例可以使用哪一个以及如何使用?
问题 2
如何强制使用 fdlibm 的 libm.a?
谢谢。
我厌倦了 linking/deferred 加载库的 .so 版本,在某处我发现您可以通过指定库的路径实现对特定库的 link。
也许这可以帮助您应对挑战。
示例 - 我可以更改此命令(并将 link 更改为 SDL2 .so)
$(CC) $(CC_FLAGS) $< -o $@ -L../../bag -lbag_i686 -lSDL2
并实现与
相同的效果
$(CC) $(CC_FLAGS) $< -o $@ -L../../bag -lbag_i686 /usr/local/lib/libSDL2.so
明确标识要使用的库。
在 ubuntu 上,我可以使用 'locate' 来查找文件的完整路径。事实证明,SDL2 (.so) 同时落在 /usr/local/lib 和 /usr/lib/x86_64-linux-gnu 中。我想 x86_64 更适合我的系统,它也是 links。
Question 1. I heard about various tools like objdump, gdb.
与 gdb 一样。
创建文件 trace_sin.gdb
$ cat trace_sin.gdb
set confirm off
b sin
commands
bt
c
end
r
quit
并且运行你的程序:
$ gdb -q -x trace_sin.gdb ./a.out Reading symbols from ./a.out...(no
debugging symbols found)...done. Breakpoint 1 at 0x400498
Breakpoint 1, 0x000000314941c760 in sin () from /lib64/libm.so.6
#0 0x000000314941c760 in sin () from /lib64/libm.so.6
#1 0x0000000000400629 in main ()
正如你在我的案例中看到的那样 sin
来自 libm
Question 2. How can I enforce fdlibm's libm.a be used?
只需确保来自 fdlibm 的 sin
出现在 libm 的 sin
之前
我已使用以下简单技术 'gently specify'(未明确)link 所需的库。此技术可能适合您。
我已经创建了几个我必须使用的库,它们都在一个特定的路径中:“/home//cvs-tools/lib1”。 )
当需要使用 1 个 boost 库时,我只是将最新的 libboost_chrono.a 复制到“/home//cvs-tools/lib1”。不。所以在路上。
并修改了我的 make 文件,这样当我更新 boost 时,我没有试图记住所有的含义,而是简单地将 chrono.a 的副本添加到我的 make 文件到我的 lib1,然后我的正常构建更新了 lib1 的副本。
所以,'gently specific',我的意思是 a) 我的 make 文件复制了 b) 特定的 COTS 库 (boost) 到 c) 我的 lib1 目录,因此由相同的 -L 拾取。
我正在使用不同版本的 libm.a。我正在玩的一个是 fdlibm 的 libm.a(来自 Sun)。
问题是我感觉我的程序没有调用fdlibm的libm.a中的函数,而是调用了系统glibc的libm.a.
中的函数#include "fdlibm.h"
int main(){
double x = sin(3);
}
程序是编译好的C++程序(因为要和其他c++程序链接):
g++ prog.cpp libm.a
其中 libm.a 是 fdlibm 的。 (来自太阳,http://www.netlib.org/fdlibm/readme)
问题 1
我怎么知道 sin
在 运行 时实际调用了什么?我听说过各种工具,例如 objdump、gdb...我的案例可以使用哪一个以及如何使用?
问题 2
如何强制使用 fdlibm 的 libm.a?
谢谢。
我厌倦了 linking/deferred 加载库的 .so 版本,在某处我发现您可以通过指定库的路径实现对特定库的 link。
也许这可以帮助您应对挑战。
示例 - 我可以更改此命令(并将 link 更改为 SDL2 .so)
$(CC) $(CC_FLAGS) $< -o $@ -L../../bag -lbag_i686 -lSDL2
并实现与
相同的效果$(CC) $(CC_FLAGS) $< -o $@ -L../../bag -lbag_i686 /usr/local/lib/libSDL2.so
明确标识要使用的库。
在 ubuntu 上,我可以使用 'locate' 来查找文件的完整路径。事实证明,SDL2 (.so) 同时落在 /usr/local/lib 和 /usr/lib/x86_64-linux-gnu 中。我想 x86_64 更适合我的系统,它也是 links。
Question 1. I heard about various tools like objdump, gdb.
与 gdb 一样。 创建文件 trace_sin.gdb
$ cat trace_sin.gdb
set confirm off
b sin
commands
bt
c
end
r
quit
并且运行你的程序:
$ gdb -q -x trace_sin.gdb ./a.out Reading symbols from ./a.out...(no
debugging symbols found)...done. Breakpoint 1 at 0x400498
Breakpoint 1, 0x000000314941c760 in sin () from /lib64/libm.so.6
#0 0x000000314941c760 in sin () from /lib64/libm.so.6
#1 0x0000000000400629 in main ()
正如你在我的案例中看到的那样 sin
来自 libm
Question 2. How can I enforce fdlibm's libm.a be used?
只需确保来自 fdlibm 的 sin
出现在 libm 的 sin
我已使用以下简单技术 'gently specify'(未明确)link 所需的库。此技术可能适合您。
我已经创建了几个我必须使用的库,它们都在一个特定的路径中:“/home//cvs-tools/lib1”。 )
当需要使用 1 个 boost 库时,我只是将最新的 libboost_chrono.a 复制到“/home//cvs-tools/lib1”。不。所以在路上。
并修改了我的 make 文件,这样当我更新 boost 时,我没有试图记住所有的含义,而是简单地将 chrono.a 的副本添加到我的 make 文件到我的 lib1,然后我的正常构建更新了 lib1 的副本。
所以,'gently specific',我的意思是 a) 我的 make 文件复制了 b) 特定的 COTS 库 (boost) 到 c) 我的 lib1 目录,因此由相同的 -L 拾取。