如果 GNU Argp 存在argp_program_bug_address,GNU Argp 如何改变其行为?

How does GNU Argp change its behavior if argp_program_bug_address exists or not?

提问人:Alan De Smet 提问时间:10/23/2023 最后编辑:Steve FriedlAlan De Smet 更新时间:10/24/2023 访问量:50

问:

GNU Argp(gnu C 库 glibc 的一部分)根据各种全局变量的非零存在来改变其行为。例如,如果我定义为非零值,它将用作生成输出的一部分。argp_program_bug_address--help

检测零和非零之间的差异很简单。Arpg 的处理方式并不那么明显,我可能会或可能根本没有定义。如果我不定义它,那么 glibc 中可能必须存在将其设置为零的定义。事实上,argp/argp-ba.c声明)中似乎有一个定义。但是,如果是这样的话,如果我定义它,那将意味着我和库都定义了它,导致链接错误抱怨多重定义。argp_program_bug_address

弱符号似乎是一个解决方案,但是检查glibc源,我找不到任何证据表明或类似的变量定义弱。argp_program_bug_address

这是如何工作的,以便我可以定义一个在不导致多重定义错误的情况下使用的值,但如果我从不定义它,它也有效?

c glibc 弱符号

评论

0赞 Alan De Smet 10/23/2023
实验表明,当动态链接时,程序中定义的值会覆盖库中的值。如果这就是正在发生的事情,我会对定义此行为的任何文档感兴趣。

答:

2赞 Craig Estey 10/24/2023 #1

当您链接到 glibc 时,您将与 (e.g.) 链接。/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.anmCreadelfCOM

因此,如果不定义它,则符号最终将出现在使用 中定义的部分中。.bsslibc.a:argp-ba.o

如果确实定义了它,链接器将使用您的定义,并且符号最终会出现在该部分中。.data