diff options
author | Rich Felker <dalias@aerifal.cx> | 2019-08-12 18:19:38 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2019-08-12 18:19:38 -0400 |
commit | 1f060ed2fb0b35f85118a425f5eed3299fef58d3 (patch) | |
tree | ab02010da425221a26b68b0f6f94a8cf0a0ad3db /ldso | |
parent | 08869deb7efbda6e979886cb67e3d5843f92c2e8 (diff) | |
download | musl-1f060ed2fb0b35f85118a425f5eed3299fef58d3.tar.gz musl-1f060ed2fb0b35f85118a425f5eed3299fef58d3.tar.bz2 musl-1f060ed2fb0b35f85118a425f5eed3299fef58d3.tar.xz musl-1f060ed2fb0b35f85118a425f5eed3299fef58d3.zip |
ldso: correct condition for local symbol handling in do_relocs
commit 7a9669e977e5f750cf72ccbd2614f8b72ce02c4c added use of the
symbol reference as the definition, in place of performing a lookup,
for STT_SECTION symbol references that were first found used in FDPIC.
such references may happen in certain other cases, such as
local-dynamic TLS and with relocation types that require a symbol but
that are being used for non-symbolic purposes, like the powerpc
unaligned address relocations.
in all such cases I'm aware of, the symbol referenced is a section
symbol (STT_SECTION); however, the important semantic property is not
its being a section, but rather its binding local (STB_LOCAL). check
the latter instead of the former for greater generality and semantic
correctness.
Diffstat (limited to 'ldso')
-rw-r--r-- | ldso/dynlink.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/ldso/dynlink.c b/ldso/dynlink.c index edd91acd..b9b2e96c 100644 --- a/ldso/dynlink.c +++ b/ldso/dynlink.c @@ -363,7 +363,7 @@ static void do_relocs(struct dso *dso, size_t *rel, size_t rel_size, size_t stri sym = syms + sym_index; name = strings + sym->st_name; ctx = type==REL_COPY ? head->syms_next : head; - def = (sym->st_info&0xf) == STT_SECTION + def = (sym->st_info>>4) == STB_LOCAL ? (struct symdef){ .dso = dso, .sym = sym } : find_sym(ctx, name, type==REL_PLT); if (!def.sym && (sym->st_shndx != SHN_UNDEF |