]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: generate dynamic relocs for internal PIE
authorDavid Crawshaw <crawshaw@golang.org>
Tue, 6 Sep 2016 03:49:53 +0000 (23:49 -0400)
committerDavid Crawshaw <crawshaw@golang.org>
Sun, 11 Sep 2016 20:30:47 +0000 (20:30 +0000)
This reuses the machinery built for dynamic loading of shared
libraries. The significant difference with PIE is we generate
dynamic relocations for known internal symbols, not just
dynamic external symbols.

Part of adding PIE internal linking on linux/amd64.

Change-Id: I4afa24070bfb61f94f8d3648f2433d5343bac3fe
Reviewed-on: https://go-review.googlesource.com/28539
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: David Crawshaw <crawshaw@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/link/internal/amd64/asm.go
src/cmd/link/internal/arm/asm.go
src/cmd/link/internal/arm64/asm.go
src/cmd/link/internal/ld/data.go
src/cmd/link/internal/ld/lib.go
src/cmd/link/internal/mips64/asm.go
src/cmd/link/internal/ppc64/asm.go
src/cmd/link/internal/s390x/asm.go
src/cmd/link/internal/x86/asm.go

index 5abf79f8187c348d0bacb3a70c17ceb613e8300a..ea99e7f25975db5142d24eec1cd8ca8303da4bd5 100644 (file)
@@ -93,7 +93,7 @@ func gentext(ctxt *ld.Link) {
        ld.Addaddr(ctxt, initarray_entry, initfunc)
 }
 
-func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
+func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
        targ := r.Sym
        ctxt.Cursym = s
 
@@ -101,7 +101,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
        default:
                if r.Type >= 256 {
                        ctxt.Diag("unexpected relocation type %d", r.Type)
-                       return
+                       return false
                }
 
                // Handle relocations found in ELF object files.
@@ -114,7 +114,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
                }
                r.Type = obj.R_PCREL
                r.Add += 4
-               return
+               return true
 
        case 256 + ld.R_X86_64_PLT32:
                r.Type = obj.R_PCREL
@@ -125,7 +125,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
                        r.Add += int64(targ.Plt)
                }
 
-               return
+               return true
 
        case 256 + ld.R_X86_64_GOTPCREL, 256 + ld.R_X86_64_GOTPCRELX, 256 + ld.R_X86_64_REX_GOTPCRELX:
                if targ.Type != obj.SDYNIMPORT {
@@ -136,7 +136,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
 
                                r.Type = obj.R_PCREL
                                r.Add += 4
-                               return
+                               return true
                        }
                }
 
@@ -148,14 +148,14 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
                r.Sym = ld.Linklookup(ctxt, ".got", 0)
                r.Add += 4
                r.Add += int64(targ.Got)
-               return
+               return true
 
        case 256 + ld.R_X86_64_64:
                if targ.Type == obj.SDYNIMPORT {
                        ctxt.Diag("unexpected R_X86_64_64 relocation for dynamic symbol %s", targ.Name)
                }
                r.Type = obj.R_ADDR
-               return
+               return true
 
        // Handle relocations found in Mach-O object files.
        case 512 + ld.MACHO_X86_64_RELOC_UNSIGNED*2 + 0,
@@ -167,7 +167,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
                if targ.Type == obj.SDYNIMPORT {
                        ctxt.Diag("unexpected reloc for dynamic symbol %s", targ.Name)
                }
-               return
+               return true
 
        case 512 + ld.MACHO_X86_64_RELOC_BRANCH*2 + 1:
                if targ.Type == obj.SDYNIMPORT {
@@ -175,7 +175,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
                        r.Sym = ld.Linklookup(ctxt, ".plt", 0)
                        r.Add = int64(targ.Plt)
                        r.Type = obj.R_PCREL
-                       return
+                       return true
                }
                fallthrough
 
@@ -190,7 +190,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
                if targ.Type == obj.SDYNIMPORT {
                        ctxt.Diag("unexpected pc-relative reloc for dynamic symbol %s", targ.Name)
                }
