共享对象 .so 文件中的动态链接

Dynamic linking in a shared object .so file

我想使用一个使用 glibc2.14 的 SDK/library。我的机器有 glibc2.12。我在一个单独的位置安装了 glibc2.14。通过使用编译选项 --rpath 在我的可执行文件中使用 SDK,它运行良好。

现在,我想在共享对象二进制文件 (.so) 中使用 SDK(使用 glibc2.14)。我尝试了 --rpath 和 --dynamic-linker 选项,但未加载共享对象,它在运行时给我一个错误 - /lib64/libc.so.6: version ``GLIBC_2.14'' not found (required by /usr/local/lib/libsdk.so.1).

如何使共享对象二进制查看 glibc2.14?

Now, I want to use the SDK (that uses glibc2.14) in a shared object binary (.so).

你不能。

正如 this answer 所解释的那样,ld-linuxlibc.so 必须 来自相同的 GLIBC 构建。

由于 ld-linux 由主要可执行文件确定(在静态 link 时被硬编码到其中),它不会匹配您的自定义 libc.so.6 无论你做什么来编译你的.so.

此外,在构建 .so 时指定 --dynamic-linker 是没有意义的:加载 .sold-linux 的工作,所以根据定义 ld-linux 必须 在任何 .so 加载到进程之前已经加载。

P.S。如果 可以 让你的 .so 使用不同的 libc.so.6,结果将是(几乎)立即崩溃,因为 libc.so.6 不是旨在将多个副本加载到同一进程时工作。

更新:

upgrade my OS which I don't think is possible because I am developing the software for a client and getting them to upgrade is not going to be easy. Second would be to ask the SDK supplier to recompile with glibc2.12.

GLIBC-2.14 was released 9 年前。您的供应商“仅”支持 2.14(及更高版本)并非没有道理,您的客户 运行 这么旧的 OS.

有点不合理

我认为您有第三种可能的选择:让客户端并行安装更新的 GLIBC,并使用 --rpath--dynamic-linker 标志构建其 主可执行文件 (就像你所做的那样)。然后他们的二进制文件就可以毫无问题地加载您的 SDK。