• 2008-11-06

    修改对齐字节数减小GCC.DDK编译的驱动体积 - [Driver]

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://aliwy.blogbus.com/logs/31041225.html

    新安装了个Code::Blocks,可以直接采用GCC的DDK写驱动,
    但编译出来的驱动比用MSDDK的大太多!!!
    如下代码:

    ////////////////////////////////////
    #include <ddk/ntddk.h>

    NTSTATUS
    STDCALL
    DriverDispatch(IN PDEVICE_OBJECT DeviceObject,
                   IN PIRP Irp)
    {
    return STATUS_SUCCESS;
    }

    VOID
    STDCALL
    DriverUnload(IN PDRIVER_OBJECT DriverObject)
    {
        DbgPrint("[Aliwy] DriverUnload() !\n");
        return;
    }

    NTSTATUS
    STDCALL
    DriverEntry(IN PDRIVER_OBJECT DriverObject,
                IN PUNICODE_STRING RegistryPath)
    {
        DbgPrint("[Aliwy] DriverEntry() !\n");

        DriverObject->DriverUnload = DriverUnload;

        return STATUS_SUCCESS;
    }
    ////////////////////////////////////

    这么一个简单的玩意儿,
    GCCDDK编译后竟然达到24K,
    如去掉代码中的STDCALL后再用MSDDK编译,最多2K!
    开始以为是GCC编译参数有什么奥妙之处还没发现,
    Google了好久也没找到答案。
    于是在看雪和CSDN分别发帖求助,结果无人问津。
    突然想起,用Stud_PE查看一下文件的PE格式~
    对比了一下,原来如此——

    MSDDK默认对齐是128(0x0080),
    而GCCDDK默认对齐是4096(0x1000),12倍!!!
    汇编MASM32的KmdKit默认才是32(0x0020)。

    于是,在GCC编译参数设置中,修改对齐字节数,OK了~
    Code::Blocks中设置linker参数如此般——
     
    -nostartfiles
    -Wl,--nostdlib
    -shared
    -Wl,--entry,_DriverEntry@8
    -Wl,--file-alignment,0x0080
    -Wl,--section-alignment,0x0080
    -Wl,--image-base,0x00010000

    Release Build后: Output size is 1.25 KB


    收藏到:Del.icio.us




    评论

  • 很好,学习了,要是能把linker参数解释一下就更好了