1
0
mirror of https://github.com/golang/go synced 2024-11-19 14:24:47 -07:00

cmd/link: introduce and use peFile.writeSymbol

Change-Id: I9fcae7bfd647b52d9b4f36f04710ba7921609c02
Reviewed-on: https://go-review.googlesource.com/59422
Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
Alex Brainman 2017-08-28 13:29:28 +10:00
parent 72967551e5
commit 6f299c7f7e

View File

@ -475,6 +475,7 @@ type peFile struct {
ctorsSect *peSection
nextSectOffset uint32
nextFileOffset uint32
symbolCount int // number of symbol table records written
}
// addSection adds section to the COFF file f.
@ -648,6 +649,26 @@ dwarfLoop:
})
}
// writeSymbol appends symbol s to file f symbol table.
// It also sets s.Dynid to written symbol number.
func (f *peFile) writeSymbol(s *Symbol, value int64, sectidx int, typ uint16, class uint8) {
if len(s.Name) > 8 {
Lputl(0)
Lputl(uint32(f.stringTable.add(s.Name)))
} else {
strnput(s.Name, 8)
}
Lputl(uint32(value))
Wputl(uint16(sectidx))
Wputl(typ)
Cput(class)
Cput(0) // no aux entries
s.Dynid = int32(f.symbolCount)
f.symbolCount++
}
var pefile peFile
func Peinit(ctxt *Link) {
@ -1033,28 +1054,7 @@ func (ctxt *Link) dope() {
}
// writePESymTableRecords writes all COFF symbol table records.
// It returns number of records written.
func writePESymTableRecords(ctxt *Link) int {
var symcnt int
writeOneSymbol := func(s *Symbol, addr int64, sectidx int, typ uint16, class uint8) {
// write COFF symbol table record
if len(s.Name) > 8 {
Lputl(0)
Lputl(uint32(pefile.stringTable.add(s.Name)))
} else {
strnput(s.Name, 8)
}
Lputl(uint32(addr))
Wputl(uint16(sectidx))
Wputl(typ)
Cput(class)
Cput(0) // no aux entries
s.Dynid = int32(symcnt)
symcnt++
}
func writePESymTableRecords(ctxt *Link) {
put := func(ctxt *Link, s *Symbol, name string, type_ SymbolType, addr int64, gotype *Symbol) {
if s == nil {
@ -1107,7 +1107,7 @@ func writePESymTableRecords(ctxt *Link) int {
if s.Version != 0 || (s.Type&SHIDDEN != 0) || s.Attr.Local() {
class = IMAGE_SYM_CLASS_STATIC
}
writeOneSymbol(s, value, sect, typ, uint8(class))
pefile.writeSymbol(s, value, sect, typ, uint8(class))
}
if Linkmode == LinkExternal {
@ -1115,26 +1115,23 @@ func writePESymTableRecords(ctxt *Link) int {
// .ctors and .debug_* section relocations refer to it.
for _, pesect := range pefile.sections {
sym := ctxt.Syms.Lookup(pesect.name, 0)
writeOneSymbol(sym, 0, pesect.index, IMAGE_SYM_TYPE_NULL, IMAGE_SYM_CLASS_STATIC)
pefile.writeSymbol(sym, 0, pesect.index, IMAGE_SYM_TYPE_NULL, IMAGE_SYM_CLASS_STATIC)
}
}
genasmsym(ctxt, put)
return symcnt
}
func addpesymtable(ctxt *Link) {
symtabStartPos := coutbuf.Offset()
// write COFF symbol table
var symcnt int
if !*FlagS || Linkmode == LinkExternal {
symcnt = writePESymTableRecords(ctxt)
writePESymTableRecords(ctxt)
}
// update COFF file header and section table
size := pefile.stringTable.size() + 18*symcnt
size := pefile.stringTable.size() + 18*pefile.symbolCount
var h *peSection
if Linkmode != LinkExternal {
// We do not really need .symtab for go.o, and if we have one, ld
@ -1144,7 +1141,7 @@ func addpesymtable(ctxt *Link) {
h.checkOffset(symtabStartPos)
}
fh.PointerToSymbolTable = uint32(symtabStartPos)
fh.NumberOfSymbols = uint32(symcnt)
fh.NumberOfSymbols = uint32(pefile.symbolCount)
// write COFF string table
pefile.stringTable.write()