summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2014-11-22 16:43:51 +0100
committerMichal Idziorek <m.i@gmx.at>2014-11-22 16:43:51 +0100
commitc4aa91d9d58a47eb90798ae1ae6647953d3745a2 (patch)
tree2745079a8d62c2d414720775d073cb95106a95cc
parent795b1f7df203ae33e1d0eb13612f0ba2abf4351e (diff)
support for ELF (with 1*text and 1*data)!
-rw-r--r--Makefile4
-rw-r--r--kernel/syscalls.c54
-rw-r--r--userspace/Makefile5
-rw-r--r--userspace/linker.ld28
-rw-r--r--userspace/sys/oldlinker.ld25
5 files changed, 36 insertions, 80 deletions
diff --git a/Makefile b/Makefile
index 61b9df6..ecd38ec 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,5 @@
-
#####################
# #
# FoolOS Build Sys. #
@@ -175,6 +174,3 @@ stick: $(FOOLOS)
clean: $(CLEANDIRS)
-rm *.bin $(FOOLOS) $(FOOLOS_VDI) $(KERNEL_ENTRY) $(ASM_OBJECTS) $(OBJECTS) $(IMG_FILLUP) $(BIN_MBR) $(BIN_MP) $(BIN_STAGE2) $(DEPS) bochs.out bochs.log ne2k-tx.log ne2k-txdump.txt
-
-
-
diff --git a/kernel/syscalls.c b/kernel/syscalls.c
index eb11f1b..1be1053 100644
--- a/kernel/syscalls.c
+++ b/kernel/syscalls.c
@@ -144,11 +144,11 @@ int syscall_execve(char *name, char **argv, char **env)
//load binary
ext2_check(EXT2_RAM_ADDRESS);
- ext2_inode_content(EXT2_RAM_ADDRESS,name,0x800000-0x1000,0x100000);
+ ext2_inode_content(EXT2_RAM_ADDRESS,name,0x800000,0x100000);
Elf32_Ehdr *elf;
- elf=0x800000-0x1000;
+ elf=0x800000;
if(elf->e_ident[0]!=0x7f||elf->e_ident[1]!='E'||elf->e_ident[2]!='L'||elf->e_ident[3]!='F')
panic(FOOLOS_MODULE_NAME,"ELF mismatch!?");
@@ -183,24 +183,40 @@ int syscall_execve(char *name, char **argv, char **env)
// iterate over section headers
for(int phidx=0;phidx<elf->e_phnum;phidx++)
{
- Elf32_Phdr *phdr=0x800000-0x1000+elf->e_phoff+phidx*elf->e_phentsize;
- /*
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"-- PROGRAMM HEADER %d --",phidx+1);
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"p-type: %d",phdr->p_type);
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"p-offset: 0x%08X",phdr->p_offset);
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"p-vaddr: 0x%08X",phdr->p_vaddr);
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"p-filesz: 0x%08X",phdr->p_filesz);
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"p-memsz: 0x%08X",phdr->p_memsz);
- */
-
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"bss: 0x%08X-0x%08X",phdr->p_vaddr+phdr->p_filesz,phdr->p_vaddr+phdr->p_memsz);
-
- // let's zero init bss and set alloc (heap) just right after it!
- for(uint32_t *addr=phdr->p_vaddr+phdr->p_filesz; addr<=phdr->p_vaddr+phdr->p_memsz; addr++)
+
+ if(phidx==1)
{
- *addr=0;
+
+ Elf32_Phdr *phdr=0x800000+elf->e_phoff+phidx*elf->e_phentsize;
+
+ /*
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"-- PROGRAMM HEADER %d --",phidx+1);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"p-type: %d",phdr->p_type);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"p-offset: 0x%08X",phdr->p_offset);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"p-vaddr: 0x%08X",phdr->p_vaddr);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"p-filesz: 0x%08X",phdr->p_filesz);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"p-memsz: 0x%08X",phdr->p_memsz);
+ */
+
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"data: 0x%08X-0x%08X",phdr->p_vaddr,phdr->p_vaddr+phdr->p_filesz);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"bss: 0x%08X-0x%08X",phdr->p_vaddr+phdr->p_filesz,phdr->p_vaddr+phdr->p_memsz);
+
+ // let's copy the rw- data block
+ uint32_t *data=0x800000+phdr->p_offset;
+ for(uint32_t *addr=phdr->p_vaddr; addr<=phdr->p_vaddr+phdr->p_filesz; addr++)
+ {
+ *addr=*data;
+ data++;
+ }
+
+ // let's zero init bss and set alloc (heap) just right after it!
+ for(uint32_t *addr=phdr->p_vaddr+phdr->p_filesz; addr<=phdr->p_vaddr+phdr->p_memsz; addr++)
+ {
+ *addr=0;
+ }
+
+ alloc=phdr->p_vaddr+phdr->p_memsz;
}
- alloc=phdr->p_vaddr+phdr->p_memsz;
}
@@ -222,7 +238,7 @@ int syscall_execve(char *name, char **argv, char **env)
// autorun "user-space" prog
asm("push $10");//argv TODO: addresse
asm("push $20"); //argc TODO: real number of params!
- asm("push $0x800000");
+ asm("push $0x800080");
asm("ret");
while(1);
diff --git a/userspace/Makefile b/userspace/Makefile
index a0817e3..79c43d6 100644
--- a/userspace/Makefile
+++ b/userspace/Makefile
@@ -1,6 +1,5 @@
CC=i686-foolos-gcc
CFLAGS=-w
-LDFLAGS=-T linker.ld
PROGS=shell simple brainfuck add
@@ -14,8 +13,7 @@ ext2.img: $(PROGS)
echo "hello one" > mnt/miguel/test1.txt
echo "hello two" > mnt/test2.txt
cp $^ mnt
-# cp shell.bin mnt
- cp ~/temp/fool-os-stuff/binutils-fool-build/binutils/elfedit mnt
+# cp ~/temp/fool-os-stuff/binutils-fool-build/binutils/elfedit mnt
sync
sudo umount mnt
rm mnt -rf
@@ -29,7 +27,6 @@ shell: shell.o
simple: simple.o
add: add.o
-
clean:
-rm *.o $(PROGS) ext2.img
diff --git a/userspace/linker.ld b/userspace/linker.ld
deleted file mode 100644
index 99ae573..0000000
--- a/userspace/linker.ld
+++ /dev/null
@@ -1,28 +0,0 @@
-/* OUTPUT_FORMAT(binary) */
-
-SECTIONS
-{
- . = 0x800000;
-
- /*
-
- .text : ALIGN(0x1000) {
- _TEXT_START_ = .;
- *(.text)
- _TEXT_END_ = .;
- }
-
- .data : ALIGN(0x1000) {
- _DATA_START_ = .;
- *(.data)
- _DATA_END_ = .;
- }
-
- .bss : ALIGN(0x1000) {
- _BSS_START_ = .;
- *(.bss)
- _BSS_END_ = .;
- }
- */
-
-}
diff --git a/userspace/sys/oldlinker.ld b/userspace/sys/oldlinker.ld
deleted file mode 100644
index 4eee8eb..0000000
--- a/userspace/sys/oldlinker.ld
+++ /dev/null
@@ -1,25 +0,0 @@
-OUTPUT_FORMAT(binary)
-
-SECTIONS
-{
- . = 0x800000;
-
- .text : ALIGN(0x1000) {
- _TEXT_START_ = .;
- *(.text)
- _TEXT_END_ = .;
- }
-
- .data : ALIGN(0x1000) {
- _DATA_START_ = .;
- *(.data)
- _DATA_END_ = .;
- }
-
- .bss : ALIGN(0x1000) {
- _BSS_START_ = .;
- *(.bss)
- _BSS_END_ = .;
- }
-
-}