WDK中配置binplace

来源:互联网 发布:java怎么截取字符串 编辑:程序博客网 时间:2024/05/18 00:14

 

DDK2003/WDK中附带的binplace.exe用于将编译的文件放到一个统一的目录下,还有一个很有用的功能是符号剥离:能够将包含局部变量的pdb中的符号剥离出去,这样避免通过pdb公开太多的内部细节,比如微软操作系统pdb。

写这篇文章的时候,WDK中已经有更高级的binplace机制,但我实在不想在看似天书的makefile.new中去寻找蛛丝马迹,干脆直接用老的nt中使用binplace的方式引出本文。欢迎探讨。我的构建系统FlexBuild早期也是使用binplace.exe,后来处于更好的集成,在build内部实现了符号剥离和替换功能。

假设WDK的安装目录为:X:\WinDDK\6000\

  • 第一步:

    修改bin\setenv.bat,在第一行后增加:

    REM 这个设置编译后的文件输出目录set _NT386TREE=d:\releaseREM 这个设置编译后文件将放到_NT386TREE中那个目录下,如果为retail将为根目录set BINPLACE_PLACEFILE=d:\placefile.txt
  • 第二步:

    在bin\makefile.new搜索:! ELSEIF "$(TARGETTYPE)" == "DRIVER" || \ 找到后,比如:

    ! ELSEIF "$(TARGETTYPE)" == "DRIVER" || \    "$(TARGETTYPE)" == "MINIPORT"$(TARGET): $(OBJECTS) $(BO_LIB) $(MACHINE_TARGETLIBS) $(CRTLIBS)    $(LINKER) @<<$(LINKER_FLAGS: =)$(LINKER_STACKSIZE_DLL)$(ORDER: =)$(SECTION_INFO1)$(SECTION_INFO2)$(LINKER_OPTIDATA)$(DRIVER_SWITCH)/base:$(DRIVERBASE)!  IF "$(DRIVERTYPE)" == "VXD"/def:$(DLLDEF)!  ELSE$(DRIVER_ALIGN_SWITCH)/subsystem:native,$(SUBSYSTEM_NATVER)/entry:$(DRIVER_ENTRY)$(ENTRY_SUFFIX)!endif/out:$(TARGET)$(HEADEROBJNAME: =)$(**: =)<<$(BUILD_NOKEEP)

    在<<$(BUILD_NOKEEP)下一行增加:

    binplace -a -x -y -s $(_NT386TREE)\stripped -n $(_NT386TREE)\symbols $(TARGET)

    如果想针对其它编译类型,比如exe,相应的在"$(TARGETTYPE)" == "XXX”后面增加binplace工具调用。

  • 第三步:

    创建第一步BINPLACE_PLACEFILE指定的文件,其内容格式:

    ; 编译文件名,不包含目录                              移动到_NT386TREE下那个目录下demo.sys                                             retailDemo1.sys                                            demo1

    OK!,想在启动WDK编译一个驱动工程,看看D盘的release目录下有什么:

    + release  + stripped   这个为发布的symbols,剥去局部变量的,类似微软操作系统公开的pdb  + symbols    这个是包含所有信息的pdb,一般人我不会发给他的  xxx.sys

  • 原创粉丝点击