Esto depende completamente del ABI de cada plataforma. Ya que mencionas eax
y ebx
veamos cuál es el caso para x86. En fs/binfmt_elf.c
línea #972, dentro de load_elf_binary()
, el núcleo comprueba si la ABI especifica algún requisito para los valores de registro en la carga del programa:
/*
* The ABI may specify that certain registers be set up in special
* ways (on i386 %edx is the address of a DT_FINI function, for
* example. In addition, it may also specify (eg, PowerPC64 ELF)
* that the e_entry field is the address of the function descriptor
* for the startup routine, rather than the address of the startup
* routine itself. This macro performs whatever initialization to
* the regs structure is required as well as any relocations to the
* function descriptor entries when executing dynamically links apps.
*/
Luego llama a ELF_PLAT_INIT
, que es una macro definida para cada arquitectura en arch/xxx/include/elf.h
. Para x86, hace lo siguiente:
#define ELF_PLAT_INIT(_r, load_addr) \
do { \
_r->bx = 0; _r->cx = 0; _r->dx = 0; \
_r->si = 0; _r->di = 0; _r->bp = 0; \
_r->ax = 0; \
} while (0)
Entonces, cuando su binario ELF vinculado estáticamente se carga en Linux x86, puede contar con que todos los valores de registro sean iguales a cero. Sin embargo, no significa que debas hacerlo. :-)
Enlace dinámico
Tenga en cuenta que ejecutar un dinámicamente el binario vinculado en realidad ejecuta el código del vinculador dinámico en su proceso antes de que la ejecución llegue a su _start
(Punto de entrada ELF). Esto puede y deja basura en los registros, según lo permitido por la ABI. Excepto, por supuesto, para el puntero de pila ESP/RSP y atexit
gancho EDX/RDX.
Para sistemas AMD64 o x86-64 (64 bits) en Linux, la ABI x86-64 define el contenido inicial de los registros.
Hay especificaciones similares para i386 ABI, ARM ABI, etc.
Consulte las páginas de wikipedia sobre ELF y ABI
x86-64 Sistema V ABI
3.4.1 "Estado inicial de pila y registro" (Basile vinculado a la versión PDF de esto):
-
%rsp
apunta a la pilaEl puntero de la pila contiene la dirección del byte con la dirección más baja que forma parte de la pila. Se garantiza que estará alineado en 16 bytes en la entrada del proceso
-
%rdx
un puntero de función que la aplicación debe registrar con atexit si no es cero.un puntero de función con el que la aplicación debe registrarse
-
%rbp
no está especificado, pero el espacio de usuario debe establecerlo en el marco base.El contenido de este registro no se especifica en el momento de la inicialización del proceso, pero el código de usuario debe marcar el marco de pila más profundo al establecer el puntero del marco en cero.
-
Todo lo demás indefinido.
Linux lo sigue "porque" lo dice el LSB.