Minor cleanup of the printed data and added x86_64 to the machine types it reconizes.

This commit is contained in:
2024-04-02 22:09:14 -05:00
parent f888e03924
commit f8374cb026
+33 -15
View File
@@ -49,12 +49,13 @@ typedef enum ELFMachine
EM_68k = 4, EM_68k = 4,
EM_88k = 5, EM_88k = 5,
EM_860 = 7, EM_860 = 7,
EM_MIPS = 8 EM_MIPS = 8,
EM_X86_64 = 62
} ELFMachine; } ELFMachine;
typedef enum ELFOSABI typedef enum ELFOSABI
{ {
ELFOSABI_NONE = 0, ELFOSABI_SYSTEMV = 0,
ELFOSABI_HPUX = 1, ELFOSABI_HPUX = 1,
ELFOSABI_NETBSD = 2, ELFOSABI_NETBSD = 2,
ELFOSABI_GNU = 3, ELFOSABI_GNU = 3,
@@ -95,41 +96,51 @@ int main(int argc, char** argv)
return 0; 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]) switch(bytes[EI_CLASS])
{ {
case ELFClass32: case ELFClass32:
printf("32-bit object detected\n"); printf("Class: 32-bit object\n");
break; break;
case ELFClass64: case ELFClass64:
printf("64-bit object detected\n"); printf("Class: 64-bit object\n");
break; break;
default: default:
printf("Invalid class type detected\n"); printf("Class: Invalid\n");
return 1; return 1;
} }
switch(bytes[EI_DATA]) switch(bytes[EI_DATA])
{ {
case ELFDataLSB: case ELFDataLSB:
printf("2's complement, little endian.\n"); printf("Data: 2's complement, little endian.\n");
break; break;
case ELFDataMSB: case ELFDataMSB:
printf("2's complement, big endian.\n"); printf("Data: 2's complement, big endian.\n");
break; break;
default: default:
printf("Unknown byte order\n"); printf("Data: Unknown byte order\n");
return 1; return 1;
} }
if (bytes[EI_VERSION] == 1) printf("Version: current\n"); if (bytes[EI_VERSION] == 1) printf("Version: 1 (Current)\n");
else printf("Invalid version number\n"); else printf("Version: 0 (Invalid)\n");
printf("OS/ABI: ");
switch(bytes[EI_OSABI]) switch(bytes[EI_OSABI])
{ {
case ELFOSABI_NONE: case ELFOSABI_SYSTEMV:
printf("No extension or unspecified OS ABI.\n"); printf("System V ABI\n");
break; break;
case ELFOSABI_HPUX: case ELFOSABI_HPUX:
printf("Hewlett-Packard HP-UX ABI\n"); 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("ABI Version: %d\n", bytes[EI_ABIVERSION]);
printf("Type: ");
switch(bytes[EI_NIDENT] + bytes[EI_NIDENT + 1]) switch(bytes[EI_NIDENT] + bytes[EI_NIDENT + 1])
{ {
case ET_None: case ET_None:
printf("No file type\n"); printf("None\n");
break; break;
case ET_Rel: case ET_Rel:
printf("Rel\n"); printf("Rel\n");
@@ -198,7 +211,7 @@ int main(int argc, char** argv)
printf("Exec\n"); printf("Exec\n");
break; break;
case ET_Dyn: case ET_Dyn:
printf("File type is DYN (Position-Independent Executable file)\n"); printf("DYN (Position-Independent Executable file)\n");
break; break;
case ET_Core: case ET_Core:
printf("Core\n"); printf("Core\n");
@@ -214,10 +227,15 @@ int main(int argc, char** argv)
return 1; return 1;
} }
printf("Machine: ");
switch (bytes[EI_NIDENT + 2] + bytes[EI_NIDENT + 3]) { switch (bytes[EI_NIDENT + 2] + bytes[EI_NIDENT + 3]) {
case EM_860: case EM_860:
printf("Intel 80860\n"); printf("Intel 80860\n");
break; break;
case EM_X86_64:
printf("AMD x86-64 architecture\n");
break;
default: default:
fprintf(stderr, "Failed to identify machine type\n"); fprintf(stderr, "Failed to identify machine type\n");
return 1; return 1;