ELF(5)

الاسم
elf - تنسيق ملفات التنسيق التنفيذي والقابل للربط (ELF)

موجز
#include <elf.h>

الوصف
يحدد ملف الترويسة <elf.h> تنسيق ملفات ELF الثنائية القابلة للتنفيذ. ومن بين هذه الملفات الملفات التنفيذية العادية، وملفات الكائنات القابلة للنقل، وملفات اللب (core)، والكائنات المشتركة.

يتكون الملف التنفيذي الذي يستخدم تنسيق ملف ELF من ترويسة ELF، تليها جدول ترويسة البرنامج أو جدول ترويسة الأقسام، أو كلاهما. تقع ترويسة ELF دائمًا عند الإزاحة صفر من الملف. وتُحدد إزاحة جدول ترويسة البرنامج وجدول ترويسة الأقسام في الملف داخل ترويسة ELF. يصف هذان الجدولان بقية تفاصيل الملف.

يصف ملف الترويسة هذا الترويسات المذكورة أعلاه كبنى بلغة C ويتضمن أيضًا بنى للأقسام الديناميكية، وأقسام إعادة النقل، وجداول الرموز.

  الأنواع الأساسية
تُستخدم الأنواع التالية لبنيات N-بت (N=32,64، حيث يرمز ElfN إلى Elf32 أو Elf64، ويرمز uintN_t إلى uint32_t أو uint64_t):

    ElfN_Addr       عنوان برنامج غير موقع، uintN_t
    ElfN_Off        إزاحة ملف غير موقعة، uintN_t
    ElfN_Section    فهرس قسم غير موقع، uint16_t
    ElfN_Versym     معلومات رمز الإصدار غير الموقعة، uint16_t
    Elf_Byte        unsigned char
    ElfN_Half       uint16_t
    ElfN_Sword      int32_t
    ElfN_Word       uint32_t
    ElfN_Sxword     int64_t
    ElfN_Xword      uint64_t

(ملاحظة: تختلف مصطلحات *BSD قليلاً. هناك، يكون Elf64_Half ضعف حجم Elf32_Half، ويُستخدم Elf64Quarter لـ uint16_t. لتجنب اللبس، استُبدلت هذه الأنواع بأنواع صريحة فيما يلي.)

تتبع جميع بنى البيانات التي يحددها تنسيق الملف إرشادات الحجم والمحاذاة "الطبيعية" للفئة ذات الصلة. وإذا لزم الأمر، تحتوي بنى البيانات على حشو صريح لضمان محاذاة 4-بايت للكائنات ذات الـ 4-بايت، ولإجبار أحجام البنى على أن تكون مضاعفة للعدد 4، وما إلى ذلك.

  تروِيسة ELF‏ (Ehdr)
تُوصَف ترويسة ELF بواسطة النوع Elf32_Ehdr أو Elf64_Ehdr:

    #define EI_NIDENT 16

    typedef struct {
        unsigned char e_ident[EI_NIDENT];
        uint16_t      e_type;
        uint16_t      e_machine;
        uint32_t      e_version;
        ElfN_Addr     e_entry;
        ElfN_Off      e_phoff;
        ElfN_Off      e_shoff;
        uint32_t      e_flags;
        uint16_t      e_ehsize;
        uint16_t      e_phentsize;
        uint16_t      e_phnum;
        uint16_t      e_shentsize;
        uint16_t      e_shnum;
        uint16_t      e_shstrndx;
    } ElfN_Ehdr;

تحمل الحقول المعاني التالية:

e_ident
    تحدد مصفوفة البايتات هذه كيفية تفسير الملف، بشكل مستقل عن المعالج أو محتويات الملف المتبقية. ويُسمى كل شيء داخل هذه المصفوفة بواسطة ماكروهات تبدأ بالبادئة EI_ وقد تحتوي على قيم تبدأ بالبادئة ELF. تُعرَّف الماكروهات التالية:

    EI_MAG0
        البايت الأول من الرقم السحري. يجب ملؤه بـ ELFMAG0. ‏(0: 0x7f)

    EI_MAG1
        البايت الثاني من الرقم السحري. يجب ملؤه بـ ELFMAG1. ‏(1: 'E')

    EI_MAG2
        البايت الثالث من الرقم السحري. يجب ملؤه بـ ELFMAG2. ‏(2: 'L')

    EI_MAG3
        البايت الرابع من الرقم السحري. يجب ملؤه بـ ELFMAG3. ‏(3: 'F')

    EI_CLASS
        يحدد البايت الخامس بنية هذا الملف الثنائي:

        ELFCLASSNONE
            هذه الفئة غير صالحة.
        ELFCLASS32
            يحدد هذا بنية 32-بت. وهو يدعم الأجهزة ذات الملفات ومساحات العناوين الافتراضية التي تصل إلى 4 جيجابايت.
        ELFCLASS64
            يحدد هذا بنية 64-بت.

    EI_DATA
        يحدد البايت السادس ترميز البيانات الخاصة بالمعالج في الملف. وحاليًا، تُدعم هذه الترميزات:

        ELFDATANONE
            تنسيق بيانات مجهول.
        ELFDATA2LSB
            المكمل الاثني، نهاية الصغرى (little-endian).
        ELFDATA2MSB
            المكمل الاثني، نهاية الكبرى (big-endian).

    EI_VERSION
        البايت السابع هو رقم إصدار مواصفات ELF:

        EV_NONE
            إصدار غير صالح.
        EV_CURRENT
            الإصدار الحالي.

    EI_OSABI
        يحدد البايت الثامن نظام التشغيل وواجهة التطبيق الثنائية (ABI) التي يستهدفها هذا الكائن. تحتوي بعض الحقول في بنى ELF الأخرى على أعلام وقيم لها معانٍ خاصة بالمنصة؛ ويُحدد تفسير تلك الحقول بناءً على قيمة هذا البايت. على سبيل المثال:

        ELFOSABI_NONE
            نفس ELFOSABI_SYSV
        ELFOSABI_SYSV
            واجهة التطبيق الثنائية UNIX System V ABI
        ELFOSABI_HPUX
            HP-UX ABI
        ELFOSABI_NETBSD
            NetBSD ABI
        ELFOSABI_LINUX
            لينكس ABI
        ELFOSABI_SOLARIS
            سولاريس ABI
        ELFOSABI_IRIX
            IRIX ABI
        ELFOSABI_FREEBSD
            FreeBSD ABI
        ELFOSABI_TRU64
            TRU64 UNIX ABI
        ELFOSABI_ARM
            بنية إيه آر إم ABI
        ELFOSABI_STANDALONE
            واجهة تطبيق ثنائية مستقلة (مدمجة)

    EI_ABIVERSION
        يحدد البايت التاسع إصدار واجهة التطبيق الثنائية (ABI) التي يستهدفها الكائن. يُستخدم هذا الحقل للتمييز بين الإصدارات غير المتوافقة من الـ ABI. ويعتمد تفسير رقم الإصدار هذا على الـ ABI المحدد في الحقل EI_OSABI. وتستخدم التطبيقات المتوافقة مع هذه المواصفة القيمة 0.

    EI_PAD
        بداية الحشو. هذه البايتات محجوزة وضُبطت على الصفر. ويجب على البرامج التي تقرأها أن تتجاهلها. ستتغير قيمة EI_PAD في المستقبل إذا أُعطيت معانٍ للبايتات غير المستخدمة حاليًا.

    EI_NIDENT
        حجم مصفوفة e_ident.

e_type
    يحدد هذا العضو من البنية نوع ملف الكائن:

    ET_NONE
        نوع مجهول.
    ET_REL
        ملف قابل للنقل.
    ET_EXEC
        ملف تنفيذي.
    ET_DYN
        كائن مشترك.
    ET_CORE
        ملف لب (core).

