macosx 交叉编译环境


原文链接: macosx 交叉编译环境

直接可用的linux交叉编译环境, 解压加入环境变量即可使用
https://github.com/Philon/arm-mac-linux-gnueabihf

Mac OSX EI Capitan(10.11.5)上使用crosstool-ng 1.22.0 建立树莓派2B的编译环境 – 默默的点滴

交叉编译

git clone https://github.com/crosstool-ng/crosstool-ng.git

用crosstool-ng构建交叉工具编译链 - cztqwan的博客 - CSDN博客
Mac OSX EI Capitan(10.11.5)上使用crosstool-ng 1.22.0 建立树莓派2B的编译环境 – 默默的点滴

thinkski/osx-arm-linux-toolchains: Pre-built ARM/Linux cross-compilers for Mac OS X

https://github.com/thinkski/osx-arm-linux-toolchains

Toolchain GCC GDB Linux headers glibc binutils
aarch64-unknown-linux-gnu 8.3.0 8.2.1 4.20.8 2.29 2.32
arm-unknown-linux-gnueabi 8.3.0 8.2.1 4.20.8 2.29 2.32
armv8-rpi3-linux-gnueabihf 8.3.0 8.2.1 4.20.8 2.29 2.32

针对64位系统 aarch64-unknown-linux-gnu

针对32位系统低端CPU armv(海思,mdm7606) arm-unknown-linux-gnueabi

ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 2.6.16, not stripped

针对32位系统高端CPU(树莓派) armv8-rpi3-linux-gnueabihf

ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0, with debug_info, not stripped

2. 通过brew 安装

brew tap SergioBenitez/osxct;
brew install aarch64-none-elf;
brew install FiloSottile/musl-cross/musl-cross --with-aarch64;

aarch64-none-elf

Architecture: ARM AArch64, bare metal, unhosted
Object Type: ELF
GCC: 7.2.0
binutils: 2.29.1
Also Known As: aarch64-rpi3-elf

树莓派

brew install arm-linux-gnueabihf-binutils llvm rsync

【总结】crosstool-ng使用心得和注意事项 – 在路上

利用Crosstool-ng制作交叉编译工具链 - andy_fly - 博客园

通过ct-ng编译

    echo "Creating ARM toolchain $ToolChainName..."
    cd /Volumes/$ImageName
    mkdir $ToolChainName
    cd $ToolChainName

    # the process seems to opena a lot of files at once. The default is 256. Bump it to 1024.
    ulimit -n 1024

    echo "Selecting arm-unknown-linux-gnueabi toolchain..."
    PATH=$BrewHome/bin:$PATH ../${CrossToolVersion}/ct-ng $ToolChainName

    echo "Cleaning toolchain..."
    PATH=$BrewHome/bin:$PATH ../${CrossToolVersion}/ct-ng clean

    echo "Copying my working toolchain configuration"
    cp $InstallBase/${ToolChainName}.config ./.config

    echo "Manually Configuring toolchain"
    echo "        Select 'Force unwind support'"
    echo "        Unselect 'Link libstdc++ statically onto the gcc binary'"
    echo "        Unselect 'Debugging -> dmalloc or fix its build'"

    # Use 'menuconfig' target for the fine tuning.
    PATH=$BrewHome/bin:$PATH ../${CrossToolVersion}/ct-ng menuconfig

ct-ng命令行里面打出来后回车就有帮助选项。
ct-ng list-samples 把所有例子列出来了,有arm-unknown-linux-gnueabi就是我们4412想要的。

直接ct-ng arm-unkown-linux-guneabi会把conf文件导入到现在的你所在的位置。

Paths and misc options--Local tarballs directory这个是你下载依赖包的文件夹,修改你大小写分区的位置。Prefix directory 也是把 home 替换成大小写分区位置。

最近用crosstool-ng 最新版(当前是

1.22.0)编译出了交叉工具链工具

以下是基本操作步骤:

首先,编译安装crosstool-ng

1)配置 sudo ./configure --prefix=/opt/crosstool-ng #配置安装目录为/opt/crosstool-ng

