coreboot: x86: enable gc-sections

Garbage collected sections allow for trimming the size of the
binaries as well as allowing for not needing to config off
unused functions. To that end, on a rambi build the following
differences are observed:

$ diff -up \
	<(readelf -l coreboot-builds/google_rambi/cbfs/fallback/ramstage.elf) \
	<(readelf -l coreboot-builds/google_rambi_gc_sections/cbfs/fallback/ramstage.elf)
--- /dev/fd/63  2015-03-10 12:07:27.927985430 -0500
+++ /dev/fd/62  2015-03-10 12:07:27.927985430 -0500
@@ -6,9 +6,9 @@ There are 4 program headers, starting at
 Program Headers:
   Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg
Align
   LOAD           0x001000 0x00000000 0x00000000 0x00040 0x00040 RWE 0
-  LOAD           0x001040 0x00000040 0x00000040 0x34560 0x34560 RWE 0
-  LOAD           0x0355a0 0x000345a0 0x000345a0 0x02578 0x02578 RWE 0
-  LOAD           0x037b18 0x00036b18 0x00036b18 0x00000 0x0b560     0
+  LOAD           0x001040 0x00000040 0x00000040 0x2cbf8 0x2cbf8 RWE 0
+  LOAD           0x02dc38 0x0002cc38 0x0002cc38 0x02208 0x02208 RWE 0
+  LOAD           0x02fe40 0x0002ee40 0x0002ee40 0x00000 0x0a888     0

  Section to Segment mapping:
   Segment Sections...

$ diff -up \
	<(readelf -l coreboot-builds/google_rambi/cbfs/fallback/romstage.elf) \
	<(readelf -l coreboot-builds/google_rambi_gc_sections/cbfs/fallback/romstage.elf)
--- /dev/fd/63  2015-03-10 12:08:16.855985880 -0500
+++ /dev/fd/62  2015-03-10 12:08:16.851985880 -0500
@@ -5,8 +5,8 @@ There are 1 program headers, starting at

 Program Headers:
   Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg
Align
-  LOAD           0x000060 0xfff20000 0xfff20000 0x08b81 0x08b81 R E
   0x10
+  LOAD           0x000060 0xfff20000 0xfff20000 0x06300 0x06300 R E
0x10

  Section to Segment mapping:
   Segment Sections...
-   00     .rom .text
+   00     .rom

The following warnings needed to be applied to CFLAGS_common because for
some reason gcc was miraculously emitting the warnings with the
unrelated *-sections options:
  -Wno-unused-but-set-variable

Change-Id: I210784fdfc273ce4cb9927352cbd5a51be3c6929
Signed-off-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-on: http://review.coreboot.org/8635
Tested-by: build bot (Jenkins)
Reviewed-by: Patrick Georgi <pgeorgi@google.com>
Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
This commit is contained in:
Aaron Durbin 2015-03-10 11:45:25 -05:00 committed by Aaron Durbin
parent 5179419989
commit f69a99dbf8
7 changed files with 24 additions and 18 deletions

View File

@ -253,7 +253,7 @@ CPPFLAGS_common += -include $(src)/include/kconfig.h
CFLAGS_common += -pipe -g -nostdinc
CFLAGS_common += -nostdlib -Wall -Wundef -Wstrict-prototypes -Wmissing-prototypes
CFLAGS_common += -Wwrite-strings -Wredundant-decls -Wno-trigraphs
CFLAGS_common += -Wstrict-aliasing -Wshadow
CFLAGS_common += -Wstrict-aliasing -Wshadow -Wno-unused-but-set-variable
ifeq ($(CONFIG_WARNINGS_ARE_ERRORS),y)
CFLAGS_common += -Werror
endif

View File

@ -27,11 +27,7 @@ subdirs-y += boot
subdirs-y += lib
subdirs-y += smp
ifeq ($(CONFIG_COMPILER_GCC),y)
DISASSEMBLY=-Wa,-acdlns
else
DISASSEMBLY=-Wa,--divide
endif
OPTION_TABLE_H:=
ifeq ($(CONFIG_HAVE_OPTION_TABLE),y)
@ -214,7 +210,7 @@ $(objcbfs)/romstage_null.debug: $$(romstage-objs) $(objgenerated)/romstage_null.
$(objcbfs)/romstage.debug: $$(romstage-objs) $(objgenerated)/romstage.ld $$(romstage-libs)
@printf " LINK $(subst $(obj)/,,$(@))\n"
$(LD_romstage) -nostdlib -nostartfiles -static -o $@ -L$(obj) $(COMPILER_RT_FLAGS_romstage) --start-group $(romstage-objs) $(romstage-libs) $(COMPILER_RT_romstage) --end-group -T $(objgenerated)/romstage.ld
$(LD_romstage) --gc-sections -nostdlib -nostartfiles -static -o $@ -L$(obj) $(COMPILER_RT_FLAGS_romstage) --start-group $(romstage-objs) $(romstage-libs) $(COMPILER_RT_romstage) --end-group -T $(objgenerated)/romstage.ld
$(objgenerated)/romstage_null.ld: $$(ldscripts) $(obj)/ldoptions
@printf " GEN $(subst $(obj)/,,$(@))\n"
@ -310,7 +306,7 @@ else
$(objcbfs)/ramstage.debug: $(objgenerated)/ramstage.o $(src)/arch/x86/ramstage.ld
@printf " CC $(subst $(obj)/,,$(@))\n"
$(LD_ramstage) -o $@ -L$(obj) $< -T $(src)/arch/x86/ramstage.ld
$(LD_ramstage) --gc-sections -o $@ -L$(obj) $< -T $(src)/arch/x86/ramstage.ld
endif

