diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2020-11-25 16:14:13 -0800 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2020-11-25 16:14:29 -0800 |
commit | 58349d00f461904f20dae88d48c1fda11cbb47bc (patch) | |
tree | abac11dad512c2375cb95d025c470b7e2099f833 | |
parent | 93bbe484a4fd41832383d4d781140d8cb5b18e76 (diff) | |
download | binutils-58349d00f461904f20dae88d48c1fda11cbb47bc.zip binutils-58349d00f461904f20dae88d48c1fda11cbb47bc.tar.gz binutils-58349d00f461904f20dae88d48c1fda11cbb47bc.tar.bz2 |
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.
-rw-r--r-- | bfd/ChangeLog | 6 | ||||
-rw-r--r-- | bfd/elflink.c | 19 | ||||
-rw-r--r-- | ld/ChangeLog | 8 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/pr26936.d | 12 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/pr26936a.s | 6 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/pr26936b.s | 11 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/pr26936c.s | 6 |
7 files changed, 64 insertions, 4 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index d47d518..eeb0b81 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2020-11-25 H.J. Lu <hongjiu.lu@intel.com> + + PR ld/26936 + * elflink.c (_bfd_elf_check_kept_section): Get the real kept + section. + 2020-11-23 Nick Clifton <nickc@redhat.com> PR 26931 diff --git a/bfd/elflink.c b/bfd/elflink.c index 7ba667a..0fbebca 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 d7280ef..005d54e 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,11 @@ +2020-11-25 H.J. Lu <hongjiu.lu@intel.com> + + 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 <amodra@gmail.com> * 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 0000000..b007e83 --- /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 0000000..24b90da --- /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 0000000..433528c --- /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 0000000..379cb71 --- /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 |