在Windows下,程序和库都是PE(Portable Excutable)格式文件,可以被内存映射到一个进程中。
加载一个Windows可执行程序或者DLL与加载一个动态链接的ELF程序相似,尽管在Windows下动态链接器是 *** 作系统内核的一部分。
PE文件可以包含有重定位项。通常一个可执行程序不会包含可重定位项,因此必须将它们映射到在链接时确定的地址上。DLL都包含有重定位项,并且在它们被链接进来的地址空间无效的时候都会被重定位(微软将运行时重定位称为rebasing)。
所有的PE文件,包括可执行程序和DLL,都有一个入口点,在DLL被加载、被卸载,以及每一次进程的线程attach或deattach这个DLL的时候,加载器都会调用DLL的入口点(每一次加载器都会传递一个参数说明调用原因)。这就可以提供类似ELF的.init和.fini区段的钩子代码来实现初始化和终结 *** 作。
简而言之,PE头就是windows中特有的可执行文件头.
一个工程就是就是一个C程序,工程虽然可以包含多个程序文件,但不可以编译多个C程序。编译器是在编译阶段分别编译工程内的多个文件,最后将编译各个文件得到的多个obj目标文件链接到一起成为一个可执行程序。因此无论这个工程包含多少源代码文件,只有一个文件可以定义main函数。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)