首页
社区
课程
招聘
[原创]浅谈连接库函数的声明与创建
发表于: 2006-5-14 17:34 11588

[原创]浅谈连接库函数的声明与创建

2006-5-14 17:34
11588

床上躺了这么长时间~写点东西充实一下自己好了~By Anskya
OMF,COFF的LIB函数的声明头部简单的说一下好了
By Anskya
OMF是Intel发布的obj格式,COFF据说是M$从UNIX上学来的这个具体内部信息也不太了解

1.连接库函数的声明:
记事本打开各种LIB自然就可以发现一些不同的地方
COFF格式下:LIB函数声明为__imp__XXXX@X
_imp__XXX为函数的声明头部,前面的那个_为C语言调用方式附加的_
@X=X为传递参数的数量*4
也就是说比如说MessageBoxA函数需要传递入4个参数..
那他的声明为__imp__MessageBoxA@12

相同道理其他的也差不多.MASM系列的COFF编译器默认就是把函数都以以上形式编译,
你打开VC调试一下程序既可以发现call [_imp__MessageBox@12]
许多教你C语言和ASM共享LIB和函数头部的书或者文章都有以上说明
具体参考《Intel汇编语言程序设计(第四版)》

OMF格式就很容易发现了.他没有__imp__头部直接就是一个函数的声明后面也没有标号
这里我也没有作其他调查和过多的捣鼓..简单的看了一下BCB的连接库还有NASM的
OMF现对于COFF格式来说就相对简单一些.具体代码可以参考<Alink的源代码>
下载地址:alink.sourceforge.net

看一下NASM-Alink的连接库和声明头部既可以发现[extern _MessageBoxA@16]
他没有前面的_imp__虽然不能代表什么(我也不知道为什么coff为什么要以这个打头)
COFF与OMF在函数声明上最大的区别就在于此了~记下这点以后下面在创建连接库的时候有用的

Alink自带的Win32.lib格式也是按照__imp__XXX打头的但是仔细看一下他没有后面的标号?
其实MASM也可以做到,只是平时我们使用的MASM的时候没有注意到这里.

好了总结一下上面的知识点:其实就三句话就可以总结了
OMF_OBJ格式:正常的函数声明_XXXXX
OMF_LIB格式:有__imp__
COFF_LIB格式:__imp__XXXX@X

有了以上的资料和知识就可以来打造自己的LIB了?
有什么作用?不知道大家发现没有MASM的编译器总喜欢把许多垃圾编译到OBJ或者LIB里面
导致在最终生成的PE也会有许多这种东西..但是不可否认M$的连接器的确是不错.
当然你也可以使用polink来连接(效果是一样的~虽然参数没有M$link多但是也足够用了)
新版的MASM编译器也支持编译OMF格式的OBJ了,个人感觉没太大用处(Delphi和BCB都不能直接拿来用
还是需要自己转换一些东西~这里推荐一下EliCZ叔叔的OMF2D这个工具..去EliCZ主页看看好了)

2.自己编译自定义函数声明的连接库
首先说说一般情况下的连接库的创建好了
一般我们创建自己的连接库的时候总是一个参数就够了"link -LIB /NOLOGO XXX_lib.obj"
MASM:link -LIB /NOLOGO XXX_lib.obj
TASM:TLIB /C XXX_lib.lib + XXX_lib.obj

现在来说说用M$创建没有标号的连接库
我们需要导出表的头部.
M$link有个连接参数可以帮我们做到这点
/MACHINE:{ALPHA|ARM|IX86|MIPS|MIPS16|MIPSR41XX|PPC|SH3|SH4}
以上是连接库的标准类型我们需要的是IX86
然后再自己整理一下函数表头和函数头部模版

NAME KERNEL32.dll
EXPORTS
AddAtomA
AddAtomW
AddConsoleAliasA
AddConsoleAliasW
AllocConsole
AllocateUserPhysicalPages
.
.
.
TASM:(C声明结构编译器会自动再函数前面增加一个_)
callw macro   WinAPI
extern  C _imp__&WinAPI:DWORD
call _imp__&WinAPI
endm

NASM:
%macro callw 1
extern __imp__%1
call  [__imp__%1]
%endmacro

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

收藏
免费 7
支持
分享
最新回复 (7)
雪    币: 207
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
感谢,这个文章有参考价值
2006-5-14 17:39
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
3
学习。
2006-5-14 17:51
0
雪    币: 208
活跃值: (376)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝
4
2006-5-14 18:04
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
收下了..辛苦了.................
2006-5-15 23:40
0
雪    币: 603
活跃值: (617)
能力值: ( LV12,RANK:660 )
在线值:
发帖
回帖
粉丝
6
学习!
2006-5-16 09:22
0
雪    币: 2134
活跃值: (14)
能力值: (RANK:170 )
在线值:
发帖
回帖
粉丝
7
有个小错误
__imp__MessageBoxA@12应该为,
__imp__MessageBoxA@16
计算错了,呵呵
其他的也是
2006-5-18 08:37
0
雪    币: 234
活跃值: (370)
能力值: ( LV9,RANK:530 )
在线值:
发帖
回帖
粉丝
8
学习!
2006-5-18 13:10
0
游客
登录 | 注册 方可回帖
返回
//