如何创建向后兼容的动态链接?

时间:2014-01-29 01:58:21

标签: c glibc elf libc binary-compatibility

似乎glibc 2.14引入了新版memcpy(以修复bug 12518)。然后,针对glibc 2.14+编译的程序将包含一个到memcpy@GLIBC_2.14的动态链接,这在旧版本的glibc中显然不可用。

然而,glibc 2.14+显然仍然包含旧的memcpy@GLIBC_2.2.5符号以实现向后兼容性。我希望能够以这样的方式编译一些程序,使它们与旧的glibc版本二进制兼容。如何在具有glibc 2.14+的系统上编译程序,以便它使用这个旧的符号版本?如果该过程必然是特定于编译器的,那么我正在使用GCC(但是知道如何在其他编译器上执行它也会很好。)

(另一方面,我必须承认对版本化符号一无所知,例如如何制作它们以及如何使用它们,或者它们是否是ELF特定的或应被视为标准的一部分现代ABI;我还没有设法找到任何关于它的文件。关于这个问题有没有很好的信息来源?)

1 个答案:

答案 0 :(得分:3)

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

要引用旧符号,您需要找到声明它的标题,然后使用汇编程序指令:

extern void nftw_old (int) ;
asm (".symver nftw_old,nftw@GLIBC_2.3.3");
void main ()
{
   nftw_old(0);
}

请注意,已编译的可执行文件的“nm”指的是预期的先前ABI nftw@GLIBC_2.3.3实现。 (不要试图运行这个程序 - 真正的nftw(3)函数签名是不同的。)