]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: turn some globals into flag pointer variables
authorMichael Matloob <matloob@golang.org>
Sun, 21 Aug 2016 22:34:24 +0000 (18:34 -0400)
committerMichael Matloob <matloob@golang.org>
Mon, 22 Aug 2016 14:09:05 +0000 (14:09 +0000)
This moves many of the flag globals into main and assigns them
to their flag.String/Int64/... directly.

Updates #16818

Change-Id: Ibbff44a273bbc5cb7228e43f147900ee8848517f
Reviewed-on: https://go-review.googlesource.com/27473
Reviewed-by: David Crawshaw <crawshaw@golang.org>
26 files changed:
src/cmd/link/internal/amd64/asm.go
src/cmd/link/internal/amd64/obj.go
src/cmd/link/internal/arm/asm.go
src/cmd/link/internal/arm/obj.go
src/cmd/link/internal/arm64/asm.go
src/cmd/link/internal/arm64/obj.go
src/cmd/link/internal/ld/data.go
src/cmd/link/internal/ld/deadcode.go
src/cmd/link/internal/ld/dwarf.go
src/cmd/link/internal/ld/elf.go
src/cmd/link/internal/ld/go.go
src/cmd/link/internal/ld/ld.go
src/cmd/link/internal/ld/lib.go
src/cmd/link/internal/ld/macho.go
src/cmd/link/internal/ld/main.go
src/cmd/link/internal/ld/pe.go
src/cmd/link/internal/ld/symtab.go
src/cmd/link/internal/ld/util.go
src/cmd/link/internal/mips64/asm.go
src/cmd/link/internal/mips64/obj.go
src/cmd/link/internal/ppc64/asm.go
src/cmd/link/internal/ppc64/obj.go
src/cmd/link/internal/s390x/asm.go
src/cmd/link/internal/s390x/obj.go
src/cmd/link/internal/x86/asm.go
src/cmd/link/internal/x86/obj.go

