Building a Cross Compiler, Assembler and Linker Designed by Prof. Peng-Sheng Chen
What can You Learn? During embedded-system development, why do we need to use cross compiler, assembler / linker and C standard library How to build cross compiler、assembler / linker
How to build cross C standard library
2
Equipment Requirement PC with Linux
OS installed
Native
gcc compiler installed
Internet
access
3
Software Requirement GNU binutils source code (version 2.16.1)
ftp://sources.redhat.com/pub/binutils/releases/binutils2.16.1.tar.gz
http://ftp.gnu.org/gnu/binutils/binutils-2.16.1.tar.gz
GNU C/C++ compiler (version 3.3.6)
ftp://sources.redhat.com/pub/gcc/releases/gcc-3.3.6/gcc3.3.6.tar.gz
ftp://ftp.nctu.edu.tw/computer-languages/C/gcc/releases/gcc3.3.6/gcc-3.3.6.tar.gz
GNU newlib (version 1.14.0)
ftp://sources.redhat.com/pub/newlib/newlib-1.14.0.tar.gz
4
Outline Introduction Basic Linux commands Build cross assembler / linker Build cross compiler Build cross C standard library Testing
5
Outline Introduction Basic Linux commands Build cross assembler / linker Build cross compiler Build cross C standard library Testing
6
Introduction A total solution for embedded system development
Hardware
Software => software-development tools, applications
Software-development tools
Compiler, assembler, linker, debugger and C standard library
Commercial => very high cost
Open source => free. s can modify, distribute and use the software
7
GNU Binutils The GNU binutils are a collection of binary tools ld - the GNU linker as - the GNU assembler Other binary tools
ar - A utility for creating, modifying and extracting from archives gprof - Displays profiling information objcopy - Copys and translates object files objdump - Displays information from object files …
Easy to port binutils to other platforms Suitable for embedded-system development 8
GNU C/C++ Compiler Retargettable Available from the Free Software Foundation
GPL Licensed
Free
Written by Richard Stallman originally (FSF) Front-end, back-end system with for many of each Code quality is better than some known compiler, very close to DEC’s compiler on Alpha Supplied as vendor compiler by NeXT, BeOS, Linux, BSD 9
Front Ends C、C++、Objective C Ada 95 (GNAT) Fortran77、Fortran95 Pascal Modula-2、Modula-3 Java (ed from gcc 3.0) Java->Bytecode, Bytecode->native code Java->Native code Cobol Chill (Cygnus, a language in the Modula II family used in European telecommunications ) 10
Machines ed by GCC Essentially all machines in widespread. Acorn (Advanced) RISC Machine. Alpha (DEC) Intel x86 Families、i860、i960. Motorola 680x0、68C11、DSP56000 Hitachi SH、H8300 MIPS、IBM PowerPC、HP PA-RISC、SUN SPARC …… Intel IA64, AMD x86-64 Cell processor (used by PS3) 11
GCC Execution
gcc
p
cc1 g++
gas (assembler)
Input file output file
ld (linker)
12
GNU C Standard Library GLIBC Newlib A
C standard library intended for use on embedded systems Usually work on any architecture with the addition of a few low-level routines
13
Cross System-Development Tools The characteristics of most embedded systems
Limited memory
Diskless
No output screen
Poor performance
…
Cross-compiler Remote debug
Sometimes, it is impossible to execute compiler, assembler / linker and debugger on target platform
For embedded system, we need cross systemdevelopment tools to help software development 14
Machine Classification Build machine The
machine builds cross-toolchains
Host machine The
machine cross-toolchains will execute on
Target machine The
assembly code of the machine crosstoolchains will produce output for
15
Machine Identification Three items to identify machine U type Company name System type Example vax-dec-ultrix4.2 i386-redhat-linux m68k-coff arm-elf 16
Outline Introduction Basic Linux commands Build cross assembler / linker Build cross compiler Build cross C standard library Testing
17
Basic Linux Commands (1) Command cd cd /home
Description Change directory Change the current working directory to /home
cd ..
Move to the parent directory of the current directory Move to the 's home directory
cd ~
Copy files file1 file2 Copy the file “file1” to the file “file2”
18
Basic Linux Commands (2) Command df
Description Show the amount of disk space used on each mounted filesystem
ls ls
List files List files in the current working directory except those starting with . and only show the file name List all files in the current working directory in long listing format showing permissions, ownership, size, and time and date stamp
ls -al
19
Basic Linux Commands (3) Command cat
Description Sends file contents to standard output cat /etc/hosts Sends the contents of the “/etc/hosts" file to the screen less
Similar to the more command, but the can page up and down through the file
less file1 The example displays the contents of file1
20
Basic Linux Commands (4) Command more
Description Allows file contents or piped output to be sent to the screen one page at a time more /etc/hosts Lists the contents of the "/etc/profile" file to the screen one page at a time ls –al |more Performs a directory listing of all files and pipes the output of the listing through more. If the directory listing is longer than a page, it will be listed one page at a time
21
Basic Linux Commands (5) Command rm rm file1
Description Delete the files Delete the file “file1”
mv Move or rename files mv file1 file2 Move the file from “file1" to “file2". This effectively changes the name of “file1" to “file2” mv file1 . Locates binaries and manual pages for the ls command
22
Basic Linux Commands (6) Command pwd
Description Show the name of the current working directory
whereis
Show where the binary, source and manual page files are for a command Locates binaries and manual pages for the ls command
whereis ls
man man ls
format and display the on-line manual pages Display the on-line manual of “ls” 23
Setting Environment Variables (1) Command ps
Description Report process status
Which shell do you use? $ ps PID TTY 13580 pts/11 13626 pts/11 $
TIME CMD 00:00:00 bash 00:00:00 ps
$ ps PID TTY 13580 pts/11 13626 pts/11 $
TIME CMD 00:00:00 csh 00:00:00 ps
Bash Shell
C shell 24
Setting Environment Variables (2) Set PATH Ex:
Add “/foo/bin” to PATH
$ export PATH=/foo/bin:$PATH
Bash Shell
$ setenv PATH /foo/bin:$PATH
C shell
25
formation: Redirection Before a command is executed, its input and output may be redirected Executable
file: myexec Log file: log.txt Direct both standard output and standard error to the file “log.txt”
Bash Shell
$ myexec
>
$ myexec
>&
log.txt log.txt
2>&1 C Shell 26
Outline Introduction Basic Linux commands Build cross assembler / linker Build cross compiler Build cross C standard library Testing
27
Build Cross-Binutils source code of GNU binutils uncompress source code configure binutils
This step will detect system status, adjust related building parameters and generate corresponding Makefile file
--target=arm-elf sets target machine for ARM, and ed file format for ELF
--prefix=/foo sets the package will be installed in directory /foo
configure --target=arm-elf --prefix=/foo make
make install 28
Outline Introduction Basic Linux commands Build cross assembler / linker Build cross compiler Build cross C standard library Testing
29
Build Cross-Compiler (1) Add the directory of binutils executable to PATH source code of GNU gcc uncompress source code configure gcc
This step will detect system status, adjust related building parameters and generate corresponding Makefile file --target=arm-elf sets target machine for ARM, and ed file format for ELF (The setting should consist with the setting in binutils) --prefix=/foo sets the package will be installed in directory /foo (The setting should consist with the setting in binutils) --enable-languages=c sets front-end will C (That is we will build C compiler only) --with-newlib sets the compiler will use newlib as standard C library 30
Build Cross-Compiler (2) configure --target=arm-elf --prefix=/foo --enable-languages=c --with-newlib
make make install
31
Outline Introduction Basic Linux commands Build cross assembler / linker Build cross compiler Build cross C standard library Testing
32
Build Cross-Newlib Add the directory of binutils、gcc executable to PATH source code of GNU newlib uncompress source code configure newlib
This step will detect system status, adjust related building parameters and generate corresponding Makefile file --target=arm-elf sets target machine for ARM, and ed file format for ELF (The setting should consist with the setting in binutils and gcc) --prefix=/foo sets the package will be installed in directory /foo (The setting should consist with the setting in binutils and gcc)
configure --target=arm-elf --prefix=/foo
make make install 33
Directory Structure /foo
bin include lib gcc-lib arm-elf
bin
man
include
info
lib
share 34
Outline Introduction Basic Linux commands Build cross assembler / linker Build cross compiler Build cross C standard library Testing
35
Testing /foo/bin/arm-elf-gcc -S test1.c /* test1.c */ #include <stdio.h> int main(void) { printf(“Hello World\n”); return 0; }
.LC0:
main:
.L3: .L2:
.file "test1.c" .section .rodata .align 2 .ascii .text .align .global .type
"Hello World\n\000" 2 main main, %function
@ args = 0, pretend = 0, frame = 0 @ frame_needed = 1, uses_anonymous_args = 0 mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4 ldr r0, .L2 bl printf mov r3, #0 mov r0, r3 ldmea fp, {fp, sp, pc} .align
2
.word .size .ident
.LC0 main, .-main "GCC: (GNU) 3.3.6"
36
Reference Linux/UNIX commands http://www.computerhope.com/unix.htm#04
GNU binutils http://sources.redhat.com/binutils
GCC http://gcc.gnu.org
GNU newlib http://sources.redhat.com/newlib 37