dynamic-loading

使用LD_PRELOAD更改程序的openat打开的路径
dynamic-loading

使用LD_PRELOAD更改程序的openat打开的路径

我想更改程序在文件系统上实际打开的某些路径的路径。原因是我想并行运行一个程序,但该程序用作/tmp/somedir/其临时目录,并且并行实例遇到冲突。 我发现这个很好的答案可以做到这一点:是否可以伪造进程的特定路径?。可悲的是,虽然这适用于cat广告,但它不适用于我的程序。我认为原因是程序使用了C++ API。 为了重现,我首先制作了一个非常简单的程序,在文件中写入一些内容: #include <fstream> #include <string_view> #include <iostream> int main() ...

Admin

tcpdump 似乎没有调用任何 libpcap 的导出函数
dynamic-loading

tcpdump 似乎没有调用任何 libpcap 的导出函数

深入tcpdump研究实现,我可以看到它实际上libpcap.so在用户空间中加载动态库。 但是,通过使用strace,我看不到对 libpcap 导出的任何函数的任何调用。 以上是 tcpdump 的预期行为吗?谢谢。 root@eve-ng02:~# tcpdump --help tcpdump version 4.9.2 libpcap version 1.7.4 OpenSSL 1.0.2g 1 Mar 2016 编辑:根据我尝试过的收到的评论ltrace,但似乎也没有完成对动态库的调用。 root@eve-ng02:~# ltrace tcpd...

Admin

了解 LD_ASSUME_KERNEL 用法
dynamic-loading

了解 LD_ASSUME_KERNEL 用法

我试图理解LD_ASSUME_KERNEL我的系统(Debian/bullseye+bpo)上的 env 变量。 根据: $ man pthreads 我应该能够运行这样的东西,但是在我的系统上,我得到的是: % LD_ASSUME_KERNEL=2.2.5 ldd /bin/ls /bin/bash: error while loading shared libraries: libdl.so.2: cannot open shared object file: No such file or directory 这对于我来说有点太低了,无法理解发生了...

Admin

如何为分叉进程“提供”与其“要求”不同的动态库?
dynamic-loading

如何为分叉进程“提供”与其“要求”不同的动态库?

我想知道如何“给予”分叉进程一个与其“要求”不同的动态库。例如,如果分支“请求”库“foo.so”,则主进程“拦截”该库并提供“bar.so”。 考虑到我不太了解动态库是如何加载的,这很可能是不可能的。 ...

Admin

在大型应用程序中查找库冲突的最佳方法是什么?
dynamic-loading

在大型应用程序中查找库冲突的最佳方法是什么?

