【发布时间】:2016-05-05 21:40:18
【问题描述】:
对于不使用 libtool 的项目,我已成功将 RUNPATH 设置为
LDFLAGS="-Wl,-rpath='\$$ORIGIN/../lib64',--enable-new-dtags"。但是,对于基于 libtool 的项目,我得到 RIGIN/../lib。是否可以使用与/不兼容 libtool 的单个 export?还是我必须检测是否正在使用 libtool?
bash-4.3# readelf -d ../tmp/bin/grep
Dynamic section at offset 0x43028 contains 18 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libc.so]
0x000000000000001d (RUNPATH) Library runpath: [$ORIGIN/../lib]
...
bash-4.3# readelf -d ../tmp/bin/awk
Dynamic section at offset 0x9b028 contains 18 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libc.so]
0x000000000000001d (RUNPATH) Library runpath: [RIGIN/../lib]
...
编辑:
更正,我用的是-Wl,-rpath="'\$$ORIGIN'"/../lib,--enable-new-dtags
【问题讨论】:
-
[RIGIN/../lib]看起来像是某种吹爆的 make 变量。如果有人在 makefile 中执行此操作,我会期望这种效果:ORIGIN = whatever,然后执行$ORIGIN而不是$(ORIGIN),或者没有正确转义$ORIGIN,我猜这就是您所看到的.您可能需要额外的逃生级别,但我认为您必须进行实验。\$\$ORIGIN会通用吗?试试 libtool 看看它是否有效,这样你就有了一个起点。 -
\$\$ORIGIN使RUNPATHs[RIGIN/../lib]. -
我看到有人提到使用 gcc 规范文件。我对这些不熟悉。 libtool 会使用它吗?
-
我熟悉的唯一规范文件是用于 rpm [或其他包] 管理器的。你知道 libtool 输出中的最后一行 make 用于 ld 吗?另外,我会查看它以了解它对 LDFLAGS 的作用。也许你需要另辟蹊径,为 libtool 做
\$ORIGIN看看。你想要的是适用于 libtool 的配方 [你已经有了非版本]。然后,在最坏的情况下,它是一个条件挂钩。 libtool 可能想要拥有 LDFLAGS,因此您可能必须设置另一个变量,例如:EXTRA_LDFLAGS 或类似的,它将使用,但不要受到干扰。我认为你只需要继续修改它。 -
如果你选择
info gcc,然后搜索spec file,它会给你一些信息。但是,我不确定它有什么帮助。猜测一下,它更多是用于控制由 gcc 调用的 cpp、ld 等,而不是像 libtool 这样调用 gcc 的东西