我有一个librandom.so
库和一个main
可执行文件,编译方式如下:
$ clang++ -o main main.o -lrandom -L. -Wl,-rpath,"\$ORIGIN"
它们都在同一个目录中。由于main
在其rpath
中有$ORIGIN
,因此它可以正常工作-./main
没有错误。
现在,我将main
设置为使用setuid
运行为root
:
$ sudo chown root main
$ sudo chmod a+s main
$ ./main
我本来预料main
会失败,因为在setuid
应用程序中没有扩展$ORIGIN
。但令人惊讶的是,它起作用了。
然而,如果我从另一个目录运行main
,则它会如预期地失败:
$ cd /tmp
$ /path/to/main
/path/to/main: error while loading shared libraries: librandom.so: cannot open shared object file: No such file or directory
为什么我在所在目录运行main
时它可以工作?
$ORIGIN
是相对于可执行文件的位置,而不是当前工作目录。 - Amir Rachum$ORIGIN
扩展为空字符串(例如在此评论中描述)。动态链接器将把这个视为CWD,这可以解释这种行为。你可能会想要向开发人员报告此问题,但我怀疑他们会感兴趣。 - yugr