diff options
author | Szabolcs Nagy <nsz@port70.net> | 2016-12-03 20:52:43 +0000 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2017-03-11 19:10:57 -0500 |
commit | c9783e4d32e786c4b76bf77c6030111d9e79dbb7 (patch) | |
tree | 3f1796790b28f6343cadbdcf62aa0e8fbfca06a1 /ldso/dynlink.c | |
parent | fc85fb38605a8bf341c367b8ab0d36edab2bdbfc (diff) | |
download | musl-c9783e4d32e786c4b76bf77c6030111d9e79dbb7.tar.gz musl-c9783e4d32e786c4b76bf77c6030111d9e79dbb7.tar.bz2 musl-c9783e4d32e786c4b76bf77c6030111d9e79dbb7.tar.xz musl-c9783e4d32e786c4b76bf77c6030111d9e79dbb7.zip |
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.
Diffstat (limited to 'ldso/dynlink.c')
-rw-r--r-- | ldso/dynlink.c | 4 |
1 files changed, 1 insertions, 3 deletions
diff --git a/ldso/dynlink.c b/ldso/dynlink.c index a03f75e3..d00827a3 100644 --- a/ldso/dynlink.c +++ b/ldso/dynlink.c @@ -286,11 +286,9 @@ static struct symdef find_sym(struct dso *dso, const char *s, int need_def) continue; if (!(1<<(sym->st_info&0xf) & OK_TYPES)) continue; if (!(1<<(sym->st_info>>4) & OK_BINDS)) continue; - - if (def.sym && sym->st_info>>4 == STB_WEAK) continue; def.sym = sym; def.dso = dso; - if (sym->st_info>>4 == STB_GLOBAL) break; + break; } return def; } |