2)编译 sudo make

3)安装 sudo make install

4)设置环境变量 echo "export PATH=$PATH:/opt/crosstool-ng/bin " >> ~/.bashrc

第二,配置工具链

    1.查看一下有哪些工具链选项

        1)ct-ng 
list-samples

        2)ct-ng 
arm-unknown-linux-gnueabi (以arm-unknown-linux-gnueabi为例,可以选其它)

        3)ct-ng menuconfig

            这个有点多:

    Paths and misc options --->

    (${HOME}/development/crosstool-ng/src) Local tarballs directory  
保存源码包路径

    (${HOME}/development/x-tools/${CT_TARGET}) Prefix directory  
交叉编译器的安装路径

            (4) Number of parallel jobs    指定同时执行 4个工作线程  


       Target options  --->     从datasheet中的 BLOCK DIAGRAM 中可以看到  
        \*** Target optimisations ***  
        (armv4t) Architecture level   
        (arm9tdmi) Emit assembly for CPU      
        (arm920t) Tune for CPU  

crosstool-ng中的Architecture level, Emit assembly for CPU, Tune for CPU,分别对应的是gcc中的-march=xxx, -mcpu=xxx, -mtune=xxx

S3C2440的对应的配置是:

  • Architecture level=CT_ARCH_ARCH=-march=armv4t
  • Emit assembly for CPU=CT_ARCH_CPU=-mcpu=arm9tdmi
  • Tune for CPU=CT_ARCH_TUNE=-mtune=arm920t

    Toolchain options --- >
    

    (cortex_a8 ) Tuple's vendor string

    添加自定义 信息 ,比如:

    cortex_a8 ,制作后的交叉编译器名如: arm -cortex_a8 -linux-gnueabi-

    zjhzjh ,制作后的交叉编译器名如: arm -zjhzjh -linux-gnueabi-

    不设置,制作后的交叉编译器名如: arm -unknown-linux-gnueabi-

    (armarm -linux) Tuple's alias) Tuple's alias

    设置别名,这样会给每个工具创建一软链接比如 :

    arm -linux-gcc链接到 到 arm -cortex_a8-linux-gnueabi-gcc

第三,开始编译工具链

    ct-ng build

(注意,硬盘空间要预留大一些,至少6G以上,上次用10G )

当然在制作工具链的时候,根据其提示,自行用wget将源代码下载到src目录会更快捷,同时也可以下载最新的软件包,这步在进阶步骤中会用到

以下是进阶步骤:

由于即使是最新版的crosstool其中的内核,gcc binuntils等工具包版本也是过时的,比如,内核版本是4.3,而当前版本是4.5.1

所以,需要动手修改crosstool中的配置文件进行最新版本更新,当然,此步骤是在编译过crosstool中的最新版本后进行

主要修改/opt/crosstool-ng/lib/crosstool-ng-1.22.0/config目录下各文件

以内核为例:

内核 kernel目录下linux.in 

4.5.1是我添加的 还有定义主要修改这两处

config KERNEL_V_4_5_1

bool

prompt "4.5.1 (stable)"


config KERNEL_V_4_3

bool

prompt "4.3"



default "4.5.1" if KERNEL_V_4_5_1

default "4.3" if KERNEL_V_4_3



更改gcc  在目录/opt/crosstool-ng/lib/crosstool-ng-1.22.0/config/cc


config CC_GCC_V_5_3_0

bool

prompt "5.3.0"

select CC_GCC_5


config CC_GCC_V_5_2_0

bool

prompt "5.2.0"

select CC_GCC_5



default "5.3.0" if CC_GCC_V_5_3_0

default "5.2.0" if CC_GCC_V_5_2_0



最新版本的是5.3.0 crosstool-ng中的最高版本是5.2.0


就是添加版本号,仿造它原来的,以此类推

其它的库在companion_libs中

哪个升版本了就添加升级后的版本号


这样编译出来的工具链就是最新版本的组合了。



