aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tccelf.c25
1 files 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