public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
From: "Richard Earnshaw (lists)" <Richard.Earnshaw@arm.com>
To: Alexandru Onea <onea.alex@gmail.com>, binutils@sourceware.org
Subject: Re: arm-none-eabi-as: what decides .text section alignment/padding?
Date: Mon, 19 Jun 2023 14:31:38 +0100	[thread overview]
Message-ID: <b33d5578-d57e-305d-bdb4-1f32d50342bf@arm.com> (raw)
In-Reply-To: <CAJgSc4yuc2Rvdsi3SKCeBMK3dUB3qjONfLPRJHJ=w8X8y0mSXw@mail.gmail.com>

On 19/06/2023 08:14, Alexandru Onea via Binutils wrote:
> Hello, community!
> 
> I am playing with arm-none-eabi-as trying to understand how it aligns
> sections. I have the following source:
> 
> ; source.s
> .text
> .byte 0xff
> .byte 0xff
> .byte 0xff
> 
> I am inspecting the resulting object file:
> 
> $ arm-none-eabi-as -mthumb -o source.o source.s
> $ arm-none-eabi-readelf -S source.o
> There are 8 section headers, starting at offset 0xec:
> 
> Section Headers:
>    [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
>    [ 0]                   NULL            00000000 000000 000000 00
>   0   0  0*  [ 1] .text             PROGBITS        00000000 000034
> 000003 00  AX  0   0  1
> *  [ 2] .data             PROGBITS        00000000 000037 000000 00
> WA  0   0  1
>    [ 3] .bss              NOBITS          00000000 000037 000000 00  WA  0   0  1
>    [ 4] .ARM.attributes   ARM_ATTRIBUTES  00000000 000037 000014 00      0   0  1
>    [ 5] .symtab           SYMTAB          00000000 00004c 000060 10      6   6  4
>    [ 6] .strtab           STRTAB          00000000 0000ac 000004 00      0   0  1
>    [ 7] .shstrtab         STRTAB          00000000 0000b0 00003c 00      0   0  1
> 
> The .text section is byte-aligned and contains the 3 bytes.
> 
> Now, I add an instruction to source.s:
> 
> ; source.s
> .text
> .byte 0xff
> nop
> .byte 0xff
> .byte 0xff
> 
> Looking into the object file, now all of a sudden the .text section is
> halfword-aligned:
> 
> There are 8 section headers, starting at offset 0x114:
> 
> Section Headers:
>    [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
>    [ 0]                   NULL            00000000 000000 000000 00
>   0   0  0*  [ 1] .text             PROGBITS        00000000 000034
> 000006 00  AX  0   0  2
> *  [ 2] .data             PROGBITS        00000000 00003a 000000 00
> WA  0   0  1
>    [ 3] .bss              NOBITS          00000000 00003a 000000 00  WA  0   0  1
>    [ 4] .ARM.attributes   ARM_ATTRIBUTES  00000000 00003a 000014 00      0   0  1
>    [ 5] .symtab           SYMTAB          00000000 000050 000080 10      6   8  4
>    [ 6] .strtab           STRTAB          00000000 0000d0 000007 00      0   0  1
>    [ 7] .shstrtab         STRTAB          00000000 0000d7 00003c 00      0   0  1
> 
> What is causing the assembler to decide to pad the section in the second
> case? I am confused because:
> 
>     1. if the section is .data then the assembler will not pad it anyway,
>     which makes sense, but
>     2. even if the section is .text, the assembler won't pad it unless it
>     sees an instruction (I can have as many data directives, the section won't
>     be padded without having also an instruction), and finally
>     3. the nop instruction is definitely not aligned and the assembler has
>     no problem with it, but it still decides to care about section alignment.
> 
> How is the assembler deciding here to align and pad the section? Can I
> force the assembler to not pad the .text section even if I have an
> instruction?

You've told the assembler to interpret the contents of the source file 
as containing thumb instructions.  Thumb instructions must be (at least) 
two byte aligned (the fact that your source file deliberately misaligns 
the instruction is a bug in your code).  If the section were not aligned 
then the linker would not be able to correctly merge consecutive 
sections if you had a mix of data-only text sections (like your first 
example) and sections containing code.

Note that if you had used -marm instead of -mthumb the alignment would 
be set to 4 as all 'arm' instructions must be 4-byte aligned.

R.


  reply	other threads:[~2023-06-19 13:31 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-06-19  7:14 Alexandru Onea
2023-06-19 13:31 ` Richard Earnshaw (lists) [this message]
2023-06-19 16:01   ` Alexandru Onea
2023-06-19 16:22     ` Richard Earnshaw (lists)
2023-06-19 16:39       ` Alexandru Onea

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=b33d5578-d57e-305d-bdb4-1f32d50342bf@arm.com \
    --to=richard.earnshaw@arm.com \
    --cc=binutils@sourceware.org \
    --cc=onea.alex@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).