From aada49038c683d048fd0a146366d7ce52dc17e97 Mon Sep 17 00:00:00 2001 From: Alex Brainman Date: Wed, 8 Feb 2017 12:30:30 +1100 Subject: [PATCH] cmd/link: write dwarf relocations For #10776. Change-Id: I11dd441d8e5d6316889ffa8418df8b58c57c677d Reviewed-on: https://go-review.googlesource.com/36982 Reviewed-by: Ian Lance Taylor --- src/cmd/link/internal/amd64/asm.go | 3 +++ src/cmd/link/internal/ld/data.go | 9 ++++++++- src/cmd/link/internal/ld/pe.go | 23 ++++++++++++++++++----- src/cmd/link/internal/x86/asm.go | 3 +++ 4 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/cmd/link/internal/amd64/asm.go b/src/cmd/link/internal/amd64/asm.go index 60bd45cd30..c1d8339f4b 100644 --- a/src/cmd/link/internal/amd64/asm.go +++ b/src/cmd/link/internal/amd64/asm.go @@ -500,6 +500,9 @@ func pereloc1(s *ld.Symbol, r *ld.Reloc, sectoff int64) bool { default: return false + case obj.R_DWARFREF: + v = ld.IMAGE_REL_AMD64_SECREL + case obj.R_ADDR: if r.Siz == 8 { v = ld.IMAGE_REL_AMD64_ADDR64 diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 582a68ea08..2ce193570f 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -575,7 +575,14 @@ func relocsym(ctxt *Link, s *Symbol) { } if Linkmode == LinkExternal { r.Done = 0 - r.Type = obj.R_ADDR + // PE code emits IMAGE_REL_I386_SECREL and IMAGE_REL_AMD64_SECREL + // for R_DWARFREF relocations, while R_ADDR is replaced with + // IMAGE_REL_I386_DIR32, IMAGE_REL_AMD64_ADDR64 and IMAGE_REL_AMD64_ADDR32. + // Do not replace R_DWARFREF with R_ADDR for windows - + // let PE code emit correct relocations. + if Headtype != obj.Hwindows && Headtype != obj.Hwindowsgui { + r.Type = obj.R_ADDR + } r.Xsym = ctxt.Syms.ROLookup(r.Sym.Sect.Name, 0) r.Xadd = r.Add + Symaddr(r.Sym) - int64(r.Sym.Sect.Vaddr) diff --git a/src/cmd/link/internal/ld/pe.go b/src/cmd/link/internal/ld/pe.go index f1d51caa90..77c86fecbd 100644 --- a/src/cmd/link/internal/ld/pe.go +++ b/src/cmd/link/internal/ld/pe.go @@ -801,7 +801,7 @@ func addexports(ctxt *Link) { // perelocsect relocates symbols from first in section sect, and returns // the total number of relocations emitted. -func perelocsect(ctxt *Link, sect *Section, syms []*Symbol) int { +func perelocsect(ctxt *Link, sect *Section, syms []*Symbol, base uint64) int { // If main section has no bits, nothing to relocate. if sect.Vaddr >= sect.Seg.Vaddr+sect.Seg.Filelen { return 0 @@ -841,7 +841,7 @@ func perelocsect(ctxt *Link, sect *Section, syms []*Symbol) int { if r.Xsym.Dynid < 0 { Errorf(sym, "reloc %d to non-coff symbol %s (outer=%s) %d", r.Type, r.Sym.Name, r.Xsym.Name, r.Sym.Type) } - if !Thearch.PEreloc1(sym, r, int64(uint64(sym.Value+int64(r.Off))-sect.Seg.Vaddr)) { + if !Thearch.PEreloc1(sym, r, int64(uint64(sym.Value+int64(r.Off))-base)) { Errorf(sym, "unsupported obj reloc %d/%d to %s", r.Type, r.Siz, r.Sym.Name) } @@ -887,9 +887,9 @@ func peemitreloc(ctxt *Link, text, data, ctors *IMAGE_SECTION_HEADER) { } peemitsectreloc(text, func() int { - n := perelocsect(ctxt, Segtext.Sect, ctxt.Textp) + n := perelocsect(ctxt, Segtext.Sect, ctxt.Textp, Segtext.Vaddr) for sect := Segtext.Sect.Next; sect != nil; sect = sect.Next { - n += perelocsect(ctxt, sect, datap) + n += perelocsect(ctxt, sect, datap, Segtext.Vaddr) } return n }) @@ -897,11 +897,24 @@ func peemitreloc(ctxt *Link, text, data, ctors *IMAGE_SECTION_HEADER) { peemitsectreloc(data, func() int { var n int for sect := Segdata.Sect; sect != nil; sect = sect.Next { - n += perelocsect(ctxt, sect, datap) + n += perelocsect(ctxt, sect, datap, Segdata.Vaddr) } return n }) +dwarfLoop: + for sect := Segdwarf.Sect; sect != nil; sect = sect.Next { + for i, name := range shNames { + if sect.Name == name { + peemitsectreloc(&sh[i], func() int { + return perelocsect(ctxt, sect, dwarfp, sect.Vaddr) + }) + continue dwarfLoop + } + } + Errorf(nil, "peemitsectreloc: could not find %q section", sect.Name) + } + peemitsectreloc(ctors, func() int { dottext := ctxt.Syms.Lookup(".text", 0) Lputl(0) diff --git a/src/cmd/link/internal/x86/asm.go b/src/cmd/link/internal/x86/asm.go index af702c29d0..e49b07c368 100644 --- a/src/cmd/link/internal/x86/asm.go +++ b/src/cmd/link/internal/x86/asm.go @@ -482,6 +482,9 @@ func pereloc1(s *ld.Symbol, r *ld.Reloc, sectoff int64) bool { default: return false + case obj.R_DWARFREF: + v = ld.IMAGE_REL_I386_SECREL + case obj.R_ADDR: v = ld.IMAGE_REL_I386_DIR32 -- 2.50.0