gpt4 book ai didi

c++ - 子系统 :native 中的异常处理

转载 作者:行者123 更新时间:2023-12-03 07:01:04 25 4
gpt4 key购买 nike

我正在编写 native 模式应用程序(想想: link /subsystem:native )。这意味着我不能使用 kernel32.dll 中的任何内容,这(显然)在 C 运行时库中没有任何意义。大多数情况下,这对我来说不是问题,因为我需要的一切都在 ntdll.dll 中。代码已编写并运行。

但是,我正在用 C++ 编写代码,并且存在如何处理异常处理的问题。我相信纯模式应用程序的意图是使用 SEH,这就是我所做的。但这并不完全有效。

如果我在没有/EHa 的情况下进行编译,则在出现 RtlRaiseException 时不会调用我的析构函数。但是,如果我确实使用/EHa 进行编译,则会得到一个 undefined symbol ( 未解析的外部符号 __CxxFrameHandler4 ),它显然只存在于 C 运行时中。

(如何)在构建 native 模式应用程序的同时,我可以编译我的 C++ 代码以支持展开吗?

编辑 : VC 有 4 种可能的异常处理设置,在此上下文中所有这些设置都有问题:

  • Yes with SEH Exceptions (/EHa) - 如上所述,这会导致无法解析的外部符号 __CxxFrameHandler4。
  • Yes (/EHsc) - 2 个未解析的符号:__CxxFrameHandler4 和 __std_terminate
  • Yes with Extern C functions (/EHs) - 与/EHsc
  • 相同的 2 个未解决问题
  • No - 没有未解析的符号,但在引发异常时不会调用析构函数。

  • 我想知道是否可以链接到 C 运行时的非 dll 版本。毕竟,如果所有内容都嵌入在我的可执行文件中,那么它在启动时运行时就不需要加载任何 dll,对吗?

    因此,我尝试在 libvcruntime.lib(__CxxFrameHandler4 的明显主页)中进行链接。好消息是 __CxxFrameHandler4 不再是 Unresolved 。坏消息是这给了我额外的 55 个未解析的符号。此列表包括 __imp_TlsAlloc 等项目和 __imp_TlsGetValue这些显然来自 kernel32.dll (因此对我来说不可用)。

    我准备使用 C++ 异常或 SEH,但我无法在这种情况下工作。

    我看到在 ntdll 中导出了许多与异常相关的函数。也许我应该使用其他一些异常处理机制?

    编辑 2:由于 __CxxFrameHandler4 对我不起作用,我尝试禁用新的异常处理 ( /d2FH4- )。这样做的唯一效果是将未解析的符号更改为 __CxxFrameHandler3。不是我希望的结果。

    我在这里没有想法。如果有什么方法可以在不使用 kernel32 的情况下展开堆栈,我找不到它。 ntdll 中存在名称中带有“异常”的导出函数这一事实表明可能存在,但可能没有。也许意图总是存在“C”代码,其中析构函数不是一回事。

    如果有人要尝试任何新事物或寻找新地方,我将不胜感激。或者甚至是权威人士说这是不可能的。至少那时我会知道。

    最佳答案

    有这个(奇特的)cl.exe /kernel转变。基本上这意味着:

    No exceptions, no RTTI and no default new() / delete()


    我可能认为您已经找到了这个开关并且很高兴使用它?
    编辑:
    可能关键问题是:“为什么这个开关存在?”。我的猜测是这是一条“来自上面的消息”,上面写着:在 WIN 上使用 C++ 开发低级“事物”时,甚至不要尝试 C++ 异常、RTTI 和 dflt new()/delete()。
    在任何情况下,我都不会推荐在 C++ 低级又名“ native ”WIN 构建中展开 C++ 堆栈。我想你知道 SEH ?如果你这样做,那么你很清楚 those dark woods .在那里可以使用 ASAN .幸存者的故事确实存在。

    关于c++ - 子系统 :native 中的异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59454174/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com