Repository navigation
Building 20.12.0 with old GLIBC: sys/random.h: No such file or directory #52223
Copy link
Copy link
Closed as not planned
Closed as not planned
Copy link
Labels
buildIssues and PRs related to Node.js builds or CI infrastructure.Issues and PRs related to Node.js builds or CI infrastructure.
Description
Version
20.12.0
Platform
Linux 42c14383a17c 6.7.3-100.fc38.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Feb 1 03:33:32 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
Subsystem
CentOS 7
What steps will reproduce the bug?
Use the quay.io/pypa/manylinux2014_x86_64 docker image (CentOS 7 based) to build nodejs (./configure).
How often does it reproduce? Is there a required condition?
It can be consistently reproduced.
What is the expected behavior? Why is that the expected behavior?
It can be successfully built, like 20.11.1.
node/deps/cares/src/lib/ares_rand.c
Lines 38 to 40 in 94fb854
| #ifdef HAVE_SYS_RANDOM_H | |
| # include <sys/random.h> | |
| #endif |
These three lines were added by #51385 (upstream: c-ares/c-ares@d8edb76), and I believe that HAVE_SYS_RANDOM_H is not correctly set when sys/random.h is missing in the old glibc (<2.25).
What do you see instead?
2024-03-26T19:49:01.0021083Z cc -o /tmp/tmppjl__aad/build/nodejs-prefix/src/nodejs/out/Release/obj.target/cares/deps/cares/src/lib/ares_rand.o ../deps/cares/src/lib/ares_rand.c '-D_GLIBCXX_USE_CXX11_ABI=1' '-DNODE_OPENSSL_CONF_NAME=nodejs_conf' '-DNODE_OPENSSL_HAS_QUIC' '-DICU_NO_USER_DATA_OVERRIDE' '-D_DARWIN_USE_64_BIT_INODE=1' '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-D_GNU_SOURCE' '-D__STDC_FORMAT_MACROS' '-DOPENSSL_NO_PINSHARED' '-DOPENSSL_THREADS' '-DCARES_STATICLIB' '-DHAVE_CONFIG_H' -I../deps/cares/include -I../deps/cares/config/linux -pthread -Wall -Wextra -Wno-unused-parameter -g -pedantic -Wall -Wextra -Wno-unused-parameter --std=gnu11 -m64 -O3 -fno-omit-frame-pointer -MMD -MF /tmp/tmppjl__aad/build/nodejs-prefix/src/nodejs/out/Release/.deps//tmp/tmppjl__aad/build/nodejs-prefix/src/nodejs/out/Release/obj.target/cares/deps/cares/src/lib/ares_rand.o.d.raw -c
2024-03-26T19:49:01.0552754Z ../deps/cares/src/lib/ares_rand.c:39:12: fatal error: sys/random.h: No such file or directory
2024-03-26T19:49:01.0553982Z 39 | # include <sys/random.h>
2024-03-26T19:49:01.0554526Z | ^~~~~~~~~~~~~~
2024-03-26T19:49:01.0559918Z compilation terminated.
2024-03-26T19:49:01.0588060Z make[1]: *** [/tmp/tmppjl__aad/build/nodejs-prefix/src/nodejs/out/Release/obj.target/cares/deps/cares/src/lib/ares_rand.o] Error 1
2024-03-26T19:49:01.0590872Z make[1]: *** Waiting for unfinished jobs....
2024-03-26T19:49:01.2031508Z rm 6b3de4dd491ec37fd0646cdb3ef3868d29e0cb21.intermediate
2024-03-26T19:49:01.2232100Z make[1]: Leaving directory `/tmp/tmppjl__aad/build/nodejs-prefix/src/nodejs/out'
2024-03-26T19:49:01.2253454Z make: *** [node] Error 2
2024-03-26T19:49:01.2263564Z FAILED: nodejs-prefix/src/nodejs-stamp/nodejs-build /tmp/tmppjl__aad/build/nodejs-prefix/src/nodejs-stamp/nodejs-build
Additional information
No response
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
buildIssues and PRs related to Node.js builds or CI infrastructure.Issues and PRs related to Node.js builds or CI infrastructure.
Activity
Ch3nYuY commentedon Mar 27, 2024
I reproduced your problem using the same Docker image. By temporarily compiling successfully with
#undef HAVE_GETRANDOM#undef HAVE_SYS_RANDOM_Hindeps/cares/config/linux/ares_config.h.At the same time, I found that the
HAVE_GETRANDOMmacro encountered the same problem. They seem to have been introduced during the automated update of c-ares (#51385, #51582). I'm looking into how to fix them.Ch3nYuY commentedon Mar 27, 2024
The root cause of this compilation error is that Node.js adopted a static method to directly load
config/linux/ares_config.hwhen incorporating c-ares configurations for different architectures.node/deps/cares/cares.gyp
Lines 197 to 200 in 6d2d3f1
As a result, the original mechanism of c-ares for generating macros, as demonstrated below, was not executed.
node/deps/cares/configure
Lines 21505 to 21509 in 6d2d3f1
However, I currently do not know how to dynamically detect header files and set macros in GYP.
richardlau commentedon Mar 27, 2024
sys/random.hwas added in glibc 2.25. glibc 2.28 has been the minimum supported version since Node.js 18, so this isn't an issue for Node.js.If you are building Node.js for an older glibc you'll need to make adjustments accordingly.
scosol commentedon Mar 28, 2024
nodejs/unofficial-builds#127
njzjz commentedon Mar 29, 2024
Could we append the following codes to
deps/cares/config/linux/ares_config.h:When GLIBC version <2.25, undefine
HAVE_SYS_RANDOM_HandHAVE_GETRANDOM.zhuzhzh commentedon Apr 2, 2024
I agree with this workaround!
okuryu commentedon Apr 4, 2024
I have solved this problem by applying Anna's patch.
nodejs/unofficial-builds#127 (review)
so I have successfully built v18 and v20 on CentOS 7 (glibc 2.17) and they pass tests with citgm.
Artiom-Morozov-Resilio commentedon Apr 9, 2024
That may need
#include <sys/types.h>above check as well, because GLIBC comes from features.h and it's not included on all pathes where ares_config.h is included. I see it on glibc 2.17.You can check your setup it by adding
branch and building on older glibc, should not fail if all macros are set.
kftang commentedon Apr 12, 2024
This worked for me on RHEL 7.5
Disable usage of <sys/random.h> in older version of glibc
Disable usage of <sys/random.h> in older version
Add workaround for nodejs/node#52223
Fix Linux build according to nodejs/node#52223
fix: nodejs 18 patch `sys/random.h` not included
surmish commentedon Jun 13, 2024
Can you suggest a workaround for this to build on machines with older
glibcversions?scosol commentedon Jun 17, 2024
See the code in here: https://unofficial-builds.nodejs.org/
nodejs/unofficial-builds#129
Applying spack-ized versions of fix in nodejs/node#52223 to adddress …
node-js: add v17.9.1, v20.15.0, v21.7.3, v22.3.0, v22.4.0 (#45007)
node-js: add v17.9.1, v20.15.0, v21.7.3, v22.3.0, v22.4.0 (spack#45007)
node-js: add v17.9.1, v20.15.0, v21.7.3, v22.3.0, v22.4.0 (spack#45007)
node-js: add v17.9.1, v20.15.0, v21.7.3, v22.3.0, v22.4.0 (spack#45007)
node-js: add v17.9.1, v20.15.0, v21.7.3, v22.3.0, v22.4.0 (spack#45007)
Add workaround for nodejs/node#52223
nodejs 20.9.0 (#20)
feat(glibc-compat): round 2 groundwork + junior-dev-detailed plan