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:
parent
08539b3b98
commit
c505837e67
|
@ -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
|
||||||
|
|
|
@ -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/ : {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 = .;
|
||||||
|
|
||||||
|
|
|
@ -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),\
|
||||||
|
|
Loading…
Reference in New Issue