我有一个大型应用程序(我们称之为 P),有很多依赖项来 boost、Qt、zlib、libpng 等。最近,我向 P 添加了一个功能,需要动态加载新的共享对象(我们称之为lib1.so)。lib1.so依赖于 MATLAB api。因此,它将依赖于 P 已经依赖的许多库。 问题是,当我尝试在lib1.soP 内部动态加载(使用 Qt 5.12 的 QLibrary 类)时,加载失败。失败消息是找不到 Matlab 共享对象。但共享对象已经存在,并且其路径位于 LD_LIBRARY_PATH 内。 如果我尝试加载lib1.so一个简单的应用程序(具有相同的 L...

Admin

为什么内部符号的地址需要记录在.got中?
dynamic-loading

为什么内部符号的地址需要记录在.got中?

我正在读博客https://eli.thegreenplace.net/2011/11/11/position-independent-code-pic-in-shared-libraries-on-x64 在“带有数据引用的 x64 PIC - 示例”部分中,模块似乎告诉动态链接器将绝对地址填充到myglobinto .got,然后代码获取该地址并从该地址读取数据。 但是为什么编译器必须这样做,它是一个来自自身的符号,为什么不能只使用RIP相对寻址来访问这个符号呢?是否因为有时.data模块可能会加载到未知的偏移量.text(而不是始终加载到 旁边.t...

Admin

$LIB 变量在 Ubuntu Server 18.10 中不会扩展为任何内容
dynamic-loading

$LIB 变量在 Ubuntu Server 18.10 中不会扩展为任何内容

我有与此完全相同的问题问题之前发布的地方/etc/ld.so.preload没有拦截正确的架构。一点背景知识:我编译了一个共享对象(64 位),在ld.so.preload任何二进制执行的文件中都会引用该共享对象。问题是我ERROR: ld.so: object '/usr/local/lib/mysharedobject.so' from /etc/ld.so.preload cannot be preloaded (wrong ELF class: ELFCLASS64): ignored.在执行 32 位程序时遇到了 a 。 为了根据该问题的答案...

Admin

.text 部分是否在加载的 ELF 可执行文件之间共享?
dynamic-loading

.text 部分是否在加载的 ELF 可执行文件之间共享?

例如,如果一个程序grep当前正在运行,并且用户执行另一个实例,那么这两个实例是否共享只读.text部分以节省内存?主要可执行文本共享的共享是否与共享库类似? Linux 中是否存在这种行为?如果是这样,其他 Unices 也这样做吗? 如果在 Linux 中没有这样做,那么实现通常作为共享库并行运行多个实例的可执行文件是否会带来任何好处,而被调用的可执行文件只需调用库中的主函数? ...

Admin

哪些类型的文件可以动态加载?
dynamic-loading

哪些类型的文件可以动态加载?

操作系统概念,作者:Silberschatz A.、Galvin PB、Gagne G. - 操作系统概念,第 9 版 - 2012 年说 8.1.4 动态加载 在我们到目前为止的讨论中,进程的整个程序和所有数据都必须位于物理内存中才能执行。因此,进程的大小受到物理内存大小的限制。为了获得更好的内存空间利用率,我们可以使用动态加载。通过动态加载,例程在被调用之前不会被加载。 所有例程都以可重定位加载格式保存在磁盘上。主程序被加载到内存中并被执行。当一个例程需要调用另一个例程时,调用例程首先检查另一个例程是否已加载。如果没有,则调用可重定位链...

Admin

Linux内核如何动态使用模块?
dynamic-loading

Linux内核如何动态使用模块?

了解 Linux 内核 说 内核在管理模块时需要执行两个关键任务。第一个任务是确保内核的其余部分可以到达模块的全局符号,例如其主函数的入口点。模块还必须知道内核和其他模块中符号的地址。因此,当链接模块时,引用将被一次性解析。第二个任务包括跟踪模块的使用情况,以便在另一个模块或内核的其他部分正在使用它时不会卸载任何模块。一个简单的引用计数可以跟踪每个模块的使用情况。 任何共享库都可以动态链接(使用LD_LIBRARY_PATH)和动态加载(通过dlopen()、dlsym()和dlclose()),这是否正确? 模块是 Linux 内核的共享库吗...

Admin

如何使用ld-linux.so运行程序?
dynamic-loading

如何使用ld-linux.so运行程序?

动态链接器可以运行通过运行某些动态链接程序或共享对象来间接进行(在这种情况下,不能向动态链接器传递任何命令行选项,并且在 ELF 情况下,将执行存储在程序的 .interp 部分中的动态链接器) 或者直接运行: /lib/ld-linux.so.* [选项] [程序 [参数]] https://jlk.fjfi.cvut.cz/arch/manpages/man/core/man-pages/ld.so.8.en 类似的信息可以在程序库指南。 但当我尝试时, $ LD_DEBUG=libs /usr/lib/ld-linux.so....

Admin

当网络中断发生时,挂载的 NFS 目录上的二进制文件的执行是否会失败?
dynamic-loading

当网络中断发生时,挂载的 NFS 目录上的二进制文件的执行是否会失败?

所以我有一台 Linux 机器作为 NFS 服务器。许多程序已安装到正在导出的文件夹中。 在另一台 Linux 机器上,我已经运行了位于导出的 NFS 文件夹中的一个程序很长一段时间,并且它不会很快完成。 原来现在我需要对网络做一些紧急的维护工作,所以网络会宕机一段时间。 我想知道正在运行的程序会发生什么? 我的理解是程序以惰性方式加载到RAM中。因此,在最好的情况下,假设程序正在执行一些属于循环一部分的代码,这些代码已经加载到 RAM 中,那么在网络中断期间,它根本不需要访问可执行文件,并且程序会继续正常执行,就像什么都没发生一样,对吗? 但是,...

Admin

列出 FreeBSD 上进程加载的库
dynamic-loading

列出 FreeBSD 上进程加载的库

如何列出 FreeBSD 中进程的所有已加载库?在Linux上我可以使用/proc cat /proc/$pid/maps 在 Solaris 上有pldd pldd $pid 对于 FreeBSD/proc也适用: cat /proc/$pid/map 但是,/proc默认情况下未安装。由于这是在客户系统上的自动检测工具中使用的,因此我正在寻找开箱即用的东西(工具或文件)。我假设必须有一个额外的接口来处理 FreeBSD 上的数据,因为top即使没有安装/proc. ...

Admin

指定本地libc会调用全局libc吗?
dynamic-loading

指定本地libc会调用全局libc吗?

如果我运行命令 foo 并指定要使用的不同 libc,如下所示: LD_LIBRARY_PATH=$PATH_TO_MY_CUSTOM_LIBC foo 全局定义的 libc 是否用于运行上面给出的任何命令? 为了上下文:考虑这样一种情况:您的 libc 在您的计算机上物理存在且可访问,但由于某种原因无法使用。给定登录的 shell,为了执行特定命令,您需要提供不同的 libc。 指定LD_LIBRARY_PATH内联,会将其设置为工作 libc 的位置,而无需调用全局定义的 libc。 为了在本地定义新的环境变量,全局定义的 libc 是否...

Admin