treat STB_WEAK and STB_GNU_UNIQUE like STB_GLOBAL in find_sym

A weak symbol definition is not special during dynamic linking, so
don't let a strong definition in a later module override it.
(glibc dynamic linker allows overriding weak definitions if
LD_DYNAMIC_WEAK is set, musl does not.)

STB_GNU_UNIQUE means that the symbol is global, even if it is in a
module that's loaded with RTLD_LOCAL, and all references resolve to
the same definition. This semantics is only relevant for c++ plugin
systems and even there it's often not what the user wants (so it can
be turned off in g++ by -fno-gnu-unique when the c++ shared lib is
compiled). In musl just treat it like STB_GLOBAL.
This commit is contained in:
Szabolcs Nagy 2016-12-03 20:52:43 +00:00 committed by Rich Felker
parent fc85fb3860
commit c9783e4d32
1 changed files with 1 additions and 3 deletions

View File

@ -286,11 +286,9 @@ static struct symdef find_sym(struct dso *dso, const char *s, int need_def)
continue; continue;
if (!(1<<(sym->st_info&0xf) & OK_TYPES)) continue; if (!(1<<(sym->st_info&0xf) & OK_TYPES)) continue;
if (!(1<<(sym->st_info>>4) & OK_BINDS)) continue; if (!(1<<(sym->st_info>>4) & OK_BINDS)) continue;
if (def.sym && sym->st_info>>4 == STB_WEAK) continue;
def.sym = sym; def.sym = sym;
def.dso = dso; def.dso = dso;
if (sym->st_info>>4 == STB_GLOBAL) break; break;
} }
return def; return def;
} }