binutilsのライブラリ検索パスをハードコードできません。

binutilsのライブラリ検索パスをハードコードできません。

私は構築しようとしています最初からLinuxカスタムの場所または既存のCentOSインストール内でrootアクセスは必要ありません。

LFS私のホームディレクトリに絶対パスを設定LFS_TGT=x86_64-lfs-linux-gnuし、export PATH=${LFS}/tools/bin:$PATH

組み込みbinutils-2.28

../configure --prefix=${LFS}/tools      \
             --with-sysroot=$LFS        \
             --with-lib-path=${LFS}/tools/lib \
             --target=$LFS_TGT          \
             --disable-nls              \
             --disable-werror

その後、シンボリックリンクを${LFS}/tools/lib64かけて${LFS}/tools/libカーネルヘッダをインストールし、linux-2-6-32-8すべてをそのディレクトリにgcc-4.9.2ビルドしました。glibc-2.11.1${LFS}/tools

次に、を入力しましたが、次のx86_64-lfs-linux-gnu-ld -lcエラーが発生しました。

x86_64-lfs-linux-gnu-ld: cannot find -lc

cd ${LFS}/tools/lib64その後、x86_64-lfs-linux-gnu-ld libc.so次のエラーが発生します。

x86_64-lfs-linux-gnu-ld: cannot find ${LFS}/tools/lib/libc.so.6 inside ${LFS}

私はこのエラーを理解できません。ファイルlibc.so.6が正しい場所にあります。

--with-lib-path=${LFS}/tools/lib設定オプションは、環境変数を設定せずにライブラリを検索するように指示するとbinutils-2.28思います。しかし、これは本当ではありません。x86_64-lfs-linux-gnu-ld${LFS}/tools/libLD_LIBRARY_PATH

なぜ?

これを設定LD_LIBRARY_PATHすると、${LFS}/tools/lib作成したばかりのアイテムやCentOSの既存のコアユーティリティなど、すべてのアイテムで分割エラーが発生します。


修正する:

私も次のことを試しました。

../configure --prefix=${LFS}/tools      \
             --with-sysroot=$LFS        \
             --with-lib-path=tools/lib  \  # this is changed
             --target=$LFS_TGT          \
             --disable-nls              \
             --disable-werror

ただし、両方のエラーが引き続き発生します。

答え1

私も同じ問題があり、2日間試してみたところで問題を発見しました。問題はglibcにあります。 ldはlibc.soファイルを見つけてリンクしようとしますが、ファイルはリンクするファイルをリンカーに通知するリンカースクリプトです。内容は次のとおりです。

/* GNU ld script
Use the shared library, but some functions are only in
the static library, so try that secondarily.  */
OUTPUT_FORMAT(elf64-x86-64)
GROUP ( ${LFS}/tools/lib/libc.so.6 ${LFS}/tools/lib/libc_nonshared.a  AS_NEEDED ( ${LFS}/tools/lib/ld-linux-x86-64.so.2 ) )

gccは--sysroot=${LFS}オプションをldに渡すからです。 ldが追加され、${LFS}リンク${LFS}/tools/lib/libc.so.6を試みると上記のエラーが発生します。

glibc_source_dir/Makerules line 1082:

install: $(inst_libdir)/libc.so
$(inst_libdir)/libc.so: $(common-objpfx)format.lds \
        $(common-objpfx)libc.so$(libc.so-version) \
        $(inst_libdir)/$(patsubst %,$(libtype.oS),\
                      $(libprefix)$(libc-name)) \
        $(+force)
        (echo '/* GNU ld script';\
 echo '   Use the shared library, but some functions are only in';\
 echo '   the static library, so try that secondarily.  */';\
 cat $<; \
 echo 'GROUP ( $(slibdir)/libc.so$(libc.so-version)' \
      '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)$(libc-name))'\
      ' AS_NEEDED (' $(rtlddir)/$(rtld-installed-name) ') )' \
) > [email protected]
mv -f [email protected] $@

glibcのインストール先はすべてのライブラリをインストールし、$(inst_libdir)notに関連するファイルを作成するときに使用されます$(DESTDIR)$(prefix)$(libdir)$(slibdir)libc.so$(prefix)$(DESTDIR)

回避策:glibcを設定--prefix=/toolsしたら、次のようにインストールする必要があります。 DESTDIR=${LFS} make install

答え2

Centos用のコンパイラがglibc-2.11をビルドするには古い4.1.2であるため、最初に最新バージョンのコンパイラ(クロスコンパイルではなくホストアーキテクチャ用のコンパイル用gcc-4.4.3)をビルドする必要がありました。 。その後、私はこの新しいコンパイラを使用して「Linux from Scratch Version 6.6」でクロスコンパイルツールチェーンを構築しました。これまでのビルドでは私に何も求めていませんでしたsed。クロスコンパイラを設定し、それを使用してgccとglibcの最新バージョンを構築するようです。

関連情報