【问题标题】:Determining binary compatibility under linux确定linux下的二进制兼容性
【发布时间】:2013-12-09 15:16:51
【问题描述】:

确定预编译二进制文件的依赖项(特别是关于 glibc 和 libstdc++ 符号和版本)并确保目标系统已安装这些依赖项的最佳方法是什么?

我有一个限制,我不能提供在每台机器上编译的源代码(雇主限制),所以“在每台机器上编译以确保兼容性”的 defacto 响应是不合适的。我也不希望提供静态编译的二进制文件 -> 似乎很像使用锤子打开鸡蛋的情况。

我考虑了许多方法,这些方法主要围绕通过使用以下命令来确定我的可执行文件/库所需的符号/库 ldd -v </path/executable> 要么 objdump -x </path/executable> | grep UND 然后以某种方式在目标系统上运行命令以检查是否提供了此类符号、库和版本(不完全确定我如何执行此步骤?)。 然后会进行一些模式或符号匹配,以确保存在正确的版本或更高版本。

也就是说,我觉得这已经在很大程度上为我完成了,我正在遭受......“知识差距?”目前是如何实施的。

关于如何进行的任何想法/建议?

我应该补充一点,这是为了将我的软件安装在各种 linux 发行版上 - 特别是定制集群 - 这些发行版可能不遵守发行指南或标准化打包方法。目标是无缝安装。

【问题讨论】:

  • 与 glibc 和 stdc++ 相关的 GNU 头文件定义了适当的版本宏。事实上,使用 stdc++ 你可以依赖 gcc 版本,它们总是结合在一起。
  • 我使用的一些库是由第三方提供的,因此我没有对它们进行源代码访问以在内部检查版本宏

标签: linux glibc binary-compatibility


【解决方案1】:

GNU 库(glibc 和 libstdc++)支持一种称为符号版本控制的机制。首先,这些库导出动态链接器使用的特殊符号来解析适当的符号版本(libstdc++ 中的 CXXABI_* 和 GLIBCXX_*,glibc 中的 GLIBC_*)。一个简单的脚本:

nm -D libc.so.6 | grep " A "

将返回一个版本符号列表,然后可以对其进行进一步的 shell 处理以建立最大支持的 libc 接口版本(同样适用于 libstdc++)。在 C 代码中,可以选择使用 dlvsym() 执行相同操作(首先 dlopen() 库,然后检查是否可以使用 dlvsym() 查找某些最小版本的符号)。

在运行时获取 glibc 版本的其他选项包括 gnu_get_libc_version() 和 confstr() 库调用。

但是,版本控制接口的正确使用是编写显式链接到特定 glibc/libstdc++ 库版本的代码。例如,链接到 GLIBC_2.10 接口版本的代码预计适用于任何高于 2.10 的 glibc 版本(所有版本不超过 2.18 及更高版本)。虽然可以基于每个符号启用版本控制(使用“.symver”汇编器/链接器指令),但更合理的方法是使用工具链的旧版本(支持的最低版本)设置 chroot 环境并针对其编译项目它(它将与遇到的任何新版本无缝运行)。

【讨论】:

    【解决方案2】:

    使用 Linux 应用程序检查器工具([1][2][3])检查您的应用程序与各种 Linux 发行版的二进制兼容性。您还可以通过此工具检查与您的自定义发行版的兼容性。

    【讨论】:

    • 这不是我的自定义发行版。以我的经验,每次遇到linux集群,系统管理员都会以各种非标准的方式对其进行定制。一种常见的表现是他们更喜欢安装软件的位置。我将 /opt 指定为我的默认值(我相信指定了 LSB),但我发现 50% 的安装更喜欢其他位置。
    猜你喜欢
    • 1970-01-01
    • 2011-01-02
    • 2013-03-24
    • 2010-12-18
    • 1970-01-01
    • 2015-10-11
    • 2011-08-03
    • 2019-04-16
    • 2011-08-09
    相关资源
    最近更新 更多