Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
确定linux下的二进制兼容性_Linux_Glibc_Binary Compatibility - Fatal编程技术网

确定linux下的二进制兼容性

确定linux下的二进制兼容性,linux,glibc,binary-compatibility,Linux,Glibc,Binary Compatibility,确定预编译二进制文件的依赖项(特别是glibc和libstdc++符号和版本)并确保目标系统已安装这些依赖项的最佳方法是什么 我有一个限制,因为我不能提供在每台机器上编译的源代码(雇主限制),所以“在每台机器上编译以确保兼容性”的实际响应是不合适的。我也不想提供静态编译的二进制文件->看起来很像是用锤子打开鸡蛋 我已经考虑了一些方法,这些方法松散地围绕着通过使用以下命令来确定我的可执行文件/库所需的符号/库 ldd-v 或 objdump-x | grep UND 然后在目标系统上运行一个命令,

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

我有一个限制,因为我不能提供在每台机器上编译的源代码(雇主限制),所以“在每台机器上编译以确保兼容性”的实际响应是不合适的。我也不想提供静态编译的二进制文件->看起来很像是用锤子打开鸡蛋

我已经考虑了一些方法,这些方法松散地围绕着通过使用以下命令来确定我的可执行文件/库所需的符号/库
ldd-v
objdump-x | grep UND
然后在目标系统上运行一个命令,检查是否提供了这些符号、库和版本(不完全确定我是如何完成这一步的?)。 然后再进行一些模式或符号匹配,以确保存在正确的版本或更高版本

这就是说,我觉得这件事对我来说已经基本完成了,我正遭受着。。。“知识差距”是指目前如何实施的

对如何进行有何想法/建议

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

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环境,并根据它编译项目(无论遇到什么新版本,它都将无缝运行).

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


可能重复:与glibc和stdc++关联的GNU头定义了相应的版本宏。事实上,使用stdc++你可以依赖gcc版本,它们总是在一起。我使用的一些库是由第三方提供的,因此我没有对它们的源代码访问权限来内部检查版本宏。这不是我的自定义发行版。根据我的经验,每次遇到linux集群时,系统管理员都会以各种非标准方式对其进行定制。一个常见的表现是他们喜欢安装软件的位置。我将/opt指定为我的默认设置(我相信是LSB指定的),但我发现50%的安装在别处。