ST_FN void pe_add_runtime_ex(TCCState *s1, struct pe_info *pe) { const char *start_symbol; unsigned long addr = 0; int pe_type = 0; if (find_elf_sym(symtab_section, "_WinMain@16")) pe_type = PE_GUI; else if (TCC_OUTPUT_DLL == s1->output_type) { pe_type = PE_DLL; /* need this for 'tccelf.c:relocate_section()' */ s1->output_type = TCC_OUTPUT_EXE; } start_symbol = TCC_OUTPUT_MEMORY == s1->output_type ? PE_GUI == pe_type ? "_runwinmain" : NULL : PE_DLL == pe_type ? "__dllstart@12" : PE_GUI == pe_type ? "_winstart" : "_start" ; /* grab the startup code from libtcc1 */ if (start_symbol) add_elf_sym(symtab_section, 0, 0, ELF32_ST_INFO(STB_GLOBAL, STT_NOTYPE), 0, SHN_UNDEF, start_symbol); if (0 == s1->nostdlib) { tcc_add_library(s1, "tcc1"); #ifdef __CYGWIN__ tcc_add_library(s1, "cygwin1"); #else tcc_add_library(s1, "msvcrt"); #endif tcc_add_library(s1, "kernel32"); if (PE_DLL == pe_type || PE_GUI == pe_type) { tcc_add_library(s1, "user32"); tcc_add_library(s1, "gdi32"); } } if (start_symbol) { addr = (unsigned long)tcc_get_symbol_err(s1, start_symbol); if (s1->output_type == TCC_OUTPUT_MEMORY && addr) /* for -run GUI's, put '_runwinmain' instead of 'main' */ add_elf_sym(symtab_section, addr, 0, ELF32_ST_INFO(STB_GLOBAL, STT_NOTYPE), 0, text_section->sh_num, "main"); } if (pe) { pe->type = pe_type; pe->start_addr = addr; } }
/* ------------------------------------------------------------- */ PUB_FN int pe_load_def_file(TCCState *s1, int fd) { DLLReference *dllref; int state = 0, ret = -1; char line[400], dllname[80], *p; FILE *fp = fdopen(dup(fd), "rb"); if (NULL == fp) goto quit; for (;;) { p = get_line(line, sizeof line, fp); if (NULL == p) break; if (0 == *p || ';' == *p) continue; switch (state) { case 0: if (0 != strnicmp(p, "LIBRARY", 7)) goto quit; strcpy(dllname, trimfront(p+7)); ++state; continue; case 1: if (0 != stricmp(p, "EXPORTS")) goto quit; ++state; continue; case 2: dllref = tcc_malloc(sizeof(DLLReference) + strlen(dllname)); strcpy(dllref->name, dllname); dllref->level = 0; dynarray_add((void ***) &s1->loaded_dlls, &s1->nb_loaded_dlls, dllref); ++state; default: add_elf_sym(s1->dynsymtab_section, s1->nb_loaded_dlls, 0, ELF32_ST_INFO(STB_GLOBAL, STT_FUNC), 0, text_section->sh_num, p); continue; } } ret = 0; quit: if (fp) fclose(fp); if (ret) error_noabort("unrecognized export definition file format"); return ret; }
int pe_load_def_file(TCCState *s1, int fd) { DLLReference *dllref; int state = 0, ret = -1, hint; char line[400], dllname[80], *p, *ordinal; FILE *fp = fdopen(dup(fd), "rb"); if (fp == NULL) goto quit; for (;;) { p = get_line(line, sizeof line, fp); if (p == NULL) break; if (*p == 0 || *p == ';') continue; switch (state) { case 0: if (strncasecmp(p, "LIBRARY", 7) != 0) goto quit; strcpy(dllname, trimfront(p + 7)); ++state; continue; case 1: if (strcasecmp(p, "EXPORTS") != 0) goto quit; ++state; continue; case 2: dllref = tcc_malloc(sizeof(DLLReference) + strlen(dllname)); strcpy(dllref->name, dllname); dllref->level = 0; dynarray_add((void ***) &s1->loaded_dlls, &s1->nb_loaded_dlls, dllref); ++state; default: hint = 0; ordinal = strchr(p, '@'); if (ordinal) { *ordinal = 0; trimback(p, ordinal); ordinal++; hint = atoi(ordinal); } add_elf_sym(s1->dynsymtab_section, s1->nb_loaded_dlls, 0, ELF32_ST_INFO(STB_GLOBAL, STT_FUNC), hint, text_section->sh_num, p); continue; } } ret = 0; quit: if (fp) fclose(fp); if (ret) error_noabort("unrecognized export definition file format"); return ret; }
static void pe_add_runtime_ex(TCCState *s1, struct pe_info *pe) { const char *start_symbol; unsigned long addr = 0; int pe_type = 0; int start_sym_index; if (find_elf_sym(symtab_section, "_WinMain@16")) { pe_type = PE_GUI; } else if (s1->output_type == TCC_OUTPUT_DLL) { pe_type = PE_DLL; // Need this for 'tccelf.c:relocate_section()' s1->output_type = TCC_OUTPUT_EXE; } else { pe_type = PE_EXE; } start_symbol = s1->start_symbol; if (!start_symbol) { start_symbol = pe_type == PE_DLL ? "_DllMain@12" : "mainCRTStartup"; } start_sym_index = add_elf_sym(symtab_section, 0, 0, ELF32_ST_INFO(STB_GLOBAL, STT_NOTYPE), 0, SHN_UNDEF, start_symbol); tcc_get_symbol_err(s1, start_symbol); if (s1->nostdlib == 0) { tcc_add_library(s1, "c"); tcc_add_library(s1, "os"); } if (pe) { pe->type = pe_type; pe->start_sym_index = start_sym_index; pe->stub = s1->stub; pe->def = s1->def_file; pe->filealign = s1->filealign; } }