我有一个二进制“CeeloPartyServer”,它需要在运行时在 FreeBSD 机器上找到 libFoundation.so。它们都在同一个目录中。我编译(在另一个平台上,使用交叉编译器)CeeloPartyServer 使用链接器标志 -rpath=$ORIGIN
.
> 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 和 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 来驱动链接,所以在这种情况下,你需要通过添加
-Wl,-z,origin
来通过编译器传递标志。到您的 gcc 链接行。
关于gcc - rpath=$ORIGIN 没有预期的效果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6324131/