}
Addstring(shstrtab, ".elfdata")
Addstring(shstrtab, ".rodata")
- if Buildmode == BuildmodeShared || Buildmode == BuildmodeCShared {
- Addstring(shstrtab, ".data.rel.ro")
- }
// See the comment about data.rel.ro.FOO section names in data.go.
relro_prefix := ""
-
if UseRelro() {
+ Addstring(shstrtab, ".data.rel.ro")
relro_prefix = ".data.rel.ro"
}
Addstring(shstrtab, relro_prefix+".typelink")
// UseRelro returns whether to make use of "read only relocations" aka
// relro.
func UseRelro() bool {
- return (Buildmode == BuildmodeCShared || Buildmode == BuildmodeShared) && Iself
+ switch Buildmode {
+ case BuildmodeCShared, BuildmodeShared, BuildmodePIE:
+ return Iself
+ default:
+ return false
+ }
}
var (
const (
BuildmodeUnset BuildMode = iota
BuildmodeExe
+ BuildmodePIE
BuildmodeCArchive
BuildmodeCShared
BuildmodeShared
return fmt.Errorf("invalid buildmode: %q", s)
case "exe":
*mode = BuildmodeExe
+ case "pie":
+ switch goos {
+ case "android":
+ default:
+ return badmode()
+ }
+ *mode = BuildmodePIE
case "c-archive":
switch goos {
case "darwin", "linux":
return "" // avoid showing a default in usage message
case BuildmodeExe:
return "exe"
+ case BuildmodePIE:
+ return "pie"
case BuildmodeCArchive:
return "c-archive"
case BuildmodeCShared:
switch Buildmode {
case BuildmodeCShared, BuildmodeCArchive:
INITENTRY = fmt.Sprintf("_rt0_%s_%s_lib", goarch, goos)
- case BuildmodeExe:
+ case BuildmodeExe, BuildmodePIE:
INITENTRY = fmt.Sprintf("_rt0_%s_%s", goarch, goos)
case BuildmodeShared:
// No INITENTRY for -buildmode=shared
// binaries, so leave it enabled on OS X (Mach-O) binaries.
// Also leave it enabled on Solaris which doesn't support
// statically linked binaries.
- if Buildmode == BuildmodeExe && havedynamic == 0 && HEADTYPE != obj.Hdarwin && HEADTYPE != obj.Hsolaris {
- Debug['d'] = 1
+ switch Buildmode {
+ case BuildmodeExe, BuildmodePIE:
+ if havedynamic == 0 && HEADTYPE != obj.Hdarwin && HEADTYPE != obj.Hsolaris {
+ Debug['d'] = 1
+ }
}
importcycles()
if HEADTYPE == obj.Hdarwin {
argv = append(argv, "-Wl,-pagezero_size,4000000")
}
+ case BuildmodePIE:
+ argv = append(argv, "-pie")
case BuildmodeCShared:
if HEADTYPE == obj.Hdarwin {
argv = append(argv, "-dynamiclib")
// pseudo-symbols to mark locations of type, string, and go string data.
var symtype *LSym
var symtyperel *LSym
- if UseRelro() && Buildmode == BuildmodeCShared {
+ if UseRelro() && (Buildmode == BuildmodeCShared || Buildmode == BuildmodePIE) {
s = Linklookup(Ctxt, "type.*", 0)
s.Type = obj.STYPE
adduint(Ctxt, moduledata, uint64(ntypelinks))
if len(Ctxt.Shlibs) > 0 {
thismodulename := filepath.Base(outfile)
- if Buildmode == BuildmodeExe {
+ switch Buildmode {
+ case BuildmodeExe, BuildmodePIE:
// When linking an executable, outfile is just "a.out". Make
// it something slightly more comprehensible.
thismodulename = "the executable"