From 2763672ecbddec940c6586f43c98bf72a49bcc81 Mon Sep 17 00:00:00 2001 From: Hiroshi Ioka Date: Thu, 17 Aug 2017 09:45:20 +0900 Subject: [PATCH] cmd/link: show native relocation type name in error messages Change-Id: I7f7b1e7ef832d53a93562b08ae914d023247c2c0 Reviewed-on: https://go-review.googlesource.com/56312 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/link/internal/amd64/asm.go | 8 +++--- src/cmd/link/internal/arm/asm.go | 8 +++--- src/cmd/link/internal/arm64/asm.go | 4 +-- src/cmd/link/internal/ld/data.go | 8 +++--- src/cmd/link/internal/ld/elf.go | 6 ++-- src/cmd/link/internal/ld/link.go | 44 ++++++++++++++++++++++++++++++ src/cmd/link/internal/ld/macho.go | 4 +-- src/cmd/link/internal/ld/pe.go | 4 +-- src/cmd/link/internal/ppc64/asm.go | 4 +-- src/cmd/link/internal/x86/asm.go | 8 +++--- 10 files changed, 71 insertions(+), 27 deletions(-) diff --git a/src/cmd/link/internal/amd64/asm.go b/src/cmd/link/internal/amd64/asm.go index c5909993fc..2e1791fdb2 100644 --- a/src/cmd/link/internal/amd64/asm.go +++ b/src/cmd/link/internal/amd64/asm.go @@ -102,7 +102,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool { switch r.Type { default: if r.Type >= 256 { - ld.Errorf(s, "unexpected relocation type %d", r.Type) + ld.Errorf(s, "unexpected relocation type %d (%s)", r.Type, ld.RelocName(r.Type)) return false } @@ -445,7 +445,7 @@ func machoreloc1(s *ld.Symbol, r *ld.Reloc, sectoff int64) int { if rs.Type == ld.SHOSTOBJ || r.Type == objabi.R_PCREL || r.Type == objabi.R_GOTPCREL { if rs.Dynid < 0 { - ld.Errorf(s, "reloc %d (%s) to non-macho symbol %s type=%d (%s)", r.Type, r.Type, rs.Name, rs.Type, rs.Type) + ld.Errorf(s, "reloc %d (%s) to non-macho symbol %s type=%d (%s)", r.Type, ld.RelocName(r.Type), rs.Name, rs.Type, rs.Type) return -1 } @@ -454,7 +454,7 @@ func machoreloc1(s *ld.Symbol, r *ld.Reloc, sectoff int64) int { } else { v = uint32(rs.Sect.Extnum) if v == 0 { - ld.Errorf(s, "reloc %d (%s) to symbol %s in non-macho section %s type=%d (%s)", r.Type, r.Type, rs.Name, rs.Sect.Name, rs.Type, rs.Type) + ld.Errorf(s, "reloc %d (%s) to symbol %s in non-macho section %s type=%d (%s)", r.Type, ld.RelocName(r.Type), rs.Name, rs.Sect.Name, rs.Type, rs.Type) return -1 } } @@ -507,7 +507,7 @@ func pereloc1(s *ld.Symbol, r *ld.Reloc, sectoff int64) bool { rs := r.Xsym if rs.Dynid < 0 { - ld.Errorf(s, "reloc %d (%s) to non-coff symbol %s type=%d (%s)", r.Type, r.Type, rs.Name, rs.Type, rs.Type) + ld.Errorf(s, "reloc %d (%s) to non-coff symbol %s type=%d (%s)", r.Type, ld.RelocName(r.Type), rs.Name, rs.Type, rs.Type) return false } diff --git a/src/cmd/link/internal/arm/asm.go b/src/cmd/link/internal/arm/asm.go index 2fc9329b61..20827817a7 100644 --- a/src/cmd/link/internal/arm/asm.go +++ b/src/cmd/link/internal/arm/asm.go @@ -118,7 +118,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool { switch r.Type { default: if r.Type >= 256 { - ld.Errorf(s, "unexpected relocation type %d", r.Type) + ld.Errorf(s, "unexpected relocation type %d (%s)", r.Type, ld.RelocName(r.Type)) return false } @@ -363,7 +363,7 @@ func machoreloc1(s *ld.Symbol, r *ld.Reloc, sectoff int64) int { if rs.Type == ld.SHOSTOBJ || r.Type == objabi.R_CALLARM { if rs.Dynid < 0 { - ld.Errorf(s, "reloc %d (%s) to non-macho symbol %s type=%d (%s)", r.Type, r.Type, rs.Name, rs.Type, rs.Type) + ld.Errorf(s, "reloc %d (%s) to non-macho symbol %s type=%d (%s)", r.Type, ld.RelocName(r.Type), rs.Name, rs.Type, rs.Type) return -1 } @@ -372,7 +372,7 @@ func machoreloc1(s *ld.Symbol, r *ld.Reloc, sectoff int64) int { } else { v = uint32(rs.Sect.Extnum) if v == 0 { - ld.Errorf(s, "reloc %d (%s) to symbol %s in non-macho section %s type=%d (%s)", r.Type, r.Type, rs.Name, rs.Sect.Name, rs.Type, rs.Type) + ld.Errorf(s, "reloc %d (%s) to symbol %s in non-macho section %s type=%d (%s)", r.Type, ld.RelocName(r.Type), rs.Name, rs.Sect.Name, rs.Type, rs.Type) return -1 } } @@ -481,7 +481,7 @@ func trampoline(ctxt *ld.Link, r *ld.Reloc, s *ld.Symbol) { r.Done = 0 } default: - ld.Errorf(s, "trampoline called with non-jump reloc: %v", r.Type) + ld.Errorf(s, "trampoline called with non-jump reloc: %d (%s)", r.Type, ld.RelocName(r.Type)) } } diff --git a/src/cmd/link/internal/arm64/asm.go b/src/cmd/link/internal/arm64/asm.go index 8d3c6fcb57..1e77431ca4 100644 --- a/src/cmd/link/internal/arm64/asm.go +++ b/src/cmd/link/internal/arm64/asm.go @@ -158,7 +158,7 @@ func machoreloc1(s *ld.Symbol, r *ld.Reloc, sectoff int64) int { // UNSIGNED relocation at all. if rs.Type == ld.SHOSTOBJ || r.Type == objabi.R_CALLARM64 || r.Type == objabi.R_ADDRARM64 || r.Type == objabi.R_ADDR { if rs.Dynid < 0 { - ld.Errorf(s, "reloc %d (%s) to non-macho symbol %s type=%d (%s)", r.Type, r.Type, rs.Name, rs.Type, rs.Type) + ld.Errorf(s, "reloc %d (%s) to non-macho symbol %s type=%d (%s)", r.Type, ld.RelocName(r.Type), rs.Name, rs.Type, rs.Type) return -1 } @@ -167,7 +167,7 @@ func machoreloc1(s *ld.Symbol, r *ld.Reloc, sectoff int64) int { } else { v = uint32(rs.Sect.Extnum) if v == 0 { - ld.Errorf(s, "reloc %d (%s) to symbol %s in non-macho section %s type=%d (%s)", r.Type, r.Type, rs.Name, rs.Sect.Name, rs.Type, rs.Type) + ld.Errorf(s, "reloc %d (%s) to symbol %s in non-macho section %s type=%d (%s)", r.Type, ld.RelocName(r.Type), rs.Name, rs.Sect.Name, rs.Type, rs.Type) return -1 } } diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 691e74cc97..c096338232 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -432,7 +432,7 @@ func relocsym(ctxt *Link, s *Symbol) { // shared libraries, and Solaris needs it always if Headtype != objabi.Hsolaris && r.Sym != nil && r.Sym.Type == SDYNIMPORT && !ctxt.DynlinkingGo() { if !(SysArch.Family == sys.PPC64 && Linkmode == LinkExternal && r.Sym.Name == ".TOC.") { - Errorf(s, "unhandled relocation for %s (type %d (%s) rtype %d (%s))", r.Sym.Name, r.Sym.Type, r.Sym.Type, r.Type, r.Type) + Errorf(s, "unhandled relocation for %s (type %d (%s) rtype %d (%s))", r.Sym.Name, r.Sym.Type, r.Sym.Type, r.Type, RelocName(r.Type)) } } if r.Sym != nil && r.Sym.Type != STLSBSS && r.Type != objabi.R_WEAKADDROFF && !r.Sym.Attr.Reachable() { @@ -465,7 +465,7 @@ func relocsym(ctxt *Link, s *Symbol) { o = int64(ctxt.Arch.ByteOrder.Uint64(s.P[off:])) } if Thearch.Archreloc(ctxt, r, s, &o) < 0 { - Errorf(s, "unknown reloc to %v: %v", r.Sym.Name, r.Type) + Errorf(s, "unknown reloc to %v: %d (%s)", r.Sym.Name, r.Type, RelocName(r.Type)) } case objabi.R_TLS_LE: @@ -714,7 +714,7 @@ func relocsym(ctxt *Link, s *Symbol) { if r.Sym != nil { nam = r.Sym.Name } - fmt.Printf("relocate %s %#x (%#x+%#x, size %d) => %s %#x +%#x [type %d/%d, %x]\n", s.Name, s.Value+int64(off), s.Value, r.Off, r.Siz, nam, Symaddr(r.Sym), r.Add, r.Type, r.Variant, o) + fmt.Printf("relocate %s %#x (%#x+%#x, size %d) => %s %#x +%#x [type %d (%s)/%d, %x]\n", s.Name, s.Value+int64(off), s.Value, r.Off, r.Siz, nam, Symaddr(r.Sym), r.Add, r.Type, RelocName(r.Type), r.Variant, o) } switch siz { default: @@ -828,7 +828,7 @@ func dynrelocsym(ctxt *Link, s *Symbol) { Errorf(s, "dynamic relocation to unreachable symbol %s", r.Sym.Name) } if !Thearch.Adddynrel(ctxt, s, r) { - Errorf(s, "unsupported dynamic relocation for symbol %s (type=%d (%s) stype=%d (%s))", r.Sym.Name, r.Type, r.Type, r.Sym.Type, r.Sym.Type) + Errorf(s, "unsupported dynamic relocation for symbol %s (type=%d (%s) stype=%d (%s))", r.Sym.Name, r.Type, RelocName(r.Type), r.Sym.Type, r.Sym.Type) } } } diff --git a/src/cmd/link/internal/ld/elf.go b/src/cmd/link/internal/ld/elf.go index 9ac55ada1d..2c3f99b756 100644 --- a/src/cmd/link/internal/ld/elf.go +++ b/src/cmd/link/internal/ld/elf.go @@ -1812,13 +1812,13 @@ func elfrelocsect(ctxt *Link, sect *Section, syms []*Symbol) { continue } if r.Xsym.ElfsymForReloc() == 0 { - Errorf(sym, "reloc %d (%s) to non-elf symbol %s (outer=%s) %d (%s)", r.Type, r.Type, r.Sym.Name, r.Xsym.Name, r.Sym.Type, r.Sym.Type) + Errorf(sym, "reloc %d (%s) to non-elf symbol %s (outer=%s) %d (%s)", r.Type, RelocName(r.Type), r.Sym.Name, r.Xsym.Name, r.Sym.Type, r.Sym.Type) } if !r.Xsym.Attr.Reachable() { - Errorf(sym, "unreachable reloc %v target %v", r.Type, r.Xsym.Name) + Errorf(sym, "unreachable reloc %d (%s) target %v", r.Type, RelocName(r.Type), r.Xsym.Name) } if Thearch.Elfreloc1(ctxt, r, int64(uint64(sym.Value+int64(r.Off))-sect.Vaddr)) < 0 { - Errorf(sym, "unsupported obj reloc %d (%s)/%d to %s", r.Type, r.Type, r.Siz, r.Sym.Name) + Errorf(sym, "unsupported obj reloc %d (%s)/%d to %s", r.Type, RelocName(r.Type), r.Siz, r.Sym.Name) } } } diff --git a/src/cmd/link/internal/ld/link.go b/src/cmd/link/internal/ld/link.go index 302364c299..857957afb0 100644 --- a/src/cmd/link/internal/ld/link.go +++ b/src/cmd/link/internal/ld/link.go @@ -330,3 +330,47 @@ const ( RV_CHECK_OVERFLOW RelocVariant = 1 << 7 RV_TYPE_MASK RelocVariant = RV_CHECK_OVERFLOW - 1 ) + +func RelocName(r objabi.RelocType) string { + // We didn't have some relocation types at Go1.4. + // Uncomment code when we include those in bootstrap code. + + switch { + case r >= 512: // Mach-O + // nr := (r - 512)>>1 + // switch SysArch.Family { + // case sys.AMD64: + // return macho.RelocTypeX86_64(nr).String() + // case sys.ARM: + // return macho.RelocTypeARM(nr).String() + // case sys.ARM64: + // return macho.RelocTypeARM64(nr).String() + // case sys.I386: + // return macho.RelocTypeGeneric(nr).String() + // default: + // panic("unreachable") + // } + case r >= 256: // ELF + nr := r - 256 + switch SysArch.Family { + case sys.AMD64: + return elf.R_X86_64(nr).String() + case sys.ARM: + return elf.R_ARM(nr).String() + case sys.ARM64: + return elf.R_AARCH64(nr).String() + case sys.I386: + return elf.R_386(nr).String() + case sys.MIPS, sys.MIPS64: + // return elf.R_MIPS(nr).String() + case sys.PPC64: + // return elf.R_PPC64(nr).String() + case sys.S390X: + // return elf.R_390(nr).String() + default: + panic("unreachable") + } + } + + return r.String() +} diff --git a/src/cmd/link/internal/ld/macho.go b/src/cmd/link/internal/ld/macho.go index ccdbc54f66..3997cfb844 100644 --- a/src/cmd/link/internal/ld/macho.go +++ b/src/cmd/link/internal/ld/macho.go @@ -930,10 +930,10 @@ func machorelocsect(ctxt *Link, sect *Section, syms []*Symbol) { continue } if !r.Xsym.Attr.Reachable() { - Errorf(sym, "unreachable reloc %v target %v", r.Type, r.Xsym.Name) + Errorf(sym, "unreachable reloc %d (%s) target %v", r.Type, RelocName(r.Type), r.Xsym.Name) } if Thearch.Machoreloc1(sym, r, int64(uint64(sym.Value+int64(r.Off))-sect.Vaddr)) < 0 { - Errorf(sym, "unsupported obj reloc %v/%d to %s", r.Type, r.Siz, r.Sym.Name) + Errorf(sym, "unsupported obj reloc %d (%s)/%d to %s", r.Type, RelocName(r.Type), r.Siz, r.Sym.Name) } } } diff --git a/src/cmd/link/internal/ld/pe.go b/src/cmd/link/internal/ld/pe.go index 171fa6da6e..7d17a6471d 100644 --- a/src/cmd/link/internal/ld/pe.go +++ b/src/cmd/link/internal/ld/pe.go @@ -882,10 +882,10 @@ func perelocsect(ctxt *Link, sect *Section, syms []*Symbol, base uint64) int { } if r.Xsym.Dynid < 0 { - Errorf(sym, "reloc %d (%s) to non-coff symbol %s (outer=%s) %d (%s)", r.Type, r.Type, r.Sym.Name, r.Xsym.Name, r.Sym.Type, r.Sym.Type) + Errorf(sym, "reloc %d (%s) to non-coff symbol %s (outer=%s) %d (%s)", r.Type, RelocName(r.Type), r.Sym.Name, r.Xsym.Name, r.Sym.Type, r.Sym.Type) } if !Thearch.PEreloc1(sym, r, int64(uint64(sym.Value+int64(r.Off))-base)) { - Errorf(sym, "unsupported obj reloc %d (%s)/%d to %s", r.Type, r.Type, r.Siz, r.Sym.Name) + Errorf(sym, "unsupported obj reloc %d (%s)/%d to %s", r.Type, RelocName(r.Type), r.Siz, r.Sym.Name) } relocs++ diff --git a/src/cmd/link/internal/ppc64/asm.go b/src/cmd/link/internal/ppc64/asm.go index ee4e218125..b2f040b5ba 100644 --- a/src/cmd/link/internal/ppc64/asm.go +++ b/src/cmd/link/internal/ppc64/asm.go @@ -252,7 +252,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool { switch r.Type { default: if r.Type >= 256 { - ld.Errorf(s, "unexpected relocation type %d", r.Type) + ld.Errorf(s, "unexpected relocation type %d (%s)", r.Type, ld.RelocName(r.Type)) return false } @@ -581,7 +581,7 @@ func trampoline(ctxt *ld.Link, r *ld.Reloc, s *ld.Symbol) { r.Done = 0 } default: - ld.Errorf(s, "trampoline called with non-jump reloc: %v", r.Type) + ld.Errorf(s, "trampoline called with non-jump reloc: %d (%s)", r.Type, ld.RelocName(r.Type)) } } diff --git a/src/cmd/link/internal/x86/asm.go b/src/cmd/link/internal/x86/asm.go index 157b426971..dc60381d14 100644 --- a/src/cmd/link/internal/x86/asm.go +++ b/src/cmd/link/internal/x86/asm.go @@ -170,7 +170,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool { switch r.Type { default: if r.Type >= 256 { - ld.Errorf(s, "unexpected relocation type %d", r.Type) + ld.Errorf(s, "unexpected relocation type %d (%s)", r.Type, ld.RelocName(r.Type)) return false } @@ -416,7 +416,7 @@ func machoreloc1(s *ld.Symbol, r *ld.Reloc, sectoff int64) int { if rs.Type == ld.SHOSTOBJ { if rs.Dynid < 0 { - ld.Errorf(s, "reloc %d (%s) to non-macho symbol %s type=%d (%s)", r.Type, r.Type, rs.Name, rs.Type, rs.Type) + ld.Errorf(s, "reloc %d (%s) to non-macho symbol %s type=%d (%s)", r.Type, ld.RelocName(r.Type), rs.Name, rs.Type, rs.Type) return -1 } @@ -425,7 +425,7 @@ func machoreloc1(s *ld.Symbol, r *ld.Reloc, sectoff int64) int { } else { v = uint32(rs.Sect.Extnum) if v == 0 { - ld.Errorf(s, "reloc %d (%s) to symbol %s in non-macho section %s type=%d (%s)", r.Type, r.Type, rs.Name, rs.Sect.Name, rs.Type, rs.Type) + ld.Errorf(s, "reloc %d (%s) to symbol %s in non-macho section %s type=%d (%s)", r.Type, ld.RelocName(r.Type), rs.Name, rs.Sect.Name, rs.Type, rs.Type) return -1 } } @@ -471,7 +471,7 @@ func pereloc1(s *ld.Symbol, r *ld.Reloc, sectoff int64) bool { rs := r.Xsym if rs.Dynid < 0 { - ld.Errorf(s, "reloc %d (%s) to non-coff symbol %s type=%d (%s)", r.Type, r.Type, rs.Name, rs.Type, rs.Type) + ld.Errorf(s, "reloc %d (%s) to non-coff symbol %s type=%d (%s)", r.Type, ld.RelocName(r.Type), rs.Name, rs.Type, rs.Type) return false }