1

Bonjour,
Mon but est de compiler un fichier.asm pour un ARM et de le rendre exécutable.

J'ai commencé par créer un fichier.c que j'ai compilé avec gcc.
Donc : arm-linx-gcc -S fichier.c
Il me génère bien un fichier.s.

Comment puis-je rendre le fichier.s exécutable sans repasser par le fichier.c?

Merci d'avance.
Newbie

2

En utilisant as ?

3

Folco (./2) :
En utilisant as ?


Pas bête, je regarde s'il est capable de compiler un fichier asm déjà prévu pour de l'ARM.
Newbie

4

si t'as une toolchain arm c'est sans doute possible triso

mais gcc -c truc.c -o truc.o fera juste un fichier relogeable.

il te faudra ensuite un ldscript pour décrire la structure mémoire de ton système, et utiliser ld pour convertir le fichier .o en fichier binaire.

cherche "yagarto" sur google.

5

squalyl, en lançant la commande : arm-linx-gcc -S fichier.c, j'obtiens bien un fichier assembleur pour ARM qui semble être valide.
Newbie

6

bah oui bien sur, mais tu vas devoir le passer à la moulinette "as" quand même, gcc -c fait ça en une seule étape.

7

Bon, j'ai regardé le man as, cela me semblait bien trop simple pour fonctionner du premier coup...

as mcpu=arm9tdmi march=armv4t boucle.s

