diff --git a/programs/develop/ktcc/trunk/bin/tcc b/programs/develop/ktcc/trunk/bin/tcc index be80cbdd45..1c7e416f6c 100644 Binary files a/programs/develop/ktcc/trunk/bin/tcc and b/programs/develop/ktcc/trunk/bin/tcc differ diff --git a/programs/develop/ktcc/trunk/source/Makefile.kos32 b/programs/develop/ktcc/trunk/source/Makefile.kos32 index d6bab2577b..fb3f286a61 100644 --- a/programs/develop/ktcc/trunk/source/Makefile.kos32 +++ b/programs/develop/ktcc/trunk/source/Makefile.kos32 @@ -1,7 +1,7 @@ CC = kos32-gcc LD = kos32-ld -SDK_DIR:= $(abspath ../../../contrib/sdk) +SDK_DIR:= $(abspath ../../../../../contrib/sdk) #gcc 4.8 #LDFLAGS = -static -nostdlib -T $(SDK_DIR)/sources/newlib/static.lds diff --git a/programs/develop/ktcc/trunk/source/libtcc.c b/programs/develop/ktcc/trunk/source/libtcc.c index 58d743acf9..e94ab67136 100644 --- a/programs/develop/ktcc/trunk/source/libtcc.c +++ b/programs/develop/ktcc/trunk/source/libtcc.c @@ -1890,7 +1890,7 @@ static char *copy_linker_arg(const char *p) /* set linker options */ static int tcc_set_linker(TCCState *s, const char *option) -{ +{ while (option && *option) { const char *p = option; @@ -2038,7 +2038,8 @@ enum { TCC_OPTION_MD, TCC_OPTION_MF, TCC_OPTION_x, - TCC_OPTION_stack + TCC_OPTION_stack, + TCC_OPTION_nobss }; #define TCC_OPTION_HAS_ARG 0x0001 @@ -2100,6 +2101,7 @@ static const TCCOption tcc_options[] = { { "MF", TCC_OPTION_MF, TCC_OPTION_HAS_ARG }, { "x", TCC_OPTION_x, TCC_OPTION_HAS_ARG }, { "stack", TCC_OPTION_stack, TCC_OPTION_HAS_ARG | TCC_OPTION_NOSEP}, + { "nobss", TCC_OPTION_nobss, 0 }, { NULL, 0, 0 }, }; @@ -2428,9 +2430,12 @@ ST_FUNC int tcc_parse_args1(TCCState *s, int argc, char **argv) /* ignored */ break; case TCC_OPTION_stack: -#ifdef TCC_TARGET_MEOS - s->pe_stack_size = strtoul(optarg+1, NULL, 10); -#endif +#ifdef TCC_TARGET_MEOS + s->pe_stack_size = strtoul(optarg+1, NULL, 10); +#endif + break; + case TCC_OPTION_nobss: + s->nobss = 1; break; default: if (s->warn_unsupported) { diff --git a/programs/develop/ktcc/trunk/source/tcc.c b/programs/develop/ktcc/trunk/source/tcc.c index 172e92f1e7..18d2714687 100644 --- a/programs/develop/ktcc/trunk/source/tcc.c +++ b/programs/develop/ktcc/trunk/source/tcc.c @@ -128,6 +128,8 @@ static void help(void) " -Bdir use 'dir' as tcc internal library and include path\n" " -MD generate target dependencies for make\n" " -MF depfile put generated dependencies here\n" + "For KolibriOS only:\n" + " -nobss do not emit BSS section into file\n" ); } diff --git a/programs/develop/ktcc/trunk/source/tcc.h b/programs/develop/ktcc/trunk/source/tcc.h index 99dc3bf310..28e96e5388 100644 --- a/programs/develop/ktcc/trunk/source/tcc.h +++ b/programs/develop/ktcc/trunk/source/tcc.h @@ -871,6 +871,7 @@ struct TCCState { int do_bench; /* option -bench */ int gen_deps; /* option -MD */ char *deps_outfile; /* option -MF */ + int nobss; /* option -nobss, omit BSS section (KolibriOS-only) */ ParseArgsState *parse_args_state; }; diff --git a/programs/develop/ktcc/trunk/source/tccmeos.c b/programs/develop/ktcc/trunk/source/tccmeos.c index f431955a0a..b833b4be4f 100644 --- a/programs/develop/ktcc/trunk/source/tccmeos.c +++ b/programs/develop/ktcc/trunk/source/tccmeos.c @@ -180,11 +180,11 @@ void assign_addresses(me_info* me) { si->sh_addr=addr; addr+=si->data_size; - } + } if (me->s1->pe_stack_size < 4096) - addr+=4096; + addr+=4096; else - addr += me->s1->pe_stack_size; + addr += me->s1->pe_stack_size; addr=(addr+4)&(~3); me->header.stack=addr; me->header.memory_size=addr; @@ -272,21 +272,24 @@ int tcc_output_me(TCCState* s1,const char *filename) for(si=me.code_sections;si;si=si->next) fwrite(si->data,1,si->data_size,f); for (si=me.data_sections;si;si=si->next) - fwrite(si->data,1,si->data_size,f); - for (si=me.bss_sections;si;si=si->next) + fwrite(si->data,1,si->data_size,f); + if (!s1->nobss) { - if (si->data == NULL) + for (si=me.bss_sections;si;si=si->next) { -// printf("\nError! BSS data is NULL! size:%i",(int)si->data_size); - si->data = calloc(si->data_size, 1); - } - fwrite(si->data, 1, si->data_size, f); - } -/* - if (me.bss_sections) // Siemargl testin, what we lose - { + if (si->data == NULL) + { + // printf("\nError! BSS data is NULL! size:%i",(int)si->data_size); + si->data = calloc(si->data_size, 1); + } + fwrite(si->data, 1, si->data_size, f); + } + } +/* + if (me.bss_sections) // Siemargl testin, what we lose + { tcc_error_noabort("We lose .BSS section when linking KOS32 executable"); - } + } */ fclose(f); return 0; @@ -314,73 +317,73 @@ char *getcwd(char *buf, size_t size) } #endif - - -static FILE *src_file; -static int next_src_line; - -void close_source_file() -{ - if (src_file) - fclose(src_file); - src_file = NULL; -} - -void load_source_file(char *fname) -{ - close_source_file(); + + +static FILE *src_file; +static int next_src_line; + +void close_source_file() +{ + if (src_file) + fclose(src_file); + src_file = NULL; +} + +void load_source_file(char *fname) +{ + close_source_file(); src_file = fopen(fname,"rt"); - if (!src_file) return; - next_src_line = 1; -} - -int get_src_lines(char *buf, int sz, int start, int end) -// 1 if read -{ - char line[255], *ch; - strcpy(buf, ""); - if (!src_file) return 0; - while (next_src_line < start) // skip - { - ch = fgets(line, sizeof line, src_file); - if (!ch) return 0; - next_src_line++; - } - while (next_src_line <= end) - { - ch = fgets(line, sizeof line, src_file); - if (!ch) return 0; - next_src_line++; - strncat(buf, line, sz - strlen(buf) - 1); - } - // remove newlines - for (ch = buf; *ch; ch++) - if (strchr("\t\n\r", *ch)) *ch = ' '; - - return 1; -} + if (!src_file) return; + next_src_line = 1; +} + +int get_src_lines(char *buf, int sz, int start, int end) +// 1 if read +{ + char line[255], *ch; + strcpy(buf, ""); + if (!src_file) return 0; + while (next_src_line < start) // skip + { + ch = fgets(line, sizeof line, src_file); + if (!ch) return 0; + next_src_line++; + } + while (next_src_line <= end) + { + ch = fgets(line, sizeof line, src_file); + if (!ch) return 0; + next_src_line++; + strncat(buf, line, sz - strlen(buf) - 1); + } + // remove newlines + for (ch = buf; *ch; ch++) + if (strchr("\t\n\r", *ch)) *ch = ' '; + + return 1; +} int tcc_output_dbgme(const char *filename, me_info* me) // by Siemargl. Writes filename.dbg file for source code level debuggin with MTDBG // return 1 on error { FILE *fdbg; - char fname[400], - buf[80]; // no more fits in mtdbg string + char fname[400], + buf[80]; // no more fits in mtdbg string strcpy(fname, filename); strcat(fname, ".dbg"); fdbg = fopen(fname,"wt"); if (!fdbg) return 1; - meos_section_info *si, *ss; - fputs(".text\n", fdbg); // just for mtbg - - // print symbol table with resolved addresses - Elf32_Sym* esym; - for (esym = (Elf32_Sym*)symtab_section->data; esym <= (Elf32_Sym*)(symtab_section->data + symtab_section->data_offset); esym++) - { - if (esym->st_info == 0 || esym->st_info == 4) continue; + meos_section_info *si, *ss; + fputs(".text\n", fdbg); // just for mtbg + + // print symbol table with resolved addresses + Elf32_Sym* esym; + for (esym = (Elf32_Sym*)symtab_section->data; esym <= (Elf32_Sym*)(symtab_section->data + symtab_section->data_offset); esym++) + { + if (esym->st_info == 0 || esym->st_info == 4) continue; int sect = esym->st_shndx; ss = findsection(me, sect); const char *sym_name = strtab_section->data + esym->st_name; @@ -390,82 +393,82 @@ int tcc_output_dbgme(const char *filename, me_info* me) continue; } fprintf(fdbg, "0x%X %s\n", ss->sh_addr + esym->st_value, sym_name); // removed type(%d) esym->st_info - } - - fputs(".text source code links\n", fdbg); // just for mtbg - // print symbol table with resolved addresses - Stab_Sym *stab; - char *str = "", *cur_file = "???", cur_fun[255]; - int cur_line = 0, cur_fun_addr = 0, fun_flag = 0; - strcpy(cur_fun, "fn???"); - for (stab = (Stab_Sym*)stab_section->data; stab <= (Stab_Sym*)(stab_section->data + stab_section->data_offset); stab++) - { - str = ""; - switch(stab->n_type) - { - case 100: // source file, or path - if (stab->n_strx) - { - cur_file = stabstr_section->data + stab->n_strx; - load_source_file(cur_file); - } - else - cur_file = "???"; - strcpy(cur_fun, "fn???"); - cur_line = 0; - cur_fun_addr = 0; - fun_flag = 0; - break; - case 36: // func - cur_fun_addr = 0; - if (stab->n_strx) - { - strcpy(cur_fun, stabstr_section->data + stab->n_strx); - str = strchr(cur_fun, ':'); - if (str) *str = '\0'; - cur_fun_addr = tcc_find_symbol_me(me, cur_fun); - cur_line = stab->n_desc; - fun_flag = 1; - //fprintf(fdbg, "0x%X %s() line(%d)\n", cur_fun_addr, cur_fun, cur_line); // commented as conflicted with direct address - } - else - strcpy(cur_fun, "fn???"); - break; - case 68: // N_SLINE - if (stab->n_value == 0 ) continue; // skip zero offset line - if (fun_flag) // skip string {, as duplicates address - { - fun_flag = 0; - continue; - } - - int line; - if (stab->n_desc > cur_line) - line = cur_line + 1; - else - line = cur_line; - //fprintf(fdbg, "0x%X LINES %d-%d \n", cur_fun_addr + stab->n_value, line, stab->n_desc); - if (get_src_lines(buf, sizeof buf, line, stab->n_desc)) - fprintf(fdbg, "0x%X %s\n", cur_fun_addr + stab->n_value, buf); - - cur_line = stab->n_desc; - break; - default: - continue; - } -/* - if (stab->n_strx) - str = stabstr_section->data + stab->n_strx; - fprintf(fdbg, "0x%X type(%d) str(%s) desc(%d)\n", stab->n_value, stab->n_type, str, stab->n_desc); -*/ - } - -/* for(; si; si = si->next) - { - Section *sr; + } + + fputs(".text source code links\n", fdbg); // just for mtbg + // print symbol table with resolved addresses + Stab_Sym *stab; + char *str = "", *cur_file = "???", cur_fun[255]; + int cur_line = 0, cur_fun_addr = 0, fun_flag = 0; + strcpy(cur_fun, "fn???"); + for (stab = (Stab_Sym*)stab_section->data; stab <= (Stab_Sym*)(stab_section->data + stab_section->data_offset); stab++) + { + str = ""; + switch(stab->n_type) + { + case 100: // source file, or path + if (stab->n_strx) + { + cur_file = stabstr_section->data + stab->n_strx; + load_source_file(cur_file); + } + else + cur_file = "???"; + strcpy(cur_fun, "fn???"); + cur_line = 0; + cur_fun_addr = 0; + fun_flag = 0; + break; + case 36: // func + cur_fun_addr = 0; + if (stab->n_strx) + { + strcpy(cur_fun, stabstr_section->data + stab->n_strx); + str = strchr(cur_fun, ':'); + if (str) *str = '\0'; + cur_fun_addr = tcc_find_symbol_me(me, cur_fun); + cur_line = stab->n_desc; + fun_flag = 1; + //fprintf(fdbg, "0x%X %s() line(%d)\n", cur_fun_addr, cur_fun, cur_line); // commented as conflicted with direct address + } + else + strcpy(cur_fun, "fn???"); + break; + case 68: // N_SLINE + if (stab->n_value == 0 ) continue; // skip zero offset line + if (fun_flag) // skip string {, as duplicates address + { + fun_flag = 0; + continue; + } + + int line; + if (stab->n_desc > cur_line) + line = cur_line + 1; + else + line = cur_line; + //fprintf(fdbg, "0x%X LINES %d-%d \n", cur_fun_addr + stab->n_value, line, stab->n_desc); + if (get_src_lines(buf, sizeof buf, line, stab->n_desc)) + fprintf(fdbg, "0x%X %s\n", cur_fun_addr + stab->n_value, buf); + + cur_line = stab->n_desc; + break; + default: + continue; + } +/* + if (stab->n_strx) + str = stabstr_section->data + stab->n_strx; + fprintf(fdbg, "0x%X type(%d) str(%s) desc(%d)\n", stab->n_value, stab->n_type, str, stab->n_desc); +*/ + } + +/* for(; si; si = si->next) + { + Section *sr; Elf32_Rel *rel, *rel_end; for(sr = me->s1->sections[si->sec_num]->reloc; sr; ) - { + { for (rel = (Elf32_Rel *) sr->data, rel_end = (Elf32_Rel *) (sr->data + sr->data_offset); rel < rel_end; rel++) { int type = ELF32_R_TYPE(rel->r_info); @@ -487,8 +490,8 @@ int tcc_output_dbgme(const char *filename, me_info* me) fprintf(fdbg, "\t0x%X %s\n", ss->sh_addr + esym->st_value, sym_name); } } - } -*/ + } +*/ close_source_file(); fclose(fdbg); return 0;