Fixed few issues with loader and basic image loading.

Declaring section of the form:

.align 4
.section "kernel"
.incbin "path-to-kernel"

And defining a linker variable before the section output does not always seem to work.
The linker seems to add padding even though .align directive comes before .section

	modified:   SConstruct.loader
	modified:   loader/linker.lds
	modified:   loader/main.c
This commit is contained in:
Bahadir Balban
2009-09-17 19:19:03 +03:00
parent 6a654a9dc5
commit 6538e70b39
3 changed files with 28 additions and 7 deletions

View File

@@ -33,7 +33,8 @@ env = Environment(CC = 'arm-none-eabi-gcc',
ASFLAGS = ['-D__ASSEMBLY__'],
PROGSUFFIX = '.elf',
ENV = {'PATH' : os.environ['PATH']},
LIBS = ['gcc'],
LIBS = ['gcc', 'elf', 'c-baremetal', 'gcc'],
LIBPATH = [join('build', LIBELF_PATH), join('build', LIBC_PATH)],
CPPPATH = ['#include', LIBC_INCPATH, LIBELF_INCPATH])
libc = SConscript('loader/libs/c/SConscript', \
@@ -45,4 +46,6 @@ libelf = SConscript('loader/libs/elf/SConscript', exports = { 'env' : env }, \
loader_objs = SConscript('loader/SConscript', exports = { 'env' : env }, \
duplicate = 0, variant_dir = 'build/loader')
env.Program('build/final.elf', [loader_objs + libc + libelf])
env.Program('build/final.elf', [libelf + libc + loader_objs])
Depends(loader_objs, libelf)
Depends(loader_objs, libc)

View File

@@ -13,7 +13,6 @@ SECTIONS
.rodata1 : { *(.rodata1) }
.data :
{
*(.data)
_start_kernel = .;
*(.kernel)
_end_kernel = .;
@@ -21,6 +20,7 @@ SECTIONS
_start_containers = .;
*(.containers)
_end_containers = .;
*(.data)
}
.got : { *(.got) *(.got.plt) }
.bss : { *(.bss) }

View File

@@ -1,4 +1,5 @@
#include <elf/elf.h>
#include <elf/elf32.h>
#include <stdio.h>
#include <stdlib.h>
#include "arch.h"
@@ -22,24 +23,41 @@ void load_container_images(unsigned long start, unsigned long end)
}
*/
int load_elf_image(unsigned long **entry, void *filebuf)
{
if (!elf32_checkFile((struct Elf32_Header *)filebuf)) {
**entry = (unsigned long)elf32_getEntryPoint((struct Elf32_Header *)filebuf);
printf("Entry point: %lx\n", **entry);
} else {
printf("Not a valid elf image.\n");
return -1;
}
if (!elf_loadFile(filebuf, 1)) {
printf("Elf image seems valid, but unable to load.\n");
return -1;
}
return 0;
}
int main(void)
{
void *kernel_entry = 0;
unsigned long *kernel_entry;
arch_init();
printf("ELF Loader: Started.\n");
printf("Loading the kernel...\n");
// load_elf_image(&kernel_entry, _start_kernel, _end_kernel);
load_elf_image(&kernel_entry, (void *)_start_kernel);
printf("Loading containers...\n");
// load_container_images(_start_containers, _end_containers)
printf("elf-loader:\tkernel entry point is %p\n", kernel_entry);
printf("elf-loader:\tkernel entry point is %lx\n", *kernel_entry);
// arch_start_kernel(kernel_entry);
printf("elf-loader:\tKernel start failed!\n");
// printf("elf-loader:\tKernel start failed!\n");
return -1;
}