-               return
+               return true
 
        case 512 + ld.MACHO_X86_64_RELOC_GOT_LOAD*2 + 1:
                if targ.Type != obj.SDYNIMPORT {
@@ -198,12 +198,12 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
                        // turn MOVQ of GOT entry into LEAQ of symbol itself
                        if r.Off < 2 || s.P[r.Off-2] != 0x8b {
                                ctxt.Diag("unexpected GOT_LOAD reloc for non-dynamic symbol %s", targ.Name)
-                               return
+                               return false
                        }
 
                        s.P[r.Off-2] = 0x8d
                        r.Type = obj.R_PCREL
-                       return
+                       return true
                }
                fallthrough
 
@@ -216,26 +216,25 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
                r.Type = obj.R_PCREL
                r.Sym = ld.Linklookup(ctxt, ".got", 0)
                r.Add += int64(targ.Got)
-               return
-       }
-
-       // Handle references to ELF symbols from our own object files.
-       if targ.Type != obj.SDYNIMPORT {
-               return
+               return true
        }
 
        switch r.Type {
        case obj.R_CALL,
                obj.R_PCREL:
+               if targ.Type != obj.SDYNIMPORT {
+                       // nothing to do, the relocation will be laid out in reloc
+                       return true
+               }
                if ld.Headtype == obj.Hwindows || ld.Headtype == obj.Hwindowsgui {
                        // nothing to do, the relocation will be laid out in pereloc1
-                       return
+                       return true
                } else {
                        // for both ELF and Mach-O
                        addpltsym(ctxt, targ)
                        r.Sym = ld.Linklookup(ctxt, ".plt", 0)
                        r.Add = int64(targ.Plt)
-                       return
+                       return true
                }
 
        case obj.R_ADDR:
@@ -244,7 +243,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
                                addpltsym(ctxt, targ)
                                r.Sym = ld.Linklookup(ctxt, ".plt", 0)
                                r.Add += int64(targ.Plt)
-                               return
+                               return true
                        }
                        // The code is asking for the address of an external
                        // function. We provide it with the address of the
@@ -253,10 +252,10 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
 
                        r.Sym = ld.Linklookup(ctxt, ".got", 0)
                        r.Add += int64(targ.Got)
-                       return
+                       return true
                }
 
-               if s.Type != obj.SDATA {
+               if s.Type != obj.SDATA && s.Type != obj.SRODATA {
                        break
                }
                if ld.Iself {
@@ -270,7 +269,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
                        }
                        ld.Adduint64(ctxt, rela, uint64(r.Add))
                        r.Type = 256 // ignore during relocsym
-                       return
+                       return true
                }
 
                if ld.Headtype == obj.Hdarwin && s.Size == int64(ld.SysArch.PtrSize) && r.Off == 0 {
@@ -295,17 +294,16 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
                        ld.Adduint64(ctxt, got, 0)
                        ld.Adduint32(ctxt, ld.Linklookup(ctxt, ".linkedit.got", 0), uint32(targ.Dynid))
                        r.Type = 256 // ignore during relocsym
-                       return
+                       return true
                }
 
                if ld.Headtype == obj.Hwindows || ld.Headtype == obj.Hwindowsgui {
                        // nothing to do, the relocation will be laid out in pereloc1
-                       return
+                       return true
                }
        }
 
-       ctxt.Cursym = s
-       ctxt.Diag("unsupported relocation for dynamic symbol %s (type=%d stype=%d)", targ.Name, r.Type, targ.Type)
+       return false
 }
 
 func elfreloc1(ctxt *ld.Link, r *ld.Reloc, sectoff int64) int {
index ae6f35dde570e9cdb76612fb3c0df14e1957c0d4..68efc2129a52182266eced6331cd55e3e1400d8b 100644 (file)
@@ -109,7 +109,7 @@ func braddoff(a int32, b int32) int32 {
        return int32((uint32(a))&0xff000000 | 0x00ffffff&uint32(a+b))
 }
 
-func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
+func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
        targ := r.Sym
        ctxt.Cursym = s
 
@@ -117,7 +117,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
        default:
                if r.Type >= 256 {
                        ctxt.Diag("unexpected relocation type %d", r.Type)
-                       return
+                       return false
                }
 
                // Handle relocations found in ELF object files.
@@ -130,11 +130,11 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
                        r.Add = int64(braddoff(int32(r.Add), targ.Plt/4))
                }
 
