From d777ec675ca77463f6a04320e76d5026e2bd6bc4 Mon Sep 17 00:00:00 2001 From: bjorn3 Date: Fri, 13 Nov 2020 09:28:51 +0100 Subject: [PATCH] Transparently change non-PLT libcall relocations to PLT relocations --- cranelift/simplejit/src/backend.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/cranelift/simplejit/src/backend.rs b/cranelift/simplejit/src/backend.rs index 71dd5c07de..eb6610907c 100644 --- a/cranelift/simplejit/src/backend.rs +++ b/cranelift/simplejit/src/backend.rs @@ -595,7 +595,18 @@ impl<'simple_jit_backend> Module for SimpleJITModule { .as_ref() .unwrap() .perform_relocations( - |name| unreachable!("non GOT or PLT relocation in function {} to {}", id, name), + |name| match *name { + ir::ExternalName::User { .. } => { + unreachable!("non GOT or PLT relocation in function {} to {}", id, name) + } + ir::ExternalName::LibCall(ref libcall) => self + .libcall_plt_entries + .get(libcall) + .unwrap_or_else(|| panic!("can't resolve libcall {}", libcall)) + .as_ptr() + .cast::(), + _ => panic!("invalid ExternalName {}", name), + }, |name| self.get_got_address(name), |name| self.get_plt_address(name), );