使用 Clang + LLD (MSys2/MingW) 链接简单的 C 程序会生成错误的展开表样式.eh_frame 而不是 .pdata

问题描述

所以我无法找到有关我目前遇到的问题的任何信息。我希望这里有人知道如何解决它。

我正在使用 Clang 11.0.0 编译一个非常简单的 C 程序。我希望它生成一个 .pdata 部分,其中包含遵循 Windows 标准的展开信息(请参阅:https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-runtime_function)。

如果您要为 64 位编译它并使用 -funwind-tables 标志。 LLD 将正确生成我期望的格式的 .pdata 部分。但是如果你为 32 位 (i686-w64-windows-gnu) 编译它,那么它总是生成一个 .eh_fram 部分,其中包含非 Windows 格式的展开信息。

如何告诉 Clang/GCC 或 LLD 也对 32 位编译程序使用 .pdata 样式展开信息?

有什么办法可以强制编译器或链接器在 32 位上使用 SEH?

这是我目前测试的内容

clang -funwind-tables -fuse-ld=lld main.c

C 代码

__attribute__((noinline))
void call_3() {
  *(int *) (0x43000) = 0x3334;
}

__attribute__((noinline))
void call_2() {
  call_3();
}

__attribute__((noinline))
void call_1() {
  call_2();
}

int main() {
  call_1();
  return 0;
}

32 位编译节:

32-bit compiled

64 位编译部分(这个 .pdata 也是我想要的 32 位部分):

64-bit compiled

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)