From ed3be5b7f5172f6b55abf35e04ed70ce595edf1f Mon Sep 17 00:00:00 2001 From: Timon Kruiper Date: Tue, 31 Jan 2023 09:45:50 +0100 Subject: [PATCH] LibELF+LibC: Add support for aarch64 relocations This commit adds the used relocation types to elf.h, and handles the types in DynamicLoader and DynamicObject. No new functionalitty has to be added, as the same code can be reused between aarch64 and x86_64. --- Userland/Libraries/LibC/elf.h | 4 ++++ Userland/Libraries/LibELF/DynamicLoader.cpp | 5 +++++ Userland/Libraries/LibELF/DynamicObject.cpp | 2 +- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Userland/Libraries/LibC/elf.h b/Userland/Libraries/LibC/elf.h index d7baed9312..245ad565d6 100644 --- a/Userland/Libraries/LibC/elf.h +++ b/Userland/Libraries/LibC/elf.h @@ -822,4 +822,8 @@ struct elf_args { #define R_X86_64_TPOFF64 18 #define R_X86_64_IRELATIVE 37 +#define R_AARCH64_ABS64 257 +#define R_AARCH64_GLOB_DAT 1025 +#define R_AARCH64_JUMP_SLOT 1026 #define R_AARCH64_RELATIVE 1027 +#define R_AARCH64_TLS_TPREL64 1030 diff --git a/Userland/Libraries/LibELF/DynamicLoader.cpp b/Userland/Libraries/LibELF/DynamicLoader.cpp index 48708938ab..90a4289d6b 100644 --- a/Userland/Libraries/LibELF/DynamicLoader.cpp +++ b/Userland/Libraries/LibELF/DynamicLoader.cpp @@ -482,6 +482,7 @@ DynamicLoader::RelocationResult DynamicLoader::do_relocation(const ELF::DynamicO // Apparently most loaders will just skip these? // Seems if the 'link editor' generates one something is funky with your code break; + case R_AARCH64_ABS64: case R_X86_64_64: { auto symbol = relocation.symbol(); auto res = lookup_symbol(symbol); @@ -500,6 +501,7 @@ DynamicLoader::RelocationResult DynamicLoader::do_relocation(const ELF::DynamicO *patch_ptr = call_ifunc_resolver(VirtualAddress { *patch_ptr }).get(); break; } + case R_AARCH64_GLOB_DAT: case R_X86_64_GLOB_DAT: { auto symbol = relocation.symbol(); auto res = lookup_symbol(symbol); @@ -528,6 +530,7 @@ DynamicLoader::RelocationResult DynamicLoader::do_relocation(const ELF::DynamicO *patch_ptr = symbol_location.get(); break; } + case R_AARCH64_RELATIVE: case R_X86_64_RELATIVE: { if (!image().is_dynamic()) break; @@ -540,6 +543,7 @@ DynamicLoader::RelocationResult DynamicLoader::do_relocation(const ELF::DynamicO *patch_ptr += m_dynamic_object->base_address().get(); break; } + case R_AARCH64_TLS_TPREL64: case R_X86_64_TPOFF64: { auto symbol = relocation.symbol(); FlatPtr symbol_value; @@ -565,6 +569,7 @@ DynamicLoader::RelocationResult DynamicLoader::do_relocation(const ELF::DynamicO break; } + case R_AARCH64_JUMP_SLOT: case R_X86_64_JUMP_SLOT: { // FIXME: Or BIND_NOW flag passed in? if (m_dynamic_object->must_bind_now()) { diff --git a/Userland/Libraries/LibELF/DynamicObject.cpp b/Userland/Libraries/LibELF/DynamicObject.cpp index b33f5d0e52..e59c443add 100644 --- a/Userland/Libraries/LibELF/DynamicObject.cpp +++ b/Userland/Libraries/LibELF/DynamicObject.cpp @@ -484,7 +484,7 @@ NonnullRefPtr DynamicObject::create(DeprecatedString const& filep VirtualAddress DynamicObject::patch_plt_entry(u32 relocation_offset) { auto relocation = plt_relocation_section().relocation_at_offset(relocation_offset); - VERIFY(relocation.type() == R_X86_64_JUMP_SLOT); + VERIFY(relocation.type() == R_X86_64_JUMP_SLOT || relocation.type() == R_AARCH64_JUMP_SLOT); auto symbol = relocation.symbol(); auto relocation_address = (FlatPtr*)relocation.address().as_ptr();