【问题标题】:Order of linkinkg libc and libpthread on FreeBSDFreeBSD 上 linkinkg libc 和 libpthread 的顺序
【发布时间】:2013-06-17 12:40:39
【问题描述】:

我有这个简单的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

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

【问题讨论】:

标签: gcc linker pthreads freebsd libc


【解决方案1】:

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


更新

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

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

具体区别在于具体实现。

注意:如果-pthread已经指定-lpthread是不必要的,也不建议指定。

【讨论】:

  • 但我想了解这种行为。
【解决方案2】:

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

因此,它需要了解来自-lpthreadpthread_* 函数,然后才能解析对以后库中这些函数的引用。

我相信使用弱引用是为了让你可以在-lc 中拥有需要-lpthread 的函数,但是如果你没有在-lc 中引用这些函数,那么它的引用并不是错误无法解析到pthread_*

【讨论】:

    猜你喜欢
    • 2012-08-04
    • 2015-02-26
    • 2023-03-09
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多