【嵌入式】使用Cross Toolchain构建交叉工具链

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

Preface

   前面编译linux内核的时候,用各种cross版本都不行啊,真是纠结,于是就想着自己也要会编译交叉工具的方法,然后各种尝试,各种问题啊,最后还是没解决(还有其它事情),步骤我都走熟了,记下来吧



Preparation

root@lcw:/home/mystery/cross_toolchain# ls
binutils-2.15.tar.bz2  glibc-2.3.2.tar.bz2
crosstool-0.43         glibc-linuxthreads-2.3.2.tar.bz2
crosstool-0.43.tar.gz  linux-2.6.14.tar.bz2
gcc-4.1.0.tar.bz2      linux-libc-headers-2.6.12.0.tar.bz2


    后面还下载了gdb-6.5.tar.bz2
 
Step1
   当然是解压crosstool-0.42.tar.gz
Step2
   我们需要自己配置文件,我取名为arm.sh
< arm.sh>
#!/bin/sh
set -ex
TARBALLS_DIR=/home/mystery/cross_toolchain/crossTools # 定义工具链源码所存放位置。
RESULT_TOP=/opt/crosstool            # 定义工具链的安装目录
export TARBALLS_DIR RESULT_TOP
GCC_LANGUAGES="c,c++"                # 定义支持C, C++语言
export GCC_LANGUAGES
# 创建/opt/crosstool目录
mkdir -p $RESULT_TOP
# 编译工具链,该过程需要数小时完成。
eval 'cat arm.dat gcc-4.1.0-glibc-2.3.2.dat' sh all.sh --notest
echo Done.



Step3

我们还需要改二个配置文件gcc-4.1.0-glibc-2.3.2.dat与arm.dat,这个根据自己下载的文件需要来改
<gcc-4.1.0-glibc-2.3.2.dat>
BINUTILS_DIR=binutils-2.15
GCC_DIR=gcc-3.3.6
GLIBC_DIR=glibc-2.3.2
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2
LINUX_DIR=linux-2.6.14
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0


<arm.dat>

KERNELCONFIG='pwd'/arm.config # 内核的配置
TARGET=arm-linux-                # 编译生成的工具链名称
TARGET_CFLAGS="-O"                # 编译选项



Step4


   执行脚本,将Crosstool的脚本文件和配置文件准备好之后,开始执行arm.sh脚本来编译交叉编译工具。如果顺利的话,这步经过数个小时后,就能生成交叉编译工具了,数个小时啊,准备迎接各种error吧


<Question1>

+ abort Don't run all.sh or crosstool.sh as root, it's dangerous
+ echo Don't run all.sh or crosstool.sh as root, it's dangerous
Don't run all.sh or crosstool.sh as root, it's dangerous


<Solution>:这脚本够纠结的,用普通帐户时,执行命令又权限不够,用root帐户,又不让你运行,那么

   不用root帐户又有权限的办法就是chmod,自己给自己权限吧,我是chmod+chgrp+chown都改了

<Question2>

patching file linuxthreads/sysdeps/unix/sysv/linux/arm/sysdep-cancel.h 
grep: /home/mystery/cross_toolchain/crosstool-0.43/build/arm-linux/gcc-4.1.0-glibc-2.3.2/binutils-2.16.1/patches/README: No such file or directory 
+ test  =  
+ [ -d /opt/crosstool/gcc-4.1.0-glibc-2.3.2/arm-linux ] 
+ mkdir -p /opt/crosstool/gcc-4.1.0-glibc-2.3.2/arm-linux 
mkdir: cannot create directory `/opt/crosstool/gcc-4.1.0-glibc-2.3.2': Permission denied


 
Solution还是权限问题,opt目录是存放第三软件的目录,在这个目录下进行写操作需要root权限, 但是又不能用root执行,和前面一样,自己给自己权限吧,我也是chgrp+chown+chmod都用了
mystery@lcw:/opt$ ls -l
total 36
drwxr-xr-x 2 root       root   4096 Apr  7 20:26 crosstool
drwxrwsr-x 9 messagebus users  4096 Feb 25 12:39 eclipse
drwxr-xr-x 3 root       root   4096 Apr  4 10:47 google
drwxr-xr-x 8        500   500  4096 Mar  1 19:36 jdk1.7.0_17
drwxr-xr-x 3 root       root   4096 Apr  4 11:25 kingsoft
drwx------ 2 root       root  16384 Apr  4 09:32 lost+found
mystery@lcw:/opt$ chgrp mystery crosstool/
chgrp: changing group of `crosstool/': Operation not permitted
mystery@lcw:/opt$ sudo chgrp mystery crosstool/
[sudo] password for mystery: 
mystery@lcw:/opt$ sudo chown mystery crosstool/
mystery@lcw:/opt$ ls -l
total 36
drwxr-xr-x 2 mystery    mystery  4096 Apr  7 20:26 crosstool
drwxrwsr-x 9 messagebus users    4096 Feb 25 12:39 eclipse
drwxr-xr-x 3 root       root     4096 Apr  4 10:47 google
drwxr-xr-x 8        500     500  4096 Mar  1 19:36 jdk1.7.0_17
drwxr-xr-x 3 root       root     4096 Apr  4 11:25 kingsoft
drwx------ 2 root       root    16384 Apr  4 09:32 lost+found


