From 794f2bba0f338d467bbf9c55b5aba415ecd5e138 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Wed, 1 Dec 2021 04:55:24 -0800 Subject: x86: Skip __[start|stop]_SECNAME for --gc-sections -z start-stop-gc Don't convert memory load to immediate load on __start_SECNAME and __stop_SECNAME for --gc-sections -z start-stop-gc if all SECNAME sections been garbage collected. bfd/ PR ld/27491 * elf32-i386.c (elf_i386_convert_load_reloc): Skip __start_SECNAME and __stop_SECNAME for --gc-sections -z start-stop-gc if the input section been garbage collected. * elf64-x86-64.c (elf_x86_64_convert_load_reloc): Likewise. * elfxx-x86.h (elf_x86_start_stop_gc_p): New function. ld/ PR ld/27491 * testsuite/ld-i386/i386.exp: Run PR ld/27491 tests. * testsuite/ld-x86-64/x86-64.exp: Likewise. * testsuite/ld-i386/pr27491-1.s: New file. * testsuite/ld-i386/pr27491-1a.d: Likewise. * testsuite/ld-i386/pr27491-1b.d: Likewise. * testsuite/ld-i386/pr27491-1c.d: Likewise. * testsuite/ld-i386/pr27491-2.d: Likewise. * testsuite/ld-i386/pr27491-2.s: Likewise. * testsuite/ld-i386/pr27491-3.d: Likewise. * testsuite/ld-i386/pr27491-3.s: Likewise. * testsuite/ld-i386/pr27491-4.d: Likewise. * testsuite/ld-i386/pr27491-4a.s: Likewise. * testsuite/ld-i386/pr27491-4b.s: Likewise. * testsuite/ld-x86-64/pr27491-1.s: Likewise. * testsuite/ld-x86-64/pr27491-1a.d: Likewise. * testsuite/ld-x86-64/pr27491-1b.d: Likewise. * testsuite/ld-x86-64/pr27491-1c.d: Likewise. * testsuite/ld-x86-64/pr27491-2.d: Likewise. * testsuite/ld-x86-64/pr27491-2.s: Likewise. * testsuite/ld-x86-64/pr27491-3.d: Likewise. * testsuite/ld-x86-64/pr27491-3.s: Likewise. * testsuite/ld-x86-64/pr27491-4.d: Likewise. * testsuite/ld-x86-64/pr27491-4a.s: Likewise. * testsuite/ld-x86-64/pr27491-4b.s: Likewise. --- bfd/elf32-i386.c | 5 +++++ bfd/elf64-x86-64.c | 5 +++++ bfd/elfxx-x86.h | 33 +++++++++++++++++++++++++++++++++ ld/testsuite/ld-i386/i386.exp | 6 ++++++ ld/testsuite/ld-i386/pr27491-1.s | 14 ++++++++++++++ ld/testsuite/ld-i386/pr27491-1a.d | 14 ++++++++++++++ ld/testsuite/ld-i386/pr27491-1b.d | 11 +++++++++++ ld/testsuite/ld-i386/pr27491-1c.d | 14 ++++++++++++++ ld/testsuite/ld-i386/pr27491-2.d | 22 ++++++++++++++++++++++ ld/testsuite/ld-i386/pr27491-2.s | 16 ++++++++++++++++ ld/testsuite/ld-i386/pr27491-3.d | 21 +++++++++++++++++++++ ld/testsuite/ld-i386/pr27491-3.s | 14 ++++++++++++++ ld/testsuite/ld-i386/pr27491-4.d | 23 +++++++++++++++++++++++ ld/testsuite/ld-i386/pr27491-4a.s | 11 +++++++++++ ld/testsuite/ld-i386/pr27491-4b.s | 2 ++ ld/testsuite/ld-x86-64/pr27491-1.s | 14 ++++++++++++++ ld/testsuite/ld-x86-64/pr27491-1a.d | 14 ++++++++++++++ ld/testsuite/ld-x86-64/pr27491-1b.d | 11 +++++++++++ ld/testsuite/ld-x86-64/pr27491-1c.d | 21 +++++++++++++++++++++ ld/testsuite/ld-x86-64/pr27491-2.d | 23 +++++++++++++++++++++++ ld/testsuite/ld-x86-64/pr27491-2.s | 20 ++++++++++++++++++++ ld/testsuite/ld-x86-64/pr27491-3.d | 21 +++++++++++++++++++++ ld/testsuite/ld-x86-64/pr27491-3.s | 14 ++++++++++++++ ld/testsuite/ld-x86-64/pr27491-4.d | 23 +++++++++++++++++++++++ ld/testsuite/ld-x86-64/pr27491-4a.s | 11 +++++++++++ ld/testsuite/ld-x86-64/pr27491-4b.s | 2 ++ ld/testsuite/ld-x86-64/x86-64.exp | 6 ++++++ 27 files changed, 391 insertions(+) create mode 100644 ld/testsuite/ld-i386/pr27491-1.s create mode 100644 ld/testsuite/ld-i386/pr27491-1a.d create mode 100644 ld/testsuite/ld-i386/pr27491-1b.d create mode 100644 ld/testsuite/ld-i386/pr27491-1c.d create mode 100644 ld/testsuite/ld-i386/pr27491-2.d create mode 100644 ld/testsuite/ld-i386/pr27491-2.s create mode 100644 ld/testsuite/ld-i386/pr27491-3.d create mode 100644 ld/testsuite/ld-i386/pr27491-3.s create mode 100644 ld/testsuite/ld-i386/pr27491-4.d create mode 100644 ld/testsuite/ld-i386/pr27491-4a.s create mode 100644 ld/testsuite/ld-i386/pr27491-4b.s create mode 100644 ld/testsuite/ld-x86-64/pr27491-1.s create mode 100644 ld/testsuite/ld-x86-64/pr27491-1a.d create mode 100644 ld/testsuite/ld-x86-64/pr27491-1b.d create mode 100644 ld/testsuite/ld-x86-64/pr27491-1c.d create mode 100644 ld/testsuite/ld-x86-64/pr27491-2.d create mode 100644 ld/testsuite/ld-x86-64/pr27491-2.s create mode 100644 ld/testsuite/ld-x86-64/pr27491-3.d create mode 100644 ld/testsuite/ld-x86-64/pr27491-3.s create mode 100644 ld/testsuite/ld-x86-64/pr27491-4.d create mode 100644 ld/testsuite/ld-x86-64/pr27491-4a.s create mode 100644 ld/testsuite/ld-x86-64/pr27491-4b.s diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index 0d7f290..db6d1ac 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -1393,6 +1393,11 @@ elf_i386_convert_load_reloc (bfd *abfd, Elf_Internal_Shdr *symtab_hdr, || h->root.type == bfd_link_hash_defweak) && local_ref)) { + /* Skip __start_SECNAME/__stop_SECNAME when --gc-sections + -z start-stop-gc are used. */ + if (elf_x86_start_stop_gc_p (link_info, h)) + return true; + convert_load: if (opcode == 0x8b) { diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index 25e2bb1..bb6df79 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -1643,6 +1643,11 @@ elf_x86_64_convert_load_reloc (bfd *abfd, || h->root.type == bfd_link_hash_defweak) && h->root.u.def.section == bfd_und_section_ptr)))) { + /* Skip __start_SECNAME/__stop_SECNAME when --gc-sections + -z start-stop-gc are used. */ + if (elf_x86_start_stop_gc_p (link_info, h)) + return true; + /* Skip since R_X86_64_32/R_X86_64_32S may overflow. */ if (no_overflow) return true; diff --git a/bfd/elfxx-x86.h b/bfd/elfxx-x86.h index 8251f64..aab641a 100644 --- a/bfd/elfxx-x86.h +++ b/bfd/elfxx-x86.h @@ -731,3 +731,36 @@ extern void _bfd_x86_elf_link_report_relative_reloc _bfd_x86_elf_merge_gnu_properties #define elf_backend_fixup_gnu_properties \ _bfd_x86_elf_link_fixup_gnu_properties + +/* Return true if H is a __start_SECNAME/__stop_SECNAME symbol for the + SECNAME section which has been garbage collected by --gc-sections + -z start-stop-gc. */ + +static inline bool +elf_x86_start_stop_gc_p (struct bfd_link_info *link_info, + struct elf_link_hash_entry *h) +{ + if (h->start_stop + && link_info->gc_sections + && link_info->start_stop_gc) + { + asection *s = h->root.u.def.section; + + do + { + /* Return false if any SECNAME section is kept. */ + if (s->gc_mark) + return false; + s = bfd_get_next_section_by_name (s->owner, s); + } + while (s != NULL); + + /* Return true only if all SECNAME sections have been garbage + collected. */ + return true; + } + + /* Return false if H isn't a __start_SECNAME/__stop_SECNAME symbol or + --gc-sections or -z start-stop-gc isn't used. */ + return false; +} diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp index ceb6000..23ab854 100644 --- a/ld/testsuite/ld-i386/i386.exp +++ b/ld/testsuite/ld-i386/i386.exp @@ -493,6 +493,12 @@ run_dump_test "property-x86-isa3" run_dump_test "property-x86-isa4" run_dump_test "pr26869" run_dump_test "code16" +run_dump_test "pr27491-1a" +run_dump_test "pr27491-1b" +run_dump_test "pr27491-1c" +run_dump_test "pr27491-2" +run_dump_test "pr27491-3" +run_dump_test "pr27491-4" if { !([istarget "i?86-*-linux*"] || [istarget "i?86-*-gnu*"] diff --git a/ld/testsuite/ld-i386/pr27491-1.s b/ld/testsuite/ld-i386/pr27491-1.s new file mode 100644 index 0000000..89155ae --- /dev/null +++ b/ld/testsuite/ld-i386/pr27491-1.s @@ -0,0 +1,14 @@ + .weak __start_xx + .weak __stop_xx + + .text + .global foo +foo: + movl __start_xx@got(%ebx), %eax + movl __stop_xx@got(%ebx), %eax + + .section xx,"a",unique,0 + .byte 0 + + .section xx,"a",unique,1 + .byte 1 diff --git a/ld/testsuite/ld-i386/pr27491-1a.d b/ld/testsuite/ld-i386/pr27491-1a.d new file mode 100644 index 0000000..006c176 --- /dev/null +++ b/ld/testsuite/ld-i386/pr27491-1a.d @@ -0,0 +1,14 @@ +#source: pr27491-1.s +#as: --32 +#ld: --gc-sections -melf_i386 -z start-stop-gc -shared +#objdump: -dw + +.*: +file format elf32-i386 + + +Disassembly of section .text: + +[a-f0-9]+ : + +[a-f0-9]+: 8b 83 ([0-9a-f]{2} ){4}[ \t]+mov +-0x[a-f0-9]+\(%ebx\),%eax + +[a-f0-9]+: 8b 83 ([0-9a-f]{2} ){4}[ \t]+mov +-0x[a-f0-9]+\(%ebx\),%eax +#pass diff --git a/ld/testsuite/ld-i386/pr27491-1b.d b/ld/testsuite/ld-i386/pr27491-1b.d new file mode 100644 index 0000000..69b9ac3 --- /dev/null +++ b/ld/testsuite/ld-i386/pr27491-1b.d @@ -0,0 +1,11 @@ +#source: pr27491-1.s +#as: --32 +#ld: --gc-sections -melf_i386 -z start-stop-gc -shared +#nm: -n + +#failif +#... +[a-f0-9]+ R __start_xx +#... +[a-f0-9]+ R __stop_xx +#... diff --git a/ld/testsuite/ld-i386/pr27491-1c.d b/ld/testsuite/ld-i386/pr27491-1c.d new file mode 100644 index 0000000..730e975 --- /dev/null +++ b/ld/testsuite/ld-i386/pr27491-1c.d @@ -0,0 +1,14 @@ +#source: pr27491-1.s +#as: --32 +#ld: --gc-sections -melf_i386 -shared +#objdump: -dw + +.*: +file format elf32-i386 + + +Disassembly of section .text: + +[a-f0-9]+ : + +[a-f0-9]+: 8d 83 ([0-9a-f]{2} ){4}[ \t]+lea +-0x[a-f0-9]+\(%ebx\),%eax + +[a-f0-9]+: 8d 83 ([0-9a-f]{2} ){4}[ \t]+lea +-0x[a-f0-9]+\(%ebx\),%eax +#pass diff --git a/ld/testsuite/ld-i386/pr27491-2.d b/ld/testsuite/ld-i386/pr27491-2.d new file mode 100644 index 0000000..02b310a --- /dev/null +++ b/ld/testsuite/ld-i386/pr27491-2.d @@ -0,0 +1,22 @@ +#as: --32 +#ld: --gc-sections -melf_i386 -z start-stop-gc -shared +#objdump: --syms -dw + +.*: +file format elf32-i386 + + +SYMBOL TABLE: +#... +[a-f0-9]+ g xx [a-f0-9]+ \.protected __stop_xx +#... +[a-f0-9]+ g xx [a-f0-9]+ \.protected __start_xx +#... + + +Disassembly of section .text: + +[a-f0-9]+ : + +[a-f0-9]+: 8d 83 ([0-9a-f]{2} ){4}[ \t]+lea +-0x[a-f0-9]+\(%ebx\),%eax + +[a-f0-9]+: 8d 83 ([0-9a-f]{2} ){4}[ \t]+lea +-0x[a-f0-9]+\(%ebx\),%eax + +[a-f0-9]+: 8d 83 ([0-9a-f]{2} ){4}[ \t]+lea +-0x[a-f0-9]+\(%ebx\),%eax +#pass diff --git a/ld/testsuite/ld-i386/pr27491-2.s b/ld/testsuite/ld-i386/pr27491-2.s new file mode 100644 index 0000000..17871dd --- /dev/null +++ b/ld/testsuite/ld-i386/pr27491-2.s @@ -0,0 +1,16 @@ + .weak __start_xx + .weak __stop_xx + + .text + .global foo +foo: + movl __start_xx@got(%ebx), %eax + movl __stop_xx@got(%ebx), %eax + leal bar1@got(%ebx), %eax + + .section xx,"a",unique,0 +bar1: + .byte 0 + + .section xx,"a",unique,1 + .byte 1 diff --git a/ld/testsuite/ld-i386/pr27491-3.d b/ld/testsuite/ld-i386/pr27491-3.d new file mode 100644 index 0000000..7749570 --- /dev/null +++ b/ld/testsuite/ld-i386/pr27491-3.d @@ -0,0 +1,21 @@ +#as: --32 +#ld: --gc-sections -melf_i386 -z start-stop-gc -shared +#objdump: --syms -dw + +.*: +file format elf32-i386 + + +SYMBOL TABLE: +#... +[a-f0-9]+ g xx [a-f0-9]+ \.protected __stop_xx +#... +[a-f0-9]+ g xx [a-f0-9]+ \.protected __start_xx +#... + + +Disassembly of section .text: + +[a-f0-9]+ : + +[a-f0-9]+: 8d 83 ([0-9a-f]{2} ){4}[ \t]+lea +-0x[a-f0-9]+\(%ebx\),%eax + +[a-f0-9]+: 8d 83 ([0-9a-f]{2} ){4}[ \t]+lea +-0x[a-f0-9]+\(%ebx\),%eax +#pass diff --git a/ld/testsuite/ld-i386/pr27491-3.s b/ld/testsuite/ld-i386/pr27491-3.s new file mode 100644 index 0000000..85fc3dd --- /dev/null +++ b/ld/testsuite/ld-i386/pr27491-3.s @@ -0,0 +1,14 @@ + .weak __start_xx + .weak __stop_xx + + .text + .global foo +foo: + movl __start_xx@got(%ebx), %eax + movl __stop_xx@got(%ebx), %eax + + .section xx,"a",unique,0 + .byte 0 + + .section xx,"aR",unique,1 + .byte 1 diff --git a/ld/testsuite/ld-i386/pr27491-4.d b/ld/testsuite/ld-i386/pr27491-4.d new file mode 100644 index 0000000..4a305da --- /dev/null +++ b/ld/testsuite/ld-i386/pr27491-4.d @@ -0,0 +1,23 @@ +#source: pr27491-4a.s +#source: pr27491-4b.s +#as: --32 +#ld: --gc-sections -melf_i386 -z start-stop-gc -shared +#objdump: --syms -dw + +.*: +file format elf32-i386 + + +SYMBOL TABLE: +#... +[a-f0-9]+ g xx [a-f0-9]+ \.protected __stop_xx +#... +[a-f0-9]+ g xx [a-f0-9]+ \.protected __start_xx +#... + + +Disassembly of section .text: + +[a-f0-9]+ : + +[a-f0-9]+: 8d 83 ([0-9a-f]{2} ){4}[ \t]+lea +-0x[a-f0-9]+\(%ebx\),%eax + +[a-f0-9]+: 8d 83 ([0-9a-f]{2} ){4}[ \t]+lea +-0x[a-f0-9]+\(%ebx\),%eax +#pass diff --git a/ld/testsuite/ld-i386/pr27491-4a.s b/ld/testsuite/ld-i386/pr27491-4a.s new file mode 100644 index 0000000..a183b2f --- /dev/null +++ b/ld/testsuite/ld-i386/pr27491-4a.s @@ -0,0 +1,11 @@ + .weak __start_xx + .weak __stop_xx + + .text + .global foo +foo: + movl __start_xx@got(%ebx), %eax + movl __stop_xx@got(%ebx), %eax + + .section xx,"a",unique,0 + .byte 0 diff --git a/ld/testsuite/ld-i386/pr27491-4b.s b/ld/testsuite/ld-i386/pr27491-4b.s new file mode 100644 index 0000000..d0b83e9 --- /dev/null +++ b/ld/testsuite/ld-i386/pr27491-4b.s @@ -0,0 +1,2 @@ + .section xx,"aR",unique,1 + .byte 1 diff --git a/ld/testsuite/ld-x86-64/pr27491-1.s b/ld/testsuite/ld-x86-64/pr27491-1.s new file mode 100644 index 0000000..0d5b771 --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr27491-1.s @@ -0,0 +1,14 @@ + .weak __start_xx + .weak __stop_xx + + .text + .global foo +foo: + movq __start_xx@gotpcrel(%rip), %rax + movq __stop_xx@gotpcrel(%rip), %rax + + .section xx,"a",unique,0 + .byte 0 + + .section xx,"a",unique,1 + .byte 1 diff --git a/ld/testsuite/ld-x86-64/pr27491-1a.d b/ld/testsuite/ld-x86-64/pr27491-1a.d new file mode 100644 index 0000000..ade5c6f --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr27491-1a.d @@ -0,0 +1,14 @@ +#source: pr27491-1.s +#as: --64 +#ld: --gc-sections -melf_x86_64 -z start-stop-gc -shared +#objdump: -dw + +.*: +file format elf64-x86-64 + + +Disassembly of section .text: + +[a-f0-9]+ : + +[a-f0-9]+: 48 8b 05 ([0-9a-f]{2} ){4}[ \t]+mov +0x[a-f0-9]+\(%rip\),%rax[ \t]+# [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+> + +[a-f0-9]+: 48 8b 05 ([0-9a-f]{2} ){4}[ \t]+mov +0x[a-f0-9]+\(%rip\),%rax[ \t]+# [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+> +#pass diff --git a/ld/testsuite/ld-x86-64/pr27491-1b.d b/ld/testsuite/ld-x86-64/pr27491-1b.d new file mode 100644 index 0000000..a6e21da --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr27491-1b.d @@ -0,0 +1,11 @@ +#source: pr27491-1.s +#as: --64 +#ld: --gc-sections -melf_x86_64 -z start-stop-gc -shared +#nm: -n + +#failif +#... +[a-f0-9]+ R __start_xx +#... +[a-f0-9]+ R __stop_xx +#... diff --git a/ld/testsuite/ld-x86-64/pr27491-1c.d b/ld/testsuite/ld-x86-64/pr27491-1c.d new file mode 100644 index 0000000..1288361 --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr27491-1c.d @@ -0,0 +1,21 @@ +#source: pr27491-1.s +#as: --64 +#ld: --gc-sections -melf_x86_64 -shared +#objdump: --syms -dw + +.*: +file format elf64-x86-64 + +SYMBOL TABLE: +#... +[a-f0-9]+ g xx [a-f0-9]+ \.protected __stop_xx +#... +[a-f0-9]+ g xx [a-f0-9]+ \.protected __start_xx +#... + + +Disassembly of section .text: + +[a-f0-9]+ : + +[a-f0-9]+: 48 8d 05 ([0-9a-f]{2} ){4}[ \t]+lea +0x[a-f0-9]+\(%rip\),%rax[ \t]+# [a-f0-9]+ <__start_xx> + +[a-f0-9]+: 48 8d 05 ([0-9a-f]{2} ){4}[ \t]+lea +0x[a-f0-9]+\(%rip\),%rax[ \t]+# [a-f0-9]+ <__stop_xx> +#pass diff --git a/ld/testsuite/ld-x86-64/pr27491-2.d b/ld/testsuite/ld-x86-64/pr27491-2.d new file mode 100644 index 0000000..753ebb6 --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr27491-2.d @@ -0,0 +1,23 @@ +#as: --64 +#ld: --gc-sections -melf_x86_64 -z start-stop-gc -shared +#objdump: --syms -dw + +.*: +file format elf64-x86-64 + + +SYMBOL TABLE: +#... +[a-f0-9]+ g xx [a-f0-9]+ \.protected __stop_xx +#... +[a-f0-9]+ g xx [a-f0-9]+ \.protected __start_xx +#... + + +Disassembly of section .text: + +[a-f0-9]+ : + +[a-f0-9]+: 48 8d 05 ([0-9a-f]{2} ){4}[ \t]+lea +0x[a-f0-9]+\(%rip\),%rax[ \t]+# [a-f0-9]+ <__start_xx> + +[a-f0-9]+: 48 8d 05 ([0-9a-f]{2} ){4}[ \t]+lea +0x[a-f0-9]+\(%rip\),%rax[ \t]+# [a-f0-9]+ <__stop_xx> + +[a-f0-9]+: 48 8d 05 ([0-9a-f]{2} ){4}[ \t]+lea +0x[a-f0-9]+\(%rip\),%rax[ \t]+# [a-f0-9]+ + +[a-f0-9]+: 48 8d 05 ([0-9a-f]{2} ){4}[ \t]+lea +0x[a-f0-9]+\(%rip\),%rax[ \t]+# [a-f0-9]+ +#pass diff --git a/ld/testsuite/ld-x86-64/pr27491-2.s b/ld/testsuite/ld-x86-64/pr27491-2.s new file mode 100644 index 0000000..a0975ff --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr27491-2.s @@ -0,0 +1,20 @@ + .weak __start_xx + .weak __stop_xx + + .text + .global foo +foo: + movq __start_xx@gotpcrel(%rip), %rax + movq __stop_xx@gotpcrel(%rip), %rax + leaq bar1(%rip), %rax + leaq bar2(%rip), %rax + + .section xx,"a",unique,0 + .byte 0 +bar1: + .byte 0 +bar2: + .byte 0 + + .section xx,"a",unique,1 + .byte 1 diff --git a/ld/testsuite/ld-x86-64/pr27491-3.d b/ld/testsuite/ld-x86-64/pr27491-3.d new file mode 100644 index 0000000..6dda542 --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr27491-3.d @@ -0,0 +1,21 @@ +#as: --64 +#ld: --gc-sections -melf_x86_64 -z start-stop-gc -shared +#objdump: --syms -dw + +.*: +file format elf64-x86-64 + + +SYMBOL TABLE: +#... +[a-f0-9]+ g xx [a-f0-9]+ \.protected __stop_xx +#... +[a-f0-9]+ g xx [a-f0-9]+ \.protected __start_xx +#... + + +Disassembly of section .text: + +[a-f0-9]+ : + +[a-f0-9]+: 48 8d 05 ([0-9a-f]{2} ){4}[ \t]+lea +0x[a-f0-9]+\(%rip\),%rax[ \t]+# [a-f0-9]+ <__start_xx> + +[a-f0-9]+: 48 8d 05 ([0-9a-f]{2} ){4}[ \t]+lea +0x[a-f0-9]+\(%rip\),%rax[ \t]+# [a-f0-9]+ <__stop_xx> +#pass diff --git a/ld/testsuite/ld-x86-64/pr27491-3.s b/ld/testsuite/ld-x86-64/pr27491-3.s new file mode 100644 index 0000000..efdcba4 --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr27491-3.s @@ -0,0 +1,14 @@ + .weak __start_xx + .weak __stop_xx + + .text + .global foo +foo: + movq __start_xx@gotpcrel(%rip), %rax + movq __stop_xx@gotpcrel(%rip), %rax + + .section xx,"a",unique,1 + .byte 0 + + .section xx,"aR",unique,0 + .byte 1 diff --git a/ld/testsuite/ld-x86-64/pr27491-4.d b/ld/testsuite/ld-x86-64/pr27491-4.d new file mode 100644 index 0000000..54542fd --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr27491-4.d @@ -0,0 +1,23 @@ +#source: pr27491-4a.s +#source: pr27491-4b.s +#as: --64 +#ld: --gc-sections -melf_x86_64 -z start-stop-gc -shared +#objdump: --syms -dw + +.*: +file format elf64-x86-64 + + +SYMBOL TABLE: +#... +[a-f0-9]+ g xx [a-f0-9]+ \.protected __stop_xx +#... +[a-f0-9]+ g xx [a-f0-9]+ \.protected __start_xx +#... + + +Disassembly of section .text: + +[a-f0-9]+ : + +[a-f0-9]+: 48 8d 05 ([0-9a-f]{2} ){4}[ \t]+lea +0x[a-f0-9]+\(%rip\),%rax[ \t]+# [a-f0-9]+ <__start_xx> + +[a-f0-9]+: 48 8d 05 ([0-9a-f]{2} ){4}[ \t]+lea +0x[a-f0-9]+\(%rip\),%rax[ \t]+# [a-f0-9]+ <__stop_xx> +#pass diff --git a/ld/testsuite/ld-x86-64/pr27491-4a.s b/ld/testsuite/ld-x86-64/pr27491-4a.s new file mode 100644 index 0000000..3b17a81 --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr27491-4a.s @@ -0,0 +1,11 @@ + .weak __start_xx + .weak __stop_xx + + .text + .global foo +foo: + movq __start_xx@gotpcrel(%rip), %rax + movq __stop_xx@gotpcrel(%rip), %rax + + .section xx,"a",unique,1 + .byte 0 diff --git a/ld/testsuite/ld-x86-64/pr27491-4b.s b/ld/testsuite/ld-x86-64/pr27491-4b.s new file mode 100644 index 0000000..2b46b21 --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr27491-4b.s @@ -0,0 +1,2 @@ + .section xx,"aR",unique,0 + .byte 1 diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp index 064438a..ba065c0 100644 --- a/ld/testsuite/ld-x86-64/x86-64.exp +++ b/ld/testsuite/ld-x86-64/x86-64.exp @@ -480,6 +480,12 @@ run_dump_test "property-x86-isa3-x32" run_dump_test "property-x86-isa4" run_dump_test "property-x86-isa4-x32" run_dump_test "code16" +run_dump_test "pr27491-1a" +run_dump_test "pr27491-1b" +run_dump_test "pr27491-1c" +run_dump_test "pr27491-2" +run_dump_test "pr27491-3" +run_dump_test "pr27491-4" if ![istarget "x86_64-*-linux*"] { return -- cgit v1.1