我在Linux上编译了使用printf
的代码,并且发现在编译(gcc -c
时,该符号保留为printf
,但在我进行编译和链接时({{ 1}}),我看到符号变为gcc -o
。 glibc中的其他符号也会发生这种情况。
链接器会更改符号,以便仅在与一个版本的glibc而非其他版本链接时才起作用吗?
答案 0 :(得分:2)
链接器会更改符号,以便仅在与一个版本的glibc而非其他版本链接时才起作用吗?
否。
要了解此处发生的情况,您需要了解GNU versioned symbols。
除了极少数例外,GLIBC保持向后兼容性(当运行时GLIBC的版本与链接该程序的版本相同或更高时,旧程序将继续运行)。
如果使用printf@GLIBC.2.2.5
,则printf
的ABI会在2002年前的某个时间(2002年1月20日的GLIBC-2.2.5 was released)发生变化,此后一直没有变化。此后,您的二进制文件将与GLIBC的任何版本一起使用(对于该特定符号;您可能正在使用需要较新GLIBC的其他符号)。