2014-01-29 25 views
8

似乎glibc 2.14引入了memcpy(修复bug 12518)的新版本。然后,针对glibc 2.14+编译的程序将包含一个到[email protected]_2.14的动态链接,这在旧版本的glibc中显然不可用。如何创建向后兼容的动态链接?

但是,glibc 2.14+显然仍然包含旧的[email protected]_2.2.5符号以实现向后兼容。我希望能够编译一些程序,使其与旧版glibc版本二进制兼容。在glibc 2.14+的系统上,如何编译一个程序,以便它使用这个旧的符号版本?如果程序必须是特定于编译器的,那么我使用GCC(但是如果知道如何在其他编译器上执行它也会很好)。 (在附注中,我必须承认,对于版本化的符号,例如如何生成它们以及如何使用它们,或者它们是否是ELF特定的,或者应该被认为是标准部件,我不得而知。关于这个问题有没有什么好的信息来源?)

回答

3

关于共享库,符号版本控制和相关问题的规范文档是Ulrich Drepper的http://www.akkadia.org/drepper/dsohowto.pdf

要对旧的符号引用,你就需要找到一个声明它的头部,然后用汇编指令:

extern void nftw_old (int) ; 
asm (".symver nftw_old,[email protected]_2.3.3"); 
void main() 
{ 
    nftw_old(0); 
} 

注意,编译可执行的“纳米”是指预计之前-ABI [email protected]_2.3.3实施。 (不要试图运行这个程序 - 真正的nftw(3)函数签名是不同的。)

+0

这是唯一的方法吗?不必修改源代码就可以改变链接。有没有办法告诉链接器在生成最终可执行文件时选择符号版本,而不是在源代码级别执行? – Dolda2000

+0

感谢您的链接,顺便说一下! – Dolda2000

+0

这是一种手工完成的方式,在符号版本级别,这是我认为你以后的事情。更简单的方法是使用旧的.a/.so/.h文件和编译/链接来保存较旧的软件安装。 – fche