前面写过碰到的链接问题[url]http://silconfuse.iteye.com/blog/491830[/url],当时写的应该是错误的,从dll中import的函数并不是改名为imp_xxx,这个imp_xxx是指向函数地址的地址。
比如从dll输入一个函数func,调用func时,那么生成的汇编应该是
编译器为什么要这样做,因为链接器在链接期间肯定不会知道func的地址,只能得到一个推测值。因此模块加载器经常需要找到一个引入函数的正确地址并修改模块映象。而且对func可能有多次的调用。由于性能原因,加载器将会倾向于修改最少量的位置,这就意味着每一个地址都对应着一个引入函数。这样的话就需要一个地址来存储引入函数的地址,通常这个地址有一个内部的名称形式,__imp__xxx。这个就是我上次链接时碰到的玩意。
比如从dll输入一个函数func,调用func时,那么生成的汇编应该是
DWROD __imp_func@4 = 0x12345678
call dword ptr[__imp_func@4]
编译器为什么要这样做,因为链接器在链接期间肯定不会知道func的地址,只能得到一个推测值。因此模块加载器经常需要找到一个引入函数的正确地址并修改模块映象。而且对func可能有多次的调用。由于性能原因,加载器将会倾向于修改最少量的位置,这就意味着每一个地址都对应着一个引入函数。这样的话就需要一个地址来存储引入函数的地址,通常这个地址有一个内部的名称形式,__imp__xxx。这个就是我上次链接时碰到的玩意。
本文解释了从DLL导入函数时产生的imp_xxx符号的真实含义。它不是函数名的更改,而是指向函数地址的一个指针。文章进一步阐述了编译器与链接器在此过程中的作用及模块加载器的工作原理。
2619

被折叠的 条评论
为什么被折叠?