index d8f0978c5f716a12700f69cee5733ae78acf6cbd..3392b4ab007b71e6a5a650d69f9cf1c383a6c41d 100644 (file)
@@ -657,7 +657,7 @@ func asmb(ctxt *ld.Link) {
                break
 
        case obj.Hdarwin:
-               ld.Debug['8'] = true /* 64-bit addresses */
+               ld.Flag8 = true /* 64-bit addresses */
 
        case obj.Hlinux,
                obj.Hfreebsd,
@@ -665,7 +665,7 @@ func asmb(ctxt *ld.Link) {
                obj.Hopenbsd,
                obj.Hdragonfly,
                obj.Hsolaris:
-               ld.Debug['8'] = true /* 64-bit addresses */
+               ld.Flag8 = true /* 64-bit addresses */
 
        case obj.Hnacl,
                obj.Hwindows:
@@ -676,7 +676,7 @@ func asmb(ctxt *ld.Link) {
        ld.Spsize = 0
        ld.Lcsize = 0
        symo := int64(0)
-       if !ld.Debug['s'] {
+       if !*ld.FlagS {
                if ctxt.Debugvlog != 0 {
                        fmt.Fprintf(ctxt.Bso, "%5.2f sym\n", obj.Cputime())
                }
@@ -684,11 +684,11 @@ func asmb(ctxt *ld.Link) {
                switch ld.HEADTYPE {
                default:
                case obj.Hplan9:
-                       ld.Debug['s'] = true
+                       *ld.FlagS = true
                        symo = int64(ld.Segdata.Fileoff + ld.Segdata.Filelen)
 
                case obj.Hdarwin:
-                       symo = int64(ld.Segdwarf.Fileoff + uint64(ld.Rnd(int64(ld.Segdwarf.Filelen), int64(ld.INITRND))) + uint64(machlink))
+                       symo = int64(ld.Segdwarf.Fileoff + uint64(ld.Rnd(int64(ld.Segdwarf.Filelen), int64(*ld.FlagRound))) + uint64(machlink))
 
                case obj.Hlinux,
                        obj.Hfreebsd,
@@ -698,7 +698,7 @@ func asmb(ctxt *ld.Link) {
                        obj.Hsolaris,
                        obj.Hnacl:
                        symo = int64(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen)
-                       symo = ld.Rnd(symo, int64(ld.INITRND))
+                       symo = ld.Rnd(symo, int64(*ld.FlagRound))
 
                case obj.Hwindows:
                        symo = int64(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen)
index 6a04b3bcfc25874d89abfeb5f7d41a1698430721..9e6cdd72eabda37aae5fa1a43114095bec0e2bcd 100644 (file)
@@ -42,7 +42,7 @@ import (
 
 func Main() {
        linkarchinit()
-       ld.Ldmain()
+       ld.Main()
 }
 
 func linkarchinit() {
@@ -121,28 +121,28 @@ func archinit(ctxt *ld.Link) {
        case obj.Hplan9: /* plan 9 */
                ld.HEADR = 32 + 8
 
-               if ld.INITTEXT == -1 {
-                       ld.INITTEXT = 0x200000 + int64(ld.HEADR)
+               if *ld.FlagTextAddr == -1 {
+                       *ld.FlagTextAddr = 0x200000 + int64(ld.HEADR)
                }
-               if ld.INITDAT == -1 {
-                       ld.INITDAT = 0
+               if *ld.FlagDataAddr == -1 {
+                       *ld.FlagDataAddr = 0
                }
-               if ld.INITRND == -1 {
-                       ld.INITRND = 0x200000
+               if *ld.FlagRound == -1 {
+                       *ld.FlagRound = 0x200000
                }
 
        case obj.Hdarwin: /* apple MACH */
                ld.Machoinit()
 
                ld.HEADR = ld.INITIAL_MACHO_HEADR
-               if ld.INITRND == -1 {
-                       ld.INITRND = 4096
+               if *ld.FlagRound == -1 {
+                       *ld.FlagRound = 4096
                }
-               if ld.INITTEXT == -1 {
-                       ld.INITTEXT = 4096 + int64(ld.HEADR)
+               if *ld.FlagTextAddr == -1 {
+                       *ld.FlagTextAddr = 4096 + int64(ld.HEADR)
                }
-               if ld.INITDAT == -1 {
-                       ld.INITDAT = 0
+               if *ld.FlagDataAddr == -1 {
+                       *ld.FlagDataAddr = 0
                }
 
        case obj.Hlinux, /* elf64 executable */
@@ -154,47 +154,47 @@ func archinit(ctxt *ld.Link) {
                ld.Elfinit(ctxt)
 
                ld.HEADR = ld.ELFRESERVE
-               if ld.INITTEXT == -1 {
-                       ld.INITTEXT = (1 << 22) + int64(ld.HEADR)
+               if *ld.FlagTextAddr == -1 {
+                       *ld.FlagTextAddr = (1 << 22) + int64(ld.HEADR)
                }
-               if ld.INITDAT == -1 {
-                       ld.INITDAT = 0
+               if *ld.FlagDataAddr == -1 {
+                       *ld.FlagDataAddr = 0
                }
-               if ld.INITRND == -1 {
-                       ld.INITRND = 4096
+               if *ld.FlagRound == -1 {
+                       *ld.FlagRound = 4096
                }
 
        case obj.Hnacl:
                ld.Elfinit(ctxt)
-               ld.Debug['w'] = true // disable dwarf, which gets confused and is useless anyway
+               *ld.FlagW = true // disable dwarf, which gets confused and is useless anyway
                ld.HEADR = 0x10000
                ld.Funcalign = 32
-               if ld.INITTEXT == -1 {
-                       ld.INITTEXT = 0x20000
+               if *ld.FlagTextAddr == -1 {
+                       *ld.FlagTextAddr = 0x20000
                }
-               if ld.INITDAT == -1 {
-                       ld.INITDAT = 0
+               if *ld.FlagDataAddr == -1 {
+                       *ld.FlagDataAddr = 0
                }
-               if ld.INITRND == -1 {
-                       ld.INITRND = 0x10000
+               if *ld.FlagRound == -1 {
+                       *ld.FlagRound = 0x10000
                }
 
        case obj.Hwindows: /* PE executable */
                ld.Peinit(ctxt)
 
                ld.HEADR = ld.PEFILEHEADR
-               if ld.INITTEXT == -1 {
-                       ld.INITTEXT = ld.PEBASE + int64(ld.PESECTHEADR)
+               if *ld.FlagTextAddr == -1 {
+                       *ld.FlagTextAddr = ld.PEBASE + int64(ld.PESECTHEADR)
                }
-               if ld.INITDAT == -1 {
-                       ld.INITDAT = 0
+               if *ld.FlagDataAddr == -1 {
+                       *ld.FlagDataAddr = 0
                }
-               if ld.INITRND == -1 {
-                       ld.INITRND = ld.PESECTALIGN
+               if *ld.FlagRound == -1 {
+                       *ld.FlagRound = ld.PESECTALIGN
                }
        }
 
-       if ld.INITDAT != 0 && ld.INITRND != 0 {
-               fmt.Printf("warning: -D0x%x is ignored because of -R0x%x\n", uint64(ld.INITDAT), uint32(ld.INITRND))
+       if *ld.FlagDataAddr != 0 && *ld.FlagRound != 0 {
+               fmt.Printf("warning: -D0x%x is ignored because of -R0x%x\n", uint64(*ld.FlagDataAddr), uint32(*ld.FlagRound))
        }
 }
index 62ebf3d0e6a3238470a6156255e2e5e153cae6e1..84060c43616e39a1804d346eaae374d7324e099b 100644 (file)
@@ -630,7 +630,7 @@ func asmb(ctxt *ld.Link) {
 
        ld.Lcsize = 0
        symo := uint32(0)
-       if !ld.Debug['s'] {
+       if !*ld.FlagS {
                // TODO: rationalize
                if ctxt.Debugvlog != 0 {
                        fmt.Fprintf(ctxt.Bso, "%5.2f sym\n", obj.Cputime())
@@ -640,14 +640,14 @@ func asmb(ctxt *ld.Link) {
                default:
                        if ld.Iself {
                                symo = uint32(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen)
-                               symo = uint32(ld.Rnd(int64(symo), int64(ld.INITRND)))
+                               symo = uint32(ld.Rnd(int64(symo), int64(*ld.FlagRound)))
                        }
 
                case obj.Hplan9:
                        symo = uint32(ld.Segdata.Fileoff + ld.Segdata.Filelen)
 
                case obj.Hdarwin:
-                       symo = uint32(ld.Segdwarf.Fileoff + uint64(ld.Rnd(int64(ld.Segdwarf.Filelen), int64(ld.INITRND))) + uint64(machlink))
+                       symo = uint32(ld.Segdwarf.Fileoff + uint64(ld.Rnd(int64(ld.Segdwarf.Filelen), int64(*ld.FlagRound))) + uint64(machlink))
                }
 
                ld.Cseek(int64(symo))
@@ -717,7 +717,7 @@ func asmb(ctxt *ld.Link) {
        }
 
        ld.Cflush()
-       if ld.Debug['c'] {
+       if *ld.FlagC {
                fmt.Printf("textsize=%d\n", ld.Segtext.Filelen)
                fmt.Printf("datsize=%d\n", ld.Segdata.Filelen)
                fmt.Printf("bsssize=%d\n", ld.Segdata.Length-ld.Segdata.Filelen)
index 6ad7b75b5ea0898cde5451b1d4db592e27542737..9ae5d2084d49d5617da57264fdf3bb89791c27bf 100644 (file)
@@ -42,7 +42,7 @@ import (
 
 func Main() {
        linkarchinit()
-       ld.Ldmain()
+       ld.Main()
 }
 
 func linkarchinit() {
@@ -112,64 +112,64 @@ func archinit(ctxt *ld.Link) {
        case obj.Hplan9: /* plan 9 */
                ld.HEADR = 32
 
-               if ld.INITTEXT == -1 {
-                       ld.INITTEXT = 4128
+               if *ld.FlagTextAddr == -1 {
+                       *ld.FlagTextAddr = 4128
                }
-               if ld.INITDAT == -1 {
-                       ld.INITDAT = 0
+               if *ld.FlagDataAddr == -1 {
+                       *ld.FlagDataAddr = 0
                }
-               if ld.INITRND == -1 {
-                       ld.INITRND = 4096
+               if *ld.FlagRound == -1 {
+                       *ld.FlagRound = 4096
                }
 
        case obj.Hlinux, /* arm elf */
                obj.Hfreebsd,
                obj.Hnetbsd,
                obj.Hopenbsd:
-               ld.Debug['d'] = false
+               *ld.FlagD = false
                // with dynamic linking
                ld.Elfinit(ctxt)
                ld.HEADR = ld.ELFRESERVE
-               if ld.INITTEXT == -1 {
-                       ld.INITTEXT = 0x10000 + int64(ld.HEADR)
+               if *ld.FlagTextAddr == -1 {
+                       *ld.FlagTextAddr = 0x10000 + int64(ld.HEADR)
                }
-               if ld.INITDAT == -1 {
-                       ld.INITDAT = 0
+               if *ld.FlagDataAddr == -1 {
+                       *ld.FlagDataAddr = 0
                }
-               if ld.INITRND == -1 {
-                       ld.INITRND = 4096
+               if *ld.FlagRound == -1 {
+                       *ld.FlagRound = 4096
                }
 
        case obj.Hnacl:
                ld.Elfinit(ctxt)
                ld.HEADR = 0x10000
                ld.Funcalign = 16
-               if ld.INITTEXT == -1 {
-                       ld.INITTEXT = 0x20000
+               if *ld.FlagTextAddr == -1 {
+                       *ld.FlagTextAddr = 0x20000
                }
-               if ld.INITDAT == -1 {
-                       ld.INITDAT = 0
+               if *ld.FlagDataAddr == -1 {
+                       *ld.FlagDataAddr = 0
                }
-               if ld.INITRND == -1 {
-                       ld.INITRND = 0x10000
+               if *ld.FlagRound == -1 {
+                       *ld.FlagRound = 0x10000
                }
 
        case obj.Hdarwin: /* apple MACH */
-               ld.Debug['w'] = true // disable DWARF generation
+               *ld.FlagW = true // disable DWARF generation
                ld.Machoinit()
                ld.HEADR = ld.INITIAL_MACHO_HEADR
-               if ld.INITTEXT == -1 {
-                       ld.INITTEXT = 4096 + int64(ld.HEADR)
+               if *ld.FlagTextAddr == -1 {
+                       *ld.FlagTextAddr = 4096 + int64(ld.HEADR)
                }
-               if ld.INITDAT == -1 {
-                       ld.INITDAT = 0
+               if *ld.FlagDataAddr == -1 {
+                       *ld.FlagDataAddr = 0
                }
-               if ld.INITRND == -1 {
-                       ld.INITRND = 4096
+               if *ld.FlagRound == -1 {
+                       *ld.FlagRound = 4096
                }
        }
 
-       if ld.INITDAT != 0 && ld.INITRND != 0 {
-               fmt.Printf("warning: -D0x%x is ignored because of -R0x%x\n", uint64(ld.INITDAT), uint32(ld.INITRND))
+       if *ld.FlagDataAddr != 0 && *ld.FlagRound != 0 {
+               fmt.Printf("warning: -D0x%x is ignored because of -R0x%x\n", uint64(*ld.FlagDataAddr), uint32(*ld.FlagRound))
        }
 }
index 99a5992df1f671db06f3a2d7f691df9fe1f2436e..a25a01dd49f09cb321ee16025bf5368872c96cf2 100644 (file)
@@ -439,7 +439,7 @@ func asmb(ctxt *ld.Link) {
 
        ld.Lcsize = 0
        symo := uint32(0)
-       if !ld.Debug['s'] {
+       if !*ld.FlagS {
                // TODO: rationalize
                if ctxt.Debugvlog != 0 {
                        fmt.Fprintf(ctxt.Bso, "%5.2f sym\n", obj.Cputime())
@@ -449,14 +449,14 @@ func asmb(ctxt *ld.Link) {
                default:
                        if ld.Iself {
                                symo = uint32(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen)
-                               symo = uint32(ld.Rnd(int64(symo), int64(ld.INITRND)))
+                               symo = uint32(ld.Rnd(int64(symo), int64(*ld.FlagRound)))
                        }
 
                case obj.Hplan9:
                        symo = uint32(ld.Segdata.Fileoff + ld.Segdata.Filelen)
 
                case obj.Hdarwin:
-                       symo = uint32(ld.Segdwarf.Fileoff + uint64(ld.Rnd(int64(ld.Segdwarf.Filelen), int64(ld.INITRND))) + uint64(machlink))
+                       symo = uint32(ld.Segdwarf.Fileoff + uint64(ld.Rnd(int64(ld.Segdwarf.Filelen), int64(*ld.FlagRound))) + uint64(machlink))
                }
 
                ld.Cseek(int64(symo))
@@ -526,7 +526,7 @@ func asmb(ctxt *ld.Link) {
        }
 
        ld.Cflush()
-       if ld.Debug['c'] {
+       if *ld.FlagC {
                fmt.Printf("textsize=%d\n", ld.Segtext.Filelen)
                fmt.Printf("datsize=%d\n", ld.Segdata.Filelen)
                fmt.Printf("bsssize=%d\n", ld.Segdata.Length-ld.Segdata.Filelen)
index 792f35d204aba5f35a8d5fd9d2bb38b805eb3fe3..488f6a9cbcc76092e9b6083eb2bf26796473dc17 100644 (file)
@@ -42,7 +42,7 @@ import (
 
 func Main() {
        linkarchinit()
-       ld.Ldmain()
+       ld.Main()
 }
 
 func linkarchinit() {
@@ -114,59 +114,59 @@ func archinit(ctxt *ld.Link) {
        case obj.Hplan9: /* plan 9 */
                ld.HEADR = 32
 
-               if ld.INITTEXT == -1 {
-                       ld.INITTEXT = 4128
+               if *ld.FlagTextAddr == -1 {
+                       *ld.FlagTextAddr = 4128
                }
-               if ld.INITDAT == -1 {
-                       ld.INITDAT = 0
+               if *ld.FlagDataAddr == -1 {
+                       *ld.FlagDataAddr = 0
                }
-               if ld.INITRND == -1 {
-                       ld.INITRND = 4096
+               if *ld.FlagRound == -1 {
+                       *ld.FlagRound = 4096
                }
 
        case obj.Hlinux: /* arm64 elf */
                ld.Elfinit(ctxt)
                ld.HEADR = ld.ELFRESERVE
-               if ld.INITTEXT == -1 {
-                       ld.INITTEXT = 0x10000 + int64(ld.HEADR)
+               if *ld.FlagTextAddr == -1 {
+                       *ld.FlagTextAddr = 0x10000 + int64(ld.HEADR)
                }
-               if ld.INITDAT == -1 {
-                       ld.INITDAT = 0
+               if *ld.FlagDataAddr == -1 {
+                       *ld.FlagDataAddr = 0
                }
-               if ld.INITRND == -1 {
-                       ld.INITRND = 0x10000
+               if *ld.FlagRound == -1 {
+                       *ld.FlagRound = 0x10000
                }
 
        case obj.Hdarwin: /* apple MACH */
-               ld.Debug['w'] = true // disable DWARF generation
+               *ld.FlagW = true // disable DWARF generation
                ld.Machoinit()
                ld.HEADR = ld.INITIAL_MACHO_HEADR
-               if ld.INITTEXT == -1 {
-                       ld.INITTEXT = 4096 + int64(ld.HEADR)
+               if *ld.FlagTextAddr == -1 {
+                       *ld.FlagTextAddr = 4096 + int64(ld.HEADR)
                }
-               if ld.INITDAT == -1 {
-                       ld.INITDAT = 0
+               if *ld.FlagDataAddr == -1 {
+                       *ld.FlagDataAddr = 0
                }
-               if ld.INITRND == -1 {
-                       ld.INITRND = 4096
+               if *ld.FlagRound == -1 {
+                       *ld.FlagRound = 4096
                }
 
        case obj.Hnacl:
                ld.Elfinit(ctxt)
                ld.HEADR = 0x10000
                ld.Funcalign = 16
-               if ld.INITTEXT == -1 {
-                       ld.INITTEXT = 0x20000
+               if *ld.FlagTextAddr == -1 {
+                       *ld.FlagTextAddr = 0x20000
                }
-               if ld.INITDAT == -1 {
-                       ld.INITDAT = 0
+               if *ld.FlagDataAddr == -1 {
+                       *ld.FlagDataAddr = 0
                }
-               if ld.INITRND == -1 {
-                       ld.INITRND = 0x10000
+               if *ld.FlagRound == -1 {
+                       *ld.FlagRound = 0x10000
                }
        }
 
-       if ld.INITDAT != 0 && ld.INITRND != 0 {
-               fmt.Printf("warning: -D0x%x is ignored because of -R0x%x\n", uint64(ld.INITDAT), uint32(ld.INITRND))
+       if *ld.FlagDataAddr != 0 && *ld.FlagRound != 0 {
+               fmt.Printf("warning: -D0x%x is ignored because of -R0x%x\n", uint64(*ld.FlagDataAddr), uint32(*ld.FlagRound))
        }
 }
index 4fa34a24421171c34ecd11c1abf8859cdaeca057..35ff37caa42a155af898227609a631f26348e227 100644 (file)
@@ -720,7 +720,7 @@ func dynrelocsym(ctxt *Link, s *Symbol) {
 func dynreloc(ctxt *Link, data *[obj.SXREF][]*Symbol) {
        // -d suppresses dynamic loader format, so we may as well not
        // compute these sections or mark their symbols as reachable.
-       if Debug['d'] && HEADTYPE != obj.Hwindows {
+       if *FlagD && HEADTYPE != obj.Hwindows {
                return
        }
        if ctxt.Debugvlog != 0 {
@@ -745,14 +745,14 @@ func Codeblk(ctxt *Link, addr int64, size int64) {
        CodeblkPad(ctxt, addr, size, zeros[:])
 }
 func CodeblkPad(ctxt *Link, addr int64, size int64, pad []byte) {
-       if Debug['a'] {
+       if *flagA {
                fmt.Fprintf(ctxt.Bso, "codeblk [%#x,%#x) at offset %#x\n", addr, addr+size, Cpos())
        }
 
        blk(ctxt, ctxt.Textp, addr, size, pad)
 
        /* again for printing */
-       if !Debug['a'] {
+       if !*flagA {
                return
        }
 
@@ -857,14 +857,14 @@ func blk(ctxt *Link, syms []*Symbol, addr, size int64, pad []byte) {
 }
 
 func Datblk(ctxt *Link, addr int64, size int64) {
-       if Debug['a'] {
+       if *flagA {
                fmt.Fprintf(ctxt.Bso, "datblk [%#x,%#x) at offset %#x\n", addr, addr+size, Cpos())
        }
 
        blk(ctxt, datap, addr, size, zeros[:])
 
        /* again for printing */
-       if !Debug['a'] {
+       if !*flagA {
                return
        }
 
@@ -928,7 +928,7 @@ func Datblk(ctxt *Link, addr int64, size int64) {
 }
 
 func Dwarfblk(ctxt *Link, addr int64, size int64) {
-       if Debug['a'] {
+       if *flagA {
                fmt.Fprintf(ctxt.Bso, "dwarfblk [%#x,%#x) at offset %#x\n", addr, addr+size, Cpos())
        }
 
@@ -1060,7 +1060,7 @@ func dosymtype(ctxt *Link) {
                // library initializer function.
                switch Buildmode {
                case BuildmodeCArchive, BuildmodeCShared:
-                       if s.Name == INITENTRY {
+                       if s.Name == *flagEntrySymbol {
                                addinitarrdata(ctxt, s)
                        }
                }
@@ -1351,7 +1351,7 @@ func (ctxt *Link) dodata() {
        checkdatsize(ctxt, datsize, obj.SNOPTRDATA)
        sect.Length = uint64(datsize) - sect.Vaddr
 
-       hasinitarr := Linkshared
+       hasinitarr := *FlagLinkshared
 
        /* shared library initializer */
        switch Buildmode {
@@ -1434,7 +1434,7 @@ func (ctxt *Link) dodata() {
 
        if len(data[obj.STLSBSS]) > 0 {
                var sect *Section
-               if Iself && (Linkmode == LinkExternal || !Debug['d']) && HEADTYPE != obj.Hopenbsd {
+               if Iself && (Linkmode == LinkExternal || !*FlagD) && HEADTYPE != obj.Hopenbsd {
                        sect = addsection(&Segdata, ".tbss", 06)
                        sect.Align = int32(SysArch.PtrSize)
                        sect.Vaddr = 0
@@ -1843,7 +1843,7 @@ func dodataSect(ctxt *Link, symn int, syms []*Symbol) (result []*Symbol, maxAlig
 // at the very beginning of the text segment.
 // This ``header'' is read by cmd/go.
 func (ctxt *Link) textbuildid() {
-       if Iself || buildid == "" {
+       if Iself || *flagBuildid == "" {
                return
        }
 
@@ -1851,7 +1851,7 @@ func (ctxt *Link) textbuildid() {
        sym.Attr |= AttrReachable
        // The \xff is invalid UTF-8, meant to make it less likely
        // to find one of these accidentally.
-       data := "\xff Go build ID: " + strconv.Quote(buildid) + "\n \xff"
+       data := "\xff Go build ID: " + strconv.Quote(*flagBuildid) + "\n \xff"
        sym.Type = obj.STEXT
        sym.P = []byte(data)
        sym.Size = int64(len(sym.P))
@@ -1876,7 +1876,7 @@ func (ctxt *Link) textaddress() {
        if HEADTYPE == obj.Hwindows {
                Linklookup(ctxt, ".text", 0).Sect = sect
        }
-       va := uint64(INITTEXT)
+       va := uint64(*FlagTextAddr)
        sect.Vaddr = va
        for _, sym := range ctxt.Textp {
                sym.Sect = sect
@@ -1907,7 +1907,7 @@ func (ctxt *Link) textaddress() {
 
 // assign addresses
 func (ctxt *Link) address() {
-       va := uint64(INITTEXT)
+       va := uint64(*FlagTextAddr)
        Segtext.Rwx = 05
        Segtext.Vaddr = va
        Segtext.Fileoff = uint64(HEADR)
@@ -1917,7 +1917,7 @@ func (ctxt *Link) address() {
                va += s.Length
        }
 
-       Segtext.Length = va - uint64(INITTEXT)
+       Segtext.Length = va - uint64(*FlagTextAddr)
        Segtext.Filelen = Segtext.Length
        if HEADTYPE == obj.Hnacl {
                va += 32 // room for the "halt sled"
@@ -1926,7 +1926,7 @@ func (ctxt *Link) address() {
        if Segrodata.Sect != nil {
                // align to page boundary so as not to mix
                // rodata and executable text.
-               va = uint64(Rnd(int64(va), int64(INITRND)))
+               va = uint64(Rnd(int64(va), int64(*FlagRound)))
 
                Segrodata.Rwx = 04
                Segrodata.Vaddr = va
@@ -1942,7 +1942,7 @@ func (ctxt *Link) address() {
                Segrodata.Filelen = Segrodata.Length
        }
 
-       va = uint64(Rnd(int64(va), int64(INITRND)))
+       va = uint64(Rnd(int64(va), int64(*FlagRound)))
        Segdata.Rwx = 06
        Segdata.Vaddr = va
        Segdata.Fileoff = va - Segtext.Vaddr + Segtext.Fileoff
@@ -1985,10 +1985,10 @@ func (ctxt *Link) address() {
 
        Segdata.Filelen = bss.Vaddr - Segdata.Vaddr
 
-       va = uint64(Rnd(int64(va), int64(INITRND)))
+       va = uint64(Rnd(int64(va), int64(*FlagRound)))
        Segdwarf.Rwx = 06
        Segdwarf.Vaddr = va
-       Segdwarf.Fileoff = Segdata.Fileoff + uint64(Rnd(int64(Segdata.Filelen), int64(INITRND)))
+       Segdwarf.Fileoff = Segdata.Fileoff + uint64(Rnd(int64(Segdata.Filelen), int64(*FlagRound)))
        Segdwarf.Filelen = 0
        if HEADTYPE == obj.Hwindows {
                Segdwarf.Fileoff = Segdata.Fileoff + uint64(Rnd(int64(Segdata.Filelen), int64(PEFILEALIGN)))
index 36ed60344c799a6e392e7127f7c73937dd871298..4fd35e1513fd5551859bb448baa262012fbf876c 100644 (file)
@@ -15,7 +15,7 @@ import (
 // deadcode marks all reachable symbols.
 //
 // The basis of the dead code elimination is a flood fill of symbols,
-// following their relocations, beginning at INITENTRY.
+// following their relocations, beginning at *flagEntrySymbol.
 //
 // This flood fill is wrapped in logic for pruning unused methods.
 // All methods are mentioned by relocations on their receiver's *rtype.
@@ -55,7 +55,7 @@ func deadcode(ctxt *Link) {
        }
 
        // First, flood fill any symbols directly reachable in the call
-       // graph from INITENTRY. Ignore all methods not directly called.
+       // graph from *flagEntrySymbol. Ignore all methods not directly called.
        d.init()
        d.flood()
 
@@ -196,7 +196,7 @@ func (d *deadcodepass) mark(s, parent *Symbol) {
        if s.Attr.ReflectMethod() {
                d.reflectMethod = true
        }
-       if flag_dumpdep {
+       if *flagDumpDep {
                p := "_"
                if parent != nil {
                        p = parent.Name
@@ -217,7 +217,7 @@ func (d *deadcodepass) markMethod(m methodref) {
 }
 
 // init marks all initial symbols as reachable.
-// In a typical binary, this is INITENTRY.
+// In a typical binary, this is *flagEntrySymbol.
 func (d *deadcodepass) init() {
        var names []string
 
@@ -240,8 +240,8 @@ func (d *deadcodepass) init() {
        } else {
                // In a normal binary, start at main.main and the init
                // functions and mark what is reachable from there.
-               names = append(names, INITENTRY)
-               if Linkshared && Buildmode == BuildmodeExe {
+               names = append(names, *flagEntrySymbol)
+               if *FlagLinkshared && Buildmode == BuildmodeExe {
                        names = append(names, "main.main", "main.init")
                }
                for _, name := range markextra {
index 3996155347728eaaf1b208176876c867ee366039..2bc7d999b7e01449826085d0dcaeeec0b734dcd7 100644 (file)
@@ -1398,10 +1398,10 @@ var prototypedies map[string]*dwarf.DWDie
  *
  */
 func dwarfgeneratedebugsyms(ctxt *Link) {
-       if Debug['w'] { // disable dwarf
+       if *FlagW { // disable dwarf
                return
        }
-       if Debug['s'] && HEADTYPE != obj.Hdarwin {
+       if *FlagS && HEADTYPE != obj.Hdarwin {
                return
        }
        if HEADTYPE == obj.Hplan9 {
@@ -1483,7 +1483,7 @@ func dwarfgeneratedebugsyms(ctxt *Link) {
  *  Elf.
  */
 func dwarfaddshstrings(ctxt *Link, shstrtab *Symbol) {
-       if Debug['w'] { // disable dwarf
+       if *FlagW { // disable dwarf
                return
        }
 
@@ -1508,7 +1508,7 @@ func dwarfaddshstrings(ctxt *Link, shstrtab *Symbol) {
 // Add section symbols for DWARF debug info.  This is called before
 // dwarfaddelfheaders.
 func dwarfaddelfsectionsyms(ctxt *Link) {
-       if Debug['w'] { // disable dwarf
+       if *FlagW { // disable dwarf
                return
        }
        if Linkmode != LinkExternal {
@@ -1528,7 +1528,7 @@ func dwarfaddelfsectionsyms(ctxt *Link) {
  * Windows PE
  */
 func dwarfaddpeheaders(ctxt *Link) {
-       if Debug['w'] { // disable dwarf
+       if *FlagW { // disable dwarf
                return
        }
        for sect := Segdwarf.Sect; sect != nil; sect = sect.Next {
index 8bf9f5cc44f3c8e1d4bcd8191020e2a18a205ac1..9ba2374e759bdae17f2616ae90c9945ae750b7d5 100644 (file)
@@ -1355,7 +1355,7 @@ func elfbuildinfo(sh *ElfShdr, startva uint64, resoff uint64) int {
 }
 
 func elfgobuildid(sh *ElfShdr, startva uint64, resoff uint64) int {
-       n := len(ELF_NOTE_GO_NAME) + int(Rnd(int64(len(buildid)), 4))
+       n := len(ELF_NOTE_GO_NAME) + int(Rnd(int64(len(*flagBuildid)), 4))
        return elfnote(sh, startva, resoff, n, true)
 }
 
@@ -1374,15 +1374,15 @@ func elfwritebuildinfo(ctxt *Link) int {
 }
 
 func elfwritegobuildid(ctxt *Link) int {
-       sh := elfwritenotehdr(ctxt, ".note.go.buildid", uint32(len(ELF_NOTE_GO_NAME)), uint32(len(buildid)), ELF_NOTE_GOBUILDID_TAG)
+       sh := elfwritenotehdr(ctxt, ".note.go.buildid", uint32(len(ELF_NOTE_GO_NAME)), uint32(len(*flagBuildid)), ELF_NOTE_GOBUILDID_TAG)
        if sh == nil {
                return 0
        }
 
        Cwrite(ELF_NOTE_GO_NAME)
-       Cwrite([]byte(buildid))
+       Cwrite([]byte(*flagBuildid))
        var zero = make([]byte, 4)
-       Cwrite(zero[:int(Rnd(int64(len(buildid)), 4)-int64(len(buildid)))])
+       Cwrite(zero[:int(Rnd(int64(len(*flagBuildid)), 4)-int64(len(*flagBuildid)))])
 
        return int(sh.size)
 }
@@ -1594,7 +1594,7 @@ func elfphload(ctxt *Link, seg *Segment) *ElfPhdr {
        ph.memsz = seg.Length
        ph.off = seg.Fileoff
        ph.filesz = seg.Filelen
-       ph.align = uint64(INITRND)
+       ph.align = uint64(*FlagRound)
 
        return ph
 }
@@ -1837,7 +1837,7 @@ func (ctxt *Link) doelf() {
        // binutils could correctly calculate PT_TLS size.
        // see https://golang.org/issue/5200.
        if HEADTYPE != obj.Hopenbsd {
-               if !Debug['d'] || Linkmode == LinkExternal {
+               if !*FlagD || Linkmode == LinkExternal {
                        Addstring(ctxt, shstrtab, ".tbss")
                }
        }
@@ -1850,7 +1850,7 @@ func (ctxt *Link) doelf() {
        if len(buildinfo) > 0 {
                Addstring(ctxt, shstrtab, ".note.gnu.build-id")
        }
-       if buildid != "" {
+       if *flagBuildid != "" {
                Addstring(ctxt, shstrtab, ".note.go.buildid")
        }
        Addstring(ctxt, shstrtab, ".elfdata")
@@ -1867,7 +1867,7 @@ func (ctxt *Link) doelf() {
        Addstring(ctxt, shstrtab, relro_prefix+".gopclntab")
 
        if Linkmode == LinkExternal {
-               Debug['d'] = true
+               *FlagD = true
 
                Addstring(ctxt, shstrtab, elfRelType+".text")
                Addstring(ctxt, shstrtab, elfRelType+".rodata")
@@ -1891,7 +1891,7 @@ func (ctxt *Link) doelf() {
                }
        }
 
-       hasinitarr := Linkshared
+       hasinitarr := *FlagLinkshared
 
        /* shared library initializer */
        switch Buildmode {
@@ -1904,7 +1904,7 @@ func (ctxt *Link) doelf() {
                Addstring(ctxt, shstrtab, elfRelType+".init_array")
        }
 
-       if !Debug['s'] {
+       if !*FlagS {
                Addstring(ctxt, shstrtab, ".symtab")
                Addstring(ctxt, shstrtab, ".strtab")
                dwarfaddshstrings(ctxt, shstrtab)
@@ -1912,7 +1912,7 @@ func (ctxt *Link) doelf() {
 
        Addstring(ctxt, shstrtab, ".shstrtab")
 
-       if !Debug['d'] { /* -d suppresses dynamic loader format */
+       if !*FlagD { /* -d suppresses dynamic loader format */
                Addstring(ctxt, shstrtab, ".interp")
                Addstring(ctxt, shstrtab, ".hash")
                Addstring(ctxt, shstrtab, ".got")
@@ -2080,8 +2080,8 @@ func (ctxt *Link) doelf() {
                addgonote(ctxt, ".note.go.deps", ELF_NOTE_GODEPS_TAG, []byte(strings.Join(deplist, "\n")))
        }
 
-       if Linkmode == LinkExternal && buildid != "" {
-               addgonote(ctxt, ".note.go.buildid", ELF_NOTE_GOBUILDID_TAG, []byte(buildid))
+       if Linkmode == LinkExternal && *flagBuildid != "" {
+               addgonote(ctxt, ".note.go.buildid", ELF_NOTE_GOBUILDID_TAG, []byte(*flagBuildid))
        }
 }
 
@@ -2144,7 +2144,7 @@ func Asmbelf(ctxt *Link, symo int64) {
        }
 
        elfreserve := int64(ELFRESERVE)
-       startva := INITTEXT - int64(HEADR)
+       startva := *FlagTextAddr - int64(HEADR)
        resoff := elfreserve
 
        var pph *ElfPhdr
@@ -2165,7 +2165,7 @@ func Asmbelf(ctxt *Link, symo int64) {
                        sh.type_ = SHT_NOTE
                }
 
-               if buildid != "" {
+               if *flagBuildid != "" {
                        sh := elfshname(ctxt, ".note.go.buildid")
                        sh.type_ = SHT_NOTE
                        sh.flags = SHF_ALLOC
@@ -2180,9 +2180,9 @@ func Asmbelf(ctxt *Link, symo int64) {
        pph.type_ = PT_PHDR
        pph.flags = PF_R
        pph.off = uint64(eh.ehsize)
-       pph.vaddr = uint64(INITTEXT) - uint64(HEADR) + pph.off
-       pph.paddr = uint64(INITTEXT) - uint64(HEADR) + pph.off
-       pph.align = uint64(INITRND)
+       pph.vaddr = uint64(*FlagTextAddr) - uint64(HEADR) + pph.off
+       pph.paddr = uint64(*FlagTextAddr) - uint64(HEADR) + pph.off
+       pph.align = uint64(*FlagRound)
 
        /*
         * PHDR must be in a loaded segment. Adjust the text
@@ -2198,36 +2198,36 @@ func Asmbelf(ctxt *Link, symo int64) {
                Segtext.Filelen += uint64(o)
        }
 
-       if !Debug['d'] { /* -d suppresses dynamic loader format */
+       if !*FlagD { /* -d suppresses dynamic loader format */
                /* interpreter */
                sh := elfshname(ctxt, ".interp")
 
                sh.type_ = SHT_PROGBITS
                sh.flags = SHF_ALLOC
                sh.addralign = 1
-               if interpreter == "" {
+               if *flagInterpreter == "" {
                        switch HEADTYPE {
                        case obj.Hlinux:
-                               interpreter = Thearch.Linuxdynld
+                               *flagInterpreter = Thearch.Linuxdynld
 
                        case obj.Hfreebsd:
-                               interpreter = Thearch.Freebsddynld
+                               *flagInterpreter = Thearch.Freebsddynld
 
                        case obj.Hnetbsd:
-                               interpreter = Thearch.Netbsddynld
+                               *flagInterpreter = Thearch.Netbsddynld
 
                        case obj.Hopenbsd:
-                               interpreter = Thearch.Openbsddynld
+                               *flagInterpreter = Thearch.Openbsddynld
 
                        case obj.Hdragonfly:
-                               interpreter = Thearch.Dragonflydynld
+                               *flagInterpreter = Thearch.Dragonflydynld
 
                        case obj.Hsolaris:
-                               interpreter = Thearch.Solarisdynld
+                               *flagInterpreter = Thearch.Solarisdynld
                        }
                }
 
-               resoff -= int64(elfinterp(sh, uint64(startva), uint64(resoff), interpreter))
+               resoff -= int64(elfinterp(sh, uint64(startva), uint64(resoff), *flagInterpreter))
 
                ph := newElfPhdr(ctxt)
                ph.type_ = PT_INTERP
@@ -2267,7 +2267,7 @@ func Asmbelf(ctxt *Link, symo int64) {
                phsh(pnote, sh)
        }
 
-       if buildid != "" {
+       if *flagBuildid != "" {
                sh := elfshname(ctxt, ".note.go.buildid")
                resoff -= int64(elfgobuildid(sh, uint64(startva), uint64(resoff)))
 
@@ -2286,7 +2286,7 @@ func Asmbelf(ctxt *Link, symo int64) {
        elfphload(ctxt, &Segdata)
 
        /* Dynamic linking sections */
-       if !Debug['d'] {
+       if !*FlagD {
                sh := elfshname(ctxt, ".dynsym")
                sh.type_ = SHT_DYNSYM
                sh.flags = SHF_ALLOC
@@ -2471,7 +2471,7 @@ elfobj:
        eh.shstrndx = uint16(sh.shnum)
 
        // put these sections early in the list
-       if !Debug['s'] {
+       if !*FlagS {
                elfshname(ctxt, ".symtab")
                elfshname(ctxt, ".strtab")
        }
@@ -2515,7 +2515,7 @@ elfobj:
                sh.flags = 0
        }
 
-       if !Debug['s'] {
+       if !*FlagS {
                sh := elfshname(ctxt, ".symtab")
                sh.type_ = SHT_SYMTAB
                sh.off = uint64(symo)
@@ -2581,7 +2581,7 @@ elfobj:
        a += int64(elfwritehdr())
        a += int64(elfwritephdrs())
        a += int64(elfwriteshdrs())
-       if !Debug['d'] {
+       if !*FlagD {
                a += int64(elfwriteinterp(ctxt))
        }
        if Linkmode != LinkExternal {
@@ -2594,7 +2594,7 @@ elfobj:
                if len(buildinfo) > 0 {
                        a += int64(elfwritebuildinfo(ctxt))
                }
-               if buildid != "" {
+               if *flagBuildid != "" {
                        a += int64(elfwritegobuildid(ctxt))
                }
        }
index 279d4e7103293190b65ef240bd877c1058e82194..4f7db2696c5db0b787c503db9d180f4407c4cf0c 100644 (file)
@@ -31,13 +31,13 @@ func expandpkg(t0 string, pkg string) string {
 func ldpkg(ctxt *Link, f *bio.Reader, pkg string, length int64, filename string, whence int) {
        var p0, p1 int
 
-       if Debug['g'] {
+       if *flagG {
                return
        }
 
        if int64(int(length)) != length {
                fmt.Fprintf(os.Stderr, "%s: too much pkg data in %s\n", os.Args[0], filename)
-               if Debug['u'] {
+               if *flagU {
                        errorexit()
                }
                return
@@ -52,7 +52,7 @@ func ldpkg(ctxt *Link, f *bio.Reader, pkg string, length int64, filename string,
        bdata := make([]byte, length)
        if _, err := io.ReadFull(f, bdata); err != nil {
                fmt.Fprintf(os.Stderr, "%s: short pkg read %s\n", os.Args[0], filename)
-               if Debug['u'] {
+               if *flagU {
                        errorexit()
                }
                return
@@ -84,7 +84,7 @@ func ldpkg(ctxt *Link, f *bio.Reader, pkg string, length int64, filename string,
                if pkg == "main" && !isMain {
                        Exitf("%s: not package main", filename)
                }
-               if Debug['u'] && whence != ArchiveObj && !isSafe {
+               if *flagU && whence != ArchiveObj && !isSafe {
                        Exitf("load of unsafe package %s", filename)
                }
        }
@@ -101,7 +101,7 @@ func ldpkg(ctxt *Link, f *bio.Reader, pkg string, length int64, filename string,
                i := strings.IndexByte(data[p0+1:], '\n')
                if i < 0 {
                        fmt.Fprintf(os.Stderr, "%s: found $$ // cgo but no newline in %s\n", os.Args[0], filename)
-                       if Debug['u'] {
+                       if *flagU {
                                errorexit()
                        }
                        return
@@ -114,7 +114,7 @@ func ldpkg(ctxt *Link, f *bio.Reader, pkg string, length int64, filename string,
                }
                if p1 < 0 {
                        fmt.Fprintf(os.Stderr, "%s: cannot find end of // cgo section in %s\n", os.Args[0], filename)
-                       if Debug['u'] {
+                       if *flagU {
                                errorexit()
                        }
                        return
@@ -163,7 +163,7 @@ func loadcgo(ctxt *Link, file string, pkg string, p string) {
                                lib = f[3]
                        }
 
-                       if Debug['d'] {
+                       if *FlagD {
                                fmt.Fprintf(os.Stderr, "%s: %s: cannot use dynamic imports with -d flag\n", os.Args[0], file)
                                nerrors++
                                return
@@ -267,14 +267,14 @@ func loadcgo(ctxt *Link, file string, pkg string, p string) {
                                goto err
                        }
 
-                       if !Debug['I'] {
-                               if interpreter != "" && interpreter != f[1] {
-                                       fmt.Fprintf(os.Stderr, "%s: conflict dynlinker: %s and %s\n", os.Args[0], interpreter, f[1])
+                       if *flagInterpreter != "" {
+                               if *flagInterpreter != f[1] {
+                                       fmt.Fprintf(os.Stderr, "%s: conflict dynlinker: %s and %s\n", os.Args[0], *flagInterpreter, f[1])
                                        nerrors++
                                        return
                                }
 
-                               interpreter = f[1]
+                               *flagInterpreter = f[1]
                        }
 
                        continue
@@ -352,14 +352,14 @@ func fieldtrack(ctxt *Link) {
                }
        }
 
-       if tracksym == "" {
+       if *flagFieldTrack == "" {
                return
        }
-       s := Linklookup(ctxt, tracksym, 0)
+       s := Linklookup(ctxt, *flagFieldTrack, 0)
        if !s.Attr.Reachable() {
                return
        }
-       addstrdata(ctxt, tracksym, buf.String())
+       addstrdata(ctxt, *flagFieldTrack, buf.String())
 }
 
 func (ctxt *Link) addexport() {
index cf33a9f42decff62b409ec338f90eaf14066af90..fdd7293950f4f18c40ac566c7ac0517f1d4d8c19 100644 (file)
@@ -64,7 +64,7 @@ func addlib(ctxt *Link, src string, obj string, pathname string) {
        } else {
                // try dot, -L "libdir", and then goroot.
                for _, dir := range ctxt.Libdir {
-                       if Linkshared {
+                       if *FlagLinkshared {
                                pname = dir + "/" + pkg + ".shlibname"
                                if _, err := os.Stat(pname); err == nil {
                                        isshlib = true
index 7918b9463e94505757b8b34c18b77275218a6f6e..4acb34006e304dfe68bb2c07ea14386c7c6032cb 100644 (file)
@@ -113,24 +113,8 @@ type Arch struct {
        Append64         func(b []byte, v uint64) []byte
 }
 
-type Rpath struct {
-       set bool
-       val string
-}
-
-func (r *Rpath) Set(val string) error {
-       r.set = true
-       r.val = val
-       return nil
-}
-
-func (r *Rpath) String() string {
-       return r.val
-}
-
 var (
        Thearch Arch
-       Debug   [128]bool
        Lcsize  int32
        rpath   Rpath
        Spsize  int32
@@ -172,7 +156,7 @@ type Section struct {
 // DynlinkingGo returns whether we are producing Go code that can live
 // in separate shared libraries linked together at runtime.
 func DynlinkingGo() bool {
-       return Buildmode == BuildmodeShared || Linkshared
+       return Buildmode == BuildmodeShared || *FlagLinkshared
 }
 
 // UseRelro returns whether to make use of "read only relocations" aka
@@ -182,43 +166,27 @@ func UseRelro() bool {
        case BuildmodeCShared, BuildmodeShared, BuildmodePIE:
                return Iself
        default:
-               return Linkshared
+               return *FlagLinkshared
        }
 }
 
 var (
-       SysArch            *sys.Arch
-       outfile            string
-       dynexp             []*Symbol
-       dynlib             []string
-       ldflag             []string
-       havedynamic        int
-       Funcalign          int
-       iscgo              bool
-       elfglobalsymndx    int
-       flag_dumpdep       bool
-       flag_installsuffix string
-       flag_race          bool
-       flag_msan          bool
-       Buildmode          BuildMode
-       Linkshared         bool
-       tracksym           string
-       interpreter        string
-       tmpdir             string
-       extld              string
-       extldflags         string
-       extar              string
-       libgccfile         string
-       debug_s            bool // backup old value of debug['s']
-       HEADR              int32
-       HEADTYPE           int32
-       INITRND            int
-       INITTEXT           int64
-       INITDAT            int64
-       INITENTRY          string /* entry point */
-       nerrors            int
-       Linkmode           int
-       liveness           int64
+       SysArch         *sys.Arch
+       dynexp          []*Symbol
+       dynlib          []string
+       ldflag          []string
+       havedynamic     int
+       Funcalign       int
+       iscgo           bool
+       elfglobalsymndx int
+
+       debug_s  bool // backup old value of debug['s']
+       HEADR    int32
+       HEADTYPE int32
+
+       nerrors  int
+       Linkmode int
+       liveness int64
 )
 
 var (
@@ -278,97 +246,6 @@ func Lflag(ctxt *Link, arg string) {
        ctxt.Libdir = append(ctxt.Libdir, arg)
 }
 
-// A BuildMode indicates the sort of object we are building:
-//   "exe": build a main package and everything it imports into an executable.
-//   "c-shared": build a main package, plus all packages that it imports, into a
-//     single C shared library. The only callable symbols will be those functions
-//     marked as exported.
-//   "shared": combine all packages passed on the command line, and their
-//     dependencies, into a single shared library that will be used when
-//     building with the -linkshared option.
-type BuildMode uint8
-
-const (
-       BuildmodeUnset BuildMode = iota
-       BuildmodeExe
-       BuildmodePIE
-       BuildmodeCArchive
-       BuildmodeCShared
-       BuildmodeShared
-)
-
-func (mode *BuildMode) Set(s string) error {
-       goos := obj.Getgoos()
-       goarch := obj.Getgoarch()
-       badmode := func() error {
-               return fmt.Errorf("buildmode %s not supported on %s/%s", s, goos, goarch)
-       }
-       switch s {
-       default:
-               return fmt.Errorf("invalid buildmode: %q", s)
-       case "exe":
-               *mode = BuildmodeExe
-       case "pie":
-               switch goos {
-               case "android", "linux":
-               default:
-                       return badmode()
-               }
-               *mode = BuildmodePIE
-       case "c-archive":
-               switch goos {
-               case "darwin", "linux":
-               case "windows":
-                       switch goarch {
-                       case "amd64", "386":
-                       default:
-                               return badmode()
-                       }
-               default:
-                       return badmode()
-               }
-               *mode = BuildmodeCArchive
-       case "c-shared":
-               switch goarch {
-               case "386", "amd64", "arm", "arm64":
-               default:
-                       return badmode()
-               }
-               *mode = BuildmodeCShared
-       case "shared":
-               switch goos {
-               case "linux":
-                       switch goarch {
-                       case "386", "amd64", "arm", "arm64", "ppc64le", "s390x":
-                       default:
-                               return badmode()
-                       }
-               default:
-                       return badmode()
-               }
-               *mode = BuildmodeShared
-       }
-       return nil
-}
-
-func (mode *BuildMode) String() string {
-       switch *mode {
-       case BuildmodeUnset:
-               return "" // avoid showing a default in usage message
-       case BuildmodeExe:
-               return "exe"
-       case BuildmodePIE:
-               return "pie"
-       case BuildmodeCArchive:
-               return "c-archive"
-       case BuildmodeCShared:
-               return "c-shared"
-       case BuildmodeShared:
-               return "shared"
-       }
-       return fmt.Sprintf("BuildMode(%d)", uint8(*mode))
-}
-
 /*
  * Unix doesn't like it when we write to a running (or, sometimes,
  * recently run) binary, so remove the output file before writing it.
@@ -376,10 +253,10 @@ func (mode *BuildMode) String() string {
  * S_ISREG() does not exist on Plan 9.
  */
 func mayberemoveoutfile() {
-       if fi, err := os.Lstat(outfile); err == nil && !fi.Mode().IsRegular() {
+       if fi, err := os.Lstat(*flagOutfile); err == nil && !fi.Mode().IsRegular() {
                return
        }
-       os.Remove(outfile)
+       os.Remove(*flagOutfile)
 }
 
 func libinit(ctxt *Link) {
@@ -390,13 +267,13 @@ func libinit(ctxt *Link) {
        suffix := ""
 
        suffixsep := ""
-       if flag_installsuffix != "" {
+       if *flagInstallSuffix != "" {
                suffixsep = "_"
-               suffix = flag_installsuffix
-       } else if flag_race {
+               suffix = *flagInstallSuffix
+       } else if *flagRace {
                suffixsep = "_"
                suffix = "race"
-       } else if flag_msan {
+       } else if *flagMsan {
                suffixsep = "_"
                suffix = "msan"
        }
@@ -404,29 +281,29 @@ func libinit(ctxt *Link) {
        Lflag(ctxt, filepath.Join(goroot, "pkg", fmt.Sprintf("%s_%s%s%s", goos, goarch, suffixsep, suffix)))
 
        mayberemoveoutfile()
-       f, err := os.OpenFile(outfile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0775)
+       f, err := os.OpenFile(*flagOutfile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0775)
        if err != nil {
-               Exitf("cannot create %s: %v", outfile, err)
+               Exitf("cannot create %s: %v", *flagOutfile, err)
        }
 
        coutbuf.w = bufio.NewWriter(f)
        coutbuf.f = f
 
-       if INITENTRY == "" {
+       if *flagEntrySymbol == "" {
                switch Buildmode {
                case BuildmodeCShared, BuildmodeCArchive:
-                       INITENTRY = fmt.Sprintf("_rt0_%s_%s_lib", goarch, goos)
+                       *flagEntrySymbol = fmt.Sprintf("_rt0_%s_%s_lib", goarch, goos)
                case BuildmodeExe, BuildmodePIE:
-                       INITENTRY = fmt.Sprintf("_rt0_%s_%s", goarch, goos)
+                       *flagEntrySymbol = fmt.Sprintf("_rt0_%s_%s", goarch, goos)
                case BuildmodeShared:
-                       // No INITENTRY for -buildmode=shared
+                       // No *flagEntrySymbol for -buildmode=shared
                default:
-                       ctxt.Diag("unknown INITENTRY for buildmode %v", Buildmode)
+                       ctxt.Diag("unknown *flagEntrySymbol for buildmode %v", Buildmode)
                }
        }
 
        if !DynlinkingGo() {
-               Linklookup(ctxt, INITENTRY, 0).Type = obj.SXREF
+               Linklookup(ctxt, *flagEntrySymbol, 0).Type = obj.SXREF
        }
 }
 
@@ -463,7 +340,7 @@ func errorexit() {
 func loadinternal(ctxt *Link, name string) {
        found := 0
        for i := 0; i < len(ctxt.Libdir); i++ {
-               if Linkshared {
+               if *FlagLinkshared {
                        shlibname := filepath.Join(ctxt.Libdir[i], name+".shlibname")
                        if ctxt.Debugvlog != 0 {
                                fmt.Fprintf(ctxt.Bso, "searching for %s.a in %s\n", name, shlibname)
@@ -506,10 +383,10 @@ func (ctxt *Link) loadlib() {
        if SysArch.Family == sys.ARM {
                loadinternal(ctxt, "math")
        }
-       if flag_race {
+       if *flagRace {
                loadinternal(ctxt, "runtime/race")
        }
-       if flag_msan {
+       if *flagMsan {
                loadinternal(ctxt, "runtime/msan")
        }
 
@@ -561,7 +438,7 @@ func (ctxt *Link) loadlib() {
                }
 
                // Force external linking for msan.
-               if flag_msan {
+               if *flagMsan {
                        Linkmode = LinkExternal
                }
        }
@@ -690,29 +567,29 @@ func (ctxt *Link) loadlib() {
                        }
                }
                if any {
-                       if libgccfile == "" {
-                               if extld == "" {
-                                       extld = "gcc"
+                       if *flagLibGCC == "" {
+                               if *flagExtld == "" {
+                                       *flagExtld = "gcc"
                                }
                                args := hostlinkArchArgs()
                                args = append(args, "--print-libgcc-file-name")
                                if ctxt.Debugvlog != 0 {
-                                       fmt.Fprintf(ctxt.Bso, "%s %v\n", extld, args)
+                                       fmt.Fprintf(ctxt.Bso, "%s %v\n", *flagExtld, args)
                                }
-                               out, err := exec.Command(extld, args...).Output()
+                               out, err := exec.Command(*flagExtld, args...).Output()
                                if err != nil {
                                        if ctxt.Debugvlog != 0 {
                                                fmt.Fprintln(ctxt.Bso, "not using a libgcc file because compiler failed")
                                                fmt.Fprintf(ctxt.Bso, "%v\n%s\n", err, out)
                                        }
-                                       libgccfile = "none"
+                                       *flagLibGCC = "none"
                                } else {
-                                       libgccfile = strings.TrimSpace(string(out))
+                                       *flagLibGCC = strings.TrimSpace(string(out))
                                }
                        }
 
-                       if libgccfile != "none" {
-                               hostArchive(ctxt, libgccfile)
+                       if *flagLibGCC != "none" {
+                               hostArchive(ctxt, *flagLibGCC)
                        }
                }
        } else {
@@ -733,7 +610,7 @@ func (ctxt *Link) loadlib() {
        switch Buildmode {
        case BuildmodeExe, BuildmodePIE:
                if havedynamic == 0 && HEADTYPE != obj.Hdarwin && HEADTYPE != obj.Hsolaris {
-                       Debug['d'] = true
+                       *FlagD = true
                }
        }
 
@@ -939,7 +816,7 @@ func hostobjs(ctxt *Link) {
 // provided by lib9
 
 func rmtemp() {
-       os.RemoveAll(tmpdir)
+       os.RemoveAll(*flagTmpdir)
 }
 
 func hostlinksetup() {
@@ -950,16 +827,16 @@ func hostlinksetup() {
        // For external link, record that we need to tell the external linker -s,
        // and turn off -s internally: the external linker needs the symbol
        // information for its final link.
-       debug_s = Debug['s']
-       Debug['s'] = false
+       debug_s = *FlagS
+       *FlagS = false
 
        // create temporary directory and arrange cleanup
-       if tmpdir == "" {
+       if *flagTmpdir == "" {
                dir, err := ioutil.TempDir("", "go-link-")
                if err != nil {
                        log.Fatal(err)
                }
-               tmpdir = dir
+               *flagTmpdir = dir
                AtExit(rmtemp)
        }
 
@@ -967,7 +844,7 @@ func hostlinksetup() {
        coutbuf.f.Close()
        mayberemoveoutfile()
 
-       p := filepath.Join(tmpdir, "go.o")
+       p := filepath.Join(*flagTmpdir, "go.o")
        var err error
        f, err := os.OpenFile(p, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0775)
        if err != nil {
@@ -985,7 +862,7 @@ func hostobjCopy() (paths []string) {
        sema := make(chan struct{}, runtime.NumCPU()) // limit open file descriptors
        for i, h := range hostobj {
                h := h
-               dst := filepath.Join(tmpdir, fmt.Sprintf("%06d.o", i))
+               dst := filepath.Join(*flagTmpdir, fmt.Sprintf("%06d.o", i))
                paths = append(paths, dst)
 
                wg.Add(1)
@@ -1025,8 +902,8 @@ func (ctxt *Link) archive() {
                return
        }
 
-       if extar == "" {
-               extar = "ar"
+       if *flagExtar == "" {
+               *flagExtar = "ar"
        }
 
        mayberemoveoutfile()
@@ -1039,8 +916,8 @@ func (ctxt *Link) archive() {
        }
        coutbuf.f = nil
 
-       argv := []string{extar, "-q", "-c", "-s", outfile}
-       argv = append(argv, filepath.Join(tmpdir, "go.o"))
+       argv := []string{*flagExtar, "-q", "-c", "-s", *flagOutfile}
+       argv = append(argv, filepath.Join(*flagTmpdir, "go.o"))
        argv = append(argv, hostobjCopy()...)
 
        if ctxt.Debugvlog != 0 {
@@ -1061,15 +938,15 @@ func (l *Link) hostlink() {
                return
        }
 
-       if extld == "" {
-               extld = "gcc"
+       if *flagExtld == "" {
+               *flagExtld = "gcc"
        }
 
        var argv []string
-       argv = append(argv, extld)
+       argv = append(argv, *flagExtld)
        argv = append(argv, hostlinkArchArgs()...)
 
-       if !Debug['s'] && !debug_s {
+       if !*FlagS && !debug_s {
                argv = append(argv, "-gdwarf-2")
        } else {
                argv = append(argv, "-s")
@@ -1144,7 +1021,7 @@ func (l *Link) hostlink() {
                        // If gold is not installed, gcc will silently switch
                        // back to ld.bfd. So we parse the version information
                        // and provide a useful error if gold is missing.
-                       cmd := exec.Command(extld, "-fuse-ld=gold", "-Wl,--version")
+                       cmd := exec.Command(*flagExtld, "-fuse-ld=gold", "-Wl,--version")
                        if out, err := cmd.CombinedOutput(); err == nil {
                                if !bytes.Contains(out, []byte("GNU gold")) {
                                        log.Fatalf("ARM external linker must be gold (issue #15696), but is not: %s", out)
@@ -1163,7 +1040,7 @@ func (l *Link) hostlink() {
        // will decide that the file already has an extension. We
        // only want to do this when producing a Windows output file
        // on a Windows host.
-       outopt := outfile
+       outopt := *flagOutfile
        if goos == "windows" && runtime.GOOS == "windows" && filepath.Ext(outopt) == "" {
                outopt += "."
        }
@@ -1183,10 +1060,10 @@ func (l *Link) hostlink() {
                argv = append(argv, "-Qunused-arguments")
        }
 
-       argv = append(argv, filepath.Join(tmpdir, "go.o"))
+       argv = append(argv, filepath.Join(*flagTmpdir, "go.o"))
        argv = append(argv, hostobjCopy()...)
 
-       if Linkshared {
+       if *FlagLinkshared {
                seenDirs := make(map[string]bool)
                seenLibs := make(map[string]bool)
                addshlib := func(path string) {
@@ -1219,7 +1096,7 @@ func (l *Link) hostlink() {
                }
        }
 
-       sanitizers := flag_race
+       sanitizers := *flagRace
 
        for _, flag := range ldflag {
                if strings.HasPrefix(flag, "-fsanitize=") {
@@ -1234,12 +1111,12 @@ func (l *Link) hostlink() {
                // executables by default, tsan/msan/asan/etc initialization can
                // fail. So we pass -no-pie here, but support for that flag is quite
                // new and we test for its support first.
-               src := filepath.Join(tmpdir, "trivial.c")
+               src := filepath.Join(*flagTmpdir, "trivial.c")
                if err := ioutil.WriteFile(src, []byte{}, 0666); err != nil {
                        l.Diag("WriteFile trivial.c failed: %v", err)
                }
                cmd := exec.Command(argv[0], "-c", "-no-pie", "trivial.c")
-               cmd.Dir = tmpdir
+               cmd.Dir = *flagTmpdir
                cmd.Env = append([]string{"LC_ALL=C"}, os.Environ()...)
                out, err := cmd.CombinedOutput()
                supported := err == nil && !bytes.Contains(out, []byte("unrecognized"))
@@ -1248,14 +1125,14 @@ func (l *Link) hostlink() {
                }
        }
 
-       for _, p := range strings.Fields(extldflags) {
+       for _, p := range strings.Fields(*flagExtldflags) {
                argv = append(argv, p)
 
                // clang, unlike GCC, passes -rdynamic to the linker
                // even when linking with -static, causing a linker
                // error when using GNU ld. So take out -rdynamic if
                // we added it. We do it in this order, rather than
-               // only adding -rdynamic later, so that -extldflags
+               // only adding -rdynamic later, so that -*extldflags
                // can override -rdynamic without using -static.
                if Iself && p == "-static" {
                        for i := range argv {
@@ -1285,11 +1162,11 @@ func (l *Link) hostlink() {
                l.Bso.Flush()
        }
 
-       if !Debug['s'] && !debug_s && HEADTYPE == obj.Hdarwin {
+       if !*FlagS && !debug_s && HEADTYPE == obj.Hdarwin {
                // Skip combining dwarf on arm.
                if !SysArch.InFamily(sys.ARM, sys.ARM64) {
-                       dsym := filepath.Join(tmpdir, "go.dwarf")
-                       if out, err := exec.Command("dsymutil", "-f", outfile, "-o", dsym).CombinedOutput(); err != nil {
+                       dsym := filepath.Join(*flagTmpdir, "go.dwarf")
+                       if out, err := exec.Command("dsymutil", "-f", *flagOutfile, "-o", dsym).CombinedOutput(); err != nil {
                                l.Cursym = nil
                                Exitf("%s: running dsymutil failed: %v\n%s", os.Args[0], err, out)
                        }
@@ -1298,13 +1175,13 @@ func (l *Link) hostlink() {
                                return
                        }
                        // For os.Rename to work reliably, must be in same directory as outfile.
-                       combinedOutput := outfile + "~"
-                       if err := machoCombineDwarf(outfile, dsym, combinedOutput); err != nil {
+                       combinedOutput := *flagOutfile + "~"
+                       if err := machoCombineDwarf(*flagOutfile, dsym, combinedOutput); err != nil {
                                l.Cursym = nil
                                Exitf("%s: combining dwarf failed: %v", os.Args[0], err)
                        }
-                       os.Remove(outfile)
-                       if err := os.Rename(combinedOutput, outfile); err != nil {
+                       os.Remove(*flagOutfile)
+                       if err := os.Rename(combinedOutput, *flagOutfile); err != nil {
                                l.Cursym = nil
                                Exitf("%s: %v", os.Args[0], err)
                        }
@@ -1383,7 +1260,7 @@ func ldobj(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string, file
        t := fmt.Sprintf("%s %s %s ", goos, obj.Getgoarch(), obj.Getgoversion())
 
        line = strings.TrimRight(line, "\n")
-       if !strings.HasPrefix(line[10:]+" ", t) && !Debug['f'] {
+       if !strings.HasPrefix(line[10:]+" ", t) && !*flagF {
                ctxt.Diag("%s: object is [%s] expected [%s]", pn, line[10:], t)
                return nil
        }
@@ -1937,11 +1814,6 @@ func setheadtype(s string) {
        HEADTYPE = int32(headtype(s))
 }
 
-func setinterp(s string) {
-       Debug['I'] = true // denote cmdline interpreter override
-       interpreter = s
-}
-
 func doversion() {
        Exitf("version %s", obj.Getgoversion())
 }
@@ -2070,7 +1942,7 @@ func genasmsym(ctxt *Link, put func(*Link, *Symbol, string, int, int64, int64, i
 
        // Otherwise, off is addressing the saved program counter.
        // Something underhanded is going on. Say nothing.
-       if ctxt.Debugvlog != 0 || Debug['n'] {
+       if ctxt.Debugvlog != 0 || *flagN {
                fmt.Fprintf(ctxt.Bso, "%5.2f symsize = %d\n", obj.Cputime(), uint32(Symsize))
        }
        ctxt.Bso.Flush()
@@ -2104,13 +1976,13 @@ func datoff(ctxt *Link, addr int64) int64 {
 }
 
 func Entryvalue(ctxt *Link) int64 {
-       a := INITENTRY
+       a := *flagEntrySymbol
        if a[0] >= '0' && a[0] <= '9' {
                return atolwhex(a)
        }
        s := Linklookup(ctxt, a, 0)
        if s.Type == 0 {
-               return INITTEXT
+               return *FlagTextAddr
        }
        if s.Type != obj.STEXT {
                ctxt.Diag("entry not text: %s", s.Name)
@@ -2149,7 +2021,7 @@ func (ctxt *Link) undef() {
 }
 
 func (ctxt *Link) callgraph() {
-       if !Debug['c'] {
+       if !*FlagC {
                return
        }
 
@@ -2177,7 +2049,7 @@ func (ctxt *Link) Diag(format string, args ...interface{}) {
        }
        fmt.Printf("%s%s%s\n", tn, sep, fmt.Sprintf(format, args...))
        nerrors++
-       if Debug['h'] {
+       if *flagH {
                panic("error")
        }
        if nerrors > 20 {
index 4350eb37a5eb37d7af42631ff31611b2cd311f45..056fde37773a4d9125e70d67b50ca125089ee10c 100644 (file)
@@ -295,7 +295,7 @@ func machowrite() int {
 }
 
 func (ctxt *Link) domacho() {
-       if Debug['d'] {
+       if *FlagD {
                return
        }
 
@@ -340,7 +340,7 @@ func Machoadddynlib(lib string) {
 
        if load_budget < 0 {
                HEADR += 4096
-               INITTEXT += 4096
+               *FlagTextAddr += 4096
                load_budget += 4096
        }
 
@@ -415,7 +415,7 @@ func machoshbits(ctxt *Link, mseg *MachoSeg, sect *Section, segname string) {
 
 func Asmbmacho(ctxt *Link) {
        /* apple MACH */
-       va := INITTEXT - int64(HEADR)
+       va := *FlagTextAddr - int64(HEADR)
 
        mh := getMachoHdr()
        switch SysArch.Family {
@@ -460,7 +460,7 @@ func Asmbmacho(ctxt *Link) {
        }
 
        /* text */
-       v := Rnd(int64(uint64(HEADR)+Segtext.Length), int64(INITRND))
+       v := Rnd(int64(uint64(HEADR)+Segtext.Length), int64(*FlagRound))
 
        if Linkmode != LinkExternal {
                ms = newMachoSeg("__TEXT", 20)
@@ -493,7 +493,7 @@ func Asmbmacho(ctxt *Link) {
        }
 
        /* dwarf */
-       if !Debug['w'] {
+       if !*FlagW {
                if Linkmode != LinkExternal {
                        ms = newMachoSeg("__DWARF", 20)
                        ms.vaddr = Segdwarf.Vaddr
@@ -539,7 +539,7 @@ func Asmbmacho(ctxt *Link) {
                }
        }
 
-       if !Debug['d'] {
+       if !*FlagD {
                // must match domacholink below
                s1 := Linklookup(ctxt, ".machosymtab", 0)
                s2 := Linklookup(ctxt, ".linkedit.plt", 0)
@@ -548,7 +548,7 @@ func Asmbmacho(ctxt *Link) {
 
                if Linkmode != LinkExternal {
                        ms := newMachoSeg("__LINKEDIT", 0)
-                       ms.vaddr = uint64(va) + uint64(v) + uint64(Rnd(int64(Segdata.Length), int64(INITRND)))
+                       ms.vaddr = uint64(va) + uint64(v) + uint64(Rnd(int64(Segdata.Length), int64(*FlagRound)))
                        ms.vsize = uint64(s1.Size) + uint64(s2.Size) + uint64(s3.Size) + uint64(s4.Size)
                        ms.fileoffset = uint64(linkoff)
                        ms.filesize = ms.vsize
@@ -797,7 +797,7 @@ func Domacholink(ctxt *Link) int64 {
        size := int(s1.Size + s2.Size + s3.Size + s4.Size)
 
        if size > 0 {
-               linkoff = Rnd(int64(uint64(HEADR)+Segtext.Length), int64(INITRND)) + Rnd(int64(Segdata.Filelen), int64(INITRND)) + Rnd(int64(Segdwarf.Filelen), int64(INITRND))
+               linkoff = Rnd(int64(uint64(HEADR)+Segtext.Length), int64(*FlagRound)) + Rnd(int64(Segdata.Filelen), int64(*FlagRound)) + Rnd(int64(Segdwarf.Filelen), int64(*FlagRound))
                Cseek(linkoff)
 
                Cwrite(s1.P[:s1.Size])
@@ -806,7 +806,7 @@ func Domacholink(ctxt *Link) int64 {
                Cwrite(s4.P[:s4.Size])
        }
 
-       return Rnd(int64(size), int64(INITRND))
+       return Rnd(int64(size), int64(*FlagRound))
 }
 
 func machorelocsect(ctxt *Link, sect *Section, syms []*Symbol) {
index 0c9683bb76669c7303b8a793194c780c7c02b3cb..6a70b3eec964291a60b7a81e95c231b49e400fad 100644 (file)
@@ -36,20 +36,71 @@ import (
        "cmd/internal/sys"
        "flag"
        "fmt"
+       "log"
        "os"
+       "runtime"
+       "runtime/pprof"
        "strings"
 )
 
 var (
        pkglistfornote []byte
-       buildid        string
 )
 
-func Ldmain() {
+func init() {
+       flag.Var(&Buildmode, "buildmode", "set build `mode`")
+       flag.Var(&rpath, "r", "set the ELF dynamic linker search `path` to dir1:dir2:...")
+}
+
+// Flags used by the linker. The exported flags are used by the architecture-specific packages.
+var (
+       flagBuildid = flag.String("buildid", "", "record `id` as Go toolchain build id")
+
+       flagOutfile    = flag.String("o", "", "write output to `file`")
+       FlagLinkshared = flag.Bool("linkshared", false, "link against installed Go shared libraries")
+       Buildmode      BuildMode
+
+       flagInstallSuffix = flag.String("installsuffix", "", "set package directory `suffix`")
+       flagDumpDep       = flag.Bool("dumpdep", false, "dump symbol dependency graph")
+       flagRace          = flag.Bool("race", false, "enable race detector")
+       flagMsan          = flag.Bool("msan", false, "enable MSan interface")
+
+       flagFieldTrack = flag.String("k", "", "set field tracking `symbol`")
+       flagLibGCC     = flag.String("libgcc", "", "compiler support lib for internal linking; use \"none\" to disable")
+       flagTmpdir     = flag.String("tmpdir", "", "use `directory` for temporary files")
+
+       flagExtld      = flag.String("extld", "", "use `linker` when linking in external mode")
+       flagExtldflags = flag.String("extldflags", "", "pass `flags` to external linker")
+       flagExtar      = flag.String("extar", "", "archive program for buildmode=c-archive")
+
+       flagA           = flag.Bool("a", false, "disassemble output")
+       FlagC           = flag.Bool("c", false, "dump call graph")
+       FlagD           = flag.Bool("d", false, "disable dynamic executable")
+       flagF           = flag.Bool("f", false, "ignore version mismatch")
+       flagG           = flag.Bool("g", false, "disable go package data checks")
+       flagH           = flag.Bool("h", false, "halt on error")
+       flagN           = flag.Bool("n", false, "dump symbol table")
+       FlagS           = flag.Bool("s", false, "disable symbol table")
+       flagU           = flag.Bool("u", false, "reject unsafe packages")
+       FlagW           = flag.Bool("w", false, "disable DWARF generation")
+       Flag8           bool // use 64-bit addresses in symbol table
+       flagInterpreter = flag.String("I", "", "use `linker` as ELF dynamic linker")
+
+       FlagRound       = flag.Int("R", -1, "set address rounding `quantum`")
+       FlagTextAddr    = flag.Int64("T", -1, "set text segment `address`")
+       FlagDataAddr    = flag.Int64("D", -1, "set data segment `address`")
+       flagEntrySymbol = flag.String("E", "", "set `entry` symbol name")
+
+       cpuprofile     = flag.String("cpuprofile", "", "write cpu profile to `file`")
+       memprofile     = flag.String("memprofile", "", "write memory profile to `file`")
+       memprofilerate = flag.Int64("memprofilerate", 0, "set runtime.MemProfileRate to `rate`")
+)
+
+// Main is the main entry point for the linker code.
+func Main() {
        ctxt := linknew(SysArch)
        ctxt.Bso = bufio.NewWriter(os.Stdout)
 
-       Debug = [128]bool{}
        nerrors = 0
        HEADTYPE = -1
        Linkmode = LinkAuto
@@ -63,55 +114,21 @@ func Ldmain() {
                }
        }
 
+       // TODO(matloob): define these above and then check flag values here
        if SysArch.Family == sys.AMD64 && obj.Getgoos() == "plan9" {
-               flag.BoolVar(&Debug['8'], "8", false, "use 64-bit addresses in symbol table")
+               flag.BoolVar(&Flag8, "8", false, "use 64-bit addresses in symbol table")
        }
        obj.Flagfn1("B", "add an ELF NT_GNU_BUILD_ID `note` when using ELF", addbuildinfo)
-       flag.BoolVar(&Debug['C'], "C", false, "check Go calls to C code")
-       flag.Int64Var(&INITDAT, "D", -1, "set data segment `address`")
-       flag.StringVar(&INITENTRY, "E", "", "set `entry` symbol name")
-       obj.Flagfn1("I", "use `linker` as ELF dynamic linker", setinterp)
        obj.Flagfn1("L", "add specified `directory` to library path", func(a string) { Lflag(ctxt, a) })
        obj.Flagfn1("H", "set header `type`", setheadtype)
-       flag.IntVar(&INITRND, "R", -1, "set address rounding `quantum`")
-       flag.Int64Var(&INITTEXT, "T", -1, "set text segment `address`")
        obj.Flagfn0("V", "print version and exit", doversion)
        obj.Flagfn1("X", "add string value `definition` of the form importpath.name=value", func(s string) { addstrdata1(ctxt, s) })
-       flag.BoolVar(&Debug['a'], "a", false, "disassemble output")
-       flag.StringVar(&buildid, "buildid", "", "record `id` as Go toolchain build id")
-       flag.Var(&Buildmode, "buildmode", "set build `mode`")
-       flag.BoolVar(&Debug['c'], "c", false, "dump call graph")
-       flag.BoolVar(&Debug['d'], "d", false, "disable dynamic executable")
-       flag.BoolVar(&flag_dumpdep, "dumpdep", false, "dump symbol dependency graph")
-       flag.StringVar(&extar, "extar", "", "archive program for buildmode=c-archive")
-       flag.StringVar(&extld, "extld", "", "use `linker` when linking in external mode")
-       flag.StringVar(&extldflags, "extldflags", "", "pass `flags` to external linker")
-       flag.BoolVar(&Debug['f'], "f", false, "ignore version mismatch")
-       flag.BoolVar(&Debug['g'], "g", false, "disable go package data checks")
-       flag.BoolVar(&Debug['h'], "h", false, "halt on error")
-       flag.StringVar(&flag_installsuffix, "installsuffix", "", "set package directory `suffix`")
-       flag.StringVar(&tracksym, "k", "", "set field tracking `symbol`")
-       flag.StringVar(&libgccfile, "libgcc", "", "compiler support lib for internal linking; use \"none\" to disable")
+       obj.Flagcount("v", "print link trace", &ctxt.Debugvlog)
        obj.Flagfn1("linkmode", "set link `mode` (internal, external, auto)", setlinkmode)
-       flag.BoolVar(&Linkshared, "linkshared", false, "link against installed Go shared libraries")
-       flag.BoolVar(&flag_msan, "msan", false, "enable MSan interface")
-       flag.BoolVar(&Debug['n'], "n", false, "dump symbol table")
-       flag.StringVar(&outfile, "o", "", "write output to `file`")
-       flag.Var(&rpath, "r", "set the ELF dynamic linker search `path` to dir1:dir2:...")
-       flag.BoolVar(&flag_race, "race", false, "enable race detector")
-       flag.BoolVar(&Debug['s'], "s", false, "disable symbol table")
        var flagShared bool
        if SysArch.InFamily(sys.ARM, sys.AMD64) {
                flag.BoolVar(&flagShared, "shared", false, "generate shared object (implies -linkmode external)")
        }
-       flag.StringVar(&tmpdir, "tmpdir", "", "use `directory` for temporary files")
-       flag.BoolVar(&Debug['u'], "u", false, "reject unsafe packages")
-       obj.Flagcount("v", "print link trace", &ctxt.Debugvlog)
-       flag.BoolVar(&Debug['w'], "w", false, "disable DWARF generation")
-
-       flag.StringVar(&cpuprofile, "cpuprofile", "", "write cpu profile to `file`")
-       flag.StringVar(&memprofile, "memprofile", "", "write memory profile to `file`")
-       flag.Int64Var(&memprofilerate, "memprofilerate", 0, "set runtime.MemProfileRate to `rate`")
 
        obj.Flagparse(usage)
 
@@ -132,10 +149,10 @@ func Ldmain() {
                usage()
        }
 
-       if outfile == "" {
-               outfile = "a.out"
+       if *flagOutfile == "" {
+               *flagOutfile = "a.out"
                if HEADTYPE == obj.Hwindows {
-                       outfile += ".exe"
+                       *flagOutfile += ".exe"
                }
        }
 
@@ -151,12 +168,12 @@ func Ldmain() {
 
        Thearch.Archinit(ctxt)
 
-       if Linkshared && !Iself {
+       if *FlagLinkshared && !Iself {
                Exitf("-linkshared can only be used on elf systems")
        }
 
        if ctxt.Debugvlog != 0 {
-               fmt.Fprintf(ctxt.Bso, "HEADER = -H%d -T0x%x -D0x%x -R0x%x\n", HEADTYPE, uint64(INITTEXT), uint64(INITDAT), uint32(INITRND))
+               fmt.Fprintf(ctxt.Bso, "HEADER = -H%d -T0x%x -D0x%x -R0x%x\n", HEADTYPE, uint64(*FlagTextAddr), uint64(*FlagDataAddr), uint32(*FlagRound))
        }
        ctxt.Bso.Flush()
 
@@ -216,3 +233,137 @@ func Ldmain() {
 
        errorexit()
 }
+
+// A BuildMode indicates the sort of object we are building:
+//   "exe": build a main package and everything it imports into an executable.
+//   "c-shared": build a main package, plus all packages that it imports, into a
+//     single C shared library. The only callable symbols will be those functions
+//     marked as exported.
+//   "shared": combine all packages passed on the command line, and their
+//     dependencies, into a single shared library that will be used when
+//     building with the -linkshared option.
+type BuildMode uint8
+
+const (
+       BuildmodeUnset BuildMode = iota
+       BuildmodeExe
+       BuildmodePIE
+       BuildmodeCArchive
+       BuildmodeCShared
+       BuildmodeShared
+)
+
+func (mode *BuildMode) Set(s string) error {
+       goos := obj.Getgoos()
+       goarch := obj.Getgoarch()
+       badmode := func() error {
+               return fmt.Errorf("buildmode %s not supported on %s/%s", s, goos, goarch)
+       }
+       switch s {
+       default:
+               return fmt.Errorf("invalid buildmode: %q", s)
+       case "exe":
+               *mode = BuildmodeExe
+       case "pie":
+               switch goos {
+               case "android", "linux":
+               default:
+                       return badmode()
+               }
+               *mode = BuildmodePIE
+       case "c-archive":
+               switch goos {
+               case "darwin", "linux":
+               case "windows":
+                       switch goarch {
+                       case "amd64", "386":
+                       default:
+                               return badmode()
+                       }
+               default:
+                       return badmode()
+               }
+               *mode = BuildmodeCArchive
+       case "c-shared":
+               switch goarch {
+               case "386", "amd64", "arm", "arm64":
+               default:
+                       return badmode()
+               }
+               *mode = BuildmodeCShared
+       case "shared":
+               switch goos {
+               case "linux":
+                       switch goarch {
+                       case "386", "amd64", "arm", "arm64", "ppc64le", "s390x":
+                       default:
+                               return badmode()
+                       }
+               default:
+                       return badmode()
+               }
+               *mode = BuildmodeShared
+       }
+       return nil
+}
+
+func (mode *BuildMode) String() string {
+       switch *mode {
+       case BuildmodeUnset:
+               return "" // avoid showing a default in usage message
+       case BuildmodeExe:
+               return "exe"
+       case BuildmodePIE:
+               return "pie"
+       case BuildmodeCArchive:
+               return "c-archive"
+       case BuildmodeCShared:
+               return "c-shared"
+       case BuildmodeShared:
+               return "shared"
+       }
+       return fmt.Sprintf("BuildMode(%d)", uint8(*mode))
+}
+
+type Rpath struct {
+       set bool
+       val string
+}
+
+func (r *Rpath) Set(val string) error {
+       r.set = true
+       r.val = val
+       return nil
+}
+
+func (r *Rpath) String() string {
+       return r.val
+}
+
+func startProfile() {
+       if *cpuprofile != "" {
+               f, err := os.Create(*cpuprofile)
+               if err != nil {
+                       log.Fatalf("%v", err)
+               }
+               if err := pprof.StartCPUProfile(f); err != nil {
+                       log.Fatalf("%v", err)
+               }
+               AtExit(pprof.StopCPUProfile)
+       }
+       if *memprofile != "" {
+               if *memprofilerate != 0 {
+                       runtime.MemProfileRate = int(*memprofilerate)
+               }
+               f, err := os.Create(*memprofile)
+               if err != nil {
+                       log.Fatalf("%v", err)
+               }
+               AtExit(func() {
+                       runtime.GC() // profile all outstanding allocations
+                       if err := pprof.WriteHeapProfile(f); err != nil {
+                               log.Fatalf("%v", err)
+                       }
+               })
+       }
+}
index 3361d5f6fa4fc204d8ff49c489999658a8fbaa8d..8351555d305f7d5ab1e87ed73ec307ae0a3ad12f 100644 (file)
@@ -701,7 +701,7 @@ func initdynexport(ctxt *Link) {
 func addexports(ctxt *Link) {
        var e IMAGE_EXPORT_DIRECTORY
 
-       size := binary.Size(&e) + 10*nexport + len(outfile) + 1
+       size := binary.Size(&e) + 10*nexport + len(*flagOutfile) + 1
        for i := 0; i < nexport; i++ {
                size += len(dexport[i].Extname) + 1
        }
@@ -741,7 +741,7 @@ func addexports(ctxt *Link) {
        }
 
        // put EXPORT Name Pointer Table
-       v := int(e.Name + uint32(len(outfile)) + 1)
+       v := int(e.Name + uint32(len(*flagOutfile)) + 1)
 
        for i := 0; i < nexport; i++ {
                Lputl(uint32(v))
@@ -754,7 +754,7 @@ func addexports(ctxt *Link) {
        }
 
        // put Names
-       strnput(outfile, len(outfile)+1)
+       strnput(*flagOutfile, len(*flagOutfile)+1)
 
        for i := 0; i < nexport; i++ {
                strnput(dexport[i].Extname, len(dexport[i].Extname)+1)
@@ -1021,7 +1021,7 @@ func addpesymtable(ctxt *Link) {
 
        // write COFF symbol table
        var symcnt int
-       if !Debug['s'] || Linkmode == LinkExternal {
+       if !*FlagS || Linkmode == LinkExternal {
                symcnt = writePESymTableRecords(ctxt)
        }
 
@@ -1114,7 +1114,7 @@ func addinitarray(ctxt *Link) (c *IMAGE_SECTION_HEADER) {
 
        Cseek(int64(c.PointerToRawData))
        chksectoff(ctxt, c, Cpos())
-       init_entry := Linklookup(ctxt, INITENTRY, 0)
+       init_entry := Linklookup(ctxt, *flagEntrySymbol, 0)
        addr := uint64(init_entry.Value) - init_entry.Sect.Vaddr
 
        switch obj.Getgoarch() {
@@ -1168,7 +1168,7 @@ func Asmbpe(ctxt *Link) {
                c = addinitarray(ctxt)
        }
 
-       if !Debug['s'] {
+       if !*FlagS {
                dwarfaddpeheaders(ctxt)
        }
 
index 1b30498d1d1903441da309cd99e4a4787c6b082a..6a2a6d29087b218088a89f5db8b95f9eb4dedfdf 100644 (file)
@@ -226,7 +226,7 @@ func putplan9sym(ctxt *Link, x *Symbol, s string, t int, addr int64, size int64,
                'Z',
                'm':
                l := 4
-               if HEADTYPE == obj.Hplan9 && SysArch.Family == sys.AMD64 && !Debug['8'] {
+               if HEADTYPE == obj.Hplan9 && SysArch.Family == sys.AMD64 && !Flag8 {
                        Lputb(uint32(addr >> 32))
                        l = 8
                }
@@ -483,7 +483,7 @@ func (ctxt *Link) symtab() {
        }
 
        if Buildmode == BuildmodeShared {
-               abihashgostr := Linklookup(ctxt, "go.link.abihash."+filepath.Base(outfile), 0)
+               abihashgostr := Linklookup(ctxt, "go.link.abihash."+filepath.Base(*flagOutfile), 0)
                abihashgostr.Attr |= AttrReachable
                abihashgostr.Type = obj.SRODATA
                hashsym := Linklookup(ctxt, "go.link.abihashbytes", 0)
@@ -538,7 +538,7 @@ func (ctxt *Link) symtab() {
        adduint(ctxt, moduledata, uint64(nitablinks))
        adduint(ctxt, moduledata, uint64(nitablinks))
        if len(ctxt.Shlibs) > 0 {
-               thismodulename := filepath.Base(outfile)
+               thismodulename := filepath.Base(*flagOutfile)
                switch Buildmode {
                case BuildmodeExe, BuildmodePIE:
                        // When linking an executable, outfile is just "a.out". Make
index 19b3688aff5cb82e3ce3c0c68d0009986118f8af..047c060b37224b24502a83ee7971025f3077db9f 100644 (file)
@@ -7,10 +7,7 @@ package ld
 import (
        "bytes"
        "encoding/binary"
-       "log"
        "os"
-       "runtime"
-       "runtime/pprof"
        "strings"
        "time"
 )
@@ -82,40 +79,6 @@ func Exit(code int) {
        os.Exit(code)
 }
 
-var (
-       cpuprofile     string
-       memprofile     string
-       memprofilerate int64
-)
-
-func startProfile() {
-       if cpuprofile != "" {
-               f, err := os.Create(cpuprofile)
-               if err != nil {
-                       log.Fatalf("%v", err)
-               }
-               if err := pprof.StartCPUProfile(f); err != nil {
-                       log.Fatalf("%v", err)
-               }
-               AtExit(pprof.StopCPUProfile)
-       }
-       if memprofile != "" {
-               if memprofilerate != 0 {
-                       runtime.MemProfileRate = int(memprofilerate)
-               }
-               f, err := os.Create(memprofile)
-               if err != nil {
-                       log.Fatalf("%v", err)
-               }
-               AtExit(func() {
-                       runtime.GC() // profile all outstanding allocations
-                       if err := pprof.WriteHeapProfile(f); err != nil {
-                               log.Fatalf("%v", err)
-                       }
-               })
-       }
-}
-
 func artrim(x []byte) string {
        i := 0
        j := len(x)
index 2d50e8d85948a624e5a9982a3fcb467a57ae8183..404dfa21b77cff2d73e1fc0748d289c26d38c808 100644 (file)
@@ -226,7 +226,7 @@ func asmb(ctxt *ld.Link) {
 
        ld.Lcsize = 0
        symo := uint32(0)
-       if ld.Debug['s'] {
+       if *ld.FlagS {
                // TODO: rationalize
                if ctxt.Debugvlog != 0 {
                        fmt.Fprintf(ctxt.Bso, "%5.2f sym\n", obj.Cputime())
@@ -236,7 +236,7 @@ func asmb(ctxt *ld.Link) {
                default:
                        if ld.Iself {
                                symo = uint32(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen)
-                               symo = uint32(ld.Rnd(int64(symo), int64(ld.INITRND)))
+                               symo = uint32(ld.Rnd(int64(symo), int64(*ld.FlagRound)))
                        }
 
                case obj.Hplan9:
@@ -306,7 +306,7 @@ func asmb(ctxt *ld.Link) {
        }
 
        ld.Cflush()
-       if ld.Debug['c'] {
+       if *ld.FlagC {
                fmt.Printf("textsize=%d\n", ld.Segtext.Filelen)
                fmt.Printf("datsize=%d\n", ld.Segdata.Filelen)
                fmt.Printf("bsssize=%d\n", ld.Segdata.Length-ld.Segdata.Filelen)
index 3d8f8f1c128233596ec0803645647a036f235fbc..d2b200dbe073e60b609c8c18fe24dfedda870539 100644 (file)
@@ -42,7 +42,7 @@ import (
 
 func Main() {
        linkarchinit()
-       ld.Ldmain()
+       ld.Main()
 }
 
 func linkarchinit() {
@@ -119,45 +119,45 @@ func archinit(ctxt *ld.Link) {
        case obj.Hplan9: /* plan 9 */
                ld.HEADR = 32
 
-               if ld.INITTEXT == -1 {
-                       ld.INITTEXT = 16*1024 + int64(ld.HEADR)
+               if *ld.FlagTextAddr == -1 {
+                       *ld.FlagTextAddr = 16*1024 + int64(ld.HEADR)
                }
-               if ld.INITDAT == -1 {
-                       ld.INITDAT = 0
+               if *ld.FlagDataAddr == -1 {
+                       *ld.FlagDataAddr = 0
                }
-               if ld.INITRND == -1 {
-                       ld.INITRND = 16 * 1024
+               if *ld.FlagRound == -1 {
+                       *ld.FlagRound = 16 * 1024
                }
 
        case obj.Hlinux: /* mips64 elf */
                ld.Elfinit(ctxt)
                ld.HEADR = ld.ELFRESERVE
-               if ld.INITTEXT == -1 {
-                       ld.INITTEXT = 0x10000 + int64(ld.HEADR)
+               if *ld.FlagTextAddr == -1 {
+                       *ld.FlagTextAddr = 0x10000 + int64(ld.HEADR)
                }
-               if ld.INITDAT == -1 {
-                       ld.INITDAT = 0
+               if *ld.FlagDataAddr == -1 {
+                       *ld.FlagDataAddr = 0
                }
-               if ld.INITRND == -1 {
-                       ld.INITRND = 0x10000
+               if *ld.FlagRound == -1 {
+                       *ld.FlagRound = 0x10000
                }
 
        case obj.Hnacl:
                ld.Elfinit(ctxt)
                ld.HEADR = 0x10000
                ld.Funcalign = 16
-               if ld.INITTEXT == -1 {
-                       ld.INITTEXT = 0x20000
+               if *ld.FlagTextAddr == -1 {
+                       *ld.FlagTextAddr = 0x20000
                }
-               if ld.INITDAT == -1 {
-                       ld.INITDAT = 0
+               if *ld.FlagDataAddr == -1 {
+                       *ld.FlagDataAddr = 0
                }
-               if ld.INITRND == -1 {
-                       ld.INITRND = 0x10000
+               if *ld.FlagRound == -1 {
+                       *ld.FlagRound = 0x10000
                }
        }
 
-       if ld.INITDAT != 0 && ld.INITRND != 0 {
-               fmt.Printf("warning: -D0x%x is ignored because of -R0x%x\n", uint64(ld.INITDAT), uint32(ld.INITRND))
+       if *ld.FlagDataAddr != 0 && *ld.FlagRound != 0 {
+               fmt.Printf("warning: -D0x%x is ignored because of -R0x%x\n", uint64(*ld.FlagDataAddr), uint32(*ld.FlagRound))
        }
 }
index 581e91f6c24f315536a0daea1979fbb3e756c3e2..3bfa63a27f425e41798d1538ada242e52ef8c96d 100644 (file)
@@ -847,7 +847,7 @@ func asmb(ctxt *ld.Link) {
 
        ld.Lcsize = 0
        symo := uint32(0)
-       if !ld.Debug['s'] {
+       if !*ld.FlagS {
                // TODO: rationalize
                if ctxt.Debugvlog != 0 {
                        fmt.Fprintf(ctxt.Bso, "%5.2f sym\n", obj.Cputime())
@@ -857,7 +857,7 @@ func asmb(ctxt *ld.Link) {
                default:
                        if ld.Iself {
                                symo = uint32(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen)
-                               symo = uint32(ld.Rnd(int64(symo), int64(ld.INITRND)))
+                               symo = uint32(ld.Rnd(int64(symo), int64(*ld.FlagRound)))
                        }
 
                case obj.Hplan9:
@@ -923,7 +923,7 @@ func asmb(ctxt *ld.Link) {
        }
 
        ld.Cflush()
-       if ld.Debug['c'] {
+       if *ld.FlagC {
                fmt.Printf("textsize=%d\n", ld.Segtext.Filelen)
                fmt.Printf("datsize=%d\n", ld.Segdata.Filelen)
                fmt.Printf("bsssize=%d\n", ld.Segdata.Length-ld.Segdata.Filelen)
index f42b1f8471bf6e95d3f4a8001d892f352e9086d6..e3bb1505f70bdb6ae5012b005f54f5e1721227ab 100644 (file)
@@ -42,7 +42,7 @@ import (
 
 func Main() {
        linkarchinit()
-       ld.Ldmain()
+       ld.Main()
 }
 
 func linkarchinit() {
@@ -105,7 +105,7 @@ func archinit(ctxt *ld.Link) {
                ld.Linkmode = ld.LinkExternal
        }
 
-       if ld.Linkshared {
+       if *ld.FlagLinkshared {
                ld.Linkmode = ld.LinkExternal
        }
 
@@ -134,48 +134,48 @@ func archinit(ctxt *ld.Link) {
        case obj.Hplan9: /* plan 9 */
                ld.HEADR = 32
 
-               if ld.INITTEXT == -1 {
-                       ld.INITTEXT = 4128
+               if *ld.FlagTextAddr == -1 {
+                       *ld.FlagTextAddr = 4128
                }
-               if ld.INITDAT == -1 {
-                       ld.INITDAT = 0
+               if *ld.FlagDataAddr == -1 {
+                       *ld.FlagDataAddr = 0
                }
-               if ld.INITRND == -1 {
-                       ld.INITRND = 4096
+               if *ld.FlagRound == -1 {
+                       *ld.FlagRound = 4096
                }
 
        case obj.Hlinux: /* ppc64 elf */
                if ld.SysArch == sys.ArchPPC64 {
-                       ld.Debug['d'] = true // TODO(austin): ELF ABI v1 not supported yet
+                       *ld.FlagD = true // TODO(austin): ELF ABI v1 not supported yet
                }
                ld.Elfinit(ctxt)
                ld.HEADR = ld.ELFRESERVE
-               if ld.INITTEXT == -1 {
-                       ld.INITTEXT = 0x10000 + int64(ld.HEADR)
+               if *ld.FlagTextAddr == -1 {
+                       *ld.FlagTextAddr = 0x10000 + int64(ld.HEADR)
                }
-               if ld.INITDAT == -1 {
-                       ld.INITDAT = 0
+               if *ld.FlagDataAddr == -1 {
+                       *ld.FlagDataAddr = 0
                }
-               if ld.INITRND == -1 {
-                       ld.INITRND = 0x10000
+               if *ld.FlagRound == -1 {
+                       *ld.FlagRound = 0x10000
                }
 
        case obj.Hnacl:
                ld.Elfinit(ctxt)
                ld.HEADR = 0x10000
                ld.Funcalign = 16
-               if ld.INITTEXT == -1 {
-                       ld.INITTEXT = 0x20000
+               if *ld.FlagTextAddr == -1 {
+                       *ld.FlagTextAddr = 0x20000
                }
-               if ld.INITDAT == -1 {
-                       ld.INITDAT = 0
+               if *ld.FlagDataAddr == -1 {
+                       *ld.FlagDataAddr = 0
                }
-               if ld.INITRND == -1 {
-                       ld.INITRND = 0x10000
+               if *ld.FlagRound == -1 {
+                       *ld.FlagRound = 0x10000
                }
        }
 
-       if ld.INITDAT != 0 && ld.INITRND != 0 {
-               fmt.Printf("warning: -D0x%x is ignored because of -R0x%x\n", uint64(ld.INITDAT), uint32(ld.INITRND))
+       if *ld.FlagDataAddr != 0 && *ld.FlagRound != 0 {
+               fmt.Printf("warning: -D0x%x is ignored because of -R0x%x\n", uint64(*ld.FlagDataAddr), uint32(*ld.FlagRound))
        }
 }
index d3d46dc89d42ac241232395377e52b7187672ff6..2e0dfbb64095cc4ed6d56fc5078257b9ab6b019e 100644 (file)
@@ -542,7 +542,7 @@ func asmb(ctxt *ld.Link) {
 
        ld.Lcsize = 0
        symo := uint32(0)
-       if !ld.Debug['s'] {
+       if !*ld.FlagS {
                if !ld.Iself {
                        ctxt.Diag("unsupported executable format")
                }
@@ -551,7 +551,7 @@ func asmb(ctxt *ld.Link) {
                }
                ctxt.Bso.Flush()
                symo = uint32(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen)
-               symo = uint32(ld.Rnd(int64(symo), int64(ld.INITRND)))
+               symo = uint32(ld.Rnd(int64(symo), int64(*ld.FlagRound)))
 
                ld.Cseek(int64(symo))
                if ctxt.Debugvlog != 0 {
@@ -584,7 +584,7 @@ func asmb(ctxt *ld.Link) {
        }
 
        ld.Cflush()
-       if ld.Debug['c'] {
+       if *ld.FlagC {
                fmt.Printf("textsize=%d\n", ld.Segtext.Filelen)
                fmt.Printf("datsize=%d\n", ld.Segdata.Filelen)
                fmt.Printf("bsssize=%d\n", ld.Segdata.Length-ld.Segdata.Filelen)
index 119e32beb42054f4e6959dbd3f8b3634f7d61fa2..044cfbba0f319eeb78af1d9207dbd4eb95bf1923 100644 (file)
@@ -41,7 +41,7 @@ import (
 
 func Main() {
        linkarchinit()
-       ld.Ldmain()
+       ld.Main()
 }
 
 func linkarchinit() {
@@ -97,18 +97,18 @@ func archinit(ctxt *ld.Link) {
        case obj.Hlinux: // s390x ELF
                ld.Elfinit(ctxt)
                ld.HEADR = ld.ELFRESERVE
-               if ld.INITTEXT == -1 {
-                       ld.INITTEXT = 0x10000 + int64(ld.HEADR)
+               if *ld.FlagTextAddr == -1 {
+                       *ld.FlagTextAddr = 0x10000 + int64(ld.HEADR)
                }
-               if ld.INITDAT == -1 {
-                       ld.INITDAT = 0
+               if *ld.FlagDataAddr == -1 {
+                       *ld.FlagDataAddr = 0
                }
-               if ld.INITRND == -1 {
-                       ld.INITRND = 0x10000
+               if *ld.FlagRound == -1 {
+                       *ld.FlagRound = 0x10000
                }
        }
 
-       if ld.INITDAT != 0 && ld.INITRND != 0 {
-               fmt.Printf("warning: -D0x%x is ignored because of -R0x%x\n", uint64(ld.INITDAT), uint32(ld.INITRND))
+       if *ld.FlagDataAddr != 0 && *ld.FlagRound != 0 {
+               fmt.Printf("warning: -D0x%x is ignored because of -R0x%x\n", uint64(*ld.FlagDataAddr), uint32(*ld.FlagRound))
        }
 }
index f3452f0123cbc3c5fd519727942fed19966677ea..e7eace0781b35db14233504ac0b6d96213eaba91 100644 (file)
@@ -662,7 +662,7 @@ func asmb(ctxt *ld.Link) {
        ld.Spsize = 0
        ld.Lcsize = 0
        symo := uint32(0)
-       if !ld.Debug['s'] {
+       if !*ld.FlagS {
                // TODO: rationalize
                if ctxt.Debugvlog != 0 {
                        fmt.Fprintf(ctxt.Bso, "%5.2f sym\n", obj.Cputime())
@@ -672,14 +672,14 @@ func asmb(ctxt *ld.Link) {
                default:
                        if ld.Iself {
                                symo = uint32(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen)
-                               symo = uint32(ld.Rnd(int64(symo), int64(ld.INITRND)))
+                               symo = uint32(ld.Rnd(int64(symo), int64(*ld.FlagRound)))
                        }
 
                case obj.Hplan9:
                        symo = uint32(ld.Segdata.Fileoff + ld.Segdata.Filelen)
 
                case obj.Hdarwin:
-                       symo = uint32(ld.Segdwarf.Fileoff + uint64(ld.Rnd(int64(ld.Segdwarf.Filelen), int64(ld.INITRND))) + uint64(machlink))
+                       symo = uint32(ld.Segdwarf.Fileoff + uint64(ld.Rnd(int64(ld.Segdwarf.Filelen), int64(*ld.FlagRound))) + uint64(machlink))
 
                case obj.Hwindows:
                        symo = uint32(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen)
index f1b0fb7e8ce8d3b21b1071547da2a78ae94d6735..d356f720e09570bbd9e5c37c79e964513d442fcc 100644 (file)
@@ -42,7 +42,7 @@ import (
 
 func Main() {
        linkarchinit()
-       ld.Ldmain()
+       ld.Main()
 }
 
 func linkarchinit() {
@@ -117,28 +117,28 @@ func archinit(ctxt *ld.Link) {
        case obj.Hplan9: /* plan 9 */
                ld.HEADR = 32
 
-               if ld.INITTEXT == -1 {
-                       ld.INITTEXT = 4096 + 32
+               if *ld.FlagTextAddr == -1 {
+                       *ld.FlagTextAddr = 4096 + 32
                }
-               if ld.INITDAT == -1 {
-                       ld.INITDAT = 0
+               if *ld.FlagDataAddr == -1 {
+                       *ld.FlagDataAddr = 0
                }
-               if ld.INITRND == -1 {
-                       ld.INITRND = 4096
+               if *ld.FlagRound == -1 {
+                       *ld.FlagRound = 4096
                }
 
        case obj.Hdarwin: /* apple MACH */
                ld.Machoinit()
 
                ld.HEADR = ld.INITIAL_MACHO_HEADR
-               if ld.INITTEXT == -1 {
-                       ld.INITTEXT = 4096 + int64(ld.HEADR)
+               if *ld.FlagTextAddr == -1 {
+                       *ld.FlagTextAddr = 4096 + int64(ld.HEADR)
                }
-               if ld.INITDAT == -1 {
-                       ld.INITDAT = 0
+               if *ld.FlagDataAddr == -1 {
+                       *ld.FlagDataAddr = 0
                }
-               if ld.INITRND == -1 {
-                       ld.INITRND = 4096
+               if *ld.FlagRound == -1 {
+                       *ld.FlagRound = 4096
                }
 
        case obj.Hlinux, /* elf32 executable */
@@ -148,46 +148,46 @@ func archinit(ctxt *ld.Link) {
                ld.Elfinit(ctxt)
 
                ld.HEADR = ld.ELFRESERVE
-               if ld.INITTEXT == -1 {
-                       ld.INITTEXT = 0x08048000 + int64(ld.HEADR)
+               if *ld.FlagTextAddr == -1 {
+                       *ld.FlagTextAddr = 0x08048000 + int64(ld.HEADR)
                }
-               if ld.INITDAT == -1 {
-                       ld.INITDAT = 0
+               if *ld.FlagDataAddr == -1 {
+                       *ld.FlagDataAddr = 0
                }
-               if ld.INITRND == -1 {
-                       ld.INITRND = 4096
+               if *ld.FlagRound == -1 {
+                       *ld.FlagRound = 4096
                }
 
        case obj.Hnacl:
                ld.Elfinit(ctxt)
                ld.HEADR = 0x10000
                ld.Funcalign = 32
-               if ld.INITTEXT == -1 {
-                       ld.INITTEXT = 0x20000
+               if *ld.FlagTextAddr == -1 {
+                       *ld.FlagTextAddr = 0x20000
                }
-               if ld.INITDAT == -1 {
-                       ld.INITDAT = 0
+               if *ld.FlagDataAddr == -1 {
+                       *ld.FlagDataAddr = 0
                }
-               if ld.INITRND == -1 {
-                       ld.INITRND = 0x10000
+               if *ld.FlagRound == -1 {
+                       *ld.FlagRound = 0x10000
                }
 
        case obj.Hwindows: /* PE executable */
                ld.Peinit(ctxt)
 
                ld.HEADR = ld.PEFILEHEADR
-               if ld.INITTEXT == -1 {
-                       ld.INITTEXT = ld.PEBASE + int64(ld.PESECTHEADR)
+               if *ld.FlagTextAddr == -1 {
+                       *ld.FlagTextAddr = ld.PEBASE + int64(ld.PESECTHEADR)
                }
-               if ld.INITDAT == -1 {
-                       ld.INITDAT = 0
+               if *ld.FlagDataAddr == -1 {
+                       *ld.FlagDataAddr = 0
                }
-               if ld.INITRND == -1 {
-                       ld.INITRND = ld.PESECTALIGN
+               if *ld.FlagRound == -1 {
+                       *ld.FlagRound = ld.PESECTALIGN
                }
        }
 
-       if ld.INITDAT != 0 && ld.INITRND != 0 {
-               fmt.Printf("warning: -D0x%x is ignored because of -R0x%x\n", uint64(ld.INITDAT), uint32(ld.INITRND))
+       if *ld.FlagDataAddr != 0 && *ld.FlagRound != 0 {
+               fmt.Printf("warning: -D0x%x is ignored because of -R0x%x\n", uint64(*ld.FlagDataAddr), uint32(*ld.FlagRound))
        }
 }