Série 5 de développement de pilotes Linux embarqués : système Linux et HelloWorld

trois questions

A quoi sert de comprendre le processus d'exécution du programme Hello World ?

Compilation et exécution : L'exécution du programme Hello World est divisée en deux étapes principales : la compilation et l'exécution. Un compilateur transforme le code source en un fichier exécutable, que l'ordinateur exécute ensuite et produit un résultat approprié. Comprendre ce processus peut nous aider à comprendre comment transformer le code en un programme exécutable.

Syntaxe et sémantique : Le programme Hello World est un exemple simple qui contient quelques règles syntaxiques et sémantiques de base. En étudiant le processus d'exécution du programme Hello World, nous pouvons comprendre comment utiliser correctement les mots-clés, identifiants, instructions et expressions du langage de programmation, et leurs fonctions dans le programme.

Débogage et gestion des erreurs : lorsque nous écrivons du code, des erreurs apparaissent souvent. Comprendre le processus d'exécution du programme Hello World peut nous aider à mieux comprendre et déboguer les erreurs dans le code. Nous pouvons apprendre à trouver et à corriger les erreurs courantes de syntaxe et de logique, et à améliorer la qualité et la fiabilité de notre code.

Sortie et interaction du programme : Le résultat d'exécution du programme Hello World est généralement une sortie texte dans le terminal ou la ligne de commande. Cela nous aide à comprendre comment le programme interagit avec l'utilisateur et présente les résultats à l'utilisateur. Comprendre ce processus est important pour développer des applications complexes et des interfaces utilisateur.

Comment le programme HelloWorld est-il exécuté dans le développement bare metal ?

La première étape consiste à écrire le code source, le point clé est la réalisation de la fonction printf, qui doit s'appuyer sur le pilote de port série du micro-ordinateur monopuce.

La deuxième étape : Compiler le programme à l'aide d'un environnement de développement intégré. Compilation en un clic, pas besoin d'acquérir des connaissances sur la compilation et la liaison.

Étape 3 : Gravez sur une puce spécifique à l'aide d'un outil de gravure. Gravure à une touche, pas besoin d'apprendre le flash de la puce et diverses méthodes de démarrage.

Étape 4 : Allumez et démarrez la carte de développement, et le port série produira la chaîne "Hello World".

Comment le programme Hello World est-il exécuté sous le système Linux ?

quatre cas

gcc prétraite les fichiers c

COLLECT_GCC_OPTIONS='-E' '-o' 'hello.i' '-v' '-mtune=generic' '-march=x86-64' /usr/lib/gcc/x86_64-linux-gnu/5/cc1 - E -quiet -v -imultiarch x86_64-linux-gnu hello.c -o hello.i -mtune=generic -march=x86-64 -fstack-protector-strong -Wformat -Wformat-security

Voici un exemple d'options de ligne de commande pour le compilateur gcc. Sa fonction est de prétraiter le fichier source C hello.c en fichier hello.i. Vous trouverez ci-dessous une explication de chaque option :

  1. -E: indique que seul le prétraitement est effectué et qu'aucune opération de compilation et de liaison n'est effectuée.
  2. -o hello.i: spécifiez le nom de fichier de la sortie de prétraitement comme hello.i.
  3. -v: sortie détaillée des informations d'exécution du compilateur.
  4. -mtune=generic: spécifie l'optimisation pour les processeurs à usage général lors de la compilation.
  5. -march=x86-64: spécifie de générer du code pour l'architecture x86-64.
  6. -fstack-protector-strong: générer du code qui applique la protection de la pile pour empêcher les vulnérabilités de débordement de la mémoire tampon.
  7. -Wformat -Wformat-security: activez les avertissements concernant les chaînes de format.

gcc compile les fichiers c

gec@ubuntu:~/hello$ sudo gcc -S hello.i -o hello.s -v

COLLECT_GCC_OPTIONS='-s' '-o' 'hello.s' '-v' '-mtune=generic' '-march=x86-64'
 /usr/lib/gcc/x86_64-linux-gnu/5/cc1 - fpreprocessed hello.i -quiet -dumpbase hello.i -mtune=generic -march=x86-64 -auxbase hello -version -fstack-protector-strong -Wformat -Wformat-security -o /tmp/cc88JZ4W.s

