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; | 
