}
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)
}
}
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 */
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.
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")
}
var o1 uint32
if target.IsBigEndian() {
o1 = binary.BigEndian.Uint32(p[r.Off()-2:])
-
} else {
o1 = binary.LittleEndian.Uint32(p[r.Off():])
}
LinuxdynldMusl: musl,
Freebsddynld: "XXX",
- Openbsddynld: "XXX",
+ Openbsddynld: "/usr/libexec/ld.so",
Netbsddynld: "XXX",
Dragonflydynld: "XXX",
Solarisdynld: "XXX",
*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 {