跨平台版本的gcc忽略我函数的属性标签__attribute__((interrupt))
The cross-platform version of gcc ignore the attribute tag __attribute__((interrupt)) of my function
我下载了 intel IA-64 和 32 这本书,因为我想更深入地了解 CPU 是如何工作的。所以我读了这本书并开始编写一些东西。我启用了 IDT,当我想编写中断处理程序时,我有代码:
extern "C" __attribute__((interrupt)) void test (void* ptr)
{
}
int main (void)
{
return 0;
}
当我用 i686-elf-g++ -Wall -Wextra -O2 -c -m32 main.cpp
编译时,我有以下警告:main.cpp:6:60: warning: 'interrupt' attribute directive ignored
,但是当我用 g++ -Wall -Wextra -O2 -c -m32 main.cpp
编译时,编译工作正常,生成的代码应该是最后有 iret 指令(这就是我想要的):
Disassembly of section __TEXT,__text:
_test:
0: 55 push ebp
1: 89 e5 mov ebp, esp
3: fc cld
4: 5d pop ebp
5: cf iretd
6: 66 2e 0f 1f 84 00 00 00 00 00 nop word ptr cs:[eax + eax]
有谁知道为什么我的跨平台版本的 gcc 会出现此警告? (而且我也想知道为什么中断处理程序必须有一个指向 gcc 参数的指针)
interrupt
属性只是最近添加到 G++ 的目标 x86/x86-64 架构,并且在 G++[=17 中可用=] 7.0 和 later.I 会猜测您的 i686-elf-g++
交叉编译器早于 7.0,而您的主机编译器 g++
是 7.0 或更高版本。您必须将 i686 交叉编译器升级到更新版本。
我下载了 intel IA-64 和 32 这本书,因为我想更深入地了解 CPU 是如何工作的。所以我读了这本书并开始编写一些东西。我启用了 IDT,当我想编写中断处理程序时,我有代码:
extern "C" __attribute__((interrupt)) void test (void* ptr)
{
}
int main (void)
{
return 0;
}
当我用 i686-elf-g++ -Wall -Wextra -O2 -c -m32 main.cpp
编译时,我有以下警告:main.cpp:6:60: warning: 'interrupt' attribute directive ignored
,但是当我用 g++ -Wall -Wextra -O2 -c -m32 main.cpp
编译时,编译工作正常,生成的代码应该是最后有 iret 指令(这就是我想要的):
Disassembly of section __TEXT,__text:
_test:
0: 55 push ebp
1: 89 e5 mov ebp, esp
3: fc cld
4: 5d pop ebp
5: cf iretd
6: 66 2e 0f 1f 84 00 00 00 00 00 nop word ptr cs:[eax + eax]
有谁知道为什么我的跨平台版本的 gcc 会出现此警告? (而且我也想知道为什么中断处理程序必须有一个指向 gcc 参数的指针)
interrupt
属性只是最近添加到 G++ 的目标 x86/x86-64 架构,并且在 G++[=17 中可用=] 7.0 和 later.I 会猜测您的 i686-elf-g++
交叉编译器早于 7.0,而您的主机编译器 g++
是 7.0 或更高版本。您必须将 i686 交叉编译器升级到更新版本。