#pragma data_seg("FOO")
int global = 1;
#pragma data_seg(".data")
将“global”放到“FOO”段里面,然后再换回来,恢复到“.data”。
"cl"是VISUAL C++的编译器。
/c 表示只编译不链接,即将.c文件编译成.obj。如果不加这个参数,cl会在编译 .c后再调用link将 .obj与默认的C运行库链接产生.exe文件。
/Za参数禁用VISUAL C++的一些C和C++的专有扩展。而这些扩展没有定义ANSI C标准或ANSI C++标准。
使用/Za时,编译器自动定义了_STDC_这个宏。
Visual C++提供了一个类似objdump的用于查看目标文件和可执行文件的工具,即“dumpbin”。
“/ALL”打印输出目标文件的所有相关信息,包括文件头、每个段的属性和段的原始数据及符号表。并将其输出到文件。
“/SUMMARY”只输出所有段的段名和长度。
----------------------------------------------------------------------------------------------------------------------------------
COFF文件结构
映像头
段属性描述(以“.drectve”段为例)
-------------------------------------------------------------------------------------------------------------------------------------------------
链接指示信息
“.drectve”段是编译器传递给链接器的指令,即编译器希望链接器怎样链接这个目标文件。
“/DEFAULTLIB:LIBCMT”是“cl”希望传给“link”的参数:该目标文件须要LIBCMT(Library C Multithreaded)这个默认库。
也可以在cl参数里加入/Zl来关闭默认C库的链接指令。
--------------------------------------------------------------------------------------------------------------------------------------------------
调试信息
COFF中所有以“.debug”开始的段都包含调试信息。
“.debug$S”表示包含的是符号相关的调试信息段;
“.debug$P”表示包含预编译头文件相关的调试信息段;
“.debug$T”表示包含的是类型相关的调试信息段;
如图所示,包含了目标文件的原始路径,编译器信息等。
-------------------------------------------------------------------------------------------------------------------------------------------------
符号表
第一列 符号的编号
第二列 符号的大小,即符号所表示的对象所占用的空间
第三列 符号所在的位置,ABS(Absolute)表示符号是个绝对值,即常量,不存在于任何段中;
SECT1表示符号所表示的对象定义在本COFF文件的第一个段中;
UNDEF表示符号是未定义的,即这个符号被定义在其他目标文件。
第四列 符号类型,变量和其他符号位notype,函数为notype()。
第五列 符号的可见范围,Static表示符号是局部变量,只在目标文件内部可见;External表示符号是全局变量,可以被其他目标文件引用。
第六列 符号名,对不需要修饰的符号名,会直接输出原始符号名;对经过修饰的,会将修饰前和修饰后的名字都打印出来,后面括号内为未修饰的。
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Windows下的ELF——PE
前两个部分是为了兼容DOS系统的结构,但效果真的很萌啊= =
在IMAGE_DOS_HEADER中有个“e_lfanew”成员用来表明PE文件头在PE文件中的偏移。
缺省