diff --git a/data/Makefile b/data/Makefile
index 1e18378..a55981c 100644
--- a/data/Makefile
+++ b/data/Makefile
@@ -1,5 +1,5 @@
 test_exec.elf: test_exec.c libtest_dyn.so
-	musl-gcc -fPIC -fPIE -o $@ $^
+	musl-gcc -fPIC -fPIE -Wl,-dynamic-linker,/nix/store/b0yps7aa1kcvdrspna9gakzf8bl1ddzi-musl-1.2.3/lib/ld-musl-x86_64.so.1 -o $@ $^
 libtest_dyn.so: test_dyn.c
 	musl-gcc -fPIC -shared -o $@ $^
 clean:
diff --git a/src/parse.rs b/src/parse.rs
index 58731e5..e00825b 100644
--- a/src/parse.rs
+++ b/src/parse.rs
@@ -10,6 +10,7 @@ pub const DT_RELR: i64 = 36;
 pub const DT_RELRSZ: i64 = 35;
 
 pub fn parse_elf<E: EndianParse>(elf_data: &[u8], soname: Option<&str>) -> Result<Image, elf::parse::ParseError> {
+    println!("{:?}", soname);
     let elf_file = ElfBytes::<E>::minimal_parse(elf_data)?;
     let machine = elf_file.ehdr.e_machine;
     let elf_common = elf_file.find_common_data()?;
@@ -169,6 +170,14 @@ pub fn parse_elf<E: EndianParse>(elf_data: &[u8], soname: Option<&str>) -> Resul
             })
             .collect::<Vec<_>>()
     };
+    let addend_to_unmap_at = |address| elf_segments.iter().find_map(|elf_segment| {
+        if (address as u64) >= elf_segment.p_vaddr &&
+                (address as u64) < elf_segment.p_vaddr + elf_segment.p_memsz {
+            Some(elf_segment.p_offset as isize - elf_segment.p_vaddr as isize)
+        } else {
+            None
+        }
+    });
     let elf_dynamic_rela = elf_dynamic.iter().find_map(|elf_dyn| {
         if elf_dyn.d_tag == DT_RELA { Some(elf_dyn.clone().d_val() as usize) } else { None }
     });
@@ -192,13 +201,22 @@ pub fn parse_elf<E: EndianParse>(elf_data: &[u8], soname: Option<&str>) -> Resul
     });
     let mut data_relocations = match (elf_dynamic_rela, elf_dynamic_relasz) {
         (Some(elf_dynamic_rela), Some(elf_dynamic_relasz)) =>
-            parse_elf_rela(&elf_data[elf_dynamic_rela..elf_dynamic_rela + elf_dynamic_relasz]),
+        {
+            let elf_dynamic_rela = elf_dynamic_rela.wrapping_add_signed(addend_to_unmap_at(elf_dynamic_rela)
+                .expect("DT_RELA not part of any segment"));
+            println!("{}", elf_dynamic_rela);
+            println!("{}", elf_dynamic_relasz);
+            println!("{}", elf_data.len());
+            parse_elf_rela(&elf_data[elf_dynamic_rela..elf_dynamic_rela + elf_dynamic_relasz])
+        },
         (None, None) => Vec::new(),
         _ => panic!("Expected dynamic table to have both or neither of PT_RELA and PT_RELASZ")
     };
     let mut code_relocations = match (elf_dynamic_pltrel, elf_dynamic_jmprel, elf_dynamic_pltrelsz) {
         (Some(elf_dynamic_pltrel), Some(elf_dynamic_jmprel), Some(elf_dynamic_pltrelsz))
                 if elf_dynamic_pltrel == DT_RELA => {
+            let elf_dynamic_jmprel = elf_dynamic_jmprel.wrapping_add_signed(addend_to_unmap_at(elf_dynamic_jmprel)
+                .expect("DT_JMPREL not part of any segment"));
             let elf_jmprel_data = &elf_data[elf_dynamic_jmprel..elf_dynamic_jmprel + elf_dynamic_pltrelsz];
             if elf_dynamic_pltrel == DT_RELA {
                 parse_elf_rela(elf_jmprel_data)
@@ -291,14 +309,6 @@ pub fn parse_elf<E: EndianParse>(elf_data: &[u8], soname: Option<&str>) -> Resul
     let elf_dynamic_fini_arraysz = elf_dynamic.iter().find_map(|elf_dyn| {
         if elf_dyn.d_tag == DT_FINI_ARRAYSZ { Some(elf_dyn.clone().d_val() as usize) } else { None }
     });
-    let addend_to_unmap_at = |address| elf_segments.iter().find_map(|elf_segment| {
-        if (address as u64) >= elf_segment.p_vaddr &&
-                (address as u64) < elf_segment.p_vaddr + elf_segment.p_memsz {
-            Some(elf_segment.p_offset as isize - elf_segment.p_vaddr as isize)
-        } else {
-            None
-        }
-    });
     let mut initializers = Vec::new();
     if let Some(init_func) = elf_dynamic_init { initializers.push(init_func as u64) }
     match (elf_dynamic_init_array, elf_dynamic_init_arraysz) {
