gpt4 book ai didi

GCC 4.9.4 交叉编译器构建(limits.h 问题)

转载 作者:行者123 更新时间:2023-12-05 07:42:31 25 4
gpt4 key购买 nike

引出问题的基本步骤:

cd linux-2.6.35.9/
make ARCH=x86 INSTALL_HDR_PATH=${PREFIX}/${TARGET} headers_install
cd ../

cd build-binutils/
sh ../binutils-2.28/configure --prefix=${PREFIX} --target=${TARGET}
make
make install
cd ../

cd build-gcc/
sh ../gcc-4.9.4/configure --prefix=${PREFIX} --target=${TARGET} --enable-languages=c,c++ --disable-multilib
make all-gcc
make install-gcc
cd ../

我遇到的问题是最终安装到 ${PREFIX}/lib/gcc/${TARGET}/4.9.4/include-fixed/limits.h 中的内容似乎不正确.具体来说,构建和安装 GCC 时的“fixincludes”位需要一些名为“sys-include”的目录,但如果没有,上述 limits.h 不会引用相关的 syslimits.h(在同一目录)。

如果我查看构建/安装序列的输出,会看到从组件 limitx.h、limity.h 和其他一些位构建此文件的引用。这个测试失败了,它只是安装了 GCC 附带的“通用”limits.h(不包括对 syslimits.h 的引用,它使用 GCC 的#include_next 指令来包含 ${PREFIX}/${TARGET}/include/limits.h 里面有实际的东西我需要像 NAME_MAX 和 PATH_MAX)。

文件中缺少的位是:

/* This administrivia gets added to the beginning of limits.h
if the system has its own version of limits.h. */

/* We use _GCC_LIMITS_H_ because we want this not to match
any macros that the system's limits.h uses for its own purposes. */
#ifndef _GCC_LIMITS_H_ /* Terminated in limity.h. */
#define _GCC_LIMITS_H_

#ifndef _LIBC_LIMITS_H_
/* Use "..." so that we find syslimits.h only in this same directory. */
#include "syslimits.h"
#endif

那么是否有一个选项我没有传递给 GCC 的配置脚本,或者我没有传递给可以正确创建 sys-include 目录的这一步之前的东西?

[编辑]

TARGET=i686-redhat-linux(我们用于项目的构建服务器上的“gcc -dumpmachine”的目标三元组)

可能更有帮助的信息(?):这些包只是从各自的文件中“wget”拉取的。我正在构建一个最新的 Ubuntu 16.04 安装,我在其中安装了 libgmp-dev 和 libmpfr-dev 以避免必须使用编译器源代码编译它们。

最佳答案

经过更多的挖掘和反复试验,我匹配了一些我从 How to Build a GCC Cross-Compiler 开始的东西以及有关用于配置 GCC 的显然已弃用的选项 --with-headers 的信息。 (--with-headers=${PREFIX}/${TARGET}/include/linux) 这行得通,但是当我构建编译器支持库时,它提示缺少 bits/stdio_lim.h 。我找到了另一个帖子 here谈到了这个问题(你必须在线程中稍微上升一点)并且提到了我提到的第一页中令人感动的 gnu/stubs.h 东西。

根据我自己在下面的评论添加,注意您必须删除在 make install-gcc 之后构建的 ${PREFIX}/${TARGET}/sys-include 目录 步骤,否则您的普通 C header 将与默认包含在搜索路径中的特定于 Linux 内核的 header 发生冲突。

我只想说,在对我使用的旧 Glibc (2.11.3) 应用补丁后,整个序列最终如下所示:

export TARGET=i686-redhat-linux
export PREFIX=$(pwd)/output
export PATH=${PATH}:${PREFIX}/bin

mkdir build-binutils
mkdir build-gcc
mkdir build-glibc

cd linux-2.6.35.9/
make ARCH=x86 INSTALL_HDR_PATH=${PREFIX}/${TARGET} headers_install
cd ../

cd build-binutils/
sh ../binutils-2.28/configure --prefix=${PREFIX} --target=${TARGET}
make
make install
cd ../

cd build-gcc/
sh ../gcc-4.9.4/configure --prefix=${PREFIX} --target=${TARGET} --enable-languages=c,c++ --disable-multilib --with-headers=${PREFIX}/${TARGET}/include/linux
make all-gcc
make install-gcc
cd ../
rm --recursive --force ${PREFIX}/${TARGET}/sys-include

cd build-glibc/
sh ../glibc-2.11.3/configure --prefix=${PREFIX}/${TARGET} --build=$(gcc -dumpmachine) --host=${TARGET} --target=${TARGET} --disable-multilib libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes
make install-bootstrap-headers=yes install-headers
make csu/subdir_lib
install csu/crt1.o csu/crti.o csu/crtn.o ${PREFIX}/${TARGET}/lib
${TARGET}-gcc -nostdlib -nostartfiles -shared -x c /dev/null -o ${PREFIX}/${TARGET}/lib/libc.so
touch ${PREFIX}/${TARGET}/include/gnu/stubs.h ${PREFIX}/${TARGET}/include/bits/stdio_lim.h
cd ../

cd build-gcc/
make all-target-libgcc
make install-target-libgcc
cd ../

cd build-glibc/
make
make install
cd ../

我没有看到任何真正深入到这个深度的页面(也许 Preshing on Programming 页面实际上并不完全正确?)但我将测试此配置并确保软件完全针对目标构建而无需问题。 (我确实在文件中的 limits.h 中测试了 NAME_MAX,它似乎工作得很好而且很漂亮。)

我也不知道我是否需要放入 --disable-multilib 东西,但这似乎是其他页面正在做的事情。 GCC 邮件列表中的链讨论了使用 --with-newlib--disable-shared 作为选项,但线程中的人不同意其中任何一个是正确的解决方案。

如果有人对此有更好的洞察力,我肯定会感激一个不那么骇人听闻、更正式的问题解决方案。

如果有人想知道,修复 Glibc 2.11.3 的补丁(有两个)是配置脚本与 GNU Make 4+ 一起工作的自定义修复:

sed -i 's/\(3.79\)/4.* | \1/' glibc-2.11.3/configure

...以及库中两个文件的实际补丁以修复 i686 支持:

patch glibc-2.11.3/nptl/sysdeps/pthread/pt-initfini.c <<__EOF__
@@ -45,6 +45,11 @@
/* Embed an #include to pull in the alignment and .end directives. */
asm ("\n#include \"defs.h\"");

+asm ("\n#if defined __i686 && defined __ASSEMBLER__");
+asm ("\n#undef __i686");
+asm ("\n#define __i686 __i686");
+asm ("\n#endif");
+
/* The initial common code ends here. */
asm ("\n/*@HEADER_ENDS*/");

__EOF__
patch glibc-2.11.3/sysdeps/unix/sysv/linux/i386/sysdep.h <<__EOF__
@@ -29,6 +29,10 @@
#include <dl-sysdep.h>
#include <tls.h>

+#if defined __i686 && defined __ASSEMBLER__
+#undef __i686
+#define __i686 __i686
+#endif

/* For Linux we can use the system call table in the header file
/usr/include/asm/unistd.h
__EOF__

我从 here 得到了最后一个补丁.

关于GCC 4.9.4 交叉编译器构建(limits.h 问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44419593/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com