Arm-elf编译工具链的编译
一、环境说明
PC-CPU:i386
操作系统:Fedora II
操作系统自带GCC:version 3.3.3 20040412 (Red Hat Linux 3.3.3-7)
嵌入式CPU:ARM 920T
嵌入式内核:uClinux-Samsung-2510
嵌入式图形系统:Minigui-1.3.3
嵌入式应用程序:Mgdillo(浏览器)
二、重新编译原因
1.方案一采用20011219 版arm-elf编译器
购买的测试开发板自带uClinux-Samsung-2510内核以及其编译器版本为20011219的。但在编译Minigui时出现很多难以解决的编译错误(Minigui推荐的版本为20030314)。
2.方案二采用20030314 版arm-elf编译器
若采用20030314版本来编译内核,能编译出来,代码却不能完全运行①,但可以拷贝20011219的elf2flt文件覆盖原来的文件,再编译内核就可以了。接着来编译Mgdillo,解决一些编译问题后,最后链接时出现一个无法修正的严重错误②。
由于上两种方案都不行,据网络信息说明可能要升级整个编译工具,因此就有下面系列工作了。
注:①BINFMT_FLT:reloc outside program ! init
②关于ld.real的段错误
三、编译前的源码准备
1. 下载工具链
进入http://www.uclinux.org/pub/uClinux/arm-elf-tools/tools-20030314/有如下文件,见备注栏说明
文件名
备注
STLport-4.5.3.patch
需要
STLport-4.5.3.tar.gz
需要
binutils-2.10-full.patch
需要升级不下载
binutils-2.10.tar.bz2
需要升级不下载
build-uclinux-tools.sh
需要
elf2flt-20030314.tar.gz
需要
elf2flt-cygwin-020612.patch
不需要
gcc-2.95.3-arm-mlib.patch
需要
gcc-2.95.3-arm-pic.patch
需要
gcc-2.95.3-arm-pic.patch2
需要
gcc-2.95.3-cygwin-020611.patch
不需要
gcc-2.95.3-full.patch
需要
gcc-2.95.3-sigset.patch
需要
gcc-2.95.3.tar.gz
需要
genromfs-0.5.1-cygwin-020605.patch
不需要
genromfs-0.5.1.tar.gz
需要
uClibc-0.9.19.patch.gz
需要升级不下载
uClibc-20030314.tar.gz
需要升级不下载
2. Binutils高版本下载
进入http://ftp.gnu.org/gnu/binutils 下载 binutils-2.11.2.tar.gz 文件
3. uClibc高版本下载
进入http://www.uclibc.org/downloads/ 下载文件 uClibc-0.9.26.tar.gz和uClibc-locale-030818.tgz 。
4. 说明
所有下载的文件都先不解压缩放到自己一个目录中。
四、部分源码的升级说明
1. Binutils的升级说明
把binutils-2.11.2.tar.gz 解压到当前目录会产生一个binutils-2.11.2目录,在文件build-uclinux-tools.sh中的一些操作都是争对binutils-2.10的,所以只要相对应的修改,并注释掉对binutils-2.10的升级语句就可以了。
2. uClibc的升级修改
把uClibc-0.9.26.tar.gz解压到本目录,产生 uClibc-0.9.26的目录,文件名许改为uClibc 。
复制uClibc-locale-030818.tgz(无需解压)到uClibc\extra\locale目录中。因为Mgdillo的编译需要locale的支持。
修改uClibc/extra/Configs/config.in,在文件中有一段choice 和 endchoice包的代码,这结代码包函了Malloc的配置。删除整个段。采用下面代码
config MALLOC
bool "malloc"
default y
config MALLOC_SIMPLE
bool "malloc-simple"
default n
config MALLOC_STANDARD
bool "malloc-standard"
depends on UCLIBC_HAS_MMU
因为在整个编译过程中不允许出现编译配置确认的等待,必须全部配置完成。但choice的代码会不断的提示确认。
配置生成.config文件,在uClibc目录中运行
make oldconfig CROSS=arm-elf TARGET_ARCH=arm
就会出现配置操作过程,根据实际情况选择。配置完成后就在uClibc目录中产生一个.config文件,它包含了所以的配置。复制该文件到uClibc/extra/Configs/目录中并改名为Config.arm.default 。下面是我所配置的Config.arm.default的内容
#
# Automatically generated make config: don't edit
#
# TARGET_alpha is not set
TARGET_arm=y
# TARGET_cris is not set
# TARGET_e1 is not set
# TARGET_h8300 is not set
# TARGET_i386 is not set
# TARGET_i960 is not set
# TARGET_m68k is not set
# TARGET_microblaze is not set
# TARGET_mips is not set
# TARGET_powerpc is not set
# TARGET_sh is not set
# TARGET_sparc is not set
# TARGET_v850 is not set
#
# Target Architecture Features and Options
#
HAVE_ELF=y
TARGET_ARCH="arm"
# CONFIG_GENERIC_ARM is not set
# CONFIG_ARM610 is not set
# CONFIG_ARM710 is not set
# CONFIG_ARM720T is not set
CONFIG_ARM920T=y
# CONFIG_ARM922T is not set
# CONFIG_ARM926T is not set
# CONFIG_ARM_SA110 is not set
# CONFIG_ARM_SA1100 is not set
# CONFIG_ARM_XSCALE is not set
ARCH_LITTLE_ENDIAN=y
# ARCH_BIG_ENDIAN is not set
# ARCH_HAS_NO_MMU is not set
# UCLIBC_HAS_MMU is not set
UCLIBC_HAS_FLOATS=y
# HAS_FPU is not set
UCLIBC_HAS_SOFT_FLOAT=y
DO_C99_MATH=y
WARNINGS="-Wall"
KERNEL_SOURCE="/home/houen/arm-elf-toolschain/linux-2.4.x"
UCLIBC_UCLINUX_BROKEN_MUNMAP=y
EXCLUDE_BRK=y
C_SYMBOL_PREFIX=""
HAVE_DOT_CONFIG=y
#
# General Library Settings
#
# HAVE_NO_PIC is not set
# DOPIC is not set
# HAVE_NO_SHARED is not set
# ARCH_HAS_NO_LDSO is not set
# UCLIBC_PIE_SUPPORT is not set
UCLIBC_CTOR_DTOR=y
# UCLIBC_PROPOLICE is not set
# UCLIBC_PROFILING is not set
# HAS_NO_THREADS is not set
UCLIBC_HAS_THREADS=y
# PTHREADS_DEBUG_SUPPORT is not set
UCLIBC_HAS_LFS=y
MALLOC=y
MALLOC_GLIBC_COMPAT=y
UCLIBC_DYNAMIC_ATEXIT=y
# HAS_SHADOW is not set
# UNIX98PTY_ONLY is not set
# ASSUME_DEVPTS is not set
# UCLIBC_HAS_TM_EXTENSIONS is not set
# UCLIBC_HAS_TZ_CACHING is not set
# UCLIBC_HAS_TZ_FILE is not set
#
# Networking Support
#
# UCLIBC_HAS_IPV6 is not set
# UCLIBC_HAS_RPC is not set
#
# String and Stdio Support
#
UCLIBC_HAS_CTYPE_TABLES=y
UCLIBC_HAS_CTYPE_SIGNED=y
UCLIBC_HAS_CTYPE_UNSAFE=y
# UCLIBC_HAS_CTYPE_CHECKED is not set
# UCLIBC_HAS_CTYPE_ENFORCED is not set
UCLIBC_HAS_WCHAR=y
UCLIBC_HAS_LOCALE=y
UCLIBC_PREGENERATED_LOCALE_DATA=y
# UCLIBC_DOWNLOAD_PREGENERATED_LOCALE_DATA is not set
# UCLIBC_HAS_XLOCALE is not set
# UCLIBC_HAS_HEXADECIMAL_FLOATS is not set
# UCLIBC_HAS_GLIBC_DIGIT_GROUPING is not set
# UCLIBC_HAS_GLIBC_CUSTOM_PRINTF is not set
UCLIBC_PRINTF_SCANF_POSITIONAL_ARGS=9
# UCLIBC_HAS_SCANF_GLIBC_A_FLAG is not set
# UCLIBC_HAS_STDIO_BUFSIZ_NONE is not set
# UCLIBC_HAS_STDIO_BUFSIZ_256 is not set
# UCLIBC_HAS_STDIO_BUFSIZ_512 is not set
# UCLIBC_HAS_STDIO_BUFSIZ_1024 is not set
# UCLIBC_HAS_STDIO_BUFSIZ_2048 is not set
UCLIBC_HAS_STDIO_BUFSIZ_4096=y
# UCLIBC_HAS_STDIO_BUFSIZ_8192 is not set
UCLIBC_HAS_STDIO_BUILTIN_BUFFER_NONE=y
# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_4 is not set
# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_8 is not set
UCLIBC_HAS_STDIO_GETC_MACRO=y
UCLIBC_HAS_STDIO_PUTC_MACRO=y
UCLIBC_HAS_STDIO_AUTO_RW_TRANSITION=y
# UCLIBC_HAS_FOPEN_LARGEFILE_MODE is not set
# UCLIBC_HAS_FOPEN_EXCLUSIVE_MODE is not set
# UCLIBC_HAS_GLIBC_CUSTOM_STREAMS is not set
# UCLIBC_HAS_PRINTF_M_SPEC is not set
UCLIBC_HAS_ERRNO_MESSAGES=y
# UCLIBC_HAS_SYS_ERRLIST is not set
UCLIBC_HAS_SIGNUM_MESSAGES=y
# UCLIBC_HAS_SYS_SIGLIST is not set
# UCLIBC_HAS_GETTEXT_AWARENESS is not set
UCLIBC_HAS_GNU_GETOPT=y
#
# Big and Tall
#
UCLIBC_HAS_REGEX=y
# UCLIBC_HAS_WORDEXP is not set
# UCLIBC_HAS_FTW is not set
UCLIBC_HAS_GLOB=y
#
# Library Installation Options
#
RUNTIME_PREFIX="/usr/$(TARGET_ARCH)-linux-uclibc/"
DEVEL_PREFIX="/usr/$(TARGET_ARCH)-linux-uclibc/usr/"
#
# uClibc development/debugging options
#
# DODEBUG is not set
# DOASSERTS is not set
# UCLIBC_MALLOC_DEBUGGING is not set
# UCLIBC_MJN3_ONLY is not set
这样理论上在编译过程中就不会出现配置提示了,但不知什么原因还是出现了。但可以另外方法解决。
修改 build-uclinux-tools.sh 的fix_uclibc_config()函数。许改部分如下
echo '# UCLIBC_HAS_MMU is not set'
echo '# HAVE_SHARED is not set'
echo '# BUILD_UCLIBC_LDSO is not set'
echo '# HAS_SHADOW is not set'
echo 'MALLOC=y'
echo '# MALLOC_SIMPLE is not set'
echo 'MALLOC_GLIBC_COMPAT=y'
echo '# MALLOC_930716 is not set'
echo '# UNIX98PTY_ONLY is not set'
echo 'UCLIBC_CTOR_DTOR=y'
echo 'UCLIBC_DYNAMIC_ATEXIT=y'
echo '# UCLIBC_MALLOC_DEBUGGING is not set'
echo "UCLIBC_HAS_WCHAR=y"
echo "UCLIBC_HAS_LOCALE=y"
echo "UCLIBC_HAS_THREADS=y"
echo "# DOPIC is not set"
修改uClibc/libc/unistd/exec.c,这个文件不知道是不是一个 bug,在编译的时候该文件会被编译很多次,不同的预定义条件产生多个.o文件。
L_execl -> execl.o
L_execv -> execv.o
L_execle -> execle.o
L_execlp -> execlp.o
L_execvp ->execvp.o
在文件中还存在L___exec_alloc的定义,它包含的两个函数没有被编译进去,因而链接应用程序时会产生链接错误,没定义_exec_alloc 和__exec_free。根据实际情况我做了如下修改,把L___exec_alloc修改为 L_execl把_exec_alloc 和__exec_free 编译到execl.o中。
3. 其他修改
修改 build-uclinux-tools.sh 的multilib_table() 函数
注释片断如下几行
#echo "mbig-endian/fp
#echo "mbig-endian/fp
#echo "mbig-endian/ma
#echo "mbig-endian/fp
#echo "mbig-endian/fp
因为系统为小端的,uclibc的配置也是小端的。
在build-uclinux-tools.sh文件开头,有 PREFIX=/usr/local设置安装路径。
五、编译及可能碰到的问题
1.正式编译
编译前还需解压elf2flt-20030314.tar.gz,生成一个elf2flt的目录。在当前目录中还需要产生一个链接指向嵌入式内核链接名为linux-2.4.x 。
在当前路径运行
./build-uclinux-tools.sh build 2>&1 | tee errs
就开始编译了
2.问题解决
在build-uclinux-tools.sh文件末尾有一些 stage1 stage2的函数调用。你可以根据目录中产生的stage文件,查看进度。若出现stage1则表明函数stage1执行完成了。
在编译过程中产生了问题,可以注释掉其他stage,仅仅调试错误的stage了。还有一个error文件是整个编译的过程,对除错有很大的帮助。
4. 编译内核的问题
这样编译出来的内核还是不能运行在开发办中。经过测试,还是需要内核自带编译器的elf2flt覆盖到 usr/local/arm-elf/bin中。
5.
六、加入Minigui的编译环境
在Fedora中编译Minigui会产生一个错误,应该是汇编语句的错误。可以如下进行修改
在原来的文件中可能是这样书写的
(“
abcd
“ …..
修改为
(“abcd”
空一行
……
假设路径就是/usr/local
CC=arm-elf-gcc AR=arm-elf-ar RANLIB=arm-elf-ranlib LDFLAGS="-elf2flt" ./configure
--prefix="/usr/local/arm-elf"
--host=arm-elf
--build=i386-linux
--disable-shared
--enable-lite=yes
--enable-video-fbcon=yes
--enable-nativegal=yes
--enable-nativeial=yes
--enable-newgal=yes
--enable-timerunitms=no
--enable-nativegalqvfb=no
--enable-fblin8=no
--enable-fblin16=no
--enable-fblin24=no
--enable-fblin32=yes
--enable-dummyial=yes
--enable-qvfbial=no
--enable-nativeps2=no
--enable-nativeimps2=no
--enable-nativems=no
--enable-nativems3=no
--enable-nativegpm=no
--enable-textmode=no
--enable-rbfsupport=yes
--enable-rbfgb12=no
--enable-vbfsupport=no
--enable-fontsserif=no
--enable-fontcourier=no
--enable-fontsymbol=no
--enable-fontvgas=no
--enable-qpfsupport=no
--enable-ttfsupport=no
--enable-type1support=no
--disable-ttfsupport
--enable-latin2support=no
--enable-latin3support=no
--enable-latin4support=no
--enable-latin9support=yes
--enable-gbsupport=yes
--enable-gbksupport=no
--enable-big5support=no
--enable-unicodesupport=no
--enable-savebitmap=yes
--enable-gifsupport=yes
--enable-jpgsupport=no
--enable-pngsupport=no
--enable-imegb2312=no
--enable-imegb2312py=no
--enable-aboutdlg=yes
--enable-savescreen=no
--enable-tinyscreen=no
--enable-extfullgif=no
--enable-video-dummy=no
--enable-extskin=no
make
make install
七、Mgdillo的编译
./autogen
LIBS="-lminigui -lm -lpthread" CC=arm-elf-gcc AR=arm-elf-ar
RANLIB=arm-elf-ranlib
LDFLAGS="-elf2flt "
./configure
--host=arm-elf
--build=i386-linux --enable-shared=no
make
可执行文件在src中
八、