-               return
+               return true
 
        case 256 + ld.R_ARM_THM_PC22: // R_ARM_THM_CALL
                ld.Exitf("R_ARM_THM_CALL, are you using -marm?")
-               return
+               return false
 
        case 256 + ld.R_ARM_GOT32: // R_ARM_GOT_BREL
                if targ.Type != obj.SDYNIMPORT {
@@ -146,7 +146,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
                r.Type = obj.R_CONST // write r->add during relocsym
                r.Sym = nil
                r.Add += int64(targ.Got)
-               return
+               return true
 
        case 256 + ld.R_ARM_GOT_PREL: // GOT(nil) + A - nil
                if targ.Type != obj.SDYNIMPORT {
@@ -158,19 +158,19 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
                r.Type = obj.R_PCREL
                r.Sym = ld.Linklookup(ctxt, ".got", 0)
                r.Add += int64(targ.Got) + 4
-               return
+               return true
 
        case 256 + ld.R_ARM_GOTOFF: // R_ARM_GOTOFF32
                r.Type = obj.R_GOTOFF
 
-               return
+               return true
 
        case 256 + ld.R_ARM_GOTPC: // R_ARM_BASE_PREL
                r.Type = obj.R_PCREL
 
                r.Sym = ld.Linklookup(ctxt, ".got", 0)
                r.Add += 4
-               return
+               return true
 
        case 256 + ld.R_ARM_CALL:
                r.Type = obj.R_CALLARM
@@ -180,20 +180,20 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
                        r.Add = int64(braddoff(int32(r.Add), targ.Plt/4))
                }
 
-               return
+               return true
 
        case 256 + ld.R_ARM_REL32: // R_ARM_REL32
                r.Type = obj.R_PCREL
 
                r.Add += 4
-               return
+               return true
 
        case 256 + ld.R_ARM_ABS32:
                if targ.Type == obj.SDYNIMPORT {
                        ctxt.Diag("unexpected R_ARM_ABS32 relocation for dynamic symbol %s", targ.Name)
                }
                r.Type = obj.R_ADDR
-               return
+               return true
 
                // we can just ignore this, because we are targeting ARM V5+ anyway
        case 256 + ld.R_ARM_V4BX:
@@ -203,7 +203,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
                }
 
                r.Sym = nil
-               return
+               return true
 
        case 256 + ld.R_ARM_PC24,
                256 + ld.R_ARM_JUMP24:
@@ -214,12 +214,12 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
                        r.Add = int64(braddoff(int32(r.Add), targ.Plt/4))
                }
 
-               return
+               return true
        }
 
        // Handle references to ELF symbols from our own object files.
        if targ.Type != obj.SDYNIMPORT {
-               return
+               return true
        }
 
        switch r.Type {
@@ -227,7 +227,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
                addpltsym(ctxt, targ)
                r.Sym = ld.Linklookup(ctxt, ".plt", 0)
                r.Add = int64(targ.Plt)
-               return
+               return true
 
        case obj.R_ADDR:
                if s.Type != obj.SDATA {
@@ -240,12 +240,11 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
                        ld.Adduint32(ctxt, rel, ld.ELF32_R_INFO(uint32(targ.Dynid), ld.R_ARM_GLOB_DAT)) // we need a nil + A dynamic reloc
                        r.Type = obj.R_CONST                                                            // write r->add during relocsym
                        r.Sym = nil
-                       return
+                       return true
                }
        }
 
