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

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

 2007-03-17 21:26:43 来源:WEB开发网   
核心提示: 构造器内幕编译器处理一个含有构造器的代码文件的时候,它会做两件事,使用 LIBCTINY.LIB 为 EXE 和 DLL 文件 减肥(5),首先是一小段类似 $E2 用来调用构造器的代码,第二件事就是产生一个指向这段代码的指针,但是当链接器合并 .CRT$XCU 节的时候,通过定义 .CR

构造器内幕

编译器处理一个含有构造器的代码文件的时候,它会做两件事,首先是一小段类似 $E2 用来调用构造器的代码。第二件事就是产生一个指向这段代码的指针。指针被写到 .OBJ 文件的 .CRT$XCU 节中。

为什么使用如此搞笑的命名?哈,有点复杂。先看一段代码来增加理解。如果你查看 Visual C++ 运行库原代码(比如,CINITEXE.C), 你可以看到下列:#pragma data_seg(".CRT$XCA") 
_PVFV __xc_a[] = { NULL }; 
 
#pragma data_seg(".CRT$XCZ") 
_PVFV __xc_z[] = { NULL };
上面的代码创建两个节, .CRT$XCA 和 .CRT$XCZ。 每个节都有一个变量(分别是 __xc_a 和 __xc_z)。注意,节的命名和 .CRT$XCU 非常相似。

这里,我们需要一点链接器方面的知识。当创建一个最终的PE文件的时候,链接器将所有名字相同的节合并。所以,如果 A.OBJ 有一个叫做 .data 的节,而 B.OBJ 也有个 .data 的节的话,那么 A.OBJ 和 B.OBJ 中所有 .data 里面的数据将被连续的写到PE文件唯一的 .data 节中去。

$的作用是一个名字的分隔符。当链接器遇到一个有$的名字的时候,会将前半部分看作是节名。所以 .CRT$XCA 和 .CRT$XCU 以及 CRT$XCZ 在最后的PE文件中都被合并成 .CRT 节。 那么$的后半部分是什么意思呢?链接器在合并这种类型的节的时候,根据后半部分的字母顺序排序。所以 .CRT$XCA 里面的数据放在最前面,接下来是 .CRT$XCU,最后是 .CRT$XCZ 里面的数据。这些就是需要理解的关键点。

接下来,运行库并不知道 EXE 或 DLL 有多少个静态构造器,也就是不知道在 .CRT$XCU 节中有多少个构造器代码的指针。但是当链接器合并 .CRT$XCU 节的时候,通过定义 .CRT$XCA 和 .CRT$XCZ 节的 __xc_a 和 __xc_z 符号来产生一个函数指针数组,运行库就通过函数指针数组的开始和结束来定位函数。

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

Tags:使用 LIBCTINY LIB

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