动态linkers/loaders如何解析符号?
How do dynamic linkers/loaders resolve symbols?
我是一名 CS 学生,我正在做一个关于共享库和动态的项目 linking/loading。我必须回答的问题之一是如何使用动态 linking/loading 解析符号。我已经搜索了互联网,但未能找到任何结论。我了解不同的链接器可能会在不同的操作系统中以不同的方式解析符号。我只是在寻找一个一般的、基于 windows 的答案;动态链接中的符号是如何解析的?
谢谢!
好吧,让我们坚持Windows。我会用几句话回答,然后投票赞成将这个问题移到 CS 站点而不是主要 SO。
首先,动态链接可以在程序启动时(预链接变体)和程序代码明确请求某些库加载时进行。虽然那里使用相同的 DLL,但细节有所不同。
Prelinked 变体将与所谓的导入库一起工作,它是静态的但包含特殊的 thunk(又名蹦床),当动态加载程序附加真实库(DLL 文件)时,这些 thunk 被替换为跳转到真实代码。对于不了解动态加载的链接器,导入库足以提供动态链接——就像它在 DOS/Windows 中出现的那样。如果代码由静态库或动态库提供,调用代码可能会忽略细节。
即时加载是使用 LoadLibrary 等方法来加载库(并激活它)和 GetProcAddress 来获取实际函数实现的指针。在这种情况下,应用程序(或其他库)知道此机制的详细信息。
我希望这篇简报足以为您提供足够的文字来进一步钻研。
我是一名 CS 学生,我正在做一个关于共享库和动态的项目 linking/loading。我必须回答的问题之一是如何使用动态 linking/loading 解析符号。我已经搜索了互联网,但未能找到任何结论。我了解不同的链接器可能会在不同的操作系统中以不同的方式解析符号。我只是在寻找一个一般的、基于 windows 的答案;动态链接中的符号是如何解析的?
谢谢!
好吧,让我们坚持Windows。我会用几句话回答,然后投票赞成将这个问题移到 CS 站点而不是主要 SO。
首先,动态链接可以在程序启动时(预链接变体)和程序代码明确请求某些库加载时进行。虽然那里使用相同的 DLL,但细节有所不同。
Prelinked 变体将与所谓的导入库一起工作,它是静态的但包含特殊的 thunk(又名蹦床),当动态加载程序附加真实库(DLL 文件)时,这些 thunk 被替换为跳转到真实代码。对于不了解动态加载的链接器,导入库足以提供动态链接——就像它在 DOS/Windows 中出现的那样。如果代码由静态库或动态库提供,调用代码可能会忽略细节。
即时加载是使用 LoadLibrary 等方法来加载库(并激活它)和 GetProcAddress 来获取实际函数实现的指针。在这种情况下,应用程序(或其他库)知道此机制的详细信息。
我希望这篇简报足以为您提供足够的文字来进一步钻研。