]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/5l, cmd/ld: support generating ELF binaries for NetBSD/ARM
authorShenghou Ma <minux.ma@gmail.com>
Sun, 3 Feb 2013 16:40:11 +0000 (00:40 +0800)
committerShenghou Ma <minux.ma@gmail.com>
Sun, 3 Feb 2013 16:40:11 +0000 (00:40 +0800)
R=golang-dev, dave
CC=golang-dev
https://golang.org/cl/7261043

src/cmd/5l/asm.c
src/cmd/5l/obj.c
src/cmd/ld/elf.c

index e1377defe11c05f8d0b455f8a6ff8981566b242a..11a5f0cbec3b17dddcbd232b31617dd5934475df 100644 (file)
@@ -40,7 +40,7 @@ static Prog *PP;
 char linuxdynld[] = "/lib/ld-linux.so.3"; // 2 for OABI, 3 for EABI
 char freebsddynld[] = "/usr/libexec/ld-elf.so.1";
 char openbsddynld[] = "XXX";
-char netbsddynld[] = "XXX";
+char netbsddynld[] = "/libexec/ld.elf_so";
 
 int32
 entryvalue(void)
@@ -581,9 +581,6 @@ asmb(void)
                case Hplan9x32:
                        symo = HEADR+segtext.len+segdata.filelen;
                        break;
-               case Hnetbsd:
-                       symo = rnd(segdata.filelen, 4096);
-                       break;
                ElfSym:
                        symo = rnd(HEADR+segtext.filelen, INITRND)+segdata.filelen;
                        symo = rnd(symo, INITRND);
index 1f961748d5cd15cedc746a0a278fef0143765780..10c33f25d69c174dfd169fd69c94a7ca124eb5bd 100644 (file)
@@ -48,21 +48,22 @@ Header headers[] = {
    "noheader", Hnoheader,
    "risc", Hrisc,
    "plan9", Hplan9x32,
-   "netbsd", Hnetbsd,
    "ixp1200", Hixp1200,
    "ipaq", Hipaq,
    "linux", Hlinux,
    "freebsd", Hfreebsd,
+   "netbsd", Hnetbsd,
    0, 0
 };
 
 /*
  *     -Hrisc -T0x10005000 -R4         is aif for risc os
  *     -Hplan9 -T4128 -R4096           is plan9 format
- *     -Hnetbsd -T0xF0000020 -R4       is NetBSD format
  *     -Hixp1200                       is IXP1200 (raw)
  *     -Hipaq -T0xC0008010 -R1024      is ipaq
  *     -Hlinux -Tx -Rx                 is linux elf
+ *     -Hfreebsd                       is freebsd elf
+ *     -Hnetbsd                        is netbsd elf
  */
 
 void
@@ -166,15 +167,6 @@ main(int argc, char *argv[])
                if(INITRND == -1)
                        INITRND = 4096;
                break;
-       case Hnetbsd:   /* boot for NetBSD */
-               HEADR = 32L;
-               if(INITTEXT == -1)
-                       INITTEXT = 0xF0000020L;
-               if(INITDAT == -1)
-                       INITDAT = 0;
-               if(INITRND == -1)
-                       INITRND = 4096;
-               break;
        case Hixp1200: /* boot for IXP1200 */
                HEADR = 0L;
                if(INITTEXT == -1)
@@ -195,6 +187,7 @@ main(int argc, char *argv[])
                break;
        case Hlinux:    /* arm elf */
        case Hfreebsd:
+       case Hnetbsd:
                debug['d'] = 0; // with dynamic linking
                tlsoffset = -8; // hardcoded number, first 4-byte word for g, and then 4-byte word for m
                                // this number is known to ../../pkg/runtime/cgo/gcc_linux_arm.c
index 9793feea03b32843548694217e57b870328c1b9b..c771d10ec379b1ff97fb98be233d909907c57ebc 100644 (file)
@@ -55,7 +55,9 @@ elfinit(void)
 
        // 32-bit architectures
        case '5':
-               hdr.flags = 0x5000002; // has entry point, Version5 EABI
+               // we only use EABI on linux/arm
+               if(HEADTYPE == Hlinux)
+                       hdr.flags = 0x5000002; // has entry point, Version5 EABI
                // fallthrough
        default:
                hdr.phoff = ELF32HDRSIZE;       /* Must be be ELF32HDRSIZE: first PHdr must follow ELF header */
@@ -1303,6 +1305,7 @@ asmbelf(vlong symo)
                        sh->type = SHT_REL;
                        sh->flags = SHF_ALLOC;
                        sh->entsize = ELF32RELSIZE;
+                       sh->link = elfshname(".dynsym")->shnum;
                        shsym(sh, lookup(".rel.plt", 0));
 
                        sh = elfshname(".rel");
@@ -1375,15 +1378,17 @@ asmbelf(vlong symo)
                }
        }
 
-       ph = newElfPhdr();
-       ph->type = PT_GNU_STACK;
-       ph->flags = PF_W+PF_R;
-       ph->align = PtrSize;
-       
-       ph = newElfPhdr();
-       ph->type = PT_PAX_FLAGS;
-       ph->flags = 0x2a00; // mprotect, randexec, emutramp disabled
-       ph->align = PtrSize;
+       if(HEADTYPE == Hlinux) {
+               ph = newElfPhdr();
+               ph->type = PT_GNU_STACK;
+               ph->flags = PF_W+PF_R;
+               ph->align = PtrSize;
+               
+               ph = newElfPhdr();
+               ph->type = PT_PAX_FLAGS;
+               ph->flags = 0x2a00; // mprotect, randexec, emutramp disabled
+               ph->align = PtrSize;
+       }
 
 elfobj:
        sh = elfshname(".shstrtab");