Linker 如何将2个版本的libc链接到同一个应用程序?

Linker 如何将2个版本的libc链接到同一个应用程序?,linker,shared-libraries,solaris,ld,libc,Linker,Shared Libraries,Solaris,Ld,Libc,如何强制应用程序的某个特定模块使用旧版本的libc 我有两个.so文件需要链接到我的应用程序中,但其中一个只适用于旧版本的libc,另一个只适用于新版本的libc 我确实知道错误的来源,但到目前为止,追查错误的来源还没有成功。我不会放弃那项研究,因为那肯定是正确的解决办法 作为一种临时措施,是否存在强制链接器仅对应用程序的该部分使用旧的libc的方法 我可以静态链接东西和/或设置符号链接 更新/澄清: 我试图在不改变代码库的情况下实现这一点。我想找出一种方法告诉链接器,对于这个非常具体的.so文

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

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

我确实知道错误的来源,但到目前为止,追查错误的来源还没有成功。我不会放弃那项研究,因为那肯定是正确的解决办法

作为一种临时措施,是否存在强制链接器仅对应用程序的该部分使用旧的libc的方法

我可以静态链接东西和/或设置符号链接

更新/澄清:

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

即使我真的找到了真正的bug,这本身也是一个非常有趣的挑战

这可能吗


感谢

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

然而,根据受影响的代码的大小和最坏的情况,这至少会很复杂,因为标准C库的级别较低,并且可能意味着冲突/不匹配

理解代码(或libc)的错误肯定是更好的方法

更新

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


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

有趣的链接,谢谢。显然,找到错误的正确解决方案,但这不是问题的重点。:)这可以在编译器标志级别完成吗?(我将更新原始帖子。)