Skip to content

Commit

Permalink
[X86][ELF][CET] Adding the .note.gnu.property ELF section in X86
Browse files Browse the repository at this point in the history
In preparation for the proposed linker ABI changes
(https://github.com/hjl-tools/linux-abi/wiki/linux-abi-draft.pdf,
https://github.com/hjl-tools/x86-psABI/wiki/x86-64-psABI-cet.pdf),
this patch enables emission of the .note.gnu.property section to
ELF object files when building CET-enabled modules.

patch by mike.dvoretsky

Differential Revision: https://reviews.llvm.org/D47145

llvm-svn: 333951
  • Loading branch information
Alexander Ivchenko committed Jun 4, 2018
1 parent 87f1a24 commit 2f038c4
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 0 deletions.
38 changes: 38 additions & 0 deletions llvm/lib/Target/X86/X86AsmPrinter.cpp
Expand Up @@ -19,6 +19,7 @@
#include "X86InstrInfo.h"
#include "X86MachineFunctionInfo.h"
#include "llvm/BinaryFormat/COFF.h"
#include "llvm/BinaryFormat/ELF.h"
#include "llvm/CodeGen/MachineConstantPool.h"
#include "llvm/CodeGen/MachineModuleInfoImpls.h"
#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
Expand All @@ -30,6 +31,7 @@
#include "llvm/MC/MCContext.h"
#include "llvm/MC/MCExpr.h"
#include "llvm/MC/MCSectionCOFF.h"
#include "llvm/MC/MCSectionELF.h"
#include "llvm/MC/MCSectionMachO.h"
#include "llvm/MC/MCStreamer.h"
#include "llvm/MC/MCSymbol.h"
Expand Down Expand Up @@ -539,6 +541,42 @@ bool X86AsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI,
void X86AsmPrinter::EmitStartOfAsmFile(Module &M) {
const Triple &TT = TM.getTargetTriple();

if (TT.isOSBinFormatELF()) {
// Assemble feature flags that may require creation of a note section.
unsigned FeatureFlagsAnd = 0;
if (M.getModuleFlag("cf-protection-branch"))
FeatureFlagsAnd |= ELF::GNU_PROPERTY_X86_FEATURE_1_IBT;
if (M.getModuleFlag("cf-protection-return"))
FeatureFlagsAnd |= ELF::GNU_PROPERTY_X86_FEATURE_1_SHSTK;

if (FeatureFlagsAnd) {
// Emit a .note.gnu.property section with the flags.
if (!TT.isArch32Bit() && !TT.isArch64Bit())
llvm_unreachable("CFProtection used on invalid architecture!");
MCSection *Cur = OutStreamer->getCurrentSectionOnly();
MCSection *Nt = MMI->getContext().getELFSection(
".note.gnu.property", ELF::SHT_NOTE, ELF::SHF_ALLOC);
OutStreamer->SwitchSection(Nt);

// Emitting note header.
int WordSize = TT.isArch64Bit() ? 8 : 4;
EmitAlignment(WordSize == 4 ? 2 : 3);
OutStreamer->EmitIntValue(4, 4 /*size*/); // data size for "GNU\0"
OutStreamer->EmitIntValue(8 + WordSize, 4 /*size*/); // Elf_Prop size
OutStreamer->EmitIntValue(ELF::NT_GNU_PROPERTY_TYPE_0, 4 /*size*/);
OutStreamer->EmitBytes(StringRef("GNU", 4)); // note name

// Emitting an Elf_Prop for the CET properties.
OutStreamer->EmitIntValue(ELF::GNU_PROPERTY_X86_FEATURE_1_AND, 4);
OutStreamer->EmitIntValue(WordSize, 4); // data size
OutStreamer->EmitIntValue(FeatureFlagsAnd, WordSize); // data
EmitAlignment(WordSize == 4 ? 2 : 3); // padding

OutStreamer->endSection(Nt);
OutStreamer->SwitchSection(Cur);
}
}

if (TT.isOSBinFormatMachO())
OutStreamer->SwitchSection(getObjFileLowering().getTextSection());

Expand Down
32 changes: 32 additions & 0 deletions llvm/test/CodeGen/X86/note-cet-property.ll
@@ -0,0 +1,32 @@
; RUN: llc -mtriple i686-pc-linux < %s | FileCheck %s --check-prefix=X86
; RUN: llc -mtriple x86_64-pc-linux < %s | FileCheck %s --check-prefix=X86_64

; This test checks that the compiler emits a .note.gnu.property section for
; modules with "cf-protection" module flags.

; X86: .section .note.gnu.property,"a",@note
; X86-NEXT: .p2align 2
; X86-NEXT: .long 4
; X86-NEXT: .long 12
; X86-NEXT: .long 5
; X86-NEXT: .asciz "GNU"
; X86-NEXT: .long 3221225474
; X86-NEXT: .long 4
; X86-NEXT: .long 3
; X86-NEXT: .p2align 2

; X86_64: .section .note.gnu.property,"a",@note
; X86_64-NEXT: .p2align 3
; X86_64-NEXT: .long 4
; X86_64-NEXT: .long 16
; X86_64-NEXT: .long 5
; X86_64-NEXT: .asciz "GNU"
; X86_64-NEXT: .long 3221225474
; X86_64-NEXT: .long 8
; X86_64-NEXT: .quad 3
; X86_64-NEXT: .p2align 3

!llvm.module.flags = !{!0, !1}

!0 = !{i32 4, !"cf-protection-return", i32 1}
!1 = !{i32 4, !"cf-protection-branch", i32 1}

0 comments on commit 2f038c4

Please sign in to comment.