diff options
| author | seyko <seyko2@gmail.com> | 2015-04-12 04:47:15 +0300 |
|---|---|---|
| committer | seyko <seyko2@gmail.com> | 2015-04-12 04:47:15 +0300 |
| commit | e7a60e4d01a46ffb51ad4b963cad6b6f176105cb (patch) | |
| tree | cdf634828002b187c47ef575f249cbc13e71eedb | |
| parent | 4bb9dd44f14f34b20e2718dbe9724998904153d8 (diff) | |
| download | tinycc-e7a60e4d01a46ffb51ad4b963cad6b6f176105cb.tar.gz tinycc-e7a60e4d01a46ffb51ad4b963cad6b6f176105cb.tar.bz2 | |
replace a method to force bcheck.o linking
* define __bound_init as external_global_sym insteed of the compiling
a tiny program
* remove warning about buf[] when CONFIG_TCC_BCHECK is not defined
| -rw-r--r-- | libtcc.c | 13 | ||||
| -rw-r--r-- | tcctok.h | 1 |
2 files changed, 9 insertions, 5 deletions
@@ -434,7 +434,10 @@ ST_FUNC void put_extern_sym2(Sym *sym, Section *section, ElfW(Sym) *esym; const char *name; char buf1[256]; + +#ifdef CONFIG_TCC_BCHECK char buf[32]; +#endif if (section == NULL) sh_num = SHN_UNDEF; @@ -1397,11 +1400,11 @@ LIBTCCAPI int tcc_set_output_type(TCCState *s, int output_type) #ifdef CONFIG_TCC_BCHECK if (s->do_bounds_check && (output_type == TCC_OUTPUT_EXE)) { - /* XXX force a bcheck.o linking by compiling a function with a local array. - Otherwise bcheck.o may be not linked. */ - - if (tcc_compile_string(s, "static void __bound_check_dummy_func(){int v[1];}") == -1) - tcc_warning("compiling __bound_check_dummy_func failed"); + /* force a bcheck.o linking */ + addr_t func = TOK___bound_init; + Sym *sym = external_global_sym(func, &func_old_type, 0); + if (!sym->c) + put_extern_sym(sym, NULL, 0, 0); } #endif return 0; @@ -281,6 +281,7 @@ DEF(TOK___bound_main_arg, "__bound_main_arg") DEF(TOK___bound_local_new, "__bound_local_new") DEF(TOK___bound_local_delete, "__bound_local_delete") + DEF(TOK___bound_init, "__bound_init") # ifdef TCC_TARGET_PE DEF(TOK_malloc, "malloc") DEF(TOK_free, "free") |
