diff --git a/main.c b/main.c index f7fef22..f503dfc 100644 --- a/main.c +++ b/main.c @@ -49,12 +49,13 @@ typedef enum ELFMachine EM_68k = 4, EM_88k = 5, EM_860 = 7, - EM_MIPS = 8 + EM_MIPS = 8, + EM_X86_64 = 62 } ELFMachine; typedef enum ELFOSABI { - ELFOSABI_NONE = 0, + ELFOSABI_SYSTEMV = 0, ELFOSABI_HPUX = 1, ELFOSABI_NETBSD = 2, ELFOSABI_GNU = 3, @@ -95,41 +96,51 @@ int main(int argc, char** argv) return 0; } - else printf("Magic ELF number found!\n"); + + printf("Magic: "); + + for(int i = 0; i < EI_NIDENT; i++) + { + printf("%02X ", bytes[i]); + } + + printf("\n"); switch(bytes[EI_CLASS]) { case ELFClass32: - printf("32-bit object detected\n"); + printf("Class: 32-bit object\n"); break; case ELFClass64: - printf("64-bit object detected\n"); + printf("Class: 64-bit object\n"); break; default: - printf("Invalid class type detected\n"); + printf("Class: Invalid\n"); return 1; } switch(bytes[EI_DATA]) { case ELFDataLSB: - printf("2's complement, little endian.\n"); + printf("Data: 2's complement, little endian.\n"); break; case ELFDataMSB: - printf("2's complement, big endian.\n"); + printf("Data: 2's complement, big endian.\n"); break; default: - printf("Unknown byte order\n"); + printf("Data: Unknown byte order\n"); return 1; } - if (bytes[EI_VERSION] == 1) printf("Version: current\n"); - else printf("Invalid version number\n"); + if (bytes[EI_VERSION] == 1) printf("Version: 1 (Current)\n"); + else printf("Version: 0 (Invalid)\n"); + + printf("OS/ABI: "); switch(bytes[EI_OSABI]) { - case ELFOSABI_NONE: - printf("No extension or unspecified OS ABI.\n"); + case ELFOSABI_SYSTEMV: + printf("System V ABI\n"); break; case ELFOSABI_HPUX: printf("Hewlett-Packard HP-UX ABI\n"); @@ -186,10 +197,12 @@ int main(int argc, char** argv) printf("ABI Version: %d\n", bytes[EI_ABIVERSION]); + printf("Type: "); + switch(bytes[EI_NIDENT] + bytes[EI_NIDENT + 1]) { case ET_None: - printf("No file type\n"); + printf("None\n"); break; case ET_Rel: printf("Rel\n"); @@ -198,7 +211,7 @@ int main(int argc, char** argv) printf("Exec\n"); break; case ET_Dyn: - printf("File type is DYN (Position-Independent Executable file)\n"); + printf("DYN (Position-Independent Executable file)\n"); break; case ET_Core: printf("Core\n"); @@ -214,10 +227,15 @@ int main(int argc, char** argv) return 1; } + printf("Machine: "); + switch (bytes[EI_NIDENT + 2] + bytes[EI_NIDENT + 3]) { case EM_860: printf("Intel 80860\n"); break; + case EM_X86_64: + printf("AMD x86-64 architecture\n"); + break; default: fprintf(stderr, "Failed to identify machine type\n"); return 1;