<div dir="ltr"><div><div>With this patch a clang linked with lld and the bfd linker script doesn't crash any more when running --help :-)<br><br></div>Cheers,<br></div>Rafael<br> <br></div><div class="gmail_extra"><br><div class="gmail_quote">On 20 September 2016 at 11:22, Rafael Espindola via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: rafael<br>
Date: Tue Sep 20 10:22:27 2016<br>
New Revision: 281978<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=281978&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=281978&view=rev</a><br>
Log:<br>
Disable --rosegment when we have linker scripts.<br>
<br>
Linker scripts are responsible for aliging '.'. Since they are<br>
designed for bfd which has no --rosegment, they don't align the RO to<br>
RX transition.<br>
<br>
Added:<br>
    lld/trunk/test/ELF/<wbr>linkerscript/rosegment.s<br>
Modified:<br>
    lld/trunk/ELF/Writer.cpp<br>
    lld/trunk/test/ELF/<wbr>linkerscript/at.s<br>
    lld/trunk/test/ELF/<wbr>linkerscript/non-alloc.s<br>
    lld/trunk/test/ELF/<wbr>linkerscript/repsection-<wbr>symbol.s<br>
    lld/trunk/test/ELF/<wbr>linkerscript/sizeofheaders.s<br>
    lld/trunk/test/ELF/<wbr>linkerscript/symbol-conflict.s<br>
    lld/trunk/test/ELF/<wbr>linkerscript/symbols-<wbr>synthetic.s<br>
    lld/trunk/test/ELF/<wbr>linkerscript/va.s<br>
<br>
Modified: lld/trunk/ELF/Writer.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=281978&r1=281977&r2=281978&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/ELF/Writer.<wbr>cpp?rev=281978&r1=281977&r2=<wbr>281978&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/ELF/Writer.cpp (original)<br>
+++ lld/trunk/ELF/Writer.cpp Tue Sep 20 10:22:27 2016<br>
@@ -944,6 +944,17 @@ template <class ELFT> static bool needsP<br>
   return true;<br>
 }<br>
<br>
+// Linker scripts are responsible for aligning addresses. Unfortunately, most<br>
+// linker scripts are designed for creating two PT_LOADs only, one RX and one<br>
+// RW. This means that there is no alignment in the RO to RX transition and we<br>
+// cannot create a PT_LOAD there.<br>
+template <class ELFT><br>
+static typename ELFT::uint computeFlags(typename ELFT::uint F) {<br>
+  if (ScriptConfig->HasSections && !(F & PF_W))<br>
+    return F | PF_X;<br>
+  return F;<br>
+}<br>
+<br>
 // Decide which program headers to create and which sections to include in each<br>
 // one.<br>
 template <class ELFT><br>
@@ -966,7 +977,7 @@ std::vector<PhdrEntry<ELFT>> Writer<ELFT<br>
   }<br>
<br>
   // Add the first PT_LOAD segment for regular output sections.<br>
-  uintX_t Flags = PF_R;<br>
+  uintX_t Flags = computeFlags<ELFT>(PF_R);<br>
   Phdr *Load = AddHdr(PT_LOAD, Flags);<br>
   Load->add(Out<ELFT>::<wbr>ElfHeader);<br>
   Load->add(Out<ELFT>::<wbr>ProgramHeaders);<br>
@@ -992,7 +1003,7 @@ std::vector<PhdrEntry<ELFT>> Writer<ELFT<br>
     // Therefore, we need to create a new phdr when the next section has<br>
     // different flags or is loaded at a discontiguous address using AT linker<br>
     // script command.<br>
