linux प्रोग्राम लॉन्च होने पर डिफ़ॉल्ट रजिस्टर राज्य क्या है(एएसएम, लिनक्स)?




assembly elf (3)

जब प्रोग्राम लॉन्च होता है (लिनक्स, एल्फ) - तो eax , ebx , आदि में शून्य है या कुछ भी हो सकता है (मैं कोई कॉल नहीं कर रहा हूं या बाहरी पुस्तकालयों का उपयोग नहीं कर रहा हूं)? मेरी मशीन पर यह सचमुच ऐसा है, क्या मैं ऐसे व्यवहार पर रिले कर सकता हूं जब एएसएम प्रोग्राम लिखा जा रहा है?


यह पूरी तरह से प्रत्येक मंच के लिए एबीआई पर निर्भर करता है चूंकि आप eax और ebx उल्लेख करते हैं, तो देखते हैं कि एक्स 86 के मामले क्या हैं ebx fs/binfmt_elf.c लाइन # 972 में, load_elf_binary() अंदर, कर्नेल यह जांचता है कि क्या एबीआई प्रोग्राम लोड होने पर रजिस्टर मानों के लिए कोई ज़रूरत निर्दिष्ट करता है:

/*
 * 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.
 */

यह तब ELF_PLAT_INIT कॉल ELF_PLAT_INIT , जोकि प्रत्येक आर्किटेक्चर के लिए arch/xxx/include/elf.h में परिभाषित मैक्रो है। X86 के लिए, यह निम्नलिखित करता है:

#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)

इसलिए, जब आपका एएलएफ बाइनरी लिनक्स एक्स 86 पर लोड होता है, तो आप सभी रजिस्टर मानों पर शून्य मान सकते हैं। इसका मतलब यह नहीं है कि आपको चाहिए, यद्यपि। :-)


लिनक्स पर AMD64 या x86-64 सिस्टम (64 बिट) के लिए, x86-64 ABI रजिस्टरों की प्रारंभिक सामग्री को परिभाषित करता है।

I386 एबीआई , एआरएम एबी आदि के लिए समान विनिर्देश हैं।

एल्फ़ और एबीआई पर विकिपीडिया पेज देखें


x86-64 सिस्टम वी एबीआई खंड 3.4.1 "आरंभिक ढेर और रजिस्टर राज्य" ( पीडीएफ से जुड़े बेसिल ):

  1. %rsp वें स्टैक को इंगित करता है

    स्टैक पॉइंटर के पास सबसे कम पता वाला बाइट का पता है जो स्टैक का हिस्सा है। प्रक्रिया प्रविष्टि में 16-बाइट गठबंधन होने की गारंटी है

  2. %rdx एक फ़ंक्शन पॉइंटर है जो अनुप्रयोग को अनीसिट के साथ पंजीकृत करना चाहिए अगर यह शून्य है

    एक फ़ंक्शन पॉइंटर जिसके साथ एप्लिकेशन को पंजीकृत होना चाहिए

  3. %rbp अनिर्दिष्ट है लेकिन %rbp को इसे बेस फ्रेम में सेट करना चाहिए।

    इस रजिस्टर की सामग्री प्रक्रिया प्रारंभिक समय पर निर्दिष्ट नहीं है, लेकिन उपयोगकर्ता कोड को फ्रेम सूचक को शून्य पर सेट करके गहरे स्टैक फ्रेम को चिह्नित करना चाहिए।

  4. बाकी सब कुछ अपरिभाषित

लिनक्स उसके बाद इस प्रकार "क्योंकि" एलएसबी कहते हैं।





cpu-registers