为什么EXE文件中有文本函数名? 我编译了一个C++程序,让它在释放模式下有一个exe文件。当我在编辑器中打开EXE文件时,我会看到一些文本块,它们主要是程序中使用的低级函数的名称

为什么EXE文件中有文本函数名? 我编译了一个C++程序,让它在释放模式下有一个exe文件。当我在编辑器中打开EXE文件时,我会看到一些文本块,它们主要是程序中使用的低级函数的名称,c++,exe,executable,executable-format,C++,Exe,Executable,Executable Format,人们常说计算机只懂二进制机器码。那么,在可执行程序文件中存在这些人类可读文本的目的是什么?为什么计算机需要函数名来运行程序 IDE:Visual Studio 2015 RC 平台:Windows 8.1 x64 编译器命令行选项: /GS /GL /W3 /Gy /Zc:wchar_t /Zi /Gm- /Ox /Ob2 /sdl /Fd"x64\Release\vc140.pdb" /Zc:inline /fp:precise /D "_MBCS"

人们常说计算机只懂二进制机器码。那么,在可执行程序文件中存在这些人类可读文本的目的是什么?为什么计算机需要函数名来运行程序

IDE:Visual Studio 2015 RC
平台:Windows 8.1 x64

编译器命令行选项:

/GS /GL /W3 /Gy /Zc:wchar_t /Zi /Gm- /Ox /Ob2 /sdl
/Fd"x64\Release\vc140.pdb" /Zc:inline /fp:precise /D "_MBCS"
/errorReport:prompt /GT /WX- /Zc:forScope /Gd /Oy /Oi /MD
/Fa"x64\Release\" /EHsc /nologo /Fo"x64\Release\" /Ot
/Fp"x64\Release\<ProjectName>.pch"
/OUT:"<SolutionPath>\x64\Release\<ProjectName>.exe"
/MANIFEST /LTCG /NXCOMPAT
/PDB:"<SolutionPath>\x64\Release\<ProjectName>.pdb"
/DYNAMICBASE "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib"
"comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib"
"uuid.lib" "odbc32.lib" "odbccp32.lib"
/MACHINE:X64 /OPT:REF /PGD:"<SolutionPath>\x64\Release\<ProjectName>.pgd"
/MANIFESTUAC:"level='asInvoker' uiAccess='false'"
/ManifestFile:"x64\Release\<ProjectName>.exe.intermediate.manifest"
/OPT:ICF /ERRORREPORT:PROMPT /NOLOGO /TLBID:1
/GS/GL/W3/Gy/Zc:wchar\u t/Zi/Gm-/Ox/Ob2/sdl
/Fd“x64\Release\vc140.pdb”/Zc:inline/fp:precise/D“\u MBCS”
/错误报告:提示符/GT/WX-/Zc:forScope/Gd/Oy/Oi/MD
/Fa“x64\Release\”/EHsc/nologo/Fo“x64\Release\”/Ot
/Fp“x64\Release\.pch”
链接器命令行选项:

/GS /GL /W3 /Gy /Zc:wchar_t /Zi /Gm- /Ox /Ob2 /sdl
/Fd"x64\Release\vc140.pdb" /Zc:inline /fp:precise /D "_MBCS"
/errorReport:prompt /GT /WX- /Zc:forScope /Gd /Oy /Oi /MD
/Fa"x64\Release\" /EHsc /nologo /Fo"x64\Release\" /Ot
/Fp"x64\Release\<ProjectName>.pch"
/OUT:"<SolutionPath>\x64\Release\<ProjectName>.exe"
/MANIFEST /LTCG /NXCOMPAT
/PDB:"<SolutionPath>\x64\Release\<ProjectName>.pdb"
/DYNAMICBASE "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib"
"comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib"
"uuid.lib" "odbc32.lib" "odbccp32.lib"
/MACHINE:X64 /OPT:REF /PGD:"<SolutionPath>\x64\Release\<ProjectName>.pgd"
/MANIFESTUAC:"level='asInvoker' uiAccess='false'"
/ManifestFile:"x64\Release\<ProjectName>.exe.intermediate.manifest"
/OPT:ICF /ERRORREPORT:PROMPT /NOLOGO /TLBID:1
/OUT:“\x64\Release\.exe”
/清单/LTCG/NXCOMPAT
/PDB:“\x64\Release\.PDB”
/DYNAMICBASE“kernel32.lib”“user32.lib”“gdi32.lib”“winspool.lib”
“comdlg32.lib”“advapi32.lib”“shell32.lib”“ole32.lib”“oleaut32.lib”
“uuid.lib”“odbc32.lib”“odbccp32.lib”
/机器:X64/OPT:REF/PGD:“\X64\Release\.PGD”
/声明:“level='asInvoker'uiAccess='false'”
/清单文件:“x64\Release\.exe.intermediate.manifest”
/选项:ICF/ERRORREPORT:PROMPT/NOLOGO/TLBID:1

编辑: 我做了些改变。我更改了项目设置,将命令行开关
\MD
更改为
\MT
。可执行文件大小从56kb更改为436kb。我猜这是因为现在所需的库在运行时没有链接,但它们从一开始就存储在EXE文件中。但是EXE文件中仍然有文本块,如下面的屏幕截图所示。标准模板库(STL)中的函数名已完全消失,但有许多Win32 API函数名。现在的原因可能是什么


这些是从.DLL访问的名称。尝试改用静态库构建,这些名称应该消失,但.EXE会变大。为此,对于发布版本,右键单击项目中的源文件名,并将运行时库从“多线程DLL”(/MD)更改为“多线程(/MT)”。这里的主要更改是编译器命令行选项/MD更改为/MT


但是,正如Peter Torr在下面所评论的,您仍然需要使用一些dll模块,如kernel32.dll。

构建在windows上的可执行文件使用可移植的可执行文件格式:


为了链接到DLL中的函数,使用包含运行时使用的函数地址的导入和导出表创建EXE。如果将SDK(或VC++?)实用程序“dumpbin”与/exports或/imports一起使用,则可以看到从模块导入或导出的函数。DLL的布局可以在新版本发布时更改,因此导入和导出表是调用者获取另一个动态链接模块中函数地址的一种方式。

考虑调试信息。这只无毛猿很擅长阅读文本,但对数字不太在行,所以你会在任何没有被刻意混淆的东西中找到一些标记和提示。见下面彼得·托尔的回答。从操作系统导入的函数不能静态链接。然后,正如您所看到的,您将获得CRT/STL从Windows使用的函数列表。这些功能始终是动态链接的。