FreeBSD上的linkinkg libc和libpthread的顺序

时间:2013-06-17 12:40:40

标签: gcc linker pthreads freebsd libc

我有这个简单的c-code

当我将其链接为

时,它可以正常工作
gcc  -g app.c.o  -o app  -lrt -lpthread -lc

但是如果我们改变链接libc和libthread的顺序

gcc  -g app.c.o  -o app  -lrt -lc -lpthread

它不起作用。

我们知道在FreeBSD中,libc中pthread函数的存根被作为弱引用。 例如

objdump -T /lib/libc.so.7 | grep pthread_cond_signal
00000000000e2bf0  w   DF .text  0000000000000011  FBSD_1.0    pthread_cond_signal

这意味着链接顺序无关紧要。为什么这样?

2 个答案:

答案 0 :(得分:1)

使用选项-pthread进行编译和链接。注意缺少的“ell”。


<强>更新

  • -pthread指示创建二进制文件(预处理程序,编译器,链接程序)所涉及的所有工具,以确保要构建的应用程序/库按预期运行。 (这显然只有在来源使用pthread_* - 函数族的任何成员时才有必要。)

  • -lpthread链接名为libpthread的库,仅此而已。

细节上的差异是特定于实现的。

注意:如果指定了-pthread,则不需要-lpthread,也不建议您进行指定。

答案 1 :(得分:0)

此行为的原因是链接器仅按提供的顺序执行单个传递库以解析符号。

因此,它需要知道来自pthread_*的{​​{1}}函数才能解析后续库中对这些函数的引用。

我认为使用弱引用是为了让-lpthread中的函数能够-lc,但如果你没有引用-lpthread中的那些函数而不是{错误的是它无法解析对-lc的引用。