gcc - rpath=$ORIGIN 没有预期的效果?

标签 gcc linker freebsd rpath

我有一个二进制“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/

相关文章:

tcp - 基于 FreeBSD 或 NetBSD 的商业 TCP/IP 堆栈供应商?

ubuntu - Ubuntu 和 FreeBSD 之间的 rsync

windows - BSD 以外的操作系统的原子加载/存储?

c++ - 如何忽略 'comparison between signed and unsigned integer expressions' ?

c - 从 fgets() 输入中删除尾随换行符

c - 通过 Cygwin 运行可执行文件

python - 使用 ctypes 加载 .dll

android: 在 aidl 文件 com.android.internal.telephony.gsm.NetworkInfo 中找不到类错误的导入

linux - gcc 在 hpc 上出错

c++ - Qt Creator 项目不会在 Windows 上构建(链接器错误)