在arm上编译旧的glibc失败,并在nis和nss中出现未定义的引用

在arm上编译旧的glibc失败,并在nis和nss中出现未定义的引用

它似乎变得有点复杂,所以首先介绍一些背景:

glibc我需要编译在版本通常介于 2.13 和 2.17 之间的arm 系统上运行的独立程序。

当尝试运行这些程序时,我经常收到如下错误:

dlopen: /lib/libc.so.6: version `GLIBC_2.26' not found (required by /tmp/_MEImvaIVL/libpython3.8.so.1.0)

(在本例中,我使用的是带有嵌入式 python 解释器的程序,打包为PyInstaller

我有一个工作流程来从源代码构建python在这种情况下使用的程序,并使用它python来构建最终的包,所以我想如果我只是在正确的glibc版本下构建它,我就可以开始了。

docker我正在使用buildah基于debian:stretch-arm32v7.

显着后审判与恐怖glibc最初似乎编译得很好,但现在我陷入了困境:

gcc -no-pie -shared -static-libgcc -Wl,-O1  -Wl,-z,defs -Wl,-dynamic-linker=/opt/glibc-2.17/lib/ld-linux-armhf.so.3  -B/buildroot/build/csu/  -Wl,--version-script=/buildroot/build/libnss_db.map -Wl,-soname=libnss_db.so.2 -Wl,-z,combreloc -Wl,-z,relro -Wl,--hash-style=both  -L/buildroot/build -L/buildroot/build/math -L/buildroot/build/elf -L/buildroot/build/dlfcn -L/buildroot/build/nss -L/buildroot/build/nis -L/buildroot/build/rt -L/buildroot/build/resolv -L/buildroot/build/crypt -L/buildroot/build/nptl -Wl,-rpath-link=/buildroot/build:/buildroot/build/math:/buildroot/build/elf:/buildroot/build/dlfcn:/buildroot/build/nss:/buildroot/build/nis:/buildroot/build/rt:/buildroot/build/resolv:/buildroot/build/crypt:/buildroot/build/nptl -o /buildroot/build/nss/libnss_db.so -T /buildroot/build/shlib.lds /buildroot/build/csu/abi-note.o -Wl,--whole-archive /buildroot/build/nss/libnss_db_pic.a -Wl,--no-whole-archive /buildroot/build/elf/interp.os /buildroot/build/linkobj/libc.so /buildroot/build/libc_nonshared.a /buildroot/build/nss/libnss_files.so
/buildroot/build/nss/libnss_db_pic.a(db-proto.os): In function `_nss_db_getprotoent_r':
db-proto.c:(.text+0x15c): undefined reference to `_nss_files_parse_protoent'
/buildroot/build/nss/libnss_db_pic.a(db-proto.os): In function `_nss_db_getprotobyname_r':
db-proto.c:(.text+0x268): undefined reference to `_nss_files_parse_protoent'

... (more failing functions) ...

collect2: error: ld returned 1 exit status
../Makerules:446: recipe for target '/buildroot/build/nss/libnss_db.so' failed
make[2]: *** [/buildroot/build/nss/libnss_db.so] Error 1

如果我进入容器并复制并粘贴上面的gcc命令,我可以立即重现此错误。现在,如果我添加标志(其中包含链接器找不到的-L/usr/lib/arm-linux-gnueabihf主机和函数,并再次执行该命令,我会得到相同的错误,但如果我也添加(毫不奇怪?)它会起作用。但这将是如果有更多文件,那么一定存在更深层次的问题?libnss_files.so-lnss_files

-Wl,-dynamic-linker=/opt/glibc-2.17/lib/ld-linux-armhf.so.3让我惊讶的是上面命令中的标志。虽然这确实是最终目标 ( ),但由于仍在建设中,--prefix=/opt/glibc-2.17它仍然是空的。glibc

不知何故glibc引导不正确?

有任何想法吗?

蒂亚!

答案1

您可能需要完全引导 GCC/glibc 对 — GCC 嵌入了一些有关其构建时所用的 C 库的知识。

我认为,对于您而言,一个更简单的解决方案是使用带有旧版本 glibc 的旧图像;例如,debian:wheezy适用于 ARMv7 并使用 glibc 2.13。

相关内容