summaryrefslogtreecommitdiff
path: root/write_elf.c
diff options
context:
space:
mode:
authoronelin <oscar@nelin.dk>2026-06-10 16:31:09 +0000
committeronelin <oscar@nelin.dk>2026-06-10 16:31:09 +0000
commitbdab60d74d14eeea7a5e35a983e5e319686ae192 (patch)
tree358deef22e22c41668e4ecff0c08784323ae35d6 /write_elf.c
parent7cc1a2e6ccc8f4a87e73c35672e7bb973e965470 (diff)
Add shstrtab
Diffstat (limited to 'write_elf.c')
-rw-r--r--write_elf.c145
1 files changed, 66 insertions, 79 deletions
diff --git a/write_elf.c b/write_elf.c
index 62b6cd3..adb11a8 100644
--- a/write_elf.c
+++ b/write_elf.c
@@ -1,18 +1,9 @@
-#include "instructions.h"
-#include "registers.h"
#include <elf.h>
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-unsigned char some_opcodes[] = {MOVDI(REG_EAX, 0x3c),
- // 0xb8, 0x3c, 0x00, 0x00, 0x00,
- MOVDI(REG_EDI, 0x41),
- // 0xbf, 0x41, 0x00, 0x00, 0x00,
- SYSCALL};
-unsigned int some_opcodes_len = sizeof(some_opcodes) / sizeof(some_opcodes[0]);
-
int
write_elf(char* restrict file, size_t opcodes_len, char* restrict opcodes) {
int error = 0;
@@ -29,83 +20,70 @@ write_elf(char* restrict file, size_t opcodes_len, char* restrict opcodes) {
// .p_align = 0x1000, /* Segment alignment */
//},
{
- .p_type = PT_LOAD,
- .p_flags = PF_X | PF_R,
- .p_offset =
- sizeof(Elf64_Ehdr) + sizeof(Elf64_Phdr), /* Segment file offset */
- .p_vaddr = 0x400000 + sizeof(Elf64_Ehdr) +
- sizeof(Elf64_Phdr), /* Segment virtual address */
- .p_paddr = 0x400000 + sizeof(Elf64_Ehdr) +
- sizeof(Elf64_Phdr), /* Segment physical address */
- .p_filesz = opcodes_len, /* Segment size in file */
- .p_memsz = opcodes_len, /* Segment size in memory */
- .p_align = 0x1, /* Segment alignment */
+ .p_type = PT_LOAD,
+ .p_flags = PF_X | PF_R,
+ .p_offset = 0x1000, /* Segment file offset */
+ .p_vaddr = 0x400000 + 0x1000, /* Segment virtual address */
+ .p_paddr = 0x400000 + 0x1000, /* Segment physical address */
+ .p_filesz = opcodes_len, /* Segment size in file */
+ .p_memsz = opcodes_len, /* Segment size in memory */
+ .p_align = 0x1, /* Segment alignment */
},
};
- Elf64_Shdr header_section[] = {
- {
- // .init
- // Index in section header string table
- .sh_name = 0,
- .sh_type = 0,
- .sh_flags = 0,
- .sh_addr = 0,
- .sh_offset = 0,
- .sh_size = 0,
- .sh_link = 0,
- .sh_info = 0,
- .sh_addralign = 0,
- .sh_entsize = 0,
- },
+ unsigned char string_header_table[] = {0, '.', 'i', 'n', 'i', 't',
+ 0, '.', 's', 'h', 's', 't',
+ 'r', 't', 'a', 'b', 0};
+
+ Elf64_Shdr header_section[] = {
+ {0}, // NULL
{
- // .init
- // Index in section header string table
- .sh_name = 0,
- .sh_type = SHT_PROGBITS,
- .sh_flags = SHF_ALLOC | SHF_EXECINSTR,
- .sh_addr = 0x401000,
- .sh_offset = 0x1000,
- .sh_size = opcodes_len,
- /* todo: deps on type */
- .sh_link = 0,
- /* todo: deps on type */
- .sh_info = 0,
- .sh_addralign = 4,
- .sh_entsize = 0,
- },
+ // .init
+ // Index in section header string table
+ .sh_name = 1,
+ .sh_type = SHT_PROGBITS,
+ .sh_flags = SHF_ALLOC | SHF_EXECINSTR,
+ .sh_addr = 0x401000,
+ .sh_offset = 0x1000,
+ .sh_size = opcodes_len,
+ /* todo: deps on type */
+ .sh_link = 0,
+ /* todo: deps on type */
+ .sh_info = 0,
+ .sh_addralign = 4,
+ .sh_entsize = 0,
+ },
{
- // .shstrtab Section Header String Table
- // Index in section header string table
- .sh_name = 1,
- .sh_type = SHT_STRTAB,
- .sh_flags = 0,
- .sh_addr = 0x100,
- .sh_offset = 0x2000,
- .sh_size = opcodes_len,
- /* todo: deps on type */
- .sh_link = 0,
- /* todo: deps on type */
- .sh_info = 0,
- .sh_addralign = 1,
- .sh_entsize = 0,
- },
+ // .shstrtab Section Header String Table
+ // Index in section header string table
+ .sh_name = 7,
+ .sh_type = SHT_STRTAB,
+ .sh_flags = 0,
+ .sh_addr = 0x0,
+ .sh_offset = 0x2000,
+ .sh_size = sizeof(string_header_table) / sizeof(string_header_table[0]),
+ /* todo: deps on type */
+ .sh_link = 0,
+ /* todo: deps on type */
+ .sh_info = 0,
+ .sh_addralign = 1,
+ .sh_entsize = 0,
+ },
};
- unsigned char string_header_table[] = {0, '.', 'i', 'n', 'i', 't', 0};
-
- Elf64_Ehdr header = {
+ Elf64_Ehdr header = {
// memset(&header, 0, sizeof(Elf64_Ehdr));
.e_ident = {ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3, ELFCLASS64, ELFDATA2LSB,
EV_CURRENT, ELFOSABI_SYSV},
.e_type = ET_EXEC,
.e_machine = EM_X86_64,
.e_version = EV_CURRENT,
- .e_entry = 0x400000 + sizeof(Elf64_Ehdr) +
- sizeof(Elf64_Phdr), // point to VIRTUAL address of _start
- .e_phoff = sizeof(Elf64_Ehdr) /* Program header table offset */,
- .e_shoff = 0, // sizeof(Elf64_Ehdr) + sizeof(header_program) /* Section
- // header table offset */,
+ // point to VIRTUAL address of _start
+ .e_entry = 0x400000 + 0x1000,
+ // Program header table offset
+ .e_phoff = sizeof(Elf64_Ehdr),
+ // Section header table offset
+ .e_shoff = sizeof(Elf64_Ehdr) + sizeof(header_program),
.e_flags = 0,
.e_ehsize = sizeof(Elf64_Ehdr),
.e_phentsize = sizeof(Elf64_Phdr),
@@ -115,11 +93,12 @@ write_elf(char* restrict file, size_t opcodes_len, char* restrict opcodes) {
.e_shentsize = sizeof(header_section[0]),
// If larger than SHN_LORESERVE, then set to 0 and store real number in
// sh_size of first section header entry
- .e_shnum = 0, // sizeof(header_section) / sizeof(header_section[0]),
- // If larger than SHN_LORESERVE, then set to SHN_XINDEX and store real index
- // in
- // sh_link of first section header entry
- .e_shstrndx = 0,
+ .e_shnum = sizeof(header_section) / sizeof(header_section[0]),
+ // If larger than SHN_LORESERVE, then set to SHN_XINDEX and store real
+ // index
+ // in sh_link of first section header entry
+ // "Section Header string-table-index
+ .e_shstrndx = 2,
};
size_t bytes_written = 0;
@@ -128,11 +107,19 @@ write_elf(char* restrict file, size_t opcodes_len, char* restrict opcodes) {
fwrite(&header, sizeof(Elf64_Ehdr), 1, fd);
fwrite(&header_program, sizeof(Elf64_Phdr),
sizeof(header_program) / sizeof(header_program[0]), fd);
- // fseek(fd, 0x1000, SEEK_SET);
+ fwrite(&header_section, sizeof(Elf64_Shdr),
+ sizeof(header_section) / sizeof(header_section[0]), fd);
+
+ fseek(fd, 0x1000, SEEK_SET);
do {
bytes_written += fwrite(opcodes, sizeof(char), opcodes_len, fd);
} while (bytes_written != opcodes_len);
+
+ fseek(fd, 0x2000, SEEK_SET);
+ fwrite(string_header_table, sizeof(char),
+ sizeof(string_header_table) / sizeof(string_header_table[0]), fd);
+
error = fclose(fd);
if (error) {
err(EXIT_FAILURE, "no way");