WEB开发网
开发学院软件开发VC 使用 LIBCTINY.LIB 为 EXE 和 DLL 文件 减肥 阅读

使用 LIBCTINY.LIB 为 EXE 和 DLL 文件 减肥

 2007-03-17 21:26:43 来源:WEB开发网   
核心提示: 如你所期望的,访问静态构造器是一件简单的事情,使用 LIBCTINY.LIB 为 EXE 和 DLL 文件 减肥(6),只要通过媒举函数指针数组就可以实现,其操作函数是 _initterm (Figure3),一个窍门是消灭不必要的代码,让DLL 载入代码仅可能的小,这段函数和 Visua

如你所期望的,访问静态构造器是一件简单的事情,只要通过媒举函数指针数组就可以实现。其操作函数是 _initterm (Figure3),这段函数和 Visual C++ 运行库的代码是一致 的。

从上看来,让静态构造器工作是相对容易的,只要正确的定义数据段(.CRT$XCA and .CRT$XCZ)然后调用在启动代码处调用 _initterm 就行了。而静态析构器的工作更加富有技巧性。

和编译器同连接器协同为静态构造器创建函数指针数组不同的是,静态析构器是在运行时被创建的。为了创建此列表,编译器先产生一个对Visual C++运行库 atexit 的调用。atexit函数将析构器函数的指针加到一个先入后出的队列。当 EXE 或 DLL 卸载的时候,运行库将循环调用队列中的函数。

LIBCTINY 中的 atexit 函数相对于 Visual C++ 运行库中的要简单得多。我们在 initterm.cpp 中用了三个函数和若干静态变量来实现 atexit,_atexit_init 简单的分配32位函数指针空间并保存在静态变量到 pf_atexitlist 中。

atexit 函数检查数组是否有足够的空间,如果有,将指针添加到列表中(一个更加健壮的版本将在必要的时候重新分配数组空间)。最后 _DoExit 函数媒举所有数组中的函数指针且分别调用。更加完美的做法是,_DoExit 反向媒举数组,这样更加符合 Visual C++ 运行库的行为。只不过,LIBCTINY 的目的是变得更加简单和小巧,而不是为了去兼容。

LIBCTINY''s 的启动流程

现在看看 LIBCTINY 如何支持 DLLs 和 EXEs,一个窍门是消灭不必要的代码,让DLL 载入代码仅可能的小。Figure4 展现了一个极小的 DLL 启动代码。

上一页  1 2 3 4 5 6 7 8  下一页

Tags:使用 LIBCTINY LIB

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接