From ee692b38b25ce08f1fe691523a63cacd28f9dfc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Mon, 6 Aug 2018 19:33:17 +0200 Subject: [PATCH] x86_64: R_X86_64_PC32 and R_X86_64_DTPOFF32 are 32-bit wide relocations. Change-Id: I9c4e6c5ae77f4c17c2b6901f2b133db4b9dc48e3 Reviewed-on: https://review.haiku-os.org/445 Reviewed-by: waddlesplash --- src/system/kernel/arch/x86/arch_elf.cpp | 7 +++++-- src/system/runtime_loader/arch/x86_64/arch_relocate.cpp | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/system/kernel/arch/x86/arch_elf.cpp b/src/system/kernel/arch/x86/arch_elf.cpp index f785e20645..cb1d0f2363 100644 --- a/src/system/kernel/arch/x86/arch_elf.cpp +++ b/src/system/kernel/arch/x86/arch_elf.cpp @@ -239,7 +239,7 @@ arch_elf_relocate_rela(struct elf_image_info *image, // Calculate the relocation value. Elf64_Addr relocValue; - switch(type) { + switch (type) { case R_X86_64_NONE: continue; case R_X86_64_64: @@ -269,7 +269,10 @@ arch_elf_relocate_rela(struct elf_image_info *image, return B_BAD_ADDRESS; } - *(Elf64_Addr *)relocAddr = relocValue; + if (type == R_X86_64_PC32) + *(Elf32_Addr *)relocAddr = relocValue; + else + *(Elf64_Addr *)relocAddr = relocValue; #endif } diff --git a/src/system/runtime_loader/arch/x86_64/arch_relocate.cpp b/src/system/runtime_loader/arch/x86_64/arch_relocate.cpp index fda4c27c33..90a62bf237 100644 --- a/src/system/runtime_loader/arch/x86_64/arch_relocate.cpp +++ b/src/system/runtime_loader/arch/x86_64/arch_relocate.cpp @@ -43,7 +43,7 @@ relocate_rela(image_t* rootImage, image_t* image, Elf64_Rela* rel, // Calculate the relocation value. Elf64_Addr relocValue; - switch(type) { + switch (type) { case R_X86_64_NONE: continue; case R_X86_64_64: @@ -70,7 +70,10 @@ relocate_rela(image_t* rootImage, image_t* image, Elf64_Rela* rel, return B_BAD_DATA; } - *(Elf64_Addr *)relocAddr = relocValue; + if (type == R_X86_64_PC32 || type == R_X86_64_DTPOFF32) + *(Elf32_Addr *)relocAddr = relocValue; + else + *(Elf64_Addr *)relocAddr = relocValue; } return B_OK;