Commit cb3fe3aa authored by Alex Brainman's avatar Alex Brainman

cmd/link: introduce and use peFile.dataDirectory

Change-Id: I61f64287a488ed82e71639540697b6ade5a0426a
Reviewed-on: https://go-review.googlesource.com/59428Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
parent ac9be202
...@@ -15,11 +15,6 @@ import ( ...@@ -15,11 +15,6 @@ import (
"strings" "strings"
) )
type IMAGE_DATA_DIRECTORY struct {
VirtualAddress uint32
Size uint32
}
type IMAGE_OPTIONAL_HEADER struct { type IMAGE_OPTIONAL_HEADER struct {
Magic uint16 Magic uint16
MajorLinkerVersion uint8 MajorLinkerVersion uint8
...@@ -51,7 +46,7 @@ type IMAGE_OPTIONAL_HEADER struct { ...@@ -51,7 +46,7 @@ type IMAGE_OPTIONAL_HEADER struct {
SizeOfHeapCommit uint32 SizeOfHeapCommit uint32
LoaderFlags uint32 LoaderFlags uint32
NumberOfRvaAndSizes uint32 NumberOfRvaAndSizes uint32
DataDirectory [16]IMAGE_DATA_DIRECTORY DataDirectory [16]pe.DataDirectory
} }
type IMAGE_IMPORT_DESCRIPTOR struct { type IMAGE_IMPORT_DESCRIPTOR struct {
...@@ -160,7 +155,7 @@ type PE64_IMAGE_OPTIONAL_HEADER struct { ...@@ -160,7 +155,7 @@ type PE64_IMAGE_OPTIONAL_HEADER struct {
SizeOfHeapCommit uint64 SizeOfHeapCommit uint64
LoaderFlags uint32 LoaderFlags uint32
NumberOfRvaAndSizes uint32 NumberOfRvaAndSizes uint32
DataDirectory [16]IMAGE_DATA_DIRECTORY DataDirectory [16]pe.DataDirectory
} }
// Copyright 2009 The Go Authors. All rights reserved. // Copyright 2009 The Go Authors. All rights reserved.
...@@ -315,8 +310,6 @@ var oh IMAGE_OPTIONAL_HEADER ...@@ -315,8 +310,6 @@ var oh IMAGE_OPTIONAL_HEADER
var oh64 PE64_IMAGE_OPTIONAL_HEADER var oh64 PE64_IMAGE_OPTIONAL_HEADER
var dd []IMAGE_DATA_DIRECTORY
type Imp struct { type Imp struct {
s *Symbol s *Symbol
off uint64 off uint64
...@@ -465,6 +458,7 @@ type peFile struct { ...@@ -465,6 +458,7 @@ type peFile struct {
nextFileOffset uint32 nextFileOffset uint32
symtabOffset int64 // offset to the start of symbol table symtabOffset int64 // offset to the start of symbol table
symbolCount int // number of symbol table records written symbolCount int // number of symbol table records written
dataDirectory [16]pe.DataDirectory
} }
// addSection adds section to the COFF file f. // addSection adds section to the COFF file f.
...@@ -819,13 +813,11 @@ func Peinit(ctxt *Link) { ...@@ -819,13 +813,11 @@ func Peinit(ctxt *Link) {
pe64 = 1 pe64 = 1
l = binary.Size(&oh64) l = binary.Size(&oh64)
dd = oh64.DataDirectory[:]
// 32-bit architectures // 32-bit architectures
default: default:
l = binary.Size(&oh) l = binary.Size(&oh)
dd = oh.DataDirectory[:]
} }
if Linkmode == LinkExternal { if Linkmode == LinkExternal {
...@@ -875,8 +867,10 @@ func pewrite() { ...@@ -875,8 +867,10 @@ func pewrite() {
pefile.writeFileHeader() pefile.writeFileHeader()
if pe64 != 0 { if pe64 != 0 {
oh64.DataDirectory = pefile.dataDirectory
binary.Write(&coutbuf, binary.LittleEndian, &oh64) binary.Write(&coutbuf, binary.LittleEndian, &oh64)
} else { } else {
oh.DataDirectory = pefile.dataDirectory
binary.Write(&coutbuf, binary.LittleEndian, &oh) binary.Write(&coutbuf, binary.LittleEndian, &oh)
} }
for _, sect := range pefile.sections { for _, sect := range pefile.sections {
...@@ -1086,10 +1080,10 @@ func addimports(ctxt *Link, datsect *peSection) { ...@@ -1086,10 +1080,10 @@ func addimports(ctxt *Link, datsect *peSection) {
Lputl(0) Lputl(0)
// update data directory // update data directory
dd[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress = isect.VirtualAddress pefile.dataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress = isect.VirtualAddress
dd[IMAGE_DIRECTORY_ENTRY_IMPORT].Size = isect.VirtualSize pefile.dataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size = isect.VirtualSize
dd[IMAGE_DIRECTORY_ENTRY_IAT].VirtualAddress = uint32(dynamic.Value - PEBASE) pefile.dataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].VirtualAddress = uint32(dynamic.Value - PEBASE)
dd[IMAGE_DIRECTORY_ENTRY_IAT].Size = uint32(dynamic.Size) pefile.dataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].Size = uint32(dynamic.Size)
Cseek(endoff) Cseek(endoff)
} }
...@@ -1134,8 +1128,8 @@ func addexports(ctxt *Link) { ...@@ -1134,8 +1128,8 @@ func addexports(ctxt *Link) {
sect.Characteristics = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ sect.Characteristics = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
sect.checkOffset(coutbuf.Offset()) sect.checkOffset(coutbuf.Offset())
va := int(sect.VirtualAddress) va := int(sect.VirtualAddress)
dd[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress = uint32(va) pefile.dataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress = uint32(va)
dd[IMAGE_DIRECTORY_ENTRY_EXPORT].Size = sect.VirtualSize pefile.dataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size = sect.VirtualSize
vaName := va + binary.Size(&e) + nexport*4 vaName := va + binary.Size(&e) + nexport*4
vaAddr := va + binary.Size(&e) vaAddr := va + binary.Size(&e)
...@@ -1231,9 +1225,9 @@ func addpersrc(ctxt *Link) { ...@@ -1231,9 +1225,9 @@ func addpersrc(ctxt *Link) {
h.pad(uint32(rsrcsym.Size)) h.pad(uint32(rsrcsym.Size))
// update data directory // update data directory
dd[IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress = h.VirtualAddress pefile.dataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress = h.VirtualAddress
dd[IMAGE_DIRECTORY_ENTRY_RESOURCE].Size = h.VirtualSize pefile.dataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].Size = h.VirtualSize
} }
func Asmbpe(ctxt *Link) { func Asmbpe(ctxt *Link) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment