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

标签 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,它们都可以工作,但第一个有一个错误,必须禁用地址空间布局随机化,第二个是共享软件,我更喜欢免费的解决方案。我也试过 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 发行版)

最佳答案

I don't really understand why but it works, someone can explain me please ?

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

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

${LOCATION}/XXX "$@"

(您的变体将无法正确处理带有嵌入空格的参数。)

关于c++ - Linux c++ 可移植二进制问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40019728/

相关文章:

mysql - 如何使用 ssh 从命令行执行 init 脚本

c - 在已编译的 C 程序中查找 asm 指令

windows - Linux 的 ldd 在 Windows 上的等效项是什么?

c++ - 这个C头文件写得正确吗?

c++ - pthread_join() 好像导致我的程序挂了,哪里出错了?

linux - 如果进程数大于内核数的一半,为什么性能会下降?

c++ - 如何在给定 PID 的情况下隐藏进程的控制台?

websphere - 将共享库附加到 WebSphere 应用程序的模块

c++ - 重载全常量类型的复制赋值运算符的正确方法是什么?

c++ - boost 结构和类的 fusion 序列类型和名称识别