arm: Have the linker garbage-collect unused functions and variables

This patch activates -ffunction-sections and -fdata-sections for the
compiler and --gc-sections for the linker. This will strip out all
unused functions and static/global variables from the final binaries and
reduce the amount of data we need to read over SPI.

A quick test with ToT images shows a 2.5k (13%) / 10k (29%) / 12k (28%)
reduction on Nyan and 3k (38%) / 23k (50%) / 13k (29%) on Pit,
respectively for bootblock / romstage / ramstage.

Change-Id: I052411d4ad190d0395921ac4d4677341fb91568a
Signed-off-by: Julius Werner <jwerner@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/177111
(cherry picked from commit 5635b138778dea67a5f179e13003132be07f7e59)
Signed-off-by: Isaac Christensen <isaac.christensen@se-eng.com>
Reviewed-on: http://review.coreboot.org/6904
Tested-by: build bot (Jenkins)
Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
This commit is contained in:
Julius Werner 2013-10-15 17:36:17 -07:00 committed by Isaac Christensen
parent 08539b3b98
commit c505837e67
5 changed files with 36 additions and 35 deletions

View File

@ -62,9 +62,9 @@ bootblock-y += memmove.S
$(objcbfs)/bootblock.debug: $(src)/arch/arm/bootblock.ld $(obj)/ldoptions $$(bootblock-objs) $(objcbfs)/bootblock.debug: $(src)/arch/arm/bootblock.ld $(obj)/ldoptions $$(bootblock-objs)
@printf " LINK $(subst $(obj)/,,$(@))\n" @printf " LINK $(subst $(obj)/,,$(@))\n"
ifeq ($(CONFIG_COMPILER_LLVM_CLANG),y) ifeq ($(CONFIG_COMPILER_LLVM_CLANG),y)
$(LD_bootblock) -m armelf_linux_eabi -static -o $@ -L$(obj) $< -T $(src)/arch/arm/bootblock.ld $(LD_bootblock) -m armelf_linux_eabi --gc-sections -static -o $@ -L$(obj) $< -T $(src)/arch/arm/bootblock.ld
else else
$(CC_bootblock) $(CFLAGS_bootblock) -nostartfiles -static -o $@ -L$(obj) -T $(src)/arch/arm/bootblock.ld -Wl,--start-group $(bootblock-objs) $(LIBGCC_FILE_NAME_bootblock) -Wl,--end-group $(CC_bootblock) $(CFLAGS_bootblock) -nostartfiles -Wl,--gc-sections -static -o $@ -L$(obj) -T $(src)/arch/arm/bootblock.ld -Wl,--start-group $(bootblock-objs) $(LIBGCC_FILE_NAME_bootblock) -Wl,--end-group
endif endif
endif # CONFIG_ARCH_BOOTBLOCK_ARM endif # CONFIG_ARCH_BOOTBLOCK_ARM
@ -87,9 +87,9 @@ VBOOT_STUB_DEPS += $(obj)/arch/arm/eabi_compat.rmodules_arm.o
$(objcbfs)/romstage.debug: $$(romstage-objs) $(src)/arch/arm/romstage.ld $(obj)/ldoptions $(objcbfs)/romstage.debug: $$(romstage-objs) $(src)/arch/arm/romstage.ld $(obj)/ldoptions
@printf " LINK $(subst $(obj)/,,$(@))\n" @printf " LINK $(subst $(obj)/,,$(@))\n"
ifeq ($(CONFIG_COMPILER_LLVM_CLANG),y) ifeq ($(CONFIG_COMPILER_LLVM_CLANG),y)
$(LD_romstage) -nostdlib -nostartfiles -static -o $@ -L$(obj) $(romstage-objs) -T $(src)/arch/arm/romstage.ld $(LD_romstage) -nostdlib -nostartfiles --gc-sections -static -o $@ -L$(obj) $(romstage-objs) -T $(src)/arch/arm/romstage.ld
else else
$(CC_romstage) $(CFLAGS_romstage) -nostartfiles -static -o $@ -L$(obj) -T $(src)/arch/arm/romstage.ld -Wl,--start-group $(romstage-objs) $(LIBGCC_FILE_NAME_romstage) -Wl,--end-group $(CC_romstage) $(CFLAGS_romstage) -nostartfiles -Wl,--gc-sections -static -o $@ -L$(obj) -T $(src)/arch/arm/romstage.ld -Wl,--start-group $(romstage-objs) $(LIBGCC_FILE_NAME_romstage) -Wl,--end-group
endif endif
endif # CONFIG_ARCH_ROMSTAGE_ARM endif # CONFIG_ARCH_ROMSTAGE_ARM
@ -122,9 +122,9 @@ endif
$(objgenerated)/ramstage.o: $(stages_o) $$(ramstage-objs) $(LIBGCC_FILE_NAME_ramstage) $(objgenerated)/ramstage.o: $(stages_o) $$(ramstage-objs) $(LIBGCC_FILE_NAME_ramstage)
@printf " CC $(subst $(obj)/,,$(@))\n" @printf " CC $(subst $(obj)/,,$(@))\n"
ifeq ($(CONFIG_COMPILER_LLVM_CLANG),y) ifeq ($(CONFIG_COMPILER_LLVM_CLANG),y)
$(LD_ramstage) -m -m armelf_linux_eabi -r -o $@ --wrap __divdi3 --wrap __udivdi3 --wrap __moddi3 --wrap __umoddi3 --wrap __uidiv --start-group $(ramstage-objs) $(LIBGCC_FILE_NAME_ramstage) --end-group $(LD_ramstage) -m -m armelf_linux_eabi --gc-sections -r -o $@ --wrap __divdi3 --wrap __udivdi3 --wrap __moddi3 --wrap __umoddi3 --wrap __uidiv --start-group $(ramstage-objs) $(LIBGCC_FILE_NAME_ramstage) --end-group
else else
$(CC_ramstage) $(CFLAGS_ramstage) $(CPPFLAGS_ramstage) -nostdlib -r -o $@ -Wl,--start-group $(stages_o) $(ramstage-objs) $(LIBGCC_FILE_NAME_ramstage) -Wl,--end-group $(CC_ramstage) $(CFLAGS_ramstage) $(CPPFLAGS_ramstage) -nostdlib -Wl,--gc-sections -r -o $@ -Wl,--start-group $(stages_o) $(ramstage-objs) $(LIBGCC_FILE_NAME_ramstage) -Wl,--end-group
endif endif
endif # CONFIG_ARCH_RAMSTAGE_ARM endif # CONFIG_ARCH_RAMSTAGE_ARM

