无法对 binutils 的库搜索路径进行硬编码

无法对 binutils 的库搜索路径进行硬编码

我尝试建立从零开始的Linux无需 root 访问权限、位于自定义位置以及现有 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-8gcc-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/lib无需设置LD_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

我必须先构建一个较新版本的编译器(gcc-4.4.3 用于编译主机架构,而不是交叉编译),因为 centos 的编译器是 4.1.2,它太旧了,无法构建 glibc-2.11.1。之后,我使用这个新的编译器构建了“Linux从头开始版本6.6”中的交叉编译工具链。到目前为止,该版本还没有要求我做任何事情sed...我想我会设置交叉编译器,然后用它来构建更新版本的 gcc 和 glibc。

相关内容