确定预编译二进制文件的依赖关系(特别是关于glibc和libstdc ++符号和版本)的最佳方法是什么,然后确保目标系统安装了这些依赖项?
我有一个限制,我无法在每台机器上提供源代码(雇主限制),所以 defacto 响应"在每台机器上编译以确保兼容性"不适合。我也不希望提供静态编译的二进制文件 - >似乎非常使用锤子打开鸡蛋。
我已经考虑了许多方法,这些方法通过使用诸如以下命令来确定我的可执行文件/库所需的符号/库。
ldd -v </path/executable>
要么
objdump -x </path/executable> | grep UND
然后以某种方式在目标系统上运行命令以检查是否提供了这样的符号,库和版本(不完全确定我是如何执行此步骤的?)。
然后将进行一些模式或符号匹配,以确保存在正确的版本或更高版本。
那就是说,我觉得这已经基本上已经为我做了,而且我已经患上了......知识差距?&#34;目前如何实施。
有关如何进行的任何想法/建议?
我应该补充一点,这是为了在各种各样的Linux发行版上安装我的软件 - 特别是定制集群 - 可能不遵守分发指南或标准化的打包方法。目标是无缝安装。
答案 0 :(得分:4)
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环境并编译项目它(它将与遇到的任何新版本无缝运行)。
答案 1 :(得分:1)