This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Re: section attribute producing invalid sized sections
- From: Brian Dessent <brian at dessent dot net>
- To: Noah W <jayhawk at soe dot ucsc dot edu>
- Cc: gcc-help at gcc dot gnu dot org
- Date: Fri, 28 Nov 2008 22:01:20 -0800
- Subject: Re: section attribute producing invalid sized sections
- References: <20744085.post@talk.nabble.com>
- Reply-to: gcc-help at gcc dot gnu dot org
Noah W wrote:
> I have attached a small test that demonstrates this. The size of the struct
> is 24 bytes. If I place 3 structs in to the section the size calculated by
> the difference between __start_ and __stop_ is 88, 16 more than I would
> expect.
The extra size is the padding added to keep each struct aligned to a 16-
byte boundary as required by the ABI. You can easily see what's going
on by looking at the assembly output that gcc produces with -S:
.file "tc.c"
.section section_test,"aw",@progbits
.align 16
.type entry_C.1557, @object
.size entry_C.1557, 24
entry_C.1557:
.zero 24
.align 16
.type entry_B.1556, @object
.size entry_B.1556, 24
entry_B.1556:
.zero 24
.align 16
.type entry_A.1555, @object
.size entry_A.1555, 24
entry_A.1555:
.zero 24
.text
.globl main
.type main, @function
main:
; and so on...
(Note when visually inspecting the assembly output you can add -fno-
asynchronous-unwind-tables to remove a lot of the clutter, but obviously
don't use that when compiling unless you know that it's safe.)
You can alter the default alignment if you want, e.g.
static struct dummy entry_A __attribute__((section("section_test"), aligned(8)));
static struct dummy entry_B __attribute__((section("section_test"), aligned(8)));
static struct dummy entry_C __attribute__((section("section_test"), aligned(8)));
But that's probably not a great idea because the default alignment
requirement is there to allow the use of sse2 vector instructions that
require aligned operands. By changing the alignment you either prevent
the compiler from using those instructions (if their definition was in
scope at the time) or worse, you risk a runtime illegal instruction
fault if you pass their address to a function that isn't aware of their
changed alignment and assumes it's safe to use vector instructions on
them.
Brian