Kernel/VTerm - "Fix" wrapping issue in VTerm (why was old behavior there?)
[tpg/acess2.git] / AcessNative / ld-acess_src / binary.c
index fa2af0c..738c6e8 100644 (file)
@@ -1,7 +1,12 @@
 /*
- * AcessNative
+ * AcessNative Dynamic Linker
+ * - By John Hodge (thePowersGang)
+ * 
+ * binary.c
+ * - Provides binary loading and type abstraction
  */
-#define DEBUG  1
+#define DEBUG  0
+#define _POSIX_C_SOURCE        200809L // needed for strdup
 #include "common.h"
 #include <stdint.h>
 #include <stdio.h>
@@ -24,6 +29,7 @@ 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);
@@ -60,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);
                }
        }               
@@ -79,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);
                }
        }               
@@ -109,7 +115,8 @@ void *Binary_LoadLibrary(const char *Name)
        }
 
        ret = Binary_Load(path, (uintptr_t*)&entry);
-       printf("LOADED '%s' to %p (Entry=%p)\n", path, ret, entry);
+       if( ret != (void*)-1 )
+               Debug("LOADED '%s' to %p (Entry=%p)", path, ret, entry);
        free(path);
        
        #if DEBUG
@@ -120,7 +127,7 @@ void *Binary_LoadLibrary(const char *Name)
                #if DEBUG
                printf("Calling '%s' entry point %p\n", Name, entry);
                #endif
-               entry(ret, 0, argv, NULL);
+               entry(ret, 0, argv, gEnvP);
        }
 
        return ret;
@@ -150,22 +157,22 @@ 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, &dword, 4);
-       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;
        }
        
@@ -173,7 +180,7 @@ void *Binary_Load(const char *Filename, uintptr_t *EntryPoint)
        printf("fmt->Load(0x%x)...\n", fd);
        #endif
        ret = fmt->Load(fd);
-       acess_close(fd);
+       acess__SysClose(fd);
        #if DEBUG
        printf("fmt->Load(0x%x): %p\n", fd, ret);
        #endif
@@ -222,7 +229,7 @@ void Binary_SetReadyToUse(void *Base)
        }
 }
 
-int Binary_GetSymbol(const char *SymbolName, uintptr_t *Value, size_t *Size)
+int Binary_GetSymbol(const char *SymbolName, uintptr_t *Value, size_t *Size, void *IgnoreBase)
 {
         int    i;
        tBinary *bin;
@@ -245,6 +252,7 @@ int Binary_GetSymbol(const char *SymbolName, uintptr_t *Value, size_t *Size)
        // 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, Size) )
@@ -253,6 +261,7 @@ int Binary_GetSymbol(const char *SymbolName, uintptr_t *Value, size_t *Size)
 
        //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