45 #define N_ELF_MACHINE_TYPES 89
47 "NONE",
"M32",
"SPARC",
"386",
48 "68K",
"88K",
"486",
"860",
49 "MIPS",
"S370",
"MIPS_RS3_LE",
"RS6000",
50 "unknown12",
"unknown13",
"unknown14",
"PARISC",
51 "NCUBE",
"VPP500",
"SPARC32PLUS",
"960",
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",
"unknown54",
"unknown55",
61 "unknown56",
"unknown57",
"unknown58",
"unknown59",
62 "unknown60",
"unknown61",
"AMD64",
"unknown63",
63 "unknown64",
"unknown65",
"unknown66",
"unknown67",
64 "unknown68",
"unknown69",
"unknown70",
"unknown71",
65 "unknown72",
"unknown73",
"unknown74",
"unknown75",
66 "unknown76",
"unknown77",
"unknown78",
"unknown79",
67 "unknown80",
"unknown81",
"unknown82",
"AVR",
68 "unknown84",
"unknown85",
"unknown86",
"unknown87",
102 ss <<
"ELF Unknown class " << elfClass;
114 messages <<
"Target is not an AddressDataBus.\n";
119 if (!file.is_open()) {
120 messages <<
"Unable to read file.\n";
131 memset(buf, 0,
sizeof(buf));
132 file.read(buf,
sizeof(buf));
142 messages <<
"Not an ELF.\n";
151 messages <<
"Unknown ELF class.\n";
155 messages <<
"Unknown ELF data encoding.\n";
159 messages <<
"Unknown ELF version.\n";
165 #define ELF_HEADER_VAR(hdr32,hdr64,type,name) type name = elf32? hdr32->name \
167 if (elfDataEncoding == ELFDATA2LSB) { \
168 int size = elf32? sizeof(hdr32->name) : sizeof(hdr64->name); \
170 case 2: name = LE16_TO_HOST(name); break; \
171 case 4: name = LE32_TO_HOST(name); break; \
172 case 8: name = LE64_TO_HOST(name); break; \
175 int size = elf32? sizeof(hdr32->name) : sizeof(hdr64->name); \
177 case 2: name = BE16_TO_HOST(name); break; \
178 case 4: name = BE32_TO_HOST(name); break; \
179 case 8: name = BE64_TO_HOST(name); break; \
186 messages <<
"ELF file is not an Executable.\n";
202 if (e_phentsize != expectedPhentSize) {
203 messages <<
"Incorrect ELF phentsize? " << e_phentsize <<
", should "
204 "be " << expectedPhentSize <<
"\n"
205 "Perhaps this is a dynamically linked "
206 "binary (which isn't supported yet).\n";
211 if (e_shentsize != expectedShentSize) {
212 messages <<
"Incorrect ELF shentsize? " << e_shentsize <<
", should "
213 "be " << expectedShentSize <<
"\n"
214 "Perhaps this is a dynamically linked "
215 "binary (which isn't supported yet).\n";
220 messages << elf_machine_type[e_machine];
222 messages <<
"machine type '" << e_machine <<
"'";
223 messages <<
" ELF" << (elf32? 32 : 64) <<
" ";
225 messages << (elfDataEncoding ==
ELFDATA2LSB?
"LSB (LE)" :
"MSB (BE)") <<
": ";
228 messages <<
"PPC function descriptor at";
230 messages <<
"entry point";
233 messages.flags(std::ios::hex);
236 if (e_machine ==
EM_MIPS && elf32)
237 e_entry = (int32_t) e_entry;
239 uint64_t display_entry_point = e_entry;
243 if (e_machine ==
EM_MIPS && (e_entry & 1)) {
244 display_entry_point &= ~1;
249 bool shmedia =
false;
250 if (e_machine ==
EM_SH && (e_entry & 1)) {
251 display_entry_point &= ~1;
256 messages << setw(8) << setfill(
'0') << (uint32_t) display_entry_point;
258 messages << setw(16) << setfill(
'0') << (uint64_t) display_entry_point;
261 messages <<
" (MIPS16 encoding)";
264 messages <<
" (SHmedia encoding)";
270 for (i=0; i<e_phnum; ++i) {
272 file.seekg(e_phoff + i * e_phentsize, std::ios::beg);
275 assert(
sizeof(phdr_buf) >=
sizeof(
Elf32_Phdr));
276 assert(
sizeof(phdr_buf) >=
sizeof(
Elf64_Phdr));
280 memset(phdr_buf, 0,
sizeof(phdr_buf));
283 file.read(phdr_buf, toRead);
284 if (file.gcount() != toRead) {
285 messages <<
"Unable to read Phdr.\n";
299 if (p_memsz < p_filesz) {
300 messages <<
"memsz < filesz. TODO: how"
301 " to handle this? memsz = " << p_memsz <<
302 ", filesz = " << p_filesz <<
"\n";
307 if (e_machine ==
EM_MIPS && elf32)
308 p_vaddr = (int32_t) p_vaddr;
310 messages.flags(std::ios::hex);
311 messages <<
"loadable chunk: vaddr 0x";
314 messages << setw(8) << setfill(
'0') << (uint32_t) p_vaddr;
316 messages << setw(16) << setfill(
'0') << (uint64_t) p_vaddr;
318 messages.flags(std::ios::dec);
319 messages <<
", " << p_filesz <<
" bytes\n";
321 file.seekg(p_offset, std::ios::beg);
323 uint64_t bytesRead = 0;
324 uint64_t vaddrToWriteTo = p_vaddr;
326 while (bytesRead < p_filesz) {
327 int sizeToRead =
sizeof(databuf);
328 if (sizeToRead + bytesRead > p_filesz)
329 sizeToRead = p_filesz - bytesRead;
331 assert(sizeToRead != 0);
332 memset(databuf, 0, sizeToRead);
334 file.read(databuf, sizeToRead);
335 int bytesReadThisTime = file.gcount();
336 bytesRead += bytesReadThisTime;
339 for (
int k=0; k<bytesReadThisTime; ++k) {
342 messages.flags(std::ios::hex);
343 messages <<
"Failed to write data to "
345 << vaddrToWriteTo <<
"\n";
356 vector<char> symstrings;
357 for (i=0; i<e_shnum; ++i) {
359 file.seekg(e_shoff + i * e_shentsize, std::ios::beg);
362 assert(
sizeof(shdr_buf) >=
sizeof(
Elf32_Shdr));
363 assert(
sizeof(shdr_buf) >=
sizeof(
Elf64_Shdr));
367 memset(shdr_buf, 0,
sizeof(shdr_buf));
370 file.read(shdr_buf, toRead);
371 if (file.gcount() != toRead) {
372 messages <<
"Unable to read Shdr.\n";
388 if (symtab.size() > 0) {
389 messages <<
"symtab: another symtab already loaded? TODO\n";
394 int nEntries = sh_size / entrySize;
396 messages.flags(std::ios::dec);
397 messages <<
"symtab: " << nEntries <<
" symbols at 0x";
398 messages.flags(std::ios::hex);
399 messages << sh_offset <<
"\n";
401 symtab.resize(sh_size);
402 file.seekg(sh_offset, std::ios::beg);
403 file.read(&symtab[0], sh_size);
404 if ((uint64_t) file.gcount() != sh_size) {
405 messages <<
"Failed to read all " << sh_size <<
" symbol bytes.\n";
412 if (sh_type ==
SHT_STRTAB && sh_size > symstrings.size()) {
413 messages.flags(std::ios::dec);
414 messages <<
"strtab: " << sh_size <<
" bytes at 0x";
415 messages.flags(std::ios::hex);
416 messages << sh_offset <<
"\n";
418 symstrings.resize(sh_size);
419 file.seekg(sh_offset, std::ios::beg);
420 file.read(&symstrings[0], sh_size);
421 if ((uint64_t) file.gcount() != sh_size) {
422 messages <<
"Failed to read all " << sh_size <<
" symbol string bytes.\n";
431 symbolRegistry = &
cpu->GetSymbolRegistry();
434 if (symbolRegistry != NULL && symtab.size() > 0 && symstrings.size() > 0) {
436 int nEntries = symtab.size() / entrySize;
439 symstrings.resize(symstrings.size() + 1);
440 symstrings[symstrings.size() - 1] =
'\0';
444 messages.flags(std::ios::hex);
446 for (
int j=0; j<nEntries; j++) {
447 size_t p = j * entrySize;
463 if (st_name >= symstrings.size() - 1) {
464 messages <<
"symbol pointer mismatch?\n";
468 string symbol = &symstrings[st_name];
471 if (e_machine ==
EM_MIPS && elf32)
472 st_value = (int32_t) st_value;
476 messages <<
"found _gp address: 0x";
478 messages << setw(8) << setfill(
'0') << (uint32_t) st_value <<
"\n";
480 messages << setw(16) << setfill(
'0') << (uint64_t) st_value <<
"\n";
496 messages.flags(std::ios::dec);
497 messages << nsymbols <<
" symbols read\n";
515 unsigned char b[
sizeof(uint64_t)];
520 res = m->cpus[0]->memory_rw(m->cpus[0], mem, eentry, b,
523 debug(
" [WARNING: could not read memory?] ");
526 *entrypointp = ((uint64_t)b[0] << 56) +
527 ((uint64_t)b[1] << 48) + ((uint64_t)b[2] << 40) +
528 ((uint64_t)b[3] << 32) + ((uint64_t)b[4] << 24) +
529 ((uint64_t)b[5] << 16) + ((uint64_t)b[6] << 8) +
532 res = m->cpus[0]->memory_rw(m->cpus[0], mem, eentry + 8,
535 fatal(
" [WARNING: could not read memory?] ");
537 toc_base = ((uint64_t)b[0] << 56) +
538 ((uint64_t)b[1] << 48) + ((uint64_t)b[2] << 40) +
539 ((uint64_t)b[3] << 32) + ((uint64_t)b[4] << 24) +
540 ((uint64_t)b[5] << 16) + ((uint64_t)b[6] << 8) +
543 debug(
"entrypoint 0x%016"PRIx64
", toc_base 0x%016"PRIx64
"\n",
544 (uint64_t) *entrypointp, (uint64_t) toc_base);
567 static void Test_FileLoader_ELF_Constructor()
574 UNITTEST(Test_FileLoader_ELF_Constructor);