Port-arm archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: [PATCH] thumb fixes



On Fri, Sep 05, 2008 at 10:39:09AM +0100, Richard Earnshaw wrote:
> Hmm, I remember now.  I think this is an LD bug.  When thumb code calls
> a PLT entry it needs to use an interworking call sequence (the BL needs
> to be turned into BLX on v5t).  LD doesn't realize this because the PLT
> sequence is internally generated.
> 
> I believe this has been fixed in FSF binutils, but probably not in
> NetBSD's in-tree version (and I can't remember if this was ever fixed in
> a GPLv2 release).

Ok, I was already browsing through
http://cvsweb.netbsd.org/bsdweb.cgi/src/gnu/dist/binutils/bfd/elf32-arm.c?rev=1.1.1.1&content-type=text/x-cvsweb-markup
and others which are involved in generating the plt stuff. 

> > If there only was a way to force the plt section to be in ARM mode...
> 
> The PLT *is* in ARM mode...  Your problem is that you're calling it from
> Thumb :-(

Ok.

> There is a work-around, but it costs a bit in both performance and code
> size.  You can build all your thumb code with -mlong-calls.  Doing this
> will mean that the compiler will only use BL when it can prove that the
> call will be non-interworking at compile time (ie a static function).  

-mlong-calls indeed fixes /bin/cat, when ld.elf_so is in ARM mode.
/bin/sh instead segfaults, but that problem seems to be within libc
which propably has a number of problematic entry and exit points.
I'm running /bin/sh with libraries and linkers in a chroot, so gdb
can not get me a backtrace easily.

With -mlong-calls the plt sections looks ok:

00008908 <.plt>:
    8908:       e52de004        str     lr, [sp, #-4]!
    890c:       e59fe004        ldr     lr, [pc, #4]    ; 8918 <.plt+0x10>
    8910:       e08fe00e        add     lr, pc, lr
    8914:       e5bef008        ldr     pc, [lr, #8]!
    8918:       000091f0        streqd  r9, [r0], -r0
    891c:       e28fc600        add     ip, pc, #0      ; 0x0
    8920:       e28cca09        add     ip, ip, #36864  ; 0x9000
    8924:       e5bcf1f0        ldr     pc, [ip, #496]!
    8928:       e28fc600        add     ip, pc, #0      ; 0x0
    892c:       e28cca09        add     ip, ip, #36864  ; 0x9000
    8930:       e5bcf1e8        ldr     pc, [ip, #488]!
    8934:       e28fc600        add     ip, pc, #0      ; 0x0
    8938:       e28cca09        add     ip, ip, #36864  ; 0x9000
    893c:       e5bcf1e0        ldr     pc, [ip, #480]!
    8940:       e28fc600        add     ip, pc, #0      ; 0x0
    8944:       e28cca09        add     ip, ip, #36864  ; 0x9000
    8948:       e5bcf1d8        ldr     pc, [ip, #472]!
...

-Mikko


Home | Main Index | Thread Index | Old Index