还有一个是在编译cortex A8等高端CPU时,在配置的时候可以将FPU改为硬件浮点,这样,才编译时会用到CPU内部的硬件浮点部件

以s5pv210为例:由于支持neon和vfpv3所以可以使用硬件浮点

(cortex-a8) Emit assembly for CPU 

(neon) Use specific FPU                          此处也可以使用vfpv3因为s5pv210支持

Floating point: (hardware (FPU)) --->



这样,编译出来的就是使用硬件浮点的工具链了。



参考资料:

使用crosstool-ng-1.9.3为S3C2440制作交叉编译工链 (

[http://blog.163.com/allegro_tyc/blog/static/337437682011512101413873/)](http://blog.163.com/allegro_tyc/blog/static/337437682011512101413873/%29)

嵌入式Linux学习笔记(基于S5PV210 TQ210) (

[http://blog.csdn.net/zjhsucceed_329/article/details/32336019)](http://blog.csdn.net/zjhsucceed_329/article/details/32336019%29)

[](http://blog.csdn.net/zjhsucceed_329/article/details/32336019%29)【总结】crosstool-ng使用心得和注意事项 (http://www.crifan.com/summary_crosstool_ng_note/)

利用Crosstool-ng制作交叉编译工具链
1、什么是crosstool-ng

crosstool-ng,全称是crosstool Next Generation,即下一代crosstool,即crosstool的升级版。那么什么是crosstool 呢?crosstool,是个交叉编译器的制作工具。交叉编译器简单的说可以理解为在X86电脑上编译处ARM的运行程序。更详细的介绍可以参考《构建嵌入式LINUX系统》的第四章。

2、制作交叉编译工具链的步骤

a、从网址 http://crosstool-ng.org/download/crosstool-ng/下载相应版本的crosstool-ng工具,我下载的版本是crosstool-ng-1.20.0.tar.bz2。若有补丁也需要同时下载,网址为http://crosstool-ng.org/download/crosstool-ng/01-fixes/。

b、解压crosstool-ng-1.20.0.tar.bz2。命令为tar xjf crosstool-ng-1.20.0.tar.bz2。解压后得到一个名为crosstool-ng-1.20.0的文件夹。输入命令cd crosstool-ng-1.20.0进入文件夹,如果有兴趣可以看下README文件,它会教你一步步制作交叉编译工具链。另外doc文件夹下有详细的制作步骤可以参考。

c、配置、编译安装crosstool-ng-1.20.0。步骤:进入crosstool-ng-1.20.0文件夹,执行./configure --prefix=/work/tools/crosstool-ng命令配置crosstool-ng-1.20.0,/work/tools/crosstool-ng为crosstool-ng-1.20.0的安装路径。若配置过程中出现错误,一般是缺少某个程序造成的,缺什么安装什么就可以了。一般需要安装的程序为 sudo apt-get install sed bash cut dpkg-dev bison flex patch texinfo automake m4 libtool stat cvs websvn tar gzip bzip2 lzma readlink libncurses5-dev bison flex texinfo automake libtool patch gcj cvs cvsd gawk。配置成功后执行make命令编译,然后make install进行安装。如果后面出现编译错误,再增加相应的包即可。安装完成后可以执行export PATH=$PATH:/work/tools/crosstool-ng/bin。把ct-ng命令放到环境变量中,这样就可以在任何地方执行ct-ng了。为了测试是否安装成功可以输入ct-ng --help命令测试。就出现相应的说明就说明安装成功了。

d、配置工具链选项。步骤:将crosstool-ng源码包中samples/arm-unknown-linux-gnueabi/下的crosstool.config拷贝到源码包主目录下,在源码包主目录下执行cp samples/arm-unknown-linux-gnueabi/crosstool.config .config;

然后执行:ct-ng menuconfig可以看到如下的配置画面

进入Paths and misc options -- →菜单,修改内容如下:
1)、(${HOME}/src) Local tarballs directory # 指定制作编译器所需要的源码包的下载存放,可以修改成任意位置,请注意权限。现在指定到/work/tools/crosstool-ng-1.20.0/src 下。
2)、(/opt/${CT_TARGET}) Prefix directory # 制作好的编译器所放置的目录。现在指定到/work/tools/crosstool-ng_build下。
3)、选择Debug crosstool-NG,会多出一个子菜单,选中Save intermediate steps,此选项提供一个从上一步错误的地方继续编译,而不是从新编译,这样节约大量的时间。选择(3)Number of parallel jobs(NEW),这个菜单需要下拉才能看到此项为增加编译时的并行进程数,以增加运行速度,加速编译。

进入target options -- →菜单,修改的内容如下:

1)、确认Target Architecture (arm) ---> # 注意看这项是不是ARM平台

2)、ARMv4t 表示编译出的编译器支持ARMv4t架构的cpu;ARM920t 为指定cpu的类型,S3C2440使用的CPU核心为ARM920t。通过查找资料,这个应该是指令集的架构,对于S3C2410/S3C2440,都ARM920T的核心,架构指令是armv4t,所以,如果要编译2410/2440的,就选armv4t。以此类推S3C6410 ARM1176JZF-S核心使用的是armv6架构,就选armv6。可以通过./arm-linux-gcc --target查看架构。

