Package: golang-1.24
Version: 1.24.4-3
Severity: important
Tags: patch
X-Debbugs-Cc: [email protected], Meng Zhuo <[email protected]>
User: [email protected]
Usertags: riscv64
Control: affects -1 src:glow 
Control: affects -1 src:gocryptfs

Hi,

Recently some go-* packages has ftbfs issue, like gocryptfs[0], glow[1]:

```
# github.com/rfjakob/gocryptfs/internal/ctlsocksrv.test
loadelf: $WORK/b132/_pkg_.a(_x001.o): 190878: sym#47 (".LVUS0"): ignoring 
symbol in section 8 (".debug_loclists") (type 0)
panic: unexpected empty container symbol

goroutine 1 [running]:
cmd/link/internal/loader.(*Loader).AddInteriorSym(0x3f7417e008, 0x2e99f, 
0x2e9b3)
        cmd/link/internal/loader/loader.go:1745 +0x238
cmd/link/internal/loader.(*SymbolBuilder).AddInteriorSym(...)
        cmd/link/internal/loader/symbolbuilder.go:202
cmd/link/internal/loadelf.Load(0x3f7417e008, 0x55da40, 0xb2, 0x3f7402c550, 
{0x3f7810aee7, 0x3}, 0xdc0, {0x3f746b4930, 0x2d}, 0x4)
        cmd/link/internal/loadelf/ldelf.go:633 +0x3518
cmd/link/internal/ld.ldobj.func1(0x3f741c4200, 0xc0eefc90dd5e1e7c?, 
{0x3f7810aee7?, 0x1?}, 0x4000?, {0x3f746b4930?, 0x0?})
        cmd/link/internal/ld/lib.go:2278 +0xa8
cmd/link/internal/ld.hostobjs(0x3f741c4200)
        cmd/link/internal/ld/lib.go:1241 +0x14c
cmd/link/internal/ld.(*Link).loadlib(0x3f741c4200)
        cmd/link/internal/ld/lib.go:615 +0x534
cmd/link/internal/ld.Main(_, {0x8, 0x20, 0x1, 0x2, 0x1, 0x1, {0x0, 0x0, 0x0}, 
...})
        cmd/link/internal/ld/main.go:360 +0x11c4
main.main()
```

This is due to gcc-15 has some changes and golang upstream has
backported some commits to 1.24 branch but it seems this[2] was
missing.

I have tested both build for gocryptfs and glow with the commit[2],
they are okay. thanks for Meng zhuo's pointer.

Yeah, this upload need to fix #1112166 issue first.

[0]: 
https://buildd.debian.org/status/fetch.php?pkg=gocryptfs&arch=riscv64&ver=2.6.1-1&stamp=1757333291&raw=0
[1]: 
https://buildd.debian.org/status/fetch.php?pkg=glow&arch=riscv64&ver=2.1.1-1&stamp=1757466612&raw=0
[2]: https://go-review.googlesource.com/c/go/+/668276
[3]: https://bugs.debian.org/1112166

-- 
Regards,
--
  Bo YU

