fix PLT call offset in sh dlsym asm
authorRich Felker <dalias@aerifal.cx>
Sat, 18 Apr 2015 02:19:01 +0000 (22:19 -0400)
committerRich Felker <dalias@aerifal.cx>
Sat, 18 Apr 2015 02:19:01 +0000 (22:19 -0400)
the braf instruction's destination register is an offset from the
address of the braf instruction plus 4 (or equivalently, the address
of the next instruction after the delay slot). the code for dlsym was
incorrectly computing the offset to pass using the address of the
delay slot itself. in other places, a label was placed after the delay
slot, but I find this confusing. putting the label on the branch
instruction itself, and manually adding 4, makes it more clear which
branch the offset in the constant pool goes with.

src/ldso/sh/dlsym.s

index bc8fd6796d5a8d54747f4732dffc8da1c014a183..11a6fff5ff631c6208315331517b902c50d13035 100644 (file)
@@ -4,8 +4,8 @@
 .type   dlsym, @function
 dlsym:
        mov.l L1, r0
-       braf  r0
-1:      mov.l @r15, r6
+1:     braf  r0
+        mov.l @r15, r6
 
 .align 2
-L1:    .long __dlsym@PLT-(1b-.)
+L1:    .long __dlsym@PLT-(1b+4-.)