我想找出运行时二进制加载的动态库列表(及其完整路径)。我正在使用 CentOS 6.0。这该怎么做?
我已经从源代码构建了一些库,之后的文件make install在/usr/local/lib
例如,在我的情况下,我有libodb-2.2.so这个目录中的文件。
但是,当我启动与 链接的可执行文件时,libodb出现错误:加载共享库时出错:libodb-2.2.so: cannont open shared object file: No such file or directory.
这是否意味着我没有正确构建我的可执行文件?或者我应该向系统表明文件夹中可能还有一些有趣的库/usr/local/lib?
我使用的是 Ubuntu 12.04,Linux 内核 3.2.0-38-generic。
为什么几乎所有共享库/usr/lib/都设置了可执行权限位?我没有看到任何执行它们的用例。有些确实设法连接某种形式的main功能来打印简短的版权和版本说明,但许多甚至不这样做并且在执行时出现段错误。
那么,设置这个有x什么意义呢?所有的库打包者都必须这样做吗?如果我dlopen()是一个有0644权限的共享库会发生什么?
在 Windows 中,EXE 和 DLL 具有版本信息,至少包括以下字段:
在 Linux 库/可执行文件中:
我想知道 Linux 管理共享库的方式。(实际上,我指的是 Maemo Fremantle,它是 2009 年发布的基于 Debian 的发行版,运行在 256MB RAM 上)。
假设我们有两个可执行文件链接到 libQtCore.so.4 并使用其符号(使用其类和函数)。为简单起见,我们称它们为a和b。我们假设两个可执行文件都链接到相同的库。
首先我们启动a. 必须加载库。它是整体加载还是仅在需要的部分加载到内存中(因为我们不使用每个类,只加载有关所用类的代码)?
然后我们启动b. 我们假设它a仍在运行。b也链接到 libQtCore.so.4 并使用一些使用的类a,但也使用a. 库是否会被双重加载(分别为a和单独为b)?或者他们会使用 RAM 中已有的相同对象。如果不b使用新符号并且a已经在运行,共享库使用的 RAM 会增加吗?(或者差异会微不足道)
我的 64 位 Ubuntu 13.04 系统在以下目录中有以下目录/:
lib
lib32
lib64
libx32
libexec
Run Code Online (Sandbox Code Playgroud)
在/usr目录中有:
lib
lib32
libx32
libexec
Run Code Online (Sandbox Code Playgroud)
这似乎可以通过搜索轻松回答,但我在网上找不到任何东西,除了这些目录存储共享库(libexec 除外)。但是哪些共享库放在哪些文件夹中(除了 lib32 中的 32 位和 lib64 中的 64 位)?有人可以解释所有这些目录之间的区别吗?
最近,我学到了一个技巧,如果文件缺少可执行权限,我们可以使用/lib64/ld-linux-x86-64.so.2.
例如,恢复 x 权限
-rw-r--r-- 1 root root 59K Mar  1  2017 /bin/chmod
Run Code Online (Sandbox Code Playgroud)
我们可以跑
/lib64/ld-linux-x86-64.so.2 /bin/chmod +x /bin/chmod
Run Code Online (Sandbox Code Playgroud)
我真的不知道它是怎么做到的,这不是一个常规的东西,有点神秘。
假设我有一个静态main.c链接到libmine.a. 静态链接到库会导致库函数在编译时嵌入到主可执行文件中。
如果libmine.a要提供 未使用的函数main.c,编译器(例如 GCC)会丢弃这些函数吗?
这个问题的灵感来自于“常见消息传递”,即使用静态库会使可执行文件更大,所以我很好奇编译器是否至少从存档文件中删除未使用的代码。
我有一个像这样链接的可执行文件:
  $ ldd a.out
        libboost_system-mt.so.1.47.0 => /usr/lib64/libboost_system-mt.so.1.47.0 (0x00007f4881f56000)
        libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f4881cfb000)
        libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007f4881965000)
        librt.so.1 => /lib64/librt.so.1 (0x00007f488175d000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f4881540000)
        libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f4881239000)
.
.
Run Code Online (Sandbox Code Playgroud)
其中 libcrypto 和 libssl 库是 openssl 1.0.0-fips 库。我想尝试使用 1.0.1 库,因此我将它们构建在我的主目录中。有没有办法在a.out没有很多痛苦的情况下重新链接我的新 openssl 库?我想避免
a.out(因为构建工具非常复杂)有可能在这里做我希望的事情吗?