Improve weak aliases handling

* Include only the STB_GLOBAL alias symbol in .dynsym section
* Stop the loop when STB_GLOBAL symbol is found
* Reword / simplify comment
This commit is contained in:
Thomas Preud'homme 2011-05-16 13:49:08 +02:00
parent 921f002a6d
commit db9d5f0fa4

View file

@ -1544,23 +1544,25 @@ static int elf_output_file(TCCState *s1, const char *filename)
index = put_elf_sym(s1->dynsym, offset, esym->st_size, index = put_elf_sym(s1->dynsym, offset, esym->st_size,
esym->st_info, 0, esym->st_info, 0,
bss_section->sh_num, name); bss_section->sh_num, name);
/* Ensure symbol aliases (that is, symbols with // Ensure R_COPY works for weak symbol aliases
the same st_value) resolve to the same if (ELFW(ST_BIND)(esym->st_info) == STB_WEAK) {
address in program .bss or .data section. */ dynsym_end = (ElfW(Sym) *)
dynsym_end = (ElfW(Sym) *) (s1->dynsymtab_section->data +
(s1->dynsymtab_section->data + s1->dynsymtab_section->data_offset);
s1->dynsymtab_section->data_offset); for(dynsym = (ElfW(Sym) *)s1->dynsymtab_section->data + 1;
for(dynsym = (ElfW(Sym) *)s1->dynsymtab_section->data + 1; dynsym < dynsym_end; dynsym++) {
dynsym < dynsym_end; dynsym++) { if ((dynsym->st_value == esym->st_value)
if (dynsym->st_value == esym->st_value) { && (ELFW(ST_BIND)(dynsym->st_info) == STB_GLOBAL)) {
char *dynname; char *dynname;
dynname = s1->dynsymtab_section->link->data dynname = s1->dynsymtab_section->link->data
+ dynsym->st_name; + dynsym->st_name;
put_elf_sym(s1->dynsym, offset, put_elf_sym(s1->dynsym, offset,
dynsym->st_size, dynsym->st_size,
dynsym->st_info, 0, dynsym->st_info, 0,
bss_section->sh_num, bss_section->sh_num,
dynname); dynname);
break;
}
} }
} }
put_elf_reloc(s1->dynsym, bss_section, put_elf_reloc(s1->dynsym, bss_section,