查看“GCC Cross-Compiler”的源代码
←
GCC Cross-Compiler
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
{{FirstPerson}} {{rating|1}} 本教程重点介绍为您自己的操作系统创建GCC交叉编译器。 我们在这里构建的编译器将有一个通用目标(i686 elf),它允许您将当前操作系统留在后面,这意味着不会使用主机操作系统的头或库。 在操作系统开发中,您“需要”一个交叉编译器,否则会发生很多意想不到的事情,因为编译器假定您的代码正在主机操作系统上运行。 == 介绍 == 一般来说,交叉编译器是在平台a(“主机”)上运行,但为平台B(“目标”)生成可执行文件的编译器。这两个平台在CPU、操作系统和/或[:类别:可执行格式|可执行格式]]方面可能(但不需要)有所不同。 在我们的例子中,主机平台是您当前的操作系统,目标平台是您将要制作的操作系统。 重要的是要认识到这两个平台是不同的;您正在开发的操作系统总是与您当前使用的操作系统不同。 这就是为什么我们需要首先构建一个交叉编译器,否则您肯定会遇到麻烦。 === 为什么需要交叉编译器 === {{Main|Why do I need a Cross Compiler?}} 您需要使用交叉编译器“”,除非您在自己的操作系统上开发“”。 编译器必须知道正确的目标平台(CPU、操作系统),否则您将遇到麻烦。 如果您使用系统附带的编译器,那么编译器不会知道它正在编译其他的东西。 一些教程建议使用系统编译器,并向编译器传递许多有问题的选项。 这在将来肯定会给您带来很多问题,解决方案是构建一个交叉编译器。 如果您已经尝试在不使用交叉编译器的情况下创建操作系统,请阅读文章[[为什么我需要交叉编译器?]]。 === 选择哪个编译器版本 === {{Main|Building GCC}} 建议使用最新的[[GCC]],因为它是最新和最棒的版本。 例如,如果使用GCC4.6,您可能会遇到麻烦。3构建GCC4.8。0交叉编译器。 如果您的系统编译器没有使用最新的主要GCC版本,我们建议您[[构建GCC |构建最新的GCC作为系统编译器]]。 您也可以使用较旧的版本,因为它们通常相当好。 如果您的本地系统编译器不是太旧(至少GCC4.6.0),您可能希望省去麻烦,只需为交叉编译器选择最新的次要版本(如4.6.3,如果您的系统编译器是4.6.1)。 您可以通过调用以下命令查看当前编译器版本: gcc--version</source lang=“bash”> 您可以使用较旧的主要GCC版本来构建较新的主要GCC版本的交叉编译器。 例如,GCC4.7。3可能能够构建GCC4.8。0交叉编译器。 但是,如果您想在交叉编译器中使用最新和最好的GCC版本,我们建议您首先[[构建GCC |引导最新的GCC]]作为系统编译器。 使用OS X 10.7或更早版本的个人可能希望投资构建系统GCC(输出本机Mach-O),或者升级本地LLVM/Clang安装。 10.8及以上版本的用户应该从苹果开发者网站安装命令行工具,并使用Clang交叉编译GCC。 === 要选择哪个binutils版本 === {{Main|Cross-Compiler Successful Builds}} 我们建议您使用最新和最好的[[Binutils]]版本。但是,请注意,并非所有GCC和Binutils的组合都有效。如果遇到问题,请使用与所需编译器版本大致同时发布的Binutils。您可能至少需要Binutils 2.22,或者最好是最新的2.23。2释放。在当前操作系统上安装的Binutils版本并不重要。例如,您可以通过以下命令找到binutils版本: <source lang="bash">ld --version</source> === 确定目标平台 === {{Main|Target Triplet}} 你应该已经知道了。 如果您正在学习[[Bare Bones]]教程,则希望为<tt>i686 elf</tt>构建交叉编译器。 === 关于arm none eabi gcc的注释 === apt get for Debiab/Ubuntu上有一个预构建的包gcc arm none eabi,但您不应该使用它,因为它既不包含libgcc,也不包含libgcc。也不是像stdint这样的独立C头文件。h、 <br> 相反,您应该使用<tt>arm none eabi</tt>作为$TARGET自己构建它。 == 为构建做准备 == <!-- Note how this section ([[Preparing GCC Build]]) is shared by [[Building GCC]] and [[GCC Cross-Compiler]]. --> {{:Preparing GCC Build}} == 建造 == 我们构建了一个在主机上运行的工具集,可以将源代码转换为目标系统的目标文件。 您需要决定在何处安装新编译器。 将其安装到系统目录中是危险的,也是一个非常糟糕的主意。 您还需要决定是全局安装新编译器,还是仅为您安装。 如果您只想安装它(推荐),安装到<tt>$HOME/opt/cross</tt>通常是个好主意。 如果您想在全球范围内安装它,将其安装到<tt>/usr/local/cross</tt>通常是个好主意。 请注意,我们从源目录树构建所有内容,这被认为是良好的实践。 有些软件包只支持外部构建,有些软件包只支持内部构建,有些软件包两者都支持(但可能不提供make的广泛检查)。在源目录树中构建GCC失败得很惨,至少对于旧版本是如此。 === 准备 === <source lang="bash"> export PREFIX="$HOME/opt/cross" export TARGET=i686-elf export PATH="$PREFIX/bin:$PATH" </source> 我们将安装前缀添加到当前shell会话的<tt>路径中。 这确保编译器构建能够在构建新的binutil之后检测它们。 前缀将配置构建过程,以便交叉编译器环境中的所有文件最终都位于$HOME/opt/cross中。 您可以将该前缀更改为您喜欢的任何前缀(例如,/opt/cross或$HOME/cross将是选项)。 如果您具有管理员访问权限并希望使交叉编译器工具链可供所有用户使用,则可以将其安装到/usr/local prefix中,或者如果您愿意更改系统配置,使此目录位于所有用户的搜索路径中,则可以将其安装到/usr/local/cross prefix中。从技术上讲,您甚至可以直接安装到/usr,这样您的交叉编译器将与系统编译器一起驻留,但由于以下几个原因,不建议这样做(例如,如果目标错误,可能会覆盖系统编译器,或者与系统的包管理发生冲突)。 === 比努蒂尔斯 === <!-- 这让一些人有点困惑,他们应该通过包管理获得它,并遵循上面的说明。 #如果您希望将这些包构建为binutils的一部分: mv isl-x.y.z binutils-x.y.z/isl mv cloog-x.y.z binutils-x.y.z/cloog # But reconsider: You should just get the development packages from your OS. --> <source lang="bash"> cd $HOME/src mkdir build-binutils cd build-binutils ../binutils-x.y.z/configure --target=$TARGET --prefix="$PREFIX" --with-sysroot --disable-nls --disable-werror make make install </source> 这将编译binutils(汇编程序、反汇编程序和各种其他有用的东西),可以在系统上运行,但可以以$TARGET指定的格式处理代码。 '''--disable-nls''' tells binutils not to include native language support. This is basically optional, but reduces dependencies and compile time. It will also result in English-language diagnostics, which the people on the [http://forum.osdev.org/ Forum] understand when you ask your questions. ;-) '''--with-sysroot''' tells binutils to enable sysroot support in the cross-compiler by pointing it to a default empty directory. By default, the linker refuses to use sysroots for no good technical reason, while gcc is able to handle both cases at runtime. This will be useful later on. === GCC === :''See also the [http://gcc.gnu.org/install/configure.html offical instructions for configuring gcc].'' 现在,您可以构建[[GCC]]。 <!-- 这让一些人有点困惑,他们应该通过包管理获得它,并遵循上面的说明。 #如果您希望将这些包构建为gcc的一部分: mv libiconv-x.y.z gcc-x.y.z/libiconv#Mac OS x用户 mv gmp-x.y.z gcc-x.y.z/gmp mv mpfr-x.y.z gcc-x.y.z/mpfr mv mpc-x.y.z gcc-x.y.z/mpc mv isl-x.y.z gcc-x.y.z/isl mv cloog-x.y.z gcc-x.y.z/cloog #但请重新考虑:您应该从操作系统中获取开发包。 --> <source lang="bash"> cd $HOME/src # The $PREFIX/bin dir _must_ be in the PATH. We did that above. which -- $TARGET-as || echo $TARGET-as is not in the PATH mkdir build-gcc cd build-gcc ../gcc-x.y.z/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --enable-languages=c,c++ --without-headers make all-gcc make all-target-libgcc make install-gcc make install-target-libgcc </source> We build [[libgcc]], a low-level support library that the compiler expects available at compile time. Linking against [[libgcc]] provides integer, floating point, decimal, stack unwinding (useful for exception handling) and other support functions. Note how we are ''not'' simply running <tt>make && make install</tt> as that would build way too much, not all components of gcc are ready to target your unfinished operating system. '''--disable-nls''' is the same as for binutils above. '''--without-headers''' tells [[GCC]] not to rely on any C library (standard or runtime) being present for the target. '''--enable-languages''' tells [[GCC]] not to compile all the other language frontends it supports, but only C (and optionally C++). It will take a while to build your cross-compiler. If you are building a cross compiler for x86-64, you may want to consider building Libgcc without the "red zone": [[Libgcc_without_red_zone]] == 使用新编译器 == 现在您有了一个“裸”交叉编译器。它还没有访问C库或C运行时的权限,因此您不能使用任何标准包含或创建可运行的二进制文件。但是编译不久将要制作的内核就足够了。您的工具集驻留在$HOME/opt/cross(或您设置的<tt>$PREFIX</tt>中)。例如,您有一个GCC可执行文件,安装为<tt>$HOME/opt/cross/bin/$TARGET GCC</tt>,它为您的目标创建程序。 现在,您可以通过调用以下命令来运行新编译器: <source lang="bash">$HOME/opt/cross/bin/$TARGET-gcc --version</source> 请注意此编译器如何“无法”编译普通C程序。只要你想包含任何标准头,交叉编译器就会抛出错误(除了少数几个真正独立于平台的、由编译器自己生成的头)。这是非常正确的-您还没有针对目标系统的标准库! C标准定义了两种不同的执行环境——“独立”和“托管”。虽然对于一般的应用程序程序员来说,这个定义可能相当模糊,但在进行操作系统开发时却非常明确:内核是“独立的”,在用户空间中所做的一切都是“托管的”。“独立”环境只需要提供C库的一个子集:float。h、 iso646。h、 限制。h、 stdalign。h、 斯塔格。h、 stdbool。h、 stddef。h、 斯特丁。h和stdnoreturn。h(从C11开始)。所有这些都由typedef s和#define s“only”组成,因此您可以在不使用单个函数的情况下实现它们。看到c文件了。 要通过调用<tt>$TARGET gcc</tt>使用新编译器,请通过键入以下内容将<tt>$HOME/opt/cross/bin</tt>添加到<tt>$PATH</tt>: <source lang="bash">export PATH="$HOME/opt/cross/bin:$PATH"</source> 此命令将把新编译器添加到此shell会话的路径中。 如果希望永久使用,请将PATH命令添加到<tt>~/。配置文件</tt>配置shell脚本或类似文件。 有关更多信息,请参阅shell文档。 现在,您可以继续完成[[Bare Bones]]教程变体,并使用新的交叉编译器完成它。 如果您构建了一个新的GCC版本作为系统编译器,并使用它来构建交叉编译器,那么您现在可以安全地卸载它,除非您希望继续使用它。 == 故障排除 == 通常,“验证”您是否仔细阅读了说明并准确键入了命令。 不要跳过说明。 如果您使用一个新的shell实例,如果您没有通过将其添加到shell概要文件中使其永久化,那么您必须再次设置PATH变量。 如果编译似乎真的搞砸了,请键入make distclean,然后重新开始make过程。 确保您的un archiever不会更改换行符。 ==== ld: cannot find -lgcc ==== 您指定要通过<tt>-lgcc</tt>'开关将GCC低级运行库链接到可执行文件中,但忘记构建并正确安装库<br> 如果在安装libgcc时没有收到警告或错误,但仍然存在问题,则可以在项目中复制库并将其链接到<tt>-L.-lgcc</tt><br> libgcc位于$PREFIX/lib/gcc/$TARGET/<gcc version>/libgcc。A. ==== Binutils 2.9 ==== 按字母顺序排列在顶部或底部的内容不一定是最新版本。 在2.9之后是2.10、2.11、2.12,然后是更多更新的版本,并且越来越有可能构建或支持您选择的GCC版本。 ==== Building GCC: 应该包含系统头的目录不存在 ==== You might encounter this error when building <tt>mingw32</tt> targets, for example <tt>x86_64-w64-mingw32</tt>. The offending directory that can't be found is <tt>$SYSROOT/mingw/include</tt>. 如果查看sysroot,您当然会意识到不存在这样的文件夹。 The solution is simply to create the empty folders: <source lang="bash"> mkdir -p $SYSROOT/mingw/include mkdir -p $SYSROOT/mingw/lib </source> 这将允许构建继续进行。 发生这种情况的原因是<tt>mingw32</tt>(以及mingw本身)将<tt>包含路径和<tt>库路径配置为<tt>/mingw/INCLUDE</tt>和<tt>/mingw/lib</tt>,而不是默认的<tt>/usr/INCLUDE</tt>和<tt>/usr/lib</tt>。 我无法理解为什么即使这些文件夹中不需要任何东西,构建也会失败,为什么不只是创建它们。 === GCC libsanitizer未能生成 === 有时GCC无法构建libsanitizer,如果发生这种情况,请在configure命令中追加<tt>--disable libsanitizer</tt><br> 这仅适用于构建托管编译器。 == 更高级 == 在相当长的一段时间内,使用这个简单的交叉编译器就足够了,但在某些时候,您会希望编译器自动包含您自己的系统头和库。为您自己的操作系统构建[[OS-Specific Toolchain | OS-Specific Toolchain]]就是一条出路。 == 另见 == === 文章 === *[[Cross-Compiler Successful Builds]] - combinations of GCC and Binutils which have been shown to work with this tutorial by OSDev.org members. *[[Target Triplet]] - on target triplets and their use *[[OS Specific Toolchain]] - going a step further and adding your own target. *[[LLVM Cross-Compiler]] - some compilers make things much easier. *[[Canadian Cross]] - making things yet more complicated. === 外部链接 === *http://kegel.com/crosstool has a popular example of a script that automatically downloads, patches, and builds binutils, gcc, and glibc for known platforms. *http://gcc.gnu.org/onlinedocs/gccint/Libgcc.html - Summary of the support functions you get when you link with libgcc. *http://forums.gentoo.org/viewtopic.php?t=66125 - Compiling Windows applications under Linux *http://www.libsdl.org/extras/win32/cross/README.txt - dito *https://github.com/travisg/toolchains - Another script for building simple cross compilers *https://www.youtube.com/watch?v=aESwsmnA7Ec - A walkthrough of how to build a cross-compiler using Cygwin on Windows. *https://github.com/Cheapskate01/Cross-Compiler-Build-Script - A dead-simple script that Binutils and Gcc for you. [[Category:Compilers]] [[Category:Tutorials]] [[de:Cross-Compiler]] === Prebuilt Toolchains === These were built by people in the OSdev community for their own building needs and shared at will, without guaranteeing any support or that it will even work on your setup. YMMV. '''Latests versions for Linux (many arch)''' * [https://www.kernel.org/pub/tools/crosstool/ kernel.org various hosts/targets] '''For Linux i686 host''' * [https://drive.google.com/open?id=1zcFAmxi7mtOwhMaKE36IsjLRB0uEv17p aarch64-elf 9.3.0 target] * [https://drive.google.com/open?id=1uEFrOJPxy13vxWCy-5IbxCJAs5TRdtTE arm-eabi 9.3.0 target] * [https://drive.google.com/open?id=13Kg6Xd8acUnwUoZQBTOjwAQQeGOeYzVz i386-elf 9.3.0 target] * [https://drive.google.com/open?id=1F5RsfIEfcpRYAqu5UuGTKgkMa3eBsXnP i486-elf 9.3.0 target] * [https://drive.google.com/open?id=1PdEFqMEJf_Vuf0drO1m8bjlrsudAmI5k i586-elf 9.3.0 target] * [https://drive.google.com/open?id=1g9jzEIn8CB6ZiVrc0uxbZprepcX4gYex i686-elf 9.3.0 target] * [https://drive.google.com/open?id=1xIeNJwD0Do-REFxzCLOkMIVYI3HGJUTX mips-elf 9.3.0 target] * [https://drive.google.com/open?id=10UuOf9LW4y9WEJcTWrMZW0GAlOWh9KG7 mips64-elf 9.3.0 target] * [https://drive.google.com/open?id=1oW6UWr-OY22EgtyuXovORUtHeVLkL-Tw m64k-elf 9.3.0 target] * [https://drive.google.com/open?id=1H3Cbq4D_kjROB-7Otiisa-mac_9FYUM- powerpc-elf 9.3.0 target] * [https://drive.google.com/open?id=1kFGNHWhcBD9cf8X2y-BW49Su04lMa1ev sh-elf 9.3.0 target] * [https://drive.google.com/open?id=1XzQDKTK35EX8b380bPRbuhX1GPKrtI77 sparc-elf 9.3.0 target] * [https://drive.google.com/open?id=1pU8bS0McTyRUTHb1b_c8ZVa2Ka_XeeEp x86_64-elf 9.3.0 target] * [https://drive.google.com/open?id=1cqk9RzY3QXQuaS-YdIWtCECKL81pcsv- xtensa-elf 9.3.0 target] '''For Linux x86_64 host''' * [https://drive.google.com/file/d/0Bw6lG3Ej2746STJaM2dNbC05elE/view?usp=sharing i386-elf & i686-elf 7.1.0 target uploaded by TheAlmostGenius] * [https://newos.org/toolchains/i386-elf-7.5.0-Linux-x86_64.tar.xz i386-elf 7.5.0 target] * [https://newos.org/toolchains/x86_64-elf-7.5.0-Linux-x86_64.tar.xz x86_64-elf 7.5.0 target] * [https://newos.org/toolchains/aarch64-elf-7.5.0-Linux-x86_64.tar.xz aarch64-elf 7.5.0 target] * [https://newos.org/toolchains/arm-eabi-7.5.0-Linux-x86_64.tar.xz arm-eabi 7.5.0 target] * [https://newos.org/toolchains/m68k-elf-7.5.0-Linux-x86_64.tar.xz m68k-elf 7.5.0 target] * [https://newos.org/toolchains/microblaze-elf-7.5.0-Linux-x86_64.tar.xz microblaze-elf 7.5.0 target] * [https://newos.org/toolchains/mips-elf-7.5.0-Linux-x86_64.tar.xz mips-elf 7.5.0 target] * [https://newos.org/toolchains/nios2-elf-7.5.0-Linux-x86_64.tar.xz nios2-elf 7.5.0 target] * [https://newos.org/toolchains/powerpc-elf-7.5.0-Linux-x86_64.tar.xz powerpc-elf 7.5.0 target] * [https://newos.org/toolchains/riscv32-elf-7.5.0-Linux-x86_64.tar.xz riscv32-elf 7.5.0 target] * [https://newos.org/toolchains/riscv64-elf-7.5.0-Linux-x86_64.tar.xz riscv64-elf 7.5.0 target] * [https://newos.org/toolchains/sh-elf-7.5.0-Linux-x86_64.tar.xz sh-elf 7.5.0 target] * [https://newos.org/toolchains/sparc-elf-7.5.0-Linux-x86_64.tar.xz sparc-elf 7.5.0 target] The packages from phillid.tk below have been shrunk to about 10 MiB for each pair of packages (GCC & Binutils). Please note that this has been achieved by enabling only the C front-end for GCC. If you're going to write your OS in any language but C or Assembly, these packages aren't for you. These are actually Pacman packages, but untarring them to / and rm-ing /.MTREE and other clutter dotfiles contained in the package will work the same. '''For Windows host''' * [https://drive.google.com/file/d/0B85K_c7mx3QjUnZuaFRPWlBIcXM/edit?usp=sharing i686-elf 4.8.2 target] * [https://mega.co.nz/#F!bBxA3SKJ!TDL4i1NjaZKd4YMo9p2U7g x86_64-elf 5.1.0 target] * [https://github.com/lordmilko/i686-elf-tools i686-/x86_64-elf 7.1.0 target + GDB] '''For Windows Subsystem for Linux (Beta) host''' * [http://www.bin-os.com/i686-elf-6.1.0.tar.gz i686-elf 6.1.0 target] (extracts to a directory called "cross", don't forget to install 'make' - I would recommend "apt-get install build-essential" to also add additional useful tools) '''For macOS host''' x86_64-elf [https://formulae.brew.sh/formula/x86_64-elf-binutils binutils] and [https://formulae.brew.sh/formula/x86_64-elf-gcc gcc] (canonical target name x86_64-pc-elf) can be installed from [https://brew.sh homebrew]: <pre> $ brew install x86_64-elf-gcc </pre> i686-elf toolchain is also [https://formulae.brew.sh/formula/i686-elf-gcc available] in homebrew. '''ARM prebuilt toolchains for multiple host platforms''' ARM provides it's own prebuilt toolchain based upon GNU utilities for development targeting ARM systems. * [https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads GNU ARM Embedded Toolchain] '''Docker image''' * [https://hub.docker.com/r/joshwyant/gcc-cross/ i686-elf 8.1.0 target]
本页使用的模板:
Preparing GCC Build
(
查看源代码
)
模板:Eq
(
查看源代码
)
模板:Eq1
(
查看源代码
)
模板:FirstPerson
(
查看源代码
)
模板:If
(
查看源代码
)
模板:Main
(
查看源代码
)
模板:NoteBox
(
查看源代码
)
模板:Rating
(
查看源代码
)
模板:Show1
(
查看源代码
)
模板:Wikitable
(
查看源代码
)
返回至“
GCC Cross-Compiler
”。
导航菜单
个人工具
登录
命名空间
页面
讨论
变体
已展开
已折叠
查看
阅读
查看源代码
查看历史
更多
已展开
已折叠
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
工具
链入页面
相关更改
特殊页面
页面信息