From 5f94ff4c8702e05bdee32b4a5dc6f8c736adab38 Mon Sep 17 00:00:00 2001 From: Dave Cheney Date: Wed, 24 Aug 2016 20:27:38 +1000 Subject: [PATCH] cmd/link/internal/ld: move ld.Cpos to coutbuf.Offset This change moves the ld.Cpos function to a method on coutbuf. This is part of a larger change that makes ld.outbuf look more like a bio.Buf in an effort to eventually replace the former with the latter. Change-Id: I506f7131935a2aa903fa302a0fab0c5be50220fd Reviewed-on: https://go-review.googlesource.com/27578 Run-TryBot: Dave Cheney Reviewed-by: David Crawshaw Reviewed-by: Matthew Dempsky --- src/cmd/link/internal/ld/data.go | 6 ++--- src/cmd/link/internal/ld/elf.go | 6 ++--- src/cmd/link/internal/ld/lib.go | 8 +++---- src/cmd/link/internal/ld/macho.go | 10 ++++---- src/cmd/link/internal/ld/pe.go | 39 +++++++++++++++---------------- 5 files changed, 34 insertions(+), 35 deletions(-) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index aeb7a75f1a..3a3cfecd47 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -746,7 +746,7 @@ func Codeblk(ctxt *Link, addr int64, size int64) { } func CodeblkPad(ctxt *Link, addr int64, size int64, pad []byte) { if *flagA { - fmt.Fprintf(ctxt.Bso, "codeblk [%#x,%#x) at offset %#x\n", addr, addr+size, Cpos()) + fmt.Fprintf(ctxt.Bso, "codeblk [%#x,%#x) at offset %#x\n", addr, addr+size, coutbuf.Offset()) } blk(ctxt, ctxt.Textp, addr, size, pad) @@ -857,7 +857,7 @@ func blk(ctxt *Link, syms []*Symbol, addr, size int64, pad []byte) { func Datblk(ctxt *Link, addr int64, size int64) { if *flagA { - fmt.Fprintf(ctxt.Bso, "datblk [%#x,%#x) at offset %#x\n", addr, addr+size, Cpos()) + fmt.Fprintf(ctxt.Bso, "datblk [%#x,%#x) at offset %#x\n", addr, addr+size, coutbuf.Offset()) } blk(ctxt, datap, addr, size, zeros[:]) @@ -928,7 +928,7 @@ func Datblk(ctxt *Link, addr int64, size int64) { func Dwarfblk(ctxt *Link, addr int64, size int64) { if *flagA { - fmt.Fprintf(ctxt.Bso, "dwarfblk [%#x,%#x) at offset %#x\n", addr, addr+size, Cpos()) + fmt.Fprintf(ctxt.Bso, "dwarfblk [%#x,%#x) at offset %#x\n", addr, addr+size, coutbuf.Offset()) } blk(ctxt, dwarfp, addr, size, zeros[:]) diff --git a/src/cmd/link/internal/ld/elf.go b/src/cmd/link/internal/ld/elf.go index 1b041f4499..04d2193b4a 100644 --- a/src/cmd/link/internal/ld/elf.go +++ b/src/cmd/link/internal/ld/elf.go @@ -1729,7 +1729,7 @@ func elfrelocsect(ctxt *Link, sect *Section, syms []*Symbol) { return } - sect.Reloff = uint64(Cpos()) + sect.Reloff = uint64(coutbuf.Offset()) for i, s := range syms { if !s.Attr.Reachable() { continue @@ -1768,11 +1768,11 @@ func elfrelocsect(ctxt *Link, sect *Section, syms []*Symbol) { } } - sect.Rellen = uint64(Cpos()) - sect.Reloff + sect.Rellen = uint64(coutbuf.Offset()) - sect.Reloff } func Elfemitreloc(ctxt *Link) { - for Cpos()&7 != 0 { + for coutbuf.Offset()&7 != 0 { Cput(0) } diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index ba1c6da34f..7a9d806d45 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -229,6 +229,10 @@ func (w *outBuf) WriteString(s string) (n int, err error) { return n, err } +func (w *outBuf) Offset() int64 { + return w.off +} + var coutbuf outBuf const pkgname = "__.PKGDEF" @@ -1771,10 +1775,6 @@ func Cflush() { } } -func Cpos() int64 { - return coutbuf.off -} - func Cseek(p int64) { if p == coutbuf.off { return diff --git a/src/cmd/link/internal/ld/macho.go b/src/cmd/link/internal/ld/macho.go index ae29dc69e3..c7ce9f0522 100644 --- a/src/cmd/link/internal/ld/macho.go +++ b/src/cmd/link/internal/ld/macho.go @@ -186,7 +186,7 @@ var dylib []string var linkoff int64 func machowrite() int { - o1 := Cpos() + o1 := coutbuf.Offset() loadsize := 4 * 4 * ndebug for i := 0; i < len(load); i++ { @@ -291,7 +291,7 @@ func machowrite() int { } } - return int(Cpos() - o1) + return int(coutbuf.Offset() - o1) } func (ctxt *Link) domacho() { @@ -815,7 +815,7 @@ func machorelocsect(ctxt *Link, sect *Section, syms []*Symbol) { return } - sect.Reloff = uint64(Cpos()) + sect.Reloff = uint64(coutbuf.Offset()) for i, s := range syms { if !s.Attr.Reachable() { continue @@ -847,11 +847,11 @@ func machorelocsect(ctxt *Link, sect *Section, syms []*Symbol) { } } - sect.Rellen = uint64(Cpos()) - sect.Reloff + sect.Rellen = uint64(coutbuf.Offset()) - sect.Reloff } func Machoemitreloc(ctxt *Link) { - for Cpos()&7 != 0 { + for coutbuf.Offset()&7 != 0 { Cput(0) } diff --git a/src/cmd/link/internal/ld/pe.go b/src/cmd/link/internal/ld/pe.go index af58c9913f..1492c9136c 100644 --- a/src/cmd/link/internal/ld/pe.go +++ b/src/cmd/link/internal/ld/pe.go @@ -570,7 +570,7 @@ func peimporteddlls() []string { } func addimports(ctxt *Link, datsect *IMAGE_SECTION_HEADER) { - startoff := Cpos() + startoff := coutbuf.Offset() dynamic := Linklookup(ctxt, ".windynamic", 0) // skip import descriptor table (will write it later) @@ -583,7 +583,7 @@ func addimports(ctxt *Link, datsect *IMAGE_SECTION_HEADER) { // write dll names for d := dr; d != nil; d = d.next { - d.nameoff = uint64(Cpos()) - uint64(startoff) + d.nameoff = uint64(coutbuf.Offset()) - uint64(startoff) strput(d.name) } @@ -591,18 +591,18 @@ func addimports(ctxt *Link, datsect *IMAGE_SECTION_HEADER) { var m *Imp for d := dr; d != nil; d = d.next { for m = d.ms; m != nil; m = m.next { - m.off = uint64(nextsectoff) + uint64(Cpos()) - uint64(startoff) + m.off = uint64(nextsectoff) + uint64(coutbuf.Offset()) - uint64(startoff) Wputl(0) // hint strput(m.s.Extname) } } // write OriginalFirstThunks - oftbase := uint64(Cpos()) - uint64(startoff) + oftbase := uint64(coutbuf.Offset()) - uint64(startoff) - n = uint64(Cpos()) + n = uint64(coutbuf.Offset()) for d := dr; d != nil; d = d.next { - d.thunkoff = uint64(Cpos()) - n + d.thunkoff = uint64(coutbuf.Offset()) - n for m = d.ms; m != nil; m = m.next { if pe64 != 0 { Vputl(m.off) @@ -619,13 +619,13 @@ func addimports(ctxt *Link, datsect *IMAGE_SECTION_HEADER) { } // add pe section and pad it at the end - n = uint64(Cpos()) - uint64(startoff) + n = uint64(coutbuf.Offset()) - uint64(startoff) isect := addpesection(ctxt, ".idata", int(n), int(n)) isect.Characteristics = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE chksectoff(ctxt, isect, startoff) strnput("", int(uint64(isect.SizeOfRawData)-n)) - endoff := Cpos() + endoff := coutbuf.Offset() // write FirstThunks (allocated in .data section) ftbase := uint64(dynamic.Value) - uint64(datsect.VirtualAddress) - PEBASE @@ -666,7 +666,6 @@ func addimports(ctxt *Link, datsect *IMAGE_SECTION_HEADER) { // update data directory dd[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress = isect.VirtualAddress - dd[IMAGE_DIRECTORY_ENTRY_IMPORT].Size = isect.VirtualSize dd[IMAGE_DIRECTORY_ENTRY_IAT].VirtualAddress = uint32(dynamic.Value - PEBASE) dd[IMAGE_DIRECTORY_ENTRY_IAT].Size = uint32(dynamic.Size) @@ -712,7 +711,7 @@ func addexports(ctxt *Link) { sect := addpesection(ctxt, ".edata", size, size) sect.Characteristics = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ - chksectoff(ctxt, sect, Cpos()) + chksectoff(ctxt, sect, coutbuf.Offset()) va := int(sect.VirtualAddress) dd[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress = uint32(va) dd[IMAGE_DIRECTORY_ENTRY_EXPORT].Size = sect.VirtualSize @@ -772,7 +771,7 @@ func perelocsect(ctxt *Link, sect *Section, syms []*Symbol) int { relocs := 0 - sect.Reloff = uint64(Cpos()) + sect.Reloff = uint64(coutbuf.Offset()) for i, s := range syms { if !s.Attr.Reachable() { continue @@ -814,18 +813,18 @@ func perelocsect(ctxt *Link, sect *Section, syms []*Symbol) int { } } - sect.Rellen = uint64(Cpos()) - sect.Reloff + sect.Rellen = uint64(coutbuf.Offset()) - sect.Reloff return relocs } // peemitreloc emits relocation entries for go.o in external linking. func peemitreloc(ctxt *Link, text, data, ctors *IMAGE_SECTION_HEADER) { - for Cpos()&7 != 0 { + for coutbuf.Offset()&7 != 0 { Cput(0) } - text.PointerToRelocations = uint32(Cpos()) + text.PointerToRelocations = uint32(coutbuf.Offset()) // first entry: extended relocs Lputl(0) // placeholder for number of relocation + 1 Lputl(0) @@ -836,7 +835,7 @@ func peemitreloc(ctxt *Link, text, data, ctors *IMAGE_SECTION_HEADER) { n += perelocsect(ctxt, sect, datap) } - cpos := Cpos() + cpos := coutbuf.Offset() Cseek(int64(text.PointerToRelocations)) Lputl(uint32(n)) Cseek(cpos) @@ -859,7 +858,7 @@ func peemitreloc(ctxt *Link, text, data, ctors *IMAGE_SECTION_HEADER) { n += perelocsect(ctxt, sect, datap) } - cpos = Cpos() + cpos = coutbuf.Offset() Cseek(int64(data.PointerToRelocations)) Lputl(uint32(n)) Cseek(cpos) @@ -873,7 +872,7 @@ func peemitreloc(ctxt *Link, text, data, ctors *IMAGE_SECTION_HEADER) { dottext := Linklookup(ctxt, ".text", 0) ctors.NumberOfRelocations = 1 - ctors.PointerToRelocations = uint32(Cpos()) + ctors.PointerToRelocations = uint32(coutbuf.Offset()) sectoff := ctors.VirtualAddress Lputl(sectoff) Lputl(uint32(dottext.Dynid)) @@ -1017,7 +1016,7 @@ func writePESymTableRecords(ctxt *Link) int { } func addpesymtable(ctxt *Link) { - symtabStartPos := Cpos() + symtabStartPos := coutbuf.Offset() // write COFF symbol table var symcnt int @@ -1063,7 +1062,7 @@ func addpersrc(ctxt *Link) { h := addpesection(ctxt, ".rsrc", int(rsrcsym.Size), int(rsrcsym.Size)) h.Characteristics = IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE | IMAGE_SCN_CNT_INITIALIZED_DATA - chksectoff(ctxt, h, Cpos()) + chksectoff(ctxt, h, coutbuf.Offset()) // relocation var p []byte @@ -1113,7 +1112,7 @@ func addinitarray(ctxt *Link) (c *IMAGE_SECTION_HEADER) { c.SizeOfRawData = uint32(size) Cseek(int64(c.PointerToRawData)) - chksectoff(ctxt, c, Cpos()) + chksectoff(ctxt, c, coutbuf.Offset()) init_entry := Linklookup(ctxt, *flagEntrySymbol, 0) addr := uint64(init_entry.Value) - init_entry.Sect.Vaddr -- 2.48.1