有没有一种方法可以在MSVC输出中禁用“ .pdata” /“ ExceptionDir”和“ UNWIND_INFO”?

时间:2019-04-08 16:30:57

标签: c++ exception visual-c++

在MSVC(Windows)中编译二进制文件时,它将输出一个名为“ .pdata”的部分,并将其他一些信息推入.RDATA中以进行展开。

GCC具有编译器选项:

interface ISmth { x: number; }

type IfAny<T, Y, N> = 0 extends (1 & T) ? Y : N;

declare function f<V = any, A extends ISmth = ISmth>(a: IfAny<A, never, A>): V;
declare function g<V = any, A extends ISmth = any>(a: IfAny<A, never, A>): V;

declare var x: ISmth, y: any;

f(x); // Fine
f(y); // Fine: Argument of type 'any' is not assignable to parameter of type 'never'.

f<string>(x); // Fine
f<string>(y); // BAD: Should be an error, but compiles

g(x); // Fine
g(y); // Fine: Argument of type 'any' is not assignable to parameter of type 'never'.

g<string>(x); // BAD: Should NOT be an error
g<string>(y); // Fine: Argument of type 'any' is not assignable to parameter of type 'never'.

(在我的测试中)完全消除了输出二进制文件中的所有这些内容,但是MSVC似乎没有类似的东西...

我当前的编译器标志是:

-fno-asynchronous-unwind-tables -fno-unwind-tables

我关闭了“启用C ++异常”,在链接器中,我使用的是“ / SAFESEH:NO”。

此外,我正在定义:

/Zc:threadSafeInit-
/GR-
/TP
/GS-

...

在包含STL标头之前(摆脱所有try / catch用法)。

然后,在IDA中打开输出EXE ...

pdata dir

如何摆脱本节/取消信息?

1 个答案:

答案 0 :(得分:1)

msvc编译器中没有这样的选项。 在Visual Studio中使用llvm。并使用以下选项。确实有效。

/ clang:-fno-unwind-tables