C 单个库中同一函数的多个修饰/损坏版本

C 单个库中同一函数的多个修饰/损坏版本,c,visual-c++,dll,linker,C,Visual C++,Dll,Linker,转储库的外部符号时,可能会发现同一函数名有多个版本;例如C库中的printf函数,您会发现如下名称 __imp__printf _printf ___imp___printf_l 为什么没有一个版本的函数 当我试图查看它们属于库中的哪个OBJ成员时,我发现它们都属于同一个OBJ文件—一个只有一个版本的导入库,即_printf,这是所有这些版本中唯一的进程名,其余都是数据 库是MSVCRTD.LIB,库成员是MSVCR100DLDL,平台是微软Windows 7和Visual C++。 谁能给我

转储库的外部符号时,可能会发现同一函数名有多个版本;例如C库中的printf函数,您会发现如下名称

__imp__printf
_printf
___imp___printf_l
为什么没有一个版本的函数

当我试图查看它们属于库中的哪个OBJ成员时,我发现它们都属于同一个OBJ文件—一个只有一个版本的导入库,即_printf,这是所有这些版本中唯一的进程名,其余都是数据

库是MSVCRTD.LIB,库成员是MSVCR100DLDL,平台是微软Windows 7和Visual C++。 谁能给我解释一下吗

编辑:在msvcrtd.lib库中添加大多数printf,我的眼睛可能会注意到,实际上还有更多

根据图片中的偏移量编号,其中一些属于库中的同一OBJ成员,而另一些则不是。我需要理解为什么所有这些printf版本都存在于c库中?它们的存在是为了支持多个可能调用printf函数的编译器吗?因为当我从MASM调用printf时,它将它修饰为_printf,当我从C编译器调用它时,它将它修饰为uu imp u printf,所以我猜可能存在多个版本来支持可能使用该库的不同编译器,对吗

请我需要了解链接器以及它们是如何工作的,对这个问题的回答将对我有很大帮助。对于我们来说,只有一个printf是我们一直调用的,为什么链接器需要所有这些


printf和printf\u l是两个完全不同的函数,这意味着uuu\u imp\uuuuu\u printf\u l不应该出现在您的列表中。至于打印和打印。。。我猜前者是一个静态符号,而后者是一个动态库符号。我不知道你为什么在图书馆里看到这两个。顺便说一句,你在检查哪个图书馆?什么平台?正如@AnT所指出的,printf_l是一个完全不同的函数,因此它不属于列表__imp__printf是导入表条目。在运行时确定printf函数时,它将被printf函数的地址填充_printf是通过导入表项调用的存根函数。你可以把它拆开看看。这只是Windows管理导入函数的正常方式的一部分。@RaymondChen我在库中添加了大部分printf,以便您更好地理解我的意思。对我们来说,只有一个printf,那就是printfhello world!,为什么链接器需要所有这些?@AnT sir我在库中添加了大多数符号这是一个microsoft库msvcrtd.libc中有许多函数的名称中都有字母p r I n t f。你正在看其他的。除了有一个相似的名字外,它们与printf无关。这就像我在电话簿上看到鲍勃·史密斯、罗伯特·史密斯、罗伯特·斯迈思时问的那样——为什么同一个人有这么多名字?回答:不是同一个人。