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

对比可以看到,逗号隔开的 weakaligned(32) 是同时生效的。