kernel/generic: fix the arm gc-sections patch
authorRui Salvaterra <rsalvaterra@gmail.com>
Fri, 23 Jul 2021 12:34:49 +0000 (13:34 +0100)
committerHauke Mehrtens <hauke@hauke-m.de>
Sun, 25 Jul 2021 11:52:34 +0000 (13:52 +0200)
Latest binutils (2.37) exposed a long-standing bug. The kernel linking stage
would break at the SORTTAB step, due to the exception table having been
previously purged from vmlinux, as its section wasn't marked as unconditionally
kept. Fix thusly.

Additionally, the "#define ARM_MMU_DISCARD(x) KEEP(x)" change is bogus. It
would only apply to !CONFIG_MMU devices (which we don't support in OpenWrt), and
it would even break the build if referenced. Drop it.

While at it, rename the patch in order to make it obvious that it's
arm-specific.

Signed-off-by: Rui Salvaterra <rsalvaterra@gmail.com>
[Add same changes for kernel 5.4 too]
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
target/linux/generic/hack-5.10/220-arm-gc_sections.patch [new file with mode: 0644]
target/linux/generic/hack-5.10/220-gc_sections.patch [deleted file]
target/linux/generic/hack-5.4/220-arm-gc_sections.patch [new file with mode: 0644]
target/linux/generic/hack-5.4/220-gc_sections.patch [deleted file]

diff --git a/target/linux/generic/hack-5.10/220-arm-gc_sections.patch b/target/linux/generic/hack-5.10/220-arm-gc_sections.patch
new file mode 100644 (file)
index 0000000..3b67eea
--- /dev/null
@@ -0,0 +1,122 @@
+From e3d8676f5722b7622685581e06e8f53e6138e3ab Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@nbd.name>
+Date: Sat, 15 Jul 2017 23:42:36 +0200
+Subject: use -ffunction-sections, -fdata-sections and --gc-sections
+
+In combination with kernel symbol export stripping this significantly reduces
+the kernel image size. Used on both ARM and MIPS architectures.
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+Signed-off-by: Jonas Gorski <jogo@openwrt.org>
+Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+---
+--- a/arch/arm/Kconfig
++++ b/arch/arm/Kconfig
+@@ -113,6 +113,7 @@ config ARM
+       select HAVE_UID16
+       select HAVE_VIRT_CPU_ACCOUNTING_GEN
+       select IRQ_FORCED_THREADING
++      select HAVE_LD_DEAD_CODE_DATA_ELIMINATION
+       select MODULES_USE_ELF_REL
+       select NEED_DMA_MAP_STATE
+       select OF_EARLY_FLATTREE if OF
+--- a/arch/arm/boot/compressed/Makefile
++++ b/arch/arm/boot/compressed/Makefile
+@@ -98,6 +98,7 @@ $(foreach o, $(libfdt_objs) atags_to_fdt
+ ifdef building_out_of_srctree
+ $(shell rm -f $(addprefix $(obj)/, fdt_rw.c fdt_ro.c fdt_wip.c fdt.c))
+ endif
++KBUILD_CFLAGS_KERNEL := $(patsubst -f%-sections,,$(KBUILD_CFLAGS_KERNEL))
+ targets       := vmlinux vmlinux.lds piggy_data piggy.o \
+                lib1funcs.o ashldi3.o bswapsdi2.o \
+--- a/arch/arm/kernel/vmlinux.lds.S
++++ b/arch/arm/kernel/vmlinux.lds.S
+@@ -75,7 +75,7 @@ SECTIONS
+       . = ALIGN(4);
+       __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) {
+               __start___ex_table = .;
+-              ARM_MMU_KEEP(*(__ex_table))
++              KEEP(*(__ex_table))
+               __stop___ex_table = .;
+       }
+@@ -100,24 +100,24 @@ SECTIONS
+       }
+       .init.arch.info : {
+               __arch_info_begin = .;
+-              *(.arch.info.init)
++              KEEP(*(.arch.info.init))
+               __arch_info_end = .;
+       }
+       .init.tagtable : {
+               __tagtable_begin = .;
+-              *(.taglist.init)
++              KEEP(*(.taglist.init))
+               __tagtable_end = .;
+       }
+ #ifdef CONFIG_SMP_ON_UP
+       .init.smpalt : {
+               __smpalt_begin = .;
+-              *(.alt.smp.init)
++              KEEP(*(.alt.smp.init))
+               __smpalt_end = .;
+       }
+ #endif
+       .init.pv_table : {
+               __pv_table_begin = .;
+-              *(.pv_table)
++              KEEP(*(.pv_table))
+               __pv_table_end = .;
+       }
+--- a/arch/arm/include/asm/vmlinux.lds.h
++++ b/arch/arm/include/asm/vmlinux.lds.h
+@@ -29,13 +29,13 @@
+ #define PROC_INFO                                                     \
+               . = ALIGN(4);                                           \
+               __proc_info_begin = .;                                  \
+-              *(.proc.info.init)                                      \
++              KEEP(*(.proc.info.init))                                \
+               __proc_info_end = .;
+ #define IDMAP_TEXT                                                    \
+               ALIGN_FUNCTION();                                       \
+               __idmap_text_start = .;                                 \
+-              *(.idmap.text)                                          \
++              KEEP(*(.idmap.text))                                    \
+               __idmap_text_end = .;                                   \
+ #define ARM_DISCARD                                                   \
+@@ -96,12 +96,12 @@
+       . = ALIGN(8);                                                   \
+       .ARM.unwind_idx : {                                             \
+               __start_unwind_idx = .;                                 \
+-              *(.ARM.exidx*)                                          \
++              KEEP(*(.ARM.exidx*))                                    \
+               __stop_unwind_idx = .;                                  \
+       }                                                               \
+       .ARM.unwind_tab : {                                             \
+               __start_unwind_tab = .;                                 \
+-              *(.ARM.extab*)                                          \
++              KEEP(*(.ARM.extab*))                                    \
+               __stop_unwind_tab = .;                                  \
+       }
+@@ -112,14 +112,14 @@
+ #define ARM_VECTORS                                                   \
+       __vectors_start = .;                                            \
+       .vectors 0xffff0000 : AT(__vectors_start) {                     \
+-              *(.vectors)                                             \
++              KEEP(*(.vectors))                                       \
+       }                                                               \
+       . = __vectors_start + SIZEOF(.vectors);                         \
+       __vectors_end = .;                                              \
+                                                                       \
+       __stubs_start = .;                                              \
+       .stubs ADDR(.vectors) + 0x1000 : AT(__stubs_start) {            \
+-              *(.stubs)                                               \
++              KEEP(*(.stubs))                                         \
+       }                                                               \
+       . = __stubs_start + SIZEOF(.stubs);                             \
+       __stubs_end = .;                                                \
diff --git a/target/linux/generic/hack-5.10/220-gc_sections.patch b/target/linux/generic/hack-5.10/220-gc_sections.patch
deleted file mode 100644 (file)
index 810c5ae..0000000
+++ /dev/null
@@ -1,120 +0,0 @@
-From e3d8676f5722b7622685581e06e8f53e6138e3ab Mon Sep 17 00:00:00 2001
-From: Felix Fietkau <nbd@nbd.name>
-Date: Sat, 15 Jul 2017 23:42:36 +0200
-Subject: use -ffunction-sections, -fdata-sections and --gc-sections
-
-In combination with kernel symbol export stripping this significantly reduces
-the kernel image size. Used on both ARM and MIPS architectures.
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
-Signed-off-by: Jonas Gorski <jogo@openwrt.org>
-Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
----
---- a/arch/arm/Kconfig
-+++ b/arch/arm/Kconfig
-@@ -113,6 +113,7 @@ config ARM
-       select HAVE_UID16
-       select HAVE_VIRT_CPU_ACCOUNTING_GEN
-       select IRQ_FORCED_THREADING
-+      select HAVE_LD_DEAD_CODE_DATA_ELIMINATION
-       select MODULES_USE_ELF_REL
-       select NEED_DMA_MAP_STATE
-       select OF_EARLY_FLATTREE if OF
---- a/arch/arm/boot/compressed/Makefile
-+++ b/arch/arm/boot/compressed/Makefile
-@@ -98,6 +98,7 @@ $(foreach o, $(libfdt_objs) atags_to_fdt
- ifdef building_out_of_srctree
- $(shell rm -f $(addprefix $(obj)/, fdt_rw.c fdt_ro.c fdt_wip.c fdt.c))
- endif
-+KBUILD_CFLAGS_KERNEL := $(patsubst -f%-sections,,$(KBUILD_CFLAGS_KERNEL))
- targets       := vmlinux vmlinux.lds piggy_data piggy.o \
-                lib1funcs.o ashldi3.o bswapsdi2.o \
---- a/arch/arm/kernel/vmlinux.lds.S
-+++ b/arch/arm/kernel/vmlinux.lds.S
-@@ -100,24 +100,24 @@ SECTIONS
-       }
-       .init.arch.info : {
-               __arch_info_begin = .;
--              *(.arch.info.init)
-+              KEEP(*(.arch.info.init))
-               __arch_info_end = .;
-       }
-       .init.tagtable : {
-               __tagtable_begin = .;
--              *(.taglist.init)
-+              KEEP(*(.taglist.init))
-               __tagtable_end = .;
-       }
- #ifdef CONFIG_SMP_ON_UP
-       .init.smpalt : {
-               __smpalt_begin = .;
--              *(.alt.smp.init)
-+              KEEP(*(.alt.smp.init))
-               __smpalt_end = .;
-       }
- #endif
-       .init.pv_table : {
-               __pv_table_begin = .;
--              *(.pv_table)
-+              KEEP(*(.pv_table))
-               __pv_table_end = .;
-       }
---- a/arch/arm/include/asm/vmlinux.lds.h
-+++ b/arch/arm/include/asm/vmlinux.lds.h
-@@ -23,19 +23,19 @@
- #define ARM_MMU_DISCARD(x)
- #else
- #define ARM_MMU_KEEP(x)
--#define ARM_MMU_DISCARD(x)    x
-+#define ARM_MMU_DISCARD(x)    KEEP(x)
- #endif
- #define PROC_INFO                                                     \
-               . = ALIGN(4);                                           \
-               __proc_info_begin = .;                                  \
--              *(.proc.info.init)                                      \
-+              KEEP(*(.proc.info.init))                                \
-               __proc_info_end = .;
- #define IDMAP_TEXT                                                    \
-               ALIGN_FUNCTION();                                       \
-               __idmap_text_start = .;                                 \
--              *(.idmap.text)                                          \
-+              KEEP(*(.idmap.text))                                    \
-               __idmap_text_end = .;                                   \
- #define ARM_DISCARD                                                   \
-@@ -96,12 +96,12 @@
-       . = ALIGN(8);                                                   \
-       .ARM.unwind_idx : {                                             \
-               __start_unwind_idx = .;                                 \
--              *(.ARM.exidx*)                                          \
-+              KEEP(*(.ARM.exidx*))                                    \
-               __stop_unwind_idx = .;                                  \
-       }                                                               \
-       .ARM.unwind_tab : {                                             \
-               __start_unwind_tab = .;                                 \
--              *(.ARM.extab*)                                          \
-+              KEEP(*(.ARM.extab*))                                    \
-               __stop_unwind_tab = .;                                  \
-       }
-@@ -112,14 +112,14 @@
- #define ARM_VECTORS                                                   \
-       __vectors_start = .;                                            \
-       .vectors 0xffff0000 : AT(__vectors_start) {                     \
--              *(.vectors)                                             \
-+              KEEP(*(.vectors))                                       \
-       }                                                               \
-       . = __vectors_start + SIZEOF(.vectors);                         \
-       __vectors_end = .;                                              \
-                                                                       \
-       __stubs_start = .;                                              \
-       .stubs ADDR(.vectors) + 0x1000 : AT(__stubs_start) {            \
--              *(.stubs)                                               \
-+              KEEP(*(.stubs))                                         \
-       }                                                               \
-       . = __stubs_start + SIZEOF(.stubs);                             \
-       __stubs_end = .;                                                \
diff --git a/target/linux/generic/hack-5.4/220-arm-gc_sections.patch b/target/linux/generic/hack-5.4/220-arm-gc_sections.patch
new file mode 100644 (file)
index 0000000..c7c9851
--- /dev/null
@@ -0,0 +1,138 @@
+From e3d8676f5722b7622685581e06e8f53e6138e3ab Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@nbd.name>
+Date: Sat, 15 Jul 2017 23:42:36 +0200
+Subject: use -ffunction-sections, -fdata-sections and --gc-sections
+
+In combination with kernel symbol export stripping this significantly reduces
+the kernel image size. Used on both ARM and MIPS architectures.
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+Signed-off-by: Jonas Gorski <jogo@openwrt.org>
+Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+---
+ Makefile                          | 10 +++----
+ arch/arm/Kconfig                  |  1 +
+ arch/arm/boot/compressed/Makefile |  1 +
+ arch/arm/kernel/vmlinux.lds.S     | 26 ++++++++--------
+ arch/mips/Kconfig                 |  1 +
+ arch/mips/kernel/vmlinux.lds.S    |  4 +--
+ include/asm-generic/vmlinux.lds.h | 63 ++++++++++++++++++++-------------------
+ 7 files changed, 55 insertions(+), 51 deletions(-)
+
+--- a/arch/arm/Kconfig
++++ b/arch/arm/Kconfig
+@@ -111,6 +111,7 @@ config ARM
+       select HAVE_UID16
+       select HAVE_VIRT_CPU_ACCOUNTING_GEN
+       select IRQ_FORCED_THREADING
++      select HAVE_LD_DEAD_CODE_DATA_ELIMINATION
+       select MODULES_USE_ELF_REL
+       select NEED_DMA_MAP_STATE
+       select OF_EARLY_FLATTREE if OF
+--- a/arch/arm/boot/compressed/Makefile
++++ b/arch/arm/boot/compressed/Makefile
+@@ -106,6 +106,7 @@ ifeq ($(CONFIG_FUNCTION_TRACER),y)
+ ORIG_CFLAGS := $(KBUILD_CFLAGS)
+ KBUILD_CFLAGS = $(subst -pg, , $(ORIG_CFLAGS))
+ endif
++KBUILD_CFLAGS_KERNEL := $(patsubst -f%-sections,,$(KBUILD_CFLAGS_KERNEL))
+ # -fstack-protector-strong triggers protection checks in this code,
+ # but it is being used too early to link to meaningful stack_chk logic.
+--- a/arch/arm/kernel/vmlinux.lds.S
++++ b/arch/arm/kernel/vmlinux.lds.S
+@@ -73,7 +73,7 @@ SECTIONS
+       . = ALIGN(4);
+       __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) {
+               __start___ex_table = .;
+-              ARM_MMU_KEEP(*(__ex_table))
++              KEEP(*(__ex_table))
+               __stop___ex_table = .;
+       }
+@@ -100,24 +100,24 @@ SECTIONS
+       }
+       .init.arch.info : {
+               __arch_info_begin = .;
+-              *(.arch.info.init)
++              KEEP(*(.arch.info.init))
+               __arch_info_end = .;
+       }
+       .init.tagtable : {
+               __tagtable_begin = .;
+-              *(.taglist.init)
++              KEEP(*(.taglist.init))
+               __tagtable_end = .;
+       }
+ #ifdef CONFIG_SMP_ON_UP
+       .init.smpalt : {
+               __smpalt_begin = .;
+-              *(.alt.smp.init)
++              KEEP(*(.alt.smp.init))
+               __smpalt_end = .;
+       }
+ #endif
+       .init.pv_table : {
+               __pv_table_begin = .;
+-              *(.pv_table)
++              KEEP(*(.pv_table))
+               __pv_table_end = .;
+       }
+--- a/arch/arm/kernel/vmlinux.lds.h
++++ b/arch/arm/kernel/vmlinux.lds.h
+@@ -28,7 +28,7 @@
+ #define PROC_INFO                                                     \
+               . = ALIGN(4);                                           \
+               __proc_info_begin = .;                                  \
+-              *(.proc.info.init)                                      \
++              KEEP(*(.proc.info.init))                                \
+               __proc_info_end = .;
+ #define HYPERVISOR_TEXT                                                       \
+@@ -39,11 +39,11 @@
+ #define IDMAP_TEXT                                                    \
+               ALIGN_FUNCTION();                                       \
+               __idmap_text_start = .;                                 \
+-              *(.idmap.text)                                          \
++              KEEP(*(.idmap.text))                                    \
+               __idmap_text_end = .;                                   \
+               . = ALIGN(PAGE_SIZE);                                   \
+               __hyp_idmap_text_start = .;                             \
+-              *(.hyp.idmap.text)                                      \
++              KEEP(*(.hyp.idmap.text))                                \
+               __hyp_idmap_text_end = .;
+ #define ARM_DISCARD                                                   \
+@@ -86,12 +86,12 @@
+       . = ALIGN(8);                                                   \
+       .ARM.unwind_idx : {                                             \
+               __start_unwind_idx = .;                                 \
+-              *(.ARM.exidx*)                                          \
++              KEEP(*(.ARM.exidx*))                                    \
+               __stop_unwind_idx = .;                                  \
+       }                                                               \
+       .ARM.unwind_tab : {                                             \
+               __start_unwind_tab = .;                                 \
+-              *(.ARM.extab*)                                          \
++              KEEP(*(.ARM.extab*))                                    \
+               __stop_unwind_tab = .;                                  \
+       }
+@@ -102,14 +102,14 @@
+ #define ARM_VECTORS                                                   \
+       __vectors_start = .;                                            \
+       .vectors 0xffff0000 : AT(__vectors_start) {                     \
+-              *(.vectors)                                             \
++              KEEP(*(.vectors))                                       \
+       }                                                               \
+       . = __vectors_start + SIZEOF(.vectors);                         \
+       __vectors_end = .;                                              \
+                                                                       \
+       __stubs_start = .;                                              \
+       .stubs ADDR(.vectors) + 0x1000 : AT(__stubs_start) {            \
+-              *(.stubs)                                               \
++              KEEP(*(.stubs))                                         \
+       }                                                               \
+       . = __stubs_start + SIZEOF(.stubs);                             \
+       __stubs_end = .;                                                \
diff --git a/target/linux/generic/hack-5.4/220-gc_sections.patch b/target/linux/generic/hack-5.4/220-gc_sections.patch
deleted file mode 100644 (file)
index 22276d4..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-From e3d8676f5722b7622685581e06e8f53e6138e3ab Mon Sep 17 00:00:00 2001
-From: Felix Fietkau <nbd@nbd.name>
-Date: Sat, 15 Jul 2017 23:42:36 +0200
-Subject: use -ffunction-sections, -fdata-sections and --gc-sections
-
-In combination with kernel symbol export stripping this significantly reduces
-the kernel image size. Used on both ARM and MIPS architectures.
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
-Signed-off-by: Jonas Gorski <jogo@openwrt.org>
-Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
----
- Makefile                          | 10 +++----
- arch/arm/Kconfig                  |  1 +
- arch/arm/boot/compressed/Makefile |  1 +
- arch/arm/kernel/vmlinux.lds.S     | 26 ++++++++--------
- arch/mips/Kconfig                 |  1 +
- arch/mips/kernel/vmlinux.lds.S    |  4 +--
- include/asm-generic/vmlinux.lds.h | 63 ++++++++++++++++++++-------------------
- 7 files changed, 55 insertions(+), 51 deletions(-)
-
---- a/arch/arm/Kconfig
-+++ b/arch/arm/Kconfig
-@@ -111,6 +111,7 @@ config ARM
-       select HAVE_UID16
-       select HAVE_VIRT_CPU_ACCOUNTING_GEN
-       select IRQ_FORCED_THREADING
-+      select HAVE_LD_DEAD_CODE_DATA_ELIMINATION
-       select MODULES_USE_ELF_REL
-       select NEED_DMA_MAP_STATE
-       select OF_EARLY_FLATTREE if OF
---- a/arch/arm/boot/compressed/Makefile
-+++ b/arch/arm/boot/compressed/Makefile
-@@ -106,6 +106,7 @@ ifeq ($(CONFIG_FUNCTION_TRACER),y)
- ORIG_CFLAGS := $(KBUILD_CFLAGS)
- KBUILD_CFLAGS = $(subst -pg, , $(ORIG_CFLAGS))
- endif
-+KBUILD_CFLAGS_KERNEL := $(patsubst -f%-sections,,$(KBUILD_CFLAGS_KERNEL))
- # -fstack-protector-strong triggers protection checks in this code,
- # but it is being used too early to link to meaningful stack_chk logic.
---- a/arch/arm/kernel/vmlinux.lds.S
-+++ b/arch/arm/kernel/vmlinux.lds.S
-@@ -100,24 +100,24 @@ SECTIONS
-       }
-       .init.arch.info : {
-               __arch_info_begin = .;
--              *(.arch.info.init)
-+              KEEP(*(.arch.info.init))
-               __arch_info_end = .;
-       }
-       .init.tagtable : {
-               __tagtable_begin = .;
--              *(.taglist.init)
-+              KEEP(*(.taglist.init))
-               __tagtable_end = .;
-       }
- #ifdef CONFIG_SMP_ON_UP
-       .init.smpalt : {
-               __smpalt_begin = .;
--              *(.alt.smp.init)
-+              KEEP(*(.alt.smp.init))
-               __smpalt_end = .;
-       }
- #endif
-       .init.pv_table : {
-               __pv_table_begin = .;
--              *(.pv_table)
-+              KEEP(*(.pv_table))
-               __pv_table_end = .;
-       }
---- a/arch/arm/kernel/vmlinux.lds.h
-+++ b/arch/arm/kernel/vmlinux.lds.h
-@@ -22,13 +22,13 @@
- #define ARM_MMU_DISCARD(x)
- #else
- #define ARM_MMU_KEEP(x)
--#define ARM_MMU_DISCARD(x)    x
-+#define ARM_MMU_DISCARD(x)    KEEP(x)
- #endif
- #define PROC_INFO                                                     \
-               . = ALIGN(4);                                           \
-               __proc_info_begin = .;                                  \
--              *(.proc.info.init)                                      \
-+              KEEP(*(.proc.info.init))                                \
-               __proc_info_end = .;
- #define HYPERVISOR_TEXT                                                       \
-@@ -39,11 +39,11 @@
- #define IDMAP_TEXT                                                    \
-               ALIGN_FUNCTION();                                       \
-               __idmap_text_start = .;                                 \
--              *(.idmap.text)                                          \
-+              KEEP(*(.idmap.text))                                    \
-               __idmap_text_end = .;                                   \
-               . = ALIGN(PAGE_SIZE);                                   \
-               __hyp_idmap_text_start = .;                             \
--              *(.hyp.idmap.text)                                      \
-+              KEEP(*(.hyp.idmap.text))                                \
-               __hyp_idmap_text_end = .;
- #define ARM_DISCARD                                                   \
-@@ -86,12 +86,12 @@
-       . = ALIGN(8);                                                   \
-       .ARM.unwind_idx : {                                             \
-               __start_unwind_idx = .;                                 \
--              *(.ARM.exidx*)                                          \
-+              KEEP(*(.ARM.exidx*))                                    \
-               __stop_unwind_idx = .;                                  \
-       }                                                               \
-       .ARM.unwind_tab : {                                             \
-               __start_unwind_tab = .;                                 \
--              *(.ARM.extab*)                                          \
-+              KEEP(*(.ARM.extab*))                                    \
-               __stop_unwind_tab = .;                                  \
-       }
-@@ -102,14 +102,14 @@
- #define ARM_VECTORS                                                   \
-       __vectors_start = .;                                            \
-       .vectors 0xffff0000 : AT(__vectors_start) {                     \
--              *(.vectors)                                             \
-+              KEEP(*(.vectors))                                       \
-       }                                                               \
-       . = __vectors_start + SIZEOF(.vectors);                         \
-       __vectors_end = .;                                              \
-                                                                       \
-       __stubs_start = .;                                              \
-       .stubs ADDR(.vectors) + 0x1000 : AT(__stubs_start) {            \
--              *(.stubs)                                               \
-+              KEEP(*(.stubs))                                         \
-       }                                                               \
-       . = __stubs_start + SIZEOF(.stubs);                             \
-       __stubs_end = .;                                                \