From 3e028af453f037870ca36defe85d86a21eee3b49 Mon Sep 17 00:00:00 2001 From: Emil Date: Fri, 9 Jun 2017 19:44:29 +0100 Subject: [PATCH] When creating a staticaly linked ELF program should not include any dyn symbols. The if( !s1->static_link ) prevents tcc from crashing when buiding a program linked to dietlibc. The section header should not contain the number of local symbols when the sh_size is null. This makes the header compliant and IDA will not issue any warnings when an executable is disassembled. --- tccelf.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tccelf.c b/tccelf.c index fad23b84..9a7aa91a 100644 --- a/tccelf.c +++ b/tccelf.c @@ -679,7 +679,8 @@ static void sort_syms(TCCState *s1, Section *s) p++; } /* save the number of local symbols in section header */ - s->sh_info = q - new_syms; + if( s->sh_size ) /* this 'if' makes IDA happy */ + s->sh_info = q - new_syms; /* then second pass for non local symbols */ p = (ElfW(Sym) *)s->data; @@ -1985,10 +1986,11 @@ static void tidy_section_headers(TCCState *s1, int *sec_order) for_each_elem(symtab_section, 1, sym, ElfW(Sym)) if (sym->st_shndx != SHN_UNDEF && sym->st_shndx < SHN_LORESERVE) sym->st_shndx = backmap[sym->st_shndx]; - for_each_elem(s1->dynsym, 1, sym, ElfW(Sym)) - if (sym->st_shndx != SHN_UNDEF && sym->st_shndx < SHN_LORESERVE) - sym->st_shndx = backmap[sym->st_shndx]; - + if( !s1->static_link ) { + for_each_elem(s1->dynsym, 1, sym, ElfW(Sym)) + if (sym->st_shndx != SHN_UNDEF && sym->st_shndx < SHN_LORESERVE) + sym->st_shndx = backmap[sym->st_shndx]; + } for (i = 0; i < s1->nb_sections; i++) sec_order[i] = i; tcc_free(s1->sections);