Re: Unable to link C++ application with libstdc++ when newlib is used (gcc 13 and perhaps also 12)

Christophe Lyon <[email protected]>
Newsgroups gmane.comp.lib.newlib
Message-ID <CAKhMtSJAQkpt2qu=dx3Quo-8CMpcJY_s+KTyJxhWzbY-y9LkyQ@mail.gmail.com>
Hi Torbjorn,
I think there's additional context in:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103166


Le sam. 17 sept. 2022, 19:45, Torbjorn SVENSSON <
[email protected]> a écrit :

> Hello,
>
> I've just tried to run the DejaGNU testsuite on GCC master
> (9ac9fde961f76879f0379ff3b2494a2f9ac915f7) with a rather recent commit
> of newlib (the package was patched by Arm and provided in their
> 11.3.rel1 release).
> Running the testsuite on arm-none-eabi produces a few hundred UNRESOLVED
> test cases, all related to the absence of an implementation of getentropy.
>
> Looking at the current master of newlib
> (eb5c631ead537ac5640d7e4b1ea0edbef344d6d9), there is still no
> implementation, so I suspect that the same error would be visible if I
> switched to the official newlib tree.
>
> In commit 3439657b02869299685d259c3a77aa38714565b7, the use of
> getentropy was introduced in GCC and the changeset enables the use after
> checking that the getentropy function is defined in unistd.h. In the
> case of newlib, the definition exists in unistd.h, but there is no
> common implementation for it. There are 2 specific implementations for
> RTEMS and cygwin, but nothing common.
>
>
> I suppose the origin of the problem is the definition of the getentropy
> function in the newlib provided unistd.h, but what is the appropriate
> fix for it?
> - Create a stub function that just returns -1 and sets errno=ENOSYS?
> - Remove the getentropy definition from common unistd.h and place it in
> a fragment for cygwin and RTEMS?
> - Any other solution that I've overlooked?
>
>
>
> Here is an example of how the error looks like for the GCC testsuite:
> Testing g++.robertl/eb77.C,  -std=c++20
> doing compile
> Executing on host: /build/gcc-13-2709-g9ac9fde961f/bin/arm-none-eabi-g++
>   /build/src/gcc/gcc/testsuite/g++.old-deja/g++.robertl/eb77.C  -mthumb
> -march=armv6s-m -mcpu=cortex-m0 -mfloat-abi=soft
> -fdiagnostics-plain-output   -fmessage-length=0  -std=c++20
> -pedantic-errors -Wno-long-long        -Wl,--start-group -lc -lm
> -Wl,--end-group --specs=nosys.specs -Wl,--allow-multiple-definition
> -Wl,-u,_isatty,-u,_fstat   -Wl,-wrap,exit -Wl,-wrap,_exit -Wl,-wrap,main
> -Wl,-wrap,abort -Wl,g++_tg.o -lm -o ./eb77.exe    (timeout = 800)
> spawn -ignore SIGHUP
> /build/gcc-13-2709-g9ac9fde961f/bin/arm-none-eabi-g++
> /build/src/gcc/gcc/testsuite/g++.old-deja/g++.robertl/eb77.C -mthumb
> -march=armv6s-m -mcpu=cortex-m0 -mfloat-abi=soft
> -fdiagnostics-plain-output -fmessage-length=0 -std=c++20
> -pedantic-errors -Wno-long-long -Wl,--start-group -lc -lm
> -Wl,--end-group --specs=nosys.specs -Wl,--allow-multiple-definition
> -Wl,-u,_isatty,-u,_fstat -Wl,-wrap,exit -Wl,-wrap,_exit -Wl,-wrap,main
> -Wl,-wrap,abort -Wl,g++_tg.o -lm -o ./eb77.exe
> pid is 28414 -28414
> /build/gcc-13-2709-g9ac9fde961f/bin/../lib/gcc/arm-none-eabi/13.0.0/../../../../arm-none-eabi/bin/ld:
>
> /build/gcc-13-2709-g9ac9fde961f/bin/../lib/gcc/arm-none-eabi/13.0.0/../../../../arm-none-eabi/lib/thumb/v6-m/nofp/libstdc++.a(random.o):
>
> in function `std::(anonymous namespace)::__libc_getentropy(void*)':
> (.text._ZNSt12_GLOBAL__N_117__libc_getentropyEPv+0x8): undefined
> reference to `getentropy'
> /build/gcc-13-2709-g9ac9fde961f/bin/../lib/gcc/arm-none-eabi/13.0.0/../../../../arm-none-eabi/bin/ld:
>
> /build/gcc-13-2709-g9ac9fde961f/bin/../lib/gcc/arm-none-eabi/13.0.0/../../../../arm-none-eabi/lib/thumb/v6-m/nofp/libstdc++.a(random.o):
>
> in function
> `std::random_device::_M_init(std::__cxx11::basic_string<char,
> std::char_traits<char>, std::allocator<char> > const&)':
> (.text._ZNSt13random_device7_M_initERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE+0x58):
>
> undefined reference to `getentropy'
> /build/gcc-13-2709-g9ac9fde961f/bin/../lib/gcc/arm-none-eabi/13.0.0/../../../../arm-none-eabi/bin/ld:
>
> /build/gcc-13-2709-g9ac9fde961f/bin/../lib/gcc/arm-none-eabi/13.0.0/../../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(libc_a-arc4random.o):
>
> in function `_rs_stir':
> (.text._rs_stir+0x8): undefined reference to `getentropy'
> collect2: error: ld returned 1 exit status
> pid is -1
> close result is 28414 exp6 0 1
> output is
> /build/gcc-13-2709-g9ac9fde961f/bin/../lib/gcc/arm-none-eabi/13.0.0/../../../../arm-none-eabi/bin/ld:
>
> /build/gcc-13-2709-g9ac9fde961f/bin/../lib/gcc/arm-none-eabi/13.0.0/../../../../arm-none-eabi/lib/thumb/v6-m/nofp/libstdc++.a(random.o):
>
> in function `std::(anonymous namespace)::__libc_getentropy(void*)':
> (.text._ZNSt12_GLOBAL__N_117__libc_getentropyEPv+0x8): undefined
> reference to `getentropy'
> /build/gcc-13-2709-g9ac9fde961f/bin/../lib/gcc/arm-none-eabi/13.0.0/../../../../arm-none-eabi/bin/ld:
>
> /build/gcc-13-2709-g9ac9fde961f/bin/../lib/gcc/arm-none-eabi/13.0.0/../../../../arm-none-eabi/lib/thumb/v6-m/nofp/libstdc++.a(random.o):
>
> in function
> `std::random_device::_M_init(std::__cxx11::basic_string<char,
> std::char_traits<char>, std::allocator<char> > const&)':
> (.text._ZNSt13random_device7_M_initERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE+0x58):
>
> undefined reference to `getentropy'
> /build/gcc-13-2709-g9ac9fde961f/bin/../lib/gcc/arm-none-eabi/13.0.0/../../../../arm-none-eabi/bin/ld:
>
> /build/gcc-13-2709-g9ac9fde961f/bin/../lib/gcc/arm-none-eabi/13.0.0/../../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc.a(libc_a-arc4random.o):
>
> in function `_rs_stir':
> (.text._rs_stir+0x8): undefined reference to `getentropy'
> collect2: error: ld returned 1 exit status
>   status 1
> compiler exited with status 1
> FAIL: g++.old-deja/g++.robertl/eb77.C  -std=c++20 (test for excess errors)
> Excess errors:
> (.text._ZNSt12_GLOBAL__N_117__libc_getentropyEPv+0x8): undefined
> reference to `getentropy'
> (.text._ZNSt13random_device7_M_initERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE+0x58):
>
> undefined reference to `getentropy'
> (.text._rs_stir+0x8): undefined reference to `getentropy'
> UNRESOLVED: g++.old-deja/g++.robertl/eb77.C  -std=c++20 compilation
> failed to produce executable
>
>
> Kind regards,
> Torbjörn
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.