标签: dynamic-loading

什么系统调用用于在 Linux 中加载库?

strace输出中,可执行文件调用的库的路径在调用中open()。这是动态链接的可执行文件使用的系统调用吗?怎么样dlopen()open()不是我猜想的调用会在程序执行中发挥作用。

dynamic-linking strace dynamic-loading shared-library

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

如何将 LD_LIBRARY_PATH 导出到所有用户和系统服务

我想导出LD_LIBRARY_PATH到系统服务和所有用户。系统服务在登录前运行,因此.bashrc不适用。

如何实现这一目标?

libraries path environment-variables dynamic-loading

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

ELF 共享库——PLT 的动机

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

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

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

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

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

libraries dynamic-linking dynamic-loading

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

ELF 可执行文件的哪些部分被加载到内存中,在哪里?

我已经知道的:

ELF 可执行文件有许多部分,显然 .text 和 .data 部分被加载到内存中,因为它们是程序的主要部分。但是要使程序正常工作,它需要更多信息,尤其是在动态链接时。

我感兴趣的是 .plt、.got、.dynamic、.dynsym、.dynstr 等部分。ELF 中负责将函数链接到地址的部分。

从我到目前为止已经能够弄清楚的是,像 .symtab 和 .strtab 这样的东西不会被加载(或不会留在)内存中。但是链接器使用 .dynsym 和 .dynstr 吗?他们留在记忆中吗?我可以从程序代码访问它们吗?

是否有驻留在内核内存中的可执行文件的任何部分?

我对此的兴趣主要是法医,但有关此主题的任何信息都会有所帮助。我读过的关于这些表和动态链接的资源更高级,它们只解释了工作原理,而不是关于内存中的内容的任何实用内容。

如果我的问题有任何不清楚的地方,请告诉我。

linux memory dynamic-linking elf dynamic-loading

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

有没有办法检查 .so 是否已使用 -Bsymbolic-functions 标志编译?

我的应用程序使用动态加载自定义代码dlopen。对于常用符号,默认使用全局符号表。

但是,我想提供以下功能 - 如果用户已将他们的 so 与 链接-Bsymbolic-functions,我会将RTLD_DEEPBIND标志传递给该dlopen函数。

有没有办法以编程方式知道 .so 是否与-Bsymbolic-functions使用 C链接?

linker dynamic-loading

7
推荐指数
1
解决办法
1587
查看次数

重新加载 xserver-xorg-input-mouse

我可以xserver-xorg-input-mouse即时重新加载驱动程序吗?例如,我修改并重新编译源之后

drivers xorg dynamic-loading

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

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

例如grep,如果一个程序当前正在运行,而用户执行另一个实例,那么这两个实例是否共享.text它们之间的只读部分以节省内存?主要可执行文本的共享是否与共享库类似?

这种行为是否在 Linux 中表现出来?如果是这样,其他Unices 也这样做吗?

如果这不是在 Linux 中完成的,那么实现通常作为共享库并行运行多个实例的可执行文件是否有任何好处,调用的可执行文件只需调用库中的主函数?

kernel executable elf virtual-memory dynamic-loading

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

ld.so.preload 与 x86_32 和 x86_64 没有区别

— 众所周知,如果编译时支持 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 中没有“多类”支持。

dynamic-linking elf x86 dynamic-loading

2
推荐指数
1
解决办法
4583
查看次数

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

动态链接器可以通过运行一些动态链接程序或共享对象来间接运行(在这种情况下,不能将命令行选项传递给动态链接器,在 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 libraries dynamic-linking dynamic-loading ld

2
推荐指数
1
解决办法
5927
查看次数

静态链接器、动态链接器、加载器和动态加载器的可执行 ELF 文件分别是什么?

在Linux中,可执行的ELF文件分别是什么

  • 静态链接器
  • 动态链接器
  • 装载机
  • 动态加载器?

其中哪些被调用

  • 经过 execve()
  • 通过dlopen()

他们如何援引execve()或者dlopen(),解决了鸡-蛋的问题,execve()dlopen()用于调用可执行文件?

谢谢。

linux linker load dynamic-linking dynamic-loading

2
推荐指数
1
解决办法
791
查看次数