如何强制我的应用程序的某个特定模块使用旧版本的libc?
我有两个.so文件,我需要链接到我的应用程序,但其中一个只能使用较旧版本的libc,一个只能使用较新版本。
我确实有源,但到目前为止追踪错误的来源是不成功的。我不是那种搜索,因为这肯定是正确的解决方法。
作为一种临时措施,无论如何都要强制链接器将旧的libc用于应用程序的那一部分吗?
我可以静态链接内容和/或设置符号链接。
更新/澄清:
我试图通过不更改代码库来实现这一点。我想找出一种告诉链接器的方法,对于这个非常具体的.so文件,应该使任何libc符号指向较旧的libc副本。
即使/当我找到真正的错误时,这似乎也是一个有趣的挑战。
这甚至可能吗?
由于
答案 0 :(得分:1)
从技术上讲,您可以使用dlopen动态加载替代库,然后使用dlsym从中检索符号的地址。这允许您获取函数的地址并调用其代码而不是默认代码。例如,请参阅此linker documentation page。
然而,根据受影响和最差的代码的大小,实现这一点至少是复杂的,可能注定标准C库的低级别以及它可能暗示的冲突/不匹配。
了解代码(或libc)的错误绝对是一种更好的方法
更新:
符号有一个名称空间,据我所知,没有办法告诉如何根据代码来源解析符号。您肯定需要使用我建议的方法修改您的代码。
或者,您可以将代码拆分为两个与各自libc链接的程序,并让它们通过套接字,共享内存或其他任何方式进行通信,但这也意味着重写(并在此重新构建)代码。