ld-acess - Fixed bugs due to not testing from AcessNative changes
[tpg/acess2.git] / Usermode / Libraries / ld-acess.so_src / elf.c
index 56f75e2..dcde746 100644 (file)
@@ -1,7 +1,7 @@
 /*\r
- AcessOS 1 - Dynamic Loader\r
- By thePowersGang\r
-*/\r
AcessOS 1 - Dynamic Loader\r
By thePowersGang\r
+ */\r
 #include "common.h"\r
 #include "elf32.h"\r
 
@@ -51,6 +51,9 @@ int ElfRelocate(void *Base, char **envp, char *Filename)
        \r
        DEBUGS("ElfRelocate: (Base=0x%x)\n", Base);\r
        \r
+       // Check magic header\r
+       \r
+       \r
        // Parse Program Header to get Dynamic Table\r
        phtab = Base + hdr->phoff;\r
        iSegmentCount = hdr->phentcount;\r
@@ -119,7 +122,7 @@ int ElfRelocate(void *Base, char **envp, char *Filename)
        }
 \r
        if(dynsymtab == NULL) {\r
-               SysDebug("WARNING: No Dynamic Symbol table, returning\n");\r
+               SysDebug("ld-acess.so - WARNING: No Dynamic Symbol table, returning\n");\r
                return hdr->entrypoint;\r
        }\r
        \r
@@ -312,6 +315,49 @@ int ElfGetSymbol(Uint Base, char *Name, Uint *ret)
 \r
        //DEBUGS("ElfGetSymbol: (Base=0x%x, Name='%s')\n", Base, Name);\r
 \r
+       // Catch the current executable\r
+       #if 0\r
+       if( !hdr->misc.HashTable )\r
+       {\r
+               Elf32_Phdr      *phtab;\r
+               Elf32_Dyn       *dynTab = NULL;\r
+                int    j;\r
+               \r
+               // Locate the tables\r
+               phtab = (void*)( Base + hdr->phoff );\r
+               for( i = 0; i < hdr->phentcount; i ++ )\r
+               {\r
+                       if( phtab[i].Type == PT_DYNAMIC ) {\r
+                               dynTab = (void*)phtab[i].VAddr;\r
+                               break ;\r
+                       }\r
+               }\r
+               if( !dynTab ) {\r
+                       SysDebug("ERROR - Unable to find DYNAMIC segment in %p", (void*)Base);\r
+                       return 0;\r
+               }\r
+               \r
+               for( j = 0; dynTab[j].d_tag != DT_NULL; j++)\r
+               {\r
+                       switch(dynTab[j].d_tag)\r
+                       {\r
+                       // --- Symbol Table ---\r
+                       case DT_SYMTAB:\r
+                               hdr->misc.SymTable = dynTab[j].d_val;\r
+                               break;\r
+                       // --- Hash Table --\r
+                       case DT_HASH:\r
+                               hdr->misc.HashTable = dynTab[j].d_val;\r
+                               break;\r
+                       }\r
+               }\r
+       }\r
+       #endif\r
+       \r
+       if( !hdr->misc.SymTable || !hdr->misc.HashTable ) {\r
+               return 0;\r
+       }\r
+\r
        pBuckets = (void *) hdr->misc.HashTable;\r
        symtab = (void *) hdr->misc.SymTable;\r
        

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