From d250618c3e7538a78d28cec0189ac23559b2d5a2 Mon Sep 17 00:00:00 2001 From: George Rimar Date: Sat, 3 Dec 2016 07:09:28 +0000 Subject: [PATCH] [ELF] - Disable relro when -omagic specified. --omagic is an option to create old-fashioned executables in which .text segments are writable. Today, the option is still in use to create special-purpose programs such as boot loaders. It doesn't make sense to create PT_GNU_RELRO for such executables. DIfferential revision: https://reviews.llvm.org/D27297 llvm-svn: 288579 --- lld/ELF/Driver.cpp | 7 +++++++ lld/test/ELF/relro-omagic.s | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 lld/test/ELF/relro-omagic.s diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index b179347d4794..48e5ad7ede2e 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -575,6 +575,13 @@ void LinkerDriver::readConfigs(opt::InputArgList &Args) { Config->Target2 = getTarget2Option(Args); Config->UnresolvedSymbols = getUnresolvedSymbolOption(Args); + // --omagic is an option to create old-fashioned executables in which + // .text segments are writable. Today, the option is still in use to + // create special-purpose programs such as boot loaders. It doesn't + // make sense to create PT_GNU_RELRO for such executables. + if (Config->OMagic) + Config->ZRelro = false; + if (!Config->Relocatable) Config->Strip = getStripOption(Args); diff --git a/lld/test/ELF/relro-omagic.s b/lld/test/ELF/relro-omagic.s new file mode 100644 index 000000000000..35a92db2f07a --- /dev/null +++ b/lld/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@GOTPCREL(%rip) + +.section .data,"aw" +.quad 0 + +.section .foo,"aw" +.zero 4