diff --git a/tcc.c b/tcc.c index 0c51451..0bcb029 100644 --- a/tcc.c +++ b/tcc.c @@ -578,7 +578,11 @@ int main(int argc, char **argv) tcc_print_stats(s, getclock_us() - start_time); if (s->output_type == TCC_OUTPUT_MEMORY) { +#ifdef TCC_IS_NATIVE ret = tcc_run(s, argc - optind, argv + optind); +#else + tcc_error_noabort("-run is not available in a cross compiler"); +#endif } else if (s->output_type == TCC_OUTPUT_PREPROCESS) { if (s->outfile) fclose(s->outfile); diff --git a/tcc.h b/tcc.h index 18a6b91..a5ae144 100644 --- a/tcc.h +++ b/tcc.h @@ -49,9 +49,6 @@ #include /* getcwd */ #define inline __inline #define inp next_inp -#ifdef _WIN64 -# define uplong unsigned long long -#endif #ifdef LIBTCC_AS_DLL # define LIBTCCAPI __declspec(dllexport) #endif @@ -67,17 +64,10 @@ #endif /* !CONFIG_TCCBOOT */ -#ifndef uplong -#define uplong unsigned long -#endif - #ifndef PAGESIZE #define PAGESIZE 4096 #endif -#include "elf.h" -#include "stab.h" - #ifndef O_BINARY #define O_BINARY 0 #endif @@ -86,6 +76,8 @@ #define SA_SIGINFO 0x00000004u #endif +#include "elf.h" +#include "stab.h" #include "libtcc.h" /* parser debug */ @@ -131,8 +123,26 @@ #define TCC_TARGET_COFF #endif -#if !defined(CONFIG_TCCBOOT) -#define CONFIG_TCC_BACKTRACE +/* only native compiler supports -run */ +#if defined _WIN32 == defined TCC_TARGET_PE +# if (defined __i386__ || defined _X86_) && defined TCC_TARGET_I386 +# define TCC_IS_NATIVE +# elif (defined __x86_64__ || defined _AMD64_) && defined TCC_TARGET_X86_64 +# define TCC_IS_NATIVE +# elif defined __arm__ && defined TCC_TARGET_ARM +# define TCC_IS_NATIVE +# endif +#endif + +#if defined TCC_IS_NATIVE && !defined CONFIG_TCCBOOT +# define CONFIG_TCC_BACKTRACE +#endif + +/* target address type */ +#if defined TCC_TARGET_X86_64 && (!defined __x86_64__ || defined _WIN32) +# define uplong unsigned long long +#else +# define uplong unsigned long #endif /* ------------ path configuration ------------ */ diff --git a/tccpe.c b/tccpe.c index 51f4c53..4dec1d8 100644 --- a/tccpe.c +++ b/tccpe.c @@ -38,10 +38,6 @@ # define ADDR3264 DWORD #endif -#if defined _WIN32 && (defined _WIN64) == (defined TCC_TARGET_X86_64) -#define TCC_IS_NATIVE -#endif - #ifdef _WIN32 void dbg_printf (const char *fmt, ...) { @@ -339,7 +335,7 @@ struct pe_info { const char *filename; int type; DWORD sizeofheaders; - DWORD imagebase; + ADDR3264 imagebase; DWORD start_addr; DWORD imp_offs; DWORD imp_size; @@ -1870,11 +1866,10 @@ ST_FUNC int pe_output_file(TCCState * s1, const char *filename) ret = pe_write(&pe); tcc_free(pe.sec_info); } else { -#ifndef TCC_IS_NATIVE - tcc_error_noabort("-run supported only on native platform"); -#endif +#ifdef TCC_IS_NATIVE pe.thunk = data_section; pe_build_imports(&pe); +#endif } #ifdef PE_PRINT_SECTIONS diff --git a/tccrun.c b/tccrun.c index de0ef89..41081cc 100644 --- a/tccrun.c +++ b/tccrun.c @@ -20,6 +20,9 @@ #include "tcc.h" +/* only native compiler supports -run */ +#ifdef TCC_IS_NATIVE + #ifdef CONFIG_TCC_BACKTRACE ST_DATA int rt_num_callers = 6; ST_DATA const char **rt_bound_error_msg; @@ -217,6 +220,8 @@ static void set_pages_executable(void *ptr, unsigned long length) } /* ------------------------------------------------------------- */ +#endif /* TCC_IS_NATIVE */ + #ifdef CONFIG_TCC_BACKTRACE PUB_FUNC void tcc_set_num_callers(int n)