e_machine
    يحدد هذا العضو البنية المطلوبة لملف فردي. على سبيل المثال:

    EM_NONE
        آلة مجهولة
    EM_M32
        AT&T WE 32100
    EM_SPARC
        Sun Microsystems SPARC
    EM_386
        Intel 80386
    EM_68K
        Motorola 68000
    EM_88K
        Motorola 88000
    EM_860
        Intel 80860
    EM_MIPS
        MIPS RS3000 (نهاية كبرى فقط)
    EM_PARISC
        HP/PA
    EM_SPARC32PLUS
        SPARC مع مجموعة تعليمات محسنة
    EM_PPC
        PowerPC
    EM_PPC64
        PowerPC بقوة 64-بت
    EM_S390
        IBM S/390
    EM_ARM
        Advanced RISC Machines (ARM)
    EM_SH
        Renesas SuperH
    EM_SPARCV9
        SPARC v9 بقوة 64-بت
    EM_IA_64
        Intel Itanium
    EM_X86_64
        AMD x86-64
    EM_VAX
        DEC Vax

e_version
    يحدد هذا العضو إصدار الملف:

    EV_NONE
        إصدار غير صالح
    EV_CURRENT
        الإصدار الحالي

e_entry
    يعطي هذا العضو العنوان الافتراضي الذي ينقل النظام إليه التحكم أولاً، وبذلك تبدأ العملية. إذا لم يكن للملف نقطة دخول مرتبطة به، فإن هذا العضو يحتفظ بالقيمة صفر.

e_phoff
    يحتفظ هذا العضو بإزاحة ملف جدول ترويسة البرنامج بالبايت. إذا لم يكن للملف جدول ترويسة برنامج، فإن هذا العضو يحتفظ بالقيمة صفر.

e_shoff
    يحتفظ هذا العضو بإزاحة ملف جدول ترويسة الأقسام بالبايت. إذا لم يكن للملف جدول ترويسة أقسام، فإن هذا العضو يحتفظ بالقيمة صفر.

