mirror of git://git.musl-libc.org/musl
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:
parent
fc85fb3860
commit
c9783e4d32
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue