[lld] r313621 - [ELF] - Do not merge sections from SHT_GROUP when -relocatable
George Rimar via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 19 02:40:32 PDT 2017
Author: grimar
Date: Tue Sep 19 02:40:31 2017
New Revision: 313621
URL: http://llvm.org/viewvc/llvm-project?rev=313621&view=rev
Log:
[ELF] - Do not merge sections from SHT_GROUP when -relocatable
This is PR34506.
Imagine we have 2 sections the same name but different COMDAT groups:
.section .foo,"axG", at progbits,bar,comdat
.section .foo,"axG", at progbits,zed,comdat
When linking relocatable we do not merge SHT_GROUP sections. But still would merge
both input sections .foo into single output section .foo.
As a result we will have 2 different SHT_GROUPs containing the same section, what
is wrong.
Patch fixes the issue, preventing merging SHF_GROUP sections with any others.
Differential revision: https://reviews.llvm.org/D37574
Added:
lld/trunk/test/ELF/relocatable-comdat2.s
Modified:
lld/trunk/ELF/OutputSections.cpp
Modified: lld/trunk/ELF/OutputSections.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/OutputSections.cpp?rev=313621&r1=313620&r2=313621&view=diff
==============================================================================
--- lld/trunk/ELF/OutputSections.cpp (original)
+++ lld/trunk/ELF/OutputSections.cpp Tue Sep 19 02:40:31 2017
@@ -251,12 +251,14 @@ void OutputSectionFactory::addInputSec(I
return;
}
- // Sections with the SHT_GROUP attribute reach here only when the -r option
- // is given. Such sections define "section groups", and InputFiles.cpp has
- // dedup'ed section groups by their signatures. For the -r, we want to pass
- // through all SHT_GROUP sections without merging them because merging them
- // creates broken section contents.
- if (IS->Type == SHT_GROUP) {
+ // Sections with SHT_GROUP or SHF_GROUP attributes reach here only when the -r
+ // option is given. A section with SHT_GROUP defines a "section group", and
+ // its members have SHF_GROUP attribute. Usually these flags have already been
+ // stripped by InputFiles.cpp as section groups are processed and uniquified.
+ // However, for the -r option, we want to pass through all section groups
+ // as-is because adding/removing members or merging them with other groups
+ // change their semantics.
+ if (IS->Type == SHT_GROUP || (IS->Flags & SHF_GROUP)) {
addSection(IS, OutsecName, nullptr);
return;
}
Added: lld/trunk/test/ELF/relocatable-comdat2.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/relocatable-comdat2.s?rev=313621&view=auto
==============================================================================
--- lld/trunk/test/ELF/relocatable-comdat2.s (added)
+++ lld/trunk/test/ELF/relocatable-comdat2.s Tue Sep 19 02:40:31 2017
@@ -0,0 +1,35 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
+# RUN: ld.lld -r %t.o -o %t
+# RUN: llvm-readobj -elf-section-groups -s %t | FileCheck %s
+
+## Check .foo was not merged.
+# CHECK: Sections [
+# CHECK: Name: .foo
+# CHECK: Name: .foo
+# CHECK: Name: .foo
+
+# CHECK: Groups {
+# CHECK-NEXT: Group {
+# CHECK-NEXT: Name: .group
+# CHECK-NEXT: Index: 2
+# CHECK-NEXT: Type: COMDAT
+# CHECK-NEXT: Signature: bar
+# CHECK-NEXT: Section(s) in group [
+# CHECK-NEXT: .foo (3)
+# CHECK-NEXT: ]
+# CHECK-NEXT: }
+# CHECK-NEXT: Group {
+# CHECK-NEXT: Name: .group
+# CHECK-NEXT: Index: 4
+# CHECK-NEXT: Type: COMDAT
+# CHECK-NEXT: Signature: zed
+# CHECK-NEXT: Section(s) in group [
+# CHECK-NEXT: .foo (5)
+# CHECK-NEXT: ]
+# CHECK-NEXT: }
+# CHECK-NEXT: }
+
+.section .foo,"axG", at progbits,bar,comdat
+.section .foo,"axG", at progbits,zed,comdat
+.section .foo,"ax", at progbits
More information about the llvm-commits
mailing list