From f8d02417642ec58bd3da16ccdf042019e4918f52 Mon Sep 17 00:00:00 2001 From: bellard Date: Sun, 20 Jul 2003 19:19:58 +0000 Subject: [PATCH] changed tcc_get_symbol() prototype --- libtcc.h | 4 ++-- libtcc_test.c | 8 +++++--- tcc.c | 7 ++++--- tccelf.c | 17 +++++++++++++---- 4 files changed, 24 insertions(+), 12 deletions(-) diff --git a/libtcc.h b/libtcc.h index 98fcadc..406449a 100644 --- a/libtcc.h +++ b/libtcc.h @@ -83,8 +83,8 @@ int tcc_run(TCCState *s, int argc, char **argv); non zero if link error. */ int tcc_relocate(TCCState *s); -/* return symbol value or error */ -void *tcc_get_symbol(TCCState *s, const char *name); +/* return symbol value. return 0 if OK, -1 if symbol not found */ +int tcc_get_symbol(TCCState *s, unsigned long *pval, const char *name); #ifdef __cplusplus } diff --git a/libtcc_test.c b/libtcc_test.c index 9861ec0..34e296a 100644 --- a/libtcc_test.c +++ b/libtcc_test.c @@ -35,7 +35,8 @@ int main(int argc, char **argv) { TCCState *s; int (*func)(int); - + unsigned long val; + s = tcc_new(); if (!s) { fprintf(stderr, "Could not create tcc state\n"); @@ -54,8 +55,9 @@ int main(int argc, char **argv) tcc_relocate(s); - func = tcc_get_symbol(s, "foo"); - + tcc_get_symbol(s, &val, "foo"); + func = (void *)val; + func(32); tcc_delete(s); diff --git a/tcc.c b/tcc.c index aa3bc83..68bf046 100644 --- a/tcc.c +++ b/tcc.c @@ -9115,7 +9115,7 @@ int tcc_run(TCCState *s1, int argc, char **argv) if (tcc_relocate(s1) < 0) return -1; - prog_main = tcc_get_symbol(s1, "main"); + prog_main = tcc_get_symbol_err(s1, "main"); if (do_debug) { #ifdef WIN32 @@ -9140,10 +9140,11 @@ int tcc_run(TCCState *s1, int argc, char **argv) void (*bound_init)(void); /* set error function */ - rt_bound_error_msg = (void *)tcc_get_symbol(s1, "__bound_error_msg"); + rt_bound_error_msg = (void *)tcc_get_symbol_err(s1, + "__bound_error_msg"); /* XXX: use .init section so that it also work in binary ? */ - bound_init = (void *)tcc_get_symbol(s1, "__bound_init"); + bound_init = (void *)tcc_get_symbol_err(s1, "__bound_init"); bound_init(); } #endif diff --git a/tccelf.c b/tccelf.c index 5d9efc9..e5e69d3 100644 --- a/tccelf.c +++ b/tccelf.c @@ -154,16 +154,25 @@ static int find_elf_sym(Section *s, const char *name) } /* return elf symbol value or error */ -void *tcc_get_symbol(TCCState *s, const char *name) +int tcc_get_symbol(TCCState *s, unsigned long *pval, const char *name) { int sym_index; Elf32_Sym *sym; sym_index = find_elf_sym(symtab_section, name); if (!sym_index) - error("%s not defined", name); + return -1; sym = &((Elf32_Sym *)symtab_section->data)[sym_index]; - return (void *)sym->st_value; + *pval = sym->st_value; + return 0; +} + +void *tcc_get_symbol_err(TCCState *s, const char *name) +{ + unsigned long val; + if (tcc_get_symbol(s, &val, name) < 0) + error("%s not defined", name); + return (void *)val; } /* add an elf symbol : check if it is already defined and patch @@ -1383,7 +1392,7 @@ int tcc_output_file(TCCState *s1, const char *filename) /* get entry point address */ if (file_type == TCC_OUTPUT_EXE) - ehdr.e_entry = (unsigned long)tcc_get_symbol(s1, "_start"); + ehdr.e_entry = (unsigned long)tcc_get_symbol_err(s1, "_start"); else ehdr.e_entry = text_section->sh_addr; /* XXX: is it correct ? */ }