37 #define N_ELF_MACHINE_TYPES 89
39 "NONE",
"M32",
"SPARC",
"386",
40 "68K",
"88K",
"486",
"860",
41 "MIPS",
"S370",
"MIPS_RS3_LE",
"RS6000",
42 "unknown12",
"unknown13",
"unknown14",
"PARISC",
43 "NCUBE",
"VPP500",
"SPARC32PLUS",
"960",
44 "PPC",
"PPC64",
"unknown22",
"unknown23",
45 "unknown24",
"unknown25",
"unknown26",
"unknown27",
46 "unknown28",
"unknown29",
"unknown30",
"unknown31",
47 "unknown32",
"unknown33",
"unknown34",
"unknown35",
48 "V800",
"FR20",
"RH32",
"RCE",
49 "ARM",
"ALPHA",
"SH",
"SPARCV9",
50 "TRICORE",
"ARC",
"H8_300",
"H8_300H",
51 "H8S",
"H8_500",
"IA_64",
"MIPS_X",
52 "COLDFIRE",
"68HC12",
"unknown54",
"unknown55",
53 "unknown56",
"unknown57",
"unknown58",
"unknown59",
54 "unknown60",
"unknown61",
"AMD64",
"unknown63",
55 "unknown64",
"unknown65",
"unknown66",
"unknown67",
56 "unknown68",
"unknown69",
"unknown70",
"unknown71",
57 "unknown72",
"unknown73",
"unknown74",
"unknown75",
58 "unknown76",
"unknown77",
"unknown78",
"unknown79",
59 "unknown80",
"unknown81",
"unknown82",
"AVR",
60 "unknown84",
"unknown85",
"unknown86",
"unknown87",
75 static void file_load_elf(
struct machine *m,
struct memory *mem,
76 char *filename, uint64_t *entrypointp,
int arch, uint64_t *gpp,
77 int *byte_order, uint64_t *tocp)
84 int elf64, encoding, eflags;
86 int ephnum, ephentsize, eshnum, eshentsize;
95 int chunk_len = 1024, align_len;
96 char *symbol_strings = NULL;
97 size_t symbol_length = 0;
103 f = fopen(filename,
"r");
111 fprintf(stderr,
"%s: not an ELF file image\n", filename);
116 fprintf(stderr,
"%s: not an ELF file image\n", filename);
126 fseek(
f, 0, SEEK_SET);
129 fprintf(stderr,
"%s: not an ELF64 file image\n",
135 fprintf(stderr,
"%s: unknown ELF class '%i'\n",
142 fprintf(stderr,
"%s: unknown data encoding '%i'\n",
159 fprintf(stderr,
"%s: incorrect phentsize? %i, should "
160 "be %i\nPerhaps this is a dynamically linked "
161 "binary (which isn't supported yet).\n", filename,
166 fprintf(stderr,
"%s: incorrect shentsize? %i, should "
167 "be %i\nPerhaps this is a dynamically linked "
168 "binary (which isn't supported yet).\n", filename,
184 fprintf(stderr,
"%s: incorrect phentsize? %i, should "
185 "be %i\nPerhaps this is a dynamically linked "
186 "binary (which isn't supported yet).\n", filename,
191 fprintf(stderr,
"%s: incorrect shentsize? %i, should "
192 "be %i\nPerhaps this is a dynamically linked "
193 "binary (which isn't supported yet).\n", filename,
200 fprintf(stderr,
"%s is not an ELF Executable file, type = %i\n",
309 fatal(
"file.c: INTERNAL ERROR: Unimplemented arch!\n");
312 fprintf(stderr,
"%s: this is a ", filename);
314 fprintf(stderr,
"%s", elf_machine_type[emachine]);
316 fprintf(stderr,
"machine type '%i'", emachine);
317 fprintf(stderr,
" ELF binary!\n");
323 s =
"function descriptor at";
325 debug(
"ELF%i %s, %s 0x", elf64? 64 : 32,
326 encoding ==
ELFDATA2LSB?
"LSB (LE)" :
"MSB (BE)", s);
329 debug(
"%016" PRIx64
"\n", (uint64_t) eentry);
331 debug(
"%08" PRIx32
"\n", (uint32_t) eentry);
336 if (arch ==
ARCH_SH && (eentry & 1)) {
337 fatal(
"SH64: 32-bit instruction encoding: TODO\n");
345 for (i=0; i<ephnum; i++) {
356 fseek(
f, ephoff + i * ephentsize, SEEK_SET);
381 fprintf(stderr,
"Could not read Phdr from %s. Aborting.\n", filename);
391 if ( (elf64 && (p_vaddr >> 60) != 0) ||
392 (!elf64 && (p_vaddr >> 28) != 0) )
397 if (p_memsz != 0 && (p_type ==
PT_LOAD ||
399 debug(
"chunk %i (", i);
403 debug(
"0x%08" PRIx32, (uint32_t) p_type);
405 debug(
") @ 0x%" PRIx64
", vaddr 0x", (uint64_t) p_offset);
408 debug(
"%016" PRIx64, (uint64_t) p_vaddr);
410 debug(
"%08" PRIx32, (uint32_t) p_vaddr);
412 debug(
" len=0x%" PRIx64
"\n", (uint64_t) p_memsz);
414 if (p_vaddr != p_paddr) {
416 debug(
"NOTE: vaddr (0x%" PRIx64
") and "
417 "paddr (0x%" PRIx64
") differ; using "
418 "vaddr\n", (uint64_t) p_vaddr,
421 debug(
"NOTE: vaddr (0x%08" PRIx32
") and "
422 "paddr (0x%08" PRIx32
") differ; usin"
423 "g vaddr\n", (uint32_t) p_vaddr,
427 if (p_memsz < p_filesz) {
428 fprintf(stderr,
"%s: memsz < filesz. TODO: how"
429 " to handle this? memsz=%016" PRIx64
430 " filesz=%016" PRIx64
"\n", filename,
431 (uint64_t) p_memsz, (uint64_t) p_filesz);
435 fseek(
f, p_offset, SEEK_SET);
437 if ((p_vaddr & 0xf)==0) align_len = 0x10;
438 if ((p_vaddr & 0x3f)==0) align_len = 0x40;
439 if ((p_vaddr & 0xff)==0) align_len = 0x100;
440 if ((p_vaddr & 0xfff)==0) align_len = 0x1000;
441 if ((p_vaddr & 0x3fff)==0) align_len = 0x4000;
442 if ((p_vaddr & 0xffff)==0) align_len = 0x10000;
443 ofs = 0; len = chunk_len = align_len;
444 while (ofs < (int64_t)p_filesz && len==chunk_len) {
450 if (align_len < 0x10000 &&
451 ((p_vaddr + ofs) & 0xffff)==0) {
453 len = chunk_len = align_len;
456 }
else if (align_len < 0x1000 &&
457 ((p_vaddr + ofs) & 0xfff)==0) {
459 len = chunk_len = align_len;
464 len = fread(&ch[0], 1, chunk_len,
f);
465 if (ofs + len > (int64_t)p_filesz)
466 len = p_filesz - ofs;
471 len_to_copy = (j + align_len) <= len?
474 p_vaddr + ofs, &ch[j], len_to_copy,
490 for (i=0; i<eshnum; i++) {
491 int sh_name, sh_type, sh_flags, sh_link, sh_info, sh_entsize;
492 uint64_t sh_addr, sh_size, sh_addralign;
499 fseek(
f, eshoff + i * eshentsize, SEEK_SET);
504 fprintf(stderr,
"couldn't read header\n");
521 fprintf(stderr,
"couldn't read header\n");
549 n_entries = sh_size / sh_entsize;
551 fseek(
f, sh_offset, SEEK_SET);
554 if (symbols_sym64 != NULL)
560 len2 = fread(symbols_sym64, 1, sh_entsize *
563 if (symbols_sym32 != NULL)
569 len2 = fread(symbols_sym32, 1,
570 sh_entsize * n_entries,
f);
573 if (len2 != sh_size) {
574 fprintf(stderr,
"could not read symbols from "
579 debug(
"%i symbol entries at 0x%" PRIx64
"\n",
580 (
int) n_entries, (uint64_t) sh_offset);
582 n_symbols = n_entries;
593 if (sh_type ==
SHT_STRTAB && sh_size > symbol_length) {
594 if (symbol_strings != NULL)
595 free(symbol_strings);
599 fseek(
f, sh_offset, SEEK_SET);
600 size_t len2 = fread(symbol_strings, 1, sh_size,
f);
601 if (len2 != sh_size) {
602 fprintf(stderr,
"could not read symbols from "
607 debug(
"%i bytes of symbol strings at 0x%" PRIx64
"\n",
608 (
int) sh_size, (uint64_t) sh_offset);
610 symbol_strings[sh_size] =
'\0';
611 symbol_length = sh_size;
618 if (symbol_strings != NULL) {
619 for (i=0; i<n_symbols; i++) {
620 uint64_t st_name,
addr, size;
624 sym64 = symbols_sym64[i];
630 sym32 = symbols_sym32[i];
650 addr, size, symbol_strings + st_name,
654 if (strcmp(symbol_strings + st_name,
"_gp") == 0) {
655 debug(
"found _gp address: 0x");
657 debug(
"%016" PRIx64
"\n", (uint64_t)
addr);
665 *entrypointp = eentry;
684 unsigned char b[
sizeof(uint64_t)];
692 debug(
" [WARNING: could not read memory?] ");
695 *entrypointp = ((uint64_t)b[0] << 56) +
696 ((uint64_t)b[1] << 48) + ((uint64_t)b[2] << 40) +
697 ((uint64_t)b[3] << 32) + ((uint64_t)b[4] << 24) +
698 ((uint64_t)b[5] << 16) + ((uint64_t)b[6] << 8) +
704 fatal(
" [WARNING: could not read memory?] ");
706 toc_base = ((uint64_t)b[0] << 56) +
707 ((uint64_t)b[1] << 48) + ((uint64_t)b[2] << 40) +
708 ((uint64_t)b[3] << 32) + ((uint64_t)b[4] << 24) +
709 ((uint64_t)b[5] << 16) + ((uint64_t)b[6] << 8) +
712 debug(
"entrypoint 0x%016" PRIx64
", toc_base 0x%016" PRIx64
"\n",
713 (uint64_t) *entrypointp, (uint64_t) toc_base);
718 n_executables_loaded ++;