【问题标题】:No embedded path for shared library when linking with an absolute path使用绝对路径链接时,共享库没有嵌入路径
【发布时间】:2021-12-14 20:23:09
【问题描述】:

我的开发环境包含许多共享库的副本。出于开发目的,我想将共享库的绝对或相对路径传递给 GCC;所以我没有很多 -L 条目,因此很容易选择错误的版本。

例如,gcc -o foobar foo.cpp /dependencies/fred/libbar.so

但是,我不希望将路径 /dependencies 用作要放置在可执行文件中的共享库的查找位置。是否有一个选项使上面的命令等效于以下命令?

gcc -o foobar foo.cpp -L /dependencies/fred -l bar

我正在寻找与-rpath相反的东西,其中包括路径。

【问题讨论】:

    标签: c++ linux gcc linker


    【解决方案1】:

    是否有一个选项,所以上面的命令相当于

    是的:链接libbar.so时,你应该设置它的SONAME

    gcc -fPIC -shared -o libbar.so bar.o -Wl,--soname=libbar.so
    

    完成此操作后,gcc -o foobar foo.cpp /dependencies/fred/libbar.so 将记录 SONAME 而不是可执行文件中的绝对路径,您将获得所需的行为。

    您可以通过以下方式检查“可执行文件中记录的内容”: readelf -d foobar | grep NEEDED.

    【讨论】:

    • 很遗憾我无法建立图书馆,它是第 3 方。
    • @Marc 在这种情况下,您没有其他选择——您必须使用-L/path -lbar 版本。
    • @Marc Correction: patchelf 修复链接后的东西也可以。
    【解决方案2】:

    一种解决方法是使用patchelf

    使用查找路径

    readelf -d foobar
    

    用 patchelf 替换它们

    patchelf --replace-needed /dependencies/fred/libbar.so libbar.so foobar
    

    然后使用

    readelf -d foobar
    

    确认路径已被替换。

    【讨论】:

      猜你喜欢
      • 2018-11-06
      • 1970-01-01
      • 2018-04-07
      • 1970-01-01
      • 2011-04-28
      • 2015-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多