X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=AcessNative%2Fld-acess_src%2Fbinary.c;h=738c6e819c77966fd36e33647af012883c3ab399;hb=c01cd6b0f42fa4cd400c5d9493c8b7ec92e72c5b;hp=fa2af0c4eba0c1a6053ff089d318763184894493;hpb=a41f3e5efdf853726d078dc03550de40e9d63bdd;p=tpg%2Facess2.git diff --git a/AcessNative/ld-acess_src/binary.c b/AcessNative/ld-acess_src/binary.c index fa2af0c4..738c6e81 100644 --- a/AcessNative/ld-acess_src/binary.c +++ b/AcessNative/ld-acess_src/binary.c @@ -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 #include @@ -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; }