View File

@ -28,23 +28,25 @@ PHDRS
to_load PT_LOAD; to_load PT_LOAD;
} }
ENTRY(_start)
TARGET(binary) TARGET(binary)
SECTIONS SECTIONS
{ {
ROMLOC = CONFIG_BOOTBLOCK_BASE; . = CONFIG_BOOTBLOCK_BASE;
/* This section might be better named .setup */ .bootblock . : {
.rom ROMLOC : {
_rom = .;
*(.start); *(.start);
*(.id); KEEP(*(.id));
*(.text); *(.text);
*(.text.*); *(.text.*);
*(.rom.text); *(.rodata);
*(.rom.data);
*(.rom.data.*);
*(.rodata.*); *(.rodata.*);
_erom = .; *(.data);
*(.data.*);
*(.bss);
*(.bss.*);
*(.sbss);
*(.sbss.*);
} : to_load = 0xff } : to_load = 0xff
/DISCARD/ : { /DISCARD/ : {

View File

@ -48,7 +48,7 @@ SECTIONS
.ctors : { .ctors : {
. = ALIGN(0x100); . = ALIGN(0x100);
__CTOR_LIST__ = .; __CTOR_LIST__ = .;
*(.ctors); KEEP(*(.ctors));
LONG(0); LONG(0);
__CTOR_END__ = .; __CTOR_END__ = .;
} }
@ -57,13 +57,13 @@ SECTIONS
_rodata = .; _rodata = .;
. = ALIGN(4); . = ALIGN(4);
pci_drivers = . ; pci_drivers = . ;
*(.rodata.pci_driver) KEEP(*(.rodata.pci_driver));
epci_drivers = . ; epci_drivers = . ;
cpu_drivers = . ; cpu_drivers = . ;
*(.rodata.cpu_driver) KEEP(*(.rodata.cpu_driver));
ecpu_drivers = . ; ecpu_drivers = . ;
_bs_init_begin = .; _bs_init_begin = .;
*(.bs_init) KEEP(*(.bs_init));
_bs_init_end = .; _bs_init_end = .;
*(.rodata) *(.rodata)
*(.rodata.*) *(.rodata.*)
@ -83,6 +83,7 @@ SECTIONS
.data : { .data : {
_data = .; _data = .;
*(.data) *(.data)
*(.data.*)
_edata = .; _edata = .;
} }
@ -90,26 +91,27 @@ SECTIONS
* initialized on startup. (typically uninitialized global variables) * initialized on startup. (typically uninitialized global variables)
* crt0.S fills between _bss and _ebss with zeroes. * crt0.S fills between _bss and _ebss with zeroes.
*/ */
_bss = .;
.bss . : { .bss . : {
_bss = .;
*(.bss) *(.bss)
*(.bss.*)
*(.sbss) *(.sbss)
*(COMMON) *(.sbss.*)
}
_ebss = .; _ebss = .;
}
_end = .; _end = .;
/* coreboot really "ends" here. Only heap and stack are placed after /* coreboot really "ends" here. Only heap and stack are placed after
* this line. * this line.
*/ */
_heap = .;
.heap . : { .heap . : {
_heap = .;
/* Reserve CONFIG_HEAP_SIZE bytes for the heap */ /* Reserve CONFIG_HEAP_SIZE bytes for the heap */
. = CONFIG_HEAP_SIZE ; . = CONFIG_HEAP_SIZE ;
. = ALIGN(4); . = ALIGN(4);
}
_eheap = .; _eheap = .;
}
/* The ram segment. This includes all memory used by the memory /* The ram segment. This includes all memory used by the memory
* resident copy of coreboot, except the tables that are produced on * resident copy of coreboot, except the tables that are produced on

View File

@ -38,19 +38,19 @@ SECTIONS
. = CONFIG_ROMSTAGE_BASE; . = CONFIG_ROMSTAGE_BASE;
.romtext . : { .romtext . : {
_rom = .;
_start = .; _start = .;
*(.text.stage_entry.arm); *(.text.stage_entry.arm);
*(.text.startup); *(.text.startup);
*(.text); *(.text);
*(.text.*);
} : to_load } : to_load
.romdata . : { .romdata . : {
*(.rodata); *(.rodata);
*(.machine_param); *(.rodata.*);
*(.data); *(.data);
*(.data.*);
. = ALIGN(8); . = ALIGN(8);
_erom = .;
} }
/* bss does not contain data, it is just a space that should be zero /* bss does not contain data, it is just a space that should be zero
@ -61,11 +61,11 @@ SECTIONS
. = ALIGN(8); . = ALIGN(8);
_bss = .; _bss = .;
*(.bss) *(.bss)
*(.bss.*)
*(.sbss) *(.sbss)
*(COMMON) *(.sbss.*)
}
_ebss = .; _ebss = .;
}
_end = .; _end = .;

View File

@ -57,10 +57,7 @@ ARCHDIR-i386 := x86
ARCHDIR-x86_32 := x86 ARCHDIR-x86_32 := x86
ARCHDIR-arm := arm ARCHDIR-arm := arm
CFLAGS_arm += \ CFLAGS_arm := -mno-unaligned-access -ffunction-sections -fdata-sections
-mno-unaligned-access\
-mthumb\
-mthumb-interwork
toolchain_to_dir = \ toolchain_to_dir = \
$(foreach arch,$(ARCH_SUPPORTED),\ $(foreach arch,$(ARCH_SUPPORTED),\