diff options
| author | grischka <grischka> | 2009-07-10 16:29:10 +0100 |
|---|---|---|
| committer | grischka <grischka> | 2009-08-24 13:30:01 +0200 |
| commit | 1026ca58881193dfe28332036d066e44ef0b0e68 (patch) | |
| tree | 5f623cf8829c6745ee8dc79079722a977403d849 | |
| parent | d923e652f2ee9d15e78f716324db94535d3cb114 (diff) | |
| download | tinycc-1026ca58881193dfe28332036d066e44ef0b0e68.tar.gz tinycc-1026ca58881193dfe28332036d066e44ef0b0e68.tar.bz2 | |
fix "symbol not defined" if symbol has offset 0
| -rw-r--r-- | tccelf.c | 25 |
1 files changed, 16 insertions, 9 deletions
@@ -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 |
