]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[build] Eliminate unused sections at link-time
authorMichael Brown <mcb30@ipxe.org>
Tue, 22 Feb 2011 19:36:24 +0000 (19:36 +0000)
committerMichael Brown <mcb30@ipxe.org>
Tue, 22 Feb 2011 21:02:00 +0000 (21:02 +0000)
Use -ffunction-sections, -fdata-sections, and --gc-sections to
automatically prune out any unreferenced sections.

This saves around 744 bytes (uncompressed) from the rtl8139.rom build.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/Makefile.housekeeping
src/arch/i386/scripts/i386-kir.lds
src/arch/i386/scripts/i386.lds
src/arch/i386/scripts/linux.lds
src/arch/x86/scripts/efi.lds
src/arch/x86_64/scripts/linux.lds

index d18b65cc7bf10c9b42bb44a72405375badb206ad..c4350671afffc2d7c17ea0980bd57b0c49e3497e 100644 (file)
@@ -415,6 +415,19 @@ CFLAGS             += -finstrument-functions
 CFLAGS         += -finstrument-functions-exclude-file-list=core/fnrec.c
 endif
 
+# Enable per-item sections and section garbage collection.  Note that
+# some older versions of gcc support -fdata-sections but treat it as
+# implying -fno-common, which would break our build.
+#
+ifeq ($(CCTYPE),gcc)
+DS_TEST                = $(ECHO) 'char x;' | \
+                 $(CC) -fdata-sections -S -x c - -o - 2>/dev/null | \
+                 grep -E '\.comm' > /dev/null
+DS_FLAGS       := $(shell $(DS_TEST) && $(ECHO) '-fdata-sections')
+CFLAGS         += -ffunction-sections $(DS_FLAGS)
+endif
+LDFLAGS                += --gc-sections
+
 # compiler.h is needed for our linking and debugging system
 #
 CFLAGS         += -include compiler.h
