当您转储库的外部符号时,您可能会发现同一个函数名称有多个版本;例如来自C库的printf
函数的情况,您将找到类似
__imp__printf
_printf
___imp___printf_l
为什么只有一个版本的函数?
当我试图查看它们所属的库中的哪个OBJ成员时,我发现它们都属于同一个只有一个版本_printf
的OBJ文件(导入库),并且这是所有这些版本中唯一的PROC
名称,其余的是" DATA"。
库是MSVCRTD.lib,库成员是MSVCR100D.dll,平台是Microsoft Windows 7和Visual C ++。
任何人都可以向我解释这个吗?
编辑:添加大部分" printf""在msvcrtd.lib库中,我的眼睛可以捕获,实际上还有更多。
它们中的一些属于库中的同一个OBJ成员(根据它在图片中的偏移号),有些则不是。我需要理解为什么所有这些版本的printf都存在于c库中?它们是否存在以支持可能调用printf函数的多个编译器(有几个修改)?因为当我从MASM调用printf时它将它装饰为_printf
,当我从C编译器调用它时,它将它装饰为__imp__printf
,所以我猜这些多个版本可能存在以支持不同的编译器可能会使用该库,这是否正确?
我需要了解连接器及其工作原理,这个问题的答案对我有很大帮助。对我们来说,只有一个printf是我们一直调用的,为什么链接器需要所有这些?