diff options
author | Rich Felker <dalias@aerifal.cx> | 2012-07-11 04:22:13 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2012-07-11 04:22:13 -0400 |
commit | 6315004f6102dca44c4ba50654a36967b8b9c2a6 (patch) | |
tree | 7b48d4ac93ecb9993ffc2d01c8762a4e954d4000 /arch/mips/reloc.h | |
parent | cd8d72451662f0157d06fcf666669db543dcea3b (diff) | |
download | musl-6315004f6102dca44c4ba50654a36967b8b9c2a6.tar.gz musl-6315004f6102dca44c4ba50654a36967b8b9c2a6.tar.bz2 musl-6315004f6102dca44c4ba50654a36967b8b9c2a6.tar.xz musl-6315004f6102dca44c4ba50654a36967b8b9c2a6.zip |
initial version of mips (o32) port, based on work by Richard Pennington (rdp)
basically, this version of the code was obtained by starting with
rdp's work from his ellcc source tree, adapting it to musl's build
system and coding style, auditing the bits headers for discrepencies
with kernel definitions or glibc/LSB ABI or large file issues, fixing
up incompatibility with the old binutils from aboriginal linux, and
adding some new special cases to deal with the oddities of sigaction
and pipe syscall interfaces on mips.
at present, minimal test programs work, but some interfaces are broken
or missing. threaded programs probably will not link.
Diffstat (limited to 'arch/mips/reloc.h')
-rw-r--r-- | arch/mips/reloc.h | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/arch/mips/reloc.h b/arch/mips/reloc.h new file mode 100644 index 00000000..76df112a --- /dev/null +++ b/arch/mips/reloc.h @@ -0,0 +1,23 @@ +#include <string.h> +#include <elf.h> + +#define ETC_LDSO_PATH "/etc/ld-musl-mips.path" + +#define IS_COPY(x) ((x)==R_MIPS_COPY) +#define IS_PLT(x) ((x)==R_MIPS_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_MIPS_JUMP_SLOT: + *reloc_addr = sym_val; + break; + case R_MIPS_REL32: + // FIXME: how do symbolic relocs come in here ? + *reloc_addr += (size_t)base_addr; + break; + case R_MIPS_COPY: + memcpy(reloc_addr, (void *)sym_val, sym_size); + break; + } +} |