我正在检查可移植可执行文件(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/