加载SO库,Linux可以为我做什么?

时间:2015-04-12 18:37:18

标签: c linux shared-libraries

我为ELF64程序编写了一个加载器。我现在有一个问题,我想导出和链接现有的内存中的库。

还有其他与此相关的问题。首先,这就是我所知道的。

so库只是位置无关代码,它的编译方式可以放在任何地方并运行。它导出了几个符号,从现在开始,我有一个真正的问题需要理解。

由于在Linux中启动可执行文件将发出一个加载序列,即在应用程序启动之前加载任何所需的共享库并链接外部符号。

以下是问题:

  1. 尽管有多少程序请求该库,但是这样的库只被加载一次。
  2. 是否有一种机制(linux函数)我可以调用在运行时加载一个so库而不是加载器。
  3. 是否可以选择符号(地址)来调用方法并重新定位和绑定已加载库的系统调用。什么是API使用。 我可以私下加载一个库吗?它会导致冲突吗?是否存在实际完成的情况?

1 个答案:

答案 0 :(得分:2)

  

这样的库是否只加载一次,尽管有多少   程序要求该库。

.text部分只需要加载一次,因为它在进程之间共享。 .data.bss部分对每个流程都是私有的,因此必须从SO中为每个流程重新加载动态链接到SO的流程。

  

是否有一种机制(linux函数)我可以调用加载一个so库   在运行时而不是由加载器。

dlopen()功能及相关功能。 http://linux.die.net/man/3/dlopen

  

是否可以选择符号(地址)来调用方法和   重定位并绑定已加载库的系统调用。什么是   要使用的API。我可以私下加载一个库吗?会结果吗?   陷入冲突?是否存在实际完成此操作的情况?

我不确定“系统调用”是什么意思,因为它们被称为操作系统,它不是共享对象(实际上它是共享的,但不是那种方式)。要在加载的共享对象中获取符号地址和调用函数,可以使用dlopen()所属的动态链接加载器公开的API。