【问题标题】:Linux c++ portable binary issueLinux c ++可移植二进制问题
【发布时间】:2016-10-13 11:27:50
【问题描述】:

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

【问题讨论】:

  • 我认识一个尝试这样做的人,使用 Scientific Linux 5/6 iirc。他最终构建并使用了自己的自定义 glibc。为 Linux 提供二进制文件并不好玩。 (不是我的 dv 顺便说一句。)
  • 顺便说一句,为一堆目标平台构建不同的二进制文件是 llvm 所做的,这本身并不是一个不合理的方法。

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


【解决方案1】:

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

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

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

${LOCATION}/XXX "$@"

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 2012-07-15
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多