00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
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
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
00090
00091
00092 for (x=0;x < (programHeader[i].phMemsz);x += 0x1000) {
00093
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
00099 fseek(ldFd,programHeader[i].phOffset,0x0);
00100 fread(newLoc,programHeader[i].phFilesz,1,ldFd);
00101
00102 break;
00103 case PT_DYNAMIC:
00104
00105 fseek(ldFd,programHeader[i].phOffset,0x0);
00106 fread(newLoc,programHeader[i].phFilesz,1,ldFd);
00107 break;
00108 case PT_GNU_STACK:
00109
00110
00111 break;
00112 case PT_PAX_FLAGS:
00113
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
00180
00181