e_flags
    يحتفظ هذا العضو بأعلام خاصة بالمعالج مرتبطة بالملف. تأخذ أسماء الأعلام الشكل EF_`machine_flag'. وحاليًا، لم تُعرَّف أي أعلام.

e_ehsize
    يحتفظ هذا العضو بحجم ترويسة ELF بالبايت.

e_phentsize
    يحتفظ هذا العضو بالحجم بالبايت لمدخل واحد في جدول ترويسة البرنامج الخاص بالملف؛ وتكون جميع المداخل بنفس الحجم.

e_phnum
    يحتفظ هذا العضو بعدد المداخل في جدول ترويسة البرنامج. وبذلك، فإن حاصل ضرب e_phentsize في e_phnum يعطي حجم الجدول بالبايت. إذا لم يكن للملف ترويسة برنامج، فإن e_phnum يحتفظ بالقيمة صفر.

    إذا كان عدد المداخل في جدول ترويسة البرنامج أكبر من أو يساوي PN_XNUM ‏(0xffff)، فإن هذا العضو يحتفظ بالقيمة PN_XNUM ‏(0xffff) ويُحفظ العدد الحقيقي للمداخل في العضو sh_info للمدخل الأولي في جدول ترويسة الأقسام. وخلاف ذلك، يحتوي العضو sh_info للمدخل الأولي على القيمة صفر.

    PN_XNUM
        يُعرَّف هذا بالقيمة 0xffff، وهو أكبر رقم يمكن أن يحمله e_phnum، محددًا المكان الذي يُعين فيه العدد الفعلي لترويسات البرنامج.

e_shentsize
    يحتفظ هذا العضو بحجم ترويسة الأقسام بالبايت. ترويسة القسم هي مدخل واحد في جدول ترويسة الأقسام؛ وجميع المداخل تكون بنفس الحجم.

e_shnum
    يحتفظ هذا العضو بعدد المداخل في جدول ترويسة الأقسام. وبذلك، فإن حاصل ضرب e_shentsize في e_shnum يعطي حجم جدول ترويسة الأقسام بالبايت. إذا لم يكن للملف جدول ترويسة أقسام، فإن e_shnum يحتفظ بالقيمة صفر.

    إذا كان عدد المداخل في جدول ترويسة الأقسام أكبر من أو يساوي SHN_LORESERVE ‏(0xff00)، فإن e_shnum يحتفظ بالقيمة صفر ويُحفظ العدد الحقيقي للمداخل في العضو sh_size للمدخل الأولي في جدول ترويسة الأقسام. وخلاف ذلك، يحتفظ العضو sh_size للمدخل الأولي في جدول ترويسة الأقسام بالقيمة صفر.

e_shstrndx
    يحتفظ هذا العضو بفهرس جدول ترويسة الأقسام للمدخل المرتبط بجدول سلاسل أسماء الأقسام. إذا لم يكن للملف جدول سلاسل أسماء أقسام، فإن هذا العضو يحتفظ بالقيمة SHN_UNDEF.

    إذا كان فهرس قسم جدول سلاسل أسماء الأقسام أكبر من أو يساوي SHN_LORESERVE ‏(0xff00)، فإن هذا العضو يحتفظ بالقيمة SHN_XINDEX ‏(0xffff) ويُحفظ الفهرس الحقيقي لقسم جدول سلاسل أسماء الأقسام في العضو sh_link للمدخل الأولي في جدول ترويسة الأقسام. وخلاف ذلك، يحتوي العضو sh_link للمدخل الأولي في جدول ترويسة الأقسام على القيمة صفر.

  تروِيسة البرنامج (Phdr)
جدول ترويسة البرنامج للملف التنفيذي أو كائن مشترك هو مصفوفة من البنى، تصف كل منها شريحة (segment) أو معلومات أخرى يحتاجها النظام لإعداد البرنامج للتنفيذ. تحتوي شريحة ملف الكائن على قسم واحد أو أكثر من الأقسام. وتكون ترويسات البرنامج ذات مغزى فقط للملفات التنفيذية وملفات الكائنات المشتركة. ويحدد الملف حجم ترويسة البرنامج الخاصة به باستخدام العضوين e_phentsize و e_phnum في ترويسة ELF. تُوصَف ترويسة برنامج ELF بواسطة النوع Elf32_Phdr أو Elf64_Phdr اعتمادًا على البنية:

    typedef struct {
        uint32_t   p_type;
        Elf32_Off  p_offset;
        Elf32_Addr p_vaddr;
        Elf32_Addr p_paddr;
        uint32_t   p_filesz;
        uint32_t   p_memsz;
        uint32_t   p_flags;
        uint32_t   p_align;
    } Elf32_Phdr;

    typedef struct {
        uint32_t   p_type;
        uint32_t   p_flags;
        Elf64_Off  p_offset;
        Elf64_Addr p_vaddr;
        Elf64_Addr p_paddr;
        uint64_t   p_filesz;
        uint64_t   p_memsz;
        uint64_t   p_align;
    } Elf64_Phdr;

يكمن الاختلاف الرئيس بين ترويسة البرنامج لـ 32-بت و 64-بت في موقع العضو p_flags في البنية الكلية.

p_type
    يشير هذا العضو من البنية إلى نوع الشريحة التي يصفها عنصر المصفوفة هذا أو كيفية تفسير معلومات عنصر المصفوفة.

    PT_NULL
        يكون عنصر المصفوفة غير مستخدم وتكون قيم الأعضاء الأخرى غير محددة. يتيح هذا لترويسة البرنامج احتواء مداخل مُتجاهَلة.

    PT_LOAD
        يحدد عنصر المصفوفة شريحة قابلة للتحميل، موصوفة بواسطة p_filesz و p_memsz. تُقابَل البايتات من الملف إلى بداية شريحة الذاكرة. إذا كان حجم ذاكرة الشريحة p_memsz أكبر من حجم الملف p_filesz، تُعرَّف البايتات "الزائدة" لتحمل القيمة 0 وتتبع المنطقة المهيأة للشريحة. ولا يجوز أن يكون حجم الملف أكبر من حجم الذاكرة. تظهر مداخل الشريحة القابلة للتحميل في جدول ترويسة البرنامج بترتيب تصاعدي، فرزًا بناءً على العضو p_vaddr.

    PT_DYNAMIC
        يحدد عنصر المصفوفة معلومات الربط الديناميكي.

    PT_INTERP
        يحدد عنصر المصفوفة موقع وحجم مسار منتهٍ بـ null لاستدعائه كمفسر. يكون نوع الشريحة هذا ذو مغزى فقط للملفات التنفيذية (رغم أنه قد يحدث للكائنات المشتركة). ومع ذلك، لا يجوز أن يحدث أكثر من مرة واحدة في الملف. وإذا كان موجودًا، فيجب أن يسبق أي مدخل شريحة قابلة للتحميل.

    PT_NOTE
        يحدد عنصر المصفوفة موقع الملاحظات (ElfN_Nhdr).

    PT_SHLIB
        هذا النوع من الشرائح محجوز ولكن لديه دلالات غير محددة. البرامج التي تحتوي على عنصر مصفوفة من هذا النوع لا تتوافق مع واجهة التطبيق الثنائية (ABI).

    PT_PHDR
        يحدد عنصر المصفوفة، إذا كان موجودًا، موقع وحجم جدول ترويسة البرنامج نفسه، سواء في الملف أو في صورة الذاكرة للبرنامج. لا يجوز أن يحدث نوع الشريحة هذا أكثر من مرة واحدة في الملف. علاوة على ذلك، لا يمكن أن يحدث إلا إذا كان جدول ترويسة البرنامج جزءًا من صورة الذاكرة للبرنامج. وإذا كان موجودًا، فيجب أن يسبق أي مدخل شريحة قابلة للتحميل.

    PT_LOPROC
    PT_HIPROC
        القيم في النطاق الشامل [PT_LOPROC،‏ PT_HIPROC] محجوزة لدلالات خاصة بالمعالج.

    PT_GNU_STACK
        امتداد GNU تستخدمه نواة لينكس للتحكم في حالة المكدس عبر الأعلام المحددة في العضو p_flags.

p_offset
    يحتفظ هذا العضو بالإزاحة من بداية الملف التي يقع عندها البايت الأول من الشريحة.

p_vaddr
    يحتفظ هذا العضو بالفهرس الافتراضي الذي يقع عنده البايت الأول من الشريحة في الذاكرة.

p_paddr
    في الأنظمة التي تكون فيها العنونة المادية ذات صلة، يكون هذا العضو محجوزًا للعنوان المادي للشريحة. وتحت نظام BSD، لا يُستخدم هذا العضو ويجب أن يكون صفرًا.

p_filesz
    يحتفظ هذا العضو بعدد البايتات في صورة الملف للشريحة. وقد يكون صفرًا.

p_memsz
    يحتفظ هذا العضو بعدد البايتات في صورة الذاكرة للشريحة. وقد يكون صفرًا.

p_flags
    يحتفظ هذا العضو بقناع بت للأعلام ذات الصلة بالشريحة:

    PF_X
        شريحة قابلة للتنفيذ.
    PF_W
        شريحة قابلة للكتابة.
    PF_R
        شريحة قابلة للقراءة.

    تحتوي شريحة النص عادةً على الأعلام PF_X و PF_R. وتحتوي شريحة البيانات عادةً على PF_W و PF_R.

p_align
    يحتفظ هذا العضو بالقيمة التي تُحاذى الشرائح وفقًا لها في الذاكرة وفي الملف. يجب أن تكون للشرائح العملية القابلة للتحميل قيم متطابقة لـ p_vaddr و p_offset بمقياس (modulo) حجم الصفحة. تعني القيم صفر وواحد أنه لا يلزم إجراء محاذاة. خلاف ذلك، ينبغي أن يكون p_align قوة عددية صحيحة موجبة للعدد اثنين، وينبغي أن يساوي p_vaddr القيمة p_offset بمقياس p_align.

  تروِيسة القسم (Shdr)
يتيح جدول ترويسات الأقسام الخاص بالملف العثور على جميع أقسام الملف. جدول ترويسات الأقسام عبارة عن مصفوفة من هياكل Elf32_Shdr أو Elf64_Shdr. يحدد الحقل e_shoff في ترويسة ELF إزاحة البايت من بداية الملف إلى جدول ترويسات الأقسام. ويحتوي الحقل e_shnum على عدد المدخلات التي يضمها جدول ترويسات الأقسام. بينما يحتوي الحقل e_shentsize على حجم كل مدخلة بالبايت.

مؤشر جدول ترويسات الأقسام هو دليل منخفض (subscript) في هذه المصفوفة. بعض مؤشرات جدول ترويسات الأقسام محجوزة: المدخلة المبدئية والمؤشرات الواقعة بين SHN_LORESERVE و SHN_HIRESERVE. تُستخدم المدخلة المبدئية في امتدادات ELF لكل من e_phnum و e_shnum و e_shstrndx؛ وفي الحالات الأخرى، يُضبط كل حقل في المدخلة المبدئية على الصفر. لا يحتوي ملف الكائنات (object file) على أقسام لهذه المؤشرات الخاصة:

SHN_UNDEF
    تحدد هذه القيمة مرجع قسم غير معرف، أو مفقود، أو غير ذي صلة، أو ليس له معنى بأي شكل آخر.

SHN_LORESERVE
    تحدد هذه القيمة الحد الأدنى لنطاق المؤشرات المحجوزة.

SHN_LOPROC
SHN_HIPROC
    القيم الأكبر في النطاق الشامل [SHN_LOPROC، SHN_HIPROC] محجوزة لدلالات خاصة بالمعالج.

SHN_ABS
    تحدد هذه القيمة القيمة المطلقة للمرجع المقابل. على سبيل المثال، الرمز المعرّف بالنسبة لرقم القسم SHN_ABS له قيمة مطلقة ولا يتأثر بإعادة التوطين.

SHN_COMMON
    الرموز المعرّفة بالنسبة لهذا القسم هي رموز مشتركة، مثل FORTRAN COMMON أو متغيرات C الخارجية غير المخصصة.

SHN_HIRESERVE
    تحدد هذه القيمة الحد الأقصى لنطاق المؤشرات المحجوزة. يحجز النظام المؤشرات بين SHN_LORESERVE و SHN_HIRESERVE، بأسلوب شامل. لا يحتوي جدول ترويسات الأقسام على مدخلات للمؤشرات المحجوزة.

تحتوي ترويسة القسم على الهيكل التالي:

    typedef struct {
        uint32_t   sh_name;
        uint32_t   sh_type;
        uint32_t   sh_flags;
        Elf32_Addr sh_addr;
        Elf32_Off  sh_offset;
        uint32_t   sh_size;
        uint32_t   sh_link;
        uint32_t   sh_info;
        uint32_t   sh_addralign;
        uint32_t   sh_entsize;
    } Elf32_Shdr;

    typedef struct {
        uint32_t   sh_name;
        uint32_t   sh_type;
        uint64_t   sh_flags;
        Elf64_Addr sh_addr;
        Elf64_Off  sh_offset;
        uint64_t   sh_size;
        uint32_t   sh_link;
        uint32_t   sh_info;
        uint64_t   sh_addralign;
        uint64_t   sh_entsize;
    } Elf64_Shdr;

لا توجد فروق حقيقية بين ترويسات الأقسام ذات الـ 32 بت والـ 64 بت.

sh_name
    يحدد هذا العضو اسم القسم. قيمته عبارة عن مؤشر داخل قسم جدول سلاسل ترويسة القسم، مما يعطي موقع سلسلة منتهية بمحرف صفري.

sh_type
    يصنف هذا العضو محتويات القسم ودلالاته.

    SHT_NULL
        تحدد هذه القيمة ترويسة القسم على أنها غير نشطة. ليس لديها قسم مرتبط بها. الأعضاء الآخرون لترويسة القسم لديهم قيم غير معرفة.

    SHT_PROGBITS
        يحتوي هذا القسم على معلومات معرّفة بواسطة البرنامج، والتي يحدد البرنامج وحده تنسيقها ومعناها.

    SHT_SYMTAB
        يحتوي هذا القسم على جدول رموز. عادةً، يوفر SHT_SYMTAB رموزًا لتحرير الروابط، وإن كان يمكن استخدامه أيضًا للربط الديناميكي. وبصفته جدول رموز كاملاً، فقد يحتوي على العديد من الرموز غير الضرورية للربط الديناميكي. يمكن لملف الكائنات أيضًا أن يحتوي على قسم SHT_DYNSYM. يمكن العثور على مؤشر قسم جدول السلاسل المرتبط في العضو sh_link.

    SHT_STRTAB
        يحتوي هذا القسم على جدول سلاسل. قد يحتوي ملف الكائنات على أقسام متعددة لجدول السلاسل.

    SHT_RELA
        يحتوي هذا القسم على مدخلات إعادة التوطين مع مضافات صريحة، مثل النوع Elf32_Rela لفئة ملفات الكائنات ذات الـ 32 بت. قد يحتوي الكائن على أقسام إعادة توطين متعددة.

    SHT_HASH
        يحتوي هذا القسم على جدول تلبيد الرموز. يجب أن يحتوي الكائن المشارك في الربط الديناميكي على جدول تلبيد رموز. يمكن لملف الكائنات أن يحتوي على جدول تلبيد واحد فقط.

    SHT_DYNAMIC
        يحتوي هذا القسم على معلومات للربط الديناميكي. يمكن لملف الكائنات أن يحتوي على قسم ديناميكي واحد فقط.

    SHT_NOTE
        يحتوي هذا القسم على ملاحظات (ElfN_Nhdr).

    SHT_NOBITS
        لا يشغل قسم من هذا النوع أي مساحة في الملف ولكنه يشبه خلاف ذلك SHT_PROGBITS. على الرغم من أن هذا القسم لا يحتوي على أي بايتات، فإن العضو sh_offset يحتوي على إزاحة الملف المفاهيمية.

    SHT_REL
        يحتوي هذا القسم على إزاحات إعادة التوطين بدون مضافات صريحة، مثل النوع Elf32_Rel لفئة ملفات الكائنات ذات الـ 32 بت. قد يحتوي ملف الكائنات على أقسام إعادة توطين متعددة.

    SHT_SHLIB
        هذا القسم محجوز ولكن له دلالات غير محددة.

    SHT_DYNSYM
        يحتوي هذا القسم على حد أدنى من رموز الربط الديناميكي. يمكن لملف الكائنات أيضًا أن يحتوي على قسم SHT_SYMTAB.

    SHT_LOPROC
    SHT_HIPROC
        القيم في النطاق الشامل [SHT_LOPROC، SHT_HIPROC] محجوزة لدلالات خاصة بالمعالج.

    SHT_LOUSER
        تحدد هذه القيمة الحد الأدنى لنطاق المؤشرات المحجوزة لبرامج التطبيقات.

    SHT_HIUSER
        تحدد هذه القيمة الحد الأقصى لنطاق المؤشرات المحجوزة لبرامج التطبيقات. يمكن استخدام أنواع الأقسام الواقعة بين SHT_LOUSER و SHT_HIUSER بواسطة التطبيق، دون التعارض مع أنواع الأقسام الحالية أو المستقبلية المعرّفة من قبل النظام.

sh_flags
    تدعم الأقسام لافتات ذات بت واحد تصف سمات متنوعة. إذا ضُبط بت اللافتة في sh_flags، تكون السمة نشطة "on" للقسم. وخلاف ذلك، تكون السمة معطلة "off" أو لا تنطبق. تُضبط السمات غير المعرفة على الصفر.

    SHF_WRITE
        يحتوي هذا القسم على بيانات يجب أن تكون قابلة للكتابة أثناء تنفيذ العملية.

    SHF_ALLOC
        يشغل هذا القسم ذاكرة أثناء تنفيذ العملية. بعض أقسام التحكم لا تقيم في صورة الذاكرة لملف الكائنات. تكون هذه السمة معطلة لتلك الأقسام.

    SHF_EXECINSTR
        يحتوي هذا القسم على تعليمات آلة قابلة للتنفيذ.

    SHF_MASKPROC
        جميع البتات المضمنة في هذا القناع محجوزة لدلالات خاصة بالمعالج.

sh_addr
    إذا ظهر هذا القسم في صورة الذاكرة لعملية ما، فإن هذا العضو يحتوي على العنوان الذي يجب أن يستقر فيه البايت الأول من القسم. وخلاف ذلك، يحتوي العضو على الصفر.

sh_offset
    تحتوي قيمة هذا العضو على إزاحة البايت من بداية الملف إلى البايت الأول في القسم. هناك نوع قسم واحد، وهو SHT_NOBITS، لا يشغل أي مساحة في الملف، ويحدد العضو sh_offset الخاص به الموضع المفاهيمي في الملف.

sh_size
    يحتوي هذا العضو على حجم القسم بالبايت. ما لم يكن نوع القسم هو SHT_NOBITS، يشغل القسم عدد sh_size من البايتات في الملف. قد يكون لقسم من النوع SHT_NOBITS حجم غير صفري، لكنه لا يشغل مساحة في الملف.

sh_link
    يحتوي هذا العضو على رابط لمؤشر جدول ترويسات الأقسام، ويعتمد تفسيره على نوع القسم.

sh_info
    يحتوي هذا العضو على معلومات إضافية، ويعتمد تفسيرها على نوع القسم.

sh_addralign
    بعض الأقسام تفرض قيودًا على محاذاة العنوان. إذا كان القسم يحتوي على كلمة مزدوجة (doubleword)، يجب على النظام ضمان محاذاة الكلمة المزدوجة للقسم بأكمله. أي أن قيمة sh_addr يجب أن تكون متطابقة مع الصفر بمقیاس قيمة sh_addralign. يُسمح فقط بالقوى الصحيحة الموجبة والصفرية للعدد اثنين. تعني القيمة 0 أو 1 أن القسم ليس لديه قيود على المحاذاة.

sh_entsize
    تحتوي بعض الأقسام على جدول لمدخلات ذات حجم ثابت، مثل جدول الرموز. لمثل هذا القسم، يعطي هذا العضو الحجم بالبايت لكل مدخلة. يحتوي هذا العضو على الصفر إذا كان القسم لا يحتوي على جدول لمدخلات ذات حجم ثابت.

تحتوي أقسام متنوعة على معلومات البرنامج والتحكم:

.bss
    يحتوي هذا القسم على بيانات غير مهيأة تساهم في صورة ذاكرة البرنامج. بحسب التعريف، يُهيئ النظام البيانات بالأصفار عندما يبدأ البرنامج في العمل. هذا القسم من النوع SHT_NOBITS. أنواع السمات هي SHF_ALLOC و SHF_WRITE.

.comment
    يحتوي هذا القسم على معلومات التحكم في الإصدار. هذا القسم من النوع SHT_PROGBITS. لا تُستخدم أي أنواع سمات.

.ctors
    يحتوي هذا القسم على مؤشرات مهيأة لدوال البناء (constructor functions) في لغة ++C. هذا القسم من النوع SHT_PROGBITS. أنواع السمات هي SHF_ALLOC و SHF_WRITE.

.data
    يحتوي هذا القسم على بيانات مهيأة تساهم في صورة ذاكرة البرنامج. هذا القسم من النوع SHT_PROGBITS. أنواع السمات هي SHF_ALLOC و SHF_WRITE.

.data1
    يحتوي هذا القسم على بيانات مهيأة تساهم في صورة ذاكرة البرنامج. هذا القسم من النوع SHT_PROGBITS. أنواع السمات هي SHF_ALLOC و SHF_WRITE.

.debug
    يحتوي هذا القسم على معلومات للتنقيح الرمزي. المحتويات غير محددة. هذا القسم من النوع SHT_PROGBITS. لا تُستخدم أي أنواع سمات.

.dtors
    يحتوي هذا القسم على مؤشرات مهيأة لدوال الهدم (destructor functions) في لغة ++C. هذا القسم من النوع SHT_PROGBITS. أنواع السمات هي SHF_ALLOC و SHF_WRITE.

.dynamic
    يحتوي هذا القسم على معلومات الربط الديناميكي. ستتضمن سمات القسم بت SHF_ALLOC. تحديد ما إذا كان بت SHF_WRITE مضبوطًا أم لا هو أمر خاص بالمعالج. هذا القسم من النوع SHT_DYNAMIC. انظر السمات أعلاه.

.dynstr
    يحتوي هذا القسم على السلاسل اللازمة للربط الديناميكي، وهي في الغالب السلاسل التي تمثل الأسماء المرتبطة بمدخلات جدول الرموز. هذا القسم من النوع SHT_STRTAB. نوع السمة المستخدمة هو SHF_ALLOC.

.dynsym
    يحتوي هذا القسم على جدول رموز الربط الديناميكي. هذا القسم من النوع SHT_DYNSYM. السمة المستخدمة هي SHF_ALLOC.

.fini
    يحتوي هذا القسم على تعليمات قابلة للتنفيذ تساهم في كود إنهاء العملية. عندما ينتهي البرنامج بشكل طبيعي، يقوم النظام بالترتيب لتنفيذ الكود الموجود في هذا القسم. هذا القسم من النوع SHT_PROGBITS. السمات المستخدمة هي SHF_ALLOC و SHF_EXECINSTR.

.gnu.version
    يحتوي هذا القسم على جدول رموز الإصدار، وهو مصفوفة من عناصر ElfN_Half. هذا القسم من النوع SHT_GNU_versym. نوع السمة المستخدم هو SHF_ALLOC.

.gnu.version_d
    يحتوي هذا القسم على تعريفات رموز الإصدار، وهو جدول من هياكل ElfN_Verdef. هذا القسم من النوع SHT_GNU_verdef. نوع السمة المستخدم هو SHF_ALLOC.

.gnu.version_r
    يحتوي هذا القسم على عناصر رموز الإصدار المطلوبة، وهو جدول من هياكل ElfN_Verneed. هذا القسم من النوع SHT_GNU_versym. نوع السمة المستخدم هو SHF_ALLOC.

.got
    يحتوي هذا القسم على جدول الإزاحة العام. هذا القسم من النوع SHT_PROGBITS. السمات خاصة بالمعالج.

.hash
    يحتوي هذا القسم على جدول تلبيد رموز. هذا القسم من النوع SHT_HASH. السمة المستخدمة هي SHF_ALLOC.

.init
    يحتوي هذا القسم على تعليمات قابلة للتنفيذ تساهم في كود تهيئة العملية. عندما يبدأ البرنامج في العمل، يقوم النظام بالترتيب لتنفيذ الكود الموجود في هذا القسم قبل استدعاء نقطة إدخال البرنامج الرئيسة. هذا القسم من النوع SHT_PROGBITS. السمات المستخدمة هي SHF_ALLOC و SHF_EXECINSTR.

.interp
    يحتوي هذا القسم على مسار مفسر البرنامج. إذا كان الملف يحتوي على قطاع قابل للتحميل يتضمن هذا القسم، فستشمل سمات القسم بت SHF_ALLOC. وخلاف ذلك، سيكون هذا البت معطلاً. هذا القسم من النوع SHT_PROGBITS.

.line
    يحتوي هذا القسم على معلومات أرقام السطور للتنقيح الرمزي، والتي تصف التطابق بين مصدر البرنامج وكود الآلة. المحتويات غير محددة. هذا القسم من النوع SHT_PROGBITS. لا تُستخدم أي أنواع سمات.

.note
    يحتوي هذا القسم على ملاحظات متنوعة. هذا القسم من النوع SHT_NOTE. لا تُستخدم أي أنواع سمات.

.note.ABI-tag
    يُستخدم هذا القسم للإعلان عن واجهة التطبيق الثنائية (ABI) المتوقعة لوقت التشغيل لصورة ELF. قد يتضمن اسم نظام التشغيل وإصدارات وقت التشغيل الخاصة به. هذا القسم من النوع SHT_NOTE. السمة الوحيدة المستخدمة هي SHF_ALLOC.

.note.gnu.build-id
    يُستخدم هذا القسم للاحتفاظ بمعرّف يحدد محتويات صورة ELF بشكل فريد. يجب أن تحتوي الملفات المختلفة التي لها نفس معرّف البناء على نفس المحتوى القابل للتنفيذ. انظر خيار --build-id لرابط GNU ‏(ld(1)) لمزيد من التفاصيل. هذا القسم من النوع SHT_NOTE. السمة الوحيدة المستخدمة هي SHF_ALLOC.

.note.GNU-stack
    يُستخدم هذا القسم في ملفات كائنات لينكس للإعلان عن سمات المكدس (stack). هذا القسم من النوع SHT_PROGBITS. السمة الوحيدة المستخدمة هي SHF_EXECINSTR. يشير هذا لرابط GNU إلى أن ملف الكائنات يتطلب مكدسًا قابلاً للتنفيذ.

.note.openbsd.ident
    تحتوي ملفات OpenBSD التنفيذية الأصلية عادةً على هذا القسم لتعريف نفسها حتى تتمكن النواة من تجاوز أي اختبارات محاكاة لملفات ELF الثنائية للتوافق عند تحميل الملف.

.plt
    يحتوي هذا القسم على جدول ربط الإجراءات. هذا القسم من النوع SHT_PROGBITS. السمات خاصة بالمعالج.

.relNAME
    يحتوي هذا القسم على معلومات إعادة التوطين كما هو موضح أدناه. إذا كان الملف يحتوي على قطاع قابل للتحميل يتضمن إعادة التوطين، فستشمل سمات القسم بت SHF_ALLOC. وخلاف ذلك، سيكون البت معطلاً. بحسب العرف، يُزود "NAME" من قِبل القسم الذي تنطبق عليه عمليات إعادة التوطين. وبالتالي، فإن قسم إعادة التوطين لـ .text يحمل عادةً الاسم .rel.text. هذا القسم من النوع SHT_REL.

.relaNAME
    يحتوي هذا القسم على معلومات إعادة التوطين كما هو موضح أدناه. إذا كان الملف يحتوي على قطاع قابل للتحميل يتضمن إعادة التوطين، فستشمل سمات القسم بت SHF_ALLOC. وخلاف ذلك، سيكون البت معطلاً. بحسب العرف، يُزود "NAME" من قِبل القسم الذي تنطبق عليه عمليات إعادة التوطين. وبالتالي، فإن قسم إعادة التوطين لـ .text يحمل عادةً الاسم .rela.text. هذا القسم من النوع SHT_RELA.

.rodata
    يحتوي هذا القسم على بيانات للقراءة فقط تساهم عادةً في قطاع غير قابل للكتابة في صورة العملية. هذا القسم من النوع SHT_PROGBITS. السمة المستخدمة هي SHF_ALLOC.

.rodata1
    يحتوي هذا القسم على بيانات للقراءة فقط تساهم عادةً في قطاع غير قابل للكتابة في صورة العملية. هذا القسم من النوع SHT_PROGBITS. السمة المستخدمة هي SHF_ALLOC.

.shstrtab
    يحتوي هذا القسم على أسماء الأقسام. هذا القسم من النوع SHT_STRTAB. لا تُستخدم أي أنواع سمات.

.strtab
    يحتوي هذا القسم على سلاسل، وهي في الغالب السلاسل التي تمثل الأسماء المرتبطة بمدخلات جدول الرموز. إذا كان الملف يحتوي على قطاع قابل للتحميل يتضمن جدول سلاسل الرموز، فستشمل سمات القسم بت SHF_ALLOC. وخلاف ذلك، سيكون البت معطلاً. هذا القسم من النوع SHT_STRTAB.

.symtab
    يحتوي هذا القسم على جدول رموز. إذا كان الملف يحتوي على قطاع قابل للتحميل يتضمن جدول الرموز، فستشمل سمات القسم بت SHF_ALLOC. وخلاف ذلك، سيكون البت معطلاً. هذا القسم من النوع SHT_SYMTAB.

.text
    يحتوي هذا القسم على "النص"، أو التعليمات القابلة للتنفيذ للبرنامج. هذا القسم من النوع SHT_PROGBITS. السمات المستخدمة هي SHF_ALLOC و SHF_EXECINSTR.

  جداول السلاسل والرموز
تحتوي أقسام جدول السلاسل على تسلسلات محارف منتهية بمحرف صفري، وتسمى عادةً بالسلاسل. يستخدم ملف الكائنات هذه السلاسل لتمثيل أسماء الرموز والأقسام. يُشار إلى السلسلة كمؤشر داخل قسم جدول السلاسل. يُعرَّف البايت الأول، وهو المؤشر صفر، على أنه يحتوي على بايت صفري ('\0'). وبالمثل، يُعرَّف البايت الأخير في جدول السلاسل على أنه يحتوي على بايت صفري، مما يضمن الإنهاء الصفري لجميع السلاسل.

يحتوي جدول رموز ملف الكائنات على المعلومات اللازمة لتحديد موقع وإعادة توطين التعريفات والمراجع الرمزية للبرنامج. مؤشر جدول الرموز هو دليل منخفض في هذه المصفوفة.

    typedef struct {
        uint32_t      st_name;
        Elf32_Addr    st_value;
        uint32_t      st_size;
        unsigned char st_info;
        unsigned char st_other;
        uint16_t      st_shndx;
    } Elf32_Sym;

    typedef struct {
        uint32_t      st_name;
        unsigned char st_info;
        unsigned char st_other;
        uint16_t      st_shndx;
        Elf64_Addr    st_value;
        uint64_t      st_size;
    } Elf64_Sym;

تحتوي النسختان ذات الـ 32 بت والـ 64 بت على نفس الأعضاء، ولكن بترتيب مختلف فقط.

st_name
    يحتوي هذا العضو على مؤشر داخل جدول سلاسل رموز ملف الكائنات، والذي يحتوي على تمثيلات محرفية لأسماء الرموز. إذا كانت القيمة غير صِفرية، فإنها تمثل مؤشر جدول السلاسل الذي يعطي اسم الرمز. وخلاف ذلك، لا يكون للرمز اسم.

st_value
    يعطي هذا العضو قيمة الرمز المرتبط.

st_size
    العديد من الرموز لها أحجام مرتبطة بها. يحتوي هذا العضو على الصفر إذا لم يكن للرمز حجم أو كان حجمه غير معروف.

st_info
    يحدد هذا العضو نوع الرمز وسمات الربط الخاصة به:

    STT_NOTYPE
        نوع الرمز غير معرف.

    STT_OBJECT
        الرمز مرتبط بكائن بيانات.

    STT_FUNC
        الرمز مرتبط بدالة أو كود آخر قابل للتنفيذ.

    STT_SECTION
        الرمز مرتبط بقسم. توجد مدخلات جدول الرموز من هذا النوع أساسًا لإعادة التوطين، وعادةً ما يكون لها روابط STB_LOCAL.

    STT_FILE
        بحسب العرف، يعطي اسم الرمز اسم ملف المصدر المرتبط بملف الكائنات. رمز الملف له روابط STB_LOCAL، ومؤشر قسمه هو SHN_ABS، ويسبق رموز STB_LOCAL الأخرى للملف، إذا كان موجودًا.

    STT_LOPROC
    STT_HIPROC
        القيم في النطاق الشامل [STT_LOPROC، STT_HIPROC] محجوزة لدلالات خاصة بالمعالج.

    STB_LOCAL
        الرموز المحلية ليست مرئية خارج ملف الكائنات الذي يحتوي على تعريفها. قد توجد رموز محلية بنفس الاسم في ملفات متعددة دون أن تتداخل مع بعضها البعض.

    STB_GLOBAL
        الرموز العامة مرئية لجميع ملفات الكائنات التي يُجرى دمجها. إن تعريف ملف واحد لرمز عام سيلبي مرجعًا غير معرف لملف آخر إلى نفس الرمز.

    STB_WEAK
        الرموز الضعيفة تشبه الرموز العامة، ولكن لتعريفاتها أسبقية أقل.

    STB_LOPROC
    STB_HIPROC
        القيم في النطاق الشامل [STB_LOPROC، STB_HIPROC] محجوزة لدلالات خاصة بالمعالج.

    توجد ماكروهات لتعبئة وتفريغ حقول الربط والنوع:

    ELF32_ST_BIND(info)
    ELF64_ST_BIND(info)
        استخراج ربط من قيمة st_info.

    ELF32_ST_TYPE(info)
    ELF64_ST_TYPE(info)
        استخراج نوع من قيمة st_info.

    ELF32_ST_INFO(bind, type)
    ELF64_ST_INFO(bind, type)
        تحويل ربط ونوع إلى قيمة st_info.

st_other
    يحدد هذا العضو رؤية الرمز.

    STV_DEFAULT
        قواعد رؤية الرموز المبدئية. الرموز العامة والضعيفة متاحة للوحدات البرمجية الأخرى؛ والمراجع في الوحدة البرمجية المحلية يمكن اعتراضها بواسطة تعريفات في وحدات برمجية أخرى.
    STV_INTERNAL
        فئة مخفية خاصة بالمعالج.
    STV_HIDDEN
        الرمز غير متاح للوحدات البرمجية الأخرى؛ وتُحل المراجع في الوحدة البرمجية المحلية دائمًا إلى الرمز المحلي (أي لا يمكن اعتراض الرمز بواسطة تعريفات في وحدات برمجية أخرى).
    STV_PROTECTED
        الرمز متاح للوحدات البرمجية الأخرى، ولكن المراجع في الوحدة البرمجية المحلية تُحل دائمًا إلى الرمز المحلي.

    توجد ماكروهات لاستخراج نوع الرؤية:

    ELF32_ST_VISIBILITY(other) أو ELF64_ST_VISIBILITY(other)

st_shndx
    يُعرَّف كل مدخل في جدول الرموز بالنسبة إلى قسم ما. يحتفظ هذا العضو بفهرس جدول ترويسة القسم ذي الصلة.

  مداخل إعادة التوطين (Rel و Rela)
إعادة التوطين هي عملية ربط المراجع الرمزية بالتعريفات الرمزية. يجب أن تحتوي الملفات القابلة لإعادة التوطين على معلومات تصف كيفية تعديل محتويات أقسامها، مما يسمح للملفات التنفيذية وملفات الكائنات المشتركة باحتواء المعلومات الصحيحة لصورة برنامج العملية. ومداخل إعادة التوطين هي هذه البيانات.

بنى إعادة التوطين التي لا تحتاج إلى مضاف:

    typedef struct {
        Elf32_Addr r_offset;
        uint32_t   r_info;
    } Elf32_Rel;

    typedef struct {
        Elf64_Addr r_offset;
        uint64_t   r_info;
    } Elf64_Rel;

بنى إعادة التوطين التي تحتاج إلى مضاف:

    typedef struct {
        Elf32_Addr r_offset;
        uint32_t   r_info;
        int32_t    r_addend;
    } Elf32_Rela;

    typedef struct {
        Elf64_Addr r_offset;
        uint64_t   r_info;
        int64_t    r_addend;
    } Elf64_Rela;

r_offset
    يحدد هذا العضو الموقع الذي يُطبَّق فيه إجراء إعادة التوطين. بالنسبة للملف القابل لإعادة التوطين، تكون القيمة هي إزاحة البايت من بداية القسم إلى وحدة التخزين المتأثرة بإعادة التوطين. بالنسبة للملف التنفيذي أو الكائن المشترك، تكون القيمة هي العنوان الافتراضي لوحدة التخزين المتأثرة بإعادة التوطين.

r_info
    يعطي هذا العضو كلاً من فهرس جدول الرموز الذي يجب إجراء إعادة التوطين بالنسبة إليه ونوع إعادة التوطين المراد تطبيقه. أنواع إعادة التوطين مخصصة للمعالج. عندما يشير النص إلى نوع إعادة توطين مدخل ما أو فهرس جدول الرموز الخاص به، فإن ذلك يعني نتيجة تطبيق ELF[32|64]_R_TYPE أو ELF[32|64]_R_SYM، على التوالي، على العضو r_info للمدخل.

r_addend
    يحدد هذا العضو مضافاً ثابتاً يُستخدم لحساب القيمة المراد تخزينها في الحقل القابل لإعادة التوطين.

  الوسوم الديناميكية (Dyn)
يحتوي القسم .dynamic على سلسلة من البنى التي تحتفظ بمعلومات الربط الديناميكي ذات الصلة. يتحكم العضو d_tag في تفسير d_un.

    typedef struct {
        Elf32_Sword    d_tag;
        union {
            Elf32_Word d_val;
            Elf32_Addr d_ptr;
        } d_un;
    } Elf32_Dyn;
    extern Elf32_Dyn _DYNAMIC[];

    typedef struct {
        Elf64_Sxword    d_tag;
        union {
            Elf64_Xword d_val;
            Elf64_Addr  d_ptr;
        } d_un;
    } Elf64_Dyn;
    extern Elf64_Dyn _DYNAMIC[];

d_tag
    يمكن أن يحمل هذا العضو أيًا من القيم التالية:

    DT_NULL
        يميز نهاية القسم الديناميكي

    DT_NEEDED
        إزاحة جدول السلاسل النصية إلى اسم المكتبة المطلوبة

    DT_PLTRELSZ
        الحجم بالبايت لمداخل إعادة توطين PLT

    DT_PLTGOT
        عنوان PLT و/أو GOT

    DT_HASH
        عنوان جدول تلبيد الرموز

    DT_STRTAB
        عنوان جدول السلاسل النصية

    DT_SYMTAB
        عنوان جدول الرموز

    DT_RELA
        عنوان جدول إعادة توطين Rela

    DT_RELASZ
        الحجم بالبايت لجدول إعادة توطين Rela

    DT_RELAENT
        الحجم بالبايت لمدخل جدول إعادة توطين Rela

    DT_STRSZ
        الحجم بالبايت لجدول السلاسل النصية

    DT_SYMENT
        الحجم بالبايت لمدخل جدول الرموز

    DT_INIT
        عنوان دالة التهيئة

    DT_FINI
        عنوان دالة الإنهاء

    DT_SONAME
        إزاحة جدول السلاسل النصية إلى اسم الكائن المشترك

    DT_RPATH
        إزاحة جدول السلاسل النصية إلى مسار البحث عن تبعيات المكتبة المباشرة وغير المباشرة

    DT_SYMBOLIC
        تنبيه الرابط للبحث في هذا الكائن المشترك قبل الملف التنفيذي عن الرموز

    DT_REL
        عنوان جدول إعادة توطين Rel

    DT_RELSZ
        الحجم بالبايت لجدول إعادة توطين Rel

    DT_RELENT
        الحجم بالبايت لمدخل جدول Rel

    DT_PLTREL
        نوع مدخل إعادة التوطين الذي يشير إليه PLT‏ (Rela أو Rel)

    DT_DEBUG
        استخدام غير محدد لتنقيح الأخطاء

    DT_TEXTREL
        يشير غياب هذا المدخل إلى عدم وجوب تطبيق أي مداخل إعادة توطين على مقطع غير قابل للكتابة

    DT_JMPREL
        عنوان مداخل إعادة التوطين المرتبطة بـ PLT فقط

    DT_BIND_NOW
        توجيه الرابط الديناميكي لمعالجة جميع عمليات إعادة التوطين قبل نقل التحكم إلى الملف التنفيذي

    DT_RUNPATH
        إزاحة جدول السلاسل النصية إلى مسار البحث عن تبعيات المكتبة المباشرة

    DT_LOPROC
    DT_HIPROC
        القيم في النطاق الشامل [DT_LOPROC، DT_HIPROC] محجوزة لدلالات مخصصة للمعالج

d_val
    يمثل هذا العضو قيمًا صحيحة بتفسيرات متنوعة.

d_ptr
    يمثل هذا العضو العناوين الافتراضية للبرنامج. عند تفسير هذه العناوين، ينبغي حساب العنوان الفعلي بناءً على قيمة الملف الأصلية وعنوان قاعدة الذاكرة. لا تحتوي الملفات على مداخل إعادة توطين لإصلاح هذه العناوين.

_DYNAMIC
    مصفوفة تحتوي على جميع البنى الديناميكية في القسم .dynamic. يُملأ هذا آليًا بواسطة الرابط.

  الملاحظات (Nhdr)
تسمح ملاحظات ELF بإلحاق معلومات عشوائية ليستخدمها النظام. تُستخدم بشكل رئيس بواسطة ملفات الذاكرة الأساسية (e_type لـ ET_CORE)، ولكن العديد من المشاريع تعرّف مجموعتها الخاصة من الامتدادات. على سبيل المثال، تستخدم سلسلة أدوات GNU ملاحظات ELF لتمرير المعلومات من الرابط إلى مكتبة C.

تحتوي أقسام الملاحظات على سلسلة من الملاحظات (انظر تعريفات البنية struct أدناه). تتبع كل ملاحظة حقل الاسم (الذي يُعرَّف طوله في n_namesz) ثم حقل الواصف (الذي يُعرَّف طوله في n_descsz) والذي يمتلك عنوان بدئه محاذاة بـ 4 بايت. لا يُعرَّف أي من الحقلين في بنية الملاحظة بسبب أطوالهما العشوائية.

ينبغي لمثال على تحليل ملاحظتين متتاليتين أن يوضح تخطيطهما في الذاكرة:

    void *memory, *name, *desc;
    Elf64_Nhdr *note, *next_note;

    /* The buffer is pointing to the start of the section/segment.  */
    note = memory;

    /* If the name is defined, it follows the note.  */
    name = note->n_namesz == 0 ? NULL : memory + sizeof(*note);

    /* If the descriptor is defined, it follows the name
       (with alignment).  */

    desc = note->n_descsz == 0 ? NULL :
           memory + sizeof(*note) + ALIGN_UP(note->n_namesz, 4);

    /* The next note follows both (with alignment).  */
    next_note = memory + sizeof(*note) +
                         ALIGN_UP(note->n_namesz, 4) +
                         ALIGN_UP(note->n_descsz, 4);

ضع في اعتبارك أن تفسير n_type يعتمد على فضاء الأسماء المحدد بواسطة حقل n_namesz. إذا لم يُعيّن حقل n_namesz (على سبيل المثال، كان 0)، فسيكون هناك مجموعتان من الملاحظات: واحدة لملفات الذاكرة الأساسية والأخرى لجميع أنواع ELF الأخرى. إذا كان فضاء الأسماء غير معروف، فستتراجع الأدوات عادةً إلى مجموعات الملاحظات هذه أيضًا.

    typedef struct {
        Elf32_Word n_namesz;
        Elf32_Word n_descsz;
        Elf32_Word n_type;
    } Elf32_Nhdr;

    typedef struct {
        Elf64_Word n_namesz;
        Elf64_Word n_descsz;
        Elf64_Word n_type;
    } Elf64_Nhdr;

n_namesz
    طول حقل الاسم بالبايت. ستتبع المحتويات هذه الملاحظة مباشرة في الذاكرة. الاسم منتهٍ بمحرف صفري. على سبيل المثال، إذا كان الاسم "GNU"، فسيُعيّن n_namesz على 4.

n_descsz
    طول حقل الواصف بالبايت. ستتبع المحتويات حقل الاسم مباشرة في الذاكرة.

n_type
    اعتمادًا على قيمة حقل الاسم، قد يحمل هذا العضو أيًا من القيم التالية:

    Core files (e_type = ET_CORE)
        الملاحظات المستخدمة من قبل جميع ملفات الذاكرة الأساسية. هذه مخصصة للغاية لنظام التشغيل أو المعمارية وغالبًا ما تتطلب تنسيقًا وثيقًا مع النوى ومكتبات C والمصححات. تُستخدم هذه عندما يكون فضاء الأسماء هو المبدئي (أي يُعيّن n_namesz على 0)، أو كبديل احتياطي عندما يكون فضاء الأسماء غير معروف.

        NT_PRSTATUS
            بنية prstatus
        NT_FPREGSET
            بنية fpregset
        NT_PRPSINFO
            بنية prpsinfo
        NT_PRXREG
            بنية prxregset
        NT_TASKSTRUCT
            بنية المهمة task
        NT_PLATFORM
            سلسلة نصية من sysinfo(SI_PLATFORM)
        NT_AUXV
            مصفوفة auxv
        NT_GWINDOWS
            بنية gwindows
        NT_ASRS
            بنية asrset
        NT_PSTATUS
            بنية pstatus
        NT_PSINFO
            بنية psinfo
        NT_PRCRED
            بنية prcred
        NT_UTSNAME
            بنية utsname
        NT_LWPSTATUS
            بنية lwpstatus
        NT_LWPSINFO
            بنية lwpinfo
        NT_PRFPXREG
            بنية fprxregset
        NT_SIGINFO
            siginfo_t (قد يزداد الحجم بمرور الوقت)
        NT_FILE
            يحتوي على معلومات حول الملفات الممسوحة ذهنيا (المطابقة)
        NT_PRXFPREG
            user_fxsr_struct
        NT_PPC_VMX
            مسجلات PowerPC Altivec/VMX
        NT_PPC_SPE
            مسجلات PowerPC SPE/EVR
        NT_PPC_VSX
            مسجلات PowerPC VSX
        NT_386_TLS
            فتحات i386 TLS (بنية user_desc)
        NT_386_IOPERM
            خريطة بتات أذونات x86 io ‏(1=منع)
        NT_X86_XSTATE
            الحالة الممتدة لـ x86 باستخدام xsave
        NT_S390_HIGH_GPRS
            أنصاف المسجلات العليا لـ s390
        NT_S390_TIMER
            مسجل مؤقت s390
        NT_S390_TODCMP
            مسجل مقارن ساعة وقت اليوم (TOD) لـ s390
        NT_S390_TODPREG
            مسجل وقت اليوم (TOD) القابل للبرمجة لـ s390
        NT_S390_CTRS
            مسجلات تحكم s390
        NT_S390_PREFIX
            مسجل بادئة s390
        NT_S390_LAST_BREAK
            عنوان حدث الكسر لـ s390
        NT_S390_SYSTEM_CALL
            بيانات إعادة تشغيل استدعاء نظام s390
        NT_S390_TDB
            كتلة تشخيص معاملات s390
        NT_ARM_VFP
            مسجلات ARM VFP/NEON
        NT_ARM_TLS
            مسجل ARM TLS
        NT_ARM_HW_BREAK
            مسجلات نقطة التوقف العتادية لـ ARM
        NT_ARM_HW_WATCH
            مسجلات نقطة المراقبة العتادية لـ ARM
        NT_ARM_SYSTEM_CALL
            رقم استدعاء نظام ARM

    n_name = GNU
        الامتدادات المستخدمة بواسطة سلسلة أدوات GNU.

        NT_GNU_ABI_TAG
            معلومات ABI لنظام التشغيل (OS). يتكون حقل desc من 4 كلمات:

            [0] واصف نظام التشغيل (ELF_NOTE_OS_LINUX، و ELF_NOTE_OS_GNU، وما إلى ذلك)
            [1] الإصدار الرئيس لـ ABI
            [2] الإصدار الفرعي لـ ABI
            [3] الإصدار الثانوي لـ ABI

        NT_GNU_HWCAP
            معلومات hwcap الاصطناعية. يبدأ حقل desc بكلمتين:

            [0] عدد المداخل
            [1] قناع بتات المداخل الممكنة

            ثم تتبعها مداخل متغيرة الطول، بايت واحد يليه سلسلة نصية لاسم hwcap منتهية بمحرف صفري. يعطي البايت رقم البت لاختبار ما إذا كان مُمكّنًا، (1U << bit) & قناع البتات.

        NT_GNU_BUILD_ID
            معرّف بناء فريد كما يولّده خيار --build-id لمحرّر الروابط GNU ld(1). يتكوّن الوصف (desc) من أي عدد غير صفري من البايتات.

        NT_GNU_GOLD_VERSION
            يحتوي الوصف (desc) على إصدار محرر روابط GNU Gold المُستخدَم.

    Default/unknown namespace (e_type != ET_CORE)
        تُستخدَم هذه عندما يكون فضاء الأسماء هو المبدئي (أي، سيُضبَط n_namesz إلى 0)، أو كبديل احتياطي عندما يكون فضاء الأسماء مجهولًا.

        NT_VERSION
            سلسلة نصية للإصدار من نوع ما.
        NT_ARCH
            معلومات المعمارية.

ملاحظات
ظهر تنسيق ELF لأول مرة في System V. وتنسيق ELF هو معيار معتمد.

الامتدادات الخاصة بكل من e_phnum و e_shnum و e_shstrndx على التوالي هي امتدادات لينكس. وتدعمها أيضًا أنظمة Sun و BSD و AMD64؛ لمزيد من المعلومات، انظر قسم انظر أيضًا (SEE ALSO).

انظر أيضًا
as(1), elfedit(1), gdb(1), ld(1), nm(1), objcopy(1), objdump(1), patchelf(1), readelf(1), size(1), strings(1), strip(1), execve(2), dl_iterate_phdr(3), core(5), ld.so(8)

شركة هوليت-باكارد (Hewlett-Packard)، دليل Elf-64 Object File Format.

منظمة سانتا كروز (Santa Cruz Operation)، دليل System V Application Binary Interface.

مختبرات نظام يونكس (UNIX System Laboratories)، قطاع "Object Files"، دليل Executable and Linking Format (ELF).

شركة صن مايكروسيستمز (Sun Microsystems)، دليل Linker and Libraries Guide.

مسودة AMD64 ABI، دليل System V Application Binary Interface AMD64 Architecture Processor Supplement.

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.