diff --git a/tccelf.c b/tccelf.c index b9ca8b7..2c6f349 100644 --- a/tccelf.c +++ b/tccelf.c @@ -1875,20 +1875,19 @@ static void bind_libs_dynsyms(TCCState *s1) /* now look at unresolved dynamic symbols and export corresponding symbol */ for_each_elem(s1->dynsymtab_section, 1, esym, ElfW(Sym)) { - if (esym->st_shndx == SHN_UNDEF) { - name = (char *) s1->dynsymtab_section->link->data + esym->st_name; - sym_index = find_elf_sym(symtab_section, name); - if (sym_index) { - /* XXX: avoid adding a symbol if already present because of - -rdynamic ? */ - sym = &((ElfW(Sym) *)symtab_section->data)[sym_index]; + name = (char *) s1->dynsymtab_section->link->data + esym->st_name; + sym_index = find_elf_sym(symtab_section, name); + if (sym_index) { + /* XXX: avoid adding a symbol if already present because of + -rdynamic ? */ + sym = &((ElfW(Sym) *)symtab_section->data)[sym_index]; + if (sym->st_shndx != SHN_UNDEF) put_elf_sym(s1->dynsym, sym->st_value, sym->st_size, sym->st_info, 0, sym->st_shndx, name); - } else { - /* weak symbols can stay undefined */ - if (ELFW(ST_BIND)(esym->st_info) != STB_WEAK) - tcc_warning("undefined dynamic symbol '%s'", name); - } + } else if (esym->st_shndx == SHN_UNDEF) { + /* weak symbols can stay undefined */ + if (ELFW(ST_BIND)(esym->st_info) != STB_WEAK) + tcc_warning("undefined dynamic symbol '%s'", name); } } }