在strace输出中,可执行文件调用的库的路径在调用中open()。这是动态链接的可执行文件使用的系统调用吗?怎么样dlopen()?open()不是我猜想的调用会在程序执行中发挥作用。
我想导出LD_LIBRARY_PATH到系统服务和所有用户。系统服务在登录前运行,因此.bashrc不适用。
如何实现这一目标?
我已经知道的:
ELF 可执行文件有许多部分,显然 .text 和 .data 部分被加载到内存中,因为它们是程序的主要部分。但是要使程序正常工作,它需要更多信息,尤其是在动态链接时。
我感兴趣的是 .plt、.got、.dynamic、.dynsym、.dynstr 等部分。ELF 中负责将函数链接到地址的部分。
从我到目前为止已经能够弄清楚的是,像 .symtab 和 .strtab 这样的东西不会被加载(或不会留在)内存中。但是链接器使用 .dynsym 和 .dynstr 吗?他们留在记忆中吗?我可以从程序代码访问它们吗?
是否有驻留在内核内存中的可执行文件的任何部分?
我对此的兴趣主要是法医,但有关此主题的任何信息都会有所帮助。我读过的关于这些表和动态链接的资源更高级,它们只解释了工作原理,而不是关于内存中的内容的任何实用内容。
如果我的问题有任何不清楚的地方,请告诉我。
我的应用程序使用动态加载自定义代码dlopen。对于常用符号,默认使用全局符号表。
但是,我想提供以下功能 - 如果用户已将他们的 so 与 链接-Bsymbolic-functions,我会将RTLD_DEEPBIND标志传递给该dlopen函数。
有没有办法以编程方式知道 .so 是否与-Bsymbolic-functions使用 C链接?
我可以xserver-xorg-input-mouse即时重新加载驱动程序吗?例如,我修改并重新编译源之后
例如grep,如果一个程序当前正在运行,而用户执行另一个实例,那么这两个实例是否共享.text它们之间的只读部分以节省内存?主要可执行文本的共享是否与共享库类似?
这种行为是否在 Linux 中表现出来?如果是这样,其他Unices 也这样做吗?
如果这不是在 Linux 中完成的,那么实现通常作为共享库并行运行多个实例的可执行文件是否有任何好处,调用的可执行文件只需调用库中的主函数?
— 众所周知,如果编译时支持 x86_64 内核,则可以使用 x86_64 内核运行 x86_32 程序。但是动态链接器不提供任何方法来为 32 位程序定义一组单独的预加载库,因此每次运行这样的程序时,如果您使用 x86_64 预加载,您将面临以下错误消息:
ERROR: ld.so: object '… … …' from /etc/ld.so.preload cannot be preloaded (wrong ELF class: ELFCLASS64): ignored.
Run Code Online (Sandbox Code Playgroud)
如果您将相同的 x86_32-libraries 列表放在那里进行预加载,您将使其工作,但所有纯 x86_64 运行也会开始抱怨。
显然,最好的方法是修改动态加载器以支持从单独的文件进行预加载,但这至少是一个漫长的过程。你能想到一些干净的解决方法吗?...
现在我正在考虑一些multi-class-pre-load.so,它可以自己加载所需的文件,但是,正如我所看到的,ELF 中没有“多类”支持。
动态链接器可以通过运行一些动态链接程序或共享对象来间接运行(在这种情况下,不能将命令行选项传递给动态链接器,在 ELF 情况下,动态链接器存储在 .interp程序的一部分被执行)或直接通过运行:
/lib/ld-linux.so.* [选项] [程序 [参数]]
https://jlk.fjfi.cvut.cz/arch/manpages/man/core/man-pages/ld.so.8.en
类似的信息可以在Program Library HOWTO 中找到。
但是当我尝试时,
$ LD_DEBUG=libs /usr/lib/ld-linux.so.2 ls
23325: find library=ls [0]; searching
23325: search cache=/etc/ld.so.cache
23325:
ls: error while loading shared libraries: ls: cannot open shared object file
$ LD_DEBUG=libs ls
23503: find library=libcap.so.2 [0]; searching
23503: search cache=/etc/ld.so.cache
23503: trying file=/usr/lib/libcap.so.2
...
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?有没有办法ld-linux.so直接使用来运行程序?
在Linux中,可执行的ELF文件分别是什么
其中哪些被调用
execve()dlopen()?他们如何援引execve()或者dlopen(),解决了鸡-蛋的问题,execve()或dlopen()用于调用可执行文件?
谢谢。