From: "Richard Earnshaw (lists)" <Richard.Earnshaw@arm.com>
To: Alexandre Oliva <oliva@adacore.com>, binutils@sourceware.org
Subject: Re: impredictable alignment on ARM
Date: Tue, 03 Mar 2020 15:06:00 -0000 [thread overview]
Message-ID: <b425ae3f-c360-f3bc-e627-b9d0c2d915c6@arm.com> (raw)
In-Reply-To: <oreeus8zcn.fsf@livre.home>
On 18/02/2020 01:21, Alexandre Oliva wrote:
> Consider the following asm input:
>
> .thumb
> .text
> ldr r1, 0f
> 0f: .word 0x12345678
>
> In this case, we report the word is misaligned and fail, though the
> section is aligned to 2-byte boundaries, so the word *might* be properly
> aligned, after all, if only the previous linked section enabled the text
> section above to start 2 bytes after a 4-byte aligned address. Anyway,
> we probably don't want to worry about this case.
>
> However, I think we should be concerned about the converse case:
>
> .thumb
> .text
> ldr r1, 0f
> ldr r2, 1f
> 0f: .word 0x01234567
> 1f: .word 0x89abcdef
> nop
>
> We do NOT report an error here, but if this text segment gets placed at
> a 2-byte offset from a 4-byte aligned address (e.g., link the object
> file in twice), the second pair will have misaligned words, and the
> PC-relative offsets will resolve to aligned words that contain only part
> of the word to be loaded.
>
>
> The following patchlet arranges for us to complain when the target of
> such an ldr doesn't ensure the expected alignment. However, it's not
> quite enough to solve the general problem. Consider:
>
> .thumb
> .text
> ldr sp, 0f
> 0f: .word 0x80000000
>
> This extended form of ldr takes 4 bytes, and it doesn't require nor
> ensure the target word to be aligned to a 4-byte boundary. It just so
> happens that, if it's not aligned, the value loaded into the register is
> a rotated version of the word containing the misaligned address.
>
> I'm not sure it would be appropriate for us to reject potentially
> misaligned words: there might be (obfuscated) code intended to detect
> and behave differently depending on whether it ends up at an even or odd
> half-word.
>
> However, I think it would be nice for us to at least warn that the code
> might behave differently depending on the actual alignment it gets. I'm
> thinking something as simple as tracking the max natural alignment used
> in each segment, and warning of potental linker-induced behavior changes
> if that alignment is not recorded for the segment.
>
> Tracking symbols with their natural alignments, and maybe even
> references to them that expect a certain alignment, might be pushing too
> far, on the one hand, and still missing relevant cases of separate
> compilation or complex address computations on the other.
>
> Is this something we might want to pursue, so as to warn even for e.g.:
>
> .text
> .word 0
>
> but limited to once per segment?
>
> Or should we track and warn about PC-relative addressing requirements,
> so as to warn about segments containing PC-relative addressing (in
> whatever forms) whose expected alignment exceeds the section's? (this
> could miss e.g. setting a register to PC + offset, and then loading a
> word at the address stored in the register)
>
> A combination of these?
>
> Thoughts?
>
Hmm, interesting issue. Given that we have .word and .4byte for all arm
targets, where .4byte is intended to support deliberately unspecified
alignment, I think it would be quite reasonable to warn whenever .word
appears in a section with less than 4-byte alignment.
>
> Here's the patchlet that covers only the PCrel-load-to-low-reg case:
>
> --- gas/config/tc-arm.c 2020-01-28 12:50:34.000000000 +0100
> +++ gas/config/tc-arm.c 2020-02-18 00:13:11.486184639 +0100
> @@ -28755,6 +28755,9 @@
> (((unsigned long) fixP->fx_frag->fr_address
> + (unsigned long) fixP->fx_where) & ~3)
> + (unsigned long) value);
> + else if (get_recorded_alignment (seg) < 2)
> + as_warn_where (fixP->fx_file, fixP->fx_line,
> + _("segment does not ensure enough alignment for target word"));
>
> if (value & ~0x3fc)
> as_bad_where (fixP->fx_file, fixP->fx_line,
>
>
This is OK.
R.
prev parent reply other threads:[~2020-03-03 15:06 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-02-18 1:21 Alexandre Oliva
2020-03-03 15:06 ` Richard Earnshaw (lists) [this message]
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=b425ae3f-c360-f3bc-e627-b9d0c2d915c6@arm.com \
--to=richard.earnshaw@arm.com \
--cc=binutils@sourceware.org \
--cc=oliva@adacore.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).