Commit d4d9a553 authored by Wu Zhangjin's avatar Wu Zhangjin Committed by Ralf Baechle

MIPS: Cleanup and Fixup of compressed kernel support

 o Remove the .initrd section.  The initrd section was already handled
   when vmlinux was linked.
 o Discard .MIPS.options, .options, .pdr, .reginfo, .comment and .note
   sections.  If .MIPS.options is not removed, kernels compiled with gcc
   3.4.6 will not boot.
 o Clean up the file format.
 o Remove several other unneeded sections.

Tested with GCC 3.4.6 and 4.4.1 with and without initrd.
Signed-off-by: default avatarWu Zhangjin <wuzhangjin@gmail.com>
Cc: linux-mips@linux-mips.org
Patchwork: http://patchwork.linux-mips.org/patch/785/Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent abbdc3d8
...@@ -56,7 +56,7 @@ $(obj)/piggy.o: $(obj)/vmlinux.$(suffix_y) $(obj)/dummy.o ...@@ -56,7 +56,7 @@ $(obj)/piggy.o: $(obj)/vmlinux.$(suffix_y) $(obj)/dummy.o
LDFLAGS_vmlinuz := $(LDFLAGS) -Ttext $(VMLINUZ_LOAD_ADDRESS) -T LDFLAGS_vmlinuz := $(LDFLAGS) -Ttext $(VMLINUZ_LOAD_ADDRESS) -T
vmlinuz: $(src)/ld.script $(obj-y) $(obj)/piggy.o vmlinuz: $(src)/ld.script $(obj-y) $(obj)/piggy.o
$(call if_changed,ld) $(call if_changed,ld)
$(Q)$(OBJCOPY) $(OBJCOPYFLAGS) -R .comment -R .stab -R .stabstr -R .initrd -R .sysmap $@ $(Q)$(OBJCOPY) $(OBJCOPYFLAGS) $@
# #
# Some DECstations need all possible sections of an ECOFF executable # Some DECstations need all possible sections of an ECOFF executable
...@@ -84,14 +84,11 @@ vmlinuz.ecoff: $(obj)/../elf2ecoff $(VMLINUZ) ...@@ -84,14 +84,11 @@ vmlinuz.ecoff: $(obj)/../elf2ecoff $(VMLINUZ)
$(obj)/../elf2ecoff: $(src)/../elf2ecoff.c $(obj)/../elf2ecoff: $(src)/../elf2ecoff.c
$(Q)$(HOSTCC) -o $@ $^ $(Q)$(HOSTCC) -o $@ $^
drop-sections = .reginfo .mdebug .comment .note .pdr .options .MIPS.options OBJCOPYFLAGS_vmlinuz.bin := $(OBJCOPYFLAGS) -O binary
strip-flags = $(addprefix --remove-section=,$(drop-sections))
OBJCOPYFLAGS_vmlinuz.bin := $(OBJCOPYFLAGS) -O binary $(strip-flags)
vmlinuz.bin: vmlinuz vmlinuz.bin: vmlinuz
$(call if_changed,objcopy) $(call if_changed,objcopy)
OBJCOPYFLAGS_vmlinuz.srec := $(OBJCOPYFLAGS) -S -O srec $(strip-flags) OBJCOPYFLAGS_vmlinuz.srec := $(OBJCOPYFLAGS) -S -O srec
vmlinuz.srec: vmlinuz vmlinuz.srec: vmlinuz
$(call if_changed,objcopy) $(call if_changed,objcopy)
......
...@@ -28,8 +28,6 @@ char *zimage_start; ...@@ -28,8 +28,6 @@ char *zimage_start;
/* The linker tells us where the image is. */ /* The linker tells us where the image is. */
extern unsigned char __image_begin, __image_end; extern unsigned char __image_begin, __image_end;
extern unsigned char __ramdisk_begin, __ramdisk_end;
unsigned long initrd_size;
/* debug interfaces */ /* debug interfaces */
extern void puts(const char *s); extern void puts(const char *s);
...@@ -102,14 +100,6 @@ void decompress_kernel(unsigned long boot_heap_start) ...@@ -102,14 +100,6 @@ void decompress_kernel(unsigned long boot_heap_start)
puthex((unsigned long)(zimage_size + zimage_start)); puthex((unsigned long)(zimage_size + zimage_start));
puts("\n"); puts("\n");
if (initrd_size) {
puts("initrd at: ");
puthex((unsigned long)(&__ramdisk_begin));
puts(" ");
puthex((unsigned long)(&__ramdisk_end));
puts("\n");
}
/* this area are prepared for mallocing when decompressing */ /* this area are prepared for mallocing when decompressing */
free_mem_ptr = boot_heap_start; free_mem_ptr = boot_heap_start;
free_mem_end_ptr = boot_heap_start + BOOT_HEAP_SIZE; free_mem_end_ptr = boot_heap_start + BOOT_HEAP_SIZE;
......
/*
* ld.script for compressed kernel support of MIPS
*
* Copyright (C) 2009 Lemote Inc.
* Author: Wu Zhangjin <wuzj@lemote.com>
*/
OUTPUT_ARCH(mips) OUTPUT_ARCH(mips)
ENTRY(start) ENTRY(start)
SECTIONS SECTIONS
{ {
/* Read-only sections, merged into text segment: */ /* . = VMLINUZ_LOAD_ADDRESS */
.init : { *(.init) } =0 /* read-only */
.text : _text = .; /* Text and read-only data */
{ .text : {
_ftext = . ; _ftext = . ;
*(.text) *(.text)
*(.rodata) *(.rodata)
*(.rodata1) } = 0
/* .gnu.warning sections are handled specially by elf32.em. */ _etext = .; /* End of text section */
*(.gnu.warning)
} =0
.kstrtab : { *(.kstrtab) }
. = ALIGN(16); /* Exception table */
__start___ex_table = .;
__ex_table : { *(__ex_table) }
__stop___ex_table = .;
__start___dbe_table = .; /* Exception table for data bus errors */
__dbe_table : { *(__dbe_table) }
__stop___dbe_table = .;
__start___ksymtab = .; /* Kernel symbol table */
__ksymtab : { *(__ksymtab) }
__stop___ksymtab = .;
_etext = .;
. = ALIGN(8192);
.data.init_task : { *(.data.init_task) }
/* Startup code */
. = ALIGN(4096);
__init_begin = .;
.text.init : { *(.text.init) }
.data.init : { *(.data.init) }
. = ALIGN(16);
__setup_start = .;
.setup.init : { *(.setup.init) }
__setup_end = .;
__initcall_start = .;
.initcall.init : { *(.initcall.init) }
__initcall_end = .;
. = ALIGN(4096); /* Align double page for init_task_union */
__init_end = .;
. = ALIGN(4096);
.data.page_aligned : { *(.data.idt) }
. = ALIGN(32);
.data.cacheline_aligned : { *(.data.cacheline_aligned) }
.fini : { *(.fini) } =0 /* writable */
.reginfo : { *(.reginfo) } .data : { /* Data */
/* Adjust the address for the data segment. We want to adjust up to _fdata = . ;
the same address within the page on the next page up. It would *(.data)
be more correct to do this: /* Put the compressed image here, so bss is on the end. */
. = .; __image_begin = .;
The current expression does not correctly handle the case of a *(.image)
text segment ending precisely at the end of a page; it causes the __image_end = .;
data segment to skip a page. The above expression does not have CONSTRUCTORS
this problem, but it will currently (2/95) cause BFD to allocate }
a single segment, combining both text and data, for this case. .sdata : { *(.sdata) }
This will prevent the text segment from being shared among . = ALIGN(4);
multiple executions of the program; I think that is more _edata = .; /* End of data section */
important than losing a page of the virtual address space (note
that no actual memory is lost; the page which is skipped can not
be referenced). */
. = .;
.data :
{
_fdata = . ;
*(.data)
/* Put the compressed image here, so bss is on the end. */ /* BSS */
__image_begin = .; __bss_start = .;
*(.image) _fbss = .;
__image_end = .; .sbss : { *(.sbss) *(.scommon) }
/* Align the initial ramdisk image (INITRD) on page boundaries. */ .bss : {
. = ALIGN(4096); *(.dynbss)
__ramdisk_begin = .; *(.bss)
*(.initrd) *(COMMON)
__ramdisk_end = .; }
. = ALIGN(4096); . = ALIGN(4);
_end = . ;
CONSTRUCTORS /* These are needed for ELF backends which have not yet been converted
} * to the new style linker. */
.data1 : { *(.data1) }
_gp = . + 0x8000;
.lit8 : { *(.lit8) }
.lit4 : { *(.lit4) }
.ctors : { *(.ctors) }
.dtors : { *(.dtors) }
.got : { *(.got.plt) *(.got) }
.dynamic : { *(.dynamic) }
/* We want the small data sections together, so single-instruction offsets
can access them all, and initialized data all before uninitialized, so
we can shorten the on-disk segment size. */
.sdata : { *(.sdata) }
. = ALIGN(4);
_edata = .;
PROVIDE (edata = .);
__bss_start = .; .stab 0 : { *(.stab) }
_fbss = .; .stabstr 0 : { *(.stabstr) }
.sbss : { *(.sbss) *(.scommon) }
.bss :
{
*(.dynbss)
*(.bss)
*(COMMON)
. = ALIGN(4);
_end = . ;
PROVIDE (end = .);
}
/* Sections to be discarded */ /* These must appear regardless of . */
/DISCARD/ : .gptab.sdata : { *(.gptab.data) *(.gptab.sdata) }
{ .gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) }
*(.text.exit)
*(.data.exit)
*(.exitcall.exit)
}
/* This is the MIPS specific mdebug section. */ /* Sections to be discarded */
.mdebug : { *(.mdebug) } /DISCARD/ : {
/* These are needed for ELF backends which have not yet been *(.MIPS.options)
converted to the new style linker. */ *(.options)
.stab 0 : { *(.stab) } *(.pdr)
.stabstr 0 : { *(.stabstr) } *(.reginfo)
/* DWARF debug sections. *(.comment)
Symbols in the .debug DWARF section are relative to the beginning of the *(.note)
section so we begin .debug at 0. It's not clear yet what needs to happen }
for the others. */
.debug 0 : { *(.debug) }
.debug_srcinfo 0 : { *(.debug_srcinfo) }
.debug_aranges 0 : { *(.debug_aranges) }
.debug_pubnames 0 : { *(.debug_pubnames) }
.debug_sfnames 0 : { *(.debug_sfnames) }
.line 0 : { *(.line) }
/* These must appear regardless of . */
.gptab.sdata : { *(.gptab.data) *(.gptab.sdata) }
.gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) }
.comment : { *(.comment) }
.note : { *(.note) }
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment