]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: add support for openbsd/ppc64
authorJoel Sing <joel@sing.id.au>
Thu, 2 Mar 2023 14:24:00 +0000 (01:24 +1100)
committerJoel Sing <joel@sing.id.au>
Wed, 23 Aug 2023 05:14:11 +0000 (05:14 +0000)
Add linker support for the openbsd/ppc64 port.

Updates #56001

Change-Id: I18bc19b4086599996aebfbe68f2e85e1200589ca
Reviewed-on: https://go-review.googlesource.com/c/go/+/475619
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Joel Sing <joel@sing.id.au>
Reviewed-by: Lynn Boger <laboger@linux.vnet.ibm.com>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Reviewed-by: Paul Murphy <murp@ibm.com>
Reviewed-by: Eric Grosse <grosse@gmail.com>
src/cmd/dist/build.go
src/cmd/link/internal/ld/config.go
src/cmd/link/internal/ld/elf.go
src/cmd/link/internal/ppc64/asm.go
src/cmd/link/internal/ppc64/obj.go
src/internal/platform/supported.go

index 193db6f52d9d73e536ae104dcc2617aa47f9a7f6..0f5339964896c63c3ba4adb5dc30cb8980df5365 100644 (file)
@@ -589,7 +589,9 @@ func mustLinkExternal(goos, goarch string, cgoEnabled bool) bool {
                        }
                case "ppc64":
                        // Big Endian PPC64 cgo internal linking is not implemented for aix or linux.
-                       return true
+                       if goos == "aix" || goos == "linux" {
+                               return true
+                       }
                }
 
                switch goos {
index 1147362fb4d6a3271066ecb79b20f05234f95287..3a186b47f715aedb67762b1ecc46e58d90f11a27 100644 (file)
@@ -217,7 +217,7 @@ func determineLinkMode(ctxt *Link) {
                }
        case LinkExternal:
                switch {
-               case buildcfg.GOARCH == "ppc64" && buildcfg.GOOS != "aix":
+               case buildcfg.GOARCH == "ppc64" && buildcfg.GOOS == "linux":
                        Exitf("external linking not supported for %s/ppc64", buildcfg.GOOS)
                }
        }
index 20fa9b05ee9df20dfce5d7e4b5d8d23be52b9f4c..d83bef1558a9e6e9ec8336ea5d9428e9534fa587 100644 (file)
@@ -243,7 +243,7 @@ func Elfinit(ctxt *Link) {
        switch ctxt.Arch.Family {
        // 64-bit architectures
        case sys.PPC64, sys.S390X:
-               if ctxt.Arch.ByteOrder == binary.BigEndian {
+               if ctxt.Arch.ByteOrder == binary.BigEndian && ctxt.HeadType != objabi.Hopenbsd {
                        ehdr.Flags = 1 /* Version 1 ABI */
                } else {
                        ehdr.Flags = 2 /* Version 2 ABI */
index d537bc533c36836dde28d2035658b13e32ef6d08..14294c77633c851882f4e8d8c6210e23eae1b1d9 100644 (file)
@@ -270,9 +270,8 @@ func genstubs(ctxt *ld.Link, ldr *loader.Loader) {
        for _, s := range ctxt.Textp {
                relocs := ldr.Relocs(s)
                for i := 0; i < relocs.Count(); i++ {
-                       r := relocs.At(i)
-                       switch r.Type() {
-                       case objabi.ElfRelocOffset + objabi.RelocType(elf.R_PPC64_REL24):
+                       switch r := relocs.At(i); r.Type() {
+                       case objabi.ElfRelocOffset + objabi.RelocType(elf.R_PPC64_REL24), objabi.R_CALLPOWER:
                                switch ldr.SymType(r.Sym()) {
                                case sym.SDYNIMPORT:
                                        // This call goes through the PLT, generate and call through a PLT stub.
@@ -633,7 +632,7 @@ func addelfdynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s lo
                su.SetRelocAdd(rIdx, r.Add()+localEoffset)
 
                if targType == sym.SDYNIMPORT {
-                       // Should have been handled in elfsetupplt
+                       // Should have been handled in genstubs
                        ldr.Errorf(s, "unexpected R_PPC64_REL24 for dyn import")
                }
 
@@ -1575,7 +1574,6 @@ func archrelocvariant(target *ld.Target, ldr *loader.Loader, r loader.Reloc, rv
                        var o1 uint32
                        if target.IsBigEndian() {
                                o1 = binary.BigEndian.Uint32(p[r.Off()-2:])
-
                        } else {
                                o1 = binary.LittleEndian.Uint32(p[r.Off():])
                        }
index 3fc6622bffc0ccc2068ab93f8be27523cf12c737..7de0f8eac656e6c2544838a931709057de9c7da9 100644 (file)
@@ -71,7 +71,7 @@ func Init() (*sys.Arch, ld.Arch) {
                        LinuxdynldMusl: musl,
 
                        Freebsddynld:   "XXX",
-                       Openbsddynld:   "XXX",
+                       Openbsddynld:   "/usr/libexec/ld.so",
                        Netbsddynld:    "XXX",
                        Dragonflydynld: "XXX",
                        Solarisdynld:   "XXX",
@@ -100,7 +100,8 @@ func archinit(ctxt *ld.Link) {
                        *ld.FlagRound = 4096
                }
 
-       case objabi.Hlinux: /* ppc64 elf */
+       case objabi.Hlinux, /* ppc64 elf */
+               objabi.Hopenbsd:
                ld.Elfinit(ctxt)
                ld.HEADR = ld.ELFRESERVE
                if *ld.FlagTextAddr == -1 {
index 7fc3bfd25d71c0aabe3c6aed015c1899b12feb36..c18f12602da995dbe7fa7784d2c53e3ab9177f53 100644 (file)
@@ -99,7 +99,9 @@ func MustLinkExternal(goos, goarch string, withCgo bool) bool {
                case "ppc64":
                        // Big Endian PPC64 cgo internal linking is not implemented for aix or linux.
                        // https://go.dev/issue/8912
-                       return true
+                       if goos == "aix" || goos == "linux" {
+                               return true
+                       }
                }
 
                switch goos {