Si un archivo de objeto define _start y no usa ninguna biblioteca, ¿por qué todavía necesito vincularlo antes de poder ejecutarlo?
Tengo un programa de hola mundo:
.global _start
.text
_start:
# write (1, msj, 13)
mov $1, %rax # la llamada al sistema 1 es escribir
mov $1, %rdi # el controlador de archivo 1 es la salida estándar
mov $message, %rsi # dirección de la cadena a mostrar
mov $13, %rdx # número de bytes
syscall
# exit(0)
mov $60, %rax # la llamada al sistema 60 es salir
xor %rdi, %rdi # queremos devolver el código 0
syscall
message:
.ascii “Hola, mundo\n”
Puedo ensamblarlo en un archivo objeto con:
as hello.s -o hello.o
Este archivo objeto no es ejecutable. Cuando trato de ejecutarlo, obtengo:
bash: ./hello.o: no se puede ejecutar el archivo binario: error de formato de ejecución
Necesito invocar al vinculador para hacerlo viable:
ld hello.o -o hello
En este punto, el programa hello funciona. Sin embargo, el uso del vinculador aquí me resulta confuso…. ¡No estoy vinculando ninguna biblioteca externa! Parece que solo estoy vinculando el archivo objeto a nada.
¿Qué hace el vinculador para un programa “autónomo”?
davy.ai
El enlazador es responsable de tomar el archivo objeto y crear un archivo ejecutable. Lo hace agregando la información necesaria al archivo objeto, como el punto de entrada del programa, los encabezados del programa y las secciones del programa. Esto permite que el sistema operativo cargue y ejecute adecuadamente el programa.