-       ctxt.Cursym = s
-       ctxt.Diag("unsupported relocation for dynamic symbol %s (type=%d stype=%d)", targ.Name, r.Type, targ.Type)
+       return false
 }
 
 func elfreloc1(ctxt *ld.Link, r *ld.Reloc, sectoff int64) int {
index 66613d46867950c46b13513026a528e4d3a3afb2..17f8a7354e8126f4b35d1b6f87a930fa47983e21 100644 (file)
@@ -86,8 +86,9 @@ func gentext(ctxt *ld.Link) {
        ld.Addaddr(ctxt, initarray_entry, initfunc)
 }
 
-func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
+func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
        log.Fatalf("adddynrel not implemented")
+       return false
 }
 
 func elfreloc1(ctxt *ld.Link, r *ld.Reloc, sectoff int64) int {
index 07911e2328e14ee389a9186a14f5d66af1a15563..73e2717ed991ec59fef299e6b07e4ea396cab919 100644 (file)
@@ -701,11 +701,21 @@ func dynrelocsym(ctxt *Link, s *Symbol) {
 
        for ri := 0; ri < len(s.R); ri++ {
                r := &s.R[ri]
+               if Buildmode == BuildmodePIE && Linkmode == LinkInternal {
+                       // It's expected that some relocations will be done
+                       // later by relocsym (R_TLS_LE, R_ADDROFF), so
+                       // don't worry if Adddynrel returns false.
+                       Thearch.Adddynrel(ctxt, s, r)
+                       continue
+               }
                if r.Sym != nil && r.Sym.Type == obj.SDYNIMPORT || r.Type >= 256 {
                        if r.Sym != nil && !r.Sym.Attr.Reachable() {
                                ctxt.Diag("internal inconsistency: dynamic symbol %s is not reachable.", r.Sym.Name)
                        }
-                       Thearch.Adddynrel(ctxt, s, r)
+                       if !Thearch.Adddynrel(ctxt, s, r) {
+                               ctxt.Cursym = s
+                               ctxt.Diag("unsupported relocation for dynamic symbol %s (type=%d stype=%d)", r.Sym.Name, r.Type, r.Sym.Type)
+                       }
                }
        }
 }
index c7e2c2433ff292ed8095cb8efc36480e14463448..76047905be8167995039d9f41d9f46ae1075d6d6 100644 (file)
@@ -95,7 +95,7 @@ type Arch struct {
        Openbsddynld     string
        Dragonflydynld   string
        Solarisdynld     string
-       Adddynrel        func(*Link, *Symbol, *Reloc)
+       Adddynrel        func(*Link, *Symbol, *Reloc) bool
        Archinit         func(*Link)
        Archreloc        func(*Link, *Reloc, *Symbol, *int64) int
        Archrelocvariant func(*Link, *Reloc, *Symbol, int64) int64
index f0c5926a19790a56f545e55a1ab41c94f04434af..869bc139b333d39580b2e78258e067ef858e028c 100644 (file)
@@ -40,8 +40,9 @@ import (
 
 func gentext(ctxt *ld.Link) {}
 
-func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
+func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
        log.Fatalf("adddynrel not implemented")
+       return false
 }
 
 func elfreloc1(ctxt *ld.Link, r *ld.Reloc, sectoff int64) int {
index 3bbe9ec8baaa68eea4816c9145999036d1520e71..7f009f7c9a3be422d47ca0551145b99f6a95a6ae 100644 (file)
@@ -240,7 +240,7 @@ func gencallstub(ctxt *ld.Link, abicase int, stub *ld.Symbol, targ *ld.Symbol) {
        ld.Adduint32(ctxt, stub, 0x4e800420) // bctr
 }
 
-func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
+func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
        targ := r.Sym
        ctxt.Cursym = s
 
@@ -248,7 +248,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
        default:
                if r.Type >= 256 {
                        ctxt.Diag("unexpected relocation type %d", r.Type)
-                       return
+                       return false
                }
 
                // Handle relocations found in ELF object files.
@@ -267,7 +267,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
                        ctxt.Diag("unexpected R_PPC64_REL24 for dyn import")
                }
 
-               return
+               return true
 
        case 256 + ld.R_PPC_REL32:
                r.Type = obj.R_PCREL
@@ -277,7 +277,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
                        ctxt.Diag("unexpected R_PPC_REL32 for dyn import")
                }
 
-               return
+               return true
 
        case 256 + ld.R_PPC64_ADDR64:
                r.Type = obj.R_ADDR
@@ -292,65 +292,65 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
                        r.Type = 256 // ignore during relocsym
                }
 
-               return
+               return true
 
        case 256 + ld.R_PPC64_TOC16:
                r.Type = obj.R_POWER_TOC
                r.Variant = ld.RV_POWER_LO | ld.RV_CHECK_OVERFLOW
-               return
+               return true
 
        case 256 + ld.R_PPC64_TOC16_LO:
                r.Type = obj.R_POWER_TOC
                r.Variant = ld.RV_POWER_LO
-               return
+               return true
 
        case 256 + ld.R_PPC64_TOC16_HA:
                r.Type = obj.R_POWER_TOC
                r.Variant = ld.RV_POWER_HA | ld.RV_CHECK_OVERFLOW
