[llvm] r287619 - MC: ensure that we have a section before accessing it

Saleem Abdulrasool via llvm-commits llvm-commits at lists.llvm.org
Mon Nov 21 20:32:55 PST 2016


Author: compnerd
Date: Mon Nov 21 22:32:54 2016
New Revision: 287619

URL: http://llvm.org/viewvc/llvm-project?rev=287619&view=rev
Log:
MC: ensure that we have a section before accessing it

We would attempt to access the symbol section without ensuring that the symbol
was not absolute.  When the assembler referenced relocation is not evaluated to
the absolute, but when we record the relocation, we would query the section.
Because the symbol is absolute, it does not have a section associated with it,
triggering an assertion.  Just be more careful about the access of the section.

Addresses PR31064!

Added:
    llvm/trunk/test/MC/ARM/ehabi-personality-abs.s
Modified:
    llvm/trunk/lib/MC/ELFObjectWriter.cpp

Modified: llvm/trunk/lib/MC/ELFObjectWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/ELFObjectWriter.cpp?rev=287619&r1=287618&r2=287619&view=diff
==============================================================================
--- llvm/trunk/lib/MC/ELFObjectWriter.cpp (original)
+++ llvm/trunk/lib/MC/ELFObjectWriter.cpp Mon Nov 21 22:32:54 2016
@@ -568,25 +568,27 @@ bool ELFObjectWriter::shouldRelocateWith
   // If we change such a relocation to use the section, the linker would think
   // that it pointed to another string and subtracting 42 at runtime will
   // produce the wrong value.
-  auto &Sec = cast<MCSectionELF>(Sym->getSection());
-  unsigned Flags = Sec.getFlags();
-  if (Flags & ELF::SHF_MERGE) {
-    if (C != 0)
-      return true;
+  if (Sym->isInSection()) {
+    auto &Sec = cast<MCSectionELF>(Sym->getSection());
+    unsigned Flags = Sec.getFlags();
+    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;
+    }
 
-    // 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())
+    // Most TLS relocations use a got, so they need the symbol. Even those that
+    // are just an offset (@tpoff), require a symbol in gold versions before
+    // 5efeedf61e4fe720fd3e9a08e6c91c10abb66d42 (2014-09-26) which fixed
+    // http://sourceware.org/PR16773.
+    if (Flags & ELF::SHF_TLS)
       return true;
   }
 
-  // Most TLS relocations use a got, so they need the symbol. Even those that
-  // are just an offset (@tpoff), require a symbol in gold versions before
-  // 5efeedf61e4fe720fd3e9a08e6c91c10abb66d42 (2014-09-26) which fixed
-  // http://sourceware.org/PR16773.
-  if (Flags & ELF::SHF_TLS)
-    return true;
-
   // If the symbol is a thumb function the final relocation must set the lowest
   // bit. With a symbol that is done by just having the symbol have that bit
   // set, so we would lose the bit if we relocated with the section.

Added: llvm/trunk/test/MC/ARM/ehabi-personality-abs.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/ehabi-personality-abs.s?rev=287619&view=auto
==============================================================================
--- llvm/trunk/test/MC/ARM/ehabi-personality-abs.s (added)
+++ llvm/trunk/test/MC/ARM/ehabi-personality-abs.s Mon Nov 21 22:32:54 2016
@@ -0,0 +1,13 @@
+@ RUN: llvm-mc -triple armv7-linux -filetype obj -o - %s | llvm-objdump -triple armv7 -D -r - | FileCheck %s
+
+	.text
+
+__aeabi_unwind_cpp_pr0 = 0xdeadbeef
+
+f:
+	.fnstart
+	bx lr
+	.fnend
+
+@ CHECK: R_ARM_NONE __aeabi_unwind_cpp_pr0
+




More information about the llvm-commits mailing list