case BuildModeShared:
return true, "buildmode=shared"
}
- if *FlagLinkshared {
+ if ctxt.linkShared {
return true, "dynamically linking with a shared library"
}
checkdatsize(ctxt, datsize, sym.SNOPTRDATA)
sect.Length = uint64(datsize) - sect.Vaddr
- hasinitarr := *FlagLinkshared
+ hasinitarr := ctxt.linkShared
/* shared library initializer */
switch ctxt.BuildMode {
// In a normal binary, start at main.main and the init
// functions and mark what is reachable from there.
- if *FlagLinkshared && (d.ctxt.BuildMode == BuildModeExe || d.ctxt.BuildMode == BuildModePIE) {
+ if d.ctxt.linkShared && (d.ctxt.BuildMode == BuildModeExe || d.ctxt.BuildMode == BuildModePIE) {
names = append(names, "main.main", "main.init")
} else {
// The external linker refers main symbol directly.
}
}
- hasinitarr := *FlagLinkshared
+ hasinitarr := ctxt.linkShared
/* shared library initializer */
switch ctxt.BuildMode {
var pname string
isshlib := false
- if *FlagLinkshared && ctxt.PackageShlib[name] != "" {
+ if ctxt.linkShared && ctxt.PackageShlib[name] != "" {
pname = ctxt.PackageShlib[name]
isshlib = true
} else if ctxt.PackageFile != nil {
}
// try dot, -L "libdir", and then goroot.
for _, dir := range ctxt.Libdir {
- if *FlagLinkshared {
+ if ctxt.linkShared {
pname = dir + "/" + pkg + ".shlibname"
if _, err := os.Stat(pname); err == nil {
isshlib = true
if !ctxt.Loaded {
panic("DynlinkingGo called before all symbols loaded")
}
- return ctxt.BuildMode == BuildModeShared || *FlagLinkshared || ctxt.BuildMode == BuildModePlugin || ctxt.CanUsePlugins()
+ return ctxt.BuildMode == BuildModeShared || ctxt.linkShared || ctxt.BuildMode == BuildModePlugin || ctxt.CanUsePlugins()
}
// CanUsePlugins returns whether a plugins can be used
case BuildModeCArchive, BuildModeCShared, BuildModeShared, BuildModePIE, BuildModePlugin:
return Iself
default:
- return *FlagLinkshared
+ return ctxt.linkShared
}
}
}
func loadinternal(ctxt *Link, name string) *sym.Library {
- if *FlagLinkshared && ctxt.PackageShlib != nil {
+ if ctxt.linkShared && ctxt.PackageShlib != nil {
if shlib := ctxt.PackageShlib[name]; shlib != "" {
return addlibpath(ctxt, "internal", "internal", "", name, shlib)
}
}
for i := 0; i < len(ctxt.Libdir); i++ {
- if *FlagLinkshared {
+ if ctxt.linkShared {
shlibname := filepath.Join(ctxt.Libdir[i], name+".shlibname")
if ctxt.Debugvlog != 0 {
ctxt.Logf("searching for %s.a in %s\n", name, shlibname)
if lib.Shlib != "" {
ldshlibsyms(ctxt, lib.Shlib)
} else {
- if ctxt.BuildMode == BuildModeShared || *FlagLinkshared {
+ if ctxt.BuildMode == BuildModeShared || ctxt.linkShared {
Exitf("cannot implicitly include runtime/cgo in a shared library")
}
loadobjfile(ctxt, lib)
// those programs loaded dynamically in multiple parts need these
// symbols to have entries in the symbol table.
func typeSymbolMangling(ctxt *Link) bool {
- return ctxt.BuildMode == BuildModeShared || *FlagLinkshared || ctxt.BuildMode == BuildModePlugin || ctxt.Syms.ROLookup("plugin.Open", 0) != nil
+ return ctxt.BuildMode == BuildModeShared || ctxt.linkShared || ctxt.BuildMode == BuildModePlugin || ctxt.Syms.ROLookup("plugin.Open", 0) != nil
}
// typeSymbolMangle mangles the given symbol name into something shorter.
argv = append(argv, filepath.Join(*flagTmpdir, "go.o"))
argv = append(argv, hostobjCopy()...)
- if *FlagLinkshared {
+ if ctxt.linkShared {
seenDirs := make(map[string]bool)
seenLibs := make(map[string]bool)
addshlib := func(path string) {
Loaded bool // set after all inputs have been loaded as symbols
- LinkMode LinkMode
- BuildMode BuildMode
+ linkShared bool // link against installed Go shared libraries
+ LinkMode LinkMode
+ BuildMode BuildMode
Tlsg *sym.Symbol
Libdir []string
flagOutfile = flag.String("o", "", "write output to `file`")
flagPluginPath = flag.String("pluginpath", "", "full path name for plugin")
- FlagLinkshared = flag.Bool("linkshared", false, "link against installed Go shared libraries")
flagInstallSuffix = flag.String("installsuffix", "", "set package directory `suffix`")
flagDumpDep = flag.Bool("dumpdep", false, "dump symbol dependency graph")
if ctxt.Arch.Family == sys.AMD64 && objabi.GOOS == "plan9" {
flag.BoolVar(&Flag8, "8", false, "use 64-bit addresses in symbol table")
}
+ flag.BoolVar(&ctxt.linkShared, "linkshared", false, "link against installed Go shared libraries")
flag.Var(&ctxt.LinkMode, "linkmode", "set link `mode`")
flag.Var(&ctxt.BuildMode, "buildmode", "set build `mode`")
objabi.Flagfn1("B", "add an ELF NT_GNU_BUILD_ID `note` when using ELF", addbuildinfo)
ctxt.computeTLSOffset()
Thearch.Archinit(ctxt)
- if *FlagLinkshared && !Iself {
+ if ctxt.linkShared && !Iself {
Exitf("-linkshared can only be used on elf systems")
}