[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