mirror of
https://github.com/golang/go
synced 2024-11-19 17:14:44 -07:00
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 <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
parent
bf4d8d3d05
commit
2763672ecb
@ -102,7 +102,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||||||
switch r.Type {
|
switch r.Type {
|
||||||
default:
|
default:
|
||||||
if r.Type >= 256 {
|
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
|
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.Type == ld.SHOSTOBJ || r.Type == objabi.R_PCREL || r.Type == objabi.R_GOTPCREL {
|
||||||
if rs.Dynid < 0 {
|
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
|
return -1
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -454,7 +454,7 @@ func machoreloc1(s *ld.Symbol, r *ld.Reloc, sectoff int64) int {
|
|||||||
} else {
|
} else {
|
||||||
v = uint32(rs.Sect.Extnum)
|
v = uint32(rs.Sect.Extnum)
|
||||||
if v == 0 {
|
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
|
return -1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -507,7 +507,7 @@ func pereloc1(s *ld.Symbol, r *ld.Reloc, sectoff int64) bool {
|
|||||||
rs := r.Xsym
|
rs := r.Xsym
|
||||||
|
|
||||||
if rs.Dynid < 0 {
|
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
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -118,7 +118,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||||||
switch r.Type {
|
switch r.Type {
|
||||||
default:
|
default:
|
||||||
if r.Type >= 256 {
|
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
|
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.Type == ld.SHOSTOBJ || r.Type == objabi.R_CALLARM {
|
||||||
if rs.Dynid < 0 {
|
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
|
return -1
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -372,7 +372,7 @@ func machoreloc1(s *ld.Symbol, r *ld.Reloc, sectoff int64) int {
|
|||||||
} else {
|
} else {
|
||||||
v = uint32(rs.Sect.Extnum)
|
v = uint32(rs.Sect.Extnum)
|
||||||
if v == 0 {
|
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
|
return -1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -481,7 +481,7 @@ func trampoline(ctxt *ld.Link, r *ld.Reloc, s *ld.Symbol) {
|
|||||||
r.Done = 0
|
r.Done = 0
|
||||||
}
|
}
|
||||||
default:
|
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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -158,7 +158,7 @@ func machoreloc1(s *ld.Symbol, r *ld.Reloc, sectoff int64) int {
|
|||||||
// UNSIGNED relocation at all.
|
// 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.Type == ld.SHOSTOBJ || r.Type == objabi.R_CALLARM64 || r.Type == objabi.R_ADDRARM64 || r.Type == objabi.R_ADDR {
|
||||||
if rs.Dynid < 0 {
|
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
|
return -1
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -167,7 +167,7 @@ func machoreloc1(s *ld.Symbol, r *ld.Reloc, sectoff int64) int {
|
|||||||
} else {
|
} else {
|
||||||
v = uint32(rs.Sect.Extnum)
|
v = uint32(rs.Sect.Extnum)
|
||||||
if v == 0 {
|
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
|
return -1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -432,7 +432,7 @@ func relocsym(ctxt *Link, s *Symbol) {
|
|||||||
// shared libraries, and Solaris needs it always
|
// shared libraries, and Solaris needs it always
|
||||||
if Headtype != objabi.Hsolaris && r.Sym != nil && r.Sym.Type == SDYNIMPORT && !ctxt.DynlinkingGo() {
|
if Headtype != objabi.Hsolaris && r.Sym != nil && r.Sym.Type == SDYNIMPORT && !ctxt.DynlinkingGo() {
|
||||||
if !(SysArch.Family == sys.PPC64 && Linkmode == LinkExternal && r.Sym.Name == ".TOC.") {
|
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() {
|
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:]))
|
o = int64(ctxt.Arch.ByteOrder.Uint64(s.P[off:]))
|
||||||
}
|
}
|
||||||
if Thearch.Archreloc(ctxt, r, s, &o) < 0 {
|
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:
|
case objabi.R_TLS_LE:
|
||||||
@ -714,7 +714,7 @@ func relocsym(ctxt *Link, s *Symbol) {
|
|||||||
if r.Sym != nil {
|
if r.Sym != nil {
|
||||||
nam = r.Sym.Name
|
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 {
|
switch siz {
|
||||||
default:
|
default:
|
||||||
@ -828,7 +828,7 @@ func dynrelocsym(ctxt *Link, s *Symbol) {
|
|||||||
Errorf(s, "dynamic relocation to unreachable symbol %s", r.Sym.Name)
|
Errorf(s, "dynamic relocation to unreachable symbol %s", r.Sym.Name)
|
||||||
}
|
}
|
||||||
if !Thearch.Adddynrel(ctxt, s, r) {
|
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1812,13 +1812,13 @@ func elfrelocsect(ctxt *Link, sect *Section, syms []*Symbol) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if r.Xsym.ElfsymForReloc() == 0 {
|
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() {
|
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 {
|
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -330,3 +330,47 @@ const (
|
|||||||
RV_CHECK_OVERFLOW RelocVariant = 1 << 7
|
RV_CHECK_OVERFLOW RelocVariant = 1 << 7
|
||||||
RV_TYPE_MASK RelocVariant = RV_CHECK_OVERFLOW - 1
|
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()
|
||||||
|
}
|
||||||
|
@ -930,10 +930,10 @@ func machorelocsect(ctxt *Link, sect *Section, syms []*Symbol) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if !r.Xsym.Attr.Reachable() {
|
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 {
|
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -882,10 +882,10 @@ func perelocsect(ctxt *Link, sect *Section, syms []*Symbol, base uint64) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if r.Xsym.Dynid < 0 {
|
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)) {
|
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++
|
relocs++
|
||||||
|
@ -252,7 +252,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||||||
switch r.Type {
|
switch r.Type {
|
||||||
default:
|
default:
|
||||||
if r.Type >= 256 {
|
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
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -581,7 +581,7 @@ func trampoline(ctxt *ld.Link, r *ld.Reloc, s *ld.Symbol) {
|
|||||||
r.Done = 0
|
r.Done = 0
|
||||||
}
|
}
|
||||||
default:
|
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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -170,7 +170,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
|
|||||||
switch r.Type {
|
switch r.Type {
|
||||||
default:
|
default:
|
||||||
if r.Type >= 256 {
|
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
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -416,7 +416,7 @@ func machoreloc1(s *ld.Symbol, r *ld.Reloc, sectoff int64) int {
|
|||||||
|
|
||||||
if rs.Type == ld.SHOSTOBJ {
|
if rs.Type == ld.SHOSTOBJ {
|
||||||
if rs.Dynid < 0 {
|
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
|
return -1
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -425,7 +425,7 @@ func machoreloc1(s *ld.Symbol, r *ld.Reloc, sectoff int64) int {
|
|||||||
} else {
|
} else {
|
||||||
v = uint32(rs.Sect.Extnum)
|
v = uint32(rs.Sect.Extnum)
|
||||||
if v == 0 {
|
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
|
return -1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -471,7 +471,7 @@ func pereloc1(s *ld.Symbol, r *ld.Reloc, sectoff int64) bool {
|
|||||||
rs := r.Xsym
|
rs := r.Xsym
|
||||||
|
|
||||||
if rs.Dynid < 0 {
|
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
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user