嵌入式處理器架構與程式設計
王建民
中央研究院 資訊所
2008年 7月
Contents
Introduction
 Computer Architecture
 ARM Architecture
 Development Tools
 GNU Development Tools
 ARM Instruction Set
 ARM Assembly Language
 ARM Assembly Programming
 GNU ARM ToolChain
 Interrupts and Monitor

2
Lecture 5
GNU Development Tools
Outline




Linux/Cygwin
GNU Compiler Collection
GNU Libraries and Linker
GNU Binary Utilities
4
Cygwin

Cygwin is a Linux-like environment for
Windows. It consists of two parts:



A DLL (cygwin1.dll) which acts as a Linux
emulation layer providing substantial Linux
API functionality.
A collection of tools, which provide Linux look
and feel.
http://www.cygwin.com/
5
Installation1
6
Installation2
7
Installation3
8
Installation4
9
Installation5
10
Installation6
11
Installation7
12
Linux Commands1

cat



concatenate file(s)
ex. $ cat hello.c
ex. $ cat > newfile
Hello World
CTRL-D
13
Linux Commands2

ls

list information about the files (the current
directory by default).
14
Linux Commands3

cp



mv



copy source to destination
ex. $ cp foo1 other
move/rename source to destination
ex. $ mv foo1 other
rm


delete file(s)
ex. $ rm hello.c
15
Linux Commands4

mkdir



create a new directory
ex. $ mkdir exercise
rmdir




remove a empty directory
ex. $ rmdir exercise
remove a directory containing files
ex. $ rm –r exercise
16
Linux Commands5

pwd



show current directory
ex. $ pwd
/home/user1
cd


change current directory
ex. $ cd exercise
17
Linux Commands6

ps



show processes
ex. $ ps
kill


kill a process
ex. $ kill pid
18
Linux Commands7

run a program in the background


add & following the command line
ex. $ ./hello &
19
Linux Commands8

fg


run a background program in the foreground
ex. $ fg %job_num
$ jobs
[1]+ gcc program.c
$ fg %1
20
Linux Commands9

run the foreground program in the
background

ex. $
gcc program.c –o program
Ctrl-z
[1]+ stopped gcc program.c –o program
$ bg
[1]+ stopped gcc program.c –o program
$
21
Outline




Linux/Cygwin
GNU Compiler Collection
GNU Libraries and Linker
GNU Binary Utilities
22
GNU Compiler Collection

GNU Compiler Collection (GCC)



An integrated distribution of compilers for
several major programming languages
C, C++, Objective-C, Fortran, Java, and Ada
http://gcc.gnu.org/
23
The Compilation Process
input files
.c
output files
Preprocessor
Compiler
.s
.s
Assembler
.o
.o
.a
Linker
a.out / a.exe
24
An Example
hello.c
#define GREETING ”Hello, World!\n”
int main()
{
printf(GREETING);
}
25
Using gcc1

The simplest way to compile

gcc hello.c


a.exe executable file
If you want to produce a executable file
named “hello”

gcc -o hello hello.c

hello.exe executable file
26
Using gcc2

To compile with multiple source files

Ex:
hello.c :
extern void foo(char [])
int main()
{
char str[]=“hello world!”;
foo(str);
}

foo.c :
void foo(char str[])
{
printf(“%s\n”,str);
}
gcc -o hello hello.c foo.c

hello.exe executable file
27
Using gcc3

-E: Stop after the preprocessing stage; do
not run the compiler proper
28
Using gcc4

-S: Stop after the stage of compilation
proper; do not assemble. Output assembly
code file (*.s)
29
Using gcc5

-c : Compile and assemble the source files,
but do not link.

gcc –c hello.c


hello.o object file
-o file : Place output in file file

gcc –o hello hello.c

hello.exe
30
Using gcc6

Specifying libraries


-llibrary : Search the library named library
when linking
library file name : liblibrary.a
ex: foo.o refers to functions in library file “libz.a”
 gcc -o foo foo.o -lz

31
Using gcc7

Specify directories to search for header files,
for libraries and for parts of the compiler


-Idir: Add the directory dir to the head of the
list of directories to be searched for header file.
-Ldir : Add directory dir to the list of
directories to be searched for -l.
32
Using gcc8

Example




A header file in “/tmp/foo.h”
A function foo() in library “/tmp/libfoo.a”
A program: /home/foo/foo.c
gcc –I/tmp/foo.h –L/tmp/libfoo.a foo.c -lfoo
#include <foo.h>
int main()
{
…
foo();
…
}
33
Debugging Options



