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:
parent
921f002a6d
commit
db9d5f0fa4
1 changed files with 19 additions and 17 deletions
36
tccelf.c
36
tccelf.c
|
@ -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,
|
||||||
|
|
Loading…
Reference in a new issue