From: H.J. Lu Date: Thu, 26 Nov 2020 00:14:13 +0000 (-0800) Subject: elf: Get the real kept section X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=58349d00f461904f20dae88d48c1fda11cbb47bc;p=binutils-gdb.git elf: Get the real kept section When mixing linkonce and comdat sections, we need to keep searching to get the real kept section. bfd/ PR ld/26936 * elflink.c (_bfd_elf_check_kept_section): Get the real kept section. ld/ PR ld/26936 * testsuite/ld-elf/pr26936.d: New file. * testsuite/ld-elf/pr26936a.s: Likewise. * testsuite/ld-elf/pr26936b.s: Likewise. * testsuite/ld-elf/pr26936c.s: Likewise. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index d47d518a2a9..eeb0b81f2e7 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2020-11-25 H.J. Lu + + PR ld/26936 + * elflink.c (_bfd_elf_check_kept_section): Get the real kept + section. + 2020-11-23 Nick Clifton PR 26931 diff --git a/bfd/elflink.c b/bfd/elflink.c index 7ba667a8248..0fbebca372f 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -10698,10 +10698,21 @@ _bfd_elf_check_kept_section (asection *sec, struct bfd_link_info *info) { if ((kept->flags & SEC_GROUP) != 0) kept = match_group_member (sec, kept, info); - if (kept != NULL - && ((sec->rawsize != 0 ? sec->rawsize : sec->size) - != (kept->rawsize != 0 ? kept->rawsize : kept->size))) - kept = NULL; + if (kept != NULL) + { + if ((sec->rawsize != 0 ? sec->rawsize : sec->size) + != (kept->rawsize != 0 ? kept->rawsize : kept->size)) + kept = NULL; + else + { + /* Get the real kept section. */ + asection *next; + for (next = kept->kept_section; + next != NULL; + next = next->kept_section) + kept = next; + } + } sec->kept_section = kept; } return kept; diff --git a/ld/ChangeLog b/ld/ChangeLog index d7280efb36a..005d54e80da 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,11 @@ +2020-11-25 H.J. Lu + + PR ld/26936 + * testsuite/ld-elf/pr26936.d: New file. + * testsuite/ld-elf/pr26936a.s: Likewise. + * testsuite/ld-elf/pr26936b.s: Likewise. + * testsuite/ld-elf/pr26936c.s: Likewise. + 2020-11-25 Alan Modra * ldlang.c (lang_output_section_statement_lookup): Change "create" diff --git a/ld/testsuite/ld-elf/pr26936.d b/ld/testsuite/ld-elf/pr26936.d new file mode 100644 index 00000000000..b007e83ff20 --- /dev/null +++ b/ld/testsuite/ld-elf/pr26936.d @@ -0,0 +1,12 @@ +#source: pr26936a.s +#source: pr26936b.s +#source: pr26936c.s +#as: -g +#ld: -z noseparate-code -Ttext-segment 0x10000 -z max-page-size=0x1000 +#readelf: -wL + +#... +CU: .*/pr26936c.s: +File name +Line number +Starting address +View +Stmt +pr26936c.s +6 +0x10[0-9a-f][0-9a-f][0-9a-f] +x +#pass diff --git a/ld/testsuite/ld-elf/pr26936a.s b/ld/testsuite/ld-elf/pr26936a.s new file mode 100644 index 00000000000..24b90daa20b --- /dev/null +++ b/ld/testsuite/ld-elf/pr26936a.s @@ -0,0 +1,6 @@ + .section .gnu.linkonce.t.__x86.get_pc_thunk.bx,"ax",%progbits + .globl __x86.get_pc_thunk.bx + .hidden __x86.get_pc_thunk.bx + .type __x86.get_pc_thunk.bx, %function +__x86.get_pc_thunk.bx: + .nop diff --git a/ld/testsuite/ld-elf/pr26936b.s b/ld/testsuite/ld-elf/pr26936b.s new file mode 100644 index 00000000000..433528c33e9 --- /dev/null +++ b/ld/testsuite/ld-elf/pr26936b.s @@ -0,0 +1,11 @@ + .text + .globl _start +_start: + .type _start, %function + .nop + .section .text.__x86.get_pc_thunk.bx,"axG",%progbits,__x86.get_pc_thunk.bx,comdat + .globl __x86.get_pc_thunk.bx + .hidden __x86.get_pc_thunk.bx + .type __x86.get_pc_thunk.bx, %function +__x86.get_pc_thunk.bx: + .nop diff --git a/ld/testsuite/ld-elf/pr26936c.s b/ld/testsuite/ld-elf/pr26936c.s new file mode 100644 index 00000000000..379cb71d159 --- /dev/null +++ b/ld/testsuite/ld-elf/pr26936c.s @@ -0,0 +1,6 @@ + .section .text.__x86.get_pc_thunk.bx,"axG",%progbits,__x86.get_pc_thunk.bx,comdat + .globl __x86.get_pc_thunk.bx + .hidden __x86.get_pc_thunk.bx + .type __x86.get_pc_thunk.bx, %function +__x86.get_pc_thunk.bx: + .nop