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.