更改共享库

更改共享库

假设我们有一个使用共享库的 C 程序。

如果您对共享库进行更改并重建它,则使用该库的所有程序将在下次运行时自动接收这些更改。对于静态库,只有在使用新版本的库重新编译程序后,更改才可见。

如果我们改变一些共享库函数的代码(不改变方法签名)、添加新函数等,函数的地址就会改变。

使用我们的共享库的程序如何在不重新编译和重新链接的情况下再次找到这些函数?如果他们的地址已经改变。

答案1

.so因为任何库都会保留其导出的函数及其位置的列表。

因此,从广义上讲,程序想要从共享库中获取一个函数,会发生一个多步骤的过程 - 读取导出名称列表,找到函数名称,获取它的地址,读取.so该地址处的文件。

如果您想自己找到这些地址,您可以从这里开始阅读:https://en.wikipedia.org/wiki/Executable_and_Linkable_Format

答案2

在共享库的头中有一个表,其中包含函数的名称和地址。因此,当主程序想要调用该函数时,它会查找该表并跳转到该地址(如果需要,可以使用适当的参数)

答案3

添加到现有答案:您的可执行文件使用动态加载器来查找共享库 .so 文件,执行其初始化函数,并获取以下表符号(即,函数名称/损坏的签名)包含函数地址。然后,每当您使用共享库中的函数时,它都会更改链接器步骤所使用的函数指针的值。

因此,技巧在于您的程序从未使用固定地址来使用这些函数 - 它有一个具有尚未定义地址的函数指针列表,并且动态链接器在运行时填充来自库本身的函数的实际地址。

相关内容