Table of Contents
前言
回想工作的这两年时间,绕不开的就是一个Dll,动态库开发也算是小有经验了,可惜一直沉下心来做一个简单的总结,今天也算是对自己一个小交代。
主要内容涉及以下几个方面:
- DLL创建
- DLL开发中的惯用法
- dumpbin工具的使用
一些参考的资料如下:
一个简单的例子
假设我们想写一个dll库,其代码如下:
// math.cpp
extern "C" int __cdecl Add(int a, int b)
{
return a + b;
}
extern "C" int __cdecl Sub(int a, int b)
{
return a - b;
}
extern "C" int __cdecl Mul(int a, int b)
{
return a * b;
}
extern "C" int __cdecl Div(int a, int b)
{
return a / b;
}
然后可以使用下面的命令行编译:
E:\DllDemo>cl /c math.cpp
用于 x64 的 Microsoft (R) C/C++ 优化编译器 19.26.28806 版
版权所有(C) Microsoft Corporation。保留所有权利。
math.cpp
E:\DllDemo>link math.obj /DLL /NOENTRY /EXPORT:Add /EXPORT:Sub /EXPORT:Mul /EXPORT:Div
Microsoft (R) Incremental Linker Version 14.26.28806.0
Copyright (C) Microsoft Corporation. All rights reserved.
正在创建库 math.lib 和对象 math.exp
E:\DllDemo>dir
驱动器 E 中的卷是 数据
卷的序列号是 1A7E-A8B7
E:\DllDemo 的目录
2021/03/13 19:10 <DIR> .
2021/03/13 19:10 <DIR> ..
2021/03/13 19:09 272 math.cpp
2021/03/13 19:10 2,048 math.dll
2021/03/13 19:10 893 math.exp
2021/03/13 19:10 2,056 math.lib
2021/03/13 19:09 761 math.obj
5 个文件 6,030 字节
2 个目录 59,667,820,544 可用字节
PE格式与dumpbin工具
PE格式
众所周知,CS的世界离不开各种各样的协议,视频有MP4,音频有MP3,而程序呢?windows下的程序遵循的文件格式为PE格式,我们可粗略的看一下PE格式的内容:
PE Format | 功能 |
---|---|
DOS Stub | DOS程序校验 |
PE Signature | PE\\0\\0 |
COFF File Header | 包含文件的一些参数,例如平台、类型等 |
Optional Header | 虽然名称是Optional,实际上对于Image类型是必须包含的 |
Section Headers | 包含section的信息 |
Sections | 包含代码、数据、资源等内容 |
在其中的Section部分,就包含了DLL的导出信息,在这里我们不讨论的过深,因而略过各种复杂的讨论,直接使用dumpbin工具查看dll的导出信息:
E:\DllDemo>dumpbin /EXPORTS math.dll
Microsoft (R) COFF/PE Dumper Version 14.26.28806.0
Copyright (C) Microsoft Corpor