[PATCH RFC] Add support for non-contiguous memory regions
Christophe Lyon
christophe.lyon@linaro.org
Tue Dec 3 13:27:00 GMT 2019
On Mon, 2 Dec 2019 at 12:05, Simon Richter <Simon.Richter@hogyros.de> wrote:
>
> Hi,
>
> On Mon, Dec 02, 2019 at 10:56:22AM +0100, Christophe Lyon wrote:
>
> > > > The attached patches implement support for non-contiguous memory
> > > > regions
>
> > > How does this interact with relaxations?
>
> > I haven't tested that specifically yet. Do you have a target /
> > testcase in mind that I could check?
>
> A quick testcase would be on PowerPC:
>
> Assembler file "test.S"
>
> .machine "ppc"
>
> .section .text.one
> b 2f
>
> .section .text.two
> 2:
> nop
>
> Linker script "test.ld"
>
> MEMORY {
> one (RXAI) : ORIGIN = 0x00000000, LENGTH = 0x10000000
> two (RXAI) : ORIGIN = 0x20000000, LENGTH = 0x10000000
> }
>
> SECTIONS {
> one : {
> *(.text.one)
> } > one
> two : {
> *(.text.two)
> } > two
> }
>
> Assemble:
>
> $ as -o test.o test.S
>
> Disassemble:
>
> $ objdump -dr test.o
>
> test.o: file format elf64-powerpcle
>
>
> Disassembly of section .text.one:
>
> 0000000000000000 <.text.one>:
> 0: 00 00 00 48 b 0x0
> 0: R_PPC64_REL24 .text.two
>
> Disassembly of section .text.two:
>
> 0000000000000000 <.text.two>:
> 0: 00 00 00 60 nop
>
> Link:
>
> $ ld -o test -T test.ld --relax test.o
>
> Disassemble:
>
> $ objdump -dr test
>
> test: file format elf64-powerpcle
>
> Disassembly of section one:
>
> 0000000000000000 <0000001b.plt_branch.1c:5>:
> 0: 08 80 82 e9 ld r12,-32760(r2)
> 4: a6 03 89 7d mtctr r12
> 8: 20 04 80 4e bctr
> ...
> 20: e0 ff ff 4b b 0 <0000001b.plt_branch.1c:5>
>
> Disassembly of section two:
>
> 0000000020000000 <two>:
> 20000000: 00 00 00 60 nop
>
> The linker generates the trampoline as the branch displacement doesn't fit
> the instruction, extending the section size by 12 bytes. This happens after
> addresses are assigned, because that is when the linker learns that the
> displacement is too large.
>
> There is also the opposite case, where branch instructions are replaced by
> shorter variants on some architectures during relaxation, but I don't have
> an example immediately ready.
>
> The desired behaviour for the combination of non-contiguous regions and
> relaxations should probably be defined by someone from the core team --
> probably locking out the combination (like "-r --relax" on PowerPC) or just
> ensuring that it doesn't crash is the sanest thing to do here.
>
Whether the new option is enabled or not, my patch has no impact on
your testcase, because the memory regions are large enough to contain
all the code.
If I modify your linker script to reduce the length of memory region
"one" to 0x10, the testcase fails to link (as expected) with:
a.out section `one' will not fit in region `one'
If I use --enable-non-contiguous-regions, link succeeds, the "one"
section is silently discarded from the output (and no trampoline
either).
This is not a user-friendly behaviour :-) I'm checking how to keep the
proper error message instead.
> Simon
More information about the Binutils
mailing list