注意:下面是完整的工作示例。原始问题如下:
我在使用 ld 的-rpath
参数时遇到问题$ORIGIN
。
由于找不到完整的示例,我想我会尝试自己写一个,以便我和其他人以后可以使用它。一旦我得到它的工作,我会整理它。
我之前问过这个问题,但我认为我的帖子有点混乱。
示例项目构建了一个共享库和一个链接到该库的可执行文件。
它非常小(3 个文件,22 行,包括 buildscript)。
你可以从这里下载项目
文件结构(构建前):
project/
src/
foo.cpp
main.cpp
make.sh
project/src/foo.cpp
int foo()
{ return 3; }
project/src/main.cpp
int foo();
#include <iostream>
int main()
{
std::cout << foo() << std::endl;
return 0;
}
project/make.sh
# Make directories:
mkdir -p -v obj
mkdir -p -v lib
mkdir -p -v run
# Build the library:
g++ -c -o obj/foo.o src/foo.cpp -fPIC
g++ -shared -o lib/foo.sh obj/foo.o
# Build the executable:
g++ -c -o obj/main.o src/main.cpp
g++ -o run/main.run obj/main.o -Wl,-rpath,'$ORIGIN/../../lib' -Llib -l:foo.sh
从project
目录中运行make.sh
(确保它是可执行的)。
文件结构(构建后):
project/
src/
foo.cpp
main.cpp
obj/
foo.o
main.o
lib/
foo.so
run/
main.run
make.sh
run/main.run
现在应该从任何地方加载lib/foo.sh
执行。
问题
目前,这仅部分有效。
文件编译并链接正常,但是当从任何目录运行时链接失败project
(这是练习的重点)。
检查节目:
看起来很接近(我宁愿有main.run
,但我稍后会解决)。readelf -d
0x0000000000000001 (NEEDED) Shared library: [lib/foo.sh]
0x000000000000000f (RPATH) Library rpath: [$ORIGIN/../../lib]
[foo.sh]
[lib/foo.sh]
AFAICT $ORIGIN
in-Wl,-rpath,'$ORIGIN/../../lib'
意味着project/run/main.run
这个 rpath 应该变成project/lib
.
我试过$ORIGIN/..
,,,,无济于事$ORIGIN/../lib
。$ORIGIN/../..
$ORIGIN/../../lib
注意:我正在使用-l:
它需要完整的库文件名(除其他原因外,当所有函数采用相同的名称格式时,使用变量编写脚本更容易)。
有谁知道为什么这不起作用?
或者,是否有人拥有或知道一个完整的工作示例?