所以我无法找到关于我目前遇到的问题的任何信息。我希望这里有人知道如何解决它。
我正在使用 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 位编译段:
64 位编译部分(这.pdata
也是我想要的 32 位部分):