Kernel/VTerm - "Fix" wrapping issue in VTerm (why was old behavior there?)
[tpg/acess2.git] / AcessNative / ld-acess_src / binary.c
index 6439fb9..738c6e8 100644 (file)
@@ -1,12 +1,18 @@
 /*
- * AcessNative
+ * AcessNative Dynamic Linker
+ * - By John Hodge (thePowersGang)
+ * 
+ * binary.c
+ * - Provides binary loading and type abstraction
  */
+#define DEBUG  0
+#define _POSIX_C_SOURCE        200809L // needed for strdup
 #include "common.h"
 #include <stdint.h>
 #include <stdio.h>
 #include <string.h>
 
-#define LIBRARY_PATH   "$$$$../Usermode/Output/i386/Libs"
+#define LIBRARY_PATH   "$$$$../Usermode/Output/x86_64/Libs"
 
 // === TYPES ===
 typedef struct sBinary {
@@ -19,10 +25,11 @@ typedef struct sBinary {
 
 // === IMPORTS ===
 extern void    *Elf_Load(int fd);
-extern uintptr_t       Elf_Relocate(void *Base);
-extern int     Elf_GetSymbol(void *Base, char *Name, uintptr_t *ret);
+extern uintptr_t       ElfRelocate(void *Base);
+extern int     ElfGetSymbol(void *Base, char *Name, uintptr_t *ret, size_t *size);
 extern int     ciNumBuiltinSymbols;
 extern tSym    caBuiltinSymbols[];
+extern char    **gEnvP;
 
 // === PROTOTYPES ===
 void   Binary_AddToList(const char *Filename, void *Base, tBinFmt *Format);
@@ -33,8 +40,8 @@ tBinFmt       gElf_FormatDef = {
 //     .Magic = "\x7F""ELF",
        .Name = "ELF32",
        .Load = Elf_Load,
-       .Relocate = Elf_Relocate,
-       .GetSymbol = Elf_GetSymbol
+       .Relocate = ElfRelocate,
+       .GetSymbol = ElfGetSymbol
        };
 tBinary        *gLoadedBinaries;
 
@@ -59,9 +66,9 @@ char *Binary_LocateLibrary(const char *Name)
                strcat(tmp, "/");
                strcat(tmp, Name);
                
-               fd = acess_open(tmp, 4);        // OPENFLAG_EXEC
+               fd = acess__SysOpen(tmp, 4);    // OPENFLAG_EXEC
                if(fd != -1) {
-                       acess_close(fd);
+                       acess__SysClose(fd);
                        return strdup(tmp);
                }
        }               
@@ -78,9 +85,9 @@ char *Binary_LocateLibrary(const char *Name)
                printf("Binary_LocateLibrary: tmp = '%s'\n", tmp);
                #endif
 
-               fd = acess_open(tmp, 4);        // OPENFLAG_EXEC
+               fd = acess__SysOpen(tmp, 4);    // OPENFLAG_EXEC
                if(fd != -1) {
-                       acess_close(fd);
+                       acess__SysClose(fd);
                        return strdup(tmp);
                }
        }               
@@ -96,7 +103,7 @@ void *Binary_LoadLibrary(const char *Name)
 {
        char    *path;
        void    *ret;
-        int    (*entry)(int,char*[],char**) = NULL;
+        int    (*entry)(void *,int,char*[],char**) = NULL;
 
        // Find File
        path = Binary_LocateLibrary(Name);
@@ -108,6 +115,8 @@ void *Binary_LoadLibrary(const char *Name)
        }
 
        ret = Binary_Load(path, (uintptr_t*)&entry);
+       if( ret != (void*)-1 )
+               Debug("LOADED '%s' to %p (Entry=%p)", path, ret, entry);
        free(path);
        
        #if DEBUG
@@ -118,7 +127,7 @@ void *Binary_LoadLibrary(const char *Name)
                #if DEBUG
                printf("Calling '%s' entry point %p\n", Name, entry);
                #endif
-               entry(0, argv, NULL);
+               entry(ret, 0, argv, gEnvP);
        }
 
        return ret;
@@ -148,32 +157,32 @@ void *Binary_Load(const char *Filename, uintptr_t *EntryPoint)
                }
        }
 
-       fd = acess_open(Filename, 2|1); // Execute and Read
+       fd = acess__SysOpen(Filename, 2|1);     // Execute and Read
        if( fd == -1 ) {
                // TODO: Handle libary directories
                perror("Opening binary");
                return NULL;
        }
 
-       acess_read(fd, 4, &dword);
-       acess_seek(fd, 0, ACESS_SEEK_SET);
+       acess__SysRead(fd, &dword, 4);
+       acess__SysSeek(fd, 0, ACESS_SEEK_SET);
        
        if( memcmp(&dword, "\x7F""ELF", 4) == 0 ) {
                fmt = &gElf_FormatDef;
        }
        else {
                fprintf(stderr, "Unknown executable format (0x%08x)\n", dword);
-               acess_close(fd);
+               acess__SysClose(fd);
                return NULL;
        }
        
        #if DEBUG
-       printf("fmt->Load(%i)...\n", fd);
+       printf("fmt->Load(0x%x)...\n", fd);
        #endif
        ret = fmt->Load(fd);
-       acess_close(fd);
+       acess__SysClose(fd);
        #if DEBUG
-       printf("fmt->Load(%p): %p\n", fd, ret);
+       printf("fmt->Load(0x%x): %p\n", fd, ret);
        #endif
        if( !ret ) {
                return NULL;
@@ -220,7 +229,7 @@ void Binary_SetReadyToUse(void *Base)
        }
 }
 
-int Binary_GetSymbol(const char *SymbolName, uintptr_t *Value)
+int Binary_GetSymbol(const char *SymbolName, uintptr_t *Value, size_t *Size, void *IgnoreBase)
 {
         int    i;
        tBinary *bin;
@@ -235,6 +244,7 @@ int Binary_GetSymbol(const char *SymbolName, uintptr_t *Value)
        {
                if( strcmp(caBuiltinSymbols[i].Name, SymbolName) == 0 ) {
                        *Value = (uintptr_t)caBuiltinSymbols[i].Value;
+                       if(Size)        *Size = 0;
                        return 1;
                }
        }
@@ -242,13 +252,16 @@ int Binary_GetSymbol(const char *SymbolName, uintptr_t *Value)
        // Search list of loaded binaries
        for(bin = gLoadedBinaries; bin; bin = bin->Next)
        {
+               if( bin->Base == IgnoreBase )   continue ;
                if( !bin->Ready )       continue;
                //printf(" Binary_GetSymbol: bin = %p{%p, %s}\n", bin, bin->Base, bin->Path);
-               if( bin->Format->GetSymbol(bin->Base, (char*)SymbolName, Value) )
+               if( bin->Format->GetSymbol(bin->Base, (char*)SymbolName, Value, Size) )
                        return 1;
        }
 
        //printf("Binary_GetSymbol: RETURN 0, not found\n");
-       
+       printf("--- ERROR: Unable to find symbol '%s'\n", SymbolName);
+
+       exit( -1 );
        return 0;
 }

UCC git Repository :: git.ucc.asn.au