aboutsummaryrefslogtreecommitdiff
path: root/compiler_wrapper/pie_flags.go
blob: 9675f6ee65e46992f496105ee3af4b99871d23c2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// Copyright 2019 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package main

func processPieFlags(builder *commandBuilder) {
	fpieMap := map[string]bool{"-D__KERNEL__": true, "-fPIC": true, "-fPIE": true, "-fno-PIC": true, "-fno-PIE": true,
		"-fno-pic": true, "-fno-pie": true, "-fpic": true, "-fpie": true, "-nopie": true,
		"-nostartfiles": true, "-nostdlib": true, "-pie": true, "-static": true}

	pieMap := map[string]bool{"-D__KERNEL__": true, "-A": true, "-fno-PIC": true, "-fno-PIE": true, "-fno-pic": true, "-fno-pie": true,
		"-nopie": true, "-nostartfiles": true, "-nostdlib": true, "-pie": true, "-r": true, "--shared": true,
		"-shared": true, "-static": true}

	pie := false
	fpie := false
	if builder.target.abi != "eabi" {
		for _, arg := range builder.args {
			if arg.fromUser {
				if fpieMap[arg.value] {
					fpie = true
				}
				if pieMap[arg.value] {
					pie = true
				}
			}
		}
	}
	builder.transformArgs(func(arg builderArg) string {
		// Remove -nopie as it is a non-standard flag.
		if arg.value == "-nopie" {
			return ""
		}
		if fpie && !arg.fromUser && arg.value == "-fPIE" {
			return ""
		}
		if pie && !arg.fromUser && arg.value == "-pie" {
			return ""
		}
		return arg.value
	})
}