Assembler messages:
Error: can't open mcpu=arm9tdmi for reading: No such file or directory
mcpu=arm9tdmi:0: Error: can't open march=armv4t for reading: No such file or directory
boucle.s:14: Error: junk at end of line, first unrecognized character is `@'
boucle.s:15: Error: junk at end of line, first unrecognized character is `@'
boucle.s:16: Error: too many memory references for `mov'
boucle.s:17: Error: no such instruction: `stmfd sp!,{fp,ip,lr,pc}'
boucle.s:18: Error: too many memory references for `sub'
boucle.s:19: Error: too many memory references for `sub'
boucle.s:20: Error: no such instruction: `b .L2'
boucle.s:22: Error: no such instruction: `ldr r3,.L5'
boucle.s:23: Error: no such instruction: `ldr r3,[r3,'
boucle.s:24: Error: too many memory references for `add'
boucle.s:25: Error: no such instruction: `ldr r3,.L5'
boucle.s:26: Error: invalid char '[' beginning operand 2 `[r3'
boucle.s:28: Error: no such instruction: `ldr r3,.L5'
boucle.s:29: Error: no such instruction: `ldr r2,[r3,'
boucle.s:30: Error: no such instruction: `ldr r3,.L5+4'
boucle.s:31: Error: too many memory references for `cmp'
boucle.s:32: Error: no such instruction: `bne .L3'
boucle.s:33: Error: no such instruction: `ldmfd sp,{r3,fp,sp,pc}'
boucle.s:38: Warning: value 0x15752a00 truncated to 0x2a00

Il semblerait qu'il ne reconnaisse rien...
Je joins mon super programme de la mort smile

tromb Fichier joint : boucle.s
Newbie

8

il semblerait que tu n'aies jamais utilisé un prog en ligne de commande

Et puis es tu sur que c'est as qu'il faut utiliser et pas arm-linux-as? parce que la commande as existe, c'est celle du x86

C:\Documents and Settings\SLO>arm-mingw32ce-as --help
Usage: arm-mingw32ce-as [option...] [asmfile...]
Options:
  -a[sub-option...]       turn on listings
                          Sub-options [default hls]:
                          c      omit false conditionals
                          d      omit debugging directives
                          g      include general info
                          h      include high-level source
                          l      include assembly
                          m      include macro expansions
                          n      omit forms processing
                          s      include symbols
                          =FILE  list to FILE (must be last sub-option)
  --alternate             initially turn on alternate macro syntax
  -D                      produce assembler debugging messages
  --debug-prefix-map OLD=NEW  Map OLD to NEW in debug information
  --defsym SYM=VAL        define symbol SYM to given value
  -f                      skip whitespace and comment preprocessing
  -g --gen-debug          generate debugging information
  --gstabs                generate STABS debugging information
  --gstabs+               generate STABS debug info with GNU extensions
  --gdwarf-2              generate DWARF2 debugging information
  --hash-size=<value>     set the hash table size close to <value>
  --help                  show this message and exit
  --target-help           show target specific options
  -I DIR                  add DIR to search list for .include directives
  -J                      don't warn about signed overflow
  -K                      warn when differences altered for long displacements
  -L,--keep-locals        keep local symbols (e.g. starting with `L')
  -M,--mri                assemble in MRI compatibility mode
  --MD FILE               write dependency information in FILE (default none)
  -nocpp                  ignored
  -o OBJFILE              name the object-file output OBJFILE (default a.out)
  -R                      fold data section into text section
  --reduce-memory-overheads
                          prefer smaller memory use at the cost of longer
                          assembly times
  --statistics            print various measured statistics from execution
  --strip-local-absolute  strip local absolute symbols
  --traditional-format    Use same format as native assembler when possible
  --version               print assembler version number and exit
  -W  --no-warn           suppress warnings
  --warn                  don't suppress warnings
  --fatal-warnings        treat warnings as errors
  -w                      ignored
  -X                      ignored
  -Z                      generate object file even after errors
  --listing-lhs-width     set the width in words of the output data column of
                          the listing
  --listing-lhs-width2    set the width in words of the continuation lines
                          of the output data column; ignored if smaller than
                          the width of the first line
  --listing-rhs-width     set the max width in characters of the lines from
                          the source file
  --listing-cont-lines    set the maximum number of continuation lines used
                          for the output data column of the listing
  @FILE                   read options from FILE
 ARM-specific assembler options:
  -k                      generate PIC code
  -mthumb                 assemble Thumb code
  -mthumb-interwork       support ARM/Thumb interworking
  -mapcs-32               code uses 32-bit program counter
  -mapcs-26               code uses 26-bit program counter
  -mapcs-float            floating point args are in fp regs
  -mapcs-reentrant        re-entrant code
  -matpcs                 code is ATPCS conformant
  -mbig-endian            assemble for big-endian
  -mlittle-endian         assemble for little-endian
  -mapcs-frame            use frame pointer
  -mapcs-stack-check      use stack size checking
  -mno-warn-deprecated    do not warn on use of deprecated feature
  -mcpu=<cpu name>        assemble for CPU <cpu name>
  -march=<arch name>      assemble for architecture <arch name>
  -mfpu=<fpu name>        assemble for FPU architecture <fpu name>
  -mfloat-abi=<abi>       assemble for floating point ABI <abi>
  -mimplicit-it=<mode>    controls implicit insertion of IT instructions
  -EB                     assemble code for a big-endian cpu
  -EL                     assemble code for a little-endian cpu
  --fix-v4bx              Allow BX in ARMv4 code

Report bugs to <http://www.sourceware.org/bugzilla/>


d'après les options (oui, oui, il FAUT savoir lire l'anglais en info), la commande serait:

arm-linux-as -mcpu=arm9tdmi -march=armv4t boucle.s -o boucle.o

le nom de la commande est peut etre a adapter.

allez courage , mais l'info c'est pas du petit bonheur la chance ^^

9

Salut, je ne sais pas pourquoi j'ai bloqué sur le AS déjà installé... alors que je sais que c'est pour un ARM que je fais ça.
Je n'ai plus qu'à trouver comment l'installer.
Newbie

10

[google]yagarto[/google] pour windows et mac,
[google]crosstools-ng[/google] pour unix.

11

Merci, pour le coup de main.
En fait, j'ai pas mal utilisé buildroot.
Bon je n'ai plus qu'à trouver le moyen pour rendre mon fichier.o exécutable.
Newbie

12

squalyl (./10) :
[google]yagarto[/google] pour windows et mac,
[google]crosstools-ng[/google] pour unix.

[google]codesourcery[/google] plutot pour les trois plateformes
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

13

Bonjour,
Simplement pour dire que ça avance à son rythme smile
Newbie

14

Bonjour,
J'ai réussi à assembler mon fichier.o pour en créer un exécutable.
arm-linux-ld -A armv4t boucleasm.o -o boucleexe.exe

Lorsque je lance cette commande, le compilateur me dit :
arm-linux-ld: warning: cannot find entry symbol _start; defaulting to 00008094

Il a tout a fait raison, il n'y a pas le symbole _start.

Il me crée tout de même l'exécutable. Je le lance dans la cible.
Le timing est respecté mais il termine par un 'segment fault'.

A part aller modifier directement le fichier.s, je ne vois pas d'autre solution pour corriger ce petit problème.

Avez-vous une autre solution?
Merci
Newbie

15

c'est quoi la cible? gdb --target sim? qemu?

il faudrait construire la cible en mode debug avec CFLAGS=-g LDFLAGS=-g, puis exécuter la cible dans gdb, pour savoir ou se produit la segfault.

quand le debugger s'arrête sur l'instruction, tu fais list pour voir le code qui plante, puis bt pour voir l'arbre d'appels.

puis tu pries pour que ce soit compréhensible cheeky

(oui, on peut exécuter gdb dans gdb si nécessaire)

16

(et juste au passage, sous un UNIX, l'extention "exe" n'a aucune sens ^^)
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

17

Bonjour,

squalyl
Alors la cible est un ARM922tdmi.
D'ailleurs, je me demandais si CFLAGS, LDFLAGS étaient des noms données arbitrairement (pour le programmeur) ou bien si ce sont des noms spécifiques avec une signification propre lors de la compilation?

Godzil
C'est vrai, du moment qu'il est exécutable.

Merci
Newbie

18

ce sont les flags pour la compilation (CC) et pour l'édition de liens (ld)

19

squalyl (./18) :
ce sont les flags pour la compilation (CC) et pour l'édition de liens (ld)


Ok et donc ils sont normalisés? Ou je peux mettre ce que je veux?
Newbie

20

honnêtement, je te vois venir depuis quelques posts: renseigne toi sérieusement sur le fonctionnement de gcc et de ses copains as et ld. tu manques sérieusement de concepts dans ce domaine.

tu peux mettre ce que tu veux: ça veut dire quoi? "bonjour maman j'ai acheté des fraises" n'est pas valide pour CFLAG, ce sont des variables d'environnement contenant des options pour les outils, qui sont ajoutés à leur ligne de commande au moment ou le compilateur/assembleur/autre est appelé par un makefile.

21

Mouais, je ne vois pas trop où tu me vois venir mais bon...
Le principe d'un débutant c'est qu'il débute...
Newbie

22

il n'y a aucun mal à être débutant.
par contre il y en a un a ne pas essayer soi même avant de poser des questions.

[google]cflags[/google]
[google]ldflags[/google]

23

Justement j'essaie, je demande, tout ça pour m'améliorer smile
Newbie

24

CFLAGS et LDFLAGS sont des noms choisis arbitrairement, que make sais aller chercher, mais ce n'est pas GCC qui les utilisent (un simple strings sur gcc permet de s'en rendre compte)
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

25

Il ne faut pas linker avec ld directement, mais avec gcc, qui rajoutera les libs standard qu'il faut (code de démarrage si nécessaire, libgcc, libc).
Donc appelle arm-linux-gcc, pas arm-linux-ld.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

26

Godzil
Merci c'est ce que je souhaitais savoir car j'ai fait un makefile qui reprend la création de tous les fichiers et j'ai donc des AFLAGS... Le nom variant suivant l'utilité.


Je tente de debugger mon programme avec ddd.
Je lance la commande : ddd --debugger arm-linux-gdb boucle
L'interface s'ouvre avec mon programme.
Lorsque je fais 'run', il m'affiche 'Don't know how to run. Try "help target".

Alors dans "help target"
List of target subcommands:
target async -- Use a remote computer via a serial line
target core -- Use a core file as a target
target exec -- Use an executable file as a target
target extended-async -- Use a remote computer via a serial line
target extended-remote -- Use a remote computer via a serial line
target remote -- Use a remote computer via a serial line

Donc, je lance target exec boucle puis run... mais c'est toujours la même réponse...
Newbie

27

il faut compiler gdb avec le support pour le simulateur.

t'auras un target sim qui te permettra d'exécuter de l'arm sur ton pc.

ça se fait en trifouillant le ./configure de gdb.

voila un exemple de ce que tu pourras faire:
http://sources.redhat.com/ml/crossgcc/2000-q1/msg00019.html

28

Bonjour,
squalyl, ton lien ne m'a pas avancé d'un poil sad
Je n'arrive toujours pas à installer ce target sim...
J'ai regardé dans gdb, ./configure --help, je n'ai pas vu d'info dessus.
Newbie

29

http://sunsite.ualberta.ca/Documentation/Gnu/gdb-4.18/html_node/gdb_137.html

http://www.ensta.fr/~pollet/linux/arm_dt.html

5 minutes de
google gdb configure sim
google gdb configure sim arm
première page à chaque fois

donc y'a même pas besoin de trifouiller en fait. par contre faut pas oublier le --taget=arm-elf sinon il te fera un GDB pour X86 qui a pas besoin de simulateur, évidemment.

30

Salut squalyl,
Ces deux liens, je les ai déjà lus smile
Au début, je pense que je devais mettre --target=arm-linux mais j'ai lu sur des articles que celui-ci ne serait pas dispo.
Par contre, ils dataient de 2005.
Pour avoir ce fameux target sim, j'ai commencé à changer la target par arm-elf.
Tu me confortes dans mon idée.
Newbie