- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这样的目录结构:符号链接(symbolic link)指向目录,符号链接(symbolic link)指向库:
$ libtrotl.so -> /usr/local/lib64/tora-3.1/../libtrotl.so
$ instantclient -> /usr/lib/oracle/12.1/client64/lib
当我 dlopen 库 libtrotl.so 时,所有依赖库都被解析并加载。感谢 RPATH。
$ readelf -d libtrotl.so
Dynamic section at offset 0x17e7a8 contains 31 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libclntsh.so.12.1]
0x0000000000000001 (NEEDED) Shared library: [libboost_system.so.1.60.0]
0x0000000000000001 (NEEDED) Shared library: [libstdc++.so.6]
0x0000000000000001 (NEEDED) Shared library: [libm.so.6]
0x0000000000000001 (NEEDED) Shared library: [libgcc_s.so.1]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000000e (SONAME) Library soname: [libtrotl.so]
0x000000000000000f (RPATH) Library rpath: [$ORIGIN/instantclient/]
0x000000000000000c (INIT) 0xe7898
$ ldd libtrotl.so
linux-vdso.so.1 (0x00007ffdc25d1000)
libclntsh.so.12.1 => /home/ivan/.TOra3/poracle/./instantclient/libclntsh.so.12.1 (0x00007f6cd0c37000)
libboost_system.so.1.60.0 => /lib64/libboost_system.so.1.60.0 (0x00007f6cd0a24000)
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f6cd069c000)
libm.so.6 => /lib64/libm.so.6 (0x00007f6cd0393000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f6cd017b000)
libc.so.6 => /lib64/libc.so.6 (0x00007f6ccfdb9000)
libmql1.so => /home/ivan/.TOra3/poracle/./instantclient/libmql1.so (0x00007f6ccfb43000)
libipc1.so => /home/ivan/.TOra3/poracle/./instantclient/libipc1.so (0x00007f6ccf7c4000)
libnnz12.so => /home/ivan/.TOra3/poracle/./instantclient/libnnz12.so (0x00007f6ccf0ba000)
我只是使用 -Wl,-rpath,"\$ORIGIN/instantclient/"
作为编译标志,它可以在任何地方工作 - 除了 Gentoo。
Gentoo 链接器(GNU gold (Gentoo 2.25.1 p1.1 2.25.1) 1.11)添加了 RUNPATH 来代替 RPATH。
0x000000000000001d (RUNPATH) Library runpath: [$ORIGIN/instantclient/]
然后动态链接器不会解析库。
(Gentoo)$ ldd libtrotl.so
linux-vdso.so.1 (0x00007ffe5c3e9000)
libclntsh.so.12.1 => /home/ivan/.TOra3/poracle/./instantclient/libclntsh.so.12.1 (0x00007f245dc9e000)
libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.9.4/libstdc++.so.6 (0x00007f245d933000)
libm.so.6 => /lib64/libm.so.6 (0x00007f245d62e000)
libgcc_s.so.1 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.9.4/libgcc_s.so.1 (0x00007f245d417000)
libc.so.6 => /lib64/libc.so.6 (0x00007f245d07d000)
libmql1.so => not found
libipc1.so => not found
libnnz12.so => not found
libons.so => not found
如您所见,在第二种情况下,虽然库 libmql1.so 存在于 instantclient 子目录中,但未找到该库。如何在 Gentoo 上设置 RPATH?
最佳答案
DT_RPATH
标签已弃用,DT_RUNPATH
是具有几种不同语义的现代实现。 Gentoo 链接编辑器(ld
和 gold
)默认情况下不会生成已弃用的标签。您可以(但可能不应该)通过传递 -Wl,--disable-new-dtags
来禁用这些功能,但正如我所说,不建议这样做。
Qt 中有一个旧锅解释了使用插件时这两者的区别:http://blog.qt.io/blog/2011/10/28/rpath-and-runpath/
关于c - 当使用 -Wl,-rpath 时,Gentoo ld 在库中生成 RUNPATH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42102348/
我有一个 Linux C++ 程序可以构建和链接(使用 -Wl,--no-undefined,同样如此)但是当我尝试运行它时无法加载它的所有库。我一直在尝试使用 ldd 检查它的依赖关系,但我无法弄清
我使用动态链接到另一个的 premake (gmake) 构建了一个二进制文件。当我随后尝试运行二进制文件时,它提示找不到动态库。 ldd在二进制文件上,当然还有动态库是 => Not Found!
我在我的环境中定制了 gcc-4.7.2。系统 gcc 是 gcc-4.3.4。 我已经使用 patchelf --set-rpath 为所有自定义 gcc 的二进制文件和共享库修补了 RUNPATH
This page说到 ld.so 中库搜索的顺序: Unless loading object has RUNPATH: RPATH of the loading object,
我最近在升级系统后遇到这个问题:使用 GCC -Wl,-rpath= 选项的工作方式与以前不同。 我用它来设置一些共享库的搜索路径,这些共享库是在我的项目的子模块中构建的。当时我认为它比在系统范围内设
我有一个 Linux 共享对象,它与一些共享对象动态链接,其中一些又进一步与其他共享对象动态链接,需要间接动态链接。为了找到那些 SO,我通过将链接器标志传递给 G++ 将 RPATH header
我有一个 Linux 共享对象,它与一些共享对象动态链接,其中一些又进一步与其他共享对象动态链接,需要间接动态链接。为了找到那些 SO,我通过将链接器标志传递给 G++ 将 RPATH header
我有这样的目录结构:符号链接(symbolic link)指向目录,符号链接(symbolic link)指向库: $ libtrotl.so -> /usr/local/lib64/tora-3.1
我是一名优秀的程序员,十分优秀!