]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link/internal/ld: add support for GOARCH=mips{,le}
authorVladimir Stefanovic <vladimir.stefanovic@imgtec.com>
Tue, 18 Oct 2016 21:50:45 +0000 (23:50 +0200)
committerBrad Fitzpatrick <bradfitz@golang.org>
Fri, 4 Nov 2016 19:27:35 +0000 (19:27 +0000)
Change-Id: Ida214ccc5858969ea60abb0787f4d98bab4336d6
Reviewed-on: https://go-review.googlesource.com/31480
TryBot-Result: Gobot Gobot <gobot@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
src/cmd/link/internal/ld/elf.go
src/cmd/link/internal/ld/ldelf.go

index c331944ecbc80003eb72bef41eb8fe7ba4e5ef67..bfd449847b7612435d2df4703cd8a96a512102e4 100644 (file)
@@ -946,18 +946,22 @@ func Elfinit(ctxt *Link) {
                ehdr.shentsize = ELF64SHDRSIZE /* Must be ELF64SHDRSIZE */
 
        // 32-bit architectures
-       case sys.ARM:
-               // we use EABI on linux/arm, freebsd/arm, netbsd/arm.
-               if Headtype == obj.Hlinux || Headtype == obj.Hfreebsd || Headtype == obj.Hnetbsd {
-                       // We set a value here that makes no indication of which
-                       // float ABI the object uses, because this is information
-                       // used by the dynamic linker to compare executables and
-                       // shared libraries -- so it only matters for cgo calls, and
-                       // the information properly comes from the object files
-                       // produced by the host C compiler. parseArmAttributes in
-                       // ldelf.go reads that information and updates this field as
-                       // appropriate.
-                       ehdr.flags = 0x5000002 // has entry point, Version5 EABI
+       case sys.ARM, sys.MIPS:
+               if SysArch.Family == sys.ARM {
+                       // we use EABI on linux/arm, freebsd/arm, netbsd/arm.
+                       if Headtype == obj.Hlinux || Headtype == obj.Hfreebsd || Headtype == obj.Hnetbsd {
+                               // We set a value here that makes no indication of which
+                               // float ABI the object uses, because this is information
+                               // used by the dynamic linker to compare executables and
+                               // shared libraries -- so it only matters for cgo calls, and
+                               // the information properly comes from the object files
+                               // produced by the host C compiler. parseArmAttributes in
+                               // ldelf.go reads that information and updates this field as
+                               // appropriate.
+                               ehdr.flags = 0x5000002 // has entry point, Version5 EABI
+                       }
+               } else if SysArch.Family == sys.MIPS {
+                       ehdr.flags = 0x50000000 /* MIPS 32 */
                }
                fallthrough
        default:
index 6faa4a19189d3b656ad48d5ab2a9ebb16839a8d1..d700aa6edeb7134b05adc894c7def8fa082df781 100644 (file)
@@ -546,6 +546,12 @@ func ldelf(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) {
                Errorf(nil, "%s: elf %s unimplemented", pn, SysArch.Name)
                return
 
+       case sys.MIPS:
+               if elfobj.machine != ElfMachMips || hdr.Ident[4] != ElfClass32 {
+                       Errorf(nil, "%s: elf object but not mips", pn)
+                       return
+               }
+
        case sys.MIPS64:
                if elfobj.machine != ElfMachMips || hdr.Ident[4] != ElfClass64 {
                        Errorf(nil, "%s: elf object but not mips64", pn)