From 9f7fb6b1d68bd28d154c9d6587c1f132ce04cf54 Mon Sep 17 00:00:00 2001 From: Mike Hilgendorf Date: Sun, 14 May 2023 20:35:07 -0500 Subject: [PATCH] elf: fix `is_lib` detection for PIE and static PIE Elf objects. (#366) * Fix `is_lib` detection for PIE and static PIE Elf objects. * Don't check for an interpreter when detecting is_lib for elf objects. * Correct PIE detection. --------- Co-authored-by: Mike Hilgendorf --- src/elf/mod.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/elf/mod.rs b/src/elf/mod.rs index 93781783..70c49146 100644 --- a/src/elf/mod.rs +++ b/src/elf/mod.rs @@ -307,6 +307,7 @@ if_sylvan! { strtab = get_strtab(§ion_headers, shdr.sh_link as usize)?; } + let mut is_pie = false; let mut soname = None; let mut libraries = vec![]; let mut rpaths = vec![]; @@ -319,6 +320,8 @@ if_sylvan! { let dynamic = Dynamic::parse(bytes, &program_headers, ctx)?; if let Some(ref dynamic) = dynamic { let dyn_info = &dynamic.info; + + is_pie = dyn_info.flags_1 & dynamic::DF_1_PIE != 0; dynstrtab = Strtab::parse(bytes, dyn_info.strtab, dyn_info.strsz, @@ -379,6 +382,8 @@ if_sylvan! { let verdef = symver::VerdefSection::parse(bytes, §ion_headers, ctx)?; let verneed = symver::VerneedSection::parse(bytes, §ion_headers, ctx)?; + let is_lib = misc.is_lib && !is_pie; + Ok(Elf { header, program_headers, @@ -399,7 +404,7 @@ if_sylvan! { rpaths, runpaths, is_64: misc.is_64, - is_lib: misc.is_lib, + is_lib, entry: misc.entry, little_endian: misc.little_endian, ctx: ctx,