コード例 #1
0
ファイル: elf_hide.c プロジェクト: jyin0813/OpenBSD-src
void
load_strtab(Elf_Ehdr * pehdr, char *pexe)
{
	Elf_Shdr       *pshdr;
	char           *shname;
	int             i;
	strtab = NULL;
	for (i = 0; i < pehdr->e_shnum; i++) {
		pshdr = (Elf_Shdr *) (pexe + pehdr->e_shoff +
		    (i * pehdr->e_shentsize));

		shname = get_shstr(pshdr->sh_name);
		if (strcmp(".strtab", shname) == 0)
			break;
	}
#ifdef DEBUG
	fprint_shstr(stdout, pshdr->sh_name);
	printf("\n");
#endif

	strtab = (char *) (pexe + pshdr->sh_offset);

	strtabsize = pshdr->sh_size;

#ifdef DEBUG
	dump_strtab();
#endif
}
コード例 #2
0
ファイル: linker.c プロジェクト: ESLab/rtdl
Elf32_Half find_section_index(char *name, Elf32_Ehdr *elf_h)
{
	int i;
	Elf32_Shdr *sect_hdr = (Elf32_Shdr *)((u_int32_t)elf_h + elf_h->e_shoff);
	Elf32_Shdr *shstr_hdr = &sect_hdr[elf_h->e_shstrndx];
	for (i = 0; i < elf_h->e_shnum; i++) {
		char *a = get_shstr(elf_h, shstr_hdr, sect_hdr[i].sh_name);
		if (strcmp(a, name) == 0)
			return i;
	}
	return 0;
}
コード例 #3
0
ファイル: linker.c プロジェクト: ESLab/rtdl
int find_symbol_in_elfhs(Elf32_Sym *in_symbol, Elf32_Sym **out_symbol, task_register_cons **out_symbol_trc,
			 task_register_cons *app_trc, Elf32_Ehdr *sys_elfh, task_register_tree *other_trcs)
{
	Elf32_Sym *final_symbol = NULL;
	task_register_cons *final_symbol_trc = NULL;
	Elf32_Shdr *strtab_sect = find_section(".dynstr", app_trc->elfh);
	char *symbol_name = get_shstr(app_trc->elfh, strtab_sect, in_symbol->st_name);
	INFO_MSG("Relocating symbol %s\n", symbol_name);

	if (in_symbol->st_shndx == SHN_UNDEF) {
		/*
		 * Find the symbol elsewhere.
		 */

		if (other_trcs) {

			task_register_cons *trcp;

			TASK_ACQUIRE_TR_LOCK();

			RB_FOREACH(trcp, task_register_tree_t, other_trcs) {
				if (trcp == app_trc)
					continue;
				DEBUG_MSG("looking for symbol \"%s\" in \"%s\"\n", symbol_name, trcp->name);
				final_symbol = find_symbol(symbol_name, trcp->elfh);
				if (final_symbol == NULL)
					continue;
				if (final_symbol->st_shndx == SHN_UNDEF)
					final_symbol = NULL;
				if (final_symbol != NULL) {
					final_symbol_trc = trcp;
					break;
				}
			}

			TASK_RELEASE_TR_LOCK();

		}

		if (final_symbol == NULL) {
			final_symbol = find_symbol(symbol_name, sys_elfh);
			/*
			 * If the symbol is found in the system elfh,
			 * let the symbol trc be NULL.
			 */
			final_symbol_trc = NULL;
		}

	} else {
コード例 #4
0
ファイル: linker.c プロジェクト: ESLab/rtdl
Elf32_Sym *find_symbol(char *name, Elf32_Ehdr *elf_h)
{
	int i;
	char *tname;

	Elf32_Shdr *symtab_sect = find_section(".symtab", elf_h);
	Elf32_Shdr *strtab_sect = find_section(".strtab", elf_h);

	DEBUG_MSG("Searching for symbol %s in elf @ 0x%x\n", name, (npi_t)elf_h);

	if (symtab_sect == NULL) {
		ERROR_MSG("Found no .symtab section\n");
		return NULL;
	}

	if (strtab_sect == NULL) {
		ERROR_MSG("Found no .strtab section\n");
		return NULL;
	}

	if (symtab_sect->sh_entsize != sizeof(Elf32_Sym)) {
		ERROR_MSG("Wrong .symtab entry size\n");
		return NULL;
	}

	Elf32_Sym *syms = (Elf32_Sym *)((u_int32_t)elf_h + symtab_sect->sh_offset);

	u_int32_t n = symtab_sect->sh_size / symtab_sect->sh_entsize;
	INFO_MSG("Found %i entries in .symtab (sect at address 0x%x)\n", n, (unsigned int)syms);

	for (i = 0; i < n; i++) {
		tname = get_shstr(elf_h, strtab_sect, syms[i].st_name);
		if (strcmp(tname, name) == 0) {
			return &syms[i];
		}
	}
	return NULL;
}
コード例 #5
0
ファイル: elf_hide.c プロジェクト: jyin0813/OpenBSD-src
void
elf_hide(int pfile, char *p)
{
	int             i;
	Elf_Ehdr       *pehdr;
	Elf_Shdr       *pshdr;
	Elf_Phdr       *pphdr;
	struct stat     sb;

	pexe = p;
	pehdr = (Elf_Ehdr *) pexe;

#ifdef DEBUG
	printf("elf header\n");
	printf("e_type %x\n", pehdr->e_type);
	printf("e_machine %x\n", pehdr->e_machine);
	printf("e_version %x\n", pehdr->e_version);
	printf("e_entry %x\n", pehdr->e_entry);
	printf("e_phoff %x\n", pehdr->e_phoff);
	printf("e_shoff %x\n", pehdr->e_shoff);
	printf("e_flags %x\n", pehdr->e_flags);
	printf("e_ehsize %x\n", pehdr->e_ehsize);
	printf("e_phentsize %x\n", pehdr->e_phentsize);
	printf("e_phnum %x\n", pehdr->e_phnum);
	printf("e_shentsize %x\n", pehdr->e_shentsize);
	printf("e_shnum %x\n", pehdr->e_shnum);
	printf("e_shstrndx %x\n", pehdr->e_shstrndx);
#endif

	load_shstr_tab(pehdr, pexe);
#ifdef DEBUG
	for (i = 0; i < pehdr->e_shnum; i++) {
		pshdr = (Elf_Phdr *) (pexe + pehdr->e_shoff +
		    (i * pehdr->e_shentsize));

		printf("section header %d\n", i);
		printf("sh_name %x ", pshdr->sh_name);
		fprint_shstr(stdout, pshdr->sh_name);
		printf("\n");
		printf("sh_type %x\n", pshdr->sh_type);
		printf("sh_flags %x\n", pshdr->sh_flags);
		printf("sh_addr %x\n", pshdr->sh_addr);
		printf("sh_offset %x\n", pshdr->sh_offset);
		printf("sh_size %x\n", pshdr->sh_size);
		printf("sh_link %x\n", pshdr->sh_link);
		printf("sh_info %x\n", pshdr->sh_info);
		printf("sh_addralign %x\n", pshdr->sh_addralign);
		printf("sh_entsize %x\n", pshdr->sh_entsize);
	}
#endif				/* DEBUG */

#ifdef DEBUG
	for (i = 0; i < pehdr->e_phnum; i++) {
		pshdr = (Elf_Phdr *) (pexe + pehdr->e_phoff +
		    (i * pehdr->e_phentsize));

		printf("program header %d\n", i);
		printf("p_type %x\n", pphdr->p_type);
		printf("p_offset %x\n", pphdr->p_offset);
		printf("p_vaddr %x\n", pphdr->p_vaddr);
		printf("p_paddr %x\n", pphdr->p_paddr);
		printf("p_filesz %x\n", pphdr->p_filesz);
		printf("p_memsz %x\n", pphdr->p_memsz);
		printf("p_flags %x\n", pphdr->p_flags);
		printf("p_align %x\n", pphdr->p_align);
	}
#endif				/* DEBUG */
#if 0
	for (i = 0; i < pehdr->e_shnum; i++) {
		pshdr = (Elf_Phdr *) (pexe + pehdr->e_shoff +
		    (i * pehdr->e_shentsize));
		if (strcmp(".strtab", get_shstr(pshdr->sh_name)) == 0)
			break;
	}
	fprint_shstr(stdout, pshdr->sh_name);
	printf("\n");
#endif

	load_strtab(pehdr, pexe);
	load_symtab(pehdr, pexe);

	munmap(pexe, sb.st_size);
	close(pfile);
}