-               return
+               return true
 
        case 256 + ld.R_PPC64_TOC16_HI:
                r.Type = obj.R_POWER_TOC
                r.Variant = ld.RV_POWER_HI | ld.RV_CHECK_OVERFLOW
-               return
+               return true
 
        case 256 + ld.R_PPC64_TOC16_DS:
                r.Type = obj.R_POWER_TOC
                r.Variant = ld.RV_POWER_DS | ld.RV_CHECK_OVERFLOW
-               return
+               return true
 
        case 256 + ld.R_PPC64_TOC16_LO_DS:
                r.Type = obj.R_POWER_TOC
                r.Variant = ld.RV_POWER_DS
-               return
+               return true
 
        case 256 + ld.R_PPC64_REL16_LO:
                r.Type = obj.R_PCREL
                r.Variant = ld.RV_POWER_LO
                r.Add += 2 // Compensate for relocation size of 2
-               return
+               return true
 
        case 256 + ld.R_PPC64_REL16_HI:
                r.Type = obj.R_PCREL
                r.Variant = ld.RV_POWER_HI | ld.RV_CHECK_OVERFLOW
                r.Add += 2
-               return
+               return true
 
        case 256 + ld.R_PPC64_REL16_HA:
                r.Type = obj.R_PCREL
                r.Variant = ld.RV_POWER_HA | ld.RV_CHECK_OVERFLOW
                r.Add += 2
-               return
+               return true
        }
 
        // Handle references to ELF symbols from our own object files.
        if targ.Type != obj.SDYNIMPORT {
-               return
+               return true
        }
 
        // TODO(austin): Translate our relocations to ELF
 
-       ctxt.Diag("unsupported relocation for dynamic symbol %s (type=%d stype=%d)", targ.Name, r.Type, targ.Type)
+       return false
 }
 
 func elfreloc1(ctxt *ld.Link, r *ld.Reloc, sectoff int64) int {
index 0c44ccd384c4f737b2daeecb41c4448484bf00c6..d20402736c815a1df2202d02b822dec1507c0ce5 100644 (file)
@@ -98,7 +98,7 @@ func gentext(ctxt *ld.Link) {
        ld.Addaddr(ctxt, initarray_entry, initfunc)
 }
 
-func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
+func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
        targ := r.Sym
        ctxt.Cursym = s
 
@@ -106,14 +106,14 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
        default:
                if r.Type >= 256 {
                        ctxt.Diag("unexpected relocation type %d", r.Type)
-                       return
+                       return false
                }
 
                // Handle relocations found in ELF object files.
        case 256 + ld.R_390_12,
                256 + ld.R_390_GOT12:
                ctxt.Diag("s390x 12-bit relocations have not been implemented (relocation type %d)", r.Type-256)
-               return
+               return false
 
        case 256 + ld.R_390_8,
                256 + ld.R_390_16,
@@ -123,7 +123,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
                        ctxt.Diag("unexpected R_390_nn relocation for dynamic symbol %s", targ.Name)
                }
                r.Type = obj.R_ADDR
-               return
+               return true
 
        case 256 + ld.R_390_PC16,
                256 + ld.R_390_PC32,
@@ -136,13 +136,13 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
                }
                r.Type = obj.R_PCREL
                r.Add += int64(r.Siz)
-               return
+               return true
 
        case 256 + ld.R_390_GOT16,
                256 + ld.R_390_GOT32,
                256 + ld.R_390_GOT64:
                ctxt.Diag("unimplemented S390x relocation: %v", r.Type-256)
-               return
+               return true
 
        case 256 + ld.R_390_PLT16DBL,
                256 + ld.R_390_PLT32DBL:
@@ -154,7 +154,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
                        r.Sym = ld.Linklookup(ctxt, ".plt", 0)
                        r.Add += int64(targ.Plt)
                }
-               return
+               return true
 
        case 256 + ld.R_390_PLT32,
                256 + ld.R_390_PLT64:
@@ -165,32 +165,36 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
                        r.Sym = ld.Linklookup(ctxt, ".plt", 0)
                        r.Add += int64(targ.Plt)
                }
