使用 def 文件从可执行文件中导出函数

Posted

技术标签:

【中文标题】使用 def 文件从可执行文件中导出函数【英文标题】:Exporting functions from an executable using a def file 【发布时间】:2016-11-15 18:17:03 【问题描述】:

有很多关于如何从 dll 导出函数的信息(我已经做过很多次了),但我听说也可以从 可执行文件 导出函数,这样外部 dll 可以调用它们。

虽然我已经设法让它工作,但入口点似乎有一些问题:

如果没有显式设置,则默认为错误的“main” 一个不起眼的子库。 如果 显式设置,则其输入参数 argc 和 argv 会损坏(argc 可以是 ~20000000 或 ~-700000)。

我找不到任何有关从可执行文件导出函数的文档 - 我应该接受提示而不是这样做吗?

[上下文:这是使我们的流程在 Windows 和 Linux 上工作的努力的一部分。 Linux 版本意外地从可执行文件中获取函数,而不是从附带的 dll 中显式导出的函数(这些函数具有相同的名称,但参数不同)。我们决定尝试使用它运行,并从 Windows 上的可执行文件中导出函数。]

【问题讨论】:

【参考方案1】:

我发布这个只是为了总结我自己在这方面的学习,没有更好的答案:

添加 def 文件后,链接器立即抱怨它无法确定入口点。正是出于这个原因,我添加了 /ENTRY 引用。然而,在返工期间,我在删除 def 文件的同时删除了 /ENTRY,并且我可以毫无错误地编译 - 同时我一定删除了一个微妙的冲突选项。 def 文件确实 成功地从 .exe 导出函数,然后这些 可以 在该进程的 dll 中使用(如果它链接到 DelayImp.lib和可执行文件的 .lib)。 我一直无法让 /ENTRY 选项令人满意地工作,再加上 MSDN 项目 [https://msdn.microsoft.com/en-us/library/f9t8842e.aspx] 上的温和令人沮丧的 cmets,我认为没有理由在这种情况下使用它。

我希望这对尝试做类似事情的其他人有所帮助。如果出现的话,我很乐意将一个更具技术性的答案重新指定为“解决方案”......

【讨论】:

以上是关于使用 def 文件从可执行文件中导出函数的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 Windows 上运行时从可执行文件中定位函数?

从可执行文件创建 Windows 服务

Apparmor:是不是可以从可执行文件中调用另一个可执行文件?

从可执行文件中找出编译优化标志

如何从可执行文件中提取数组?

将类从可执行文件导出到 dll