Exemplo n.º 1
0
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;
    }
}
Exemplo n.º 2
0
/* ------------------------------------------------------------- */
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;
}
Exemplo n.º 3
0
Arquivo: pe.c Projeto: HarryR/sanos
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;
}
Exemplo n.º 4
0
Arquivo: pe.c Projeto: HarryR/sanos
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;
  }
}