From 1026ca58881193dfe28332036d066e44ef0b0e68 Mon Sep 17 00:00:00 2001 From: grischka Date: Fri, 10 Jul 2009 16:29:10 +0100 Subject: [PATCH] fix "symbol not defined" if symbol has offset 0 --- tccelf.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/tccelf.c b/tccelf.c index b55d55a..c95ecf7 100644 --- a/tccelf.c +++ b/tccelf.c @@ -168,25 +168,32 @@ static int find_elf_sym(Section *s, const char *name) return 0; } -/* return elf symbol value or error */ -void *tcc_get_symbol(TCCState *s, const char *name) +/* return elf symbol value, signal error if 'err' is nonzero */ +static void *get_elf_sym_addr(TCCState *s, const char *name, int err) { int sym_index; ElfW(Sym) *sym; + sym_index = find_elf_sym(symtab_section, name); - if (!sym_index) - return NULL; sym = &((ElfW(Sym) *)symtab_section->data)[sym_index]; + if (!sym_index || sym->st_shndx == SHN_UNDEF) { + if (err) + error("%s not defined", name); + return NULL; + } return (void*)(uplong)sym->st_value; } +/* return elf symbol value */ +void *tcc_get_symbol(TCCState *s, const char *name) +{ + return get_elf_sym_addr(s, name, 0); +} + +/* return elf symbol value or error */ void *tcc_get_symbol_err(TCCState *s, const char *name) { - void *sym; - sym = tcc_get_symbol(s, name); - if (!sym) - error("%s not defined", name); - return sym; + return get_elf_sym_addr(s, name, 1); } /* add an elf symbol : check if it is already defined and patch