对于未列出的名称条目,存在表单_name的同义词 在他们的名字前加上一个前导下划线。因此libc包含 例如,getopt和_getopt。
Figure 3-2: libc Contents, Names with Synonyms
__assert getdate lockf ** sleep tell **
cfgetispeed getopt lsearch strdup tempnam
cfgetospeed getpass memccpy swab tfind
cfsetispeed getsubopt mkfifo tcdrain toascii
cfsetospeed getw mktemp tcflow _tolower
ctermid hcreate monitor tcflush tsearch
cuserid hdestroy nftw tcgetattr _toupper
dup2 hsearch nl_langinfo tcgetpgrp twalk
fdopen isascii pclose tcgetsid tzset
__filbuf isatty popen tcsendbreak _xftw
fileno isnan putenv tcsetattr
__flsbuf isnand ** putw tcsetpgrp
fmtmsg ** lfind setlabel tdelete
为什么libc包含同义词?
更新
如何使用同义词?我尝试将getopt
替换为_getopt
但仅获取undefined reference to
_ getopt'`
答案 0 :(得分:0)
可能是因为它们最初是非标准的,后来被添加到POSIX,删除了前缀,但需要向后兼容,并且被保留,因此自然需要同义词。
答案 1 :(得分:0)
或者可能(遵循@ rubenvb的答案,我认为是正确的)来保持与一些如此命名的Win32库函数的源级兼容性。 _toupper就是其中之一。
答案 2 :(得分:0)
引自“SYSTEM V APPLICATION BINARY INTERFACE”,
C库包含其某些服务的同义词。这些其他符号可用于符合语言和系统标准。例如,System V将
read
定义为操作系统工具的名称。另一方面,ANSI C没有定义read
,它禁止严格一致的实现篡改应用程序名称而不使用前导下划线(_)。因此,如果read
的同义词不可用,则系统无法支持严格符合ANSI C语言的实现。注意:虽然以下接口不需要同义词,但允许它们存在。
简而言之,同义词是为了符合ANSI C建议。如果您使用Linux,那么ELF格式文档中包含同义词的某些函数似乎在glibc
中没有同义词,因此您可能希望使用readelf -s /usr/lib/libc.a
检查符号是否存在。