Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

5.3 链接指示信息

我们将"SimpleSection.txt"中关于".drectve"段相关的内容摘录如下:

SECTION HEADER #1
.drectve name
    0 physical address
    0 virtual address
    18 size of raw data
    DC file pointer to raw data (000000DC to 000000F3)
    0 file pointer to relocation table
    0 file pointer to line numbers
    0 number of relocations
    0 number of line numbers
  100A00 flags
         Info
         Remove
         1 byte align

RAW DATA #1
  00000000: 20 20 20 2F 44 45 46 41 55 4C 54 4C 49 42 3A 22     /DEFAULTLIB:"
  00000010: 4C 49 42 43 4D 54 22 20                          LIBCMT" 

   Linker Directives
   -----------------
   /DEFAULTLIB:"LIBCMT"

".drectve段"实际上是"Directive"的缩写,它的内容是编译器传递给链接器的指令(Directive),即编译器希望告诉链接器应该怎样链接这个目标文件。段名后面就是段的属性,包括地址、长度、位置等我们这些在分析ELF时已经很熟知的属性,最后一个属性是标志位"flags",即IMAGE_SECTION_HEADERS里面的Characteristics成员。".drectve"段的标志位为"0x100A00",它是表5-2中的标志位的组合。


表5-2

"dumpbin"已经为我们打印出了标志位的三个组合属性:Info、Remove、1 byte align。即该段是信息段,并非程序数据;该段可以在最后链接成可执行文件的时候被抛弃;该段在文件中的对齐方式是1个字节对齐。

输出信息中紧随其后的是该段在文件中的原始数据(RAW DATA #1,用十六进制显示的原始数据及相应的ASCII字符)。"dumpbin"知道该段是个".drectve"段,并且对段的内容进行了解析,解析结果为一个"/DEFAULTLIB:'LIBCMT'"的链接指令(Linker Directives),实际上它就是"cl"编译器希望传给"link"链接器的参数。这个参数表示编译器希望告诉链接器,该目标文件须要LIBCMT这个默认库。LIBCMT的全称是(Library C Multithreaded),它表示VC的静态链接的多线程C库,对应的文件在VC安装目录下的lib/libcmt.lib,我们在前面介绍静态库链接时已经简单介绍过了。所以当我们使用"link"命令链接"SimpleSection.obj"时,链接器看到输入文件中有这个段,就会将"/DEFAULT:'LIBCMT'"参数添加到链接参数中,即将libcmt.lib加入链接输入文件中。

注意

我们可以在cl编译器参数里面加入/Zl来关闭默认C库的链接指令。