<Question3>

/home/mystery/cross_toolchain/crosstool-0.43/crosstool.sh: 110:
/home/mystery/cross_toolchain/crosstool-0.43/crosstool.sh: bison: not found 
crosstool: You don't have bison installed


Solution这种是最简单的,缺什么装什么,不过最好把这个记一下,不然以后装多了,你都不知道自己电脑上装了些什么

mystery@lcw:~/cross_toolchain/crosstool-0.43$ sudo apt-get install bison


<Question4>

oss_toolchain/crosstool-0.43/crosstool.sh: flex: not found
crosstool: You don't have flex installed


solution同上

mystery@lcw:~/cross_toolchain/crosstool-0.43$ sudo apt-get install flex


<Question5>

checking for pwd... /bin/pwd
checking for arm-linux-gcc... gcc
checking version of gcc... 4.6.3, bad
checking for gnumake... no
checking for gmake... no
checking for make... make
checking version of make... 3.81, ok
configure: error:
*** These critical programs are missing or too old: gcc
*** Check the INSTALL file for required versions
    意思是说,我系统的GCC版本太高了(4.6.3,目录最高版本,也是系统默认版本),版本太高了也不好啊,由于crosstools最后只支持gcc-4.1.0版本的,那我去下个GCC-4.1.0的吧。换了几个源,都没有找到4.1的,只好去网上找了
 
   然后就开始发装,各种依赖关系啊,各种装不上
