From 8c0a3d9e5c169fc9d0f246ab59362b658b029ad7 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Sat, 29 Sep 2012 01:05:31 -0400 Subject: 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. --- arch/microblaze/reloc.h | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 arch/microblaze/reloc.h (limited to 'arch/microblaze/reloc.h') 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 +#include + +#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]; +} -- cgit v1.2.1