treat STB_WEAK and STB_GNU_UNIQUE like STB_GLOBAL in find_sym
authorSzabolcs Nagy <nsz@port70.net>
Sat, 3 Dec 2016 20:52:43 +0000 (20:52 +0000)
committerRich Felker <dalias@aerifal.cx>
Sun, 12 Mar 2017 00:10:57 +0000 (19:10 -0500)
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.

ldso/dynlink.c

index a03f75e..d00827a 100644 (file)
@@ -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;
 }