1
1
mirror of https://github.com/rui314/mold.git synced 2024-09-20 09:27:45 +03:00
This commit is contained in:
Rui Ueyama 2022-09-26 17:33:02 +08:00
parent c623b4e3f0
commit 07ecfbcfe1
6 changed files with 42 additions and 39 deletions

View File

@ -119,17 +119,20 @@ void EhFrameSection<E>::apply_reloc(Context<E> &ctx, const ElfRel<E> &rel,
u8 *loc = ctx.buf + this->shdr.sh_offset + offset;
switch (rel.r_type) {
case R_NONE:
break;
case R_AARCH64_ABS64:
*(ul64 *)loc = val;
return;
break;
case R_AARCH64_PREL32:
*(ul32 *)loc = val - this->shdr.sh_addr - offset;
return;
break;
case R_AARCH64_PREL64:
*(ul64 *)loc = val - this->shdr.sh_addr - offset;
return;
break;
default:
Fatal(ctx) << "unsupported relocation in .eh_frame: " << rel;
}
Fatal(ctx) << "unsupported relocation in .eh_frame: " << rel;
}
template <>

View File

@ -132,15 +132,16 @@ void EhFrameSection<E>::apply_reloc(Context<E> &ctx, const ElfRel<E> &rel,
switch (rel.r_type) {
case R_NONE:
return;
break;
case R_386_32:
*(ul32 *)loc = val;
return;
break;
case R_386_PC32:
*(ul32 *)loc = val - this->shdr.sh_addr - offset;
return;
break;
default:
Fatal(ctx) << "unsupported relocation in .eh_frame: " << rel;
}
unreachable();
}
template <>

View File

@ -144,20 +144,19 @@ void EhFrameSection<E>::apply_reloc(Context<E> &ctx, const ElfRel<E> &rel,
switch (rel.r_type) {
case R_NONE:
return;
break;
case R_PPC64_ADDR64:
*(ul64 *)loc = val;
return;
break;
case R_PPC64_REL32:
*(ul32 *)loc = val - this->shdr.sh_addr - offset;
return;
break;
case R_PPC64_REL64:
*(ul64 *)loc = val - this->shdr.sh_addr - offset;
return;
break;
default:
Fatal(ctx) << "unknown relocation in ehframe: " << rel;
Fatal(ctx) << "unsupported relocation in .eh_frame: " << rel;
}
unreachable();
}
static u64 get_local_entry_offset(Context<E> &ctx, Symbol<E> &sym) {
@ -316,8 +315,6 @@ void InputSection<E>::apply_reloc_nonalloc(Context<E> &ctx, u8 *base) {
#define A (frag ? frag_addend : (i64)rel.r_addend)
switch (rel.r_type) {
case R_NONE:
break;
case R_PPC64_ADDR64:
if (std::optional<u64> val = get_tombstone(sym, frag))
*(ul64 *)loc = *val;

View File

@ -259,38 +259,41 @@ void EhFrameSection<E>::apply_reloc(Context<E> &ctx, const ElfRel<E> &rel,
u8 *loc = ctx.buf + this->shdr.sh_offset + offset;
switch (rel.r_type) {
case R_NONE:
break;
case R_RISCV_ADD32:
*(U32<E> *)loc += val;
return;
break;
case R_RISCV_SUB8:
*loc -= val;
return;
break;
case R_RISCV_SUB16:
*(U16<E> *)loc -= val;
return;
break;
case R_RISCV_SUB32:
*(U32<E> *)loc -= val;
return;
break;
case R_RISCV_SUB6:
*loc = (*loc & 0b1100'0000) | ((*loc - val) & 0b0011'1111);
return;
break;
case R_RISCV_SET6:
*loc = (*loc & 0b1100'0000) | (val & 0b0011'1111);
return;
break;
case R_RISCV_SET8:
*loc = val;
return;
break;
case R_RISCV_SET16:
*(U16<E> *)loc = val;
return;
break;
case R_RISCV_SET32:
*(U32<E> *)loc = val;
return;
break;
case R_RISCV_32_PCREL:
*(U32<E> *)loc = val - this->shdr.sh_addr - offset;
return;
break;
default:
Fatal(ctx) << "unsupported relocation in .eh_frame: " << rel;
}
Fatal(ctx) << "unsupported relocation in .eh_frame: " << rel;
}
template <typename E>

View File

@ -138,19 +138,17 @@ void EhFrameSection<E>::apply_reloc(Context<E> &ctx, const ElfRel<E> &rel,
switch (rel.r_type) {
case R_NONE:
return;
break;
case R_SPARC_64:
case R_SPARC_UA64:
*(ub64 *)loc = val;
return;
break;
case R_SPARC_DISP32:
*(ub32 *)loc = val - this->shdr.sh_addr - offset;
return;
break;
default:
Fatal(ctx) << "unknown relocation in ehframe: " << rel;
return;
Fatal(ctx) << "unsupported relocation in .eh_frame: " << rel;
}
unreachable();
}
template <>

View File

@ -100,21 +100,22 @@ void EhFrameSection<E>::apply_reloc(Context<E> &ctx, const ElfRel<E> &rel,
switch (rel.r_type) {
case R_NONE:
return;
break;
case R_X86_64_32:
*(ul32 *)loc = val;
return;
break;
case R_X86_64_64:
*(ul64 *)loc = val;
return;
break;
case R_X86_64_PC32:
*(ul32 *)loc = val - this->shdr.sh_addr - offset;
return;
break;
case R_X86_64_PC64:
*(ul64 *)loc = val - this->shdr.sh_addr - offset;
return;
break;
default:
Fatal(ctx) << "unsupported relocation in .eh_frame: " << rel;
}
unreachable();
}
static u32 relax_gotpcrelx(u8 *loc) {