X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=ldso%2Fdlstart.c;h=259f5e18eecf881ff1cf27c3b4ce6c0fc0899e5f;hb=269d193820342dc109f39909d78fb30f4c978f76;hp=4482d5250b8255265d894ea7b12f2eb7fd12ca56;hpb=5552ce52000855906a5cb4f08f2e456573cca51f;p=musl diff --git a/ldso/dlstart.c b/ldso/dlstart.c index 4482d525..259f5e18 100644 --- a/ldso/dlstart.c +++ b/ldso/dlstart.c @@ -1,22 +1,24 @@ #include #include "dynlink.h" +#include "libc.h" #ifndef START #define START "_dlstart" #endif +#define SHARED + #include "crt_arch.h" #ifndef GETFUNCSYM #define GETFUNCSYM(fp, sym, got) do { \ - __attribute__((__visibility__("hidden"))) void sym(); \ + 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) +hidden void _dlstart_c(size_t *sp, size_t *dynv) { size_t i, aux[AUX_CNT], dyn[DYN_CNT]; size_t *rel, rel_size, base; @@ -138,6 +140,21 @@ void _dlstart_c(size_t *sp, size_t *dynv) size_t *rel_addr = (void *)(base + rel[0]); *rel_addr = base + rel[2]; } + + rel = (void *)(base+dyn[DT_RELR]); + rel_size = dyn[DT_RELRSZ]; + size_t *relr_addr = 0; + for (; rel_size; rel++, rel_size-=sizeof(size_t)) { + if ((rel[0]&1) == 0) { + relr_addr = (void *)(base + rel[0]); + *relr_addr++ += base; + } else { + for (size_t i=0, bitmap=rel[0]; bitmap>>=1; i++) + if (bitmap&1) + relr_addr[i] += base; + relr_addr += 8*sizeof(size_t)-1; + } + } #endif stage2_func dls2;