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-jumpsde objdump permet d’afficher les saut de manière plus graphique. - L’option
-Saka--sourcepermet 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
ldrésout les symboles,ldne fait qu’une passe de recherche dans une librairie passée en argument avec-let il va chercher dans cette librairie les symboles non définis dans les.opassés avant l’argument-l. Donc la position du-lest 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.ald -o main main.o -lmalibVa fonctionner mais
ld -o main -lmalib main.o ld -lmalib -o main main.o ld -lmalib main.o -o mainNe vont tous pas fonctionner.
Ceci est cependant spécifique à l’option-lpar exemple si vous avezld bar.o foo.o main.o -o mainet 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 avecman <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
objdumputilisé dans le cours pour ARM n’a pas l’option--visualize-jumpsalors 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 outilsman <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=bou--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.