nm -D /lib32/libc.so.6 | grep '\<fopen\>'
0005d0c0 T fopen
00109750 T fopen

readelf -s  /lib32/libc.so.6 | egrep '0005d0c0|00109750'
181: 0005d0c0    50 FUNC    GLOBAL DEFAULT   12 fopen@@GLIBC_2.1
182: 00109750   136 FUNC    GLOBAL DEFAULT   12 fopen@GLIBC_2.0
679: 0005d0c0    50 FUNC    GLOBAL DEFAULT   12 _IO_fopen@@GLIBC_2.1
680: 00109750   136 FUNC    GLOBAL DEFAULT   12 _IO_fopen@GLIBC_2.0

这是我的问题:
  • 为什么/lib32/libc.so.6 中有两个 fopen 符号?应该禁止同一目标文件中的相同符号,对吗?
  • 为什么 readelf -s 转储 fopen@@GLIBC_2.1 和 fopen@GLIBC_2.0 而不是 fopen?

  • 谢谢

    最佳答案

    实际上,同一符号的多个定义是可以的,并且可以以多种方式发生。其中之一(这里不是这种情况)是弱符号。

    这里发生的是 glibc 动态链接器支持符号版本控制,而 glibc 使用它。它从 glibc 2.1 导出一个 fopen 版本,从 glibc 2.0 导出一个具有不同接口(interface)的向后兼容版本。

    在动态链接时,应用程序可以选择特定版本或默认版本。

    关于linux - 为什么/lib32/libc.so.6 里面有两个 "fopen"符号?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9156414/

    10-13 06:09