-               return
+               return true
 
        case 256 + ld.R_390_COPY:
                ctxt.Diag("unimplemented S390x relocation: %v", r.Type-256)
+               return false
 
        case 256 + ld.R_390_GLOB_DAT:
                ctxt.Diag("unimplemented S390x relocation: %v", r.Type-256)
+               return false
 
        case 256 + ld.R_390_JMP_SLOT:
                ctxt.Diag("unimplemented S390x relocation: %v", r.Type-256)
+               return false
 
        case 256 + ld.R_390_RELATIVE:
                ctxt.Diag("unimplemented S390x relocation: %v", r.Type-256)
+               return false
 
        case 256 + ld.R_390_GOTOFF:
                if targ.Type == obj.SDYNIMPORT {
                        ctxt.Diag("unexpected R_390_GOTOFF relocation for dynamic symbol %s", targ.Name)
                }
                r.Type = obj.R_GOTOFF
-               return
+               return true
 
        case 256 + ld.R_390_GOTPC:
                r.Type = obj.R_PCREL
                r.Sym = ld.Linklookup(ctxt, ".got", 0)
                r.Add += int64(r.Siz)
-               return
+               return true
 
        case 256 + ld.R_390_PC16DBL,
                256 + ld.R_390_PC32DBL:
@@ -200,14 +204,14 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
                if targ.Type == obj.SDYNIMPORT {
                        ctxt.Diag("unexpected R_390_PCnnDBL relocation for dynamic symbol %s", targ.Name)
                }
-               return
+               return true
 
        case 256 + ld.R_390_GOTPCDBL:
                r.Type = obj.R_PCREL
                r.Variant = ld.RV_390_DBL
                r.Sym = ld.Linklookup(ctxt, ".got", 0)
                r.Add += int64(r.Siz)
-               return
+               return true
 
        case 256 + ld.R_390_GOTENT:
                addgotsym(ctxt, targ)
@@ -217,14 +221,14 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
                r.Sym = ld.Linklookup(ctxt, ".got", 0)
                r.Add += int64(targ.Got)
                r.Add += int64(r.Siz)
-               return
+               return true
        }
        // Handle references to ELF symbols from our own object files.
        if targ.Type != obj.SDYNIMPORT {
-               return
+               return true
        }
 
-       ctxt.Diag("unsupported relocation for dynamic symbol %s (type=%d stype=%d)", targ.Name, r.Type, targ.Type)
+       return false
 }
 
 func elfreloc1(ctxt *ld.Link, r *ld.Reloc, sectoff int64) int {
index 972fc80bf0ec0fba90a5cd343f709888d87be510..2f6be25bf9bc1de7eaa0e0013bbe0eca5af52947 100644 (file)
@@ -159,7 +159,7 @@ func gentext(ctxt *ld.Link) {
        ld.Addaddr(ctxt, initarray_entry, initfunc)
 }
 
-func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
+func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) bool {
        targ := r.Sym
        ctxt.Cursym = s
 
@@ -167,7 +167,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
        default:
                if r.Type >= 256 {
                        ctxt.Diag("unexpected relocation type %d", r.Type)
-                       return
+                       return false
                }
 
                // Handle relocations found in ELF object files.
@@ -180,7 +180,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
                }
                r.Type = obj.R_PCREL
                r.Add += 4
-               return
+               return true
 
        case 256 + ld.R_386_PLT32:
                r.Type = obj.R_PCREL
@@ -191,7 +191,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
                        r.Add += int64(targ.Plt)
                }
 
-               return
+               return true
 
        case 256 + ld.R_386_GOT32, 256 + ld.R_386_GOT32X:
                if targ.Type != obj.SDYNIMPORT {
@@ -201,7 +201,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
                                s.P[r.Off-2] = 0x8d
 
                                r.Type = obj.R_GOTOFF
-                               return
+                               return true
                        }
 
                        if r.Off >= 2 && s.P[r.Off-2] == 0xff && s.P[r.Off-1] == 0xb3 {
@@ -211,42 +211,42 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
 
                                s.P[r.Off-1] = 0x68
                                r.Type = obj.R_ADDR
-                               return
+                               return true
                        }
 
                        ctxt.Diag("unexpected GOT reloc for non-dynamic symbol %s", targ.Name)
