GCC __attribute__
扩展,多属性的写法
GCC中如果有多个 __attribute__
属性要设置,只需要用逗号分隔开,写在同一个 __attribute__(())
中即可。
举例如下:
这是 a.c
:
#include <stdio.h>
int blah(void) __attribute__((weak, aligned(32)));
int blah(void) {
return 2;
}
int main(void) {
printf("%d\n", blah());
return 0;
}
这是 b.c
:
int blah(void) {
return 1;
}
我们编译并dump一下:
cc -c a.c && cc -c b.c && cc b.o a.o && objdump -M intel -S a.exe > 1.lss
从 dump 出来的 1.lss
中可以看到如下内容:
00000001400013a0 <blah>:
1400013a0: b8 01 00 00 00 mov eax, 0x1
1400013a5: c3 ret
1400013a6: cc int3
1400013a7: cc int3
1400013a8: cc int3
1400013a9: cc int3
1400013aa: cc int3
1400013ab: cc int3
1400013ac: cc int3
1400013ad: cc int3
1400013ae: cc int3
1400013af: cc int3
1400013b0: cc int3
1400013b1: cc int3
1400013b2: cc int3
1400013b3: cc int3
1400013b4: cc int3
1400013b5: cc int3
1400013b6: cc int3
1400013b7: cc int3
1400013b8: cc int3
1400013b9: cc int3
1400013ba: cc int3
1400013bb: cc int3
1400013bc: cc int3
1400013bd: cc int3
1400013be: cc int3
1400013bf: cc int3
00000001400013c0 <.weak.blah.default.main>:
1400013c0: b8 02 00 00 00 mov eax, 0x2
1400013c5: c3 ret
然后将 a.c
修改成下面这样:
#include <stdio.h>
//int blah(void) __attribute__((weak, aligned(32)));
int blah(void) __attribute__((weak));
int blah(void) {
return 2;
}
int main(void) {
printf("%d\n", blah());
return 0;
}
再次编译并dump:
cc -c a.c && cc -c b.c && cc b.o a.o && objdump -M intel -S a.exe > 2.lss
从 dump 出来的 2.lss
中可以看到如下内容:
00000001400013a0 <blah>:
1400013a0: b8 01 00 00 00 mov eax, 0x1
1400013a5: c3 ret
1400013a6: cc int3
1400013a7: cc int3
1400013a8: cc int3
1400013a9: cc int3
1400013aa: cc int3
1400013ab: cc int3
1400013ac: cc int3
1400013ad: cc int3
1400013ae: cc int3
1400013af: cc int3
00000001400013b0 <.weak.blah.default.main>:
1400013b0: b8 02 00 00 00 mov eax, 0x2
1400013b5: c3 ret
对比可以看到,逗号隔开的 weak
和 aligned(32)
是同时生效的。