diff options
author | Torbjörn SVENSSON <torbjorn.svensson@foss.st.com> | 2023-08-08 18:09:50 +0200 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2023-08-09 11:38:03 +0200 |
commit | b9e867d088935d9f0bf312e6dbf3e4976850dfd3 (patch) | |
tree | c1e533435a9fe52fe6c3aa435d5029c3eb913174 /newlib/libc | |
parent | cbe7543cdfdb7f3d270214877d4a4c3e78710bd3 (diff) | |
download | newlib-b9e867d088935d9f0bf312e6dbf3e4976850dfd3.zip newlib-b9e867d088935d9f0bf312e6dbf3e4976850dfd3.tar.gz newlib-b9e867d088935d9f0bf312e6dbf3e4976850dfd3.tar.bz2 |
Add stub for getentropy
Example test case that fails with undefined reference to getentropy:
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
Contributed by STMicroelectronics
Signed-off-by: Torbjörn SVENSSON <torbjorn.svensson@foss.st.com>
Diffstat (limited to 'newlib/libc')
-rw-r--r-- | newlib/libc/include/_syslist.h | 1 | ||||
-rw-r--r-- | newlib/libc/include/reent.h | 2 | ||||
-rw-r--r-- | newlib/libc/reent/Makefile.inc | 2 | ||||
-rw-r--r-- | newlib/libc/reent/getentropyr.c | 53 | ||||
-rw-r--r-- | newlib/libc/syscalls/Makefile.inc | 1 | ||||
-rw-r--r-- | newlib/libc/syscalls/sysgetentropy.c | 12 |
6 files changed, 71 insertions, 0 deletions
diff --git a/newlib/libc/include/_syslist.h b/newlib/libc/include/_syslist.h index 271644e..2946af5 100644 --- a/newlib/libc/include/_syslist.h +++ b/newlib/libc/include/_syslist.h @@ -24,6 +24,7 @@ #define _unlink unlink #define _wait wait #define _write write +#define _getentropy getentropy #endif /* MISSING_SYSCALL_NAMES */ #if defined MISSING_SYSCALL_NAMES || !defined HAVE_OPENDIR diff --git a/newlib/libc/include/reent.h b/newlib/libc/include/reent.h index 23d572c..b1dd2a7 100644 --- a/newlib/libc/include/reent.h +++ b/newlib/libc/include/reent.h @@ -125,6 +125,7 @@ struct timezone; #define _unlink_r(__reent, __path) unlink(__path) #define _wait_r(__reent, __status) wait(__status) #define _write_r(__reent, __fd, __buff, __cnt) write(__fd, __buff, __cnt) +#define _getentropy_r(__reent, __buff, __cnt) getentropy(__buff, __cnt) #define _gettimeofday_r(__reent, __tp, __tzp) gettimeofday(__tp, __tzp) #ifdef __LARGE64_FILES @@ -156,6 +157,7 @@ extern _CLOCK_T_ _times_r (struct _reent *, struct tms *); extern int _unlink_r (struct _reent *, const char *); extern int _wait_r (struct _reent *, int *); extern _ssize_t _write_r (struct _reent *, int, const void *, size_t); +extern int _getentropy_r (struct _reent *, void *, size_t); /* This one is not guaranteed to be available on all targets. */ extern int _gettimeofday_r (struct _reent *, struct timeval *__tp, void *__tzp); diff --git a/newlib/libc/reent/Makefile.inc b/newlib/libc/reent/Makefile.inc index 38ddf57..26f952b 100644 --- a/newlib/libc/reent/Makefile.inc +++ b/newlib/libc/reent/Makefile.inc @@ -4,6 +4,7 @@ libc_a_SOURCES += \ %D%/impure.c \ %D%/fcntlr.c \ %D%/fstatr.c \ + %D%/getentropyr.c \ %D%/getreent.c \ %D%/gettimeofdayr.c \ %D%/isattyr.c \ @@ -46,6 +47,7 @@ LIBC_CHEWOUT_FILES += \ %D%/execr.def \ %D%/fcntlr.def \ %D%/fstatr.def \ + %D%/getentropyr.def \ %D%/gettimeofdayr.def \ %D%/linkr.def \ %D%/lseekr.def \ diff --git a/newlib/libc/reent/getentropyr.c b/newlib/libc/reent/getentropyr.c new file mode 100644 index 0000000..e3f85e4 --- /dev/null +++ b/newlib/libc/reent/getentropyr.c @@ -0,0 +1,53 @@ +/* Reentrant version of getentropy system call. */ + +#include <reent.h> +#include <unistd.h> +#include <_syslist.h> + +/* Some targets provides their own versions of these functions. Those + targets should define REENTRANT_SYSCALLS_PROVIDED in TARGET_CFLAGS. */ + +#ifdef _REENT_ONLY +#ifndef REENTRANT_SYSCALLS_PROVIDED +#define REENTRANT_SYSCALLS_PROVIDED +#endif +#endif + +#ifndef REENTRANT_SYSCALLS_PROVIDED + +/* We use the errno variable used by the system dependent layer. */ +#undef errno +extern int errno; + +/* +FUNCTION + <<_getentropy_r>>---Reentrant version of getentropy + +INDEX + _getentropy_r + +SYNOPSIS + #include <reent.h> + int _getentropy_r(struct _reent *<[ptr]>, + void *<[buf]>, size_t <[buflen]>); + +DESCRIPTION + This is a reentrant version of <<getentropy>>. It + takes a pointer to the global data block, which holds + <<errno>>. +*/ + +int +_getentropy_r (struct _reent *ptr, + void *buf, + size_t buflen) +{ + int ret; + + errno = 0; + if ((ret = _getentropy (buf, buflen)) == -1 && errno != 0) + _REENT_ERRNO(ptr) = errno; + return ret; +} + +#endif /* ! defined (REENTRANT_SYSCALLS_PROVIDED) */ diff --git a/newlib/libc/syscalls/Makefile.inc b/newlib/libc/syscalls/Makefile.inc index 627a4df..7f7bbbd 100644 --- a/newlib/libc/syscalls/Makefile.inc +++ b/newlib/libc/syscalls/Makefile.inc @@ -4,6 +4,7 @@ libc_a_SOURCES += \ %D%/sysclose.c \ %D%/sysfcntl.c \ %D%/sysfstat.c \ + %D%/sysgetentropy.c \ %D%/sysgetpid.c \ %D%/sysgettod.c \ %D%/sysisatty.c \ diff --git a/newlib/libc/syscalls/sysgetentropy.c b/newlib/libc/syscalls/sysgetentropy.c new file mode 100644 index 0000000..d68ccbc --- /dev/null +++ b/newlib/libc/syscalls/sysgetentropy.c @@ -0,0 +1,12 @@ +/* connector for getentropy */ + +#include <reent.h> +#include <sys/types.h> +#include <sys/time.h> + +int +getentropy (void *buf, + size_t buflen) +{ + return _getentropy_r (_REENT, buf, buflen); +} |