【发布时间】:2011-09-13 11:53:03
【问题描述】:
我刚刚做了一个使用 ld 的 -rpath 选项和 $ORIGIN here 的基本示例(有关工作版本,请参阅第二个响应)。我正在尝试创建一个示例,其中main.run 链接到foo.so,而后者又链接到bar.so,全部使用rpath 和$ORIGIN。
运行时文件结构为:
- 项目/
- lib/
- 目录/
- 子/
- bar.so
- foo.so
- 运行/
- main.run(构建失败)
我正在构建 foo.so 使用:
g++ -c -o obj/foo.o src/foo.cpp -fPIC
g++ -shared -o lib/dir/foo.so obj/foo.o -Wl,-soname,foo.so -Wl,-rpath,'$ORIGIN/sub' -Llib/dir/sub -l:bar.so
构建良好。 ldd lib/dir/foo.so 甚至可以找到bar.so。
但是,当我尝试将main.run 链接到foo.so 时,foo.so 找不到 bar.so。
我正在构建 main.so 使用:
g++ -c -o obj/main.o src/main.cpp
g++ -o run/main.run obj/main.o -Wl,-rpath,'$ORIGIN/../lib/dir' -Llib/dir -l:foo.so
如果使用不递归链接的另一个版本的foo.so,这将正常工作。 (在 make.sh 中取消注释行,在下面的项目中进行测试)。
但是,使用普通的 foo.so 在构建 main.run 时出现此错误:
/usr/bin/ld: 警告:bar.so,lib/dir/foo.so 需要,未找到(尝试使用 -rpath 或 -rpath-link)
所以我的问题是:
- foo.so 中的
$ORIGIN是否解析为project/lib/dir(foo.so所在的位置)或project/run(main.run(链接它的可执行文件)所在的位置)?
ldd 似乎表明它是project/lib/dir,这似乎是最好的方法(尽管我尝试同时假设两者)。 - 如何让这些链接(同时保持可重定位性) - 最好不使用
-rpath-link。
您可以下载项目here。这就像我能做到的一样简单。 4 个短资源和一个脚本。
解压后,在project/内运行./make.sh即可。
注意:我使用的是-l:。这不应该改变任何东西,除了库被命名为foo.so 而不是libfoo.so,并且与-l:foo.so 而不是-lfoo 连接。
【问题讨论】:
-
试试
-Wl,-rpath,'$ORIGIN/../lib/dir' -Wl,-rpath,'$ORIGIN/sub'。 (也许 foo.so rpath 没有被合并到最终 exe 的 rpath 中) -
实际上,我应该澄清一下 - 构建失败(在制作 main.run 时),所以没有最终的 exe。我会解决的。
-
抱歉,运气不好。将我能想到的每条路径都添加到两者中。
-
另请注意:如果
foo.so的-rpath是绝对的,而不是$ORIGIN,则它不会出错。 -
哦,好吧:-)。如果您在这里没有得到任何有用的答案,请尝试在 binutils@sourceware.org 邮件列表中提问。