diff options
Diffstat (limited to 'arch/sh/reloc.h')
-rw-r--r-- | arch/sh/reloc.h | 18 |
1 files changed, 8 insertions, 10 deletions
diff --git a/arch/sh/reloc.h b/arch/sh/reloc.h index a1393bb3..9090ee3b 100644 --- a/arch/sh/reloc.h +++ b/arch/sh/reloc.h @@ -18,30 +18,28 @@ static inline int do_single_reloc( switch(type) { case R_SH_GLOB_DAT: case R_SH_JMP_SLOT: - *reloc_addr = sym_val; + case R_SH_DIR32: + *reloc_addr = sym_val + addend; break; case R_SH_RELATIVE: *reloc_addr = (size_t)base_addr + addend; break; - case R_SH_DIR32: - *reloc_addr = sym_val + addend; - break; case R_SH_REL32: - *reloc_addr = sym_val + addend - (size_t)reloc_addr + (size_t)base_addr; + *reloc_addr = sym_val + addend - (size_t)reloc_addr; break; case R_SH_COPY: memcpy(reloc_addr, (void *)sym_val, sym_size); break; case R_SH_TLS_DTPMOD32: - *reloc_addr += def.dso ? def.dso->tls_id : self->tls_id; + *reloc_addr = def.dso ? def.dso->tls_id : self->tls_id; break; case R_SH_TLS_DTPOFF32: - *reloc_addr += def.sym->st_value; + *reloc_addr = def.sym->st_value + addend; break; case R_SH_TLS_TPOFF32: - *reloc_addr += def.sym - ? def.sym->st_value + def.dso->tls_offset + 8 - : self->tls_offset + 8; + *reloc_addr = (def.sym + ? def.sym->st_value + def.dso->tls_offset + : self->tls_offset) + 8 + addend; break; } return 0; |