diff -Nru golang-1.24-1.24.4/debian/changelog 
golang-1.24-1.24.4/debian/changelog
--- golang-1.24-1.24.4/debian/changelog 2025-08-19 05:22:03.000000000 +0000
+++ golang-1.24-1.24.4/debian/changelog 2025-09-10 08:13:48.000000000 +0000
@@ -1,3 +1,11 @@
+golang-1.24 (1.24.4-3.1) UNRELEASED; urgency=medium
+
+  * Non-maintainer upload.
+  * Fix cgo on riscv64 link issue. (Closes: #-1)
+  * workaround to skip tsan test on riscv64. (Closes: #1112166)
+
+ -- Bo YU <[email protected]>  Wed, 10 Sep 2025 16:13:48 +0800
+
 golang-1.24 (1.24.4-3) unstable; urgency=medium
 
   * Set better CC defaults around arm* (native for arm*, armhf for others)
diff -Nru golang-1.24-1.24.4/debian/patches/0003-Fix-cgo-on-rv64-gcc-15.patch 
golang-1.24-1.24.4/debian/patches/0003-Fix-cgo-on-rv64-gcc-15.patch
--- golang-1.24-1.24.4/debian/patches/0003-Fix-cgo-on-rv64-gcc-15.patch 
1970-01-01 00:00:00.000000000 +0000
+++ golang-1.24-1.24.4/debian/patches/0003-Fix-cgo-on-rv64-gcc-15.patch 
2025-09-10 08:13:26.000000000 +0000
@@ -0,0 +1,64 @@
+From 12e5efd71011fbb5816a1d815e91b5c865fa9a83 Mon Sep 17 00:00:00 2001
+From: Mark Ryan <[email protected]>
+Date: Fri, 25 Apr 2025 17:23:49 +0200
+Subject: [PATCH] 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.
+
+Fixes #72840
+
+Change-Id: I00658b6bdd01606dde1581b5bc2f42edfc37de82
+Reviewed-on: https://go-review.googlesource.com/c/go/+/668276
+Auto-Submit: Dmitri Shuralyov <[email protected]>
+LUCI-TryBot-Result: Go LUCI 
<[email protected]>
+Reviewed-by: Dmitri Shuralyov <[email protected]>
+Reviewed-by: Joel Sing <[email protected]>
+Reviewed-by: Carlos Amedee <[email protected]>
+Reviewed-by: Meng Zhuo <[email protected]>
+---
+
+--- a/src/cmd/link/internal/loadelf/ldelf.go
++++ b/src/cmd/link/internal/loadelf/ldelf.go
+@@ -609,7 +609,7 @@
+                               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
+                       }
+--- a/src/cmd/link/internal/loader/loader.go
++++ b/src/cmd/link/internal/loader/loader.go
+@@ -1736,14 +1736,6 @@
+ // 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 {
diff -Nru 
golang-1.24-1.24.4/debian/patches/0003-Skip-flasky-TestAsan-on-riscv64.patch 
golang-1.24-1.24.4/debian/patches/0003-Skip-flasky-TestAsan-on-riscv64.patch
--- 
golang-1.24-1.24.4/debian/patches/0003-Skip-flasky-TestAsan-on-riscv64.patch    
    1970-01-01 00:00:00.000000000 +0000
+++ 
golang-1.24-1.24.4/debian/patches/0003-Skip-flasky-TestAsan-on-riscv64.patch    
    2025-09-10 08:13:48.000000000 +0000
@@ -0,0 +1,51 @@
+Description: skip tsan test on riscv64
+ Race detector on riscv64 is not support yet, this is usually no problem on 
Debian
+ building because it will be skipped automatically. But others package updated
+ recently lead to the test failed.
+Author: Bo YU <[email protected]>
+Origin: upstream, https://github.com/golang/go/issues/64345
+Bug: https://bugs.debian.org/1112166
+Last-Update: 2025-08-30
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+--- a/src/cmd/cgo/internal/testsanitizers/tsan_test.go
++++ b/src/cmd/cgo/internal/testsanitizers/tsan_test.go
+@@ -11,6 +11,7 @@
+       "os/exec"
+       "strings"
+       "testing"
++      "runtime"
+ )
+ 
+ func TestTSAN(t *testing.T) {
+@@ -29,6 +30,10 @@
+       if !compilerRequiredTsanVersion(goos, goarch) {
+               t.Skipf("skipping on %s/%s; compiler version for -tsan option 
is too old.", goos, goarch)
+       }
++      if runtime.GOARCH == "riscv64" {
++              t.Skipf("skipping; flaky on %s", runtime.GOARCH)
++      }
++
+ 
+       t.Parallel()
+       requireOvercommit(t)
+--- a/src/cmd/cgo/internal/testsanitizers/cshared_test.go
++++ b/src/cmd/cgo/internal/testsanitizers/cshared_test.go
+@@ -14,6 +14,7 @@
+       "os/exec"
+       "strings"
+       "testing"
++      "runtime"
+ )
+ 
+ func TestShared(t *testing.T) {
+@@ -65,6 +66,9 @@
+                       t.Logf("skipping %s test on %s/%s; compiler version too 
old for -tsan.", name, GOOS, GOARCH)
+                       continue
+               }
++              if runtime.GOARCH == "riscv64" {
++                      t.Skipf("skipping; flaky on %s", runtime.GOARCH)
++              }
+ 
+               t.Run(name, func(t *testing.T) {
+                       t.Parallel()
diff -Nru golang-1.24-1.24.4/debian/patches/series 
golang-1.24-1.24.4/debian/patches/series
--- golang-1.24-1.24.4/debian/patches/series    2025-08-08 02:26:49.000000000 
+0000
+++ golang-1.24-1.24.4/debian/patches/series    2025-09-10 08:13:48.000000000 
+0000
@@ -1,2 +1,4 @@
 0001-Skip-flaky-TestCrashDumpsAllThreads-on-mips64le.patch
 0002-Skip-flaky-TestCrashDumpsAllThreads-on-s390x.patch
+0003-Skip-flasky-TestAsan-on-riscv64.patch
+0003-Fix-cgo-on-rv64-gcc-15.patch
diff -Nru golang-1.24-1.24.4/debian/patches/series.orig 
golang-1.24-1.24.4/debian/patches/series.orig
--- golang-1.24-1.24.4/debian/patches/series.orig       1970-01-01 
00:00:00.000000000 +0000
+++ golang-1.24-1.24.4/debian/patches/series.orig       2025-09-10 
08:13:15.000000000 +0000
@@ -0,0 +1,3 @@
+0001-Skip-flaky-TestCrashDumpsAllThreads-on-mips64le.patch
+0002-Skip-flaky-TestCrashDumpsAllThreads-on-s390x.patch
+0003-Fix-cgo-on-rv64-gcc-15.patch

Attachment: signature.asc
Description: PGP signature

Reply via email to