Do not handle zero-sized mergeable section as mergeable.
authorRui Ueyama <ruiu@google.com>
Wed, 3 Aug 2016 05:28:02 +0000 (05:28 +0000)
committerRui Ueyama <ruiu@google.com>
Wed, 3 Aug 2016 05:28:02 +0000 (05:28 +0000)
Mergeable sections with size zero are useless because they don't
actually contain data, and therefore there's no merit ot merge them.
However, in reality, there are object files in the wild containing
such sections. Currently, LLD can't handle them proerply.

This patch makes LLD to handle such sections as if they are non-
mergeable to fix the issue.

Fixes bug 28822.

llvm-svn: 277568

lld/ELF/InputFiles.cpp
lld/test/ELF/merge-string-empty.s [new file with mode: 0644]
lld/test/ELF/relocation-past-merge-end.s
lld/test/ELF/writable-merge.s

index 6caf567..009aa1f 100644 (file)
@@ -162,6 +162,13 @@ bool elf::ObjectFile<ELFT>::shouldMerge(const Elf_Shdr &Sec) {
   if (Config->Optimize == 0)
     return false;
 
+  // A mergeable section with size 0 is useless because they don't have
+  // any data to merge. A mergeable string section with size 0 can be
+  // argued as invalid because it doesn't end with a null character.
+  // We'll avoid a mess by handling them as if they were non-mergeable.
+  if (Sec.sh_size == 0)
+    return false;
+
   uintX_t Flags = Sec.sh_flags;
   if (!(Flags & SHF_MERGE))
     return false;
diff --git a/lld/test/ELF/merge-string-empty.s b/lld/test/ELF/merge-string-empty.s
new file mode 100644 (file)
index 0000000..0b82ce7
--- /dev/null
@@ -0,0 +1,12 @@
+// Ensure that a mergeable string with size 0 does not cause any issue.
+
+// REQUIRES: x86
+// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
+// RUN: ld.lld %t.o -o %t
+
+.globl _start, s
+.section .rodata.str1.1,"aMS",@progbits,1
+s:
+.text
+_start:
+       .quad s
index de67a45..0900d0e 100644 (file)
@@ -3,6 +3,7 @@
 // RUN: not ld.lld %t.o -o %t.so -shared 2>&1 | FileCheck %s
 // CHECK: relocation-past-merge-end.s.tmp.o(.foo): entry is past the end of the section
 
-        .data
-        .long .foo + 1
-        .section       .foo,"aM",@progbits,4
+.data
+.long .foo + 10
+.section       .foo,"aM",@progbits,4
+.quad 0
index 431cb62..3006fa3 100644 (file)
@@ -4,3 +4,4 @@
 // CHECK: writable SHF_MERGE section is not supported
 
 .section .foo,"awM",@progbits,4
+.quad 0