Voici un autre exemple d'options de ligne de commande pour le compilateur gcc. Sa fonction est de continuer à compiler le fichier prétraité hello.i pour générer le fichier en langage assembleur hello.s. Vous trouverez ci-dessous une explication de chaque option :

  1. -s: Générer des fichiers en langage assembleur.
  2. -o hello.s: spécifiez le nom du fichier de sortie du langage d'assemblage comme hello.s.
  3. -v: sortie détaillée des informations d'exécution du compilateur.
  4. -mtune=generic: spécifie l'optimisation pour les processeurs à usage général lors de la compilation.
  5. -march=x86-64: spécifie de générer du code pour l'architecture x86-64.
  6. -fpreprocessed hello.i: spécifiez le fichier prétraité hello.i comme fichier d'entrée.
  7. -dumpbase hello.i: spécifiez le fichier d'entrée de base comme hello.i.
  8. -auxbase hello: spécifiez le nom du fichier de base auxiliaire comme hello.
  9. -version: Imprimer les informations de version.
  10. -fstack-protector-strong: générer du code qui applique la protection de la pile pour empêcher les vulnérabilités de débordement de la mémoire tampon.
  11. -Wformat -Wformat-security: activez les avertissements concernant les chaînes de format.
  12. -o /tmp/cc88JZ4W.s: spécifiez le chemin du fichier de sortie du langage d'assemblage sous la forme /tmp/cc88JZ4W.s.

Assemblage de compilation gcc

sudo gcc -c bonjour.s -o bonjour.o -v

gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12) 
COLLECT_GCC_OPTIONS='-c' '-o' 'hello.o' '-v' '-mtune=generic' '-march=x86-64 '
 comme -v --64 -o bonjour.o bonjour.s

comme -v --64 -o bonjour.o bonjour.s

Lorsque gcc compile le fichier d'assemblage dans un fichier de relocalisation, il utilise le programme d'application as
 

gcc liant les fichiers déplaçables

ld-connecteur

collect2 encapsule le connecteur ld

COLLECT_GCC_OPTIONS='-o' 'bonjour' '-v' '-mtune=générique' '-march=x86-64'
 /usr/lib/gcc/x86_64-linux-gnu/5 / collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/5/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper -plugin-opt=-fresolution =/tmp/cc9OI5DQ.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass -through=-lgcc -plugin-opt=-pass-through=-lgcc_s --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed - lien dynamique /lib64/ld-linux-x86-64.so.2 -z relro -o bonjour /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux -gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux- gnu/5/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/5 -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64 -linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/. ./lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/5/../../.. hello.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/5/crtend.o /usr/lib/gcc/x86_64-linux-gnu/5/../ ../../x86_64-linux-gnu/crtn.o

(encapsule le programme ld)

lien statique

COLLECT_GCC_OPTIONS='-o' 'hello_static' '-v' '-static' '-mtune=generic' '-march=x86-64'
 /usr/lib/gcc/x86_64-linux-gnu/5/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/5/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64- linux-gnu/5/lto-wrapper -plugin-opt=-fresolution=/tmp/ccqTGMxr.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_eh -plugin- opt=-pass-through=-lc --sysroot=/ --build-id -m elf_x86_64 --hash-style=gnu --as-needed -static -z relro -o hello_static /usr/lib/gcc/x86_64 -linux-gnu/5/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64 -linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/5/crtbeginT.o -L/usr/lib/gcc/x86_64-linux-gnu/5 -L/usr/lib/gcc /x86_64-linux-gnu/5/../../../x86_64-linux-gnu-L/usr/lib/gcc/x86_64-linux-gnu/5/../../../. ./lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/ lib/gcc/x86_64-linux-gnu/5/../../.. bonjour.o --start-group -lgcc -lgcc_eh -lc --end-group /usr/lib/gcc/x86_64-linux-gnu/5/crtend.o /usr/lib/gcc/x86_64-linux-gnu/5/ ../../../x86_64-linux-gnu/crtn.o

Entrez ls -lh pour voir la différence de taille de fichier entre la compilation dynamique et la compilation statique

 

Je suppose que tu aimes

Origine blog.csdn.net/qq_51519091/article/details/132134215
conseillé
Classement