компиляция старого glibc на arm завершается неудачно с неопределенными ссылками в nis и nss

Это кажется немного сложным, поэтому сначала немного предыстории:

Мне нужно скомпилировать самодостаточные программы, которые работают на системах с glibcверсиями обычно между 2.13 и 2.17.

При попытке запустить эти программы я часто получаю сообщение об ошибке, подобное этому:

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
25.06.2020, 20:45
1 ответ

Возможно, вам потребуется полностью загрузить пару GCC/glibc — GCC включает в себя некоторые знания библиотеки C, с которой он был собран.

Я подозреваю, что в вашем случае более простым решением будет использование старых образов со старыми версиями glibc; например, debian:wheezyдоступен для ARMv7 и использует glibc 2.13.

1
18.03.2021, 23:24

Теги

Похожие вопросы