-    uintX_t NewFlags = Sec->getPhdrFlags();<br>
+    uintX_t NewFlags = computeFlags<ELFT>(Sec-><wbr>getPhdrFlags());<br>
     if (Script<ELFT>::X->getLma(Sec-><wbr>getName()) || Flags != NewFlags) {<br>
       Load = AddHdr(PT_LOAD, NewFlags);<br>
       Flags = NewFlags;<br>
<br>
Modified: lld/trunk/test/ELF/<wbr>linkerscript/at.s<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/at.s?rev=281978&r1=281977&r2=281978&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/test/ELF/<wbr>linkerscript/at.s?rev=281978&<wbr>r1=281977&r2=281978&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/test/ELF/<wbr>linkerscript/at.s (original)<br>
+++ lld/trunk/test/ELF/<wbr>linkerscript/at.s Tue Sep 20 10:22:27 2016<br>
@@ -44,6 +44,7 @@<br>
 # CHECK-NEXT:     MemSize:<br>
 # CHECK-NEXT:     Flags [<br>
 # CHECK-NEXT:       PF_R<br>
+# CHECK-NEXT:       PF_X<br>
 # CHECK-NEXT:     ]<br>
 # CHECK-NEXT:     Alignment:<br>
 # CHECK-NEXT:   }<br>
@@ -56,6 +57,7 @@<br>
 # CHECK-NEXT:     MemSize: 16<br>
 # CHECK-NEXT:     Flags [<br>
 # CHECK-NEXT:       PF_R<br>
+# CHECK-NEXT:       PF_X<br>
 # CHECK-NEXT:     ]<br>
 # CHECK-NEXT:     Alignment:<br>
 # CHECK-NEXT:   }<br>
@@ -68,6 +70,7 @@<br>
 # CHECK-NEXT:     MemSize: 8<br>
 # CHECK-NEXT:     Flags [<br>
 # CHECK-NEXT:       PF_R<br>
+# CHECK-NEXT:       PF_X<br>
 # CHECK-NEXT:     ]<br>
 # CHECK-NEXT:     Alignment: 4096<br>
 # CHECK-NEXT:   }<br>
@@ -76,20 +79,8 @@<br>
 # CHECK-NEXT:     Offset: 0x1018<br>
 # CHECK-NEXT:     VirtualAddress: 0x1018<br>
 # CHECK-NEXT:     PhysicalAddress: 0x4000<br>
-# CHECK-NEXT:     FileSize: 8<br>
-# CHECK-NEXT:     MemSize: 8<br>
-# CHECK-NEXT:     Flags [<br>
-# CHECK-NEXT:       PF_R<br>
-# CHECK-NEXT:     ]<br>
-# CHECK-NEXT:     Alignment: 4096<br>
-# CHECK-NEXT:   }<br>
-# CHECK-NEXT:   ProgramHeader {<br>
-# CHECK-NEXT:     Type: PT_LOAD<br>
-# CHECK-NEXT:     Offset: 0x1020<br>
-# CHECK-NEXT:     VirtualAddress: 0x1020<br>
-# CHECK-NEXT:     PhysicalAddress: 0x1020<br>
-# CHECK-NEXT:     FileSize: 1<br>
-# CHECK-NEXT:     MemSize: 1<br>
+# CHECK-NEXT:     FileSize: 9<br>
+# CHECK-NEXT:     MemSize: 9<br>
 # CHECK-NEXT:     Flags [<br>
 # CHECK-NEXT:       PF_R<br>
 # CHECK-NEXT:       PF_X<br>
<br>
Modified: lld/trunk/test/ELF/<wbr>linkerscript/non-alloc.s<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/non-alloc.s?rev=281978&r1=281977&r2=281978&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/test/ELF/<wbr>linkerscript/non-alloc.s?rev=<wbr>281978&r1=281977&r2=281978&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/test/ELF/<wbr>linkerscript/non-alloc.s (original)<br>
+++ lld/trunk/test/ELF/<wbr>linkerscript/non-alloc.s Tue Sep 20 10:22:27 2016<br>
@@ -11,16 +11,14 @@<br>
 # CHECK: Program Headers:<br>
 # CHECK-NEXT:  Type<br>
 # CHECK-NEXT:  PHDR<br>
-# CHECK-NEXT:  LOAD {{.*}} R<br>
 # CHECK-NEXT:  LOAD {{.*}} R E<br>
 # CHECK-NEXT:  LOAD {{.*}} RW<br>
<br>
 # CHECK:      Section to Segment mapping:<br>
 # CHECK-NEXT:  Segment Sections...<br>
 # CHECK-NEXT:   00<br>
-# CHECK-NEXT:   01     .dynsym .hash .dynstr<br>
-# CHECK-NEXT:   02     .text<br>
-# CHECK-NEXT:   03     .dynamic<br>
+# CHECK-NEXT:   01     .dynsym .hash .dynstr .text<br>
+# CHECK-NEXT:   02     .dynamic<br>
<br>
 nop<br>
 .section foo<br>
<br>
Modified: lld/trunk/test/ELF/<wbr>linkerscript/repsection-<wbr>symbol.s<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/repsection-symbol.s?rev=281978&r1=281977&r2=281978&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/test/ELF/<wbr>linkerscript/repsection-<wbr>symbol.s?rev=281978&r1=281977&<wbr>r2=281978&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/test/ELF/<wbr>linkerscript/repsection-<wbr>symbol.s (original)<br>
+++ lld/trunk/test/ELF/<wbr>linkerscript/repsection-<wbr>symbol.s Tue Sep 20 10:22:27 2016<br>
@@ -6,13 +6,13 @@<br>
 # RUN: llvm-readobj -t %t1 | FileCheck %s<br>
<br>
 # CHECK:      Name: foo1<br>
-# CHECK-NEXT: Value: 0x238<br>
+# CHECK-NEXT: Value: 0x200<br>
<br>
 # CHECK:      Name: foo2<br>
-# CHECK-NEXT: Value: 0x240<br>
+# CHECK-NEXT: Value: 0x208<br>
<br>
 # CHECK:      Name: foo3<br>
-# CHECK-NEXT: Value: 0x244<br>
+# CHECK-NEXT: Value: 0x20C<br>
<br>
 .section .foo.1,"a"<br>
  .long 1<br>
<br>
Added: lld/trunk/test/ELF/<wbr>linkerscript/rosegment.s<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/rosegment.s?rev=281978&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/test/ELF/<wbr>linkerscript/rosegment.s?rev=<wbr>281978&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/test/ELF/<wbr>linkerscript/rosegment.s (added)<br>
+++ lld/trunk/test/ELF/<wbr>linkerscript/rosegment.s Tue Sep 20 10:22:27 2016<br>
@@ -0,0 +1,24 @@<br>
+# REQUIRES: x86<br>
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t<br>
+<br>
+# Test that with linker scripts we don't create a RO PT_LOAD.<br>
+<br>
+# RUN: echo "SECTIONS {}" > %t.script<br>
+# RUN: ld.lld -o %t1 --script %t.script %t -shared<br>
+# RUN: llvm-readobj -l %t1 | FileCheck %s<br>
+<br>
+# CHECK-NOT:  Type: PT_LOAD<br>
+<br>
+# CHECK:      Type: PT_LOAD<br>
+# CHECK:      Flags [<br>
+# CHECK-NEXT:   PF_R<br>
+# CHECK-NEXT:   PF_X<br>
+# CHECK-NEXT: ]<br>
+<br>
+# CHECK:      Type: PT_LOAD<br>
+# CHECK:      Flags [<br>
+# CHECK-NEXT:   PF_R<br>
+# CHECK-NEXT:   PF_W<br>
+# CHECK-NEXT: ]<br>
+<br>
+# CHECK-NOT:  Type: PT_LOAD<br>
<br>
Modified: lld/trunk/test/ELF/<wbr>linkerscript/sizeofheaders.s<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/sizeofheaders.s?rev=281978&r1=281977&r2=281978&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/test/ELF/<wbr>linkerscript/sizeofheaders.s?<wbr>rev=281978&r1=281977&r2=<wbr>281978&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/test/ELF/<wbr>linkerscript/sizeofheaders.s (original)<br>
+++ lld/trunk/test/ELF/<wbr>linkerscript/sizeofheaders.s Tue Sep 20 10:22:27 2016<br>
@@ -10,8 +10,8 @@<br>
<br>
 #CHECK:      SYMBOL TABLE:<br>
 #CHECK-NEXT:  0000000000000000 *UND* 00000000<br>
-#CHECK-NEXT:  0000000000000120 .text 00000000 _start<br>
-#CHECK-NEXT:  0000000000000120 *ABS* 00000000 _size<br>
+#CHECK-NEXT:  00000000000000e8 .text 00000000 _start<br>
+#CHECK-NEXT:  00000000000000e8 *ABS* 00000000 _size<br>
<br>
 .global _start<br>
 _start:<br>
<br>
Modified: lld/trunk/test/ELF/<wbr>linkerscript/symbol-conflict.s<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/symbol-conflict.s?rev=281978&r1=281977&r2=281978&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/test/ELF/<wbr>linkerscript/symbol-conflict.<wbr>s?rev=281978&r1=281977&r2=<wbr>281978&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/test/ELF/<wbr>linkerscript/symbol-conflict.s (original)<br>
+++ lld/trunk/test/ELF/<wbr>linkerscript/symbol-conflict.s Tue Sep 20 10:22:27 2016<br>
@@ -4,7 +4,7 @@<br>
 # RUN: echo "SECTIONS {.text : {*(.text.*)} end = .;}" > %t.script<br>
 # RUN: ld.lld -o %t1 --script %t.script %t<br>
 # RUN: llvm-objdump -t %t1 | FileCheck %s<br>
-# CHECK: 0000000000000121         *ABS*    00000000 end<br>
+# CHECK: 00000000000000e9         *ABS*    00000000 end<br>
<br>
 .global _start<br>
 _start:<br>
<br>
Modified: lld/trunk/test/ELF/<wbr>linkerscript/symbols-<wbr>synthetic.s<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/symbols-synthetic.s?rev=281978&r1=281977&r2=281978&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/test/ELF/<wbr>linkerscript/symbols-<wbr>synthetic.s?rev=281978&r1=<wbr>281977&r2=281978&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/test/ELF/<wbr>linkerscript/symbols-<wbr>synthetic.s (original)<br>
+++ lld/trunk/test/ELF/<wbr>linkerscript/symbols-<wbr>synthetic.s Tue Sep 20 10:22:27 2016<br>
@@ -40,18 +40,18 @@<br>
 # RUN:         }" > %t.script<br>
 # RUN: ld.lld -o %t1 --eh-frame-hdr --script %t.script %t<br>
<br>
-# SIMPLE:      0000000000000160         .foo    00000000 .hidden _end_sec<br>
-# SIMPLE-NEXT: 0000000000000158         .foo    00000000 _begin_sec<br>
-# SIMPLE-NEXT: 0000000000000160         *ABS*   00000000 _end_sec_abs<br>
+# SIMPLE:      0000000000000128         .foo    00000000 .hidden _end_sec<br>
+# SIMPLE-NEXT: 0000000000000120         .foo    00000000 _begin_sec<br>
+# SIMPLE-NEXT: 0000000000000128         *ABS*   00000000 _end_sec_abs<br>
 # SIMPLE-NEXT: 0000000000001048         .text   00000000 _start<br>
-# SIMPLE-NEXT: 0000000000000158         .foo    00000000 begin_foo<br>
-# SIMPLE-NEXT: 0000000000000160         .foo    00000000 end_foo<br>
+# SIMPLE-NEXT: 0000000000000120         .foo    00000000 begin_foo<br>
+# SIMPLE-NEXT: 0000000000000128         .foo    00000000 end_foo<br>
 # SIMPLE-NEXT: 0000000000000008         .foo    00000000 size_foo_1<br>
 # SIMPLE-NEXT: 0000000000000008         *ABS*   00000000 size_foo_1_abs<br>
 # SIMPLE-NEXT: 0000000000001000         .foo    00000000 begin_bar<br>
 # SIMPLE-NEXT: 0000000000001004         .foo    00000000 end_bar<br>
-# SIMPLE-NEXT: 0000000000000eac         .foo    00000000 size_foo_2<br>
-# SIMPLE-NEXT: 0000000000000eac         *ABS*   00000000 size_foo_3<br>
+# SIMPLE-NEXT: 0000000000000ee4         .foo    00000000 size_foo_2<br>
+# SIMPLE-NEXT: 0000000000000ee4         *ABS*   00000000 size_foo_3<br>
 # SIMPLE-NEXT: 0000000000001004         .eh_frame_hdr     00000000 __eh_frame_hdr_start<br>
 # SIMPLE-NEXT: 0000000000001010         *ABS*             00000000 __eh_frame_hdr_start2<br>
 # SIMPLE-NEXT: 0000000000001018         .eh_frame_hdr     00000000 __eh_frame_hdr_end<br>
<br>
Modified: lld/trunk/test/ELF/<wbr>linkerscript/va.s<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/va.s?rev=281978&r1=281977&r2=281978&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/test/ELF/<wbr>linkerscript/va.s?rev=281978&<wbr>r1=281977&r2=281978&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/test/ELF/<wbr>linkerscript/va.s (original)<br>
+++ lld/trunk/test/ELF/<wbr>linkerscript/va.s Tue Sep 20 10:22:27 2016<br>
@@ -7,9 +7,9 @@<br>
 # CHECK:      Sections:<br>
 # CHECK-NEXT: Idx Name          Size      Address          Type<br>
 # CHECK-NEXT:   0               00000000 0000000000000000<br>
-# CHECK-NEXT:   1 .foo          00000004 0000000000000120 DATA<br>
-# CHECK-NEXT:   2 .boo          00000004 0000000000000124 DATA<br>
-# CHECK-NEXT:   3 .text         00000001 0000000000000128 TEXT DATA<br>
+# CHECK-NEXT:   1 .foo          00000004 00000000000000e8 DATA<br>
+# CHECK-NEXT:   2 .boo          00000004 00000000000000ec DATA<br>
+# CHECK-NEXT:   3 .text         00000001 00000000000000f0 TEXT DATA<br>
<br>
 .global _start<br>
 _start:<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>