mystery@lcw:~/Downloads$ dpkg -l "*gcc*" 
Desired=Unknown/Install/Remove/Purge/Hold 
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend 
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad) 
||/ Name           Version        Description 
+++-==============-==============-============================================ 
ii  gcc            4:4.6.3-1ubunt GNU C compiler 
un  gcc-4.1        <none>         (no description available) 
ri  gcc-4.1-base   4.1.2-27ubuntu The GNU Compiler Collection (base package) 
un  gcc-4.1-doc    <none>         (no description available) 
un  gcc-4.1-locale <none>         (no description available) 
un  gcc-4.1-multil <none>         (no description available) 
un  gcc-4.3        <none>         (no description available) 
un  gcc-4.4        <none>         (no description available) 
un  gcc-4.4-base   <none>         (no description available) 
un  gcc-4.5        <none>         (no description available) 
un  gcc-4.5-base   <none>         (no description available) 
ii  gcc-4.6        4.6.3-1ubuntu5 GNU C compiler 
ri  gcc-4.6-base   4.6.3-1ubuntu5 GCC, the GNU Compiler Collection (base packa 
un  gcc-4.6-doc    <none>         (no description available) 
un  gcc-4.6-locale <none>         (no description available) 
un  gcc-4.6-multil <none>         (no description available) 
un  gcc-doc        <none>         (no description available) 
un  gcc-multilib   <none>         (no description available) 
ri  libgcc1        1:4.6.3-1ubunt GCC support library 
un  libgcc1-dbg    <none>         (no description available)


   最多装上了gcc-4.1,及base,后面因为依赖关系涉及到lib和libgcc,看网上说的,如果直接完全卸载

   这些东西可能会导致系统出错, 纠结,那就老老实实地下个gcc-4.1.0的源码编译吧



Step5


   解压gcc-4.1.0的源码,然后执行

mystery@lcw:~/Downloads$ # ./configure --prefix=/opt/gcc-4.1&& make


   这里我也是将gcc安装到opt目录下的,相应权限问题如上面一样解决,还有新的问题等着呢


<Question6>

WARNING: `makeinfo' is missing on your system.  You should only need it if
         you modified a `.texi' or `.texinfo' file, or any other file
         indirectly affecting the aspect of the manual.  The spurious
         call might also be the consequence of using a buggy `make' (AIX,
         DU, IRIX).  You might want to install the `Texinfo' package or
         the `GNU make' package.  Grab either from any GNU archive site.


solution系统不包含“makeinfo”,好吧,安装就是了嘛。
   安装之后,再次编译,仍然如此,纠结了,老规矩,百度解决不了,找谷歌(身边没人玩这个啊。。。。。)


<Question7>

   原来是版本问题,不能识别
mystery@lcw:~/Downloads/gcc-4.1.0$ makeinfo --version
makeinfo (GNU texinfo) 4.13
   系统只支持4.2~4.9的版本,我4.13的版本,当然不支持啦
solution这个makeinfo的调用主要是在makefile里面实现的,现在我们需要在makefile里面找到这行代码
   然后改正过来
 
如上所示,makefile是通过扩展的正则表达式来匹配的(关于正则表达式,这里就不多说了啊),但是细心的朋友会看到,三千多行啊,其实这还没到这个文件的中间部分呢,怎么找呢?
这里我比较幸运,刚好两步就找到了(修改这个文件也需要权限的哈):
第一步,进入makefile,L_Shift+G,然后搜索/texinfo
第二步,然后再向上搜索?texinfo,好了,就到了上图的位置

   然后就开始修改这个用于匹配的正则吧,按图上写的就可以了



Step6


   然后再次编译,看着不断变化的字符,慢慢等吧 过了十到二十分钟吧,一屏幕的错误,天啊

/usr/include/dlfcn.h:103: error: expected declaration specifiers or ‘...’ before ‘Dl_info’ 
/usr/include/dlfcn.h:104: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘__THROW’ 
/usr/include/dlfcn.h:126: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘__THROW’ 
/usr/include/dlfcn.h:176: error: storage class specified for parameter ‘Dl_serpath’ 
/usr/include/dlfcn.h:184: error: expected specifier-qualifier-list before ‘Dl_serpath’ 
/usr/include/dlfcn.h:185: error: storage class specified for parameter ‘Dl_serinfo’ 
/usr/include/dlfcn.h:189: error: expected declaration specifiers before ‘__END_DECLS’ 
In file included from ../.././gcc/crtstuff.c:92: 
/usr/include/link.h:35:63: error: bits/elfclass.h: No such file or directory 
/usr/include/link.h:36:23: error: bits/link.h: No such file or directory 
In file included from ../.././gcc/crtstuff.c:92: 
../.././gcc/crtstuff.c:239: error: storage class specified for parameter ‘__cxa_finalize’ 
../.././gcc/crtstuff.c:239: error: weak declaration of ‘__cxa_finalize’ must be public 
../.././gcc/crtstuff.c:262: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token 
../.././gcc/crtstuff.c:305: error: expected declaration specifiers before ‘asm’ 
../.././gcc/crtstuff.c:319: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token 
../.././gcc/crtstuff.c:345: error: expected declaration specifiers before ‘asm’ 
../.././gcc/crtstuff.c:345: error: old-style parameter declarations in prototyped function definition 
../.././gcc/crtstuff.c:345: error: expected ‘{’ at end of input 
make[2]: *** [crtbegin.o] Error 1 
make[2]: Leaving directory `/home/mystery/Downloads/gcc-4.1.0/host-i686-pc-linux-gnu/gcc' 
make[1]: *** [all-gcc] Error 2 
make[1]: Leaving directory `/home/mystery/Downloads/gcc-4.1.0' 
make: *** [all] Error 2


   省略了N行错误啊,找到最后几行

error: old-style parameter declarations in prototyped function definition
error: expected ‘{’ at end of input


   这个错误以前在电脑上代码时也遇见过,应该就是哪里少写了分号或者半角和全角的格式没有对
这是指这个源代码中有error吗?天啊,我是没那个能力在这里面去翻了,也没有时间啊,事情还多着呢。。。
   下面的步骤就有时间再验证吧


Step7

   make之后就是安装了,如果顺利的话make install就过去了

Step8

   如果以前有另外版本的gcc,这时只用把新安装的路径链接到gcc就可以了

ln -s /…/gcc-4.1/bin/gcc gcc4
ln -s /…/gcc-4.1/bin/g++ g++4

    如果没有的话,就需要自己修改环境变量了


 

感悟


这就是自学啊,遇到任何问题的时候,我身边根本没有人能和我讨论这方面的东西,这样有好处,也有坏处, 好处当然是:锻炼自学能力和解决问题的能力, 缺点就是:周期太长了啊
 
   不过很无奈的说:我也不想这样
软件工程出身,对于软件方面来说,自己基础还算不错的,入驻嵌入式,就是对自己提出的一个更高的要求,这个要求就是打通软件和硬件的桥梁,做到一个完整的知识结构体系
因为我并不满足于计算机中的产品,我希望有能改变生活的产品
 
   开学的时候,我和老师请假去参加培训,但是因为才大三,老师不让我走,硬性条件让我只能再次自学……
对于逛论坛这种事,对嵌入式来说,不像软件那么有意义,因为很多东西和自己配置的环境及硬件条件有关,别人的,只能是参考像这整个步骤,书上绝对是一路顺风走过来的
   出现问题了,百度一下,你遇到的问题,别人也遇到过,但是同样的问题,别人的解决方法,却不一定也适合你,就这么简单
哎,事有轻重缓急,我还有其它事情,这问题就先放在这里了,我先拿cross-3.2的工具用着吧
记录里面也有一些问题的解决方法,算是教训吧


 

本文出自 “成鹏致远” 博客,请务必保留此出处http://infohacker.blog.51cto.com/6751239/1174081

编译Uboot 好多问题啊     这话还要从开始编译 Uboot 开始说起。    在看了一些介绍 Uboot 及其原理的文章之后,便在网上搜如何将其移植到开发板上。当然,第一步就是交叉编译,得有环境啊,也就是所需要的交叉编译工具链(toolchains)arm-linux-。    我下载的是 Uboot 1.3.0 ,准备移植到阳初的S3C2440 板子上。按照网上的一些说明,改一下 Uboot 中的2410 的配置文 阅读详情

相关推荐

linux 安装toolchain工具

Cross Toolchain-交叉编译工具链  读者可能会有疑问,为什么要用交叉编译器?交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序,比如在PC平台(X86 CPU)上编译出能运行在以ARM为内核的CPU平台上的程序,编译得到的程序在X86 C

tang_12的专栏 7704

GLib库安装与简析

GLib是GTK+和GNOME工程的基础底层核心程序库,是一个综合用途的实用的轻量级的C程序库, 它提供C语言的常用的数据结构的定义、相关的处理函数,有趣而实用的宏, 可移植的封装和一些运行时机能,如事件循环、线程、动态调用、对象系统等的API。 它能够在类UNIX的操作系统平台(如LINUX, HP-UNIX等),WINDOWS,OS2和BeOS等操作系统台上运行。 一、GLib

北雨南萍 6742

cross compiler Toolchain 交叉编译工具链 的建立

cross compiler Toolchain 交叉编译工具链 的建立

skdhfdfc的博客 1906

cross gcc 与linux gcc,crosstool编译过程中gcc版本问题

crosstool编译过程中gcc版本问题在使用crosstool构建工具链的过程中,出现了如下问题,导致arm-linux-gcc没有生成:> checking version of gcc... 4.0.0, bad> checking for gnumake... no> checking for gmake... gmake> checking version of...

weixin_35720882的博客 1138

AI智能棋盘依托GCC ARM Toolchain构建开源工程

本文介绍如何基于GCC ARM Toolchain与CMake构建AI智能棋盘的嵌入式工程,涵盖启动代码、链接脚本、自动化构建及FreeRTOS多任务设计,实现从传感器采集到AI联动的完整流程,强调开源工具链在边缘AI设备中的关键作用。

weixin_42599908的博客 733

Cross Toolchain-交叉编译工具链

交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序,比如在PC平台(X86 CPU)上编译出能运行在以ARM为内核的CPU平台上的程序,编译得到的程序在X86 CPU平台上是不能运行的,必须放到ARM CPU平台上才能运行,虽然两个平台用的都是Linux系统。这种方法在异平台移植和嵌入式开发时非常有用。相对与交叉编译,平常做的编译叫本地编译,也就是在当前平台编译,编译得

1717

关于cross toolchain

【整理】关于Toolchain,cross toolchain,cross compiler 原文地址: http://www.crifan.com/summary_about_toolchain_cross_compiler/ 什么是工具链 首先,要解释明白什么是工具链的话,得先简单介绍一下软件开发。 整个软件开发的过程,可以简单解释为,写出软件源码,用编译器将其编译为目标文件,然后

baiyvwuxia的专栏 936

CLion实战:自定义ToolChain实现跨平台构建与调试

本文详细介绍了如何在CLion中自定义ToolChain实现跨平台构建与调试,特别适用于嵌入式开发中x86与ARM架构的切换需求。通过配置自定义构建命令、跨平台ToolChain和断点调试,开发者可以高效管理多平台项目,提升开发效率。文章还提供了实用技巧和常见问题解决方案,帮助开发者快速上手CLion的ToolChain功能。

weixin_42537142的博客 329

ARMv7嵌入式开发终极指南:cross工具与Cortex-A系列处理器完美适配

嵌入式系统开发领域,ARMv7架构的Cortex-A系列处理器凭借其出色的性能和能效比,已成为众多物联网设备和工业控制系统的首选。然而,跨平台编译环境的配置往往让开发者头疼不已。幸运的是,cross工具的出现彻底改变了这一现状,为ARMv7嵌入式开发带来了革命性的便利。🎯 cross是一个专为Rust语言设计的"零配置"跨编译工具,能够无缝支持多种ARMv7架构目标平台,包括armv7-un

gitblog_00306的博客 1178

一个参数搞定交叉编译:actions-rs/cargo如何无缝集成cross构建ARMv7目标

actions-rs/cargo 是一个在 GitHub Actions 中运行 Rust `cargo` 命令的 GitHub Action,只需加上 `use-cross: true` 一个参数,就能自动安装并调用 `cross` 工具,轻松完成 ARMv7 等目标平台的交叉编译,让 Rust 项目的 CI 变得又快又稳 🚀 ## 痛点:Rust 交叉编译为什么难? 给嵌入式设备(树莓派

gitblog_01028的博客 598

从源码到执行:riscv-gnu-toolchain构建RISC-V应用的完整流程

riscv-gnu-toolchain是RISC-V架构的GNU工具链,包含GCC编译器等组件,支持构建ELF/Newlib和Linux-ELF/glibc两种模式的工具链,是开发RISC-V应用的重要工具。 ### 一、获取riscv-gnu-toolchain源码 要开始使用riscv-gnu-toolchain,首先需要获取项目源码。该项目使用子模块,但会在需要时自动获取,无需手动递归克

gitblog_00496的博客 958

linux driver ------ 交叉工具链cross toolchain

在 ARM Linux 的开发中,人们趋向于使用 Linaro(http://www.linaro.org/)工具链团队维护的 ARM 工具链,它以每月一次的形式发布新的版本,编译好的可执行文件可以网站下载。Linaro 是 ARM Linux 领域中最著名最具技术成就的开源组织。 命名含义解释: gcc-linaro-*x86_64_arm-linux-gnueabihf...

dee53994040的博客 282

Rust嵌入式交叉编译工具cross环境变量配置指南

嵌入式开发领域,交叉编译是不可或缺的重要环节。rust-embedded/cross项目为Rust开发者提供了强大的交叉编译解决方案。本文将深入解析cross工具的环境变量配置机制,帮助开发者更好地掌控交叉编译环境。 ## 核心环境变量解析 cross工具通过一系列环境变量实现高度可配置化,这些变量主要分为以下几类: ### 1. 容器引擎配置 - `CROSS_CONTAINER_EN...

gitblog_00659的博客 405

[学习笔记]使用GNU Toolchain在STM32上跑起一个最小OS

Week #7 #8 開發過程 STM32 程式發開:以GNU Toolchain ld參考資料《Using LD, the GNU linker》《Linkers & Loaders》 Make參考資料《Managing Projects with GNU Make》 ld文檔沒看太懂@@,再細看一下這一頁: ftp://ftp.gnu

john0517ace的博客 1522

linux c++ toolchain 配置文件,一步一步建立基于ARM+Linux的cross toolchain

声明:本文在参考网上资料的基础上,以梁元恩的《如何为嵌入式开发建立交叉编译环境》为蓝本修改而成。对于自己在建立过程中遇到的问题进行了详细的说明,本文随自己学习的深入会进行相应的更新。1引言由于一般嵌入式开发系统存储容量有限,在裁减和定制Linux,运用于嵌入式系统前,通常需要在PC机上建立一个用于目标机的交叉编译环境,也就是将各种二进制工具程序集成为工具链,其中包括如GNU的链接器(ld)、GNU...

weixin_35669769的博客 1614
上一篇: 【嵌入式】S3C2410平台移植linux 2.6.14内核
下一篇: 【嵌入式】使用minicom连接arm开发板错误
成鹏致远
博客等级 码龄14年 50粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值