diff options
author | Rich Felker <dalias@aerifal.cx> | 2014-06-18 02:44:02 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2014-06-18 02:44:02 -0400 |
commit | adf94c19666e687a728bbf398f9a88ea4ea19996 (patch) | |
tree | 8393ad8b9c7db518d0351b36cccc4930614146f6 /arch/i386 | |
parent | 94cf991bf4b18bb87a15a96e7b5e7d92fab787ba (diff) | |
download | musl-adf94c19666e687a728bbf398f9a88ea4ea19996.tar.gz musl-adf94c19666e687a728bbf398f9a88ea4ea19996.tar.bz2 musl-adf94c19666e687a728bbf398f9a88ea4ea19996.tar.xz musl-adf94c19666e687a728bbf398f9a88ea4ea19996.zip |
refactor to remove arch-specific relocation code from dynamic linker
this was one of the main instances of ugly code duplication: all archs
use basically the same types of relocations, but roughly equivalent
logic was duplicated for each arch to account for the different naming
and numbering of relocation types and variation in whether REL or RELA
records are used.
as an added bonus, both REL and RELA are now supported on all archs,
regardless of which is used by the standard toolchain.
Diffstat (limited to 'arch/i386')
-rw-r--r-- | arch/i386/reloc.h | 41 |
1 files changed, 11 insertions, 30 deletions
diff --git a/arch/i386/reloc.h b/arch/i386/reloc.h index bc86e96e..12224b79 100644 --- a/arch/i386/reloc.h +++ b/arch/i386/reloc.h @@ -3,48 +3,29 @@ #define LDSO_ARCH "i386" -#define IS_COPY(x) ((x)==R_386_COPY) -#define IS_PLT(x) ((x)==R_386_JMP_SLOT) - -static inline int do_single_reloc( - struct dso *self, unsigned char *base_addr, - size_t *reloc_addr, int type, size_t addend, - Sym *sym, size_t sym_size, - struct symdef def, size_t sym_val) +static int remap_rel(int type) { switch(type) { case R_386_32: - *reloc_addr += sym_val; - break; + return REL_SYMBOLIC; case R_386_PC32: - *reloc_addr += sym_val - (size_t)reloc_addr; - break; + return REL_OFFSET; case R_386_GLOB_DAT: + return REL_GOT; case R_386_JMP_SLOT: - *reloc_addr = sym_val; - break; + return REL_PLT; case R_386_RELATIVE: - *reloc_addr += (size_t)base_addr; - break; + return REL_RELATIVE; case R_386_COPY: - memcpy(reloc_addr, (void *)sym_val, sym_size); - break; + return REL_COPY; case R_386_TLS_DTPMOD32: - *reloc_addr = def.dso ? def.dso->tls_id : self->tls_id; - break; + return REL_DTPMOD; case R_386_TLS_DTPOFF32: - *reloc_addr = def.sym->st_value; - break; + return REL_DTPOFF; case R_386_TLS_TPOFF: - *reloc_addr += def.sym - ? def.sym->st_value - def.dso->tls_offset - : 0 - self->tls_offset; - break; + return REL_TPOFF; case R_386_TLS_TPOFF32: - *reloc_addr += def.sym - ? def.dso->tls_offset - def.sym->st_value - : self->tls_offset; - break; + return REL_TPOFF_NEG; } return 0; } |