标签: libraries

有没有办法确定应该加载哪些包或库来支持可执行文件?

我想在计算机上安装一个无法重新编译的可执行文件,它不是作为包构建的,我想下载运行它们所需的库。

以下是ldd在其上运行的输出的一部分

libpango-1.0.so.0 => /usr/lib/i386-linux-gnu/libpango-1.0.so.0 (0xb702f000)
libcairo.so.2 => /usr/lib/i386-linux-gnu/libcairo.so.2 (0xb6f64000)
libatk-1.0.so.0 => /usr/lib/i386-linux-gnu/libatk-1.0.so.0 (0xb6f43000)
libsqlite3.so.0 => /usr/lib/i386-linux-gnu/libsqlite3.so.0 (0xb6e9e000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb6cf4000)
/lib/ld-linux.so.2 (0xb786e000)
libxcb.so.1 => /usr/lib/i386-linux-gnu/libxcb.so.1 (0xb6cd3000)
libgio-2.0.so.0 => /usr/lib/i386-linux-gnu/libgio-2.0.so.0 (0xb6b7c000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb6b4f000)
Run Code Online (Sandbox Code Playgroud)

是否有工具可以使用此信息来选择应下载哪些包,或者更好地仅提取列出的库及其依赖项,以最大限度地减少磁盘使用量?系统在无头 VM 上运行,程序将通过 VNC 显示。

虽然我怀疑一个完整的图形桌面将提供大部分所需的库,但我只想下载所需的库、它们的依赖项以及刚好足以支持它的 X Windows 包。

libraries dependencies package-management

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

ldconfig 和 ld.so.cache 的关系

重启电脑后,里面ld.so.cache还有信息,所以我的问题如下:

  1. 信息总是保存在那里吗?它不是在重新启动后被删除之类的吗?像 RAM 或浏览器缓存被删除?

  2. 在我删除安装了一些共享库的应用程序后,它是否知道也从ld.so.cache? 如果我使用ldconfig它会删除信息吗?它实际上是如何工作的?

  3. 如果我正在安装程序,我的计算机如何知道使用已添加的新库?之后apt-get installldconfig运行?

linux libraries shared-library

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

LD_LIBRARY_PATH 的默认值是多少?

在我的情况下,似乎LD_LIBRARY_PATH设置为空字符串。但是所有标准系统工具仍然可以正常工作,所以我猜动态链接器会检查这种情况并LD_LIBRARY_PATH在这种情况下使用一些默认值。

这个默认值是多少?我想它至少包括/usr/lib但还有什么?有没有什么好的系统方法来确定动态链接器将搜索的标准位置?

这个问题与动态链接器将搜索的路径略有不同。 有一个默认值意味着它会使用LD_LIBRARY_PATH如果给定的值,或者如果没有给定,它将使用默认值 - 这意味着它不会使用如果LD_LIBRARY_PATH提供了默认值。

defaults libraries path ld

13
推荐指数
1
解决办法
4万
查看次数

使用 ldconfig 和 ld.so.conf 与 LD_LIBRARY_PATH

我经常从源代码构建各种库以供使用,例如 gmp-6.1.2、mpfr-4.0.1 和 gcc-7.x。这样做时,我更喜欢使用,--prefix=/usr/local/gcc-7.2.0所以我确切地知道它的安装位置并且不会弄乱现有的库。然后我基本上只知道最后make install告诉我的是更新或设置LD_LIBRARY_PATH,有时但不总是LD_RUN_PATH

大多数情况下,我只是LD_LIBRARY_PATH稍后根据需要手动设置,或者以类似的方式全局设置它/etc/bash.bashrc.local并且有效。

make install就是说:

Libraries have been installed in:
  /usr/local/mfprtest/lib

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the '-LLIBDIR'
flag during linking and do at least one of the following:
  - add LIBDIR to the 'LD_LIBRARY_PATH' environment variable …
Run Code Online (Sandbox Code Playgroud)

libraries gcc ldconfig ld.so.conf

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

系统调用和库函数的区别

我已经完成了这个问题的答案,但不太明白系统调用和库函数之间的区别。从概念上讲,两者有什么区别?

libraries system-calls architecture

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

vdso 共享库 (linux-vdso.so) 是包含内核对象代码(系统调用)的库吗?

我注意到我编译为 gcc 的所有程序都链接到 vdso 库。这是包含对内核的系统调用的库,例如 mmap() 和 fork() 以及其他系统调用吗?

我知道系统调用不是 GNU C 标准库的函数,所以它们的目标代码必须在编译时与应用程序链接的某个库中?

那么 vdso 是那个库吗?

kernel libraries system-calls dynamic-linking shared-library

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

在本地安装开发文件以在没有 root 访问权限的系统上构建?

我正在使用一台服务器,运行旧版本的 Linux。我没有系统的 root 访问权限,所以我想构建一个我经常使用的工具的更新版本(Vim 7.3)。我想我会构建它并将其安装在 ~/bin 中。但是,它需要未在系统范围内安装的 ncurses 开发文件。我找到了 ncurses-devel rpm,并提取了“lib”和“include”文件夹,我将它们放在哪里以及如何告诉 ./configure 脚本找到它们,以便我可以在本地正确配置和构建包?

编辑:我最终通过在 Virtualbox 中安装相同的操作系统来解决这个问题,并在那里构建包并复制二进制文件。

libraries centos

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

/usr/bin/ld: 找不到 -lfl

运行以下命令后:

g++ lex.yy.c -lfl

我收到以下错误:

/usr/bin/ld: cannot find -lfl

我该如何解决?

libraries gcc

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

ELF 共享库——PLT 的动机

是否可以使用自修改代码来加速动态链接库中的函数调用?

据我了解,ELF 共享库使用一种间接跳转表(过程链接表,或 PLT)来实现库函数的延迟绑定。目的似乎是避免在代码段中修改表,同时在第一次调用时仍然启用函数位置的延迟解析。

在加载时或者甚至在第一次函数调用时为该表动态创建代码不是更快吗?

是否尽可能地在进程之间共享代码段(动态表对进程来说是私有的)?是否出于安全原因(可写代码不应该是可执行的- 但 JIT 一直都在这样做,并且在实际启动程序之前,加载程序可以添加和删除写入权限)?

或者它是这些的组合,并且每个函数调用的小性能增益不值得付出努力?

libraries dynamic-linking dynamic-loading

11
推荐指数
1
解决办法
1346
查看次数

可执行文件到另一台 Linux 机器的可移植性

我已经在一台 Linux 机器 (M1) 上安装了程序 Motion,并希望在另一台 (M2) 上安装相同的程序。

这个程序有多种版本,我忘记了我用过哪个版本,所以我可以直接从 M1 复制 user/bin/motion 文件并将其放在 M2 的 user/bin/motion 中吗?

我知道配置文件在哪里,所以我会移动它,但我不确定运动的工作版本在 M2 上使用什么视频驱动程序;有什么办法可以查到吗?

有没有办法找出它的依赖关系?

libraries dependencies executable portability

11
推荐指数
1
解决办法
4970
查看次数