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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C程序,编译和链接后,会产生一个包含edata部分的EXE文件?相关的知识,希望对你有一定的参考价值。

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

名为.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程序,编译和链接后,会产生一个包含edata部分的EXE文件?的主要内容,如果未能解决你的问题,请参考以下文章

C程序为啥会崩溃?

写了一个程序可以编译c语言,怎么自动再链接然后执行生成的可执行文件?

C语言中的库是什么

cmd调用gcc编译运行c语言后,c语言会再产生一个窗口显示结果,如何将这些内容显示在cmd命令窗口中?

C语言程序运行后 出现exe停止工作 为啥呢?

gcc编译器使用简明指南 (特别是多个文件如何进行编译)