From 2496ae99678cbcd9bb6e9d8962e7dffa31d153a4 Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Fri, 21 Sep 2018 14:01:22 +0200 Subject: [PATCH] compiler: emit non-PIE executables This fixes a problem on baremetal targets, where PIE doesn't make any sense. Specifically, on ARM, the compiler sometimes inserted GOT pointers for linker-defined globals. --- compiler.go | 2 +- target.go | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/compiler.go b/compiler.go index ade0b9bd..e3be9067 100644 --- a/compiler.go +++ b/compiler.go @@ -93,7 +93,7 @@ func NewCompiler(pkgName, triple string, dumpSSA bool) (*Compiler, error) { if err != nil { return nil, err } - c.machine = target.CreateTargetMachine(triple, "", "", llvm.CodeGenLevelDefault, llvm.RelocPIC, llvm.CodeModelDefault) + c.machine = target.CreateTargetMachine(triple, "", "", llvm.CodeGenLevelDefault, llvm.RelocStatic, llvm.CodeModelDefault) c.targetData = c.machine.CreateTargetData() c.mod = llvm.NewModule(pkgName) diff --git a/target.go b/target.go index 5a1b3d7c..5f8a43b7 100644 --- a/target.go +++ b/target.go @@ -25,10 +25,11 @@ type TargetSpec struct { // Load a target specification func LoadTarget(target string) (*TargetSpec, error) { spec := &TargetSpec{ - Triple: target, - BuildTags: []string{runtime.GOOS, runtime.GOARCH}, - Linker: "cc", - Objcopy: "objcopy", + Triple: target, + BuildTags: []string{runtime.GOOS, runtime.GOARCH}, + Linker: "cc", + PreLinkArgs: []string{"-no-pie"}, // WARNING: clang < 5.0 requires -nopie + Objcopy: "objcopy", } // See whether there is a target specification for this target (e.g.