【问题标题】:rpath=$ORIGIN not having desired effect?rpath=$ORIGIN 没有想要的效果?
【发布时间】:2011-09-13 12:37:56
【问题描述】:

我有一个二进制“CeeloPartyServer”,它需要在运行时在 FreeBSD 机器上找到 libFoundation.so。它们都在同一个目录中。我使用链接器标志 -rpath=$ORIGIN 编译(在另一个平台上,使用交叉编译器)CeeloPartyServer。

> readelf -d CeeloPartyServer |grep -i rpath
 0x0000000f (RPATH)                      Library rpath: [$ORIGIN]
> ls
CeeloPartyServer    Contents        Foundation.framework    libFoundation.so
> ./CeeloPartyServer 
/libexec/ld-elf.so.1: Shared object "libFoundation.so" not found, required by "CeeloPartyServer"

为什么我尝试运行它时找不到库?

我的确切链接器行是:-lm -lmysql -rpath=$ORIGIN

我很确定我不必转义 $ 或类似的东西,因为我的 readelf 分析确实表明库 rpath 设置为 $ORIGIN。我错过了什么?

【问题讨论】:

标签: gcc linker freebsd rpath


【解决方案1】:

我假设您使用的是 gcc 和 binutils。

如果你这样做

readelf -d CeeloPartyServer | grep ORIGIN

您应该返回上面找到的 RPATH 行,但您还应该看到一些关于标志的条目。以下来自我构建的一个库。

0x000000000000000f (RPATH)              Library rpath: [$ORIGIN/../lib]
0x000000000000001e (FLAGS)              ORIGIN
0x000000006ffffffb (FLAGS_1)            Flags: ORIGIN

如果您没有看到某种 FLAGS 条目,您可能没有告诉链接器将该对象标记为需要原始处理。使用 binutils ld,您可以通过传递 -z origin 标志来做到这一点。

我猜你正在使用 gcc 来驱动链接,所以在这种情况下,你需要通过在你的 gcc 链接行中添加 -Wl,-z,origin 来通过编译器传递标志。

【讨论】:

  • 你所有的假设都是正确的。我没有使用 -z origin 标志,从未在任何地方看到过该标志。如果解决了,会通知您。
  • 从一些简短的实验来看,该标志似乎没有必要:我这里有一个二进制文件,它肯定需要一个 rpath 才能工作,rpath 以$ORIGIN 开头,没有设置标志,但它可以工作。
  • 我将如何在安装步骤中使用 cmake 执行此操作?将 INSTALL_RPATH 属性设置为 $ORIGIN 只完成了一半的工作。
【解决方案2】:

根据此标志在链接器看到它之前经过多少层,您可能需要使用$$ORIGIN 甚至\$$ORIGIN。当readelf 显示一个看起来像$ORIGIN/../lib 或类似的RPATH 标头时,您就会知道您做对了。额外的 $ 和反斜杠只是为了防止 $ 被链中的其他工具处理。

【讨论】:

  • 只是为对RPATH不太熟悉的其他人(比如我自己)澄清一下:在编译过程中设置RPATH时,尝试LDFLAGS="-Wl,-rpath,'\$\$ORIGIN' -Wl,-z,origin";其中echo $LDFLAGS 将给出:-Wl,-rpath,'$$ORIGIN' -Wl,-z,origin。 ($$ 有一些 Makefile 的魔力。)
  • \$$ORIGIN 在编译 Python 3 时为我工作。\$\$ORIGIN 不起作用并导致“RIGIN/../lib”作为 RPATH。
【解决方案3】:

\$\ORIGIN 如果您使用的是 chrpath 和 \$\$ORIGIN 如果您直接在 LDFLAGS 中提供

【讨论】:

    猜你喜欢
    • 2021-12-13
    • 1970-01-01
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 2021-08-29
    • 1970-01-01
    相关资源
    最近更新 更多