static char *default_outputfile(TCCState *s, const char *first_file) { char buf[1024]; char *ext; const char *name = "a"; if (first_file && strcmp(first_file, "-")) name = tcc_basename(first_file); pstrcpy(buf, sizeof(buf), name); ext = tcc_fileextension(buf); #ifdef TCC_TARGET_PE if (s->output_type == TCC_OUTPUT_DLL) strcpy(ext, ".dll"); else if (s->output_type == TCC_OUTPUT_EXE) strcpy(ext, ".exe"); else #endif if (( (s->output_type == TCC_OUTPUT_OBJ && !s->option_r) || (s->output_type == TCC_OUTPUT_PREPROCESS) ) && *ext) strcpy(ext, ".o"); else strcpy(buf, "a.out"); return tcc_strdup(buf); }
static void gen_makedeps(TCCState *s, const char *target, const char *filename) { FILE *depout; char buf[1024], *ext; int i; if (!filename) { /* compute filename automatically * dir/file.o -> dir/file.d */ pstrcpy(buf, sizeof(buf), target); ext = tcc_fileextension(buf); pstrcpy(ext, sizeof(buf) - (ext-buf), ".d"); filename = buf; } if (s->verbose) printf("<- %s\n", filename); /* XXX return err codes instead of error() ? */ depout = fopen(filename, "w"); if (!depout) tcc_error("could not open '%s'", filename); fprintf(depout, "%s : \\\n", target); for (i=0; i<s->nb_target_deps; ++i) fprintf(depout, " %s \\\n", s->target_deps[i]); fprintf(depout, "\n"); fclose(depout); }
ST_FUNC int tcc_add_file_internal(TCCState *s1, const char *filename, int flags) { const char *ext; int ret; /* find source file type with extension */ ext = tcc_fileextension (filename); if (ext[0]) { ext++; } /* open the file */ ret = tcc_open (s1, filename); if (ret < 0) { if (flags & AFF_PRINT_ERROR) { tcc_error ("file '%s' not found", filename); } return ret; } /* update target deps */ dynarray_add ((void ***) &s1->target_deps, &s1->nb_target_deps, strdup (filename)); if (flags & AFF_PREPROCESS) { ret = tcc_preprocess (s1); goto the_end; } if (!ext[0] || !PATHCMP (ext, "c") || !PATHCMP (ext, "h") || !PATHCMP (ext, "cparse")) { /* C file assumed */ ret = tcc_compile (s1); goto the_end; } if (ret < 0) { tcc_error ("unrecognized file type"); } the_end: tcc_close (); return ret; }
ST_FN void pe_build_exports(struct pe_info *pe) { Elf32_Sym *sym; int sym_index, sym_end; DWORD rva_base, func_o, name_o, ord_o, str_o; struct pe_export_header *hdr; int sym_count, n, ord, *sorted, *sp; FILE *op; char buf[MAX_PATH]; const char *dllname; const char *name; rva_base = pe->thunk->sh_addr - pe->imagebase; sym_count = 0, n = 1, sorted = NULL, op = NULL; sym_end = symtab_section->data_offset / sizeof(Elf32_Sym); for (sym_index = 1; sym_index < sym_end; ++sym_index) { sym = (Elf32_Sym*)symtab_section->data + sym_index; name = symtab_section->link->data + sym->st_name; if ((sym->st_other & 1) /* export only symbols from actually written sections */ && pe->s1->sections[sym->st_shndx]->sh_addr) { dynarray_add((void***)&sorted, &sym_count, (void*)n); dynarray_add((void***)&sorted, &sym_count, (void*)name); } ++n; #if 0 if (sym->st_other & 1) printf("export: %s\n", name); if (sym->st_other & 2) printf("stdcall: %s\n", name); #endif } if (0 == sym_count) return; sym_count /= 2; qsort (sorted, sym_count, 2 * sizeof sorted[0], sym_cmp); pe_align_section(pe->thunk, 16); dllname = tcc_basename(pe->filename); pe->exp_offs = pe->thunk->data_offset; func_o = pe->exp_offs + sizeof(struct pe_export_header); name_o = func_o + sym_count * sizeof (DWORD); ord_o = name_o + sym_count * sizeof (DWORD); str_o = ord_o + sym_count * sizeof(WORD); hdr = section_ptr_add(pe->thunk, str_o - pe->exp_offs); hdr->Characteristics = 0; hdr->Base = 1; hdr->NumberOfFunctions = sym_count; hdr->NumberOfNames = sym_count; hdr->AddressOfFunctions = func_o + rva_base; hdr->AddressOfNames = name_o + rva_base; hdr->AddressOfNameOrdinals = ord_o + rva_base; hdr->Name = str_o + rva_base; put_elf_str(pe->thunk, dllname); #if 1 /* automatically write exports to <output-filename>.def */ strcpy(buf, pe->filename); strcpy(tcc_fileextension(buf), ".def"); op = fopen(buf, "w"); if (NULL == op) { error_noabort("could not create '%s': %s", buf, strerror(errno)); } else { fprintf(op, "LIBRARY %s\n\nEXPORTS\n", dllname); if (pe->s1->verbose) printf("<- %s (%d symbols)\n", buf, sym_count); } #endif for (sp = sorted, ord = 0; ord < sym_count; ++ord, sp += 2) { sym_index = sp[0], name = (const char *)sp[1]; /* insert actual address later in pe_relocate_rva */ put_elf_reloc(symtab_section, pe->thunk, func_o, R_386_RELATIVE, sym_index); *(DWORD*)(pe->thunk->data + name_o) = pe->thunk->data_offset + rva_base; *(WORD*)(pe->thunk->data + ord_o) = ord; put_elf_str(pe->thunk, name); func_o += sizeof (DWORD); name_o += sizeof (DWORD); ord_o += sizeof (WORD); if (op) fprintf(op, "%s\n", name); } pe->exp_size = pe->thunk->data_offset - pe->exp_offs; tcc_free(sorted); }