fix ld-behavior-dependent crash in ppc64 ldso startup
authorRich Felker <dalias@aerifal.cx>
Wed, 8 Mar 2017 18:35:33 +0000 (13:35 -0500)
committerRich Felker <dalias@aerifal.cx>
Wed, 8 Mar 2017 18:35:33 +0000 (13:35 -0500)
the 32-bit pc-relative address for stage 2 of dynamic linker entry was
wrongly loaded with a zero-extending load instead of sign-extending
load, resulting in an invalid jump if the offset happened to be
negative, which depends on the linker's ordering of text sections.

arch/powerpc64/reloc.h

index e1bad009de9bc9726c4215a40623eebfeb8b42b4..faf70acd752c6f950ba6126cd09b75624fc0abf9 100644 (file)
@@ -27,6 +27,6 @@
        "       bl 1f \n" \
        "       .long " #sym "-. \n" \
        "1:     mflr %1 \n" \
-       "       lwz %0, 0(%1) \n" \
+       "       lwa %0, 0(%1) \n" \
        "       add %0, %0, %1 \n" \
        : "=r"(*(fp)), "=r"((long){0}) : : "memory", "lr" )