diff options
author | Rich Felker <dalias@aerifal.cx> | 2015-09-22 04:10:42 +0000 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2015-09-22 04:10:42 +0000 |
commit | cab2b1f9d71db31d6dc4ae9dcab6989182b7b533 (patch) | |
tree | 59dc80b969ba128a5bcc8aa93d9e93ab00d3c6a6 /arch | |
parent | 7a9669e977e5f750cf72ccbd2614f8b72ce02c4c (diff) | |
download | musl-cab2b1f9d71db31d6dc4ae9dcab6989182b7b533.tar.gz |
work around breakage in sh/fdpic __unmapself function
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.
Diffstat (limited to 'arch')
-rw-r--r-- | arch/sh/src/__unmapself.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/arch/sh/src/__unmapself.c b/arch/sh/src/__unmapself.c index 4df9e7bf..b804aeff 100644 --- a/arch/sh/src/__unmapself.c +++ b/arch/sh/src/__unmapself.c @@ -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; |