📄 loader.c
字号:
//#include "stdarg.h"#include "elf.h"#include "stdlib.h"/* panic(str, ...) -------------------------------------------------------------- Print a message and abort.*/void panic( const char* message){ puts("Loader panic:"); puts(message); putchar('\n'); abort();}/* load_image() --------------------------------------------------------------*/extern int _etext; /* label at the end of the text segment */char *ld_start = "loader starting\n";int load_image(void){ const char* image = (void*)(((long)&_etext + 3) & -8); Elf32_Ehdr* ehdr; Elf32_Phdr* phdr; int i; puts (ld_start); ehdr = (Elf32_Ehdr*)image; /* Verify the magic. */ if (bcmp(ehdr->e_ident, ELFMAG, 4) != 0) { //panic(">>>%#s<<<", ehdr->e_ident); panic("No ELF header found in the boot image"); } /* Go through the program headers, loading each one. */ phdr = (Elf32_Phdr*)(image + ehdr->e_phoff); if (phdr == 0 || ehdr->e_phnum == 0) panic("No program headers found in the boot image"); if (ehdr->e_phentsize != sizeof(Elf32_Phdr)) panic("Bad program header size"); for (i = 0; i < ehdr->e_phnum; ++i) { puts ("Loader: Relocating section sized "); put_hex (phdr[i].p_filesz, 8, 1, 1, 'A'); puts (" from "); put_hex (image + phdr[i].p_offset, 8, 1, 1, 'A'); puts (" to "); put_hex (phdr[i].p_paddr, 8, 1, 1, 'A'); puts (".\n"); /*printf("Loader: relocating 0x%05x bytes from %p to %p\n", (long)(phdr[i].p_filesz), (long)(image + phdr[i].p_offset), (long)(int)(phdr[i].p_paddr));*/// if (phdr[i].p_vaddr != phdr[i].p_paddr)// panic("Paddr and vaddr differ");// in section %d", i); bcopy(image + phdr[i].p_offset, (void*)(long)(int)(phdr[i].p_paddr), phdr[i].p_filesz); } puts ("Loader: jumping to entry pt "); put_hex (ehdr->e_entry, 8, 1, 1, 'A'); // printf("Loader: jumping to %p\n", (long)(int)(ehdr->e_entry)); return ehdr->e_entry;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -