This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
GAS: Maximum alignment of variables in custom sections
- From: Matthew Fernandez <matthew dot fernandez at gmail dot com>
- To: binutils at sourceware dot org
- Date: Sun, 26 Jul 2015 10:06:20 +1000
- Subject: GAS: Maximum alignment of variables in custom sections
- Authentication-results: sourceware.org; auth=none
Hi binutils folks,
This question is about targeting ARM using GAS from an x86_64 host, so apologies if this is the wrong place for such issues.
For some reason GAS seems to limit the maximum alignment constraint of variables to 15 bits:
$ cat foo.c
char foo[1] __attribute__((aligned(1 << 16))) __attribute__((section("bar")));
$ arm-none-eabi-gcc -c foo.c
/tmp/ccR55qTB.s: Assembler messages:
/tmp/ccR55qTB.s:15: Error: alignment too large: 15 assumed
This constraint does not seem to exist in Clang:
$ clang -target arm-none-eabi -integrated-as -c foo.c
$ echo $?
0
This only appears to affect variables in custom sections, as otherwise GCC emits a .comm directive instead of .align,
which GAS does not appear to constrain. My version of GAS is "GNU assembler (2.24-2ubuntu2+4) 2.24", but this limitation
seems to be in the current tip of binutils:
// gas/config/tc-arm.c:2980 @ f0b0791b05ed335e5d74d843d828645805db1f9c
long max_alignment = 15;
My question is, why is this limit is 15 bits? I'm not aware of anything in the hardware/ELF specs that would prevent
larger alignment. The limitation seems to vary across targets and it is not clear where the value of 15 for ARM is
derived from. Please CC me directly in replies as I'm not on the list.
Thanks,
Matthew