GCC __attribute__ For Multiple Attributes

When you want to write multiple attributes, you can write all of them inside one __attribute__(()).

e.g.

This is 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;
}

This is b.c:

int blah(void) {
    return 1;
}

Compile and dump:

cc -c a.c && cc -c b.c && cc b.o a.o && objdump -M intel -S a.exe > 1.lss

In the dumped file 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

Then change a.c like this:

#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;
}

Re-compile and dump:

cc -c a.c && cc -c b.c && cc b.o a.o && objdump -M intel -S a.exe > 2.lss

In the dumped file 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

By comparing the dumped files, you can see that both the weak and aligned(32) are working.