Added a dedicated file for handling the OS ABI values.

This commit is contained in:
2024-04-09 23:31:33 -05:00
parent b40418d357
commit 3a452b0922
6 changed files with 76 additions and 183 deletions
+1 -1
View File
@@ -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" ./main.o "$1"
+10
View File
@@ -1,4 +1,5 @@
#include "elf_header.h" #include "elf_header.h"
#include "elf_osabi.h"
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
@@ -83,6 +84,15 @@ struct elf_header* ParseObjectFile(const char* bytes, size_t count) {
printf("Data: Unknown byte order\n"); 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; // int64_t entryAddress;
// memcpy(&entryAddress, &bytes[EI_ENTRY_ADDRESS_POINT], sizeof(int64_t)); // memcpy(&entryAddress, &bytes[EI_ENTRY_ADDRESS_POINT], sizeof(int64_t));
+1 -22
View File
@@ -5,6 +5,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdint.h> #include <stdint.h>
#include <string.h> #include <string.h>
#include "elf_osabi.h"
typedef struct elf_header ELFHeader; typedef struct elf_header ELFHeader;
@@ -33,26 +34,4 @@ typedef enum ELFMachine
EM_X86_64 = 62 EM_X86_64 = 62
} ELFMachine; } 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 #endif
+36
View File
@@ -0,0 +1,36 @@
#include "elf_osabi.h"
#include <string.h>
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]));
}
+28
View File
@@ -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
-160
View File
@@ -3,34 +3,6 @@
#include <string.h> #include <string.h>
#include "futil.c" #include "futil.c"
#include "elf_header.h" #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{ // typedef enum ELFType{
// ET_None = 0, //No file type // ET_None = 0, //No file type
@@ -55,33 +27,11 @@
// EM_X86_64 = 62 // EM_X86_64 = 62
// } ELFMachine; // } 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) int main(int argc, char** argv)
{ {
char* bytes; char* bytes;
size_t size; size_t size;
//int64_t entryAddress;
if (argc != 2) if (argc != 2)
{ {
@@ -92,116 +42,6 @@ int main(int argc, char** argv)
if (!ReadAllString(argv[1], &bytes, &size)) return 0; if (!ReadAllString(argv[1], &bytes, &size)) return 0;
ParseObjectFile(bytes, size); 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: "); // printf("Type: ");