共享对象 .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-linux
和 libc.so
必须 来自相同的 GLIBC 构建。
由于 ld-linux
由主要可执行文件确定(在静态 link 时被硬编码到其中),它不会匹配您的自定义 libc.so.6
无论你做什么来编译你的.so
.
此外,在构建 .so
时指定 --dynamic-linker
是没有意义的:加载 .so
是 ld-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。
我想使用一个使用 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-linux
和 libc.so
必须 来自相同的 GLIBC 构建。
由于 ld-linux
由主要可执行文件确定(在静态 link 时被硬编码到其中),它不会匹配您的自定义 libc.so.6
无论你做什么来编译你的.so
.
此外,在构建 .so
时指定 --dynamic-linker
是没有意义的:加载 .so
是 ld-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。