nisとnssで定義されていない参照のためにarmで古いglibcコンパイルが失敗する

nisとnssで定義されていない参照のためにarmで古いglibcコンパイルが失敗する

少し複雑になるようなので、まずいくつかの背景知識を学びましょう。

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私はbuildahdebian: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:wheezyARMv7の場合、古いバージョンのglibcで古いイメージを使用し、glibc 2.13を使用することです。

関連情報