diff options
author | Rich Felker <dalias@aerifal.cx> | 2012-09-29 01:05:31 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2012-09-29 01:05:31 -0400 |
commit | 8c0a3d9e5c169fc9d0f246ab59362b658b029ad7 (patch) | |
tree | 6ac54202768db511e8bb959d85060adb98cbf226 /arch/microblaze/reloc.h | |
parent | e0ea44cb764fcdbe8515f22096930bede2c7896f (diff) | |
download | musl-8c0a3d9e5c169fc9d0f246ab59362b658b029ad7.tar.gz |
microblaze port
based on initial work by rdp, with heavy modifications. some features
including threads are untested because qemu app-level emulation seems
to be broken and I do not have a proper system image for testing.
Diffstat (limited to 'arch/microblaze/reloc.h')
-rw-r--r-- | arch/microblaze/reloc.h | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/arch/microblaze/reloc.h b/arch/microblaze/reloc.h new file mode 100644 index 00000000..9f04f125 --- /dev/null +++ b/arch/microblaze/reloc.h @@ -0,0 +1,41 @@ +#include <string.h> +#include <elf.h> + +#define ETC_LDSO_PATH "/etc/ld-musl-microblaze.path" + +#define IS_COPY(x) ((x)==R_MICROBLAZE_COPY) +#define IS_PLT(x) ((x)==R_MICROBLAZE_JUMP_SLOT) + +static inline void do_single_reloc(size_t *reloc_addr, int type, size_t sym_val, size_t sym_size, unsigned char *base_addr, size_t addend) +{ + switch(type) { + case R_MICROBLAZE_32: + case R_MICROBLAZE_GLOB_DAT: + case R_MICROBLAZE_JUMP_SLOT: + *reloc_addr = sym_val + addend; + break; + case R_MICROBLAZE_REL: + *reloc_addr = (size_t)base_addr + addend; + break; + case R_MICROBLAZE_COPY: + memcpy(reloc_addr, (void *)sym_val, sym_size); + break; + } +} + +#include "syscall.h" +void __reloc_self(int c, size_t *a, size_t *dynv) +{ + char dot = '.', ex = 'x'; + char *base; + size_t t[20], n; + for (a+=c+1; *a; a++); + for (a++; *a; a+=2) if (*a<20) t[*a] = a[1]; + base = (char *)t[AT_BASE]; + if (!base) base = (char *)(t[AT_PHDR] & -4096); + for (a=dynv; *a; a+=2) if (*a<20) t[*a] = a[1]; + n = t[DT_RELASZ]; + for (a=(void *)(base+t[DT_RELA]); n; a+=3, n-=12) + if (a[1]%256 == R_MICROBLAZE_REL) + *(size_t *)(base+a[0]) = (size_t)base + a[2]; +} |