diff --git a/src/sys/include/ubixos/elf.h b/src/sys/include/ubixos/elf.h index 30169b0..3e8792d 100644 --- a/src/sys/include/ubixos/elf.h +++ b/src/sys/include/ubixos/elf.h @@ -119,7 +119,7 @@ uInt32 dynValue; uInt32 dynSize; uInt32 dynInfo; - } elfDynsym; + } elfDynSym; typedef struct { uInt32 dynVal; @@ -128,11 +128,19 @@ char *elfGetShType(int); char *elfGetPhType(int); +char *elfGetRelType(int); + +#define ELF32_R_SYM(i) ((i)>>8) +#define ELF32_R_TYPE(i) ((unsigned char)(i)) +#define ELF32_R_INFO(s, t) ((s)<<8+(unsigned char)(t)) #endif /*** $Log$ + Revision 1.3 2004/05/21 15:20:00 reddawg + Cleaned up + END ***/ diff --git a/src/sys/include/ubixos/ld.h b/src/sys/include/ubixos/ld.h index 382b731..c386035 100644 --- a/src/sys/include/ubixos/ld.h +++ b/src/sys/include/ubixos/ld.h @@ -32,12 +32,16 @@ #include -void ld(int,int); +void _ld(); +void ld(uInt32,uInt32); #endif /*** $Log$ + Revision 1.2 2004/05/21 15:20:00 reddawg + Cleaned up + END ***/ diff --git a/src/sys/kernel/elf.c b/src/sys/kernel/elf.c index e972f86..c2019bb 100644 --- a/src/sys/kernel/elf.c +++ b/src/sys/kernel/elf.c @@ -75,6 +75,24 @@ {"SHT_DYNSYM", 11 }, }; +const struct { + char *relTypeName; + uInt32 id; + } elfRelType[] = { + {"R_386_NONE", 0 }, + {"R_386_32", 1 }, + {"R_386_PC32", 2 }, + {"R_386_GOT32", 3 }, + {"R_386_PLT32", 4 }, + {"R_386_COPY", 5 }, + {"R_386_GLOB_DAT", 6 }, + {"R_386_JMP_SLOT", 7 }, + {"R_386_RELATIVE", 8 }, + {"R_386_GOTOFF", 9 }, + {"R_386_GOTPC", 10 }, + }; + + char *elfGetShType(int shType) { return((char *)elfShType[shType].shTypeName); } @@ -82,9 +100,16 @@ char *elfGetPhType(int phType) { return((char *)elfPhType[phType].phTypeName); } + +char *elfGetRelType(int relType) { + return((char *)elfRelType[relType].relTypeName); + } /*** $Log$ + Revision 1.2 2004/05/15 02:30:28 reddawg + Lots of changes + END ***/ diff --git a/src/sys/kernel/exec.c b/src/sys/kernel/exec.c index 426e6fb..40cb6f6 100644 --- a/src/sys/kernel/exec.c +++ b/src/sys/kernel/exec.c @@ -203,15 +203,20 @@ Allocate Memory Im Going To Have To Make This Load Memory With Correct Settings so it helps us in the future */ + kprintf("Q"); for (x=0;x<=((programHeader[i].phMemsz & 0xFFFFF000)+4095);x += 0x100) { if (vmmRemapPage(vmmFindFreePage(_current->id),((programHeader[i].phVaddr & 0xFFFFF000) + x)) == 0x0) { kpanic("Error: vmmFindFreePage Failed\n"); } } + kprintf("W"); _current->oInfo.vmStart = ((programHeader[i].phVaddr & 0xFFFFF000) + 0x1900000); + kprintf("E"); /* Now Load Section To Memory */ fseek(tmpFd,programHeader[i].phOffset,0); + kprintf("R"); fread(newLoc,programHeader[i].phFilesz,1,tmpFd); + kprintf("T"); } else if (programHeader[i].phType == 2) { kprintf("x"); @@ -431,7 +436,9 @@ for (i=0;i<12;i++) { if (elfDynamicS[i].dynVal == 0x3) { tmp = (uInt32 *)elfDynamicS[i].dynPtr; - tmp[2] = (uInt32) &ld; + tmp[2] = (uInt32) &_ld; + tmp[1] = tmpFd;//0xDEADBEEF;//elfDynamicS[i].dynPtr; + // kprintf("[0x%X][0x%X]\n",argv,argc); } } @@ -445,7 +452,7 @@ /* Now That We Relocated The Binary We Can Unmap And Free Header Info */ kfree(binaryHeader); kfree(programHeader); - fclose(tmpFd); + //fclose(tmpFd); /* Jump To Start Of New Binary */ asm volatile( "pushl %1 \n" @@ -458,6 +465,9 @@ /*** $Log$ + Revision 1.16 2004/06/10 13:08:00 reddawg + Minor Bug Fixes + Revision 1.15 2004/06/04 13:29:56 reddawg libc: modified mkdir(); interface kpanic: kPanic(); now says kPanic: %s diff --git a/src/sys/kernel/ld.c b/src/sys/kernel/ld.c index 5a4af1b..252e0ef 100644 --- a/src/sys/kernel/ld.c +++ b/src/sys/kernel/ld.c @@ -32,24 +32,102 @@ #include #include #include +#include +#include +#include -void ld(int first,int got2) { - int i = 0x0; - uInt32 *tmp; - kprintf("Kernel Linker\n"); - kprintf("[0x%X][0x%X]\n",first,got2); - tmp = (uInt32 *)got2; - kprintf("[0x%X]\n",tmp[first]); - kprintf("[%s]\n",_current->oInfo.shstrtab[first]); - for (i=0;i<10;i++) { - kprintf("[%s][%i]\n",_current->oInfo.shstrtab[i],i); +void _ld(); +asm( + ".globl _ld \n" + "_ld: \n" + " call ld \n" + ); + +void ld(uInt32 got2,uInt32 entry) { + int i = 0x0; + int x = 0x0; + int rel = 0x0; + char *shStr = 0x0; + char *dynStr = 0x0; + fileDescriptor *tmpFd = (fileDescriptor *)got2; + elfHeader *binaryHeader = 0x0; + elfSectionheader *sectionHeader = 0x0; + elfPltInfo *elfRel = 0x0; + elfDynSym *relSymTab = 0x0; + + fseek(tmpFd,0x0,0x0); + + binaryHeader = (elfHeader *)kmalloc(sizeof(elfHeader)); + fread(binaryHeader,sizeof(elfHeader),1,tmpFd); + + kprintf("[0x%X][0x%X]\n",got2,entry); + + kprintf("binaryHeader->eType: [%i]\n",binaryHeader->eType); + kprintf("binaryHeader->eEntry: [0x%X]\n",binaryHeader->eEntry); + + sectionHeader = (elfSectionheader *)kmalloc(sizeof(elfSectionheader)*binaryHeader->eShnum); + fseek(tmpFd,binaryHeader->eShoff,0); + fread(sectionHeader,sizeof(elfSectionheader),binaryHeader->eShnum,tmpFd); + + shStr = (char *)kmalloc(sectionHeader[binaryHeader->eShstrndx].shSize); + fseek(tmpFd,sectionHeader[binaryHeader->eShstrndx].shOffset,0); + fread(shStr,sectionHeader[binaryHeader->eShstrndx].shSize,1,tmpFd); + + kprintf("1"); + for (i=0x0;ieShnum;i++) { + switch (sectionHeader[i].shType) { + case 3: + if (!kstrcmp((shStr + sectionHeader[i].shName),".dynstr")) { + dynStr = (char *)kmalloc(sectionHeader[i].shSize); + fseek(tmpFd,sectionHeader[i].shOffset,0); + fread(dynStr,sectionHeader[i].shSize,1,tmpFd); + } + break; + case 9: + rel = i; + break; + case 11: + kprintf("Dynamic Sym\n"); + relSymTab = (elfDynSym *)kmalloc(sectionHeader[i].shSize); + fseek(tmpFd,sectionHeader[i].shOffset,0); + fread(relSymTab,sectionHeader[i].shSize,1,tmpFd); + break; + } } + + kprintf(".rel.plt: (%i)\n",rel); + fseek(tmpFd,sectionHeader[rel].shOffset,0x0); + elfRel = (elfPltInfo *)kmalloc(sectionHeader[rel].shSize); + fread(elfRel,sectionHeader[rel].shSize,1,tmpFd); + + i = (entry/sizeof(elfPltInfo)); + + //for (i=0x0;istate = DEAD; - while (1); + schedYield(); } /*** $Log$ + Revision 1.3 2004/05/15 02:30:28 reddawg + Lots of changes + END ***/