binutils에 대한 라이브러리 검색 경로를 하드코드할 수 없습니다.

binutils에 대한 라이브러리 검색 경로를 하드코드할 수 없습니다.

나는 구축하려고 노력한다처음부터 리눅스사용자 정의 위치 또는 기존 CentOS 설치 내에서 루트 액세스가 필요하지 않습니다.

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

저도 같은 문제가 있어서 이틀동안 시도한 끝에 문제를 발견했습니다. 문제는 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 스크래치 버전 6.6"에서 크로스 컴파일 툴체인을 구축했습니다. 지금까지 빌드에서는 나에게 아무것도 요구하지 않았습니다 sed. 크로스 컴파일러를 설정한 다음 이를 사용하여 gcc 및 glibc의 최신 버전을 빌드할 것 같습니다.

관련 정보