Normal ELF64 headers without hacks...
This commit is contained in:
parent
5ac9e9a3f9
commit
18a35c1c6d
@ -347,7 +347,8 @@ static void assemble_clean_up (void) {
|
||||
next text_sector_size = 0;
|
||||
byte * text_sector_byte = NULL;
|
||||
|
||||
int was_instruction_array_empty = 0;
|
||||
int was_instruction_array_empty = 0;
|
||||
unsigned int text_entry_point = 0;
|
||||
|
||||
void assemble (next count,
|
||||
next * array) {
|
||||
@ -433,6 +434,8 @@ void assemble (next count,
|
||||
}
|
||||
}
|
||||
|
||||
text_entry_point = empty_store [0];
|
||||
|
||||
for (index = 0; index < empty_holes; ++index) {
|
||||
next set = 0, get = empty_array [index];
|
||||
memcpy (& set, & text_sector_byte [get], sizeof (set));
|
||||
|
@ -71,7 +71,8 @@ typedef enum {
|
||||
extern next text_sector_size;
|
||||
extern byte * text_sector_byte;
|
||||
|
||||
extern int was_instruction_array_empty;
|
||||
extern int was_instruction_array_empty;
|
||||
extern unsigned int text_entry_point;
|
||||
|
||||
extern void assemble (next count, next * array);
|
||||
|
||||
|
@ -54,9 +54,9 @@ void dump_variables_to_assembler(void) {
|
||||
static
|
||||
int write_output(FILE * file) {
|
||||
// XXX Where can i move these?
|
||||
elf_main_header (1, 1, 1, 0);
|
||||
elf_text_sector (text_sector_size);
|
||||
elf_data_sector (text_sector_size, 12);
|
||||
elf_main_header (1, 1, 1);
|
||||
elf_text_sector (text_sector_size, 0x27); // HACK
|
||||
elf_data_sector (text_sector_size, 0x27); // HACK
|
||||
|
||||
checked_fwrite(elf_main_header_byte, 1UL, ELF_MAIN_HEADER_SIZE, file);
|
||||
checked_fwrite(elf_text_sector_byte, 1UL, ELF_TEXT_SECTOR_SIZE, file);
|
||||
@ -71,7 +71,7 @@ int write_output(FILE * file) {
|
||||
static
|
||||
int make_executable(const char * const filename) {
|
||||
int r = 0;
|
||||
|
||||
|
||||
#if defined(__unix__)
|
||||
r = chmod(filename, 0755);
|
||||
#endif
|
||||
|
@ -1,3 +1,4 @@
|
||||
#include "assembler.h"
|
||||
#include "unix.h"
|
||||
|
||||
uint8_t elf_main_header_byte [ELF_MAIN_HEADER_SIZE] = {
|
||||
@ -33,23 +34,21 @@ uint8_t elf_data_sector_byte [ELF_DATA_SECTOR_SIZE] = {
|
||||
|
||||
void elf_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
|
||||
uint8_t for_x86_64) {
|
||||
//
|
||||
uint32_t enter = text_entry_point + 0x4000b0u;
|
||||
|
||||
elf_main_header_byte [16] = (has_program) ? 0x02 : 0x03; // library
|
||||
elf_main_header_byte [ 7] = (for_linux) ? 0x03 : 0x00; // system v
|
||||
elf_main_header_byte [18] = (for_x86_64) ? 0x3e : 0x00;
|
||||
|
||||
if (entry_point != 0) {
|
||||
memcpy (& elf_main_header_byte [24], & enter, sizeof (enter));
|
||||
}
|
||||
memcpy (& elf_main_header_byte [24], & enter, sizeof (enter));
|
||||
}
|
||||
|
||||
void elf_text_sector (uint64_t text_size) {
|
||||
/* */
|
||||
uint64_t text = ELF_HEADER_SIZE + text_size; // TEST
|
||||
void elf_text_sector (uint64_t text_size,
|
||||
uint64_t data_size) {
|
||||
//
|
||||
uint64_t text = ELF_HEADER_SIZE + text_size - data_size;
|
||||
|
||||
memcpy (& elf_text_sector_byte [32], & text, sizeof (text));
|
||||
memcpy (& elf_text_sector_byte [40], & text, sizeof (text));
|
||||
@ -57,9 +56,9 @@ void elf_text_sector (uint64_t text_size) {
|
||||
|
||||
void elf_data_sector (uint64_t text_size,
|
||||
uint64_t data_size) {
|
||||
/* */
|
||||
uint64_t data = data_size; // TEST
|
||||
uint64_t core = ELF_HEADER_SIZE + text_size;
|
||||
//
|
||||
uint64_t data = data_size;
|
||||
uint64_t core = ELF_HEADER_SIZE + text_size - data_size;
|
||||
uint64_t move = 0x401000 + core;
|
||||
|
||||
memcpy (& elf_data_sector_byte [ 8], & core, sizeof (core));
|
||||
|
@ -17,10 +17,10 @@ extern uint8_t elf_data_sector_byte [ELF_DATA_SECTOR_SIZE];
|
||||
|
||||
extern void elf_main_header (uint8_t has_program,
|
||||
uint8_t for_linux,
|
||||
uint8_t for_x86_64,
|
||||
uint64_t entry_point);
|
||||
uint8_t for_x86_64);
|
||||
|
||||
extern void elf_text_sector (uint64_t text_size);
|
||||
extern void elf_text_sector (uint64_t text_size,
|
||||
uint64_t data_size);
|
||||
|
||||
extern void elf_data_sector (uint64_t text_size,
|
||||
uint64_t data_size);
|
||||
|
97
test/simple_procedure.asm
Normal file
97
test/simple_procedure.asm
Normal file
@ -0,0 +1,97 @@
|
||||
; fasm proc.asm proc && chmod +x proc && ./proc
|
||||
|
||||
format ELF64 executable 3
|
||||
|
||||
segment readable executable
|
||||
|
||||
entry main
|
||||
|
||||
heyo:
|
||||
nop
|
||||
mov eax, 1
|
||||
nop
|
||||
mov edi, 1
|
||||
nop
|
||||
mov esi, h
|
||||
nop
|
||||
mov edx, 12
|
||||
nop
|
||||
syscall
|
||||
ret
|
||||
|
||||
cyaa:
|
||||
nop
|
||||
mov eax, 1
|
||||
nop
|
||||
mov edi, 1
|
||||
nop
|
||||
mov esi, c
|
||||
nop
|
||||
mov edx, 14
|
||||
nop
|
||||
syscall
|
||||
ret
|
||||
|
||||
main:
|
||||
nop
|
||||
call heyo
|
||||
nop
|
||||
mov eax, 1
|
||||
nop
|
||||
mov edi, 1
|
||||
nop
|
||||
mov esi, m
|
||||
nop
|
||||
mov edx, 13
|
||||
nop
|
||||
syscall
|
||||
nop
|
||||
call cyaa
|
||||
nop
|
||||
mov eax, 60
|
||||
nop
|
||||
mov edi, 60
|
||||
nop
|
||||
syscall
|
||||
|
||||
segment readable writable
|
||||
|
||||
h: db "Heyo world!", 10
|
||||
m: db "Meme world!!", 10
|
||||
c: db "Cyaa world!!!", 10
|
||||
|
||||
;~FASM EAXHLA
|
||||
;~7F 45 4C 46 02 01 01 03 00 00 00 00 00 00 00 00 7F 45 4C 46 02 01 01 03 00 00 00 00 00 00 00 00
|
||||
;~02 00 3E 00 01 00 00 00 EA 00 40 00 00 00 00 00 02 00 3E 00 01 00 00 00 7C 00 00 00 00 00 00 00
|
||||
;~40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
;~00 00 00 00 40 00 38 00 02 00 40 00 00 00 00 00 00 00 00 00 40 00 38 00 02 00 40 00 00 00 00 00
|
||||
;~01 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00
|
||||
;~00 00 40 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 40 00 00 00 00 00
|
||||
;~20 01 00 00 00 00 00 00 20 01 00 00 00 00 00 00 53 01 00 00 00 00 00 00 53 01 00 00 00 00 00 00
|
||||
;~00 10 00 00 00 00 00 00 01 00 00 00 06 00 00 00 00 10 00 00 00 00 00 00 01 00 00 00 06 00 00 00
|
||||
;~20 01 00 00 00 00 00 00 20 11 40 00 00 00 00 00 53 01 00 00 00 00 00 00 53 11 40 00 00 00 00 00
|
||||
;~20 11 40 00 00 00 00 00 27 00 00 00 00 00 00 00 53 11 40 00 00 00 00 00 0C 00 00 00 00 00 00 00
|
||||
;~27 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 0C 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00
|
||||
;~90 B8 01 00 00 00 90 48 B8 01 00 00 00
|
||||
;~90 BF 01 00 00 00 90 48 BF 01 00 00 00
|
||||
;~90 BE 20 11 40 00 90 48 BE 2C 11 40 00
|
||||
;~90 BA 0C 00 00 00 90 48 BA 0C 00 00 00
|
||||
;~90 0F 05 C3 90 0F 05 C3
|
||||
;~90 B8 01 00 00 00 90 48 B8 01 00 00 00
|
||||
;~90 BF 01 00 00 00 90 48 BF 01 00 00 00
|
||||
;~90 BE 39 11 40 00 90 48 BE 45 11 40 00
|
||||
;~90 BA 0E 00 00 00 90 48 BA 0E 00 00 00
|
||||
;~90 0F 05 C3 90 0F 05 C3
|
||||
;~90 E8 C0 FF FF FF 90 E8 BA FF FF FF
|
||||
;~90 B8 01 00 00 00 90 48 B8 01 00 00 00
|
||||
;~90 BF 01 00 00 00 90 48 BF 01 00 00 00
|
||||
;~90 BE 2C 11 40 00 90 48 BE 38 11 40 00
|
||||
;~90 BA 0D 00 00 00 90 48 BA 0D 00 00 00
|
||||
;~90 0F 05 90 0F 05
|
||||
;~90 E8 BC FF FF FF 90 E8 B5 FF FF FF
|
||||
;~90 B8 3C 00 00 00 90 48 B8 3C 00 00 00
|
||||
;~90 BF 3C 00 00 00 90 48 BF 3C 00 00 00
|
||||
;~90 0F 05 90 0F 05
|
||||
;~48 65 79 6F 20 77 6F 72 6C 64 21 0A 48 65 79 6F 20 77 6F 72 6C 64 21 0A
|
||||
;~4D 65 6D 65 20 77 6F 72 6C 64 21 21 0A 4D 65 6D 65 20 77 6F 72 6C 64 21 21 0A
|
||||
;~43 79 61 61 20 77 6F 72 6C 64 21 21 21 0A 43 79 61 61 20 77 6F 72 6C 64 21 21 21 0A
|
@ -1,34 +1,34 @@
|
||||
fast procedure heyo
|
||||
s8 <> h = "Heyo world!\n"
|
||||
begin
|
||||
nop mov rax 1
|
||||
nop mov rdi 1
|
||||
nop mov rsi h
|
||||
nop mov rdx 12
|
||||
nop mov eax 1
|
||||
nop mov edi 1
|
||||
nop mov esi h
|
||||
nop mov edx 12
|
||||
nop syscall
|
||||
end procedure
|
||||
|
||||
fast procedure cyaa
|
||||
s8 <> c = "Cyaa world!\n"
|
||||
s8 <> c = "Cyaa world!!!\n"
|
||||
begin
|
||||
nop mov rax 1
|
||||
nop mov rdi 1
|
||||
nop mov rsi c
|
||||
nop mov rdx 12
|
||||
nop mov eax 1
|
||||
nop mov edi 1
|
||||
nop mov esi c
|
||||
nop mov edx 14
|
||||
nop syscall
|
||||
end procedure
|
||||
|
||||
unix program main
|
||||
s8 <> m = "Meme world!\n"
|
||||
s8 <> m = "Meme world!!\n"
|
||||
begin
|
||||
nop fastcall heyo
|
||||
nop mov rax 1
|
||||
nop mov rdi 1
|
||||
nop mov rsi m
|
||||
nop mov rdx 12
|
||||
nop mov eax 1
|
||||
nop mov edi 1
|
||||
nop mov esi m
|
||||
nop mov edx 13
|
||||
nop syscall
|
||||
nop fastcall cyaa
|
||||
nop mov rax 60
|
||||
nop mov rdi 60
|
||||
nop mov eax 60
|
||||
nop mov edi 60
|
||||
nop syscall
|
||||
end program
|
||||
|
Loading…
x
Reference in New Issue
Block a user