X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=ginge.git;a=blobdiff_plain;f=loader%2Floader.c;h=530eed335e28c1e01d932ba6ba4136c5eabc1ef2;hp=6a829ff28186a212ff61f8fb7ac564463b0a92c9;hb=2ce69bdff40e40fb1c1954e0883d95de271cecc7;hpb=55fe8e70a19187ba960fdca6b48f276cf1cd41f4 diff --git a/loader/loader.c b/loader/loader.c index 6a829ff..530eed3 100644 --- a/loader/loader.c +++ b/loader/loader.c @@ -5,6 +5,8 @@ #include #include +#include "header.h" + #define CHECK_(val, fail_operator, expect, err_msg) \ if (val fail_operator expect) { \ fprintf(stderr, err_msg ", exiting (%d)\n", (int)(long)val); \ @@ -28,8 +30,6 @@ return 1; \ } -#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) - typedef struct { unsigned long start; unsigned long end; @@ -51,10 +51,10 @@ static int is_range_used(maps_range *maps, int map_cnt, unsigned long start, uns } extern char **environ; -extern void do_entry(Elf32_Addr entry, void *stack_frame, int stack_frame_size, void *exitf); int main(int argc, char *argv[]) { + void *lowest_segment = (void *)-1; Elf32_Ehdr hdr; Elf32_Phdr *phdr; FILE *fi; @@ -139,9 +139,17 @@ int main(int argc, char *argv[]) FAIL_PERROR("fseek"); if (fread((char *)ptr + align, 1, phdr[i].p_filesz, fi) != phdr[i].p_filesz) FAIL_PERROR("too small or"); + + if (phdr[i].p_flags & PF_X) + do_patches((char *)ptr + align, phdr[i].p_filesz); } + + if (map_ptr < lowest_segment) + lowest_segment = map_ptr; } + emu_init(lowest_segment); + stack_frame[0] = 1; // argc stack_frame[1] = (long)argv[1]; stack_frame[2] = 0;