superh: fix dynamic linking of __fpscr_values
authorBobby Bingham <koorogi@koorogi.info>
Sun, 16 Mar 2014 21:17:28 +0000 (16:17 -0500)
committerBobby Bingham <koorogi@koorogi.info>
Sun, 16 Mar 2014 21:17:28 +0000 (16:17 -0500)
Applications ended up with copy relocations for this array, which
resulted in libc's references to this array pointing to the
application's copy.  The dynamic linker, however, can require this array
before the application is relocated, and therefore before the
application's copy of this array is initialized.  This resulted in
garbage being loaded into FPSCR before executing main, which violated
the ABI.

We fix this by putting the array in crt1 and making the libc copy
private.  This prevents libc's reference to the array from pointing to
an uninitialized copy in the application.

arch/sh/crt_arch.h
arch/sh/src/__fpsrc_values.c

index a69d1c9fdbd9e9fffd54b0563711cfc35cf28f0f..5fd39fc64d59fa1506fe1c8877008bb47986d953 100644 (file)
@@ -7,3 +7,6 @@ _start: \n\
        bsr __cstart \n\
        nop \n\
 ");
+
+/* used by gcc for switching the FPU between single and double precision */
+const unsigned long __fpscr_values[2] = { 0, 0x80000 };
index 560566176e4257ecb1b974be1430fc94dfe145b2..64b458f9fbba1d05f7ffb2d85c0192334551f129 100644 (file)
@@ -1,2 +1,5 @@
+#include "libc.h"
+
 /* used by gcc for switching the FPU between single and double precision */
-const unsigned long __fpscr_values[2] = { 0, 0x80000 };
+const unsigned long __fpscr_values[2] ATTR_LIBC_VISIBILITY = { 0, 0x80000 };
+