【问题标题】:How to link 2 versions of libc in to the same application?如何将 2 个版本的 libc 链接到同一个应用程序?
【发布时间】:2012-03-21 17:49:50
【问题描述】:

如何强制我的应用程序的一个特定模块使用旧版本的 libc?

我有两个 .so 文件需要链接到我的应用程序中,但其中一个仅适用于旧版本的 libc,另一个仅适用于较新版本。

我确实有来源,但到目前为止追查错误来源一直没有成功。我不会放弃那个搜索,因为这肯定是正确的解决方法。

作为一种临时措施,是否强制链接器仅将旧的 libc 用于应用程序的那部分?

我可以静态链接内容和/或设置符号链接。

更新/澄清:

我正在尝试在不更改代码库的情况下实现这一点。我想找到一种方法告诉链接器,对于这个非常具体的 .so 文件,任何 libc 符号都应该指向旧的 libc 副本。

即使/当我找到真正的错误时,这本身似乎也是一个足够有趣的挑战。

这可能吗?

谢谢

【问题讨论】:

    标签: linker shared-libraries solaris ld libc


    【解决方案1】:

    从技术上讲,您可以使用 dlopen 动态加载替代库,然后使用 dlsym 从中检索符号的地址。这使您可以获取函数的地址并调用它们的代码而不是默认代码。例如,请参见 linker documentation page

    但是,根据受影响的代码的大小和最坏的情况,这至少实现起来会很复杂,考虑到标准 C 库的低级别和它可能暗示的冲突/不匹配,这可能注定要失败。

    了解您的代码(或 libc)有什么问题肯定是更好的方法

    更新

    据我所知,符号只有一个名称空间,无法根据代码来源来说明如何解析符号。你肯定需要用我建议的方法修改你的代码。

    或者,您可以将代码拆分为两个与各自的 libc 链接的程序,并让它们通过套接字、共享内存或其他方式进行通信,但这也意味着重写(并在此处重新架构)您的代码。

    【讨论】:

    • 有趣的链接,谢谢。显然找到错误的正确解决方案,但这不是问题的重点。 :) 这可以在编译器标志级别完成吗? (我会更新原帖。)
    猜你喜欢
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    相关资源
    最近更新 更多