From 0c9e0c257b121acae72b9419be64ce45196ef825 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Mon, 29 Apr 2019 16:34:34 +0200 Subject: [PATCH] cmd/link: add .go.buildinfo in XCOFF symbol table .go.buildinfo must be added to the symbol table on AIX. Otherwise, ld won't be able to handle its relocations. This patch also make ".data" the default section for all symbols inside the data segment. Change-Id: I83ac2bf1050e0ef6ef9c96ff793efd4ddc8e98d7 Reviewed-on: https://go-review.googlesource.com/c/go/+/174298 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/link/internal/ld/lib.go | 16 ++++++++++++++-- src/cmd/link/internal/ld/xcoff.go | 5 +---- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index d6555a5633832..a3f84dd008ec3 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -2265,11 +2265,23 @@ func genasmsym(ctxt *Link, put func(*Link, *sym.Symbol, string, SymbolType, int6 } } - for _, s := range ctxt.Syms.Allsym { + shouldBeInSymbolTable := func(s *sym.Symbol) bool { if s.Attr.NotInSymbolTable() { - continue + return false + } + if ctxt.HeadType == objabi.Haix && s.Name == ".go.buildinfo" { + // On AIX, .go.buildinfo must be in the symbol table as + // it has relocations. + return true } if (s.Name == "" || s.Name[0] == '.') && !s.IsFileLocal() && s.Name != ".rathole" && s.Name != ".TOC." { + return false + } + return true + } + + for _, s := range ctxt.Syms.Allsym { + if !shouldBeInSymbolTable(s) { continue } switch s.Type { diff --git a/src/cmd/link/internal/ld/xcoff.go b/src/cmd/link/internal/ld/xcoff.go index 7fcd8a3c97d8b..67e558a475cde 100644 --- a/src/cmd/link/internal/ld/xcoff.go +++ b/src/cmd/link/internal/ld/xcoff.go @@ -513,16 +513,13 @@ func (f *xcoffFile) getXCOFFscnum(sect *sym.Section) int16 { case &Segtext: return f.sectNameToScnum[".text"] case &Segdata: - if sect.Name == ".noptrdata" || sect.Name == ".data" { - return f.sectNameToScnum[".data"] - } if sect.Name == ".noptrbss" || sect.Name == ".bss" { return f.sectNameToScnum[".bss"] } if sect.Name == ".tbss" { return f.sectNameToScnum[".tbss"] } - Errorf(nil, "unknown XCOFF segment data section: %s", sect.Name) + return f.sectNameToScnum[".data"] case &Segdwarf: name, _ := xcoffGetDwarfSubtype(sect.Name) return f.sectNameToScnum[name]