gcc bug prevents go program from starting newer gcc results in race condition

  • Open
  • quality assurance status badge
Details
3 participants
  • Sarah Morgensen
  • Malte Frank Gerdes
  • Glenn Morris
Owner
unassigned
Submitted by
Malte Frank Gerdes
Severity
normal
M
M
Malte Frank Gerdes wrote on 27 Jul 2019 18:37
(address . submit@debbugs.gnu.org)
86wog3tove.fsf@gmail.com
Hi,

The precompiled version of Hugo-extended was not able to find some
runtime dependencies:
libstdc++.so.6 => not found
libgcc_s.so.1 => not found

This seems like a version mismatch to me, so i built Hugo with the
following command:
go build --tags extended

Now the error is (<HASH> = ypiv8dj4lkvsnm82s639h18l87frrh5g):
/gnu/store/<HASH>-gcc-6.5.0-lib/lib/libstdc++.so.6: version
`GLIBCXX_3.4.26' not found

The problem seems identical to [1].

I copmiled go-1.4 with gcc:lib from 7, 8 and 9 with no luck (the 9
variant even fails the tests due to a race condition somewhere, i read
that in some other bug report but can't find the ID). Error Message at
the end.

So is there any progress on this? I guess this is necessary to make the
execution of hugo-extended (and maybe other programs?) work.



-Malte

##### ../misc/cgo/testsanitizers
--- FAIL: TestShared (0.02s)
--- FAIL: TestShared/tsan_shared (2.04s)
cshared_test.go:71: `/tmp/guix-build-go-1.12.7.drv-0/TestShared821009189/tsan_shared` exited with exit status 66
==================
WARNING: ThreadSanitizer: data race (pid=3613)
Write of size 8 at 0x7ffff6095c20 by thread T1:
#0 pthread_attr_getstacksize <null> (tsan_shared+0x00000041d5b2)
#1 x_cgo_init <null> (libtsan_shared.so+0x0000000968e0)
#2 runtime.rt0_go <null> (libtsan_shared.so+0x00000008cb0e)

Previous write of size 8 at 0x7ffff6095c20 by main thread:
#0 <null> <null> (0x000000000001)

Location is stack of thread T1.

Thread T1 (tid=3619, running) created by main thread at:
#0 pthread_create <null> (tsan_shared+0x00000040dec4)
#1 _cgo_try_pthread_create <null> (libtsan_shared.so+0x0000000967a1)
#2 x_cgo_sys_thread_create <null> (libtsan_shared.so+0x000000096543)
#3 _rt0_amd64_lib <null> (libtsan_shared.so+0x00000008ca16)

SUMMARY: ThreadSanitizer: data race ??:0 pthread_attr_getstacksize
==================
==================
WARNING: ThreadSanitizer: data race (pid=3613)
Read of size 8 at 0x7d080000dfe0 by thread T2:
#0 threadentry <null> (libtsan_shared.so+0x000000096b03)

Previous write of size 8 at 0x7d080000dfe0 by thread T1:
#0 malloc <null> (tsan_shared+0x00000040c2d3)
#1 x_cgo_thread_start <null> (libtsan_shared.so+0x00000009716c)
#2 runtime.asmcgocall <null> (libtsan_shared.so+0x00000008e546)

Location is heap block of size 24 at 0x7d080000dfe0 allocated by thread T1:
#0 malloc <null> (tsan_shared+0x00000040c2d3)
#1 x_cgo_thread_start <null> (libtsan_shared.so+0x00000009716c)
#2 runtime.asmcgocall <null> (libtsan_shared.so+0x00000008e546)

Thread T2 (tid=3621, running) created by thread T1 at:
#0 pthread_create <null> (tsan_shared+0x00000040dec4)
#1 _cgo_try_pthread_create <null> (libtsan_shared.so+0x0000000967a1)
#2 _cgo_sys_thread_start <null> (libtsan_shared.so+0x000000096a42)
#3 x_cgo_thread_start <null> (libtsan_shared.so+0x0000000971fa)
#4 runtime.asmcgocall <null> (libtsan_shared.so+0x00000008e546)

Thread T1 (tid=3619, running) created by main thread at:
#0 pthread_create <null> (tsan_shared+0x00000040dec4)
#1 _cgo_try_pthread_create <null> (libtsan_shared.so+0x0000000967a1)
#2 x_cgo_sys_thread_create <null> (libtsan_shared.so+0x000000096543)
#3 _rt0_amd64_lib <null> (libtsan_shared.so+0x00000008ca16)

SUMMARY: ThreadSanitizer: data race ??:0 threadentry
==================
==================
WARNING: ThreadSanitizer: data race (pid=3613)
Read of size 8 at 0x7ffff7fcc8b8 by thread T2:
#0 threadentry <null> (libtsan_shared.so+0x000000096b36)

Previous write of size 8 at 0x7ffff7fcc8b8 by thread T1:
#0 x_cgo_init <null> (libtsan_shared.so+0x000000096874)
#1 runtime.rt0_go <null> (libtsan_shared.so+0x00000008cb0e)

Location is global 'setg_gcc' of size 8 at 0x7ffff7fcc8b8 (libtsan_shared.so+0x00000013a8b8)

Thread T2 (tid=3621, running) created by thread T1 at:
#0 pthread_create <null> (tsan_shared+0x00000040dec4)
#1 _cgo_try_pthread_create <null> (libtsan_shared.so+0x0000000967a1)
#2 _cgo_sys_thread_start <null> (libtsan_shared.so+0x000000096a42)
#3 x_cgo_thread_start <null> (libtsan_shared.so+0x0000000971fa)
#4 runtime.asmcgocall <null> (libtsan_shared.so+0x00000008e546)

Thread T1 (tid=3619, running) created by main thread at:
#0 pthread_create <null> (tsan_shared+0x00000040dec4)
#1 _cgo_try_pthread_create <null> (libtsan_shared.so+0x0000000967a1)
#2 x_cgo_sys_thread_create <null> (libtsan_shared.so+0x000000096543)
#3 _rt0_amd64_lib <null> (libtsan_shared.so+0x00000008ca16)

SUMMARY: ThreadSanitizer: data race ??:0 threadentry
==================
==================
WARNING: ThreadSanitizer: data race (pid=3613)
Read of size 8 at 0x7d080000df80 by thread T6:
#0 threadentry <null> (libtsan_shared.so+0x000000096b03)

Previous write of size 8 at 0x7d080000df80 by thread T1:
#0 malloc <null> (tsan_shared+0x00000040c2d3)
#1 x_cgo_thread_start <null> (libtsan_shared.so+0x00000009716c)
#2 runtime.asmcgocall <null> (libtsan_shared.so+0x00000008e507)

Location is heap block of size 24 at 0x7d080000df80 allocated by thread T1:
#0 malloc <null> (tsan_shared+0x00000040c2d3)
#1 x_cgo_thread_start <null> (libtsan_shared.so+0x00000009716c)
#2 runtime.asmcgocall <null> (libtsan_shared.so+0x00000008e507)

Thread T6 (tid=3625, running) created by thread T1 at:
#0 pthread_create <null> (tsan_shared+0x00000040dec4)
#1 _cgo_try_pthread_create <null> (libtsan_shared.so+0x0000000967a1)
#2 _cgo_sys_thread_start <null> (libtsan_shared.so+0x000000096a42)
#3 x_cgo_thread_start <null> (libtsan_shared.so+0x0000000971fa)
#4 runtime.asmcgocall <null> (libtsan_shared.so+0x00000008e507)

Thread T1 (tid=3619, running) created by main thread at:
#0 pthread_create <null> (tsan_shared+0x00000040dec4)
#1 _cgo_try_pthread_create <null> (libtsan_shared.so+0x0000000967a1)
#2 x_cgo_sys_thread_create <null> (libtsan_shared.so+0x000000096543)
#3 _rt0_amd64_lib <null> (libtsan_shared.so+0x00000008ca16)

SUMMARY: ThreadSanitizer: data race ??:0 threadentry
==================
ThreadSanitizer: reported 4 warnings
FAIL
G
G
Glenn Morris wrote on 27 Jul 2019 19:16
control message for bug 36823
(address . control@debbugs.gnu.org)
E1hrQIu-00071C-Ky@fencepost.gnu.org
reassign 36823 guix
S
S
Sarah Morgensen wrote on 4 Jul 2021 22:41
Re: bug#36823: gcc bug prevents go program from starting newer gcc results in race condition
(name . Malte Frank Gerdes)(address . malte.f.gerdes@gmail.com)(address . 36823@debbugs.gnu.org)
86fswtak19.fsf@mgsn.dev
Hello,

Thanks for the report.

Malte Frank Gerdes <malte.f.gerdes@gmail.com> writes:

Toggle quote (7 lines)
> Hi,
>
> The precompiled version of Hugo-extended was not able to find some
> runtime dependencies:
> libstdc++.so.6 => not found
> libgcc_s.so.1 => not found

In case you haven't discovered this in the past two years (oops), this
is because Guix does not typically work with pre-compiled software that
relies on system libraries being in /lib, since there is no system-wide
/lib.

Toggle quote (8 lines)
> This seems like a version mismatch to me, so i built Hugo with the
> following command:
> go build --tags extended
>
> Now the error is (<HASH> = ypiv8dj4lkvsnm82s639h18l87frrh5g):
> /gnu/store/<HASH>-gcc-6.5.0-lib/lib/libstdc++.so.6: version
> `GLIBCXX_3.4.26' not found

