C语言 如果argp_program_bug_address存在或不存在,GNU Argp如何改变其行为?

plicqrtu  于 2023-11-16  发布在  其他
关注(0)|答案(1)|浏览(86)

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或类似变量的定义是弱的。
这是如何工作的,这样我就可以定义一个值,而不会导致多个定义错误,但它也工作,如果我从来没有定义它?

wdebmtf2

wdebmtf21#

当你链接到glibc时,你是在链接(例如)/usr/lib64/libc.so
这是一个链接器脚本:

/* GNU ld script
   Use the shared library, but some functions are only in
   the static library, so try that secondarily.  */
OUTPUT_FORMAT(elf64-x86-64)
GROUP ( /lib64/libc.so.6 /usr/lib64/libc_nonshared.a  AS_NEEDED ( /lib64/ld-linux-x86-64.so.2 ) )

字符串
argp/argp-ba.c只有一个 * 单一 * 定义:

const char *argp_program_bug_address;


这个定义进入/usr/lib64/libc.a,是一个常见的符号(nm类型Creadelf类型COM)。
因此,如果您不 * 定义它,符号将使用libc.a:argp-ba.o中的定义在.bss部分结束。
如果你定义了它,链接器会使用你的定义,符号会出现在.data部分。

相关问题