Skip to content

Commit

Permalink
cmd/link: permit duplicate weak symbols
Browse files Browse the repository at this point in the history
Permit weak symbols to be duplicates - most external linkers allow
this and there are various situations where they can occur (including
retpoline and retguard).

Fixes #29563

Change-Id: I355493c847fbc8f670a85a643db65a4cf8f9883d
Reviewed-on: https://go-review.googlesource.com/c/go/+/169658
Run-TryBot: Ian Lance Taylor <[email protected]>
TryBot-Result: Gobot Gobot <[email protected]>
Reviewed-by: Ian Lance Taylor <[email protected]>
  • Loading branch information
4a6f656c authored and ianlancetaylor committed Mar 29, 2019
1 parent 6966b67 commit c90f6dd
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 0 deletions.
12 changes: 12 additions & 0 deletions misc/cgo/test/testdata/issue29563.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// +build !windows

// Issue 29563: internal linker fails on duplicate weak symbols.
// No runtime test; just make sure it compiles.

package cgotest

import _ "cgotest/issue29563"
13 changes: 13 additions & 0 deletions misc/cgo/test/testdata/issue29563/weak.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package issue29563

//int foo1();
//int foo2();
import "C"

func Bar() int {
return int(C.foo1()) + int(C.foo2())
}
11 changes: 11 additions & 0 deletions misc/cgo/test/testdata/issue29563/weak1.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

extern int weaksym __attribute__((__weak__));
int weaksym = 42;

int foo1()
{
return weaksym;
}
11 changes: 11 additions & 0 deletions misc/cgo/test/testdata/issue29563/weak2.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

extern int weaksym __attribute__((__weak__));
int weaksym = 42;

int foo2()
{
return weaksym;
}
5 changes: 5 additions & 0 deletions src/cmd/link/internal/loadelf/ldelf.go
Original file line number Diff line number Diff line change
Expand Up @@ -1088,6 +1088,11 @@ func readelfsym(arch *sys.Arch, syms *sym.Symbols, elfobj *ElfObj, i int, elfsym
if elfsym.other == 2 {
s.Attr |= sym.AttrVisibilityHidden
}

// Allow weak symbols to be duplicated when already defined.
if s.Outer != nil {
s.Attr |= sym.AttrDuplicateOK
}
}

default:
Expand Down

0 comments on commit c90f6dd

Please sign in to comment.