提问人:Alan De Smet 提问时间:10/23/2023 最后编辑:Steve FriedlAlan De Smet 更新时间:10/24/2023 访问量:50
如果 GNU Argp 存在argp_program_bug_address,GNU Argp 如何改变其行为?
How does GNU Argp change its behavior if argp_program_bug_address exists or not?
问:
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
这是如何工作的,以便我可以定义一个在不导致多重定义错误的情况下使用的值,但如果我从不定义它,它也有效?
答:
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.a
nm
C
readelf
COM
因此,如果不定义它,则符号最终将出现在使用 中定义的部分中。.bss
libc.a:argp-ba.o
如果确实定义了它,链接器将使用您的定义,并且符号最终会出现在该部分中。.data
评论