45 #define N_ELF_MACHINE_TYPES 244
47 "NONE",
"M32",
"SPARC",
"386",
48 "68K",
"88K",
"486",
"i860",
49 "MIPS",
"S370",
"MIPS_RS3_LE",
"RS6000",
50 "unknown12",
"unknown13",
"unknown14",
"PARISC",
51 "NCUBE",
"VPP500",
"SPARC32PLUS",
"i960",
52 "PPC",
"PPC64",
"unknown22",
"unknown23",
53 "unknown24",
"unknown25",
"unknown26",
"unknown27",
54 "unknown28",
"unknown29",
"unknown30",
"unknown31",
55 "unknown32",
"unknown33",
"unknown34",
"unknown35",
56 "V800",
"FR20",
"RH32",
"RCE",
57 "ARM",
"ALPHA",
"SH",
"SPARCV9",
58 "TRICORE",
"ARC",
"H8_300",
"H8_300H",
59 "H8S",
"H8_500",
"IA_64",
"MIPS_X",
60 "COLDFIRE",
"68HC12",
"Fujitsu MMA",
"Siemens PCP",
61 "nCPU",
"NDR1",
"STARCORE",
"ME16",
62 "ST100",
"TINYJ",
"AMD64",
"PDSP",
63 "PDP10",
"PDP11",
"FX66",
"ST9PLUS",
64 "ST7",
"68HC16",
"68HC11",
"68HC08",
65 "68HC05",
"SVX",
"ST19",
"VAX",
66 "CRIS",
"JAVELIN",
"FIREPATH",
"ZSP",
67 "MMIX",
"HUANY",
"PRISM",
"AVR",
68 "FR30",
"D10V",
"D30V",
"V850",
69 "M32R",
"MN10300",
"MN10200",
"picoJava",
70 "OR1K",
"ARC_A5",
"Xtensa",
"Alphamosaic VideoCore",
71 "TMM_GPP",
"NS32K",
"TPC",
"SNP1K",
72 "unknown1xx",
"unknown1xx",
"unknown1xx",
"unknown1xx",
73 "unknown1xx",
"unknown1xx",
"unknown1xx",
"unknown1xx",
74 "unknown1xx",
"unknown1xx",
"unknown1xx",
"unknown1xx",
75 "unknown1xx",
"unknown1xx",
"unknown1xx",
"unknown1xx",
76 "unknown1xx",
"unknown1xx",
"unknown1xx",
"unknown1xx",
77 "unknown1xx",
"unknown1xx",
"unknown1xx",
"unknown1xx",
78 "unknown1xx",
"unknown1xx",
"unknown1xx",
"unknown1xx",
79 "unknown1xx",
"unknown1xx",
"unknown1xx",
"unknown1xx",
80 "unknown1xx",
"unknown1xx",
"unknown1xx",
"unknown1xx",
81 "unknown1xx",
"unknown1xx",
"unknown1xx",
"unknown1xx",
82 "unknown1xx",
"unknown1xx",
"unknown1xx",
"unknown1xx",
83 "unknown1xx",
"unknown1xx",
"unknown1xx",
"unknown1xx",
84 "unknown1xx",
"unknown1xx",
"unknown1xx",
"unknown1xx",
85 "unknown1xx",
"unknown1xx",
"unknown1xx",
"unknown1xx",
86 "unknown1xx",
"unknown1xx",
"unknown1xx",
"unknown1xx",
87 "unknown1xx",
"unknown1xx",
"unknown1xx",
"unknown1xx",
88 "unknown1xx",
"unknown1xx",
"unknown1xx",
"unknown1xx",
89 "unknown1xx",
"unknown1xx",
"unknown1xx",
"unknown1xx",
90 "unknown1xx",
"unknown1xx",
"unknown1xx",
"unknown1xx",
91 "unknown1xx",
"unknown1xx",
"unknown1xx",
"unknown1xx",
92 "unknown1xx",
"unknown1xx",
"unknown1xx",
"unknown1xx",
93 "unknown1xx",
"unknown1xx",
"unknown1xx",
"TILE64",
94 "TILEPro",
"MicroBlaze",
"unknown1xx",
"unknown1xx",
95 "TILE-GX",
"unknown1xx",
"unknown1xx",
"unknown1xx",
96 "unknown1xx",
"unknown1xx",
"unknown1xx",
"unknown1xx",
97 "unknown1xx",
"unknown1xx",
"unknown1xx",
"unknown1xx",
98 "unknown1xx",
"unknown1xx",
"unknown1xx",
"unknown1xx",
99 "unknown1xx",
"unknown1xx",
"unknown1xx",
"unknown1xx",
100 "unknown1xx",
"unknown1xx",
"unknown1xx",
"unknown1xx",
101 "unknown1xx",
"unknown1xx",
"unknown1xx",
"unknown1xx",
102 "Zilog Z80",
"unknown1xx",
"unknown1xx",
"unknown1xx",
103 "unknown1xx",
"unknown1xx",
"unknown1xx",
"unknown1xx",
104 "unknown1xx",
"unknown1xx",
"unknown1xx",
"unknown1xx",
105 "unknown1xx",
"unknown1xx",
"unknown1xx",
"unknown1xx",
106 "unknown1xx",
"unknown1xx",
"unknown1xx",
"unknown1xx",
107 "unknown1xx",
"unknown1xx",
"unknown1xx",
"RISC-V",
140 ss <<
"ELF Unknown class " << elfClass;
152 messages <<
"Target is not an AddressDataBus.\n";
157 if (!file.is_open()) {
158 messages <<
"Unable to read file.\n";
169 memset(buf, 0,
sizeof(buf));
170 file.read(buf,
sizeof(buf));
180 messages <<
"Not an ELF.\n";
189 messages <<
"Unknown ELF class.\n";
193 messages <<
"Unknown ELF data encoding.\n";
197 messages <<
"Unknown ELF version.\n";
203 #define ELF_HEADER_VAR(hdr32,hdr64,type,name) type name = elf32? hdr32->name \
205 if (elfDataEncoding == ELFDATA2LSB) { \
206 int size = elf32? sizeof(hdr32->name) : sizeof(hdr64->name); \
208 case 2: name = LE16_TO_HOST(name); break; \
209 case 4: name = LE32_TO_HOST(name); break; \
210 case 8: name = LE64_TO_HOST(name); break; \
213 int size = elf32? sizeof(hdr32->name) : sizeof(hdr64->name); \
215 case 2: name = BE16_TO_HOST(name); break; \
216 case 4: name = BE32_TO_HOST(name); break; \
217 case 8: name = BE64_TO_HOST(name); break; \
224 messages <<
"ELF file is not an Executable.\n";
240 if (e_phentsize != expectedPhentSize) {
241 messages <<
"Incorrect ELF phentsize? " << e_phentsize <<
", should "
242 "be " << expectedPhentSize <<
"\n"
243 "Perhaps this is a dynamically linked "
244 "binary (which isn't supported yet).\n";
249 if (e_shentsize != expectedShentSize) {
250 messages <<
"Incorrect ELF shentsize? " << e_shentsize <<
", should "
251 "be " << expectedShentSize <<
"\n"
252 "Perhaps this is a dynamically linked "
253 "binary (which isn't supported yet).\n";
258 messages << elf_machine_type[e_machine];
260 messages <<
"machine type '" << e_machine <<
"'";
261 messages <<
" ELF" << (elf32? 32 : 64) <<
" ";
263 messages << (elfDataEncoding ==
ELFDATA2LSB?
"LSB (LE)" :
"MSB (BE)") <<
": ";
266 messages <<
"PPC function descriptor at";
268 messages <<
"entry point";
271 messages.flags(std::ios::hex);
274 if (e_machine ==
EM_MIPS && elf32)
275 e_entry = (int32_t) e_entry;
277 uint64_t display_entry_point = e_entry;
281 if (e_machine ==
EM_MIPS && (e_entry & 1)) {
282 display_entry_point &= ~1;
287 bool shmedia =
false;
288 if (e_machine ==
EM_SH && (e_entry & 1)) {
289 display_entry_point &= ~1;
294 messages << setw(8) << setfill(
'0') << (uint32_t) display_entry_point;
296 messages << setw(16) << setfill(
'0') << (uint64_t) display_entry_point;
299 messages <<
" (MIPS16 encoding)";
302 messages <<
" (SHmedia encoding)";
308 for (i=0; i<e_phnum; ++i) {
310 file.seekg(e_phoff + i * e_phentsize, std::ios::beg);
313 assert(
sizeof(phdr_buf) >=
sizeof(
Elf32_Phdr));
314 assert(
sizeof(phdr_buf) >=
sizeof(
Elf64_Phdr));
318 memset(phdr_buf, 0,
sizeof(phdr_buf));
321 file.read(phdr_buf, toRead);
322 if (file.gcount() != toRead) {
323 messages <<
"Unable to read Phdr.\n";
337 if (p_memsz < p_filesz) {
338 messages <<
"memsz < filesz. TODO: how"
339 " to handle this? memsz = " << p_memsz <<
340 ", filesz = " << p_filesz <<
"\n";
345 if (e_machine ==
EM_MIPS && elf32)
346 p_vaddr = (int32_t) p_vaddr;
348 messages.flags(std::ios::hex);
349 messages <<
"loadable chunk: vaddr 0x";
352 messages << setw(8) << setfill(
'0') << (uint32_t) p_vaddr;
354 messages << setw(16) << setfill(
'0') << (uint64_t) p_vaddr;
356 messages.flags(std::ios::dec);
357 messages <<
", " << p_filesz <<
" bytes\n";
359 file.seekg(p_offset, std::ios::beg);
361 uint64_t bytesRead = 0;
362 uint64_t vaddrToWriteTo = p_vaddr;
364 while (bytesRead < p_filesz) {
365 int sizeToRead =
sizeof(databuf);
366 if (sizeToRead + bytesRead > p_filesz)
367 sizeToRead = p_filesz - bytesRead;
369 assert(sizeToRead != 0);
370 memset(databuf, 0, sizeToRead);
372 file.read(databuf, sizeToRead);
373 int bytesReadThisTime = file.gcount();
374 bytesRead += bytesReadThisTime;
377 for (
int k=0; k<bytesReadThisTime; ++k) {
380 messages.flags(std::ios::hex);
381 messages <<
"Failed to write data to "
383 << vaddrToWriteTo <<
"\n";
394 vector<char> symstrings;
395 for (i=0; i<e_shnum; ++i) {
397 file.seekg(e_shoff + i * e_shentsize, std::ios::beg);
400 assert(
sizeof(shdr_buf) >=
sizeof(
Elf32_Shdr));
401 assert(
sizeof(shdr_buf) >=
sizeof(
Elf64_Shdr));
405 memset(shdr_buf, 0,
sizeof(shdr_buf));
408 file.read(shdr_buf, toRead);
409 if (file.gcount() != toRead) {
410 messages <<
"Unable to read Shdr.\n";
426 if (symtab.size() > 0) {
427 messages <<
"symtab: another symtab already loaded? TODO\n";
432 int nEntries = sh_size / entrySize;
434 messages.flags(std::ios::dec);
435 messages <<
"symtab: " << nEntries <<
" symbols at 0x";
436 messages.flags(std::ios::hex);
437 messages << sh_offset <<
"\n";
439 symtab.resize(sh_size);
440 file.seekg(sh_offset, std::ios::beg);
441 file.read(&symtab[0], sh_size);
442 if ((uint64_t) file.gcount() != sh_size) {
443 messages <<
"Failed to read all " << sh_size <<
" symbol bytes.\n";
450 if (sh_type ==
SHT_STRTAB && sh_size > symstrings.size()) {
451 messages.flags(std::ios::dec);
452 messages <<
"strtab: " << sh_size <<
" bytes at 0x";
453 messages.flags(std::ios::hex);
454 messages << sh_offset <<
"\n";
456 symstrings.resize(sh_size);
457 file.seekg(sh_offset, std::ios::beg);
458 file.read(&symstrings[0], sh_size);
459 if ((uint64_t) file.gcount() != sh_size) {
460 messages <<
"Failed to read all " << sh_size <<
" symbol string bytes.\n";
469 symbolRegistry = &
cpu->GetSymbolRegistry();
472 if (symbolRegistry != NULL && symtab.size() > 0 && symstrings.size() > 0) {
474 int nEntries = symtab.size() / entrySize;
477 symstrings.resize(symstrings.size() + 1);
478 symstrings[symstrings.size() - 1] =
'\0';
482 messages.flags(std::ios::hex);
484 for (
int j=0; j<nEntries; j++) {
485 size_t p = j * entrySize;
502 if (st_name >= symstrings.size() - 1) {
503 messages <<
"symbol pointer mismatch?\n";
507 string symbol = &symstrings[st_name];
510 if (e_machine ==
EM_MIPS && elf32)
511 st_value = (int32_t) st_value;
515 messages <<
"found _gp address: 0x";
517 messages << setw(8) << setfill(
'0') << (uint32_t) st_value <<
"\n";
519 messages << setw(16) << setfill(
'0') << (uint64_t) st_value <<
"\n";
535 messages.flags(std::ios::dec);
536 messages << nsymbols <<
" symbols read\n";
554 unsigned char b[
sizeof(uint64_t)];
559 res = m->cpus[0]->memory_rw(m->cpus[0], mem, eentry, b,
562 debug(
" [WARNING: could not read memory?] ");
565 *entrypointp = ((uint64_t)b[0] << 56) +
566 ((uint64_t)b[1] << 48) + ((uint64_t)b[2] << 40) +
567 ((uint64_t)b[3] << 32) + ((uint64_t)b[4] << 24) +
568 ((uint64_t)b[5] << 16) + ((uint64_t)b[6] << 8) +
571 res = m->cpus[0]->memory_rw(m->cpus[0], mem, eentry + 8,
574 fatal(
" [WARNING: could not read memory?] ");
576 toc_base = ((uint64_t)b[0] << 56) +
577 ((uint64_t)b[1] << 48) + ((uint64_t)b[2] << 40) +
578 ((uint64_t)b[3] << 32) + ((uint64_t)b[4] << 24) +
579 ((uint64_t)b[5] << 16) + ((uint64_t)b[6] << 8) +
582 debug(
"entrypoint 0x%016"PRIx64
", toc_base 0x%016"PRIx64
"\n",
583 (uint64_t) *entrypointp, (uint64_t) toc_base);
606 static void Test_FileLoader_ELF_Constructor()
613 UNITTEST(Test_FileLoader_ELF_Constructor);