Linux c ++可移植二进制问题

时间:2016-10-13 11:27:50

标签: c++ linux shared-libraries glibc portable-applications

我尝试将我的二进制文件及其所有共享库打包到一个存档中。我希望用户只提取存档以使二进制工作。可执行文件通过shell脚本启动,我将LD_LIBRARY_PATH设置为存档中包含的共享库路径。

我第一次想让它在RHEL 6.7发行版上工作,所以我用这个发行版编译了我的二进制文件,当我测试它时效果很好。 问题是我现在要让它在RHEL 7.2上运行(并保持RHEL 6.7正常工作),当我启动二进制文件时它不起作用......它在glibc函数内崩溃(在参数中没有垃圾的isspace) 。 我看到这两个RHEL版本背后的glibc版本已经改变了。 在存档中包含的共享库中没有glibc共享库,所以我尝试添加它,现在我收到以下错误:

./XXX: ���:ELF: zR: Error 892688562

这似乎是一个ELF错误(每次启动时都会出现详细信息),我检查所有共享库,它们是x64库(如二进制文件)... 我不想在RHEL 7.2上编译,因为我有很多依赖项,我不想编译所有这些,而且我也更容易维护一个版本。

我尝试了许多像Statifier和Ermine这样的东西,它们都有效,但第一个有bug,必须禁用地址空间布局随机化,第二个是共享软件,我更喜欢免费的解决方案。我也试过CDE也行,但它产生了这么大的包,它有点乱......

为什么使用这种解决方案并使用我自制的解决方案不起作用?我做得不好?

感谢您的阅读, 我希望有人为我找到解决方案,因为我搜索了很长时间......

编辑:

我在shell脚本之前找到了解决方案:

# Binary location
LOCATION=$(dirname $0)
# Shared libraries directory
BINDIR=${LOCATION}/bin/
# Define LD_LIBRARY_PATH
export LD_LIBRARY_PATH=${BINDIR}:${LD_LIBRARY_PATH}
# Launch binary
${LOCATION}/XXX $*

我改变了:

# Binary location
LOCATION=$(dirname $0)
# Shared libraries directory
BINDIR=${LOCATION}/bin/
# Changed shared library default location and launch binary
${BINDIR}/ld-linux-x86-64.so.2 --library-path ${BINDIR} ${LOCATION}/XXX $*

我真的不明白为什么但它有效,有人可以解释一下吗? (ld-linux-x86-64.so.2来自RHEL 6.7发行版)

1 个答案:

答案 0 :(得分:0)

  

我真的不明白为什么但它有效,有人可以解释一下吗?

解释here。您的解决方案是“显式加载程序调用”,提到here

顺便说一句,这是错误的:${LOCATION}/XXX $*你应该这样做:

${LOCATION}/XXX "$@"

(您的变体不会正确处理嵌入空格的参数。)