我尝试建立从零开始的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-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/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。