diff --git a/src/sys/include/ubixos/elf.h b/src/sys/include/ubixos/elf.h index 07b31e6..b24becb 100644 --- a/src/sys/include/ubixos/elf.h +++ b/src/sys/include/ubixos/elf.h @@ -106,7 +106,7 @@ uInt32 phMemsz; /* Size of contents in memory. */ uInt32 phFlags; /* Access permission flags. */ uInt32 phAlign; /* Alignment in memory and file. */ - } elfProgramheader; + } elfProgramHeader; typedef struct { uInt32 shName; /* Section name (index into the section header string table). */ @@ -119,7 +119,7 @@ uInt32 shInfo; /* Depends on section type. */ uInt32 shAddralign; /* Alignment in bytes. */ uInt32 shEntsize; /* Size of each entry in section. */ - } elfSectionheader; + } elfSectionHeader; typedef struct { uInt32 pltOffset; @@ -150,6 +150,9 @@ /*** $Log$ + Revision 1.5 2004/06/14 12:20:54 reddawg + notes: many bugs repaired and ld works 100% now. + Revision 1.4 2004/06/12 01:27:26 reddawg shared objects: yes we almost fully support shared objects diff --git a/src/sys/include/ubixos/ld.h b/src/sys/include/ubixos/ld.h index 6dc48ec..8e7f2de 100644 --- a/src/sys/include/ubixos/ld.h +++ b/src/sys/include/ubixos/ld.h @@ -35,11 +35,15 @@ void _ld(); uInt32 ld(uInt32,uInt32); uInt32 ldFindFunc(char *); +void ldEnable(); #endif /*** $Log$ + Revision 1.4 2004/06/13 03:05:15 reddawg + we now have a dynamic linker + Revision 1.3 2004/06/12 01:27:26 reddawg shared objects: yes we almost fully support shared objects diff --git a/src/sys/include/ubixos/sched.h b/src/sys/include/ubixos/sched.h index 06496a6..e76cdbd 100644 --- a/src/sys/include/ubixos/sched.h +++ b/src/sys/include/ubixos/sched.h @@ -44,7 +44,7 @@ struct osInfo { struct mountPoints *container; - elfSectionheader *sectionHeader; + elfSectionHeader *sectionHeader; struct taskFileInfo fileInfo; struct consoleStruct *terminal; uInt16 sectionCount; @@ -96,6 +96,9 @@ /*** $Log$ + Revision 1.4 2004/06/14 12:20:54 reddawg + notes: many bugs repaired and ld works 100% now. + Revision 1.3 2004/05/21 15:49:13 reddawg The os does better housekeeping now when a task is exited diff --git a/src/sys/kernel/exec.c b/src/sys/kernel/exec.c index 711765b..4646775 100644 --- a/src/sys/kernel/exec.c +++ b/src/sys/kernel/exec.c @@ -129,7 +129,7 @@ fileDescriptor *tmpFd = 0x0; elfHeader *binaryHeader = 0x0; - elfProgramheader *programHeader = 0x0; + elfProgramHeader *programHeader = 0x0; /* Get A New Task For This Proccess */ _current = schedNewTask(); @@ -187,9 +187,9 @@ } /* Load The Program Header(s) */ - programHeader = (elfProgramheader *)kmalloc(sizeof(elfProgramheader)*binaryHeader->ePhnum); + programHeader = (elfProgramHeader *)kmalloc(sizeof(elfProgramHeader)*binaryHeader->ePhnum); fseek(tmpFd,binaryHeader->ePhoff,0); - fread(programHeader,(sizeof(elfProgramheader)*binaryHeader->ePhnum),1,tmpFd); + fread(programHeader,(sizeof(elfProgramHeader)*binaryHeader->ePhnum),1,tmpFd); /* Loop Through The Header And Load Sections Which Need To Be Loaded */ for (i=0;iePhnum;i++) { @@ -336,8 +336,8 @@ fileDescriptor *tmpFd = 0x0; elfHeader *binaryHeader = 0x0; - elfProgramheader *programHeader = 0x0; - elfSectionheader *sectionHeader = 0x0; + elfProgramHeader *programHeader = 0x0; + elfSectionHeader *sectionHeader = 0x0; elfDynamic *elfDynamicS = 0x0; @@ -358,7 +358,7 @@ binaryHeader = (elfHeader *)kmalloc(sizeof(elfHeader)); fread(binaryHeader,sizeof(elfHeader),1,tmpFd); /* Set sectionHeader To Point To Loaded Binary To We Can Gather Info */ - /* sectionHeader = (elfSectionheader *)(0x7C0000 + binaryHeader->eShoff); */ + /* sectionHeader = (elfSectionHeader *)(0x7C0000 + binaryHeader->eShoff); */ /* Check If App Is A Real Application */ if ((binaryHeader->eIdent[1] != 'E') && (binaryHeader->eIdent[2] != 'L') && (binaryHeader->eIdent[3] != 'F')) { @@ -381,13 +381,13 @@ } /* Load The Program Header(s) */ - programHeader = (elfProgramheader *)kmalloc(sizeof(elfProgramheader)*binaryHeader->ePhnum); + programHeader = (elfProgramHeader *)kmalloc(sizeof(elfProgramHeader)*binaryHeader->ePhnum); fseek(tmpFd,binaryHeader->ePhoff,0); - fread(programHeader,(sizeof(elfProgramheader)*binaryHeader->ePhnum),1,tmpFd); + fread(programHeader,(sizeof(elfProgramHeader)*binaryHeader->ePhnum),1,tmpFd); - sectionHeader = (elfSectionheader *)kmalloc(sizeof(elfSectionheader)*binaryHeader->eShnum); + sectionHeader = (elfSectionHeader *)kmalloc(sizeof(elfSectionHeader)*binaryHeader->eShnum); fseek(tmpFd,binaryHeader->eShoff,0); - fread(sectionHeader,sizeof(elfSectionheader)*binaryHeader->eShnum,1,tmpFd); + fread(sectionHeader,sizeof(elfSectionHeader)*binaryHeader->eShnum,1,tmpFd); /* Loop Through The Header And Load Sections Which Need To Be Loaded */ for (i=0;iePhnum;i++) { @@ -412,9 +412,12 @@ fread(newLoc,programHeader[i].phFilesz,1,tmpFd); } else if (programHeader[i].phType == 3) { + ldEnable(tmpFd); + /* linker = (char *)kmalloc(programHeader[i].phMemsz); fseek(tmpFd,programHeader[i].phOffset,0); fread(linker,programHeader[i].phFilesz,1,tmpFd); + */ } } _current->oInfo.shstrtab = (char *)kmalloc(sectionHeader[binaryHeader->eShstrndx].shSize); @@ -453,6 +456,9 @@ /*** $Log$ + Revision 1.25 2004/06/15 23:46:05 reddawg + Nig Nog + Revision 1.24 2004/06/14 13:16:26 reddawg Works now 0x1000 line 272 diff --git a/src/sys/kernel/ld.c b/src/sys/kernel/ld.c index 0c3de77..73bcff4 100644 --- a/src/sys/kernel/ld.c +++ b/src/sys/kernel/ld.c @@ -36,6 +36,37 @@ #include #include +void ldEnable(uInt32 tmpFd) { + fileDescriptor *ldFd = 0x0; + elfHeader *binaryHeader = 0x0; + elfProgramHeader *programHeader = 0x0; + elfSectionHeader *sectionHeader = 0x0; + + ldFd = fopen("ld.so","rb"); + + fseek(ldFd,0x0,0x0); + binaryHeader = (elfHeader *)kmalloc(sizeof(elfHeader)); + fread(binaryHeader,sizeof(elfHeader),1,ldFd); + + programHeader = (elfProgramHeader *)kmalloc(sizeof(elfProgramHeader)*binaryHeader->ePhnum); + fseek(ldFd,binaryHeader->ePhoff,0); + fread(programHeader,sizeof(elfSectionHeader),binaryHeader->ePhnum,ldFd); + + for (i=0;iePhnum;i++) { + switch (programHeader[i].phType) { + case 1: + case 2: + kmemcpy((output+programHeader[i].phVaddr),(binary + programHeader[i].phOffset),programHeader[i].phFilesz); + break; + default: + kprintf("Unhandled Header\n"); + break; + } + } + + fclose(ldFd); + } + void _ld(); asm( ".globl _ld \n" @@ -54,7 +85,7 @@ char *shStr = 0x0; char *dynStr = 0x0; fileDescriptor *tmpFd = (fileDescriptor *)got2; - elfSectionheader *sectionHeader = 0x0; + elfSectionHeader *sectionHeader = 0x0; elfDynSym *relSymTab = 0x0; elfPltInfo *elfRel = 0x0; elfHeader *binaryHeader = 0x0; @@ -66,9 +97,9 @@ } if (sectionHeader == 0x0) { - sectionHeader = (elfSectionheader *)kmalloc(sizeof(elfSectionheader)*binaryHeader->eShnum); + sectionHeader = (elfSectionHeader *)kmalloc(sizeof(elfSectionHeader)*binaryHeader->eShnum); fseek(tmpFd,binaryHeader->eShoff,0); - fread(sectionHeader,sizeof(elfSectionheader),binaryHeader->eShnum,tmpFd); + fread(sectionHeader,sizeof(elfSectionHeader),binaryHeader->eShnum,tmpFd); } if (shStr == 0x0) { shStr = (char *)kmalloc(sectionHeader[binaryHeader->eShstrndx].shSize); @@ -125,8 +156,8 @@ char *binary = 0x0; char *output = 0x0; elfHeader *binaryHeader = 0x0; - elfProgramheader *programHeader = 0x0; - elfSectionheader *sectionHeader = 0x0; + elfProgramHeader *programHeader = 0x0; + elfSectionHeader *sectionHeader = 0x0; elfPltInfo *elfRel = 0x0; elfDynSym *relSymTab = 0x0; fileDescriptor *tmpFd = 0x0; @@ -141,8 +172,8 @@ fclose(tmpFd); binaryHeader = (elfHeader *)binary; - programHeader = (elfProgramheader *)(binary + binaryHeader->ePhoff); - sectionHeader = (elfSectionheader *)(binary + binaryHeader->eShoff); + programHeader = (elfProgramHeader *)(binary + binaryHeader->ePhoff); + sectionHeader = (elfSectionHeader *)(binary + binaryHeader->eShoff); shStr = (char *)(binary + sectionHeader[binaryHeader->eShstrndx].shOffset); @@ -213,6 +244,9 @@ /*** $Log$ + Revision 1.6 2004/06/14 12:20:54 reddawg + notes: many bugs repaired and ld works 100% now. + Revision 1.5 2004/06/13 03:05:15 reddawg we now have a dynamic linker