index c19480f03016bb34749cb834859326a414e91803..620bc2fe37398ebf6b4ef6bd1ed8265ceb35b166 100644 (file)
@@ -68,7 +68,8 @@ SECTIONS {
 
     .text16 : AT ( _text16_load_offset + __text16 ) {
        __text16 = .;
-       *(.text.null_trap)
+       KEEP(*(.text.null_trap))
+       KEEP(*(.text.null_trap.*))
        *(.text16)
        *(.text16.*)
        *(.text)
@@ -97,7 +98,7 @@ SECTIONS {
        *(.data16.*)
        *(.data)
        *(.data.*)
-       *(SORT(.tbl.*))         /* Various tables.  See include/tables.h */
+       KEEP(*(SORT(.tbl.*)))   /* Various tables.  See include/tables.h */
        _edata16_progbits = .;
     }
     .bss16 : AT ( _data16_load_offset + __bss16 ) {
@@ -129,8 +130,11 @@ SECTIONS {
 
     /DISCARD/ : {
        *(.comment)
+       *(.comment.*)
        *(.note)
+       *(.note.*)
        *(.discard)
+       *(.discard.*)
     }
 
     /*
index 610bfa16bd9585934eb66a38e6e65e42e119dde8..c5bc631fa92473063d2191ad2e825c07620f8e54 100644 (file)
@@ -49,7 +49,8 @@ SECTIONS {
 
     .text16.early 0x0 : AT ( _text16_early_lma ) {
        _text16 = .;
-       *(.text16.null)
+       KEEP(*(.text16.null))
+       KEEP(*(.text16.null.*))
        . += 1;                         /* Prevent NULL being valid */
        *(.text16.early)
        *(.text16.early.*)
@@ -98,7 +99,8 @@ SECTIONS {
 
     .textdata 0x0 : AT ( _textdata_lma ) {
        _textdata = .;
-       *(.text.null_trap)
+       KEEP(*(.text.null_trap))
+       KEEP(*(.text.null_trap.*))
        . += 1;                         /* Prevent NULL being valid */
        *(.text)
        *(.text.*)
@@ -106,7 +108,7 @@ SECTIONS {
        *(.rodata.*)
        *(.data)
        *(.data.*)
-       *(SORT(.tbl.*))         /* Various tables.  See include/tables.h */
+       KEEP(*(SORT(.tbl.*)))   /* Various tables.  See include/tables.h */
        _mtextdata = .;
     } .bss.textdata (NOLOAD) : AT ( _end_lma ) {
        *(.bss)
@@ -126,8 +128,8 @@ SECTIONS {
 
     .zinfo 0x0 : AT ( _zinfo_lma ) {
        _zinfo = .;
-       *(.zinfo)
-       *(.zinfo.*)
+       KEEP(*(.zinfo))
+       KEEP(*(.zinfo.*))
        _mzinfo = .;
     } .bss.zinfo (NOLOAD) : AT ( _end_lma ) {
        _ezinfo = .;
@@ -143,6 +145,7 @@ SECTIONS {
     .weak 0x0 : AT ( _end_lma ) {
        _weak = .;
        *(.weak)
+       *(.weak.*)
        _eweak = .;
     }
     _assert = ASSERT ( ( _weak == _eweak ), ".weak is non-zero length" );
@@ -165,6 +168,7 @@ SECTIONS {
        *(.einfo)
        *(.einfo.*)
        *(.discard)
+       *(.discard.*)
     }
 
     /*
index 94b7b900e8e544c7472f58c8f21dc64f59b22320..654f68e3097a468dd525dbb8f203744b3854249b 100644 (file)
@@ -51,7 +51,7 @@ SECTIONS {
                _data = .;
                *(.data)
                *(.data.*)
-               *(SORT(.tbl.*))         /* Various tables.  See include/tables.h */
+               KEEP(*(SORT(.tbl.*)))
                _edata = .;
        }
 
@@ -77,6 +77,7 @@ SECTIONS {
        .weak 0x0 : {
                _weak = .;
                *(.weak)
+               *(.weak.*)
                _eweak = .;
        }
        _assert = ASSERT ( ( _weak == _eweak ), ".weak is non-zero length" );
@@ -97,5 +98,6 @@ SECTIONS {
                *(.rel)
                *(.rel.*)
                *(.discard)
+               *(.discard.*)
        }
 }
index d9963ef3b62f550a8eb6cebd1ed10976e1273338..1a16c29bd05f9bb7abfc71496e2d8b29963339d8 100644 (file)
@@ -54,7 +54,7 @@ SECTIONS {
        _data = .;
        *(.data)
        *(.data.*)
-       *(SORT(.tbl.*))         /* Various tables.  See include/tables.h */
+       KEEP(*(SORT(.tbl.*)))   /* Various tables.  See include/tables.h */
        _edata = .;
     }
 
@@ -80,6 +80,7 @@ SECTIONS {
     .weak 0x0 : {
        _weak = .;
        *(.weak)
+       *(.weak.*)
        _eweak = .;
     }
     _assert = ASSERT ( ( _weak == _eweak ), ".weak is non-zero length" );
@@ -102,5 +103,6 @@ SECTIONS {
        *(.einfo)
        *(.einfo.*)
        *(.discard)
+       *(.discard.*)
     }
 }
index 34eb3561b915fded5826062823ca8ef6e5402ab6..3bcd7aa1bca7f9f1f5880b6df40cc869e1303138 100644 (file)
@@ -51,7 +51,7 @@ SECTIONS {
                _data = .;
                *(.data)
                *(.data.*)
-               *(SORT(.tbl.*))         /* Various tables.  See include/tables.h */
+               KEEP(*(SORT(.tbl.*)))
                _edata = .;
        }
 
@@ -77,6 +77,7 @@ SECTIONS {
        .weak 0x0 : {
                _weak = .;
                *(.weak)
+               *(.weak.*)
                _eweak = .;
        }
        _assert = ASSERT ( ( _weak == _eweak ), ".weak is non-zero length" );
@@ -97,5 +98,6 @@ SECTIONS {
                *(.rel)
                *(.rel.*)
                *(.discard)
+               *(.discard.*)
        }
 }