我正在检查可移植可执行文件(EXE文件)的Microsoft规范。特别是,我正在查看.edata(导出数据)部分。这里是what the specification says about the edata section
export data部分名为.edata,包含有关
其他图像可以通过动态链接访问的符号。出口
符号通常在dll中找到,但dll也可以导入符号。
非DLL文件可以有edata节吗?具体来说,C程序在编译和链接之后,是否可以生成包含edata节的EXE文件?如果是,请显示一个简单的C程序,在编译和链接后,生成一个包含edata节的EXE文件?

最佳答案

任何PE映像文件都可以包含导出表,而不管它是EXE还是DLL。但是,导出表不一定包含在.edata部分中。例如,通常在.rdata部分看到导出表。
要定位导出表,应该使用导出表数据目录,而不是完全依赖于节表。
下面是一个示例C程序,在编译时,它将生成带有导出表的EXE。但是,它可能不会放在.edata节中(并且EXE可能根本没有.edata节)。

#include <stdio.h>

__declspec(dllexport) void some_func(void)
{
    printf("Hello\n");
    return;
}

int main()
{
    return 0;
}

当我在系统上使用Visual Studio 2017编译此程序,并在生成的EXE上运行dumpbin /HEADERS /EXPORTS时,我看到以下内容:
...

SECTION HEADER #3
  .rdata name
    2A94 virtual size
   19000 virtual address (0000000140019000 to 000000014001BA93)
    2C00 size of raw data
    7E00 file pointer to raw data (00007E00 to 0000A9FF)
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
40000040 flags
         Initialized Data
         Read Only

...


  Section contains the following exports for SampleApp.exe

    00000000 characteristics
    FFFFFFFF time date stamp
        0.00 version
           1 ordinal base
           1 number of functions
           1 number of names

    ordinal hint RVA      name

          1    0 0001108C some_func = @ILT+135(some_func)

这证实了在本例中,导出表被放在.rdata部分。

关于c - 一个C程序,在编译和链接后会导致一个包含edata节的EXE文件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55043473/

10-10 13:05