进入Toolchain option-- →菜单,修改的内容如下:

1)、Tuple's vendor string指定经销商的名称,影响向生成的编译器的前缀为arm-andy-Linux-gnueabi;Tuple's alias是生成编译器别名,可以使用arm-linux-gcc简洁的命令

进入Operating System --->菜单。选择编译的内核版本。这里使用默认的参数

进入Binary utilities --->选择binutils的源码包版本号,配置二进制工具。这里使用默认参数。

C-library --->菜单,选择glibc库版本,使用默认参数

C compiler --->菜单选择GCC版本,选择默认参数

Debug facilities --->菜单,选择调试工具版本,默认参数。

Companion libraries --->菜单,编译工具,GMP是实现任意精度算术运算的软件包,可以完成有符号整数、有理数和浮点数的运算。只要计算机的内存满足需求,GMP的运算精度没有任何限制。MPFR是一个用于高精度浮点运算的C库。默认参数

接着保存退出。配置完成。

e、下面就可以开始编译了,默认情况下,源码包会从网络下载,会占用比较大的带宽,下载后总大小在200MB左右,下载好会放到 /work/tools/crosstool-ng-1.20.0/src下。也可以先从网上下载,大部分软件可以在这个清华镜像下载:https://mirrors.tuna.tsinghua.edu.cn,然后再编译。也可以先编译,如果缺少相应的包下载不成功,会提示。大致的包列表如下:

binutils-2.22.tar.bz2

cloog-0.18.1.tar.gz

dmalloc-5.5.2.tgz

duma_2_5_15.tar.gz

expat-2.1.0.tar.gz

gcc-4.9.1.tar.bz2

gdb-7.8.tar.gz

glibc-2.19.tar.bz2

gmp-5.1.3.tar.xz

isl-0.12.2.tar.bz2

libelf_0.8.13.orig.tar.gz

linux-3.4.97.tar.gz

ltrace_0.7.3.orig.tar.bz2

mpc-1.0.2.tar.gz

mpfr-3.1.2.tar.xz

ncurses-5.9.tar.gz

strace-4.8.tar.xz

f、执行ct-ng build开始编译,我在编译过程中一共遇到两个问题。

1)、安装到cross-gdb时,出现configure: error: expat is missing or unusable,expat-2.1.0.tar.gz这个文件是运行build时它自己下载的。解决:sudo apt-get install libexpat1-dev.

2)、解决完问题1后执行ct-ng cross-gdb+可以接着前面的编译。又出现了_123136.c:835:15: error: expected ')' before 'int'的错误。在网上搜寻答案。解决:export CPPFLAGS="-P"。

g、最后编译成功界面如下,切换到编译后的路径/work/tools/crosstool-ng_build/bin。执行./arm-linux-gcc -v。若有信息输出,说明编译成功

h、测试编译后的arm程序。未完待续。

`