子系统:本机

我正在编写本机模式应用程序(请考虑:link /subsystem:native)。这意味着我不能使用kernel32.dll中的任何内容,(显然)C运行时库中没有任何内容。通常,这对我来说不是问题,因为我需要的所有内容都在ntdll.dll中。该代码已编写并且可以正常工作。

但是,我正在用c ++编写代码,还有一个问题是如何处理异常处理。我相信本机模式应用程序的意图是使用SEH,这是我所做的。但这不是很有效。

如果我不使用/ EHa进行编译,则当我RtlRaiseException时不会调用我的析构函数。但是,如果我确实使用/ EHa进行编译,则会得到一个未定义的符号(未解析的外部符号__CxxFrameHandler4 ),该符号显然仅存在于C运行时中。

(如何)在构建本机模式应用程序的同时,如何编译我的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不再无法解决。坏消息是给了我另外55个未解决的符号。该列表包括__imp_TlsAlloc__imp_TlsGetvalue之类的项目,这些项目显然来自kernel32.dll(因此对我来说不可用)。

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

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


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

我在这里没主意。如果有某种方法可以在不使用kernel32的情况下展开堆栈,那么我找不到它。在ntdll中有名称为“ Exception”的导出函数的事实表明可能存在,但也许没有。也许总是有“ C”代码的意图,而析构函数不是问题。

如果有人有任何尝试的新事物或有新的外观的地方,我将不胜感激。甚至有权威人士称无法做到。至少那时我会知道的。

z492572861 回答:子系统:本机

有一个(特殊的)cl.exe /kernel开关。基本上这意味着:

没有例外,没有RTTI,也没有默认的new()/ delete()

我可能以为您已经找到了此开关,并乐于使用它?

编辑:

关键问题可能是:“为什么存在此开关?”。我的猜测是“从上面发出的消息”,它说:在WIN上使用C ++开发低级“事物”时,甚至不要尝试C ++异常,RTTI和dflt new()/ delete()。

在任何情况下,我都不建议在C ++低层aka“本地” WIN版本中展开C ++堆栈。我假设您知道SEH吗?如果您愿意,那么您会很了解those dark woods。在此期间,您可以使用ASAN。幸存者的故事确实存在。

本文链接:https://www.f2er.com/2873446.html

大家都在问