diff options
-rw-r--r-- | arch/mips/reloc.h | 1 | ||||
-rw-r--r-- | src/ldso/dynlink.c | 7 |
2 files changed, 7 insertions, 1 deletions
diff --git a/arch/mips/reloc.h b/arch/mips/reloc.h index 91fa0977..4b81d328 100644 --- a/arch/mips/reloc.h +++ b/arch/mips/reloc.h @@ -86,3 +86,4 @@ static void do_arch_relocs(struct dso *this, struct dso *head) #define NEED_ARCH_RELOCS 1 #define DYNAMIC_IS_RO 1 +#define ARCH_SYM_REJECT_UND(s) (!((s)->st_other & STO_MIPS_PLT)) diff --git a/src/ldso/dynlink.c b/src/ldso/dynlink.c index a08300de..55124ff8 100644 --- a/src/ldso/dynlink.c +++ b/src/ldso/dynlink.c @@ -233,6 +233,10 @@ static Sym *gnu_lookup(const char *s, uint32_t h1, struct dso *dso) #define OK_TYPES (1<<STT_NOTYPE | 1<<STT_OBJECT | 1<<STT_FUNC | 1<<STT_COMMON | 1<<STT_TLS) #define OK_BINDS (1<<STB_GLOBAL | 1<<STB_WEAK | 1<<STB_GNU_UNIQUE) +#ifndef ARCH_SYM_REJECT_UND +#define ARCH_SYM_REJECT_UND(s) 0 +#endif + static struct symdef find_sym(struct dso *dso, const char *s, int need_def) { uint32_t h = 0, gh = 0; @@ -249,7 +253,8 @@ static struct symdef find_sym(struct dso *dso, const char *s, int need_def) } if (!sym) continue; if (!sym->st_shndx) - if (need_def || (sym->st_info&0xf) == STT_TLS) + if (need_def || (sym->st_info&0xf) == STT_TLS + || ARCH_SYM_REJECT_UND(sym)) continue; if (!sym->st_value) if ((sym->st_info&0xf) != STT_TLS) |