[PATCH] D27297: [ELF] - Disable relro when -omagic specified.

George Rimar via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Dec 1 03:01:02 PST 2016


grimar created this revision.
grimar added reviewers: ruiu, rafael.
grimar added subscribers: llvm-commits, grimar, emaste, evgeny777.

It was noticed on review page for https://reviews.llvm.org/D26888 (-N) by Ed Maste that we have relro enabled.

Before this patch output from testcase binary was:

  Sections:
  Idx Name          Size      Address          Type
    0               00000000 0000000000000000
    1 .dynsym       00000048 0000000000200158
    2 .hash         00000020 00000000002001a0
    3 .dynstr       00000021 00000000002001c0
    4 .rela.dyn     00000018 00000000002001e8
    5 .rela.plt     00000018 0000000000200200
    6 .text         0000000a 0000000000200218 TEXT DATA
    7 .plt          00000020 0000000000200230 TEXT DATA
    8 .dynamic      000000f0 0000000000200250
    9 .got          00000008 0000000000200340 DATA
   10 .data         00000008 0000000000201000 DATA
   11 .foo          00000004 0000000000201008 DATA
   12 .got.plt      00000020 0000000000201010 DATA
   13 .comment      00000008 0000000000000000
   14 .symtab       00000060 0000000000000000
   15 .shstrtab     0000007b 0000000000000000
   16 .strtab       00000013 0000000000000000
  
    ProgramHeader {
      Type: PT_GNU_RELRO (0x6474E552)
      Offset: 0x250
      VirtualAddress: 0x200250
      PhysicalAddress: 0x200250
      FileSize: 248
      MemSize: 248
      Flags [ (0x4)
        PF_R (0x4)
      ]
      Alignment: 1
    }

Noticable here that .data section (first section after relro) is aligned to page. 
That is probably not expected behavior with omagic, that says that text and data segments should not be
 aligned (I would expect no page alignment for sections either).
Also with omagic we do not page align writable segment, PT_GNU_RELRO starts from 0x200250, 
somewhere at the middle of PT_LOAD,
If dynamic linker will apply relro, it probably will round down start address to 200000 to mark it readonly.
Not sure if something bad happens here since sections
there are already non writable ("a", "ax"), but anyways that probably does not look technically correct to do.


https://reviews.llvm.org/D27297

Files:
  ELF/Driver.cpp
  test/ELF/relro-omagic.s


Index: test/ELF/relro-omagic.s
===================================================================
--- test/ELF/relro-omagic.s
+++ test/ELF/relro-omagic.s
@@ -0,0 +1,34 @@
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %p/Inputs/shared.s -o %t2.o
+# RUN: ld.lld -shared %t2.o -o %t2.so
+# RUN: ld.lld -N %t.o %t2.so -o %t
+# RUN: llvm-objdump -section-headers %t | FileCheck --check-prefix=NORELRO %s
+# RUN: llvm-readobj --program-headers %t | FileCheck --check-prefix=NOPHDRS %s
+
+# NORELRO:      Sections:
+# NORELRO-NEXT: Idx Name          Size      Address          Type
+# NORELRO-NEXT:   0               00000000 0000000000000000
+# NORELRO-NEXT:   1 .dynsym       00000048 0000000000200120
+# NORELRO-NEXT:   2 .hash         00000020 0000000000200168
+# NORELRO-NEXT:   3 .dynstr       00000021 0000000000200188
+# NORELRO-NEXT:   4 .rela.dyn     00000018 00000000002001b0
+# NORELRO-NEXT:   5 .rela.plt     00000018 00000000002001c8
+# NORELRO-NEXT:   6 .text         0000000a 00000000002001e0 TEXT DATA
+# NORELRO-NEXT:   7 .plt          00000020 00000000002001f0 TEXT DATA
+# NORELRO-NEXT:   8 .data         00000008 0000000000200210 DATA
+# NORELRO-NEXT:   9 .foo          00000004 0000000000200218 DATA
+# NORELRO-NEXT:  10 .dynamic      000000f0 0000000000200220
+# NORELRO-NEXT:  11 .got          00000008 0000000000200310 DATA
+# NORELRO-NEXT:  12 .got.plt      00000020 0000000000200318 DATA
+
+# NOPHDRS:     ProgramHeaders [
+# NOPHDRS-NOT: PT_GNU_RELRO
+
+.long bar
+jmp *bar2 at GOTPCREL(%rip)
+
+.section .data,"aw"
+.quad 0
+
+.section .foo,"aw"
+.zero 4
Index: ELF/Driver.cpp
===================================================================
--- ELF/Driver.cpp
+++ ELF/Driver.cpp
@@ -575,6 +575,9 @@
   Config->Target2 = getTarget2Option(Args);
   Config->UnresolvedSymbols = getUnresolvedSymbolOption(Args);
 
+  if (Config->OMagic)
+    Config->ZRelro = false;
+
   if (!Config->Relocatable)
     Config->Strip = getStripOption(Args);
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D27297.79882.patch
Type: text/x-patch
Size: 2045 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161201/bdb532a9/attachment.bin>


More information about the llvm-commits mailing list