如何知道哪些罪恶?函数在运行时调用我的程序吗?

时间:2015-06-24 13:45:57

标签: c++ static-linking

我使用的是不同版本的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' s。 (来自Sun,http://www.netlib.org/fdlibm/readme

问题1

我怎么知道sin在运行时实际调用了什么?我听说过各种各样的工具,比如objdump,gdb ......哪一种可以用于我的情况以及如何使用?

问题2

如何强制使用fdlibm的libm.a?

感谢。

3 个答案:

答案 0 :(得分:6)

  

问题1.我听说过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

  

问题2.如何强制使用fdlibm的libm.a?

请确保fdlibm中的sin来自libm的sin

之前

答案 1 :(得分:1)

我厌倦了链接/延迟加载.so版本的库,在某处我发现你可以通过指定库的路径来实现指向特定库的链接。

也许这可以帮助您应对挑战。

示例 - 我可以更改此命令(并链接到SDL2 .so)

$(CC) $(CC_FLAGS)  $<  -o $@  -L../../bag  -lbag_i686 -lSDL2

并与

相同
$(CC) $(CC_FLAGS)  $<  -o $@  -L../../bag  -lbag_i686 /usr/local/lib/libSDL2.so

明确识别要使用的lib。

在ubuntu上,我可以使用'locate'来查找文件的完整路径。事实证明,SDL2(.so)同时落在/ usr / local / lib和/ usr / lib / x86_64-linux-gnu中。我想x86_64更适合我的系统,它也链接。

答案 2 :(得分:1)

我使用了以下简单的技巧来轻轻地指定&#39; (不明确)链接所需的库。这种技术可能适合您。

我已经创建了几个我必须使用的库,它们都在一个特定的路径中:&#34; / home // cvs-tools / lib1&#34;。 )

当需要使用我需要的1 boost lib时,我只需将最新的libboost_chrono.a复制到&#34; / home // cvs-tools / lib1&#34;中。没有。所以在路上。

触摸了我的make文件,这样当我更新boost时,而不是我试图记住所有含义,我只是将chrono.a的副本添加到我的make文件中,然后我的正常构建更新了lib1&#39 ;副本。

所以,通过&#39;轻轻一致,我的意思是a)我的make文件将b)特定的COTS库(boost)复制到c)我的lib1目录中,因此被同一个-L选取