]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: load symbols from .syso in external link mode
authorJohn Papandriopoulos <jpap.code@gmail.com>
Sun, 29 Sep 2019 23:59:56 +0000 (16:59 -0700)
committerIan Lance Taylor <iant@golang.org>
Tue, 1 Oct 2019 00:02:11 +0000 (00:02 +0000)
Fix linking with a package having a .syso file in external link mode,
that would otherwise cause an error before executing the external
linker because it can't find symbols that are exported in the said
.syso file.

Fixes #33139

Change-Id: Id3ee737fba1c6f1e37910593dfedf9c84486d398
Reviewed-on: https://go-review.googlesource.com/c/go/+/186417
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/cmd/go/testdata/script/link_syso_issue33139.txt [new file with mode: 0644]
src/cmd/link/internal/arm/asm.go
src/cmd/link/internal/ld/data.go
src/cmd/link/internal/ld/go.go
src/cmd/link/internal/ld/lib.go
src/cmd/link/internal/ld/macho.go
src/cmd/link/internal/ld/pe.go
src/cmd/link/internal/ld/symtab.go
src/cmd/link/internal/sym/symkind.go
src/cmd/link/internal/sym/symkind_string.go

diff --git a/src/cmd/go/testdata/script/link_syso_issue33139.txt b/src/cmd/go/testdata/script/link_syso_issue33139.txt
new file mode 100644 (file)
index 0000000..53587e6
--- /dev/null
@@ -0,0 +1,29 @@
+# Test that we can use the external linker with a host syso file that is
+# embedded in a package, that is referenced by a Go assembly stub.
+# See issue 33139.
+[!gc] stop
+cc -c -o syso/objTestImpl.syso syso/src/objTestImpl.c
+go build -ldflags='-linkmode=external' ./cmd/main.go
+
+-- syso/objTest.s --
+#include "textflag.h"
+
+TEXT ·ObjTest(SB), NOSPLIT, $0
+       JMP objTestImpl(SB)
+
+-- syso/pkg.go --
+package syso
+
+func ObjTest()
+
+-- syso/src/objTestImpl.c --
+void objTestImpl() { /* Empty */ }
+
+-- cmd/main.go --
+package main
+
+import "syso"
+
+func main() {
+       syso.ObjTest()
+}
index 43d387c862d5cef0c839c7d32af7529e3930805a..41efd935eec4b4e35e1a0f47c43f84ee6d1743b3 100644 (file)
@@ -613,7 +613,7 @@ func archreloc(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol, val int64) (int64, bo
                                rs = rs.Outer
                        }
 
