Qu'est-ce que global start en assembly language?
c'est mon code de niveau d'assemblage ...
section .text
global _start
_start: mov eax, 4
mov ebx, 1
mov ecx, mesg
mov edx, size
int 0x80
exit: mov eax, 1
int 0x80
section .data
mesg db 'KingKong',0xa
size equ $-mesg
sortie:
root@bt:~/Arena# nasm -f elf a.asm -o a.o
root@bt:~/Arena# ld -o out a.o
root@bt:~/Arena# ./out
KingKong
Ma question est qu'est-Ce que le global _start utilisé pour ? J'ai tenté ma chance avec M. Google et j'ai trouvé qu'il est utilisé pour indiquer le point de départ de mon programme. Pourquoi ne pouvons-nous pas juste avoir le _start
pour dire où le programme commence comme celui donné ci-dessous qui produit une sorte
avertissement à l'écran
section .text
_start: mov eax, 4
mov ebx, 1
mov ecx, mesg
mov edx, size
int 0x80
exit: mov eax, 1
int 0x80
section .data
mesg db 'KingKong',0xa
size equ $-mesg
root@bt:~/Arena# nasm -f elf a.asm
root@bt:~/Arena# ld -e _start -o out a.o
ld: warning: cannot find entry symbol _start; defaulting to 0000000008048080
root@bt:~/Arena# ld -o out a.o
ld: warning: cannot find entry symbol _start; defaulting to 0000000008048080
4 réponses
global
la directive est spécifique à la NASM. C'est pour exporter des symboles dans votre code à l'endroit où il pointe dans le code objet généré. Ici, vous marquez _start
symbole global de sorte que son nom est ajouté dans le code d'objet ( a.o
). Le linker ( ld
) peut lire ce symbole dans le code objet et sa valeur de sorte qu'il sait où marquer comme point d'entrée dans l'exécutable de sortie. Lorsque vous exécutez l'exécutable, il commence à l'endroit marqué _start
dans le code.
si une directive global
manque pour un symbole ce symbole ne sera pas placé dans la table d'exportation du code objet de sorte que le linker n'a aucun moyen de savoir à propos du symbole.
si vous voulez utiliser un nom de point d'entrée différent de _start
(qui est la valeur par défaut), vous pouvez spécifier -e
paramètre à LD comme:
ld -e my_entry_point -o out a.o
un label n'est pas explicitement global tant que vous ne l'avez pas déclaré global, vous devez donc utiliser la directive global.
l'étiquette globale "_start" est nécessaire pour le linker, s'il n'y a pas d'adresse _start globale alors le linker se plaindra parce qu'il ne peut pas en trouver une. Vous n'avez pas déclaré _start comme global de sorte qu'il n'est pas visible en dehors de ce module/objet de code donc pas visible pour le linker.
C'est le contraire de C où les choses sont implicites pour être global, sauf si vous déclarez à être locale
unsigned int hello;
int fun ( int a )
{
return(a+1);
}
bonjour et plaisir sont au global, visibles de l'extérieur de l'objet, mais cette
static unsigned int hello;
static int fun ( int a )
{
return(a+1);
}
les rend non visibles.
tous les locaux:
_start:
hello:
fun:
more_fun:
ceux-ci sont maintenant disponibles global pour le linker et d'autres objets""
global _start
_start:
global hello
hello:
...
_start
est défini par la valeur par défaut ld
linker script
ld -verbose a.o | grep ENTRY
sorties:
ENTRY(_start)
le format de fichier ELF (et autre format d'objet je suppose), dire explicitement quelle adresse le programme commencera à courir à travers le champ d'en-tête e_entry
.
ENTRY(_start)
dit au linker de régler cette entrée l'adresse du symbole _start
lors de la génération du fichier ELF à partir de fichiers d'objets.
puis, lorsque le système d'exploitation démarre le programme ( exec
appel système sous Linux), il analyse le fichier ELF, charge le code exécutable en mémoire et place le pointeur d'instruction à l'adresse spécifiée.
le drapeau -e
mentionné par Sedat remplace le symbole par défaut _start
.
You peut également remplacer le script complet de linker par défaut avec l'option -T <script>
, voici un exemple concret qui met en place certains éléments d'assemblage en métal nu .
global _start
est juste une étiquette qui pointe vers une adresse mémoire.Dans le cas de _start quand il s'agit de binaires ELF, c'est l'étiquette par défaut utilisée qui agit comme l'adresse où le programme commence.
il y a aussi main
ou _main
ou main_
est connu au langage C, et est appelé par "code de démarrage" qui est "habituellement" lié à-si vous utilisez C.
Espérons que cette aide.