If I build hugo with gcc-toolchain@7 in my user profile, it works fine.
However.... I can still repro this issue with gcc-toolchain@8+:

$ go build --tags extended
$ ./hugo --help
./hugo: /gnu/store/01b4w3m6mp55y531kyi1g8shh722kwqm-gcc-7.5.0-lib/lib/libstdc++.so.6: version `GLIBCXX_3.4.26' not found (required by ./hugo)
./hugo: /gnu/store/01b4w3m6mp55y531kyi1g8shh722kwqm-gcc-7.5.0-lib/lib/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by ./hugo)

This is because gcc 7's libraries are shadowing the newer gcc's
libraries:

$ readelf -d hugo | grep RUNPATH
0x000000000000001d (RUNPATH) Library runpath: [/gnu/store/01b4w3m6mp55y531kyi1g8shh722kwqm-gcc-7.5.0-lib/lib:/gnu/store/fa6wj5bxkj5ll1d7292a70knmyl7a0cr-glibc-2.31/lib:/gnu/store/3h7xd0d47a286b6r9qhz4ybi5iaxkfwi-gcc-11.1.0-lib/lib:/home/sarah/.guix-profile/lib:/gnu/store/3h7xd0d47a286b6r9qhz4ybi5iaxkfwi-gcc-11.1.0-lib/lib/gcc/x86_64-unknown-linux-gnu/11.1.0/../../..]

If I use patchelf to remove the gcc 7 library dir from RUNPATH, hugo
works fine. This is because Go is patched to unconditionally add a
runpath to gcc 7's libraries but erroneously does not explicitly set

The following patch should explicitly set CXX for Go, so that it always
uses the "system" version:
Toggle diff (20 lines)
diff --git a/gnu/packages/golang.scm b/gnu/packages/golang.scm
index 0318918a37..a27f57aa30 100644
--- a/gnu/packages/golang.scm
+++ b/gnu/packages/golang.scm
@@ -395,6 +395,7 @@ in the style of communicating sequential processes (@dfn{CSP}).")
;; FIXME: Some of the .a files are not bit-reproducible.
(let* ((output (assoc-ref outputs "out")))
(setenv "CC" (which "gcc"))
+ (setenv "CXX" (which "g++"))
(setenv "GOOS" "linux")
(setenv "GOROOT" (dirname (getcwd)))
(setenv "GOROOT_FINAL" output)
@@ -577,6 +578,7 @@ in the style of communicating sequential processes (@dfn{CSP}).")
(loader (string-append (assoc-ref inputs "libc")
,(glibc-dynamic-linker))))
(setenv "CC" (which "gcc"))
+ (setenv "CXX" (which "g++"))
(setenv "GO_LDSO" loader)
(setenv "GOOS" "linux")
(setenv "GOROOT" (dirname (getcwd)))
Hope that helps,
Sarah
M
M
Malte Frank Gerdes wrote on 6 Jul 2021 15:14
(name . Sarah Morgensen)(address . iskarian@mgsn.dev)(address . 36823@debbugs.gnu.org)
868s2jbn49.fsf@gmail.com
Thanks for your answer :-)

I don't use hugo anymore but at least i now know what the problem was,
but i really appreciate that you took the time to reproduce this. Does
it make sense to keep this ticket open, because as you found out there
still /is/ a bug?

(also just rediscovering the subject line: what the heck did i mean with
that?!)


Malte

Sarah Morgensen <iskarian@mgsn.dev> writes:

Toggle quote (73 lines)
> Hello,
>
> Thanks for the report.
>
> Malte Frank Gerdes <malte.f.gerdes@gmail.com> writes:
>
>> Hi,
>>
>> The precompiled version of Hugo-extended was not able to find some
>> runtime dependencies:
>> libstdc++.so.6 => not found
>> libgcc_s.so.1 => not found
>
> In case you haven't discovered this in the past two years (oops), this
> is because Guix does not typically work with pre-compiled software that
> relies on system libraries being in /lib, since there is no system-wide
> /lib.
>
>> This seems like a version mismatch to me, so i built Hugo with the
>> following command:
>> go build --tags extended
>>
>> Now the error is (<HASH> = ypiv8dj4lkvsnm82s639h18l87frrh5g):
>> /gnu/store/<HASH>-gcc-6.5.0-lib/lib/libstdc++.so.6: version
>> `GLIBCXX_3.4.26' not found
>
> If I build hugo with gcc-toolchain@7 in my user profile, it works fine.
> However.... I can still repro this issue with gcc-toolchain@8+:
>
> $ go build --tags extended
> $ ./hugo --help
> ./hugo: /gnu/store/01b4w3m6mp55y531kyi1g8shh722kwqm-gcc-7.5.0-lib/lib/libstdc++.so.6: version `GLIBCXX_3.4.26' not found (required by ./hugo)
> ./hugo: /gnu/store/01b4w3m6mp55y531kyi1g8shh722kwqm-gcc-7.5.0-lib/lib/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by ./hugo)
>
> This is because gcc 7's libraries are shadowing the newer gcc's
> libraries:
>
> $ readelf -d hugo | grep RUNPATH
> 0x000000000000001d (RUNPATH) Library runpath:
> [/gnu/store/01b4w3m6mp55y531kyi1g8shh722kwqm-gcc-7.5.0-lib/lib:/gnu/store/fa6wj5bxkj5ll1d7292a70knmyl7a0cr-glibc-2.31/lib:/gnu/store/3h7xd0d47a286b6r9qhz4ybi5iaxkfwi-gcc-11.1.0-lib/lib:/home/sarah/.guix-profile/lib:/gnu/store/3h7xd0d47a286b6r9qhz4ybi5iaxkfwi-gcc-11.1.0-lib/lib/gcc/x86_64-unknown-linux-gnu/11.1.0/../../..]
>
> If I use patchelf to remove the gcc 7 library dir from RUNPATH, hugo
> works fine. This is because Go is patched to unconditionally add a
> runpath to gcc 7's libraries but erroneously does not explicitly set
> CXX. (See also <https://issues.guix.gnu.org/39400>.)
>
> The following patch should explicitly set CXX for Go, so that it always
> uses the "system" version:
>
> diff --git a/gnu/packages/golang.scm b/gnu/packages/golang.scm
> index 0318918a37..a27f57aa30 100644
> --- a/gnu/packages/golang.scm
> +++ b/gnu/packages/golang.scm
> @@ -395,6 +395,7 @@ in the style of communicating sequential processes (@dfn{CSP}).")
> ;; FIXME: Some of the .a files are not bit-reproducible.
> (let* ((output (assoc-ref outputs "out")))
> (setenv "CC" (which "gcc"))
> + (setenv "CXX" (which "g++"))
> (setenv "GOOS" "linux")
> (setenv "GOROOT" (dirname (getcwd)))
> (setenv "GOROOT_FINAL" output)
> @@ -577,6 +578,7 @@ in the style of communicating sequential processes (@dfn{CSP}).")
> (loader (string-append (assoc-ref inputs "libc")
> ,(glibc-dynamic-linker))))
> (setenv "CC" (which "gcc"))
> + (setenv "CXX" (which "g++"))
> (setenv "GO_LDSO" loader)
> (setenv "GOOS" "linux")
> (setenv "GOROOT" (dirname (getcwd)))
>
>
> Hope that helps,
> Sarah
?
Your comment

Commenting via the web interface is currently disabled.

To comment on this conversation send an email to 36823@debbugs.gnu.org

To respond to this issue using the mumi CLI, first switch to it
mumi current 36823
Then, you may apply the latest patchset in this issue (with sign off)
mumi am -- -s
Or, compose a reply to this issue
mumi compose
Or, send patches to this issue
mumi send-email *.patch