Programmation assembleur ARM & x86 (cours ASM)

Pas mal d’infos en lien avec le cours, notamment sur l’environnement des Makefiles et les techniques de debugging, ont été amenés par Rick. A découvrir prochainement dans ce topic de discussion.

FAQ Laboratoire 1

Comment se passe le démarrage d’un programme sous Linux ?

Notes :

  • L’option --visualize-jumps de objdump permet d’afficher les saut de manière plus graphique.
  • L’option -S aka --source permet d’avoir le code C entremêlé avec l’assembleur
    Pour plus d’informations consultez le manuel https://linux.die.net/man/1/objdump

FAQ Laboratoire 2

  • Linker : Attention à comment ld résout les symboles, ld ne fait qu’une passe de recherche dans une librairie passée en argument avec -l et il va chercher dans cette librairie les symboles non définis dans les .o passés avant l’argument -l. Donc la position du -l est importante.

    Le texte du manuel dit " The linker will search an archive only once, at the location where it is specified on the command line. If the archive defines a symbol which was undefined in some object which appeared before the archive on the command line, the linker will include the appropriate file (s) from the archive. However, an undefined symbol in an object appearing later on the command line will not cause the linker to search the archive again." https://linux.die.net/man/1/ld

    Par exemple si main.o a besoin d’une fonction dans libmalib.a

    ld -o main main.o -lmalib
    

    Va fonctionner mais

    ld -o main -lmalib main.o
    ld -lmalib -o main main.o
    ld -lmalib main.o -o main
    

    Ne vont tous pas fonctionner.
    Ceci est cependant spécifique à l’option -l par exemple si vous avez

    ld bar.o foo.o main.o -o main
    

    et que foo.o a besoin d’un symbole dans bar.o cela ne pose pas problème.

    ld propose toutefois une option -( archives -) qui permet de chercher dans les librairies à répétition, mais cela ralentit la compilation (à cause des recherches successives) donc on aura plutôt tendance à utiliser -l. Pour plus d’infos, lire le manuel : https://linux.die.net/man/1/ld

  • Makefiles : Pour les Makefiles si quelque-chose n’est pas clair, ne pas hésiter à consulter les modes d’emplois :

    Make : https://www.gnu.org/software/make/manual/
    GCC : https://gcc.gnu.org/onlinedocs/
    LD : https://sourceware.org/binutils/docs/ld/
    Objdump : https://sourceware.org/binutils/docs/binutils/objdump.html
    AR : https://sourceware.org/binutils/docs/binutils/ar.html#ar
    Ne pas hésiter à consulter les man pages, soit via le terminal avec man <tool> e.g., man ld, soit via des sites web comme https://linux.die.net/man/

    Note : Selon la version de l’outil installé les man pages peuvent différer légèrement car l’outil diffère selon les versions, par ex : La version de objdump utilisé dans le cours pour ARM n’a pas l’option --visualize-jumps alors que celui pour x86 l’a. Donc pour être sur, le mieux est d’utiliser les man pages fournies (installées) avec l’outil, donc dans le shell où vous appelez vos outils man <outil>.

  • Make : C’est une bonne idée d’appeler make avec l’option -n (--just-print, --dry-run) afin de voir quelles commandes make seront appelées sans les appeler réellement (donc sans modifier de fichiers ou en générer). Ceci évite des accidents, par exemple si la règle “clean” était mal écrite, e.g., rm *, ceci risque d’effacer tous les fichiers du dossier courant.
    Ceci permet de voir que les bonnes commandes seront appelées.

  • Make : Utiliser --debug=b ou --debug, -d (pour plus d’infos) afin de voir et comprendre comment make prends les décisions sur quelles règles appliquer et quel est son comportement.