PLT Problems in uBoot on MCF548x
Peter LaDow
pladow@gmail.com
Wed Jul 31 17:13:02 GMT 2024
Ok, I did some reading through the SysV M68K ABI (part3 here:
https://m680x0.github.io/ref/sysv-m68k-abi-part3.pdf).
I see in my earlier analysis:
00023ad4 <.plt>:
23ad4: 203c 0000 c95a movel #51546,%d0
23ada: 2f3b 08fa movel %pc@(23ad6 <.plt+0x2>,%d0:l),%sp@-
23ade: 203c 0000 c954 movel #51540,%d0
23ae4: 207b 08fa moveal %pc@(23ae0 <.plt+0xc>,%d0:l),%a0
23ae8: 4ed0 jmp %a0@
This load of A0 is with the address of the dynamic linker. So, this
PC relative load of 0x30434 (at "got_plus_8" as the ABI calls it) is
the dynamic linker. Per the ABI: "The program then jumps to the
address in the third global offset table entry (got_plus_8), which
transfers control to the dynamic linker."
And prior to that, it "places the value of the second global offset
table entry (got_plus_4) on the stack, thus giving the dynamic linker
one long word of identifying information."
But looking at the final linked output, both got_plus_4 and got_plus_8 are 0:
Contents of section .got.plt:
3042c 0003037c 00000000 00000000 00023af8 ...|..........:.
3043c 00023b10 00023b28 00023b40 00023b58 ..;...;(..;@..;X
3044c 00023b70 00023b88 00023ba0 00023bb8 ..;p..;...;...;.
3045c 00023bd0 00023be8 00023c00 00023c18 ..;...;...<...<.
3046c 00023c30 00023c48 00023c60 00023c78 ..<0..<H..<`..<x
3047c 00023c90 ..<.
So, what *should* be in got_plus_4 and got_plus_8? How do these
entries get populated?
(Note: I see this same set of 0's in got_plus_4 and got_plus_8 on the
MCF5445x, which they claim works.)
On Wed, Jul 31, 2024 at 7:59 AM Peter LaDow <pladow@gmail.com> wrote:
>
> With "readelf -e" there is a single RELA section: .rela.dyn. This is
> handled later in the code when the code itself is relocated to RAM.
> At this point, the code is executing from flash.
>
> There are R_68K_RELATIVE, R_68K_32, and R_68K_JMP_SLOT entries when I
> use "readelf -r."
>
> One of these does map to memset. The first lookup in the PLT:
>
> 23c0c: 203c 0000 c85a movel #51290,%d0
> 23c12: 207b 08fa moveal %pc@(23c0e <.plt+0x13a>,%d0:l),%a0
> 23c16: 4ed0 jmp %a0@
>
> Does map to memset:
>
> $ m68k-linux-gnu-readelf -r u-boot
> ...
> 00030468 00005315 R_68K_JMP_SLOT 0001f0b0 memset + 0
> ...
>
> And indeed, memset is at 0x1f0b0:
>
> $ m68k-linux-gnu-nm -n u-boot
> ...
> 0001f0b0 T memset
> ...
>
> But it's not clear to me how this information is used by the PLT.
>
> I'm not sure what you mean about "relocations against the relevant
> .got.plt entry." I don't see anything that points to any addresses in
> .got.plt.
>
> And finally, your question about if the "relocations applied early
> enough." I don't think so. The startup code does not do any
> relocations at this point. There is code to relocate uboot out of
> flash to RAM, but we aren't there yet. This uses __rel_dyn_start and
> __rel_dyn_end, but this happens after the system is configured (SDRAM,
> etc.). Indeed, relocation is the very last step before entering the
> main loop.
>
> There is another platform, the MCF5445x, which I've used as a model.
> This too uses PLT (rather than GOT160 relocations as other Coldfire
> platforms do). My startup code is nearly identical (I stripped on the
> NAND boot and SBF). And that code does not do any fixups or other
> relocations until later.
>
>
>
> On Tue, Jul 30, 2024 at 5:03 PM Alan Modra <amodra@gmail.com> wrote:
> >
> > On Tue, Jul 30, 2024 at 12:28:13PM -0700, Peter LaDow wrote:
> > > 68k-linux-ld.bfd -n -pie -z noexecstack --no-warn-rwx-segments
> > > --gc-sections -pie -Bstatic --no-dynamic-linker -z notext
> > > --build-id=none -Ttext 0x0 -o u-boot -T u-boot.lds
> > > arch/m68k/cpu/mcf548x/start.o --whole-archive (... snipped for
> > > brevity) --no-whole-archive arch/m68k/lib/lib.a -Map u-boot.map
> >
> > Have you examined u-boot using readelf to see whether there are any
> > RELA type sections? If so, do you see a relocation against the
> > relevant .got.plt entry? Also, are these relocations applied early
> > enough, ie. before the board_init.c memset call?
> >
> > --
> > Alan Modra
>
>
>
> --
> To love for the sake of being loved is human, but to love for the sake
> of loving is angelic. -- Alphonse de Lamartine.
--
To love for the sake of being loved is human, but to love for the sake
of loving is angelic. -- Alphonse de Lamartine.
More information about the Binutils
mailing list