]> granicus.if.org Git - musl/commitdiff
work around breakage in sh/fdpic __unmapself function
authorRich Felker <dalias@aerifal.cx>
Tue, 22 Sep 2015 04:10:42 +0000 (04:10 +0000)
committerRich Felker <dalias@aerifal.cx>
Tue, 22 Sep 2015 04:10:42 +0000 (04:10 +0000)
the C implementation of __unmapself used for potentially-nommu sh
assumed CRTJMP takes a function descriptor rather than a code address;
however, the actual dynamic linker needs a code address, and so commit
7a9669e977e5f750cf72ccbd2614f8b72ce02c4c changed the definition of the
macro in reloc.h. this commit puts the old macro back in a place where
it only affects __unmapself.

this is an ugly workaround and should be cleaned up at some point, but
at least it's well isolated.

arch/sh/src/__unmapself.c

index 4df9e7bf5a61fc3fbf9564655b9e7f2f5c5c97d2..b804aeff7de6a4f16d62754135baa7f69a7ae5e3 100644 (file)
@@ -5,6 +5,11 @@ void __unmapself_sh_nommu(void *, size_t);
 
 #if !defined(__SH3__) && !defined(__SH4__)
 #define __unmapself __unmapself_sh_nommu
+#include "dynlink.h"
+#undef CRTJMP
+#define CRTJMP(pc,sp) __asm__ __volatile__( \
+       "mov.l @%0+,r0 ; mov.l @%0,r12 ; jmp @r0 ; mov %1,r15" \
+       : : "r"(pc), "r"(sp) : "r0", "memory" )
 #include "../../../src/thread/__unmapself.c"
 #undef __unmapself
 extern __attribute__((__visibility__("hidden"))) unsigned __sh_nommu;