-g : Produce debugging information in the
operating system's native format
-ggdb : Produce debugging information for
use by GDB
-time : Report the CPU time taken by each
subprocess in the compilation sequence
34
Optimization Options1


-O0 : Do not optimize (the default)
-O or -O1 : Optimize


Tries to reduce code size and execution time,
without performing any optimizations that take
a great deal of compilation time.
-O2 : Optimize even more


Performs nearly all supported optimizations
that do not involve a space-speed tradeoff.
Does not perform loop unrolling or function
inlining.
35
Optimization Options2

-O3 : Optimize yet more


-Os : Optimize for size



Turns on all optimizations specified by -O2 and
also turns on the -finline-functions
Enables all –O2 optimizations that do not
typically increase code size
-funroll-loops : Loop unrolling
-finline-functions : Function inlining
36
Outline




Linux/Cygwin
GNU Compiler Collection
GNU Libraries and Linker
GNU Binary Utilities
37
How to make library1

Example: write a function print_str in “foo.c”
foo.c:
#include <stdio.h>
void print_str(char str[])
{
printf(“%s\n”, str);
}
38
How to make library2

First, make the object file “foo.o”
$ gcc -c foo.c

Second, use “ar” to create archive file
“libfoo.a”.

Option “c” to crate archive file, “r” to insert or
replace members to archive file.
$ ar cr libfoo.a
foo.o
39
How to use library

Write a header file “foo.h” :
foo.h :
extern void print_str(char []);

Our program “hello.c” :
hello.c:
#include <foo.h>
main ()
{
print_str(“hello world!”);
}
40
How to link library

Compile with library (assume “foo.h” &
“libfoo.a” in “/tmp” directory.)
$ gcc -I/tmp -L/tmp hello.c -lfoo
$ ./a.out
hello world!


gcc include “linker” step.
You can also use “ld” to linker objects and
libraries.
41
Practice #1





Temperature C = (5/9)(F-32)
Write a subroutine that convert the
temperature.
Compile the subroutine into an object file.
Make a temperature library
Write a program that invokes the function to
convert a source temperature to a target one
42
GNU C Library


In Linux, header files is usually in
“/usr/include”.
Online manual
http://www.gnu.org/manual/

To use GNU C library, you can search the
function name to see what header files you need
to include, and what library you need to link.
43
GNU Linker “ld”


ld combines a number of object and archive
files, relocates their data and ties up symbol
references.
Usually the last step in compiling a program,
ex:
$ gcc -I/tmp -c hello.c
$ ld -o hello -L/tmp /usr/lib/crt1.o /usr/lib/crti.o
hello.o -lfoo.a -lc
$ ./hello
hello world!
44
Shared Library1


Use ld to make shared object (shared
library).
Compile a shared library


Use “gcc” to make object file with “-fPIC”
option (generate position-independent code for
use in a shared library).
Use “ld” with “-shared”, “-soname” to make
shard object.
$ gcc -fPIC -c foo.c
$ ld -shared -soname libfoo.so -o libfoo.so.0 -lc foo.o
45
Shared Library2

Install shared library

Use “ldconfig” with “-v”, “-n” options. “-v” to
show messages. “-n” to process directories
specified on the command line.
$ ldcofnig -v -n .
.:
libfoo.so -> libfoo.so.0 (changed)

Not applicable on Cygwin! (why?)
46
Shared Library3

Using shared library

Add “/tmp” in LD_LIBRARY_PATH (assume
our libfoo.so in “/tmp” directory)

In bash
$ export LD_LIBRARY_PATH=/tmp:$LD_LIBRARY_PATH

In tcsh or csh
$ setenv LD_LIBRARY_PATH

/tmp:$LD_LIBRARY_PATH
Compile with library
$ gcc -I/tmp -L/tmp -o hello hello.c –lfoo
$ ./hello
hello world!
47
Linker Options1



-o output : Use output as the name for the
program produced by ld.
-larchive : Add archive file archive to the
list of files to link.
-Lsearchdir : Add path searchdir to the list
of paths that ld will search for archive
libraries .
48
Linker Options2



-b input-format : to specify the binary
format for input object files. ld may be
configured to support more than one kind of
object file.
-r : generate an output file that can in turn
serve as input to ld. This is often called
partial linking.
-E : When creating a dynamically linked
executable, add all symbols to the dynamic
symbol table.
49
Linker Options3


When using gcc, you can pass linking
options by “-Wl,option”.
Pass one option at once
$ gcc –Wl,-L.
hello.c -lfoo
$ ./hello
hello world!
-Wl,-ohello
-I/tmp -L/tmp
50
Practice #2



