Sunteți pe pagina 1din 37

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 compilerassembler / linker

How to build cross C standard library

Equipment Requirement
PC with
Linux

OS installed

Native

gcc compiler installed

Internet

access

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

Outline
Introduction
Basic Linux commands
Build cross assembler / linker
Build cross compiler
Build cross C standard library
Testing

Outline
Introduction
Basic Linux commands
Build cross assembler / linker
Build cross compiler
Build cross C standard library
Testing

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. Users can modify, distribute and


use the software

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 support for many of
each
Code quality is better than some known compiler, very
close to DECs compiler on Alpha
Supplied as vendor compiler by NeXT, BeOS, Linux, BSD
9

Front Ends
CC++Objective C
Ada 95 (GNAT)
Fortran77Fortran95
Pascal
Modula-2Modula-3
Java (supported 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 Supported by GCC


Essentially all machines in widespread.
Acorn (Advanced) RISC Machine.
Alpha (DEC)
Intel x86 Familiesi860i960.
Motorola 680x068C11DSP56000
Hitachi SHH8300
MIPSIBM PowerPCHP PA-RISCSUN SPARC

Intel IA64, AMD x86-64
Cell processor (used by PS3)
11

GCC Execution

gcc

cpp

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
CPU 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 user's home directory

cd ~

cp
Copy files
cp 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 user


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

Log Information: 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
download 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 supported 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
download 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 supported 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 support 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 binutilsgcc executable to PATH
download 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 supported 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

.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

S-ar putea să vă placă și