Ejemplo n.º 1
0
/* cleanup all static data used during compilation */
static void tcc_cleanup(void)
{
	int i, n;
	if (NULL == tcc_state) {
		return;
	}
	tcc_state = NULL;

	/* free -D defines */
	free_defines (NULL);

	/* free tokens */
	n = tok_ident - TOK_IDENT;
	for (i = 0; i < n; i++) {
		free (table_ident[i]);
	}
	free (table_ident);

	/* free sym_pools */
	dynarray_reset (&sym_pools, &nb_sym_pools);
	/* string buffer */
	cstr_free (&tokcstr);
	/* reset symbol stack */
	sym_free_first = NULL;
	/* cleanup from error/setjmp */
	macro_ptr = NULL;
}
Ejemplo n.º 2
0
LIBTCCAPI void tcc_delete(TCCState *s1)
{
	tcc_cleanup ();

	/* free library paths */
	dynarray_reset (&s1->library_paths, &s1->nb_library_paths);
	dynarray_reset (&s1->crt_paths, &s1->nb_crt_paths);

	/* free include paths */
	dynarray_reset (&s1->cached_includes, &s1->nb_cached_includes);
	dynarray_reset (&s1->include_paths, &s1->nb_include_paths);
	dynarray_reset (&s1->sysinclude_paths, &s1->nb_sysinclude_paths);

	free (s1->tcc_lib_path);
	free (s1->soname);
	free (s1->rpath);
	free (s1->init_symbol);
	free (s1->fini_symbol);
	free (s1->outfile);
	free (s1->deps_outfile);
	dynarray_reset (&s1->files, &s1->nb_files);
	dynarray_reset (&s1->target_deps, &s1->nb_target_deps);

	/* target config */
	free (s1->arch);
	free (s1->os);

#ifdef TCC_IS_NATIVE
#ifdef HAVE_SELINUX
	munmap (s1->write_mem, s1->mem_size);
	munmap (s1->runtime_mem, s1->mem_size);
#else
	free (s1->runtime_mem);
#endif
#endif

	free (s1);
}
Ejemplo n.º 3
0
Archivo: pe.c Proyecto: HarryR/sanos
static void pe_build_imports(struct pe_info *pe) {
  int thk_ptr, ent_ptr, dll_ptr, sym_cnt, i;
  DWORD rva_base = pe->thunk->sh_addr - pe->imagebase;
  int ndlls = pe->imp_count;

  for (sym_cnt = i = 0; i < ndlls; ++i) {
    sym_cnt += pe->imp_info[i]->sym_count;
  }
  if (sym_cnt == 0) return;

  pe_align_section(pe->thunk, 16);

  pe->imp_offs = dll_ptr = pe->thunk->data_offset;
  pe->imp_size = (ndlls + 1) * sizeof(struct pe_import_header);
  pe->iat_offs = dll_ptr + pe->imp_size;
  pe->iat_size = (sym_cnt + ndlls) * sizeof(DWORD);
  section_ptr_add(pe->thunk, pe->imp_size + 2 * pe->iat_size);

  thk_ptr = pe->iat_offs;
  ent_ptr = pe->iat_offs + pe->iat_size;

  for (i = 0; i < pe->imp_count; ++i) {
    struct pe_import_header *hdr;
    int k, n, v;
    struct pe_import_info *p = pe->imp_info[i];
    const char *name = pe->s1->loaded_dlls[p->dll_index - 1]->name;

    // Put the DLL name into the import header
    v = put_elf_str(pe->thunk, name);

    hdr = (struct pe_import_header *) (pe->thunk->data + dll_ptr);
    hdr->first_thunk = thk_ptr + rva_base;
    hdr->first_entry = ent_ptr + rva_base;
    hdr->lib_name_offset = v + rva_base;

    for (k = 0, n = p->sym_count; k <= n; ++k) {
      if (k < n) {
        DWORD iat_index = p->symbols[k]->iat_index;
        int sym_index = p->symbols[k]->sym_index;
        Elf32_Sym *imp_sym = (Elf32_Sym *) pe->s1->dynsymtab_section->data + sym_index;
        Elf32_Sym *org_sym = (Elf32_Sym *) symtab_section->data + iat_index;
        const char *name = pe->s1->dynsymtab_section->link->data + imp_sym->st_name;

        org_sym->st_value = thk_ptr;
        org_sym->st_shndx = pe->thunk->sh_num;
        v = pe->thunk->data_offset + rva_base;
        *(WORD *) section_ptr_add(pe->thunk, sizeof(WORD)) = imp_sym->st_other; // Hint
        put_elf_str(pe->thunk, name);
      } else {
        v = 0; // Last entry is zero
      }
      *(DWORD *)(pe->thunk->data + thk_ptr) = v;
      *(DWORD *)(pe->thunk->data + ent_ptr) = v;
      thk_ptr += sizeof(DWORD);
      ent_ptr += sizeof(DWORD);
    }
    dll_ptr += sizeof(struct pe_import_header);
    dynarray_reset(&p->symbols, &p->sym_count);
  }
  dynarray_reset(&pe->imp_info, &pe->imp_count);
}