在动态链接中,.exe如何知道在更新库时在哪里搜索库?
In dynamic linking, how does the .exe know where to search for the library when it is updated?
我的理解是,当C程序使用动态链接时,程序的编译版本(.exe(将库的内存地址存储在某个地方。当程序安装在别人的计算机上时,库的位置不是不同吗?或者,当您更新库时,它的内存地址不会有所不同吗?
C 和 C++ 都没有指定它是如何工作的。 对于不同的操作系统和 exe 格式,这是不同的。 要了解细节,您需要研究您的实现是如何做事的。
对您的问题的简短回答是操作系统设置程序运行的环境。 它必须将程序附加到正确的位置,或者至少通知它。 通常,您启动程序,格式告诉操作系统它应该加载哪些库,然后以某种方式链接地址。
通常也有一种方法可以手动执行此操作,并直接请求在运行时加载库。 在这些情况下,可能不会发生呼叫的自动链接。
是的,库的位置在不同的计算机上是不同的。是的,当您更新库时,它的内存地址是不同的。这就是为什么动态链接函数的地址不能在可执行文件中硬连线的原因。相反,只有其名称和托管库的名称(没有路径规范(以 PE 格式存储。
在程序启动之前.exe,操作系统加载程序查找所需的DLL,将其加载到启动程序的虚拟内存空间,从此DLL中查找所需函数的当前地址,并将其写入导入的地址表(IAT(。
当你的程序调用某个动态链接的函数时,它实际上在 IAT 中对其地址进行间接调用。
相关文章:
- C++我需要了解在哪里使用指针和双指针
- 未定义的引用在哪里
- 谷歌测试中的期望值存储在哪里
- 尽管遵循了规则,内存泄漏在哪里
- 静态数据成员模板专用化的实例化点在哪里
- 在哪里放置我的函数?进入我的母语 Gui 还是进入我的演示者?
- 在哪里声明结构运算符重载
- C++ 中的自定义异常:在哪里定义它们?
- 常量参数存储在哪里 (C++)?
- 如何在 c++ 中确定一条指令(以字节为单位)在哪里结束,另一条指令从哪里开始?
- 此递归函数的每次迭代的值存储在哪里?
- 如何告诉本机节点模块所需的dll存储在哪里?
- 在哪里存储跨平台C++应用存储?
- 在动态链接中,.exe如何知道在更新库时在哪里搜索库?
- 我在哪里可以从C 中的单链接列表中创建此函数到搜索元素时犯了错误
- 告诉Qt Creator在哪里搜索自动完成的头文件
- Visual Studio的编译器在哪里搜索 #includes?
- 在哪里实现堆栈类(在非递归二进制搜索函数中使用)
- 二进制搜索插入字符串.虫子在哪里?
- 如何告诉g++编译器在哪里搜索包含文件