mirror of https://github.com/golang/go.git
cmd/link: align .reloc block starts by 32 bits for PE target
Tweak the code that emits the PE ".reloc" section on Windows to ensure that each relocation block is 32-bit aligned, which is required by the PE standard. Fixes #68260. Change-Id: I39b75a7491b00fa97871aebb90d3be0ec09f9c40 Reviewed-on: https://go-review.googlesource.com/c/go/+/595896 Reviewed-by: Cherry Mui <cherryyz@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
This commit is contained in:
parent
d3c93f2f00
commit
f71c00b616
|
|
@ -1548,8 +1548,21 @@ func (rt *peBaseRelocTable) write(ctxt *Link) {
|
||||||
// sort the pages array
|
// sort the pages array
|
||||||
sort.Sort(rt.pages)
|
sort.Sort(rt.pages)
|
||||||
|
|
||||||
|
// .reloc section must be 32-bit aligned
|
||||||
|
if out.Offset()&3 != 0 {
|
||||||
|
Errorf(nil, "internal error, start of .reloc not 32-bit aligned")
|
||||||
|
}
|
||||||
|
|
||||||
for _, p := range rt.pages {
|
for _, p := range rt.pages {
|
||||||
b := rt.blocks[p]
|
b := rt.blocks[p]
|
||||||
|
|
||||||
|
// Add a dummy entry at the end of the list if we have an
|
||||||
|
// odd number of entries, so as to ensure that the next
|
||||||
|
// block starts on a 32-bit boundary (see issue 68260).
|
||||||
|
if len(b.entries)&1 != 0 {
|
||||||
|
b.entries = append(b.entries, peBaseRelocEntry{})
|
||||||
|
}
|
||||||
|
|
||||||
const sizeOfPEbaseRelocBlock = 8 // 2 * sizeof(uint32)
|
const sizeOfPEbaseRelocBlock = 8 // 2 * sizeof(uint32)
|
||||||
blockSize := uint32(sizeOfPEbaseRelocBlock + len(b.entries)*2)
|
blockSize := uint32(sizeOfPEbaseRelocBlock + len(b.entries)*2)
|
||||||
out.Write32(p)
|
out.Write32(p)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue