我尝试将我的二进制文件及其所有共享库打包到一个存档中。我希望用户只提取存档以使二进制工作。可执行文件通过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发行版)