2017-02-25 58 views
0

假设我将C/C++文件编译为二进制文件。说,该文件定义了一个功能foo()如何找到函数所在的可执行文件中的位置?

我该如何在二进制文件中找到这个函数?通过定位,我的意思是找到确切的位置。

我认为这个问题取决于我们是考虑Windows还是Linux,所以可以说可执行文件是PE格式。

编译器是否擦除所有命名,以便按名称查找函数是不可能的?也就是说,我必须在二进制文件中进行模式搜索?

我知道DLL的有导出表,这可能会在定位中的函数帮助,但在Windows可执行文件没有这样的表...

+0

该信息不存储在二进制映像中。您需要一个PDB或MAP文件。 – IInspectable

+0

这些文件是什么?从来没有听说过他们。 – Shuzheng

+0

[程序数据库文件](https://msdn.microsoft.com/en-us/library/yd4f8bd1(v = vs.100).aspx)(又名PDB文件)。再加上一些关于MAP文件的信息(参见[/ MAP连接器选项](https://msdn.microsoft.com/en-us/library/k7xkk3e2.aspx))。 – IInspectable

回答

1

.exe文件can export functions并且这些功能可以通过使用。加载到该进程中的DLL。如果您要加载插件并希望提供某种插件API/SDK,这是最好的选择。然后,您可以通过在处理过程中的任何代码中执行GetProceAddress(GetModuleHandle(0), "MyFunction")来查找函数。 .DLL也可以直接链接到函数,并且加载程序将解析它们,就像它们在.DLL中导出一样。

另一种方法是在您的.EXE中嵌入符号/调试信息,然后使用DbgHelp functions来查找该函数。

您还可以让链接器生成一个.MAP文件,该文件列出了每个函数及其地址,但在手动调试进程时最常用。

+0

我以为只有Linux允许可执行文件导出函数? – Shuzheng

+0

MAP文件是否在二进制文件或其RVA(运行时地址)中列出函数的位置? – Shuzheng

+0

@Shuzheng:你已经知道答案了。 .MAP文件在链接时生成。链接器无法知道模块将在运行时加载的位置。此外,“RVA”中的“R”是“相对”的简称。 RVA是模块相对的。 – IInspectable

相关问题