From: Albert ARIBAUD <albert.u.boot@aribaud.net>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 1/4] arm64: Add tool to statically apply RELA relocations
Date: Tue, 8 Oct 2013 10:10:02 +0200 [thread overview]
Message-ID: <20131008101002.2dc8ee33@lilith> (raw)
In-Reply-To: <1381193746.7979.186.camel@snotra.buserror.net>
Hi Scott,
On Mon, 7 Oct 2013 19:55:46 -0500, Scott Wood <scottwood@freescale.com>
wrote:
> On Sat, 2013-10-05 at 09:52 +0200, Albert ARIBAUD wrote:
> > Hi Scott,
> >
> > On Thu, 3 Oct 2013 17:48:28 -0500, Scott Wood <scottwood@freescale.com>
> > wrote:
> >
> > > ARM64 uses the newer RELA-style relocations rather than the older REL.
> > > RELA relocations have an addend in the relocation struct, rather than
> > > expecting the loader to read a value from the location to be updated.
> > >
> > > While this is beneficial for ordinary program loading, it's problematic
> > > for U-Boot because the location to be updated starts out with zero,
> > > rather than a pre-relocation value. Since we need to be able to run C
> > > code before relocation, we need a tool to apply the relocations at
> > > build time.
> >
> > I love it when support for a feature which offers more capabilities is
> > replaced with support for one which offers less. What's the point of a
> > relocation system that produces a binary which will *never* work if
> > not relocated first? What's the point of zeroing position-dependent
> > locations instead of putting some useful value in it, like the value
> > they would have if no relocation occurred? :/
>
> Yeah, it's annoying. It also seems to affect gdb printing global
> variables before a program has started.
>
> > I really don't understand why REL-style relocation is impossible. Is it
> > an EABI specification? A toolchain limitation? A toolchain design
> > decision (i.e., a limitation that will not be lifted)?
>
> It looks like one of the latter two. I don't know which. I tried
> looking at the linker code to see if there was an option to switch, and
> had difficulty following it. If someone else wants to engage with the
> binutils people and get a REL option added, that'd be great, but I don't
> have the bandwidth right now, and in any case it would be a while before
> we could rely on such a solution.
>
> > OTOH, I don't have an EABI doc for arm64. Could someone just
> > copy-paster its URL to me? Thanks in advance.
>
> I don't know of an "E"ABI for arm64, but googling "aarch64 abi" turns up
> an ELF ABI document as the first result. I tried to copy and paste the
> URL but it's google-encoded crap, and it's PDF so I can't copy it from
> the browser window that opens.
>
> That document says that both REL and RELA are acceptable.
>
> > > In theory this tool is applicable to other newer architectures (mainly
> > > 64-bit), but currently the only relocations it supports are for arm64,
> > > and it assumes a 64-bit little-endian target. If the latter limitation
> > > is ever to be changed, we'll need a way to tell the tool what format
> > > the image is in. Eventually this may be replaced by a tool that uses
> > > libelf or similar and operates directly on the ELF file. I've written
> > > some code for such an approach but libelf does not make it easy to poke
> > > addresses by memory address (rather than by section), and I was
> > > hesitant to write code to manually parse the program headers and do the
> > > update outside of libelf (or to iterate over sections) -- especially
> > > since it wouldn't get test coverage on things like binaries with
> > > multiple PT_LOAD segments. This should be good enough for now to let
> > > the manual relocation stuff be removed from the arm64 patches.
> >
> > Can you clarify what makes this tool beneficial as opposed to e.g.
> > doing an objcopy from .elf to binary? After all, if we're going to
> > relocate at build time from address A to B, why not directly build
> > for address B, objcopy the resulting ELF and be done with it?
>
> We do use objcopy, but it doesn't apply the relocations. It doesn't
> matter what address we build for; if the relocations aren't applied, all
> to-be-relocated pointers will be zero.
Thanks Scott fot the heads-up. I have found the arm64 ABI and traced it
back to this URL:
<http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ihi0056b/index.html>
(Somehow the document can be read in Firefox but evince chokes on it)
I see that some relocation types are deemed mandatory (4.6.1, page 13)
and the way I read it, R_AARCH64_RELATIVE should be one of them...
I'll have a stab at investigating both binutil and gcc.
Meanwhile, even if we end up being able to use R_AARCH64_RELATIVE, part
of the patch series will remain useful, notably the filtering in the
makefile. I would just like a note added somewhere stating that this is
hopefully an interim solution until R_AARCH64_RELATIVE is available.
> -Scott
Amicalement,
--
Albert.
next prev parent reply other threads:[~2013-10-08 8:10 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-10-03 22:48 [U-Boot] [PATCH 0/4] arm64: rela relocation Scott Wood
2013-10-03 22:48 ` [U-Boot] [PATCH 1/4] arm64: Add tool to statically apply RELA relocations Scott Wood
2013-10-04 16:10 ` FengHua
2013-10-04 16:57 ` Scott Wood
2013-10-05 7:52 ` Albert ARIBAUD
2013-10-08 0:55 ` Scott Wood
2013-10-08 8:10 ` Albert ARIBAUD [this message]
2013-10-08 16:22 ` Scott Wood
2013-10-09 9:04 ` Albert ARIBAUD
2013-10-08 14:22 ` FengHua
2013-10-08 15:06 ` Scott Wood
2013-10-03 22:48 ` [U-Boot] [PATCH 2/4] arm64: Turn u-boot.bin back into an ELF file after relocate-rela Scott Wood
2013-10-03 22:48 ` [U-Boot] [PATCH 3/4] arm64: Non-manual relocation Scott Wood
2013-10-04 16:13 ` FengHua
2013-10-04 16:55 ` Scott Wood
2013-10-03 22:48 ` [U-Boot] [PATCH 4/4] arm64: Make checkarmreloc accept arm64 relocations Scott Wood
2013-10-04 15:55 ` [U-Boot] [PATCH 0/4] arm64: rela relocation FengHua
2013-10-05 7:55 ` Albert ARIBAUD
2013-10-07 16:43 ` Scott Wood
2013-10-08 3:32 ` FengHua
2013-10-08 8:13 ` Albert ARIBAUD
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=20131008101002.2dc8ee33@lilith \
--to=albert.u.boot@aribaud.net \
--cc=u-boot@lists.denx.de \
/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