【问题标题】:How to create backwards-compatible dynamic linkage?如何创建向后兼容的动态链接?
【发布时间】:2014-02-20 15:22:08
【问题描述】:

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;我还没有找到任何关于它的文档。有没有关于这个主题的好的信息来源?)

【问题讨论】:

    标签: c glibc elf libc binary-compatibility


    【解决方案1】:

    关于共享库、符号版本控制和相关问题的规范文档是 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) 函数签名是不同的。)

    【讨论】:

    • 这是唯一的方法吗?不必为了改变链接而修改源代码会很好。有没有办法告诉链接器在生成最终可执行文件时选择符号版本,而不是在源代码级别进行?
    • 谢谢你的链接,顺便说一句!
    • 这是一种在符号版本控制级别上手动完成的方法,这就是我认为您所追求的。更简单的方法是使用旧的 .a / .so / .h 文件获取较旧的软件安装,并针对它们进行编译/链接。
    猜你喜欢
    • 2020-11-04
    • 1970-01-01
    • 2017-06-23
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多