X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fbin%2Felf.c;h=7f65d89d1df6bf37771a7c674855b3a39c071d4e;hb=e2744a459d1c63435d7348d0bfd0e4b92b0ec9f9;hp=31178e34f0aea4c6bb263d0b1de6b4531bad5953;hpb=2fcb3775f3afee7bfa9aa3cbb6aea3c6c3426e64;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/bin/elf.c b/KernelLand/Kernel/bin/elf.c index 31178e34..7f65d89d 100644 --- a/KernelLand/Kernel/bin/elf.c +++ b/KernelLand/Kernel/bin/elf.c @@ -1,25 +1,48 @@ /* - * Acess v0.1 - * ELF Executable Loader Code + * Acess2 Kernel + * - By John Hodge (thePowersGang) + * + * elf.c + * - ELF Executable Loader Code */ #define DEBUG 0 #include #include +// ---- Import linking code from userland #define _COMMON_H -#define SysDebug(...) LOG(v) -#define DISABLE_ELF64 -void *GetSymbol(const char *Name, size_t *Size); -void *GetSymbol(const char *Name, size_t *Size) { Uint val; Binary_GetSymbol(Name, &val); if(Size)*Size=0; return (void*)val; }; -#define AddLoaded(a,b) do{}while(0) -#define LoadLibrary(a,b,c) 0 -#if __STDC_HOSTED__ -#warning "Hosted? why!" -#else -#warning "freestanding - outstanding!" +#define SysDebug(v...) LOG(v) +#if BITS <= 32 +# define DISABLE_ELF64 #endif - +static int GetSymbol(const char *Name, void **Value, size_t *Size); +static int GetSymbol(const char *Name, void **Value, size_t *Size) { + Uint val; + if(!Binary_GetSymbol(Name, &val)) { + Log_Notice("ELF", "Lookup of '%s' failed", Name); + return 0; + } + if(Size) + *Size=0; + *Value = (void*)val; + return 1; +} +#define AddLoaded(a,b) do{}while(0) +#define LoadLibrary(a,b,c) (Log_Debug("ELF", "Module requested lib '%s'",a),0) +static int _SysSetMemFlags(tVAddr addr, int flag, int mask) { + if( mask & 1 ) { + if( flag ) { + // Re-set RO, clear COW + MM_SetFlags((void*)addr, MM_PFLAG_RO, MM_PFLAG_RO|MM_PFLAG_COW); + } + else { + MM_SetFlags((void*)addr, MM_PFLAG_RO|MM_PFLAG_COW, MM_PFLAG_RO|MM_PFLAG_COW); + } + } + return 0; +} #include "../../../Usermode/Libraries/ld-acess.so_src/elf.c" +// ---- / ---- #define DEBUG_WARN 1 @@ -56,7 +79,7 @@ tBinary *Elf_Load(int fp) switch(hdr.e_ident[4]) // EI_CLASS { case ELFCLASS32: - return Elf_Load32(fp, (Elf32_Ehdr*)&hdr); + return Elf_Load32(fp, (void*)&hdr); case ELFCLASS64: return Elf_Load64(fp, &hdr); default: @@ -297,7 +320,7 @@ tBinary *Elf_Load32(int FD, Elf32_Ehdr *Header) int Elf_Relocate(void *Base) { - return ElfRelocate(Base, (char**){NULL}, "") != NULL; + return ElfRelocate(Base, (char**){NULL}, "") != NULL; } int Elf_GetSymbol(void *Base, const char *Name, Uint *ret) {