Make sure strong symbols are preferred by ld_so

This commit is contained in:
Jeremy Soller
2021-12-15 12:05:21 -07:00
parent ecd934951d
commit 824184a66c
2 changed files with 16 additions and 11 deletions
+3 -3
View File
@@ -96,11 +96,11 @@ impl DSO {
return Ok((dso, tcb_master));
}
pub fn get_sym(&self, name: &str) -> Option<Symbol> {
pub fn get_sym(&self, name: &str) -> Option<(Symbol, bool)> {
if let Some(value) = self.global_syms.get(name) {
Some(*value)
Some((*value, true))
} else if let Some(value) = self.weak_syms.get(name) {
Some(*value)
Some((*value, false))
} else {
None
}
+13 -8
View File
@@ -97,7 +97,7 @@ impl Linker {
pub fn get_sym(&self, lib_id: usize, name: &str) -> Option<*mut c_void> {
match self.objects.get(&lib_id) {
Some(obj) => {
return obj.get_sym(name).map(|s| {
return obj.get_sym(name).map(|(s, strong)| {
if s.sym_type != STT_TLS {
s.as_ptr()
} else {
@@ -337,14 +337,19 @@ impl Linker {
_ => 0,
};
for lookup_id in lookup_start..symbols_lookup_objects.len() {
let obj = &symbols_lookup_objects[lookup_id];
let s = obj.get_sym(name);
if s.is_some() {
trace!("symbol {} from {} found in {}", name, obj.name, obj.name);
symbol = s;
t = obj.tls_offset;
let lookup_obj = &symbols_lookup_objects[lookup_id];
if let Some((s, strong)) = lookup_obj.get_sym(name) {
trace!(
"symbol {} from {} found in {} ({})",
name, obj.name, lookup_obj.name, if strong { "strong" } else { "weak" }
);
symbol = Some(s);
t = lookup_obj.tls_offset;
found = true;
break;
// Stop looking if any strong symbol is found
if strong {
break;
}
}
}
// TODO: below doesn't work because of missing __preinit_array_{start,end} and __init_array_{start,end} symbols in dynamic linked programs