assembly - maquina - ¿Qué es el inicio global en lenguaje ensamblador?
lenguaje maquina y ensamblador (4)
Este es mi código de nivel de montaje ...
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
Salida:
root@bt:~/Arena# nasm -f elf a.asm -o a.o
root@bt:~/Arena# ld -o out a.o
root@bt:~/Arena# ./out
KingKong
Mi pregunta es: ¿Para qué se utiliza el _start global ? Probé suerte con Mr.Google y descubrí que se usa para indicar el punto de inicio de mi programa. ¿Por qué no podemos tener el _start
para decir dónde comienza el programa como el que se muestra a continuación, que produce un poco de advertencia en la pantalla?
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
Una etiqueta no es explícitamente global hasta que la declara global, por lo que debe usar la directiva global.
La etiqueta global "_start" es necesaria para el vinculador, si no hay una dirección global de inicio, el vinculador se quejará porque no puede encontrar una. No declaró _start como un global, por lo que no es visible fuera de ese módulo / objeto de código, por lo que no está visible para el vinculador.
Esto es lo opuesto a C, donde se implica que las cosas son globales a menos que las declare locales.
unsigned int hello;
int fun ( int a )
{
return(a+1);
}
Hola y diversión son globales, visibles fuera del objeto, pero esto
static unsigned int hello;
static int fun ( int a )
{
return(a+1);
}
Los hace locales no visibles.
todo local
_start:
hello:
fun:
more_fun:
Estos ahora están disponibles globalmente para el enlazador y otros objetos.
global _start
_start:
global hello
hello:
...
global _start
es solo una etiqueta que apunta a una dirección de memoria. En el caso de _start cuando se trata de binarios ELF, es la etiqueta predeterminada utilizada que actúa como la dirección donde se inicia el programa.
También hay main
o _main
o main_
se conoce en el lenguaje C, y se llama mediante el "código de inicio", que está "generalmente" vinculado a, si está usando C.
Espero que esto ayude.
global
directiva global
es específica de NASM. Es para exportar símbolos en su código a donde apunta en el código objeto generado. Aquí marca el símbolo de _start
global para que su nombre se agregue en el código del objeto ( ao
). El vinculador ( ld
) puede leer ese símbolo en el código del objeto y su valor para que sepa dónde marcar como un punto de entrada en el ejecutable de salida. Cuando ejecutas el ejecutable, comienza en donde está marcado como _start
en el código.
Si falta una directiva global
para un símbolo, ese símbolo no se colocará en la tabla de exportación del código del objeto, por lo que el vinculador no tiene forma de conocer el símbolo.
Si desea utilizar un nombre de punto de entrada diferente al de _start
(que es el predeterminado), puede especificar -e
parámetro a ld como:
ld -e my_entry_point -o out a.o
_start
se establece mediante el script de enlazador ld
predeterminado
ld -verbose a.o | grep ENTRY
salidas:
ENTRY(_start)
El formato de archivo ELF (y otro formato de objeto que supongo), dice explícitamente en qué dirección comenzará a ejecutarse el programa a través del campo de encabezado e_entry
.
ENTRY(_start)
le dice al vinculador que establezca en esa entrada la dirección del símbolo _start
al generar el archivo ELF a partir de archivos de objeto.
Luego, cuando el sistema operativo comienza a ejecutar el programa ( exec
system call en Linux), analiza el archivo ELF, carga el código ejecutable en la memoria y establece el puntero de instrucción en la dirección especificada.
La bandera -e
mencionada por Sedat reemplaza el símbolo de _start
predeterminado.
También puede reemplazar todo el script del enlazador predeterminado con la opción -T <script>
, aquí hay un ejemplo concreto que configura algunos elementos de ensamblaje de metal desnudo .