softfloat交叉编译器怎么设置
Ⅰ arm-linux-gcc4.4.3怎么安装
1,下载并安装arm-linux-gcc
arm-linux-gcc-4.2.1的版本在http://ftp.snapgear.org/pub/snapgear/tools/arm-linux/这里可以下载,最新版arm-linux-tools-20080623.tar.gz这个可能是4.2.4的版本,因为下面有编译4.2.4的方法还有相应的代码包,build-arm-linux-4.2.14,此版本由于过大,我没有下载。
下面的这个是ARM官方给的下载链接http://www.codesourcery.com/gnu_toolchains/arm/download.html,然后将HOST选择为IA32 GNU/Linux,点击下载就可以了。不过前缀为arm-2010.09-51-arm-none-eabi-i686-pc-linux-gnu而不是arm-linux-。。。
在友善之臂官方网站http://www.arm9.net/download.asp下载arm-linux-gcc4.4.3。
2,删除之前安装有旧版本,执行
[root@localhost ~]# rm -rf /opt/arm
3,对新版本arm-linux-gcc-4.4.3进行解压(注意,如果我们加上了-C,那么就会自动解压到/usr/local/arm/这个目录下),但是友善之臂按照下列方式解压,不会解压到/usr/local/arm/目录下的,这是因为友善之臂把/usr/local/arm/目录修改成了 /opt/FriendlyARM/toolschain/,除非自己在把它修改过来
[root@localhost ~]# tar -ivxzf /smbroot/arm-linux-gcc-4.4.3.tar.gz -C /
4,修改配置文件,将arm-linux-gcc添加到环境变量中,因为arm-linux-gcc的命令是在/usr/local/arm/4.4.3/bin下,其目的通过对全局变量绑定使之能够在任意一个目录下能够执行该命令。
打开设置文件
[root@localhost opt]# vi /etc/profile
在打开的文件的
# Path manipulation
if [ "$EUID" = "0" ]; then
pathmunge /sbin
pathmunge /usr/sbin
pathmunge /usr/local/sbin
pathmunge /usr/local/arm/4.4.3/bin
fi
或者在文件末尾添加
export PATH=$PATH:/usr/local/arm/4.4.3/bin
保存退出
5,立即使新的环境变量生效,不用重启电脑
[root@localhost opt]# source /etc/profile
[root@localhost opt]#
6,检查是否将路径加入到PATH:
[root@localhost opt]# echo $PATH
显示的内容中有/usr/local/arm/4.4.3/bin,说明已经将交叉编译器的路径加入PATH。至此,交叉编译环境安装完成。
7,测试是否安装成功
首先,执行find命令查询一下arm-linux-gcc的位置
[root@localhost ~]# find / -name arm-linux-gcc
/opt/arm/toolschain/4.4.3/bin/arm-linux-gcc
[root@localhost ~]#
可以看到arm-linux-gcc的位置与环境变量中设定的路径一致
接下来查询arm-linux-gcc的版本
[root@localhost bin]# arm-linux-gcc -v
Using built-in specs.
Target: arm-none-linux-gnueabi
Configured with: /opt/FriendlyARM/mini2440/build-toolschain/working/src/gcc-4.4.3/configure --build=i386-build_redhat-linux-gnu --host=i386-build_redhat-linux-gnu --target=arm-none-linux-gnueabi --prefix=/opt/FriendlyARM/toolschain/4.4.3 --with-sysroot=/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi//sys-root --enable-languages=c,c++ --disable-multilib --with-arch=armv4t --with-cpu=arm920t --with-tune=arm920t --with-float=soft --with-pkgversion=ctng-1.6.1 --disable-sjlj-exceptions --enable-__cxa_atexit --with-gmp=/opt/FriendlyARM/toolschain/4.4.3 --with-mpfr=/opt/FriendlyARM/toolschain/4.4.3 --with-ppl=/opt/FriendlyARM/toolschain/4.4.3 --with-cloog=/opt/FriendlyARM/toolschain/4.4.3 --with-mpc=/opt/FriendlyARM/toolschain/4.4.3 --with-local-prefix=/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi//sys-root --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-c99 --enable-long-long --enable-target-optspace
Thread model: posix
gcc version 4.4.3 (ctng-1.6.1)
[root@localhost bin]#
可以看到arm-linux-gcc的版本号,至此,arm-linu-gcc已成功安装。
Ⅱ 交叉编译工具链 arm-arago-linux-gnueabi-gcc 中的arago和gnueabi代表什么意思
arm-arago-linux-gnueabi-gcc
arm :CPU Architecture
arago: Hardware Platform or Vendor
linux:Operating System
gnueabi: C Library
arago 那个段落,表示的是供应商,对于 arm 这里也可以是 hardfloat 或者 softfloat ,也就是使用的是硬浮点还是软浮点。当然其实这个东西是在编译 gcc 时,通过 --with-float= 指定而不是通过这里进行识别芦州。但有的时候,一些编译脚本会识别这里来确定浮点运算器是软是硬。
gnueabi 是 C 函数库的使用,比如 gnu 是 GNU C Library ,也就是 glibc 。对应的还有 uclibc 。附加的 eabi 其实是说,使用的是新的 EABI 二进制接口 Embedded application binary interface 。这个嵌入式专用接口比老的更好用,效率更高而且支持新的一些硬件功能。码伍老的教 OABI 。当然,同 float 一样可以通过参数直接定义。
这一大堆联合起来,只是为了直观的表现并且区别使用用途和功能定义。没有必陪模蔽要太过于关注。
Ⅲ 求大侠指教 我往TQ2440开发板上移植Uboot遇到了问题 编译没没出错 但放到内存中总是运行不出来 情况如下:
请问楼主是将u-boot移植到nandflash中通过代码往内存搬运,还是直接移植到内存中进行执行。如果是直接往内存移植,需要一个init.bin文件烧写到nandflash的前4k进行内存初始化,才可以在内存中执行,从你的截图看不像是烧写到nandflash中的,如果需要帮助我可以给你QQ,我们私聊
Ⅳ 交叉编译busybox显示libc.so.6丢失!
拷贝C 库
交叉应用程序的开发需要用到交叉编译的链接库,我们在移植应用程序到我们的目标板的时
候,需要把交叉编译的链接库也一起移植到目标板上,这里我们用到的交叉工具链的路径是
/usr/local/arm/...../,链接库的目录是/usr/local/arm/...../arm-linux/lib,将其中部分库文件及符号链接拷贝到root_nfs(你创建的busybox的根目录)文件夹下的lib文件夹中。
部分库文件及符号链接有:ld-2.3.2.so,ld-linux.so.2,libc-2.3.2.so,libc.so.6
Ⅳ Go 语言交叉编译在 openwrt 上运行的程序
Go 语言的一大优势在于其简便的交叉编译功能,允许开发者生成适用于不同硬件平台与操作系统的程序。本文将详细记录如何在小米路由器 3G 上运行 Go 语言编写的程序,以供参考。
编译环境为 macOS 以及 Go 1.11 版本,目标运行环境为基于 OpenWRT 的路由器,其采用 MIPS 架构的 32 位处理器 MT7621,配置双核四线程,无浮点单元(FPU)。代码文件命名为 `hello.go`。
编译过程采用标准的 `go build` 命令,只需通过 `GOOS` 和 `GOARCH` 参数指定目标平台的操作系统与 CPU 架构。由于 MT7621 无 FPU,因此在编译时需特别指定使用 `softfloat` 软浮点,以确保程序中不包含浮点计算指令,避免非法指令错误。
在较早版本的 Go 需要借助第三方库实现 MIPS 平台的交叉编译,但 Go 1.11 版本已内置了对 MIPS 平台的支持,无需额外依赖。对于无 FPU 的处理器,可以通过在编译 OpenWRT 时打开内核的浮点模拟器来实现兼容性,但使用 `GOMIPS=softfloat` 指令同样能够满足需求。
编译完成后,通过 `scp` 命令将生成的可执行文件 `hello` 传输至目标平台并运行。程序执行一切正常,已成功在路由器上部署 Go 语言程序。
在编译过程中遇到的两个关键问题包括:
1. **Go 1.11 版本编译缓存问题**:在切换 `GOMIPS=softfloat` 与 `hardfloat` 时,编译结果并未变化,需手动清理缓存以获取正确的输出。通过在 GitHub 上查找对应 issue,并确认其已被修复后,更新至 Go 1.11.5 版本,问题得到解决。
2. **GOARCH 参数配置问题**:初始时将 `GOARCH` 设置为 `mips`,即 MIPS 处理器的大端架构,导致编译出的程序在执行时出现语法错误。经调查,`GOARCH` 参数可以设置为 `mips` 或 `mipsle`,分别对应大小端架构。考虑到 MT7621 为小端架构,修正 `GOARCH` 为 `mipsle` 后问题得以解决。
Ⅵ 如何使用自己的makefile编译android ndk项目
android ndk提供了一套自己的makefile管理方式,要将源码项目移植到android平台,需要按照android的makefile规则编写makefile,还要按android的规则部署源码目录,对一个有自己的makefile管理方法的大型项目来说,只是做一下makefile迁移工作就是一件很麻烦的事。
其实android ndk上的编译说到底也就是交叉编译,只要配置好交叉编译工具链,使用原有的makefile也是可以编译出在android运行的c、c++程序的。
以android-ndk-r4-crystax的ndk版本为例:
编译器路径 android-ndk-r4-crystax/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin
名称前缀 arm-eabi-
头文件目录 android-ndk-r4-crystax/build/platforms/android-3/arch-arm/usr/include
库文件目录 android-ndk-r4-crystax/build/platforms/android-3/arch-arm/usr/lib
你可以试一下上面的配置,如果编译链接都没有问题,可以adb push到android设备上运行看看,什么结果?
有点崩溃,根本运行不起来,你也许想试试看android自带的ndk例子,确实是能够运行的,问题在哪儿呢?
只是正确配置了编译器、头文件、库文件还不够,还需要配置编译、链接的参数,android例子中编译链接的参数是什么呢?你也许想深究一下android的makefile,可是不久你会发现那是更崩溃的事情,里面用了很多的make脚本函数。其实android的makefile是可以把执行的详细命令输出来的,只要make的时候加上V=1即可。可以看到确实带了很多参数
编译参数:
-fpic
-mthumb-interwork
-ffunction-sections
-funwind-tables
-fstack-protector
-fno-short-enums
-Wno-psabi
-march=armv5te
-mtune=xscale
-msoft-float
-mthumb
-fomit-frame-pointer
-fno-strict-aliasing
-finline-limit=64
-Wa,--noexecstack
-D__ARM_ARCH_5__
-D__ARM_ARCH_5T__
-D__ARM_ARCH_5E__
-D__ARM_ARCH_5TE__
-DANDROID
链接参数:
-nostdlib
-Bdynamic
-Wl,-dynamic-linker,/system/bin/linker
-Wl,--gc-sections
-Wl,-z,noreloc
-Wl,--no-undefined
-Wl,-z,noexecstack
-L$(PLATFORM_LIBRARY_DIRECTORYS)
crtbegin_static.o
crtend_android.o
这其中链接参数中的-Wl,-dynamic-linker,/system/bin/linker、crtbegin_static.o、crtend_android.o是最关键的,android使用了自己的进程加载器,并且自定义了c运行时的启动结束。难怪先前编译的进程启动不了。