标签: libraries

如何找出运行时加载的动态库可执行文件?

我想找出运行时二进制加载的动态库列表(及其完整路径)。我正在使用 CentOS 6.0。这该怎么做?

libraries executable dynamic-linking

125
推荐指数
4
解决办法
28万
查看次数

.a 和 .so 文件有什么区别?

据我了解它们是图书馆,但两者之间有什么区别?

libraries

79
推荐指数
2
解决办法
10万
查看次数

使用 /usr/local/lib 中的共享库

我已经从源代码构建了一些库,之后的文件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。

ubuntu libraries

79
推荐指数
2
解决办法
17万
查看次数

为什么共享库是可执行的?

为什么几乎所有共享库/usr/lib/都设置了可执行权限位?我没有看到任何执行它们的用例。有些确实设法连接某种形式的main功能来打印简短的版权和版本说明,但许多甚至不这样做并且在执行时出现段错误。

那么,设置这个有x什么意义呢?所有的库打包者都必须这样做吗?如果我dlopen()是一个有0644权限的共享库会发生什么?

libraries conventions

63
推荐指数
2
解决办法
2万
查看次数

查看 Linux 库/可执行版本信息

在 Windows 中,EXE 和 DLL 具有版本信息,至少包括以下字段:

  1. 文件版本
  2. 产品版本
  3. 内部名称
  4. 产品名称
  5. 版权

在 Linux 库/可执行文件中:

  • 存在哪些字段?
  • 如何查看此类信息?
  • What tools/libraries to read?

version libraries executable

56
推荐指数
4
解决办法
19万
查看次数

加载共享库和 RAM 使用

我想知道 Linux 管理共享库的方式。(实际上,我指的是 Maemo Fremantle,它是 2009 年发布的基于 Debian 的发行版,运行在 256MB RAM 上)。

假设我们有两个可执行文件链接到 libQtCore.so.4 并使用其符号(使用其类和函数)。为简单起见,我们称它们为ab。我们假设两个可执行文件都链接到相同的库。

首先我们启动a. 必须加载库。它是整体加载还是仅在需要的部分加载到内存中(因为我们不使用每个类,只加载有关所用类的代码)?

然后我们启动b. 我们假设它a仍在运行。b也链接到 libQtCore.so.4 并使用一些使用的类a,但也使用a. 库是否会被双重加载(分别为a和单独为b)?或者他们会使用 RAM 中已有的相同对象。如果不b使用新符号并且a已经在运行,共享库使用的 RAM 会增加吗?(或者差异会微不足道)

memory libraries executable ram

48
推荐指数
1
解决办法
3万
查看次数

lib、lib32、lib64、libx32 和 libexec 之间的区别

我的 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 位)?有人可以解释所有这些目录之间的区别吗?

libraries directory-structure

46
推荐指数
1
解决办法
5万
查看次数

什么是/lib64/ld-linux-x86-64.so.2,为什么可以用它来执行文件?

最近,我学到了一个技巧,如果文件缺少可执行权限,我们可以使用/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)

我真的不知道它是怎么做到的,这不是一个常规的东西,有点神秘。

linux libraries files

38
推荐指数
1
解决办法
5万
查看次数

当静态链接到 .a 文件时,C 编译器是否会丢弃未使用的函数?

假设我有一个静态main.c链接到libmine.a. 静态链接到库会导致库函数在编译时嵌入到主可执行文件中。

如果libmine.a要提供 未使用的函数main.c,编译器(例如 GCC)会丢弃这些函数吗?

这个问题的灵感来自于“常见消息传递”,即使用静态库会使可执行文件更大,所以我很好奇编译器是否至少从存档文件中删除未使用的代码。

compiling c compiler libraries static-linking

35
推荐指数
2
解决办法
9482
查看次数

更改给定可执行文件的链接库 (CentOs 6)

我有一个像这样链接的可执行文件:

  $ 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(因为构建工具非常复杂)
  • 改变任何全局设置(因为其他开发人员在这台机器上工作)

有可能在这里做我希望的事情吗?

libraries linker

33
推荐指数
2
解决办法
7万
查看次数