如何知道我的程序在 运行 时调用了哪个 '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 拾取。