]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/ld: allow -r to override rpath when -linkshared
authorMichael Hudson-Doyle <michael.hudson@canonical.com>
Sun, 12 Apr 2015 00:31:28 +0000 (02:31 +0200)
committerIan Lance Taylor <iant@golang.org>
Wed, 15 Apr 2015 22:06:04 +0000 (22:06 +0000)
Including having -r "" preventing rpath from being set at all.

Change-Id: Ib40d7bf93a6e9ef21985c4a05b5703e4fbd1cd1b
Reviewed-on: https://go-review.googlesource.com/8806
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/cmd/internal/ld/elf.go
src/cmd/internal/ld/lib.go
src/cmd/internal/ld/pobj.go

index 0de24fa6fd8a052a83760bf5d1859f49dd08d574..eb2c28fada252fe50051f3e25b1cb7269be59ff2 100644 (file)
@@ -1818,8 +1818,8 @@ func doelf() {
                        Elfwritedynent(s, DT_RELENT, ELF32RELSIZE)
                }
 
-               if rpath != "" {
-                       Elfwritedynent(s, DT_RUNPATH, uint64(Addstring(dynstr, rpath)))
+               if rpath.val != "" {
+                       Elfwritedynent(s, DT_RUNPATH, uint64(Addstring(dynstr, rpath.val)))
                }
 
                if Thearch.Thechar == '9' {
index b87f83c17726bd77e58729e46ede98b274a2311f..aa382717fd8d391ce7f7256983c716cea6a27c84 100644 (file)
@@ -108,12 +108,27 @@ type Arch struct {
        Vput             func(uint64)
 }
 
+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
        datap   *LSym
        Debug   [128]int
        Lcsize  int32
-       rpath   string
+       rpath   Rpath
        Spsize  int32
        Symsize int32
 )
@@ -935,8 +950,8 @@ func hostlink() {
        argv = append(argv, "-o")
        argv = append(argv, outfile)
 
-       if rpath != "" {
-               argv = append(argv, fmt.Sprintf("-Wl,-rpath,%s", rpath))
+       if rpath.val != "" {
+               argv = append(argv, fmt.Sprintf("-Wl,-rpath,%s", rpath.val))
        }
 
        // Force global symbols to be exported for dlopen, etc.
@@ -955,7 +970,9 @@ func hostlink() {
                for _, shlib := range Ctxt.Shlibs {
                        dir, base := filepath.Split(shlib)
                        argv = append(argv, "-L"+dir)
-                       argv = append(argv, "-Wl,-rpath="+dir)
+                       if !rpath.set {
+                               argv = append(argv, "-Wl,-rpath="+dir)
+                       }
                        base = strings.TrimSuffix(base, ".so")
                        base = strings.TrimPrefix(base, "lib")
                        argv = append(argv, "-l"+base)
index f5dd2d79447d5ad3bb8d3e7bcda44855e187c507..e6fb635690873dc7141d135e892f1b25284550c2 100644 (file)
@@ -115,7 +115,7 @@ func Ldmain() {
        flag.BoolVar(&Linkshared, "linkshared", false, "link against installed Go shared libraries")
        obj.Flagcount("n", "dump symbol table", &Debug['n'])
        obj.Flagstr("o", "outfile: set output file", &outfile)
-       obj.Flagstr("r", "dir1:dir2:...: set ELF dynamic linker search path", &rpath)
+       flag.Var(&rpath, "r", "dir1:dir2:...: set ELF dynamic linker search path")
        obj.Flagcount("race", "enable race detector", &flag_race)
        obj.Flagcount("s", "disable symbol table", &Debug['s'])
        var flagShared int