View File

@ -30,13 +30,16 @@ SECTIONS
.rom . : {
_rom = .;
*(.rom.text);
*(.rom.text.*);
*(.text);
*(.text.*);
*(.rom.data);
*(.rodata);
*(.rodata.*);
*(.rom.data.*);
. = ALIGN(16);
_car_migrate_start = .;
*(.car.migrate);
KEEP(*(.car.migrate));
LONG(0);
_car_migrate_end = .;
. = ALIGN(16);
@ -73,7 +76,7 @@ SECTIONS
. = 0xffffff00;
.illegal_globals . : {
*(EXCLUDE_FILE (*/libagesa.*.a: */buildOpts.romstage.o */agesawrapper.romstage.o */vendorcode/amd/agesa/* */vendorcode/amd/cimx/*) .data)
*(.data.*)
*(EXCLUDE_FILE (*/libagesa.*.a: */buildOpts.romstage.o */agesawrapper.romstage.o */vendorcode/amd/agesa/* */vendorcode/amd/cimx/*) .data.*)
*(.bss)
*(.bss.*)
*(.sbss)

View File

@ -42,7 +42,7 @@ SECTIONS
.ctors : {
. = ALIGN(0x100);
__CTOR_LIST__ = .;
*(.ctors);
KEEP(*(.ctors));
LONG(0);
__CTOR_END__ = .;
}
@ -55,13 +55,13 @@ SECTIONS
* section names the equivalent changes need to made to
* rmodule.ld. */
pci_drivers = . ;
*(.rodata.pci_driver)
KEEP(*(.rodata.pci_driver));
epci_drivers = . ;
cpu_drivers = . ;
*(.rodata.cpu_driver)
KEEP(*(.rodata.cpu_driver));
ecpu_drivers = . ;
_bs_init_begin = .;
*(.bs_init)
KEEP(*(.bs_init));
_bs_init_end = .;
*(.rodata)
@ -82,6 +82,7 @@ SECTIONS
.data : {
_data = .;
*(.data)
*(.data.*)
_edata = .;
}
@ -92,7 +93,9 @@ SECTIONS
_bss = .;
.bss . : {
*(.bss)
*(.bss.*)
*(.sbss)
*(.sbss.*)
*(COMMON)
}
_ebss = .;

View File

@ -119,7 +119,7 @@ ramstage-y += rmodule.c
romstage-$(CONFIG_RELOCATABLE_RAMSTAGE) += rmodule.c
RMODULE_LDSCRIPT := $(src)/lib/rmodule.ld
RMODULE_LDFLAGS := -nostartfiles --emit-relocs -z defs -Bsymbolic -T$(RMODULE_LDSCRIPT)
RMODULE_LDFLAGS := -nostartfiles --gc-sections --emit-relocs -z defs -Bsymbolic -T$(RMODULE_LDSCRIPT)
# rmodule_link_rules is a function that should be called with:
# (1) the object name to link

View File

@ -14,6 +14,8 @@
BASE_ADDRESS = 0x00000;
ENTRY(__rmodule_entry);
SECTIONS
{
. = BASE_ADDRESS;
@ -38,15 +40,15 @@ SECTIONS
* ramstage.ld should be made here as well. */
. = ALIGN(8);
pci_drivers = . ;
*(.rodata.pci_driver)
KEEP(*(.rodata.pci_driver));
epci_drivers = . ;
. = ALIGN(8);
cpu_drivers = . ;
*(.rodata.cpu_driver)
KEEP(*(.rodata.cpu_driver));
ecpu_drivers = . ;
. = ALIGN(8);
_bs_init_begin = .;
*(.bs_init)
KEEP(*(.bs_init));
_bs_init_end = .;
. = ALIGN(8);
@ -59,7 +61,7 @@ SECTIONS
* to a module, however there has to be an prior agreement
* on how to interpret the parameters. */
_module_params_begin = .;
*(.module_parameters);
KEEP(*(.module_parameters));
_module_params_end = .;
. = ALIGN(8);

View File

@ -66,6 +66,8 @@ CFLAGS_arm64 := -ffunction-sections -fdata-sections
CFLAGS_mipsel := -mips32r2 -G 0
CFLAGS_x86_32 := -ffunction-sections -fdata-sections
toolchain_to_dir = \
$(foreach arch,$(ARCH_SUPPORTED),\
$(eval CPPFLAGS_$(arch) += \