Do not handle zero-sized mergeable section as mergeable.

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
This commit is contained in:
Rui Ueyama 2016-08-03 05:28:02 +00:00
parent 2bb23bfc73
commit 3ebc71eb91
4 changed files with 24 additions and 3 deletions

View 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;

View File

@ -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

View 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

View File

@ -4,3 +4,4 @@
// CHECK: writable SHF_MERGE section is not supported
.section .foo,"awM",@progbits,4
.quad 0