gpt4 book ai didi

linker - glibc.so 中的 pthread 是否由弱符号实现以提供 pthread stub 函数?

转载 作者:行者123 更新时间:2023-12-04 22:46:57 28 4
gpt4 key购买 nike

pthreadglibc.so由弱符号实现以提供pthread stub 函数?

我知道有pthread.so提供与pthread类似的功能在 glibc.so有人说pthreadglibc仅提供 stub ,当显式链接到 lpthread 时将被替换.

所以我的问题是如何支持它?使用弱符号或其他技术?

libsslpthread 类似在 glibc ?

最佳答案

是的,glibc 使用各种 pthread 函数的 stub 实现,因此单线程程序不必浪费周期来执行诸如锁定和解锁互斥锁之类的事情,也不必链接到不同的 C 库(就像在例如,微软世界)。

例如,根据 POSIX,每次调用 fputc(ch, stream) ,有互斥锁和解锁。如果你不想这样,你调用 fputc_unlocked .但是当你这样做时,你正在使用与线程相关的 POSIX 扩展;对于不使用 POSIX 或不使用线程 API 的程序,这不是一个合适的解决方法。

用真实函数覆盖 stub pthread 函数(在动态 glibc 中)不是基于弱符号 .共享库机制使得覆盖非弱定义成为可能。

弱符号是一种允许在静态链接下覆盖符号的机制。

如果您想要上述声明的来源,这里是:

"Note that a definition in a DSO being weak has no effects. Weak definitions only play a role in static linking." [Ulrich Drepper, "How To Write Shared Libraries"].



如果你运行 nm在系统上的静态 glibc 上(如果有的话), libc.a ,你会注意到像 pthread_mutex_lock 这样的函数被标记为弱。在动态版本中, libc.so.<whatetever> ,功能没有标记为弱。

注意:您应该使用 nm -Dnm --dynamic查看共享库中的符号。 nm不会在被剥离的共享库上产生任何东西。如果是这样,您正在查看调试符号,而不是动态符号。

关于linker - glibc.so 中的 pthread 是否由弱符号实现以提供 pthread stub 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21092601/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com