To zcela závisí na ABI pro každou platformu. Protože jste zmínil eax
a ebx
podívejme se, jak je to s x86. V fs/binfmt_elf.c
řádek #972, uvnitř load_elf_binary()
, jádro zkontroluje, zda ABI specifikuje nějaké požadavky na hodnoty registrů při načítání programu:
/*
* 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.
*/
Poté zavolá ELF_PLAT_INIT
, což je makro definované pro každou architekturu v arch/xxx/include/elf.h
. Pro x86 to dělá následující:
#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)
Když je tedy váš staticky propojený binární soubor ELF načten na Linuxu x86, můžete počítat s tím, že všechny hodnoty registrů budou rovné nule. Neznamená to však, že byste měli. :-)
Dynamické propojení
Všimněte si, že provádění dynamicky linked binary ve skutečnosti spustí kód dynamického linkeru ve vašem procesu, než spuštění dosáhne vašeho _start
(vstupní bod ELF). To může a také zanechá v registrech odpadky, jak to povoluje ABI. Samozřejmě kromě ukazatele zásobníku ESP/RSP a atexit
háček EDX/RDX.
Pro systémy AMD64 nebo x86-64 (64 bitů) na Linuxu určuje počáteční obsah registrů x86-64 ABI.
Existují podobné specifikace pro i386 ABI, ARM ABI atd.
Podívejte se na stránky wikipedie o ELF a ABI
x86-64 System V ABI
3.4.1 „Počáteční stav zásobníku a registrace“ (Basile je propojen s verzí PDF tohoto dokumentu):
-
%rsp
ukazuje na hromádkuUkazatel zásobníku obsahuje adresu bytu s nejnižší adresou, který je součástí zásobníku. Při vstupu procesu je zaručeno, že bude 16bajtově zarovnán
-
%rdx
ukazatel funkce, který by aplikace měla zaregistrovat pomocí atexitu, pokud je nenulový.ukazatel funkce, u kterého by se měla aplikace zaregistrovat
-
%rbp
není specifikováno, ale uživatelská země by jej měla nastavit na základní rámec.Obsah tohoto registru není v době inicializace procesu specifikován, ale uživatelský kód by měl označit nejhlubší rámec zásobníku nastavením ukazatele rámce na nulu.
-
Vše ostatní není definováno.
Linux ho pak následuje „protože“ to říká LSB.