Temperature C = (5/9)(F-32)
Make a temperature shared library
Write a program that invokes the function to
convert a source temperature to a target one
51
Outline




Linux/Cygwin
GNU Compiler Collection
GNU Libraries and Linker
GNU Binary Utilities
52
ar

Creates, modifies, and extracts from
archives.



An archive is a single file holding a collection
of other files in a structure that makes it
possible to retrieve the original individual files.
ar is considered a binary utility because
archives of this sort are most often used as
libraries holding commonly needed subroutines.
ar creates an index to the symbols defined
in relocatable object modules in the archive.
53
ar - Some Options

ar [options] archive [member...]




c - create the archive.
r - insert the files member... into archive.
a - add new files after an existing member of
the archive.
b - add new files before an existing member of
the archive.
54
ar - Example

Write a function print_str in “foo.c”
void print_str(char str[])
{
printf(“%s\n”, str);
}

Make the object file “foo.o”
$ gcc -c foo.c

Use “ar” to create archive file “libfoo.a”.

Option “c” to crate archive file, “r” to insert or
replace members to archive file.
$ ar cr libfoo.a
foo.o
55
ranlib



Generates an index to the contents of an
archive and stores it in the archive.
The index lists each symbol defined by a
member of an archive that is a relocatable
object file.
Example
$ ranlib libfoo.a
56
nm


Lists the symbols from object files.
For each symbol, nm shows:




The symbol value
The symbol type
The symbol name
Example
$ nm -s libfoo.a
Archive index:
foo in foo.o
foo.o:
00000000 T foo
U printf
57
nm - Symbol Types

In the example



T : The symbol is in the text (code) section.
U : The symbol is undefined.
Some other types


D : The symbol is in the initialized data section.
N : The symbol is a debugging symbol.
58
nm - Some Options




-A, -o, --print-file-name : precede each
symbol by the name of the input file (or
archive member) in which it was found.
-s, --print-armap : include the index.
-a, --debug-syms : display all symbols.
-g, --extern-only : display only external
symbols.
59
objdump


Displays information about one or more
object files.
Options

-a : Display archive header information.
$ objdump -a libfoo.a
In archive libfoo.a:
foo.o:
file format elf32-i386
rw-r--r-- 824/800
780 May 13 11:00 2003 foo.o
60
objdump - Other Options






-f : Display contents of the overall file
header.
-h : Display contents of the section headers.
-x : Display contents of all headers.
-d : Display assembler contents of
executable sections.
-r : Display the relocation entries of the file.
-t : Display contents of the symbol table(s).
61
objdump - Sample1
$ objdump -h -r test1.o
test1.o:
Sections:
Idx Name
0 .text
file format pe-i386
Size
VMA
LMA
File off
00000040 00000000 00000000 000000b4
CONTENTS, ALLOC, LOAD, RELOC, READONLY,
1 .data
00000000 00000000 00000000 00000000
ALLOC, LOAD, DATA
2 .bss
00000000 00000000 00000000 00000000
ALLOC
3 .rdata
00000010 00000000 00000000 000000f4
CONTENTS, ALLOC, LOAD, READONLY, DATA
RELOCATION RECORDS FOR [.text]:
OFFSET
TYPE
VALUE
00000021 DISP32
__alloca
00000026 DISP32
___main
0000002d dir32
.rdata
00000032 DISP32
_printf
Algn
2**4
CODE
2**4
2**4
2**4
62
objdump - Sample2
$ objdump -h -r test1.exe
test1.exe:
Sections:
Idx Name
0 .text
1 .rdata
2 .bss
3 .idata
file format pei-i386
Size
00000390
CONTENTS,
00000010
CONTENTS,
00000040
ALLOC
00000188
CONTENTS,
VMA
LMA
File off
00401000 00401000 00000400
ALLOC, LOAD, READONLY, CODE
00402000 00402000 00000800
ALLOC, LOAD, READONLY, DATA
00403000 00403000 00000000
Algn
2**4
00404000 00404000
ALLOC, LOAD, DATA
2**2
00000a00
2**4
2**4
63
readelf


Displays information about one or more
ELF format object files.
Example: we use “-e” option to read all
header from the executable file of “hello.c”
$ gcc hello.c
$ readelf -e a.out

Not applicable on Cygwin! (why?)
64
readelf - Some Options





-h : Show ELF header information.
-l : Show program header information.
-S : Show section header informaion.
-s : Show the entries in symbol table section.
-e : Show all headers.
65
Other Binary Utilities





objcopy - copy and translate object files
size - list section sizes and total size
strings - list printable strings from files
strip - discard symbols
addr2line - convert addresses to file and line
66
Descargar

Development tools and Programming for embedded …