Arm-elf编译工具链的编译及Minigui

类别:软件工程 点击:0 评论:0 推荐:

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中

八、 

本文地址:http://com.8s8s.com/it/it32864.htm