共享对象文件的rpath路径

11

可执行文件的rpath指定了一个或者多个目录,用于在运行时查找共享对象。

我的问题是:共享对象文件本身是否也具有静态编译的rpath

最近在链接共享对象时,我收到了一个运行时错误:

./example: /opt/swt/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by ./mylib.so)

这个错误告诉我实际上库本身 - mylib.so,有一个静态编译的rpath

我的理解是rpath只适用于可执行文件,而不适用于共享对象。所以rpath是否也适用于共享对象?

1个回答

11
“共享对象文件”本身是否也具有静态编译的“rpath”取决于它们是否使用了“-Wl,-rpath = ...”选项进行链接。
“这个错误提示让我认为实际库——mylib.so,具有静态编译的rpath。”这个错误信息并没有这样说。你是从哪里得到这个想法的?
如果你想知道mylib.so是否具有DT_RPATH,请执行以下操作:
readelf -d mylib.so | grep 'R.*PATH'  # could also have RUNPATH

我的理解是rpath只适用于可执行文件,而不适用于共享对象。那么rpath是否也适用于共享对象呢?
你的理解是错误的,RPATH(和RUNPATH)同样适用于共享对象。

假设程序 node 有自己的 DT_RUNPATH,那么当它使用 dlopen 打开一个具有自己的 DT_RUNPATH 的共享对象时,动态加载器是否会搜索两个 DT_RUNPATH?还是只考虑共享对象内部的 DT_RUNPATH?如果共享对象本身没有 DT_RUNPATH,会发生什么? - CMCDragonkai
@CMCDragonkai 请不要在评论中问额外的扩展问题 - 只需提出一个新问题即可。这是免费的。 - Employed Russian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接