|
1. 2. 2.1. 2.1.1. 2.1.1.1. 2.1.1.2. 2.1.1.3. 2.1.2. 2.1.2.1. 2.1.2.2. 2.1.3. 2.1.3.1. 2.1.3.2. 2.1.3.3. 2.1.3.4. 3. 3.1. 3.2. 3.3. 3.4. 3.5. 3.6. 3.7. 3.8. 4. 5. |
Introduction : Présentation : Description : Les Utilitaires : arm-linux-gcc : arm-linux-as : arm-linux-ld : Le débogueur : arm-linux-gdb : ddd : Exemple d'utilisation : Fichier source : Compilation : Simulation : Simulation avec l'interface graphique : Installation : Packages nécessaires : Le noyau : Les utilitaires : Le compilateur (1ère phase) : La librairie : Le compilateur (2ème phase) : Le débogueur et simulateur : L'interface : Références : |
|
.file "example.s" .text @ ENTRY .global _start @ mark first instruction .type _start,%function @ to execute _start: MOV r0, #15 @ Set up parameters MOV r1, #20 BL firstfunc @ Call subroutine SWI 0x11 @ terminate firstfunc: @ Subroutine firstfunc ADD r0, r0, r1 @ r0 = r0 + r1 MOV pc, lr @ Return from subroutine @ with result in r0 @ END _end: @ mark end of file
Génération de l'exécutable : arm-linux-ld -o example example.o
make LANGUAGES=c
Il se peut qu'une erreur soit générée au bout d'un certain temps dû à la tentative d'exécution d'un programme pour une architecture ARM sur une architecture I586 :
make -i LANGUAGES=C install
Et voir si on obtient bien un exécutable arm-linux-gcc dans < INST_DT_DIR >/bin. Si tel est le cas essayons maintenant de compiler un programme qui ne fait rien :
rpm -ivh ddd-static-*.i386.rpm
2.1.3.3. Simulation :
GNU gdb 4.18
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "--host=i586-pc-linux-gnu --target=arm-linux".
(gdb)
(gdb) file example
Reading symbols from example...(no debugging symbols found)...done.
(gdb) target sim
Connected to the simulator.
(gdb) load
Loading section .text, size 0x18 vma 0x2000074
Start address 0x2000074
Transfer rate: 192 bits in <1 sec.
(gdb) disassem 0x2000074 0x200008c
Dump of assembler code from 0x2000074 to 0x200008c:
0x2000074 < _start > : mov r0, #15
0x2000078 < _start+4 > : mov r1, #20
0x200007c < _start+8 > : bl 0x2000084 < firstfunc >
0x2000080 < _start+12 > : swi 0x00000011
0x2000084 < firstfunc > : add r0, r0, r1
0x2000088 < firstfunc+4 >: mov pc, lr
(gdb) frame 0
#0 0xc000002 in ?? ()
(gdb) info reg
a1 0x0 0
a2 0x0 0
a3 0x0 0
a4 0x0 0
v1 0x0 0
v2 0x0 0
v3 0x0 0
v4 0x0 0
v5 0x0 0
v6 0x0 0
sl 0x0 0
fp 0x800 2048
ip 0x0 0
sp 0x800 2048
lr 0x0 0
pc 0xc000003 201326595
fps 0x0 0
ps 0xc3 195
(gdb) run
Starting program: example
Program exited with code 043.
(gdb) info reg
a1 0x23 35
a2 0x14 20
a3 0x0 0
a4 0x0 0
v1 0x0 0
v2 0x0 0
v3 0x0 0
v4 0x0 0
v5 0x0 0
v6 0x0 0
sl 0x0 0
fp 0x0 0
ip 0x0 0
sp 0x0 0
lr 0x2000080 33554560
pc 0x2000080 33554560
fps 0x0 0
ps 0x10 16
Remarque :
On visualise ici des registres APCS.
2.1.3.4. Simulation avec l'interface graphique :
3. Installation :
3.1. Packages nécessaires :
Voici pour finir la liste des fichiers et leur version qui m'ont permis de constituer mon environnemnt de développement à la date d'écriture de ce document :
3.2. Le noyau :
On peut l'installer à l'endroit habituel /usr/src ou ailleurs puisqu'on n'a pas besoin de le compiler ni de l'installer pour les outils de développement . C'est simplement pour fixer des options d'optimisations et des librairies pour le compilateur C. Cependant pour faire croire à une architecture ARM il faut modifier le fichier Makefile :
[...]
# ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/
arm/ -e s/sa110/arm/)
ARCH := arm
[...]
Il faut ensuite configurer le noyau au niveau système et processeur de la façon suivante (make xconfig) :
3.3. Les utilitaires :
Pas de problème particulier pour l'installation du package "binutil", INST_DT_DIR étant le répertoire d'installation des outils de développement :
./configure --target=arm-linux --prefix=< INST_DT_DIR >
make
make install
3.4. Le compilateur (1ère phase) :
./configure \
--target=arm-linux \
--with-include-dir=< INST_DT_DIR >/arm-linux/include \
--prefix=< INST_DT_DIR >
Lors de la première compilation, il faut ajouter l'option LANGUAGES=c pour qu'il ne construise pas le C++ et l'objective C.
[...]
iofprintf.c ..linked
iofputs.c ..linked
iofread.c ..linked
iofscanf.c ..linked
iofsetpos.c ..linked
ioftell.c ..linked
[...]
checking whether the C compiler (/usr/local/src/ARM_dev/egcs-1.1.1/gcc/xgcc
-B/usr/local/src/ARM_dev/egcs-1.1.1/gcc/ -g -O2 ) works... no
configure: error: installation or configuration problem: C compiler cannot
create executables.
make: *** [configure-target-libiberty] Error 1
Mais généralement le compilateur a été généré. Pour s'en convaincre il faut essayer de l'installer par la commande :
int rien(int a,int b)
{
return a+b;
}
Génération du code assembleur ARM rien.s par la commande arm-linus-gcc -S rien.c :
.file "rien.c"
rfp .req r9
sl .req r10
fp .req r11
ip .req r12
sp .req r13
lr .req r14
pc .req r15
gcc2_compiled.:
__gnu_compiled_c:
.text
.align 2
.global rien
.type rien,%function
rien:
@ args = 0, pretend = 0, frame = 8
@ frame_needed = 1, current_function_anonymous_args = 0
mov ip, sp
stmfd sp!, {fp, ip, lr, pc}
sub fp, ip, #4
sub sp, sp, #8
str r0, [fp, #-16]
str r1, [fp, #-20]
ldr r3, [fp, #-16]
ldr r2, [fp, #-20]
add r3, r3, r2
mov r0, r3
b .L1
.L1:
ldmea fp, {fp, sp, pc}
.Lfe1:
.size rien, .Lfe1 - rien
.ident "GCC: (GNU) egcs-2.91.60 19990113/philb (egcs-1.1.1 release)"
Désassemblage du code par arm-linux-objdump -d rien.o en ayant auparavant généré le fichier objet par la commande arm-linux-gcc -c rien.c :
rien.o: file format elf32-arm
Disassembly of section .text:
00000000 < rien >:
0: e1a0c00d mov ip, sp
4: e92dd800 stmdb sp!, {fp, ip, lr, pc}
8: e24cb004 sub fp, ip, #4
c: e24dd008 sub sp, sp, #8
10: e50b0010 str r0, [fp, -#16]
14: e50b1014 str r1, [fp, -#20]
18: e51b3010 ldr r3, [fp, -#16]
1c: e51b2014 ldr r2, [fp, -#20]
20: e0833002 add r3, r3, r2
24: e1a00003 mov r0, r3
28: eaffffff b 2c < rien+0x2c >
2c: e91ba800 ldmdb fp, {fp, sp, pc}
C'est tout bon ! Passons maintenant à la compilation de la librairie.
Remarque :
Dans le répertoire < INST_DT_DIR >/arm-linux/include vous aurez créé les liens symboliques suivants :
asm -> < INST_KERNEL_DIR >/include/asm
linux -> < INST_KERNEL_DIR >/include/linux
< INST_KERNEL_DIR > étant le répertoire d'installation du noyau.3.5. La librairie :
./configure \
--prefix=< INST_DT_DIR > \
--with-headers=< INST_DT_DIR >/arm-linux/include \
--enable-add-ons -host=arm-linux -build=i386-linux
make
make install
Remarque :
Vérifier auparavant que les liens dans le répertoire < INST_DT_DIR >/arm-linux/include/asm
sont correctes :
arch -> arch-ebsa285
proc -> proc-armv
3.6. Le compilateur (2ème phase) :
Il faut maintenant compiler le package "egcs" entièrement et prendre en compte les nouvelles librairie . Ne pas oublier de faire un make distclean avant de relancer la configuration :
.configure \
--target=arm-linux \
--with-headers=< INST_DT_DIR >/include \
--with-libs=< INST_DT_DIR >/lib \
--prefix=< INST_DT_DIR >
make
make install
Remarque :
Les librairies vont être recopiées dans < INST_DT_DIR >/arm-linux/lib puis
< INST_DT_DIR >/arm-linux/sys-include.
Personnellement pour éviter de gacher de la place, j'ai créé les liens suivants dans
< INST_DT_DIR >/arm-linux :
lib -> ../lib
sys-include -> ../include
3.7. Le débogueur et simulateur :
Pas de problème particulier si ce n'est qu'il faut indiquer un répertoire d'installation autre que celui des outils de développement :
.configure --target=arm-linux --prefix=< INST_GDB_DIR >
make
make install
3.8. L'interface :
Pour les raisons invoquées dans la section "Packages nécessaires", j'ai choisi un package RPM :4. Références :
5. Download :
Cet environnement de développement a été compilé sur une plateforme i586-linux avec une distribution RedHat-5.2 et un noyau 2.2.6. Il commence à dater et il faudrait faire la même chose avec un "gcc" d'actualité :
Pour extraire : tar xIvf < fichier >.tbz