2013-11-25 111 views
4

什么是确定预编译的二进制文件的依赖关系的最佳方式(特别是在问候的glibc和libstdC++符号&版本),然后确保目标系统已经安装了这些?确定二进制兼容性linux下

我有一个限制,因为我无法提供在每台机器上进行编译的源代码(雇主限制),因此“在每台机器上编译以确保兼容性”的响应并不合适。我也不希望提供静态编译的二进制文件 - >似乎非常适合用锤子打开一个蛋。

我已经考虑了一些方法,其松散地中心周围确定所述符号/库我的可执行/库需要通过使用如 ldd -v </path/executable>objdump -x </path/executable> | grep UND 然后以某种方式运行目标系统上的命令,检查命令的如果提供这样的符号,库和版本(不完全确定我是如何做这一步的?)。 然后会进行一些模式或符号匹配,以确保存在正确的版本或更高版本。

这么说,我觉得这已经对我来说在很大程度上完成,我是从...患“知识差距?”它是如何实施的。

对如何进行任何想法/建议?

我要补充一点,这是在各种Linux发行版的安装我的软件的目的 - 特别定制的集群 - 这可能不服从分配的准则或规范的包装方法。目标是无缝安装。

+0

可能重复:http://stackoverflow.com/questions/4266354/how-to-tell-if-glibc-is-used用glibc和STDC++相关 – oakad

+0

GNU头已经相应版本的宏定义。事实上,使用stdC++你可以依靠gcc版本,它们总是聚集在一起。 – oakad

+0

我使用的一些库是由第三方提供的,因此我没有源访问权限来内部检查版本宏 – John

回答

1

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

enter image description here

+0

这不是我的自定义分发。根据我的经验,每次遇到Linux群集时,系统管理员都会以各种非标准方式对其进行定制。一种常见的表现形式是他们喜欢安装软件的位置。我指定/ opt为默认值(我相信LSB指定),但我发现50%的安装更喜欢别的地方。 – John

4

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

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

将返回版本的符号,然后可以进行处理,建立支持的最大的libc接口版本(的libstdc同一作品++)进一步壳的列表。从C代码,就必须做到使用dlvsym相同()选项(第一dlopen()的图书馆,然后检查是否您需要的符号的某些最低版本使用dlvsym进行查找())。

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

但是,版本控制接口的正确使用是编写明确链接到特定glibc/libstdC++库版本的代码。例如,链接到GLIBC_2.10接口版本的代码预计适用于任何比2.10更新的glibc版本(所有版本高达2.18及更高版本)。尽管可以在每个符号的基础上启用版本控制(使用“.symver”汇编器/链接器伪指令),但更合理的方法是使用工具链的较旧版本(最低支持版本)设置chroot环境,并编译项目它(它会无缝运行,遇到任何新版本)。