diff options
| author | Mark Ryan <markdryan@rivosinc.com> | 2025-04-25 17:23:49 +0200 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2025-09-17 11:00:02 -0700 |
| commit | a0811d4dc916d8d441b8f1fa737cf47141939bb7 (patch) | |
| tree | 641a1eca86284d0566baf518ddacf7dac0c7a772 | |
| parent | 8ac346df85773ac8919d5e10a1f3e4a0bc8be494 (diff) | |
| download | go-a0811d4dc916d8d441b8f1fa737cf47141939bb7.tar.xz | |
[release-branch.go1.24] cmd/link: fix cgo on riscv64 when building with gcc-15
It's not currently possible to build cgo programs that are partially
compiled with gcc-15 on riscv64 using the internal linker. There are
two reasons for this.
1. When gcc-15 compiles _cgo_export.c, which contains no actual code,
for a riscv64 target, it emits a label in the .text section called
.Letext0. This label is referred to by another section, .debug_line,
and an entry is generated in the symbol table for it. The Go linker
panics when processing the .Letext0 symbol in _cgo_export.o, as it
occurs in an empty section.
2. GCC-15 is generating additional debug symbols with the .LVUS
prefix, e.g., .LVUS33, that need to be ignored.
We fix the issue by removing the check in
cmd/link/internal/loader/loader.go that panics if we encounter a
symbol in an empty section (the comments preceding this check suggest
it's safe to remove it) and by adding .LVUS to the list of symbol
prefixes to ignore.
For #72840
Fixes #75351
Change-Id: I00658b6bdd01606dde1581b5bc2f42edfc37de82
Reviewed-on: https://go-review.googlesource.com/c/go/+/668276
Auto-Submit: Dmitri Shuralyov <dmitshur@golang.org>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Reviewed-by: Joel Sing <joel@sing.id.au>
Reviewed-by: Carlos Amedee <carlos@golang.org>
Reviewed-by: Meng Zhuo <mengzhuo1203@gmail.com>
(cherry picked from commit 12e5efd71011fbb5816a1d815e91b5c865fa9a83)
Reviewed-on: https://go-review.googlesource.com/c/go/+/704775
Auto-Submit: Michael Knyszek <mknyszek@google.com>
Reviewed-by: Mark Freeman <markfreeman@google.com>
| -rw-r--r-- | src/cmd/link/internal/loadelf/ldelf.go | 2 | ||||
| -rw-r--r-- | src/cmd/link/internal/loader/loader.go | 8 |
2 files changed, 1 insertions, 9 deletions
diff --git a/src/cmd/link/internal/loadelf/ldelf.go b/src/cmd/link/internal/loadelf/ldelf.go index e0363b5535..9f251e746b 100644 --- a/src/cmd/link/internal/loadelf/ldelf.go +++ b/src/cmd/link/internal/loadelf/ldelf.go @@ -609,7 +609,7 @@ func Load(l *loader.Loader, arch *sys.Arch, localSymVersion int, f *bio.Reader, continue } - if strings.HasPrefix(elfsym.name, ".LASF") || strings.HasPrefix(elfsym.name, ".LLRL") || strings.HasPrefix(elfsym.name, ".LLST") { + if strings.HasPrefix(elfsym.name, ".LASF") || strings.HasPrefix(elfsym.name, ".LLRL") || strings.HasPrefix(elfsym.name, ".LLST") || strings.HasPrefix(elfsym.name, ".LVUS") { // gcc on s390x and riscv64 does this. continue } diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index 988f743c24..ff6745618d 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -1757,14 +1757,6 @@ func (l *Loader) GetVarDwarfAuxSym(i Sym) Sym { // expected to have the actual content/payload) and then a set of // interior loader.Sym's that point into a portion of the container. func (l *Loader) AddInteriorSym(container Sym, interior Sym) { - // Container symbols are expected to have content/data. - // NB: this restriction may turn out to be too strict (it's possible - // to imagine a zero-sized container with an interior symbol pointing - // into it); it's ok to relax or remove it if we counter an - // oddball host object that triggers this. - if l.SymSize(container) == 0 && len(l.Data(container)) == 0 { - panic("unexpected empty container symbol") - } // The interior symbols for a container are not expected to have // content/data or relocations. if len(l.Data(interior)) != 0 { |
