From: David Crawshaw Date: Tue, 6 Sep 2016 12:02:30 +0000 (-0400) Subject: cmd/link: mark rel.ro segment as PT_GNU_RELRO X-Git-Tag: go1.8beta1~1387 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=d9d1399eeac037f4e2057d32831e574c0f1e6fc8;p=gostls13.git cmd/link: mark rel.ro segment as PT_GNU_RELRO Details: http://www.airs.com/blog/archives/189 Part of adding PIE internal linking on linux/amd64. Change-Id: I8843a97f22f6f120346cccd694c7fff32f09f60b Reviewed-on: https://go-review.googlesource.com/28541 Reviewed-by: Ian Lance Taylor Run-TryBot: David Crawshaw TryBot-Result: Gobot Gobot --- diff --git a/src/cmd/link/internal/ld/elf.go b/src/cmd/link/internal/ld/elf.go index 6d09d173b8..3e027c6a08 100644 --- a/src/cmd/link/internal/ld/elf.go +++ b/src/cmd/link/internal/ld/elf.go @@ -236,6 +236,7 @@ const ( PT_LOPROC = 0x70000000 PT_HIPROC = 0x7fffffff PT_GNU_STACK = 0x6474e551 + PT_GNU_RELRO = 0x6474e552 PT_PAX_FLAGS = 0x65041580 PF_X = 0x1 PF_W = 0x2 @@ -1599,6 +1600,17 @@ func elfphload(ctxt *Link, seg *Segment) *ElfPhdr { return ph } +func elfphrelro(ctxt *Link, seg *Segment) { + ph := newElfPhdr(ctxt) + ph.type_ = PT_GNU_RELRO + ph.vaddr = seg.Vaddr + ph.paddr = seg.Vaddr + ph.memsz = seg.Length + ph.off = seg.Fileoff + ph.filesz = seg.Filelen + ph.align = uint64(*FlagRound) +} + func elfshname(ctxt *Link, name string) *ElfShdr { var off int var sh *ElfShdr @@ -2291,6 +2303,7 @@ func Asmbelf(ctxt *Link, symo int64) { } if Segrelrodata.Sect != nil { elfphload(ctxt, &Segrelrodata) + elfphrelro(ctxt, &Segrelrodata) } elfphload(ctxt, &Segdata)