Skip to content

Commit

Permalink
ELF Relocatable: make undefined global symbol STT_NOTYPE
Browse files Browse the repository at this point in the history
If undefined global symbols in ELF Relocatable files are not of
type STT_NOTYPE, it will confuse binutils bfd and corrupt product
files.
  • Loading branch information
sylware committed Oct 24, 2023
1 parent 08c7770 commit f44060f
Showing 1 changed file with 5 additions and 0 deletions.
5 changes: 5 additions & 0 deletions tccelf.c
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,11 @@ ST_FUNC void tccelf_end_file(TCCState *s1)
if (sym->st_shndx == SHN_UNDEF
&& ELFW(ST_BIND)(sym->st_info) == STB_LOCAL)
sym->st_info = ELFW(ST_INFO)(STB_GLOBAL, ELFW(ST_TYPE)(sym->st_info));
/* An ELF relocatable file should have the types of its undefined global symbol set
to STT_NOTYPE or it will confuse binutils bfd */
if (s1->output_format == TCC_OUTPUT_FORMAT_ELF && s1->output_type == TCC_OUTPUT_OBJ)
if (sym->st_shndx == SHN_UNDEF && ELFW(ST_BIND)(sym->st_info) == STB_GLOBAL)
sym->st_info = ELFW(ST_INFO)(STB_GLOBAL, ELFW(ST_TYPE)(STT_NOTYPE));
tr[i] = set_elf_sym(s, sym->st_value, sym->st_size, sym->st_info,
sym->st_other, sym->st_shndx, (char*)s->link->data + sym->st_name);
}
Expand Down

0 comments on commit f44060f

Please sign in to comment.