首页
社区
课程
招聘
[旧帖] [讨论]用Flair做VC静态库libcmt.lib的.sig(函数签名文件) 0.00雪花
2008-4-6 10:21 14719

[旧帖] [讨论]用Flair做VC静态库libcmt.lib的.sig(函数签名文件) 0.00雪花

2008-4-6 10:21
14719
我尝试着制作识别VC 的C运行时库:libcmt.lib(静态多线程版本)的.sig文件,用来识别VC程序中的静态链接的C库函数。
但用Flair自带的工具制作.pat文件时总不成功,我试了Flair的pcf(处理coff格式),plb(处理OMF格式), pelf(处理elf格式),都无法处理,而且都是同样的原因:libcmt.lib不是对应的格式。
但VC的静态库就是coff格式的,为什么pcf却说它不是一个coff module? 大家知道原因吗?
或者大家有其他的方法来制作VC静态库的.sig文件,用来识别VC程序的静态库函数吗?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞7
打赏
分享
最新回复 (5)
雪    币: 297
活跃值: (27)
能力值: ( LV13,RANK:380 )
在线值:
发帖
回帖
粉丝
tnttools 9 2008-4-6 15:20
2
0
IDA语境中的LIB文件是VC语境中的.obj文件,不是VC语境中的.lib文件
VC语境中的.obj文件是COFF文件类型,.lib文件是Unix Archiever文件类型(!)。
而VC多线程静态库.obj文件,主要(!)在
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\crt\src\intel\mt_lib里面
雪    币: 208
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
BeQuick 2008-4-7 11:23
3
0
多谢指点
但对VC 多线程静态版本的 C Run-Time Library 能有一些疑问:
    你说“VC多线程静态库.obj文件,主要(!)在C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\crt\src\intel\mt_lib里面”,  那如果VC程序调用了多线程静态库中的函数,那么该程序在链接时连接的是Vc7\lib目录下相应的.lib文件,还是Vc7\crt\src\intel\mt_lib目录下相应的.obj文件???   因为我认为Vc7\lib目录已经包含了VC程序可能用到的所有的静态库了(比如C Run-Time Library就在该目录下),如果真得如你所说,那Vc7\crt\src\intel\mt_lib目录和 Vc7\lib目录下的库文件不是很多都重叠了吗?
雪    币: 297
活跃值: (27)
能力值: ( LV13,RANK:380 )
在线值:
发帖
回帖
粉丝
tnttools 9 2008-4-7 14:18
4
0
《补充》

因为.lib文件的文件类型是Unix Archive,可以调用ar来查看。ar命令是集成在Unix Shell中的。如果你是windows的操作系统,需要在Mingw下查看。命令行为
ar -t "c:\\libcmt.lib"

在我机子上显示为
build/intel/mt_obj/_ctype.obj
build/intel/mt_obj/_fptostr.obj
build/intel/mt_obj/_mbslen.obj
build/intel/mt_obj/_wctype.obj
build/intel/mt_obj/atof.obj
build/intel/mt_obj/atox.obj
build/intel/mt_obj/fcvt.obj
build/intel/mt_obj/gcvt.obj
build/intel/mt_obj/isctype.obj
...
太多了,大概有七百个文件。

----------------------引用
VC多线程静态库.obj文件,主要(!)在C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\crt\src\intel\mt_lib里面
----------------------引用
这里确实是说错了,原因是我没有仔细核查原文件。MS对于文件类型的扩展还没有公开的文档描述。
这几百个文件只有一小部分(!)是以独立的(!)方式存储在下面的文件夹中。
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\crt\src\intel\mt_lib
至于其它的文件?

Unix中的.a确实集成了它所声明的所有.obj文件,但MS中的.lib我仍存疑,我的推断:有的集成了.obj,有的没有集成.obj,或有的只集成了一部分.obj。

请仔细检查libcmt.lib,来努力推翻我。
雪    币: 208
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
BeQuick 2008-4-8 00:48
5
0
我觉得“VC中的静态库(.lib)是不是集成了它所声明的所有.obj ”并不重要啊。 VC程序连接时,所链接的静态库是来自于 Microsoft Visual Studio\VC\lib目录 和 Microsoft Visual Studio\VCPlatformSDK\lib目录(我安装的是VS2005), 并不会链接..\VC\crt\src\intel\mt_lib下的.obj文件(..\VC\crt\src\intel\mt_lib的.obj文件存在的作用)。   所以,编程时只需要引入合适的库就可以了,不需要了解 VC中的静态库(.lib)集成了那些.obj文件,应该不会出现“.lib没有集成它所声明的某个.obj”吧,因为微软应该不会犯那样的错误吧

另外,用Flair做libcmt.lib出错的具体信息为:

     命令:  pcf libcmt.lib libcmt.pat
       提示是: Fatal [libcmt.lib] <build\intel\st_obj\tcmap\chr.obj>: not a coff module

应该是里面的一个.obj文件不是coff格式,所以我觉得可行的做法是:把libcmt.lib 解为很多个obj,在用依次用pcf命令生成.pat文件,最后再用sigmake 一次生成.sig文件
雪    币: 297
活跃值: (27)
能力值: ( LV13,RANK:380 )
在线值:
发帖
回帖
粉丝
tnttools 9 2008-4-8 19:45
6
0
-------------------
我觉得可行的做法是:把libcmt.lib 解为很多个obj,在用依次用pcf命令生成.pat文件,最后再用sigmake 一次生成.sig文件
-------------------

我的基本思路也是如此。
希望你能做出这样的工具,可以把libcmt.lib中的所有.obj都提取出来。
ar.exe没有成功,ar2idt.exe没有成功。
我现在没有动力和时间做这样的工具。
希望你可以做出来,贡献社区。
游客
登录 | 注册 方可回帖
返回