From 5242a0a000ad7d3f2fa1cd0023f692d53261b302 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Thu, 6 Feb 2020 19:37:54 -0800 Subject: [PATCH] ld: Issue an error for GC on __patchable_function_entries section __patchable_function_entries section is generated by a compiler with -fpatchable-function-entry=XX. The assembly code looks like this: --- .text .globl _start .type _start, %function _start: .section __patchable_function_entries,"aw",%progbits .dc.a .LPFE1 .text .LPFE1: .byte 0 --- But --gc-sections will silently remove __patchable_function_entries section and generate corrupt result. This patch disallows garbage collection on __patchable_function_entries section without linked-to section. bfd/ PR ld/25490 * elflink.c (_bfd_elf_gc_mark_extra_sections): Issue an error for garbage collection on __patchable_function_entries section without linked-to section. ld/ PR ld/25490 * testsuite/ld-elf/pr25490-1.d: New file. * testsuite/ld-elf/pr25490-1.s: Likewise. --- bfd/ChangeLog | 7 +++++++ bfd/elflink.c | 7 +++++++ ld/ChangeLog | 6 ++++++ ld/testsuite/ld-elf/pr25490-1.d | 3 +++ ld/testsuite/ld-elf/pr25490-1.s | 9 +++++++++ 5 files changed, 32 insertions(+) create mode 100644 ld/testsuite/ld-elf/pr25490-1.d create mode 100644 ld/testsuite/ld-elf/pr25490-1.s diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 99718857071..e1a84123254 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2020-02-06 H.J. Lu + + PR ld/25490 + * elflink.c (_bfd_elf_gc_mark_extra_sections): Issue an error + for garbage collection on __patchable_function_entries section + without linked-to section. + 2020-02-06 H.J. Lu PR gas/25381 diff --git a/bfd/elflink.c b/bfd/elflink.c index 30a572d32de..3add9f18bd7 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -13365,6 +13365,13 @@ _bfd_elf_gc_mark_extra_sections (struct bfd_link_info *info, && (isec->flags & SEC_DEBUGGING) && CONST_STRNEQ (isec->name, ".debug_line.")) debug_frag_seen = TRUE; + else if (strcmp (bfd_section_name (isec), + "__patchable_function_entries") == 0 + && elf_linked_to_section (isec) == NULL) + info->callbacks->einfo (_("%F%P: %pB(%pA): error: " + "need linked-to section " + "for --gc-sections\n"), + isec->owner, isec); } /* If no non-note alloc section in this file will be kept, then diff --git a/ld/ChangeLog b/ld/ChangeLog index b5c8326efb6..3ad571f1691 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,9 @@ +2020-02-06 H.J. Lu + + PR ld/25490 + * testsuite/ld-elf/pr25490-1.d: New file. + * testsuite/ld-elf/pr25490-1.s: Likewise. + 2020-02-06 H.J. Lu PR ld/24526 diff --git a/ld/testsuite/ld-elf/pr25490-1.d b/ld/testsuite/ld-elf/pr25490-1.d new file mode 100644 index 00000000000..3f582645899 --- /dev/null +++ b/ld/testsuite/ld-elf/pr25490-1.d @@ -0,0 +1,3 @@ +#ld: --gc-sections -e _start +#target: [check_gc_sections_available] +#error: .*\(__patchable_function_entries\): error: need linked-to section for --gc-sections diff --git a/ld/testsuite/ld-elf/pr25490-1.s b/ld/testsuite/ld-elf/pr25490-1.s new file mode 100644 index 00000000000..51ba1ea8014 --- /dev/null +++ b/ld/testsuite/ld-elf/pr25490-1.s @@ -0,0 +1,9 @@ + .text + .globl _start + .type _start, %function +_start: + .section __patchable_function_entries,"aw",%progbits + .dc.a .LPFE1 + .text +.LPFE1: + .byte 0 -- 2.30.2