C 程序在编译和链接后生成包含 edata 部分的 EXE 文件?

C program that, after compiling and linking, results in an EXE file that contains an edata section?

我正在查看有关可移植可执行文件(EXE 文件)的 Microsoft 规范。特别是,我正在审查 .edata(导出数据)部分。这里是 what the specification says about the edata section:

The export data section, named .edata, contains information about symbols that other images can access through dynamic linking. Exported symbols are generally found in DLLs, but DLLs can also import symbols.

非 DLL 文件可以有 edata 部分吗?具体来说,C 程序在编译和链接后能否生成包含 edata 部分的 EXE 文件?如果是,请您展示一个简单的 C 程序,在编译和链接后生成一个包含 edata 部分的 EXE 文件,好吗?

任何 PE 映像文件都可能包含导出 table,无论它是 EXE 还是 DLL。但是,导出 table 不一定包含在 .edata 部分中。例如,通常在 .rdata 部分中看到 export tables。

要找到导出 table,您应该使用导出 Table 数据目录,而不是完全依赖 Table 部分。

以下是一个示例 C 程序,编译后将生成一个带有导出 table 的 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)

这证实了导出 Table 在这种情况下被放入了 .rdata 部分。