mirror of git://git.musl-libc.org/musl
remove old dlstart stage-2 symbolic lookup code; add new generic
this new generic version of the stage-2 function lookup should work
for any arch where static data is accessible via got-relative or
pc-relative addressing, using approximately the technique described in
the log message for commit 2907afb8db
.
since all the mips-like archs that need got slots fo access static
data have already transitioned to the new stage chaining scheme, the
old dynamic symbol lookup code is now removed.
aarch64, arm, and sh have not yet transitioned; with this commit, they
are now using the new generic code.
This commit is contained in:
parent
12b0b7d8ea
commit
6fc30c2493
|
@ -9,6 +9,14 @@
|
|||
|
||||
#include "crt_arch.h"
|
||||
|
||||
#ifndef GETFUNCSYM
|
||||
#define GETFUNCSYM(fp, sym, got) do { \
|
||||
__attribute__((__visibility__("hidden"))) void sym(); \
|
||||
static void (*static_func_ptr)() = sym; \
|
||||
__asm__ __volatile__ ( "" : "+m"(static_func_ptr) : : "memory"); \
|
||||
*(fp) = static_func_ptr; } while(0)
|
||||
#endif
|
||||
|
||||
__attribute__((__visibility__("hidden")))
|
||||
void _dlstart_c(size_t *sp, size_t *dynv)
|
||||
{
|
||||
|
@ -74,23 +82,9 @@ void _dlstart_c(size_t *sp, size_t *dynv)
|
|||
*rel_addr = (size_t)base + rel[2];
|
||||
}
|
||||
|
||||
#ifndef GETFUNCSYM
|
||||
const char *strings = (void *)(base + dyn[DT_STRTAB]);
|
||||
const Sym *syms = (void *)(base + dyn[DT_SYMTAB]);
|
||||
|
||||
/* Call dynamic linker stage-2, __dls2 */
|
||||
for (i=0; ;i++) {
|
||||
const char *s = strings + syms[i].st_name;
|
||||
if (s[0]=='_' && s[1]=='_' && s[2]=='d'
|
||||
&& s[3]=='l' && s[4]=='s' && s[5]=='2' && !s[6])
|
||||
break;
|
||||
}
|
||||
((stage2_func)(base + syms[i].st_value))(base, sp);
|
||||
#else
|
||||
stage2_func dls2;
|
||||
GETFUNCSYM(&dls2, __dls2, base+dyn[DT_PLTGOT]);
|
||||
dls2(base, sp);
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue