首页  >  文章  >  后端开发  >  为什么我的带有静态链接和 Pthread 的 C 程序会导致分段错误?

为什么我的带有静态链接和 Pthread 的 C 程序会导致分段错误?

DDD
DDD原创
2024-10-26 11:14:02966浏览

Why Does My C   Program With Static Linking and Pthreads Result in a Segmentation Fault?

g 静态链接 Pthread 时,导致分段错误:解释及解决方法

问题:

当使用 g 和 -pthread 标志来静态(-static)链接 pthread 库时,程序会遇到分段错误。

解释:

  1. 弱符号:

    • pthread 和 libstdc 对某些函数使用弱符号,例如 pthread_mutex_lock()。
    • 链接时弱符号可以被强符号替换。
  2. 动态链接与静态链接:

    • 动态链接链接时,弱符号从共享库中解析。
    • 在静态链接中,链接器在第一个符号(包括弱符号)处停止,并且不搜索强符号。
  3. 不完整的链接解析:

    • 使用 -static 时,链接器不会考虑 pthread 库中的所有符号,因为它首先遇到弱符号.
    • 因此,不使用 pthread_mutex_lock() 的强符号。

解决方案:

到强制链接器在静态链接程序中查看 pthread 库中的所有符号,使用:

g++ -o one one.cpp -Wall -std=c++11 -O3 -static -pthread \
    -Wl,--whole-archive -lpthread -Wl,--no-whole-archive
  • -Wl,--whole-archive: 包括所有对象指定存档中的文件。
  • -lpthread: pthread 库的链接。
  • -Wl,--no-whole-archive:禁用后续存档的整个存档选项。

附加说明:

  • 某些系统可能需要附加标志,例如 librt 的 -lrt .
  • 如果使用 Autotools,请在 configure.ac 中定义标志并在 Makefile.am 中替换它们。例如:
WL_WHOLE_ARCHIVE_HACK="-Wl,--whole-archive"
WL_NO_WHOLE_ARCHIVE_HACK="-Wl,--no-whole-archive"
AC_SUBST(WL_WHOLE_ARCHIVE_HACK)
AC_SUBST(WL_NO_WHOLE_ARCHIVE_HACK)

mytarget_LDADD = @WL_WHOLE_ARCHIVE_HACK@ -lpthread @WL_NO_WHOLE_ARCHIVE_HACK@

以上是为什么我的带有静态链接和 Pthread 的 C 程序会导致分段错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn