3

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

我正在使用 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 也将.pdata样式展开信息用于 32 位编译程序?

有没有办法强制编译器或链接器将 SEH 用于 32 位?

这是我目前测试的:

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位编译

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

64位编译

4

0 回答 0