C程序,编译和链接后,会产生一个包含edata部分的EXE文件?

问题描述 投票:1回答:1

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

名为.edata的导出数据部分包含有关其他图像可通过动态链接访问的符号的信息。导出的符号通常在DLL中找到,但DLL也可以导入符号。

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

c compilation executable portable-executable
1个回答
3
投票

任何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部分。

© www.soinside.com 2019 - 2024. All rights reserved.