为啥是imp_xxxx

本文解释了从DLL导入函数时产生的imp_xxx符号的真实含义。它不是函数名的更改,而是指向函数地址的一个指针。文章进一步阐述了编译器与链接器在此过程中的作用及模块加载器的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前面写过碰到的链接问题[url]http://silconfuse.iteye.com/blog/491830[/url],当时写的应该是错误的,从dll中import的函数并不是改名为imp_xxx,这个imp_xxx是指向函数地址的地址。

比如从dll输入一个函数func,调用func时,那么生成的汇编应该是

DWROD __imp_func@4 = 0x12345678
call dword ptr[__imp_func@4]


编译器为什么要这样做,因为链接器在链接期间肯定不会知道func的地址,只能得到一个推测值。因此模块加载器经常需要找到一个引入函数的正确地址并修改模块映象。而且对func可能有多次的调用。由于性能原因,加载器将会倾向于修改最少量的位置,这就意味着每一个地址都对应着一个引入函数。这样的话就需要一个地址来存储引入函数的地址,通常这个地址有一个内部的名称形式,__imp__xxx。这个就是我上次链接时碰到的玩意。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值