]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/ld, cmd/7l: external linking support for linux/arm64
authorShenghou Ma <minux@golang.org>
Fri, 3 Apr 2015 08:37:11 +0000 (04:37 -0400)
committerMinux Ma <minux@golang.org>
Wed, 8 Apr 2015 09:07:32 +0000 (09:07 +0000)
Based on Michael Hudson-Doyle's patch:
https://github.com/4ad/go/commit/b735215ee41b4237ec393d4669f6f55d4b27babc

Change-Id: I309e3df7608b9eef9339196fdc50dedf5f9439f0
Reviewed-on: https://go-review.googlesource.com/8437
Reviewed-by: Aram Hăvărneanu <aram@mgk.ro>
Reviewed-by: David Crawshaw <crawshaw@golang.org>
src/cmd/7l/asm.go
src/cmd/7l/obj.go
src/cmd/internal/ld/dwarf.go
src/cmd/internal/ld/elf.go
src/cmd/internal/ld/lib.go
src/cmd/internal/ld/symtab.go

index d597acecbe1ade5dd1042ec5b15f285c9f947857..379e9837b64c665104ab238e077fd247e4cfbbb6 100644 (file)
@@ -66,8 +66,33 @@ func adddynrel(s *ld.LSym, r *ld.Reloc) {
 }
 
 func elfreloc1(r *ld.Reloc, sectoff int64) int {
-       // TODO(minux)
-       return -1
+       ld.Thearch.Vput(uint64(sectoff))
+
+       elfsym := r.Xsym.Elfsym
+       switch r.Type {
+       default:
+               return -1
+
+       case ld.R_ADDR:
+               switch r.Siz {
+               case 4:
+                       ld.Thearch.Vput(ld.R_AARCH64_ABS32 | uint64(elfsym)<<32)
+               case 8:
+                       ld.Thearch.Vput(ld.R_AARCH64_ABS64 | uint64(elfsym)<<32)
+               default:
+                       return -1
+               }
+
+       case ld.R_CALLARM64:
+               if r.Siz != 4 {
+                       return -1
+               }
+               ld.Thearch.Vput(ld.R_AARCH64_CALL26 | uint64(elfsym)<<32)
+
+       }
+       ld.Thearch.Vput(uint64(r.Xadd))
+
+       return 0
 }
 
 func elfsetupplt() {
@@ -81,8 +106,18 @@ func machoreloc1(r *ld.Reloc, sectoff int64) int {
 
 func archreloc(r *ld.Reloc, s *ld.LSym, val *int64) int {
        if ld.Linkmode == ld.LinkExternal {
-               // TODO(minux): translate R_CALLARM64 into standard ELF relocation.
-               return -1
+               switch r.Type {
+               default:
+                       return -1
+
+               case ld.R_CALLARM64:
+                       r.Done = 0
+                       r.Xsym = r.Sym
+                       *val = int64(0xfc000000 & uint32(r.Add))
+                       r.Xadd = int64((uint32(r.Add) &^ 0xfc000000) * 4)
+                       r.Add = 0
+                       return 0
+               }
        }
 
        switch r.Type {
@@ -108,7 +143,7 @@ func archrelocvariant(r *ld.Reloc, s *ld.LSym, t int64) int64 {
 }
 
 func adddynsym(ctxt *ld.Link, s *ld.LSym) {
-       log.Fatalf("adddynsym not implemented")
+       // TODO(minux): implement when needed.
 }
 
 func adddynlib(lib string) {
index 3fa70f2019d02e717a990068f43d9ae4d427ee91..35a0fa8f1c9720fe6e3c65b5c332cfe0c5b4a1a7 100644 (file)
@@ -96,6 +96,8 @@ func archinit() {
                if ld.Linkmode == ld.LinkExternal && obj.Getgoextlinkenabled() != "1" {
                        log.Fatalf("cannot use -linkmode=external with -H %s", ld.Headstr(int(ld.HEADTYPE)))
                }
+       case ld.Hlinux:
+               break
        }
 
        switch ld.HEADTYPE {
index 37625f191240e2ba853f4cbf82b9851c92fa1369..c9f13cf29d00f52174cf5d24e1e1dc81d5c9c1b8 100644 (file)
@@ -2367,12 +2367,13 @@ func dwarfaddshstrings(shstrtab *LSym) {
        elfstrdbg[ElfStrDebugStr] = Addstring(shstrtab, ".debug_str")
        elfstrdbg[ElfStrGDBScripts] = Addstring(shstrtab, ".debug_gdb_scripts")
        if Linkmode == LinkExternal {
-               if Thearch.Thechar == '6' || Thearch.Thechar == '9' {
+               switch Thearch.Thechar {
+               case '6', '7', '9':
                        elfstrdbg[ElfStrRelDebugInfo] = Addstring(shstrtab, ".rela.debug_info")
                        elfstrdbg[ElfStrRelDebugAranges] = Addstring(shstrtab, ".rela.debug_aranges")
                        elfstrdbg[ElfStrRelDebugLine] = Addstring(shstrtab, ".rela.debug_line")
                        elfstrdbg[ElfStrRelDebugFrame] = Addstring(shstrtab, ".rela.debug_frame")
-               } else {
+               default:
                        elfstrdbg[ElfStrRelDebugInfo] = Addstring(shstrtab, ".rel.debug_info")
                        elfstrdbg[ElfStrRelDebugAranges] = Addstring(shstrtab, ".rel.debug_aranges")
                        elfstrdbg[ElfStrRelDebugLine] = Addstring(shstrtab, ".rel.debug_line")
@@ -2419,9 +2420,10 @@ func dwarfaddelfsectionsyms() {
 
 func dwarfaddelfrelocheader(elfstr int, shdata *ElfShdr, off int64, size int64) {
        sh := newElfShdr(elfstrdbg[elfstr])
-       if Thearch.Thechar == '6' || Thearch.Thechar == '9' {
+       switch Thearch.Thechar {
+       case '6', '7', '9':
                sh.type_ = SHT_RELA
-       } else {
+       default:
                sh.type_ = SHT_REL
        }
 
index f2d819de8c2b5e674d106e3cc1bde2f059326cbc..86a2aa501ef8df3ea31d6e54df62cf54dffc360d 100644 (file)
@@ -1489,10 +1489,11 @@ func elfshreloc(sect *Section) *ElfShdr {
 
        var prefix string
        var typ int
-       if Thearch.Thechar == '6' || Thearch.Thechar == '9' {
+       switch Thearch.Thechar {
+       case '6', '7', '9':
                prefix = ".rela"
                typ = SHT_RELA
-       } else {
+       default:
                prefix = ".rel"
                typ = SHT_REL
        }
@@ -1657,9 +1658,10 @@ func doelf() {
 
        if Flag_shared != 0 {
                Addstring(shstrtab, ".init_array")
-               if Thearch.Thechar == '6' || Thearch.Thechar == '9' {
+               switch Thearch.Thechar {
+               case '6', '7', '9':
                        Addstring(shstrtab, ".rela.init_array")
-               } else {
+               default:
                        Addstring(shstrtab, ".rel.init_array")
                }
        }
@@ -1683,10 +1685,11 @@ func doelf() {
                Addstring(shstrtab, ".dynamic")
                Addstring(shstrtab, ".dynsym")
                Addstring(shstrtab, ".dynstr")
-               if Thearch.Thechar == '6' || Thearch.Thechar == '9' {
+               switch Thearch.Thechar {
+               case '6', '7', '9':
                        Addstring(shstrtab, ".rela")
                        Addstring(shstrtab, ".rela.plt")
-               } else {
+               default:
                        Addstring(shstrtab, ".rel")
                        Addstring(shstrtab, ".rel.plt")
                }
@@ -1700,9 +1703,10 @@ func doelf() {
 
                s.Type = SELFROSECT
                s.Reachable = true
-               if Thearch.Thechar == '6' || Thearch.Thechar == '9' {
+               switch Thearch.Thechar {
+               case '6', '7', '9':
                        s.Size += ELF64SYMSIZE
-               } else {
+               default:
                        s.Size += ELF32SYMSIZE
                }
 
@@ -1791,9 +1795,10 @@ func doelf() {
                elfwritedynentsym(s, DT_HASH, Linklookup(Ctxt, ".hash", 0))
 
                elfwritedynentsym(s, DT_SYMTAB, Linklookup(Ctxt, ".dynsym", 0))
-               if Thearch.Thechar == '6' || Thearch.Thechar == '9' {
+               switch Thearch.Thechar {
+               case '6', '7', '9':
                        Elfwritedynent(s, DT_SYMENT, ELF64SYMSIZE)
-               } else {
+               default:
                        Elfwritedynent(s, DT_SYMENT, ELF32SYMSIZE)
                }
                elfwritedynentsym(s, DT_STRTAB, Linklookup(Ctxt, ".dynstr", 0))
index e4b1820ea9fe755af2faa1d80512f66828fa133f..1b4d651068a292637e356d4decf5e0eeb103584d 100644 (file)
@@ -711,6 +711,9 @@ func hostlink() {
 
        case '5':
                argv = append(argv, "-marm")
+
+       case '7':
+               // nothing needed
        }
 
        if Debug['s'] == 0 && debug_s == 0 {
index c6b39333e8280d1459bafc0218cff76ead6ac02c..c5b32fd21f9483b46324106017334ac298e46fc9 100644 (file)
@@ -167,11 +167,9 @@ func putelfsectionsym(s *LSym, shndx int) {
 
 func putelfsymshndx(sympos int64, shndx int) {
        here := Cpos()
-       switch Thearch.Thechar {
-       case '6':
+       if elf64 != 0 {
                Cseek(sympos + 6)
-
-       default:
+       } else {
                Cseek(sympos + 14)
        }