为什么libc包含同义词?

时间:2011-07-12 16:44:47

标签: libc synonym

  

对于未列出的名称条目,存在表单_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'`

3 个答案:

答案 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检查符号是否存在。