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
21
demandé sur benaryorg 2013-07-27 18:42:08

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
27
répondu Sedat Kapanoglu 2016-04-14 17:12:21

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:
...
2
répondu old_timer 2013-07-27 15:23:29

_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 .

2

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.

0
répondu Moksh 2016-07-30 15:31:02