我为ELF64程序编写了一个加载器。我现在有一个问题,我想导出和链接现有的内存中的库。
还有其他与此相关的问题。首先,这就是我所知道的。
so库只是位置无关代码,它的编译方式可以放在任何地方并运行。它导出了几个符号,从现在开始,我有一个真正的问题需要理解。
由于在Linux中启动可执行文件将发出一个加载序列,即在应用程序启动之前加载任何所需的共享库并链接外部符号。
以下是问题:
答案 0 :(得分:2)
这样的库是否只加载一次,尽管有多少 程序要求该库。
.text
部分只需要加载一次,因为它在进程之间共享。 .data
和.bss
部分对每个流程都是私有的,因此必须从SO中为每个流程重新加载动态链接到SO的流程。
是否有一种机制(linux函数)我可以调用加载一个so库 在运行时而不是由加载器。
dlopen()
功能及相关功能。 http://linux.die.net/man/3/dlopen
是否可以选择符号(地址)来调用方法和 重定位并绑定已加载库的系统调用。什么是 要使用的API。我可以私下加载一个库吗?会结果吗? 陷入冲突?是否存在实际完成此操作的情况?
我不确定“系统调用”是什么意思,因为它们被称为操作系统,它不是共享对象(实际上它是共享的,但不是那种方式)。要在加载的共享对象中获取符号地址和调用函数,可以使用dlopen()
所属的动态链接加载器公开的API。