조금 복잡해지는 것 같으니 먼저 몇 가지 배경 지식을 알아보세요.
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 라이브러리에 대한 일부 지식이 포함되어 있습니다.
내 생각에 더 간단한 해결책은 예를 들어 debian:wheezy
ARMv7의 경우 이전 버전의 glibc와 함께 이전 이미지를 사용하고 glibc 2.13을 사용하는 것입니다.