表单的同义词_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‘’
发布于 2011-07-12 16:52:48
可能是因为它们最初是不标准的,后来又添加到POSIX中,删除了前缀,但需要向后兼容,并且保持不变,因此自然需要使用同义词。
发布于 2011-07-12 16:59:56
或者(按照@rubenvb的答案(我认为这是正确的)来保持源代码级与一些这样命名的Win32库函数的兼容性。_toupper就是其中之一。
发布于 2012-03-01 16:21:16
引用"SYSTEM应用程序二进制接口“
C库包括它的一些服务的同义词。这些其他符号可用于符合语言和系统标准。例如,System defi将
read作为操作系统工具的名称。另一方面,ANSI并不是deread,它禁止严格一致的实现在没有前导下划线(_)的情况下篡夺应用程序名称。因此,如果read的同义词不可用,系统就无法支持严格一致的ANSI语言实现。
注意:虽然以下接口不需要同义词,但允许存在同义词。
简而言之,同义词是与ANSI C建议一致的。如果使用Linux,ELF格式文档中的一些同义词函数在glibc中似乎没有同义词,因此您可能需要用readelf -s /usr/lib/libc.a检查符号的存在。
https://stackoverflow.com/questions/6667863
复制相似问题