-                       if rs.Type != sym.SHOSTOBJ && rs.Type != sym.SDYNIMPORT && rs.Sect == nil {
+                       if rs.Type != sym.SHOSTOBJ && rs.Type != sym.SDYNIMPORT && rs.Type != sym.SUNDEFEXT && rs.Sect == nil {
                                ld.Errorf(s, "missing section for %s", rs.Name)
                        }
                        r.Xsym = rs
index 2266d301dd545beeb72669a7aa7f70c4f62f24b9..ea674832a97a094a7bd7035fc8cb1cee7af8ea81 100644 (file)
@@ -96,7 +96,7 @@ func trampoline(ctxt *Link, s *sym.Symbol) {
                if !r.Type.IsDirectJump() {
                        continue
                }
-               if Symaddr(r.Sym) == 0 && r.Sym.Type != sym.SDYNIMPORT {
+               if Symaddr(r.Sym) == 0 && (r.Sym.Type != sym.SDYNIMPORT && r.Sym.Type != sym.SUNDEFEXT) {
                        if r.Sym.File != s.File {
                                if !isRuntimeDepPkg(s.File) || !isRuntimeDepPkg(r.Sym.File) {
                                        ctxt.ErrorUnresolved(s, r)
@@ -418,6 +418,17 @@ func relocsym(ctxt *Link, s *sym.Symbol) {
                        }
                        fallthrough
                case objabi.R_CALL, objabi.R_PCREL:
+                       if ctxt.LinkMode == LinkExternal && r.Sym != nil && r.Sym.Type == sym.SUNDEFEXT {
+                               // pass through to the external linker.
+                               r.Done = false
+                               r.Xadd = 0
+                               if ctxt.IsELF {
+                                       r.Xadd -= int64(r.Siz)
+                               }
+                               r.Xsym = r.Sym
+                               o = 0
+                               break
+                       }
                        if ctxt.LinkMode == LinkExternal && r.Sym != nil && r.Sym.Type != sym.SCONST && (r.Sym.Sect != s.Sect || r.Type == objabi.R_GOTPCREL) {
                                r.Done = false
 
index 80d7ac32f524b9cc090ae84d9c00fc34f9aa1c83..37adeb770115c1b5f1334ab31c8b7322a68d249c 100644 (file)
@@ -334,6 +334,24 @@ func fieldtrack(ctxt *Link) {
 }
 
 func (ctxt *Link) addexport() {
+       // Track undefined external symbols during external link.
+       if ctxt.LinkMode == LinkExternal {
+               for _, s := range ctxt.Syms.Allsym {
+                       if !s.Attr.Reachable() || s.Attr.Special() || s.Attr.SubSymbol() {
+                               continue
+                       }
+                       if s.Type != sym.STEXT {
+                               continue
+                       }
+                       for i := range s.R {
+                               r := &s.R[i]
+                               if r.Sym != nil && r.Sym.Type == sym.Sxxx {
+                                       r.Sym.Type = sym.SUNDEFEXT
+                               }
+                       }
+               }
+       }
+
        // TODO(aix)
        if ctxt.HeadType == objabi.Hdarwin || ctxt.HeadType == objabi.Haix {
                return
index 182e5b0769eae38652bf6f9bf37a747add5bd9b6..98c5e6ca6d2c670912fef61649f2b571a100a5e2 100644 (file)
@@ -2348,7 +2348,7 @@ func genasmsym(ctxt *Link, put func(*Link, *sym.Symbol, string, SymbolType, int6
                        }
                        put(ctxt, s, s.Name, BSSSym, Symaddr(s), s.Gotype)
 
-               case sym.SHOSTOBJ:
+               case sym.SHOSTOBJ, sym.SUNDEFEXT:
                        if ctxt.HeadType == objabi.Hwindows || ctxt.IsELF {
                                put(ctxt, s, s.Name, UndefinedSym, s.Value, nil)
                        }
index 7453f37c62fec81c459eaa43cd24bed5e96a9b1f..e9e48768c14d3312b93f1ab4a7f5d80ad6fcda83 100644 (file)
@@ -809,7 +809,7 @@ func machogenasmsym(ctxt *Link) {
                        }
                }
 
-               if s.Type == sym.SDYNIMPORT || s.Type == sym.SHOSTOBJ {
+               if s.Type == sym.SDYNIMPORT || s.Type == sym.SHOSTOBJ || s.Type == sym.SUNDEFEXT {
                        if s.Attr.Reachable() {
                                addsym(ctxt, s, "", DataSym, 0, nil)
                        }
@@ -886,7 +886,7 @@ func machosymtab(ctxt *Link) {
                // replace "·" as ".", because DTrace cannot handle it.
                Addstring(symstr, strings.Replace(s.Extname(), "·", ".", -1))
 
-               if s.Type == sym.SDYNIMPORT || s.Type == sym.SHOSTOBJ {
+               if s.Type == sym.SDYNIMPORT || s.Type == sym.SHOSTOBJ || s.Type == sym.SUNDEFEXT {
                        symtab.AddUint8(0x01)                             // type N_EXT, external symbol
                        symtab.AddUint8(0)                                // no section
                        symtab.AddUint16(ctxt.Arch, 0)                    // desc
index 12363626ae3a80ef2bd0c19b9c9753f6ea42cd14..6d4674dbfd81edf14ead81b385771f1299ea59fa 100644 (file)
@@ -685,7 +685,7 @@ func (f *peFile) writeSymbols(ctxt *Link) {
                // Only windows/386 requires underscore prefix on external symbols.
                if ctxt.Arch.Family == sys.I386 &&
                        ctxt.LinkMode == LinkExternal &&
-                       (s.Type == sym.SHOSTOBJ || s.Attr.CgoExport()) {
+                       (s.Type == sym.SHOSTOBJ || s.Type == sym.SUNDEFEXT || s.Attr.CgoExport()) {
                        s.Name = "_" + s.Name
                }
 
index d686a8a476862f963fb33e57264034f8fdcd1377..4925eda0e6fbe989f2190217d1b4a2b7298d4644 100644 (file)
@@ -110,7 +110,7 @@ func putelfsym(ctxt *Link, x *sym.Symbol, s string, t SymbolType, addr int64, go
        }
 
        var elfshnum int
-       if xo.Type == sym.SDYNIMPORT || xo.Type == sym.SHOSTOBJ {
+       if xo.Type == sym.SDYNIMPORT || xo.Type == sym.SHOSTOBJ || xo.Type == sym.SUNDEFEXT {
                elfshnum = SHN_UNDEF
        } else {
                if xo.Sect == nil {
index 4e44d3fce106a19b5bb91ad4f492d36b2f5e711e..5309e07ecff21940f9cc37b55eef4abc67863ec6 100644 (file)
@@ -104,6 +104,7 @@ const (
        SCONST
        SDYNIMPORT
        SHOSTOBJ
+       SUNDEFEXT // Undefined symbol for resolution by external linker
 
        // Sections for debugging information
        SDWARFSECT
index 2732ec7654fb4f72a021809f67c642db213c7bdb..e48d90c511b26756dff82891690c4d42ccd350c5 100644 (file)
@@ -1,4 +1,4 @@
-// Code generated by "stringer -type=SymKind"; DO NOT EDIT.
+// Code generated by "stringer -type=SymKind symkind.go"; DO NOT EDIT.
 
 package sym
 
@@ -54,17 +54,18 @@ func _() {
        _ = x[SCONST-43]
        _ = x[SDYNIMPORT-44]
        _ = x[SHOSTOBJ-45]
-       _ = x[SDWARFSECT-46]
-       _ = x[SDWARFINFO-47]
-       _ = x[SDWARFRANGE-48]
-       _ = x[SDWARFLOC-49]
-       _ = x[SDWARFLINES-50]
-       _ = x[SABIALIAS-51]
+       _ = x[SUNDEFEXT-46]
+       _ = x[SDWARFSECT-47]
+       _ = x[SDWARFINFO-48]
+       _ = x[SDWARFRANGE-49]
+       _ = x[SDWARFLOC-50]
+       _ = x[SDWARFLINES-51]
+       _ = x[SABIALIAS-52]
 }
 
-const _SymKind_name = "SxxxSTEXTSELFRXSECTSTYPESSTRINGSGOSTRINGSGOFUNCSGCBITSSRODATASFUNCTABSELFROSECTSMACHOPLTSTYPERELROSSTRINGRELROSGOSTRINGRELROSGOFUNCRELROSGCBITSRELROSRODATARELROSFUNCTABRELROSTYPELINKSITABLINKSSYMTABSPCLNTABSFirstWritableSBUILDINFOSELFSECTSMACHOSMACHOGOTSWINDOWSSELFGOTSNOPTRDATASINITARRSDATASXCOFFTOCSBSSSNOPTRBSSSTLSBSSSXREFSMACHOSYMSTRSMACHOSYMTABSMACHOINDIRECTPLTSMACHOINDIRECTGOTSFILEPATHSCONSTSDYNIMPORTSHOSTOBJSDWARFSECTSDWARFINFOSDWARFRANGESDWARFLOCSDWARFLINESSABIALIAS"
+const _SymKind_name = "SxxxSTEXTSELFRXSECTSTYPESSTRINGSGOSTRINGSGOFUNCSGCBITSSRODATASFUNCTABSELFROSECTSMACHOPLTSTYPERELROSSTRINGRELROSGOSTRINGRELROSGOFUNCRELROSGCBITSRELROSRODATARELROSFUNCTABRELROSTYPELINKSITABLINKSSYMTABSPCLNTABSFirstWritableSBUILDINFOSELFSECTSMACHOSMACHOGOTSWINDOWSSELFGOTSNOPTRDATASINITARRSDATASXCOFFTOCSBSSSNOPTRBSSSTLSBSSSXREFSMACHOSYMSTRSMACHOSYMTABSMACHOINDIRECTPLTSMACHOINDIRECTGOTSFILEPATHSCONSTSDYNIMPORTSHOSTOBJSUNDEFEXTSDWARFSECTSDWARFINFOSDWARFRANGESDWARFLOCSDWARFLINESSABIALIAS"
 
-var _SymKind_index = [...]uint16{0, 4, 9, 19, 24, 31, 40, 47, 54, 61, 69, 79, 88, 98, 110, 124, 136, 148, 160, 173, 182, 191, 198, 206, 220, 230, 238, 244, 253, 261, 268, 278, 286, 291, 300, 304, 313, 320, 325, 337, 349, 366, 383, 392, 398, 408, 416, 426, 436, 447, 456, 467, 476}
+var _SymKind_index = [...]uint16{0, 4, 9, 19, 24, 31, 40, 47, 54, 61, 69, 79, 88, 98, 110, 124, 136, 148, 160, 173, 182, 191, 198, 206, 220, 230, 238, 244, 253, 261, 268, 278, 286, 291, 300, 304, 313, 320, 325, 337, 349, 366, 383, 392, 398, 408, 416, 425, 435, 445, 456, 465, 476, 485}
 
 func (i SymKind) String() string {
        if i >= SymKind(len(_SymKind_index)-1) {