-                       return
+                       return false
                }
 
                addgotsym(ctxt, targ)
                r.Type = obj.R_CONST // write r->add during relocsym
                r.Sym = nil
                r.Add += int64(targ.Got)
-               return
+               return true
 
        case 256 + ld.R_386_GOTOFF:
                r.Type = obj.R_GOTOFF
-               return
+               return true
 
        case 256 + ld.R_386_GOTPC:
                r.Type = obj.R_PCREL
                r.Sym = ld.Linklookup(ctxt, ".got", 0)
                r.Add += 4
-               return
+               return true
 
        case 256 + ld.R_386_32:
                if targ.Type == obj.SDYNIMPORT {
                        ctxt.Diag("unexpected R_386_32 relocation for dynamic symbol %s", targ.Name)
                }
                r.Type = obj.R_ADDR
-               return
+               return true
 
        case 512 + ld.MACHO_GENERIC_RELOC_VANILLA*2 + 0:
                r.Type = obj.R_ADDR
                if targ.Type == obj.SDYNIMPORT {
                        ctxt.Diag("unexpected reloc for dynamic symbol %s", targ.Name)
                }
-               return
+               return true
 
        case 512 + ld.MACHO_GENERIC_RELOC_VANILLA*2 + 1:
                if targ.Type == obj.SDYNIMPORT {
@@ -254,11 +254,11 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
                        r.Sym = ld.Linklookup(ctxt, ".plt", 0)
                        r.Add = int64(targ.Plt)
                        r.Type = obj.R_PCREL
-                       return
+                       return true
                }
 
                r.Type = obj.R_PCREL
-               return
+               return true
 
        case 512 + ld.MACHO_FAKE_GOTPCREL:
                if targ.Type != obj.SDYNIMPORT {
@@ -266,33 +266,32 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
                        // turn MOVL of GOT entry into LEAL of symbol itself
                        if r.Off < 2 || s.P[r.Off-2] != 0x8b {
                                ctxt.Diag("unexpected GOT reloc for non-dynamic symbol %s", targ.Name)
-                               return
+                               return false
                        }
 
                        s.P[r.Off-2] = 0x8d
                        r.Type = obj.R_PCREL
-                       return
+                       return true
                }
 
                addgotsym(ctxt, targ)
                r.Sym = ld.Linklookup(ctxt, ".got", 0)
                r.Add += int64(targ.Got)
                r.Type = obj.R_PCREL
-               return
+               return true
        }
 
        // Handle references to ELF symbols from our own object files.
        if targ.Type != obj.SDYNIMPORT {
-               return
+               return true
        }
-
        switch r.Type {
        case obj.R_CALL,
                obj.R_PCREL:
                addpltsym(ctxt, targ)
                r.Sym = ld.Linklookup(ctxt, ".plt", 0)
                r.Add = int64(targ.Plt)
-               return
+               return true
 
        case obj.R_ADDR:
                if s.Type != obj.SDATA {
@@ -305,7 +304,7 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
                        ld.Adduint32(ctxt, rel, ld.ELF32_R_INFO(uint32(targ.Dynid), ld.R_386_32))
                        r.Type = obj.R_CONST // write r->add during relocsym
                        r.Sym = nil
-                       return
+                       return true
                }
 
                if ld.Headtype == obj.Hdarwin && s.Size == int64(ld.SysArch.PtrSize) && r.Off == 0 {
@@ -330,17 +329,16 @@ func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
                        ld.Adduint32(ctxt, got, 0)
                        ld.Adduint32(ctxt, ld.Linklookup(ctxt, ".linkedit.got", 0), uint32(targ.Dynid))
                        r.Type = 256 // ignore during relocsym
-                       return
+                       return true
                }
 
                if (ld.Headtype == obj.Hwindows || ld.Headtype == obj.Hwindowsgui) && s.Size == int64(ld.SysArch.PtrSize) {
                        // nothing to do, the relocation will be laid out in pereloc1
-                       return
+                       return true
                }
        }
 
-       ctxt.Cursym = s
-       ctxt.Diag("unsupported relocation for dynamic symbol %s (type=%d stype=%d)", targ.Name, r.Type, targ.Type)
+       return false
 }
 
 func elfreloc1(ctxt *ld.Link, r *ld.Reloc, sectoff int64) int {