Minor refactoring of UXN and ASM...
This commit is contained in:
@ -22,59 +22,65 @@
|
||||
#define SHIFT_BEGIN (ROL)
|
||||
#define SHIFT_END (SAR)
|
||||
|
||||
#if DEBUG == 1
|
||||
|
||||
static const char * size_name [] = {
|
||||
"\033[1;36md8 \033[0m", "\033[1;36md16\033[0m", "\033[1;36md32\033[0m", "\033[1;36md64\033[0m"
|
||||
"d8", "d16", "d32", "d64"
|
||||
};
|
||||
|
||||
static const char * type_name [] = {
|
||||
"\033[1;34mrel\033[0m", "\033[1;34mreg\033[0m", "\033[1;34mmem\033[0m", "\033[1;34mimm\033[0m"
|
||||
"rel", "reg", "mem", "imm"
|
||||
};
|
||||
|
||||
static const char * data_name [] = {
|
||||
"\033[1;33masmdirmem\033[0m", "\033[1;33masmdirrel\033[0m", "\033[1;33masmdirimm\033[0m", "\033[1;33masmdirrep\033[0m",
|
||||
"\033[1;33madd\033[0m", "\033[1;33mor\033[0m", "\033[1;33madc\033[0m", "\033[1;33msbb\033[0m",
|
||||
"\033[1;33mand\033[0m", "\033[1;33msub\033[0m", "\033[1;33mxor\033[0m", "\033[1;33mcmp\033[0m",
|
||||
"\033[1;33minc\033[0m", "\033[1;33mdec\033[0m", "\033[1;33mnot\033[0m", "\033[1;33mneg\033[0m",
|
||||
"\033[1;33mmul\033[0m", "\033[1;33mimul\033[0m", "\033[1;33mdiv\033[0m", "\033[1;33midiv\033[0m",
|
||||
"\033[1;33mfadd\033[0m", "\033[1;33mfmul\033[0m", "\033[1;33mfcom\033[0m", "\033[1;33mfcomp\033[0m",
|
||||
"\033[1;33mfsub\033[0m", "\033[1;33mfsubr\033[0m", "\033[1;33mfdiv\033[0m", "\033[1;33mfdivr\033[0m",
|
||||
"\033[1;33mrol\033[0m", "\033[1;33mror\033[0m", "\033[1;33mrcl\033[0m", "\033[1;33mrcr\033[0m",
|
||||
"\033[1;33msal\033[0m", "\033[1;33mshr\033[0m", "\033[1;33mshl\033[0m", "\033[1;33msar\033[0m",
|
||||
"\033[1;33mnop\033[0m", "\033[1;33mretn\033[0m", "\033[1;33mretf\033[0m", "\033[1;33mleave\033[0m",
|
||||
"\033[1;33mpopf\033[0m", "\033[1;33mpushf\033[0m",
|
||||
"\033[1;33msyscall\033[0m", "\033[1;33mcpuid\033[0m", "\033[1;33mfnop\033[0m", "\033[1;33mfchs\033[0m",
|
||||
"\033[1;33mfabs\033[0m", "\033[1;33mftst\033[0m", "\033[1;33mfxam\033[0m", "\033[1;33mfld1\033[0m",
|
||||
"\033[1;33mfldl2t\033[0m", "\033[1;33mfldl2e\033[0m", "\033[1;33mfldpi\033[0m", "\033[1;33mfldlg2\033[0m",
|
||||
"\033[1;33mfldln2\033[0m", "\033[1;33mfldz\033[0m", "\033[1;33mf2xm1\033[0m", "\033[1;33mfyl2x\033[0m",
|
||||
"\033[1;33mfptan\033[0m", "\033[1;33mfpatan\033[0m", "\033[1;33mfxtract\033[0m", "\033[1;33mfprem1\033[0m",
|
||||
"\033[1;33mfdecstp\033[0m", "\033[1;33mfincstp\033[0m", "\033[1;33mfprem\033[0m", "\033[1;33mfyl2xp1\033[0m",
|
||||
"\033[1;33mfsqrt\033[0m", "\033[1;33mfsincos\033[0m", "\033[1;33mfrndint\033[0m", "\033[1;33mfscale\033[0m",
|
||||
"\033[1;33mfsin\033[0m", "\033[1;33mfcos\033[0m",
|
||||
"\033[1;33menter\033[0m", "\033[1;33mcall\033[0m", "\033[1;33min\033[0m", "\033[1;33mout\033[0m",
|
||||
"\033[1;33mjmp\033[0m", "\033[1;33mmov\033[0m", "\033[1;33mpop\033[0m", "\033[1;33mpush\033[0m",
|
||||
"\033[1;33mjo\033[0m", "\033[1;33mjno\033[0m", "\033[1;33mjb\033[0m", "\033[1;33mjae\033[0m",
|
||||
"\033[1;33mje\033[0m", "\033[1;33mjne\033[0m", "\033[1;33mjbe\033[0m", "\033[1;33mja\033[0m",
|
||||
"\033[1;33mjs\033[0m", "\033[1;33mjns\033[0m", "\033[1;33mjpe\033[0m", "\033[1;33mjpo\033[0m",
|
||||
"\033[1;33mjl\033[0m", "\033[1;33mjge\033[0m", "\033[1;33mjle\033[0m", "\033[1;33mjg\033[0m",
|
||||
"\033[1;33mcmovo\033[0m", "\033[1;33mcmovno\033[0m", "\033[1;33mcmovb\033[0m", "\033[1;33mcmovae\033[0m",
|
||||
"\033[1;33mcmove\033[0m", "\033[1;33mcmovne\033[0m", "\033[1;33mcmovbe\033[0m", "\033[1;33mcmova\033[0m",
|
||||
"\033[1;33mcmovs\033[0m", "\033[1;33mcmovns\033[0m", "\033[1;33mcmovpe\033[0m", "\033[1;33mcmovpo\033[0m",
|
||||
"\033[1;33mcmovl\033[0m", "\033[1;33mcmovge\033[0m", "\033[1;33mcmovle\033[0m", "\033[1;33mcmovg\033[0m",
|
||||
"\033[1;33mseto\033[0m", "\033[1;33msetno\033[0m", "\033[1;33msetb\033[0m", "\033[1;33msetae\033[0m",
|
||||
"\033[1;33msete\033[0m", "\033[1;33msetne\033[0m", "\033[1;33msetbe\033[0m", "\033[1;33mseta\033[0m",
|
||||
"\033[1;33msets\033[0m", "\033[1;33msetns\033[0m", "\033[1;33msetpe\033[0m", "\033[1;33msetpo\033[0m",
|
||||
"\033[1;33msetl\033[0m", "\033[1;33msetge\033[0m", "\033[1;33msetle\033[0m", "\033[1;33msetg\033[0m",
|
||||
"\033[1;33mbswap\033[0m", "\033[1;33mbsf\033[0m", "\033[1;33mbsr\033[0m", "\033[1;33mloop\033[0m",
|
||||
"\033[1;33mloope\033[0m", "\033[1;33mloopne\033[0m"
|
||||
"asmdirmem", "asmdirrel", "asmdirimm", "asmdirrep",
|
||||
"add", "or", "adc", "sbb",
|
||||
"and", "sub", "xor", "cmp",
|
||||
"inc", "dec", "not", "neg",
|
||||
"mul", "imul", "div", "idiv",
|
||||
"fadd", "fmul", "fcom", "fcomp",
|
||||
"fsub", "fsubr", "fdiv", "fdivr",
|
||||
"rol", "ror", "rcl", "rcr",
|
||||
"sal", "shr", "shl", "sar",
|
||||
"nop", "retn", "retf", "leave",
|
||||
"popf", "pushf",
|
||||
"syscall", "cpuid", "fnop", "fchs",
|
||||
"fabs", "ftst", "fxam", "fld1",
|
||||
"fldl2t", "fldl2e", "fldpi", "fldlg2",
|
||||
"fldln2", "fldz", "f2xm1", "fyl2x",
|
||||
"fptan", "fpatan", "fxtract", "fprem1",
|
||||
"fdecstp", "fincstp", "fprem", "fyl2xp1",
|
||||
"fsqrt", "fsincos", "frndint", "fscale",
|
||||
"fsin", "fcos",
|
||||
"enter", "call", "in", "out",
|
||||
"jmp", "mov", "pop", "push",
|
||||
"jo", "jno", "jb", "jae",
|
||||
"je", "jne", "jbe", "ja",
|
||||
"js", "jns", "jpe", "jpo",
|
||||
"jl", "jge", "jle", "jg",
|
||||
"cmovo", "cmovno", "cmovb", "cmovae",
|
||||
"cmove", "cmovne", "cmovbe", "cmova",
|
||||
"cmovs", "cmovns", "cmovpe", "cmovpo",
|
||||
"cmovl", "cmovge", "cmovle", "cmovg",
|
||||
"seto", "setno", "setb", "setae",
|
||||
"sete", "setne", "setbe", "seta",
|
||||
"sets", "setns", "setpe", "setpo",
|
||||
"setl", "setge", "setle", "setg",
|
||||
"bswap", "bsf", "bsr", "loop",
|
||||
"loope", "loopne"
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
static unsigned int empty_count = 1;
|
||||
static unsigned int empty_holes = 1;
|
||||
static unsigned int * empty_array = NULL;
|
||||
static unsigned int * empty_imbue = NULL;
|
||||
static unsigned int * empty_store = NULL;
|
||||
|
||||
static void replace (unsigned char * destination, unsigned char * source, unsigned long size) {
|
||||
static void replace (unsigned char * destination,
|
||||
unsigned char * source,
|
||||
unsigned long size) {
|
||||
for (--size; size != (unsigned long) -1; --size) {
|
||||
destination [size] = source [size];
|
||||
}
|
||||
@ -279,7 +285,7 @@ static unsigned int build_jump_if (unsigned int * array) {
|
||||
size = array [1],
|
||||
location = array [3];
|
||||
|
||||
debug_printf ("> %s %s \033[1;35mrel\033[0m %u", data_name [array [0]], size_name [array [1]], array [3]);
|
||||
debug_printf ("> %s %s rel %u", data_name [array [0]], size_name [array [1]], array [3]);
|
||||
|
||||
inset (far (location) && (size == D32), 0x0f);
|
||||
|
||||
@ -319,7 +325,7 @@ static unsigned int build_set_if (unsigned int * array) {
|
||||
to = array [2],
|
||||
destination = array [3];
|
||||
|
||||
debug_printf ("> %s \033[1;35md8 \033[0m %s %u", data_name [array [0]], type_name [array [2]], array [3]);
|
||||
debug_printf ("> %s d8 %s %u", data_name [array [0]], type_name [array [2]], array [3]);
|
||||
|
||||
inset ((to == REG) && (front (destination)), 0x40);
|
||||
inset ((to == REG) && (upper (destination)), 0x41);
|
||||
@ -454,7 +460,7 @@ static unsigned int build_shift (unsigned int * array) {
|
||||
destination = array [3],
|
||||
offset = array [5];
|
||||
|
||||
debug_printf ("> %s %s %s %u \033[1;35mimm\033[0m %u", data_name [array [0]], size_name [array [1]], type_name [array [2]], array [3], array [5]);
|
||||
debug_printf ("> %s %s %s %u imm %u", data_name [array [0]], size_name [array [1]], type_name [array [2]], array [3], array [5]);
|
||||
|
||||
short_prefix (size);
|
||||
|
||||
@ -534,7 +540,7 @@ static unsigned int build_swap (unsigned int * array) {
|
||||
unsigned int size = array [1],
|
||||
destination = array [3];
|
||||
|
||||
debug_printf ("> %s %s \033[1;35mreg\033[0m %u", data_name [array [0]], size_name [array [1]], array [3]);
|
||||
debug_printf ("> %s %s reg %u", data_name [array [0]], size_name [array [1]], array [3]);
|
||||
|
||||
long_prefix (size, REG, destination, 0, 0);
|
||||
|
||||
@ -550,7 +556,7 @@ static unsigned int build_bit_scan (unsigned int * array) {
|
||||
from = array [4],
|
||||
source = array [5];
|
||||
|
||||
debug_printf ("> %s %s \033[1;35mreg\033[0m %u %s %u", data_name [array [0]], size_name [array [1]], array [3], type_name [array [4]], array [5]);
|
||||
debug_printf ("> %s %s reg %u %s %u", data_name [array [0]], size_name [array [1]], array [3], type_name [array [4]], array [5]);
|
||||
|
||||
short_prefix (size);
|
||||
|
||||
@ -570,7 +576,7 @@ static unsigned int build_bit_scan (unsigned int * array) {
|
||||
static unsigned int build_loop (unsigned int * array) {
|
||||
unsigned int location = array [3];
|
||||
|
||||
debug_printf ("> %s \033[1;35md8 \033[0m \033[1;35mrel\033[0m %u", data_name [array [0]], array [3]);
|
||||
debug_printf ("> %s d8 rel %u", data_name [array [0]], array [3]);
|
||||
|
||||
inset (array [0] == LOOPNE, 0xe0);
|
||||
inset (array [0] == LOOPE, 0xe1);
|
||||
@ -581,17 +587,11 @@ static unsigned int build_loop (unsigned int * array) {
|
||||
return (3);
|
||||
}
|
||||
|
||||
static unsigned int fault (unsigned int * array) {
|
||||
debug_printf ("> fault : \033[1;31m%u\033[0m", array [0]);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
static unsigned int (* build_instruction []) (unsigned int * array) = {
|
||||
store_memory, // ASMDIRMEM : LABEL
|
||||
store_relative, // ASMDIRREL : "IMPLEMENTED"
|
||||
store_immediate,// ASMDIRIMM : LITERAL
|
||||
fault, // ASMDIRREP : UNIMPLEMENTED
|
||||
NULL, // ASMDIRREP : UNIMPLEMENTED
|
||||
build_double, build_double, build_double, build_double, build_double, build_double, build_double, build_double,
|
||||
build_single, build_single, build_single, build_single, build_single, build_single, build_single, build_single,
|
||||
build_float, build_float, build_float, build_float, build_float, build_float, build_float, build_float,
|
||||
@ -611,7 +611,6 @@ static unsigned int (* build_instruction []) (unsigned int * array) = {
|
||||
build_swap, build_bit_scan, build_bit_scan, build_loop, build_loop, build_loop
|
||||
};
|
||||
|
||||
unsigned int nopification = 1;
|
||||
unsigned int text_entry_point = 0;
|
||||
unsigned int text_sector_size = 0;
|
||||
unsigned char * text_sector_byte = NULL;
|
||||
@ -634,19 +633,17 @@ int assemble (unsigned int count, unsigned int * array) {
|
||||
unsigned int check_at;
|
||||
unsigned int byte;
|
||||
|
||||
inset ((nopification) && (array [index] > ASMDIRREP), 0x90);
|
||||
#if DEBUG == 1
|
||||
inset (array [index] > ASMDIRREP, 0x90);
|
||||
#endif
|
||||
|
||||
check_at = text_sector_size;
|
||||
|
||||
index += build_instruction [array [index]] (& array [index]);
|
||||
|
||||
debug_printf (" -- \033[0;35m");
|
||||
|
||||
for (byte = check_at; byte < text_sector_size; ++byte) {
|
||||
debug_printf ("%02X ", text_sector_byte [byte]);
|
||||
}
|
||||
|
||||
debug_printf ("\033[0m\n");
|
||||
}
|
||||
|
||||
text_entry_point = empty_store [0];
|
||||
|
@ -1,40 +1,38 @@
|
||||
#ifndef ASSEMBLER_H
|
||||
#define ASSEMBLER_H
|
||||
|
||||
// Instruction aliases
|
||||
#define JNPE JPO
|
||||
#define JNPO JPE
|
||||
#define JNB JAE
|
||||
#define JNBE JA
|
||||
#define JNA JBE
|
||||
#define JNAE JB
|
||||
#define JNL JGE
|
||||
#define JNLE JG
|
||||
#define JNG JLE
|
||||
#define JNGE JL
|
||||
#define JNPE (JPO)
|
||||
#define JNPO (JPE)
|
||||
#define JNB (JAE)
|
||||
#define JNBE (JA)
|
||||
#define JNA (JBE)
|
||||
#define JNAE (JB)
|
||||
#define JNL (JGE)
|
||||
#define JNLE (JG)
|
||||
#define JNG (JLE)
|
||||
#define JNGE (JL)
|
||||
|
||||
#define CMOVNPE CMOVPO
|
||||
#define CMOVNPO CMOVPE
|
||||
#define CMOVNB CMOVAE
|
||||
#define CMOVNBE CMOVA
|
||||
#define CMOVNA CMOVBE
|
||||
#define CMOVNAE CMOVB
|
||||
#define CMOVNL CMOVGE
|
||||
#define CMOVNLE CMOVG
|
||||
#define CMOVNG CMOVLE
|
||||
#define CMOVNGE CMOVL
|
||||
#define CMOVNPE (CMOVPO)
|
||||
#define CMOVNPO (CMOVPE)
|
||||
#define CMOVNB (CMOVAE)
|
||||
#define CMOVNBE (CMOVA)
|
||||
#define CMOVNA (CMOVBE)
|
||||
#define CMOVNAE (CMOVB)
|
||||
#define CMOVNL (CMOVGE)
|
||||
#define CMOVNLE (CMOVG)
|
||||
#define CMOVNG (CMOVLE)
|
||||
#define CMOVNGE (CMOVL)
|
||||
|
||||
#define SETNPE SETPO
|
||||
#define SETNPO SETPE
|
||||
#define SETNB SETAE
|
||||
#define SETNBE SETA
|
||||
#define SETNA SETBE
|
||||
#define SETNAE SETB
|
||||
#define SETNL SETGE
|
||||
#define SETNLE SETG
|
||||
#define SETNG SETLE
|
||||
#define SETNGE SETL
|
||||
// ---
|
||||
#define SETNPE (SETPO)
|
||||
#define SETNPO (SETPE)
|
||||
#define SETNB (SETAE)
|
||||
#define SETNBE (SETA)
|
||||
#define SETNA (SETBE)
|
||||
#define SETNAE (SETB)
|
||||
#define SETNL (SETGE)
|
||||
#define SETNLE (SETG)
|
||||
#define SETNG (SETLE)
|
||||
#define SETNGE (SETL)
|
||||
|
||||
enum {
|
||||
D8, D16, D32, D64
|
||||
@ -46,37 +44,67 @@ enum {
|
||||
|
||||
enum {
|
||||
ASMDIRMEM, ASMDIRREL, ASMDIRIMM, ASMDIRREP,
|
||||
ADD, OR, ADC, SBB, AND, SUB, XOR, CMP,
|
||||
INC, DEC, NOT, NEG, MUL, IMUL, DIV, IDIV,
|
||||
FADD, FMUL, FCOM, FCOMP, FSUB, FSUBR, FDIV, FDIVR,
|
||||
ROL, ROR, RCL, RCR, SAL, SHR, SHL, SAR,
|
||||
NOP, RETN, RETF, LEAVE, POPF, PUSHF,
|
||||
SYSCALL, CPUID, FNOP, FCHS, FABS, FTST, FXAM, FLD1,
|
||||
FLDL2T, FLDL2E, FLDPI, FLDLG2, FLDLN2, FLDZ, F2XM1, FYL2X,
|
||||
FPTAN, FPATAN, FXTRACT, FPREM1, FDECSTP, FINCSTP, FPREM, FYL2XP1,
|
||||
FSQRT, FSINCOS, FRNDINT, FSCALE, FSIN, FCOS,
|
||||
ENTER, CALL, IN, OUT, JMP, MOV, POP, PUSH,
|
||||
JO, JNO, JB, JAE, JE, JNE, JBE, JA,
|
||||
JS, JNS, JPE, JPO, JL, JGE, JLE, JG,
|
||||
CMOVO, CMOVNO, CMOVB, CMOVAE, CMOVE, CMOVNE, CMOVBE, CMOVA,
|
||||
CMOVS, CMOVNS, CMOVPE, CMOVPO, CMOVL, CMOVGE, CMOVLE, CMOVG,
|
||||
SETO, SETNO, SETB, SETAE, SETE, SETNE, SETBE, SETA,
|
||||
SETS, SETNS, SETPE, SETPO, SETL, SETGE, SETLE, SETG,
|
||||
BSWAP, BSF, BSR, LOOP, LOOPE, LOOPNE
|
||||
ADD, OR, ADC, SBB,
|
||||
AND, SUB, XOR, CMP,
|
||||
INC, DEC, NOT, NEG,
|
||||
MUL, IMUL, DIV, IDIV,
|
||||
FADD, FMUL, FCOM, FCOMP,
|
||||
FSUB, FSUBR, FDIV, FDIVR,
|
||||
ROL, ROR, RCL, RCR,
|
||||
SAL, SHR, SHL, SAR,
|
||||
NOP, RETN, RETF, LEAVE,
|
||||
POPF, PUSHF,
|
||||
SYSCALL, CPUID, FNOP, FCHS,
|
||||
FABS, FTST, FXAM, FLD1,
|
||||
FLDL2T, FLDL2E, FLDPI, FLDLG2,
|
||||
FLDLN2, FLDZ, F2XM1, FYL2X,
|
||||
FPTAN, FPATAN, FXTRACT, FPREM1,
|
||||
FDECSTP, FINCSTP, FPREM, FYL2XP1,
|
||||
FSQRT, FSINCOS, FRNDINT, FSCALE,
|
||||
FSIN, FCOS,
|
||||
ENTER, CALL, IN, OUT,
|
||||
JMP, MOV, POP, PUSH,
|
||||
JO, JNO, JB, JAE,
|
||||
JE, JNE, JBE, JA,
|
||||
JS, JNS, JPE, JPO,
|
||||
JL, JGE, JLE, JG,
|
||||
CMOVO, CMOVNO, CMOVB, CMOVAE,
|
||||
CMOVE, CMOVNE, CMOVBE, CMOVA,
|
||||
CMOVS, CMOVNS, CMOVPE, CMOVPO,
|
||||
CMOVL, CMOVGE, CMOVLE, CMOVG,
|
||||
SETO, SETNO, SETB, SETAE,
|
||||
SETE, SETNE, SETBE, SETA,
|
||||
SETS, SETNS, SETPE, SETPO,
|
||||
SETL, SETGE, SETLE, SETG,
|
||||
BSWAP, BSF, BSR, LOOP,
|
||||
LOOPE, LOOPNE
|
||||
};
|
||||
|
||||
enum {
|
||||
GR0, GR1, GR2, GR3, GR4, GR5, GR6, GR7,
|
||||
GR8, GR9, GR10, GR11, GR12, GR13, GR14, GR15
|
||||
GR0, GR1, GR2, GR3,
|
||||
GR4, GR5, GR6, GR7,
|
||||
GR8, GR9, GR10, GR11,
|
||||
GR12, GR13, GR14, GR15
|
||||
};
|
||||
|
||||
enum {
|
||||
VR0, VR1, VR2, VR3,
|
||||
VR4, VR5, VR6, VR7,
|
||||
VR8, VR9, VR10, VR11,
|
||||
VR12, VR13, VR14, VR15,
|
||||
VR16, VR17, VR18, VR19,
|
||||
VR20, VR21, VR22, VR23,
|
||||
VR24, VR25, VR26, VR27,
|
||||
VR28, VR29, VR30, VR31
|
||||
};
|
||||
|
||||
extern unsigned int nopification;
|
||||
extern unsigned int text_entry_point;
|
||||
extern unsigned int text_sector_size;
|
||||
extern unsigned char * text_sector_byte;
|
||||
|
||||
extern int was_instruction_array_empty;
|
||||
|
||||
extern int assemble (unsigned int count, unsigned int * array);
|
||||
extern int assemble (unsigned int count,
|
||||
unsigned int * array);
|
||||
|
||||
#endif
|
||||
|
@ -1,5 +1,6 @@
|
||||
#include "assembler.h"
|
||||
#include "unix.h"
|
||||
#include "debug.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
@ -44,16 +45,22 @@ void elf_main_header(unsigned char has_program,
|
||||
elf_main_header_byte[18] = (for_x86_64) ? 0x3e : 0x00;
|
||||
|
||||
memcpy(& elf_main_header_byte[24], & enter, sizeof(enter));
|
||||
|
||||
debug_printf("UNX -- ELF64 main header\n");
|
||||
}
|
||||
|
||||
void elf_text_sector(unsigned long text_size, unsigned long data_size) {
|
||||
void elf_text_sector(unsigned long text_size,
|
||||
unsigned long data_size) {
|
||||
unsigned long 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));
|
||||
|
||||
debug_printf("UNX -- ELF64 text sector\n");
|
||||
}
|
||||
|
||||
void elf_data_sector(unsigned long text_size, unsigned long data_size) {
|
||||
void elf_data_sector(unsigned long text_size,
|
||||
unsigned long data_size) {
|
||||
unsigned long data = data_size;
|
||||
unsigned long core = ELF_HEADER_SIZE + text_size - data_size;
|
||||
unsigned long move = 0x401000 + core;
|
||||
@ -63,4 +70,6 @@ void elf_data_sector(unsigned long text_size, unsigned long data_size) {
|
||||
memcpy(& elf_data_sector_byte[24], & move, sizeof(move));
|
||||
memcpy(& elf_data_sector_byte[32], & data, sizeof(data));
|
||||
memcpy(& elf_data_sector_byte[40], & data, sizeof(data));
|
||||
|
||||
debug_printf("UNX -- ELF64 data sector\n");
|
||||
}
|
||||
|
@ -1,12 +1,13 @@
|
||||
#ifndef UNIX_H
|
||||
#define UNIX_H
|
||||
|
||||
#define ELF_MAIN_HEADER_SIZE (0x40)
|
||||
#define ELF_TEXT_SECTOR_SIZE (0x38)
|
||||
#define ELF_DATA_SECTOR_SIZE (0x38)
|
||||
|
||||
#define ELF_HEADER_SIZE (ELF_MAIN_HEADER_SIZE \
|
||||
+ ELF_TEXT_SECTOR_SIZE \
|
||||
+ ELF_DATA_SECTOR_SIZE)
|
||||
#define ELF_HEADER_SIZE (ELF_MAIN_HEADER_SIZE + \
|
||||
ELF_TEXT_SECTOR_SIZE + \
|
||||
ELF_DATA_SECTOR_SIZE)
|
||||
|
||||
extern unsigned char elf_main_header_byte[ELF_MAIN_HEADER_SIZE];
|
||||
extern unsigned char elf_text_sector_byte[ELF_TEXT_SECTOR_SIZE];
|
||||
@ -16,8 +17,10 @@ extern void elf_main_header(unsigned char has_program,
|
||||
unsigned char for_linux,
|
||||
unsigned char for_x86_64);
|
||||
|
||||
extern void elf_text_sector(unsigned long text_size, unsigned long data_size);
|
||||
extern void elf_data_sector(unsigned long text_size, unsigned long data_size);
|
||||
extern void elf_text_sector(unsigned long text_size,
|
||||
unsigned long data_size);
|
||||
|
||||
extern void elf_data_sector(unsigned long text_size,
|
||||
unsigned long data_size);
|
||||
|
||||
#define UNIX_H
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user