make relocation time symbol lookup and dlsym consistent
authorSzabolcs Nagy <nsz@port70.net>
Sat, 10 Aug 2019 23:14:40 +0000 (23:14 +0000)
committerRich Felker <dalias@aerifal.cx>
Mon, 12 Aug 2019 22:25:38 +0000 (18:25 -0400)
commitf2435263d7366a81b734c8a69877f1359083ce8c
tree17c4cc1efc3840ccbe89196dc94702a92d37b18d
parent1f060ed2fb0b35f85118a425f5eed3299fef58d3
make relocation time symbol lookup and dlsym consistent

Using common code path for all symbol lookups fixes three dlsym issues:

- st_shndx of STT_TLS symbols were not checked and thus an undefined
  tls symbol reference could be incorrectly treated as a definition
  (the sysv hash lookup returns undefined symbols, gnu does not, so should
  be rare in practice).

- symbol binding was not checked so a hidden symbol may be returned
  (in principle STB_LOCAL symbols may appear in the dynamic symbol table
  for hidden symbols, but linkers most likely don't produce it).

- mips specific behaviour was not applied (ARCH_SYM_REJECT_UND) so
  undefined symbols may be returned on mips.

always_inline is used to avoid relocation performance regression, the
code generation for find_sym should not be affected.
ldso/dynlink.c