ld.c

Go to the documentation of this file.
00001 /*****************************************************************************************
00002  Copyright (c) 2002-2004 The UbixOS Project
00003  All rights reserved.
00004 
00005  Redistribution and use in source and binary forms, with or without modification, are
00006  permitted provided that the following conditions are met:
00007 
00008  Redistributions of source code must retain the above copyright notice, this list of
00009  conditions, the following disclaimer and the list of authors.  Redistributions in binary
00010  form must reproduce the above copyright notice, this list of conditions, the following
00011  disclaimer and the list of authors in the documentation and/or other materials provided
00012  with the distribution. Neither the name of the UbixOS Project nor the names of its
00013  contributors may be used to endorse or promote products derived from this software
00014  without specific prior written permission.
00015 
00016  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
00017  EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
00018  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
00019  THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
00020  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
00021  OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
00022  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
00023  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00024  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00025 
00026  $Id: ld_8c-source.html 88 2016-01-12 00:11:29Z reddawg $
00027 
00028 *****************************************************************************************/
00029 
00030 #include <ubixos/types.h>
00031 #include <ubixos/ld.h>
00032 #include <ubixos/sched.h>
00033 #include <ubixos/elf.h>
00034 #include <ubixos/kpanic.h>
00035 #include <lib/kprintf.h>
00036 #include <lib/kmalloc.h>
00037 #include <vfs/vfs.h>
00038 #include <vmm/vmm.h>
00039 #include <string.h>
00040 #include <assert.h>
00041 
00042 uInt32 ldEnable() {
00043   int               i             = 0x0;
00044   int               x             = 0x0;
00045   int               rel           = 0x0;
00046   int               sym           = 0x0;
00047   char             *newLoc        = 0x0; 
00048   char             *shStr         = 0x0;
00049   char             *dynStr        = 0x0;
00050   uInt32           *reMap         = 0x0;
00051   fileDescriptor   *ldFd          = 0x0;
00052   elfHeader        *binaryHeader  = 0x0;
00053   elfProgramHeader *programHeader = 0x0;
00054   elfSectionHeader *sectionHeader = 0x0;
00055   elfDynSym        *relSymTab     = 0x0;
00056   elfPltInfo       *elfRel        = 0x0;
00057 
00058   /* Open our dynamic linker */
00059   ldFd = fopen("sys:/lib/ld.so","rb");
00060 
00061   if (ldFd == 0x0) {
00062     kprintf("Can not open ld.so\n");
00063     }
00064  
00065   fseek(ldFd,0x0,0x0);
00066   binaryHeader = (elfHeader *)kmalloc(sizeof(elfHeader));
00067   assert(binaryHeader);
00068   fread(binaryHeader,sizeof(elfHeader),1,ldFd);
00069 
00070   programHeader = (elfProgramHeader *)kmalloc(sizeof(elfProgramHeader)*binaryHeader->ePhnum);
00071   assert(programHeader);
00072   fseek(ldFd,binaryHeader->ePhoff,0);
00073   fread(programHeader,sizeof(elfSectionHeader),binaryHeader->ePhnum,ldFd);
00074 
00075   sectionHeader = (elfSectionHeader *)kmalloc(sizeof(elfSectionHeader)*binaryHeader->eShnum);
00076   assert(sectionHeader);
00077   fseek(ldFd,binaryHeader->eShoff,0);
00078   fread(sectionHeader,sizeof(elfSectionHeader),binaryHeader->eShnum,ldFd);
00079 
00080   shStr = (char *)kmalloc(sectionHeader[binaryHeader->eShstrndx].shSize);
00081   fseek(ldFd,sectionHeader[binaryHeader->eShstrndx].shOffset,0);
00082   fread(shStr,sectionHeader[binaryHeader->eShstrndx].shSize,1,ldFd);
00083 
00084   for (i = 0x0;i < binaryHeader->ePhnum;i++) {
00085     switch (programHeader[i].phType) {
00086       case PT_LOAD:
00087         newLoc = (char *)programHeader[i].phVaddr + LD_START;
00088         /*
00089         Allocate Memory Im Going To Have To Make This Load Memory With Correct
00090         Settings so it helps us in the future
00091         */
00092         for (x=0;x < (programHeader[i].phMemsz);x += 0x1000) {
00093           /* make r/w or ro */
00094           if ((vmm_remapPage(vmmFindFreePage(_current->id),((programHeader[i].phVaddr & 0xFFFFF000) + x + LD_START),PAGE_DEFAULT)) == 0x0) 
00095             K_PANIC("vmmRemapPage: ld");
00096           memset((void *)((programHeader[i].phVaddr & 0xFFFFF000) + x + LD_START),0x0,0x1000);
00097           }
00098         /* Now Load Section To Memory */
00099         fseek(ldFd,programHeader[i].phOffset,0x0);
00100         fread(newLoc,programHeader[i].phFilesz,1,ldFd);
00101 
00102         break;
00103       case PT_DYNAMIC:
00104         /* Now Load Section To Memory */
00105         fseek(ldFd,programHeader[i].phOffset,0x0);
00106         fread(newLoc,programHeader[i].phFilesz,1,ldFd);
00107         break;
00108       case PT_GNU_STACK:
00109         /* Tells us if the stack should be executable.  Failsafe to executable
00110            until we add checking */
00111         break;
00112       case PT_PAX_FLAGS:
00113         /* Not sure... */
00114         break;
00115       default:
00116         kprintf("Unhandled Header (kernel) : %08x\n", programHeader[i].phType);
00117         break;
00118       }
00119     }
00120 
00121   for (i=0x0;i<binaryHeader->eShnum;i++) {
00122     switch (sectionHeader[i].shType) {
00123      case 3:
00124         if (!strcmp((shStr + sectionHeader[i].shName),".dynstr")) {
00125           dynStr = (char *)kmalloc(sectionHeader[i].shSize);
00126           fseek(ldFd,sectionHeader[i].shOffset,0x0);
00127           fread(dynStr,sectionHeader[i].shSize,1,ldFd);
00128           }
00129         break;
00130       case 9:
00131         elfRel = (elfPltInfo *)kmalloc(sectionHeader[i].shSize);
00132         fseek(ldFd,sectionHeader[i].shOffset,0x0);
00133         fread(elfRel,sectionHeader[i].shSize,1,ldFd);
00134 
00135         for (x=0x0;x<sectionHeader[i].shSize/sizeof(elfPltInfo);x++) {
00136           rel = ELF32_R_SYM(elfRel[x].pltInfo);
00137           reMap = (uInt32 *)((uInt32)LD_START + elfRel[x].pltOffset);
00138           switch (ELF32_R_TYPE(elfRel[x].pltInfo)) {
00139             case R_386_32:
00140               *reMap += ((uInt32)LD_START + relSymTab[rel].dynValue);
00141               break;
00142             case R_386_PC32:
00143               *reMap += ((uInt32)LD_START + relSymTab[rel].dynValue) - (uInt32)reMap;
00144               break;
00145             case R_386_RELATIVE:
00146               *reMap += (uInt32)LD_START;
00147               break;
00148             default:
00149               kprintf("[0x%X][0x%X](%i)[%s]\n",elfRel[x].pltOffset,elfRel[x].pltInfo,rel,elfGetRelType(ELF32_R_TYPE(elfRel[x].pltInfo)));
00150               kprintf("relTab [%s][0x%X][0x%X]\n",dynStr + relSymTab[rel].dynName,relSymTab[rel].dynValue,relSymTab[rel].dynName);
00151               break;
00152             }
00153           }
00154         kfree(elfRel);
00155         break;
00156       case 11:
00157         relSymTab = (elfDynSym *)kmalloc(sectionHeader[i].shSize);
00158         fseek(ldFd,sectionHeader[i].shOffset,0x0);
00159         fread(relSymTab,sectionHeader[i].shSize,1,ldFd);
00160         sym = i;
00161         break;
00162       }
00163     }
00164 
00165   i = binaryHeader->eEntry + LD_START;
00166 
00167   kfree(dynStr);
00168   kfree(shStr);
00169   kfree(relSymTab);
00170   kfree(sectionHeader);
00171   kfree(programHeader);
00172   kfree(binaryHeader);
00173   fclose(ldFd);
00174 
00175   return((uInt32)i);
00176   }
00177 
00178 /***
00179  END
00180  ***/
00181 

Generated on Fri Dec 15 11:18:55 2006 for UbixOS V2 by  doxygen 1.4.7