GNU Argp(glibc的一部分,GNU C库)基于各种全局变量的非零存在来改变其行为。例如,如果我将argp_program_bug_address
定义为非零值,则它将用作生成的--help
输出的一部分。
检测零和非零之间的区别很简单。Arpg如何处理我可能会或可能根本不会定义argp_program_bug_address
并不明显。如果我没有定义它,大概glibc中必须存在将其设置为零的定义。实际上,argp/argp-ba.c
中似乎存在定义但如果是这样的话,如果我定义它,那就意味着我和库都定义了它,导致链接错误,抱怨多重定义。
弱符号似乎是一种解决方案,但检查glibc源代码,我找不到任何证据表明argp_program_bug_address
或类似变量的定义是弱的。
这是如何工作的,这样我就可以定义一个值,而不会导致多个定义错误,但它也工作,如果我从来没有定义它?
1条答案
按热度按时间wdebmtf21#
当你链接到glibc时,你是在链接(例如)
/usr/lib64/libc.so
。这是一个链接器脚本:
字符串
argp/argp-ba.c
只有一个 * 单一 * 定义:型
这个定义进入
/usr/lib64/libc.a
,是一个常见的符号(nm
类型C
和readelf
类型COM
)。因此,如果您不 * 定义它,符号将使用
libc.a:argp-ba.o
中的定义在.bss
部分结束。如果你定义了它,链接器会使用你的定义,符号会出现在
.data
部分。