From 3a452b0922a7df282f35213752f49e5b83eff991 Mon Sep 17 00:00:00 2001 From: Garritt McCune Date: Tue, 9 Apr 2024 23:31:33 -0500 Subject: [PATCH] Added a dedicated file for handling the OS ABI values. --- build.sh | 2 +- elf_header.c | 10 ++++ elf_header.h | 23 +------- elf_osabi.c | 36 ++++++++++++ elf_osabi.h | 28 +++++++++ main.c | 160 --------------------------------------------------- 6 files changed, 76 insertions(+), 183 deletions(-) create mode 100644 elf_osabi.c create mode 100644 elf_osabi.h diff --git a/build.sh b/build.sh index de1ffb9..3b887e5 100755 --- a/build.sh +++ b/build.sh @@ -1,2 +1,2 @@ -gcc -o main.o elf_header.c main.c -g -Wall -DDEBUG -Wpedantic -Wextra -Wunused-result -std=c99 -pedantic-errors +gcc -o main.o elf_header.c main.c elf_osabi.c -g -Wall -DDEBUG -Wpedantic -Wextra -Wunused-result -std=c99 -pedantic-errors ./main.o "$1" diff --git a/elf_header.c b/elf_header.c index 53c054a..b687286 100644 --- a/elf_header.c +++ b/elf_header.c @@ -1,4 +1,5 @@ #include "elf_header.h" +#include "elf_osabi.h" #include #include @@ -83,6 +84,15 @@ struct elf_header* ParseObjectFile(const char* bytes, size_t count) { printf("Data: Unknown byte order\n"); } + if (bytes[EI_HEADER_VERSION] == 1) printf("ELF File Version: Current (1)\n"); + else printf("ELF File Version: Invalid (%d)\n", bytes[EI_HEADER_VERSION]); + + char buffer[255]; + + GetELFOSABIString(bytes[EI_OSABI], buffer); + + printf("OS ABI: %s\n", buffer); + // int64_t entryAddress; // memcpy(&entryAddress, &bytes[EI_ENTRY_ADDRESS_POINT], sizeof(int64_t)); diff --git a/elf_header.h b/elf_header.h index 99b9e12..2a0b900 100644 --- a/elf_header.h +++ b/elf_header.h @@ -5,6 +5,7 @@ #include #include #include +#include "elf_osabi.h" typedef struct elf_header ELFHeader; @@ -33,26 +34,4 @@ typedef enum ELFMachine EM_X86_64 = 62 } ELFMachine; -typedef enum ELFOSABI -{ - ELFOSABI_SYSTEMV = 0, - ELFOSABI_HPUX = 1, - ELFOSABI_NETBSD = 2, - ELFOSABI_GNU = 3, - ELFOSABI_LINUX = 3, - ELFOSABI_SOLARIS = 6, - ELFOSABI_AIX, - ELFOSABI_IRIX, - ELFOSABI_FREEBSD, - ELFOSABI_TRU64, - ELFOSABI_MODESTO, - ELFOSABI_OPENBSD, - ELFOSABI_OPENVMS, - ELFOSABI_NSK, - ELFOSABI_AROS, - ELFOSABI_FENIXOS, - ELFOSABI_CLOUDABI, - ELFOSABI_OPENVOS -} ELFOSABI; - #endif \ No newline at end of file diff --git a/elf_osabi.c b/elf_osabi.c new file mode 100644 index 0000000..c24c49c --- /dev/null +++ b/elf_osabi.c @@ -0,0 +1,36 @@ +#include "elf_osabi.h" +#include + +char* ELFOSABISText[19] = +{ + "System V ABI", + "Hewlett-Packard HP-UX ABI", + "NetBSD ABI", + "GNU / Linux ABI", + "Reserved ABI", + "Reserved ABI", + "Sun Solaris ABI", + "AIX ABI", + "IRIX ABI", + "FreeBSd ABI", + "Compaq TRU64 UNIX ABI", + "Novell Modesto ABI", + "OpenBSD ABI", + "Open VMS ABI", + "Hewlett-Packard Non-Stop Kernel ABI", + "Amiga Research OS ABI", + "The FenixOS highly scalable multi-core OS ABI", + "Nuxi CloudABI ABI", + "Stratus Technologies OpenVOS ABI" +}; + +void GetELFOSABIString(ELFOSABI abi, char buffer[255]) +{ + if (!buffer) return; + + memset(buffer, '\0', 255); + + if (abi >= sizeof(ELFOSABISText) / sizeof(char*)) return; + + strncpy(buffer, ELFOSABISText[abi], strlen(ELFOSABISText[abi])); +} \ No newline at end of file diff --git a/elf_osabi.h b/elf_osabi.h new file mode 100644 index 0000000..1d3be44 --- /dev/null +++ b/elf_osabi.h @@ -0,0 +1,28 @@ +#ifndef ELF_OSABI_H +#define ELF_OSABI_H + +typedef enum ELFOSABI +{ + ELFOSABI_SYSTEMV = 0, + ELFOSABI_HPUX = 1, + ELFOSABI_NETBSD = 2, + ELFOSABI_GNU = 3, + ELFOSABI_LINUX = 3, + ELFOSABI_SOLARIS = 6, + ELFOSABI_AIX, + ELFOSABI_IRIX, + ELFOSABI_FREEBSD, + ELFOSABI_TRU64, + ELFOSABI_MODESTO, + ELFOSABI_OPENBSD, + ELFOSABI_OPENVMS, + ELFOSABI_NSK, + ELFOSABI_AROS, + ELFOSABI_FENIXOS, + ELFOSABI_CLOUDABI, + ELFOSABI_OPENVOS +} ELFOSABI; + +void GetELFOSABIString(ELFOSABI abi, char buffer[255]); + +#endif \ No newline at end of file diff --git a/main.c b/main.c index 46e26e8..0d3094a 100644 --- a/main.c +++ b/main.c @@ -3,34 +3,6 @@ #include #include "futil.c" #include "elf_header.h" -// typedef enum EIdent -// { -// EI_MAG0 = 0, //Magic number position zero - three. -// EI_MAG1 = 1, -// EI_MAG2 = 2, -// EI_MAG3 = 3, -// EI_CLASS = 4, -// EI_DATA = 5, -// EI_VERSION = 6, -// EI_OSABI = 7, -// EI_ABIVERSION = 8, -// EI_PAD = 9, -// EI_NIDENT = 16 //End of reserved 16 bytes for the header. -// } EIdent; - -// typedef enum EIClass -// { -// ELFClassNone = 0, -// ELFClass32 = 1, -// ELFClass64 = 2 -// } EIClass; - -// typedef enum EI_Data -// { -// ELFDataNone = 0, -// ELFDataLSB = 1, -// ELFDataMSB = 2 -// } EIData; // typedef enum ELFType{ // ET_None = 0, //No file type @@ -55,33 +27,11 @@ // EM_X86_64 = 62 // } ELFMachine; -// typedef enum ELFOSABI -// { -// ELFOSABI_SYSTEMV = 0, -// ELFOSABI_HPUX = 1, -// ELFOSABI_NETBSD = 2, -// ELFOSABI_GNU = 3, -// ELFOSABI_LINUX = 3, -// ELFOSABI_SOLARIS = 6, -// ELFOSABI_AIX, -// ELFOSABI_IRIX, -// ELFOSABI_FREEBSD, -// ELFOSABI_TRU64, -// ELFOSABI_MODESTO, -// ELFOSABI_OPENBSD, -// ELFOSABI_OPENVMS, -// ELFOSABI_NSK, -// ELFOSABI_AROS, -// ELFOSABI_FENIXOS, -// ELFOSABI_CLOUDABI, -// ELFOSABI_OPENVOS -// } ELFOSABI; int main(int argc, char** argv) { char* bytes; size_t size; - //int64_t entryAddress; if (argc != 2) { @@ -92,116 +42,6 @@ int main(int argc, char** argv) if (!ReadAllString(argv[1], &bytes, &size)) return 0; ParseObjectFile(bytes, size); - // char magic[5] = { bytes[EI_MAG0], bytes[EI_MAG1], bytes[EI_MAG2], bytes[EI_MAG3], '\0' }; - - // if (strcmp(magic, "\x7f""ELF") != 0) - // { - // fprintf(stderr, "Failed to find ELF magic number in file header.\n"); - - // return 0; - // } - - // printf("Magic: "); - - // for(int i = 0; i < EI_NIDENT; i++) - // { - // printf("%02X ", bytes[i]); - // } - - // printf("\n"); - - // switch(bytes[EI_CLASS]) - // { - // case ELFClass32: - - // printf("Class: 32-bit object\n"); - // break; - // case ELFClass64: - // memcpy(&entryAddress, &bytes[0x18], sizeof(int64_t));//bytes[0x18]; - // printf("Class: 64-bit object\n"); - // break; - // default: - // printf("Class: Invalid\n"); - // return 1; - // } - - // switch(bytes[EI_DATA]) - // { - // case ELFDataLSB: - // printf("Data: 2's complement, little endian.\n"); - // break; - // case ELFDataMSB: - // printf("Data: 2's complement, big endian.\n"); - // break; - // default: - // printf("Data: Unknown byte order\n"); - // return 1; - // } - - // 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_SYSTEMV: - // printf("System V ABI\n"); - // break; - // case ELFOSABI_HPUX: - // printf("Hewlett-Packard HP-UX ABI\n"); - // break; - // case ELFOSABI_NETBSD: - // printf("NetBSD ABI\n"); - // break; - // case ELFOSABI_LINUX: - // printf("GNU ABI\n"); - // break; - // case ELFOSABI_SOLARIS: - // printf("Sun Solaris ABI\n"); - // break; - // case ELFOSABI_AIX: - // printf("AIX ABI\n"); - // break; - // case ELFOSABI_IRIX: - // printf("IRIX ABI\n"); - // break; - // case ELFOSABI_FREEBSD: - // printf("FreeBSd ABI\n"); - // break; - // case ELFOSABI_TRU64: - // printf("Compaq TRU64 UNIX ABI\n"); - // break; - // case ELFOSABI_MODESTO: - // printf("Novell Modesto ABI\n"); - // break; - // case ELFOSABI_OPENBSD: - // printf("OpenBSD ABI\n"); - // break; - // case ELFOSABI_OPENVMS: - // printf("Open VMS ABI\n"); - // break; - // case ELFOSABI_NSK: - // printf("Hewlett-Packard Non-Stop Kernel ABI\n"); - // break; - // case ELFOSABI_AROS: - // printf("Amiga Research OS ABI\n"); - // break; - // case ELFOSABI_FENIXOS: - // printf("The FenixOS highly scalable multi-core OS ABI\n"); - // break; - // case ELFOSABI_CLOUDABI: - // printf("Nuxi CloudABI ABI\n"); - // break; - // case ELFOSABI_OPENVOS: - // printf("Stratus Technologies OpenVOS ABI\n"); - // break; - // default: - // printf("Reserved ABI (%d)\n", bytes[EI_ABIVERSION]); - // break; - // } - - // printf("ABI Version: %d\n", bytes[EI_ABIVERSION]); // printf("Type: ");