From 5ad57f9262c0445c3b59e88a3b17893f7e8f81ee Mon Sep 17 00:00:00 2001 From: xolatile Date: Thu, 11 Jul 2024 11:03:44 -0400 Subject: [PATCH] Finished ELF header black magic... --- source/unix.c | 68 ++++++++++++++++++++++++++++++++++++++------------- source/unix.h | 23 +++++++++++++---- 2 files changed, 69 insertions(+), 22 deletions(-) diff --git a/source/unix.c b/source/unix.c index f43657a..fc6fbbf 100644 --- a/source/unix.c +++ b/source/unix.c @@ -1,17 +1,9 @@ #include "unix.h" -static const uint16_t main_header_size = 0x40; -static const uint16_t text_sector_size = 0x38; -static const uint16_t data_sector_size = 0x38; - -static const uint16_t full_header_size = main_header_size - + text_sector_size - + data_sector_size; // 0xb0 - static const uint32_t softcore = 0x1000; // I DON'T KNOW WHAT IS THIS... static const uint32_t hardcore = 0x400000; // I DON'T KNOW WHAT IS THIS... -uint8_t header_bytes [64] = { +uint8_t main_header_byte [MAIN_HEADER_SIZE] = { 0X7F, 0X45, 0X4C, 0X46, 0X02, 0X01, 0X01, 0X03, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X02, 0X00, 0X3E, 0X00, 0X01, 0X00, 0X00, 0X00, @@ -22,18 +14,60 @@ uint8_t header_bytes [64] = { 0X02, 0X00, 0X40, 0X00, 0X00, 0X00, 0X00, 0X00, }; -void header (uint8_t has_program, - uint8_t for_linux, - uint8_t for_x86_64, - uint64_t entry_point) { +uint8_t text_sector_byte [TEXT_SECTOR_SIZE]; = { + 0X01, 0X00, 0X00, 0X00, 0X05, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X40, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X40, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, // HDR + TXT + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, // HDR + TXT + 0X00, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, +}; + +uint8_t data_sector_byte [DATA_SECTOR_SIZE] = { + 0X01, 0X00, 0X00, 0X00, 0X06, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, // HDR + TXT + 0X00, 0X10, 0X40, 0X00, 0X00, 0X00, 0X00, 0X00, // +++ ^ + 0X00, 0X10, 0X40, 0X00, 0X00, 0X00, 0X00, 0X00, // +++ ^ + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, // DAT + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, // DAT + 0X00, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, +}; + +void main_header (uint8_t has_program, + uint8_t for_linux, + uint8_t for_x86_64, + uint64_t entry_point) { /* */ uint64_t enter = entry_point; // TEST - header_bytes [16] = (has_program) ? 0x02 : 0x03; // else linkable - header_bytes [ 7] = (for_linux) ? 0x03 : 0x00; // else system v - header_bytes [18] = (for_x86_64) ? 0x3e : 0x00; // else ? + main_header_bytes [16] = (has_program) ? 0x02 : 0x03; // else linkable + main_header_bytes [ 7] = (for_linux) ? 0x03 : 0x00; // else system v + main_header_bytes [18] = (for_x86_64) ? 0x3e : 0x00; // else ? if (entry_point != 0) { - memcpy (& header_bytes [24], & enter, 8); + memcpy (& main_header_bytes [24], & enter, sizeof (enter)); } } + +void text_sector (uint64_t text_size) { + /* */ + uint64_t text = text_size; // TEST + + memcpy (& text_sector_byte [32], & text, sizeof (text)); + memcpy (& text_sector_byte [40], & text, sizeof (text)); +} + +void data_sector (uint64_t text_size, + uint64_t data_size) { + /* */ + uint64_t data = data_size; // TEST + uint64_t main = HEADER_SIZE + text_size; + uint64_t move = 0x401000 + main; + + memcpy (& data_sector_byte [ 8], & main, sizeof (main)); + memcpy (& data_sector_byte [16], & move, sizeof (move)); + memcpy (& data_sector_byte [24], & move, sizeof (move)); + memcpy (& data_sector_byte [32], & data, sizeof (data)); + memcpy (& data_sector_byte [40], & data, sizeof (data)); +} diff --git a/source/unix.h b/source/unix.h index 61c0278..4c87520 100644 --- a/source/unix.h +++ b/source/unix.h @@ -1,9 +1,22 @@ #include #include -extern uint8_t elf_header_bytes [64]; +#define MAIN_HEADER_SIZE (0x40) +#define TEXT_SECTOR_SIZE (0x38) +#define DATA_SECTOR_SIZE (0x38) -extern void header (uint8_t has_program, - uint8_t for_linux, - uint8_t for_x86_64, - uint64_t entry_point); +#define HEADER_SIZE (MAIN_HEADER_SIZE + TEXT_SECTOR_SIZE + DATA_SECTOR_SIZE) + +extern uint8_t main_header_byte [MAIN_HEADER_SIZE]; +extern uint8_t text_sector_byte [TEXT_SECTOR_SIZE]; +extern uint8_t data_sector_byte [DATA_SECTOR_SIZE]; + +extern void main_header (uint8_t has_program, + uint8_t for_linux, + uint8_t for_x86_64, + uint64_t entry_point); + +extern void text_sector (uint64_t text_size); + +extern void data_sector (uint64_t text_size, + uint64_t data_size);