diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2016-11-11 21:36:25 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2016-11-11 21:36:25 +0000 |
commit | d4372f783b52919c569f3e2007e3ba9edb45c7fb (patch) | |
tree | e2aedcf419ac2d03e54e26da2da5ee6a93999586 | |
parent | 088faab429538c6123024f6f173ee6e35845f445 (diff) | |
download | bcm5719-llvm-d4372f783b52919c569f3e2007e3ba9edb45c7fb.tar.gz bcm5719-llvm-d4372f783b52919c569f3e2007e3ba9edb45c7fb.zip |
Avoid a crash with -r and .comment.
We would create a MergeInputSection for the synthetic .comment and
crash trying to add it to a regular output section.
With this we just don't add the synthetic section with -r. That is
consistent with gold that doesn't create .note.gnu.gold-version with
-r.
llvm-svn: 286635
-rw-r--r-- | lld/ELF/Writer.cpp | 3 | ||||
-rw-r--r-- | lld/test/ELF/relocatable-bss.s | 2 | ||||
-rw-r--r-- | lld/test/ELF/relocatable-comment.s | 27 | ||||
-rw-r--r-- | lld/test/ELF/relocatable.s | 6 |
4 files changed, 33 insertions, 5 deletions
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index 941a6d81ff9..de9a2f9fe7d 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -267,7 +267,8 @@ template <class ELFT> void Writer<ELFT>::createSyntheticSections() { Out<ELFT>::VerDef = make<VersionDefinitionSection<ELFT>>(); // Initialize linker generated sections - Symtab<ELFT>::X->Sections.push_back(createCommentSection<ELFT>()); + if (!Config->Relocatable) + Symtab<ELFT>::X->Sections.push_back(createCommentSection<ELFT>()); if (Config->BuildId == BuildIdKind::Fast) In<ELFT>::BuildId = make<BuildIdFastHash<ELFT>>(); diff --git a/lld/test/ELF/relocatable-bss.s b/lld/test/ELF/relocatable-bss.s index 11078bc2415..0411bf339c4 100644 --- a/lld/test/ELF/relocatable-bss.s +++ b/lld/test/ELF/relocatable-bss.s @@ -20,7 +20,7 @@ # CHECK-NEXT: Version: # CHECK-NEXT: Entry: # CHECK-NEXT: ProgramHeaderOffset: -# CHECK-NEXT: SectionHeaderOffset: 0xB8 +# CHECK-NEXT: SectionHeaderOffset: 0xA8 # CHECK-NEXT: Flags [ # CHECK-NEXT: ] # CHECK-NEXT: HeaderSize: diff --git a/lld/test/ELF/relocatable-comment.s b/lld/test/ELF/relocatable-comment.s new file mode 100644 index 00000000000..8ec22c2f43d --- /dev/null +++ b/lld/test/ELF/relocatable-comment.s @@ -0,0 +1,27 @@ +# REQUIRES: x86 +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t1.o +# RUN: ld.lld -r %t1.o -o %t +# RUN: llvm-readobj -s -section-data %t | FileCheck %s + +# CHECK: Name: .comment +# CHECK-NEXT: Type: SHT_PROGBITS +# CHECK-NEXT: Flags [ +# CHECK-NEXT: SHF_MERGE +# CHECK-NEXT: SHF_STRINGS +# CHECK-NEXT: ] +# CHECK-NEXT: Address: +# CHECK-NEXT: Offset: +# CHECK-NEXT: Size: 7 +# CHECK-NEXT: Link: +# CHECK-NEXT: Info: +# CHECK-NEXT: AddressAlignment: 1 +# CHECK-NEXT: EntrySize: 1 +# CHECK-NEXT: SectionData ( +# CHECK-NEXT: 0000: 666F6F62 617200 |foobar.| +# CHECK-NEXT: ) + + +# We used to crash creating a merge and non merge .comment sections. + + .section .comment,"MS",@progbits,1 + .asciz "foobar" diff --git a/lld/test/ELF/relocatable.s b/lld/test/ELF/relocatable.s index a0f63dd4b16..73cf4cccd83 100644 --- a/lld/test/ELF/relocatable.s +++ b/lld/test/ELF/relocatable.s @@ -30,15 +30,15 @@ # CHECK-NEXT: Version: 1 # CHECK-NEXT: Entry: 0x0 # CHECK-NEXT: ProgramHeaderOffset: 0x0 -# CHECK-NEXT: SectionHeaderOffset: 0x2D0 +# CHECK-NEXT: SectionHeaderOffset: 0x2C0 # CHECK-NEXT: Flags [ # CHECK-NEXT: ] # CHECK-NEXT: HeaderSize: 64 # CHECK-NEXT: ProgramHeaderEntrySize: 0 # CHECK-NEXT: ProgramHeaderCount: 0 # CHECK-NEXT: SectionHeaderEntrySize: 64 -# CHECK-NEXT: SectionHeaderCount: 8 -# CHECK-NEXT: StringTableSectionIndex: 6 +# CHECK-NEXT: SectionHeaderCount: 7 +# CHECK-NEXT: StringTableSectionIndex: 5 # CHECK-NEXT: } # CHECK: Relocations [ |