使用-rpath和$ ORIGIN进行链接时查找失败

时间:2011-06-09 04:45:56

标签: gcc linker shared rpath

我正在尝试学习如何使用-rpath在GCC的链接器(ld)中使用$ORIGIN选项。

我正在尝试我能想到的最简单的例子(见下文),我读到的所有链接似乎都说我正确地做了。

但是,当我运行可执行文件时,它找不到共享对象,除非我从$ORIGIN内运行它。

在可执行文件(main.run)上使用readelf -d显示:


0x0000000000000001 (NEEDED) Shared library: [lib/foo.so]
...
0x000000000000000f (RPATH) Library rpath: [$ORIGIN]
...

文件结构(相关文件)是:

  • /make/test/dll_test/
    • main.run
    • lib/
      • foo.so

从dll_test内执行工作正常。 从其他地方执行(/ make / test)会产生错误:

  

dll_test / main.run:加载时出错   共享库:lib / foo.so:不能   打开共享对象文件:没有这样的文件   或目录

我使用-l:foo.so代替-lfoo,但这不会影响任何事情(我希望)。



来源文件

dll_test/src/foo.cpp


int foo()
    { return 1; }

dll_test/src/main.cpp


int foo();

#include <iostream>


int main()
  {
    std::cout << foo() << std::endl;
  }


BUILD SCRIPT

dll_test/make.sh


mkdir -p -v obj
mkdir -p -v lib

g++ -c -o obj/foo.o src/foo.cpp -fPIC
g++ -shared -o lib/foo.so obj/foo.o

g++ -c -o obj/main.o src/main.cpp
g++ -o main.run obj/main.o -Wl,-rpath,'$ORIGIN' -Llib -l:foo.so



要构建,在各自的位置创建这些文件,只需从dll_test(或项目根目录的任何位置)运行“sh make.sh”。 它应该生成“dll_test / main.run”。

从dll_test中运行“main.run”应该有效(打印1) 从dll_test中运行“main.run”失败。为什么?

另外,foo.so的路径存储在main.run中,作为[lib / foo.so]。我能把它变成[foo.so]所以我可以使用-Wl,-rpath,'$ ORIGIN / lib'吗?

1 个答案:

答案 0 :(得分:0)

您需要-Wl,-rpath,'$ORIGIN/lib'而非'$ORIGIN'

编辑:您实际上是在输入-l:foo.so吗?这看起来很奇怪......你应该和-Wl,-rpath,'$ORIGIN/lib' -Llib -lfoo.so一样好。如果这不起作用,请将-Wl,-soname,libfoo.so添加到共享库的链接器命令中。我不肯定这将解决“lib / foo.so”问题,但它值得一试:)