两个链接选项:对齐设置与PE节合并

具体的选项设置与说明如下:
#/OPT:WIN98选项,设置文件对齐为0x1000,
#                 但对于大文件,则不一定处理!(不确定性,由链接器自行决定)
#/MERGE:.rdata=.text选项,是将.rdata节合并到.text节

为了测试,写了个小汇编,代码:


.386
.model flat,stdcall
option casemap:none

include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib

.data
  szCaption db 'A MessageBox!',0
  szText db 'Hello,World!',0
  
.code
  start:
    invoke MessageBox,NULL,offset szText,offset szCaption,MB_OK
    invoke ExitProcess,NULL
  end start

简单起见,写个了Makefile来编译,Makefile内容如下:


NAME=hello
OBJS=$(NAME).obj

#LINK_FLAG=/subsystem:windows /OPT:WIN98
LINK_FLAG=/subsystem:windows /MERGE:.rdata=.text

ML_FLAG=/c /coff

$(NAME).exe:$(OBJS)
  link $(LINK_FLAG) $(OBJS)
  
.asm.obj:
  ml $(ML_FLAG) $<
  
clean:
  del *.obj

测试的效果OK!不过需要注意:
不能把.rsrc 节、.reloc 节或者.pdata 节合并到其它节中。 在Visual Studio .NET 之前, 你可以把.idata节合并到其它节中。 但是在 Visual Studio  .NET 中, 这是不允许的。但在创建程序的发行版本时, 链接器自己却经常把部分的.idata节合并到其它节中,例如.rdata 节。

测试的文件见附件:
[file][attach]225[/attach][/file]

发表评论