OSDN Git Service

Work around gold bug http://sourceware.org/PR16794.
authorRafael Espindola <rafael.espindola@gmail.com>
Wed, 2 Apr 2014 12:15:20 +0000 (12:15 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Wed, 2 Apr 2014 12:15:20 +0000 (12:15 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@205416 91177308-0d34-0410-b5e6-96231b3b80d8

lib/MC/ELFObjectWriter.cpp
test/MC/ELF/basic-elf-32.s
test/MC/ELF/relocation-386.s

index d8f03fc..e9b8fe2 100644 (file)
@@ -796,6 +796,11 @@ bool ELFObjectWriter::shouldRelocateWithSymbol(const MCSymbolRefExpr *RefA,
   if (Flags & ELF::SHF_MERGE) {
     if (C != 0)
       return true;
+
+    // It looks like gold has a bug (http://sourceware.org/PR16794) and can
+    // only handle section relocations to mergeable sections if using RELA.
+    if (!hasRelocationAddend())
+      return true;
   }
 
   // Most TLS relocations use a got, so they need the symbol. Even those that
index 1f618e1..e12fc52 100644 (file)
@@ -46,9 +46,9 @@ main:                                   # @main
 
 // CHECK: Relocations [
 // CHECK:   Section (2) .rel.text {
-// CHECK:     0x6  R_386_32   .rodata.str1.1
+// CHECK:     0x6  R_386_32   .L.str1
 // CHECK:     0xB  R_386_PC32 puts
-// CHECK:     0x12 R_386_32   .rodata.str1.1
+// CHECK:     0x12 R_386_32   .L.str2
 // CHECK:     0x17 R_386_PC32 puts
 // CHECK:   }
 // CHECK: ]
index 1409465..4ddfd00 100644 (file)
@@ -5,7 +5,7 @@
 
 // CHECK:      Relocations [
 // CHECK-NEXT:   Section (2) .rel.text {
-// CHECK-NEXT:     0x2          R_386_GOTOFF     .rodata.str1.16 0x0
+// CHECK-NEXT:     0x2          R_386_GOTOFF     .Lfoo 0x0
 // CHECK-NEXT:     0x{{[^ ]+}}  R_386_PLT32      bar2 0x0
 // CHECK-NEXT:     0x{{[^ ]+}}  R_386_GOTPC      _GLOBAL_OFFSET_TABLE_ 0x0
 // Relocation 3 (bar3@GOTOFF) is done with symbol 7 (bss)