aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/Makefile.housekeeping13
-rw-r--r--src/arch/i386/scripts/i386-kir.lds8
-rw-r--r--src/arch/i386/scripts/i386.lds14
-rw-r--r--src/arch/i386/scripts/linux.lds4
-rw-r--r--src/arch/x86/scripts/efi.lds4
-rw-r--r--src/arch/x86_64/scripts/linux.lds4
6 files changed, 37 insertions, 10 deletions
diff --git a/src/Makefile.housekeeping b/src/Makefile.housekeeping
index d18b65cc7..c4350671a 100644
--- a/src/Makefile.housekeeping
+++ b/src/Makefile.housekeeping
@@ -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
diff --git a/src/arch/i386/scripts/i386-kir.lds b/src/arch/i386/scripts/i386-kir.lds
index c19480f03..620bc2fe3 100644
--- a/src/arch/i386/scripts/i386-kir.lds
+++ b/src/arch/i386/scripts/i386-kir.lds
@@ -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.*)
}
/*
diff --git a/src/arch/i386/scripts/i386.lds b/src/arch/i386/scripts/i386.lds
index 610bfa16b..c5bc631fa 100644
--- a/src/arch/i386/scripts/i386.lds
+++ b/src/arch/i386/scripts/i386.lds
@@ -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.*)
}
/*
diff --git a/src/arch/i386/scripts/linux.lds b/src/arch/i386/scripts/linux.lds
index 94b7b900e..654f68e30 100644
--- a/src/arch/i386/scripts/linux.lds
+++ b/src/arch/i386/scripts/linux.lds
@@ -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.*)
}
}
diff --git a/src/arch/x86/scripts/efi.lds b/src/arch/x86/scripts/efi.lds
index d9963ef3b..1a16c29bd 100644
--- a/src/arch/x86/scripts/efi.lds
+++ b/src/arch/x86/scripts/efi.lds
@@ -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.*)
}
}
diff --git a/src/arch/x86_64/scripts/linux.lds b/src/arch/x86_64/scripts/linux.lds
index 34eb3561b..3bcd7aa1b 100644
--- a/src/arch/x86_64/scripts/linux.lds
+++ b/src/arch/x86_64/scripts/linux.lds
@@ -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.*)
}
}