فرمت اجرایی و مرتبط

در رایانش، فرمت اجرایی و مرتبط (ELF، که قبلاً به نام Extensible Linking Format نامیده می‌شد) یک استاندارد فرمت فایل برای فایل‌های اجرایی، کد هدف (object code)، کتابخانه‌های اشتراکی و تخلیهٔ هسته (core dump) است. اولین بار با ویژگی‌هایی برای رابط دودویی نرم‌افزار (ABI) سیستم عامل یونیکس نسخه یSystem V Release 4 (SVR4) منتشر شد، نرم‌افزار V System Application Variant Edition 4.1 (18-03-1993)  و بعد تر در استاندارد رابط ابزار که به سرعت مورد قبول فروشندگان مختلف سیستم های یونیکس قرار گرفت. در سال ۱۹۹۹، به عنوان فرمت استاندارد فایل باینری برای سیستم‌های یونیکس و شبه یونیکس بر روی پردازنده‌های x86 توسط پروژه 86open انتخاب شد.

از نظر طراحی، فرمت ELF انعطاف‌پذیر، قابل گسترش و مستقل از سکو است. به عنوان مثال endiannessهای مختلف و اندازه‌های آدرس را پشتیبانی می‌کند، بنابراین هیچ پردازنده مرکزی (CPU) خاص یا معماری مجموعه دستورالعمل را حذف نمی‌کند. این عامل باعث شده‌است که توسط بسیاری از سیستم عامل‌ها در بسیاری از سکوهای سخت‌افزاری مورد استفاده واقع شود.

 طرح فایل 
هر فایل ELF از یک سرصفحه ELF (هدر ELF) ساخته شده‌است و به دنبال آن داده‌های فایل آمده‌است. داده‌ها می‌توانند شامل موارد زیر باشند:
 جدول هدر برنامه، که صفر یا چند بخش حافظه (memory segments) را توصیف می‌کند.
 جدول هدر بخش، که صفر یا چند بخش (section) را توصیف می‌کند.
 داده‌هایی که توسط محتویات جدول هدر برنامه یا جدول هدر بخش به آن‌ها اشاره شده‌است.

بخش‌ها (segments)حاوی اطلاعاتی هستند که برای زمان اجرای فایل مورد نیاز است، در حالی که بخش‌ها (sections) حاوی اطلاعات مهم برای اتصال(linking) و جابجایی هستند. هر بایت در کل فایل می‌تواند حداکثر متعلق به یک قسمت (section) باشد و اصطلاحاً بایت‌های یتیم زمانی به وجود می‌آیند که بایتی متعلق به هیچ بخش نباشد. 

 هدر فایل 
هدر ELF تعریف می‌کند که از آدرس‌های ۳۲ بیتی استفاده شده‌است یا ۶۴ بیتی. هدر حاوی سه فیلد است که از ۳۲ بیتی یا ۶۴ بیتی بودن تأثیر می‌پذیرند و شروع فیلدهای دیگری را که آنها را دنبال می‌کنند، تعیین می‌کنند. هدر ELF به ترتیب برای ۳۲ بیت و ۶۴ بیت، ۵۲ یا ۶۴ بایت طول دارد.
+ELF headerOffsetSize (bytes)FieldPurpose32-bit64-bit32-bit64-bit0x00۴e_ident[EI_MAG0] through e_ident[EI_MAG3]0x7F followed by ELF() in ASCII; these four bytes constitute the magic number.0x04۱e_ident[EI_CLASS]This byte is set to either 1 or 2 to signify 32- or 64-bit format, respectively.0x05۱e_ident[EI_DATA]This byte is set to either 1 or 2 to signify little or big endianness, respectively. This affects interpretation of multi-byte fields starting with offset 0x10.0x06۱e_ident[EI_VERSION]Set to 1 for the original version of ELF.0x07۱e_ident[EI_OSABI]Identifies the target operating system ABI.
ValueABI0x00System V0x01HP-UX0x02NetBSD0x03Linux0x04GNU Hurd0x06Solaris0x07AIX0x08IRIX0x09FreeBSD0x0ATru640x0BNovell Modesto0x0COpenBSD0x0DOpenVMS0x0ENonStop Kernel0x0FAROS0x10Fenix OS0x11CloudABI
It is often set to 0 regardless of the target platform.0x08۱e_ident[EI_ABIVERSION]Further specifies the ABI version. Its interpretation depends on the target ABI. Linux kernel (after at least 2.6) has no definition of it. In that case, offset and size of EI_PAD are 8.0x09۷e_ident[EI_PAD]currently unused0x10۲e_typeIdentifies object file type.
ValueType0x00ET_NONE0x01ET_REL0x02ET_EXEC0x03ET_DYN0x04ET_CORE0xfe00ET_LOOS0xfeffET_HIOS0xff00ET_LOPROC0xffffET_HIPROC0x12۲e_machineSpecifies target instruction set architecture. Some examples are:
ValueISA0x00No specific instruction set0x02SPARC0x03x860x08MIPS0x14PowerPC0x16S3900x28ARM0x2ASuperH0x32IA-640x3Ex86-640xB7AArch640xF3RISC-V0x14۴e_versionSet to 1 for the original version of ELF.0x18۴۸e_entryThis is the memory address of the entry point from where the process starts executing. This field is either 32 or 64 bits long depending on the format defined earlier.0x1C0x20۴۸e_phoffPoints to the start of the program header table. It usually follows the file header immediately, making the offset 0x34 or 0x40 for 32- and 64-bit ELF executables, respectively.0x200x28۴۸e_shoffPoints to the start of the section header table.0x240x30۴e_flagsInterpretation of this field depends on the target architecture.0x280x34۲e_ehsizeContains the size of this header, normally 64 Bytes for 64-bit and 52 Bytes for 32-bit format.0x2A0x36۲e_phentsizeContains the size of a program header table entry.0x2C0x38۲e_phnumContains the number of entries in the program header table.0x2E0x3A۲e_shentsizeContains the size of a section header table entry.0x300x3C۲e_shnumContains the number of entries in the section header table.0x320x3E۲e_shstrndxContains index of the section header table entry that contains the section names.

 هدر برنامه 
جدول هدر برنامه به سیستم می‌گوید چگونه یک تصویر پردازش ایجاد کند.

هدر برنامه در محل نشانگر فایل e_phoff یافت می‌شود و شامل ورودی‌های e_phnum است که هر کدام با اندازه e_phentsize هستند. طرح بندی در ELF ۳۲ بیتی نسبت به ELF 64 بیتی کمی متفاوت است، زیرا p_flags به دلیل ایجاد هماهنگی در مکان ساختاری متفاوت قرار دارند. هر ورودی به صورت زیر تشکیل شده‌است:
+Program headerOffsetSize (bytes)FieldPurpose32-bit64-bit32-bit64-bit0x00۴p_typeIdentifies the type of the segment.
ValueNameMeaning0x00000000PT_NULLProgram header table entry unused0x00000001PT_LOADLoadable segment0x00000002PT_DYNAMICDynamic linking information0x00000003PT_INTERPInterpreter information0x00000004PT_NOTEAuxiliary information0x00000005PT_SHLIBreserved0x00000006PT_PHDRsegment containing program header table itself0x60000000PT_LOOSsee below0x6FFFFFFFPT_HIOS0x70000000PT_LOPROC0x7FFFFFFFPT_HIPROC
PT_LOOS to PT_HIOS (PT_LOPROC to PT_HIPROC) is an inclusive reserved ranges for operating system (processor) specific semantics.0x04۴p_flagsSegment-dependent flags (position for 64-bit structure).0x040x08۴۸p_offsetOffset of the segment in the file image.0x080x10۴۸p_vaddrVirtual address of the segment in memory.0x0C0x18۴۸p_paddrOn systems where physical address is relevant, reserved for segment's physical address.0x100x20۴۸p_fileszSize in bytes of the segment in the file image. May be 0.0x140x28۴۸p_memszSize in bytes of the segment in memory. May be 0.0x18۴p_flagsSegment-dependent flags (position for 32-bit structure).0x1C0x30۴۸p_align0 and 1 specify no alignment. Otherwise should be a positive, integral power of 2, with p_vaddr equating p_offset modulus p_align.0x200x38End of Program Header (size)

 سربرگ بخش 
OffsetSize (bytes)FieldPurpose32-bit64-bit32-bit64-bit0x00۴sh_nameAn offset to a string in the .shstrtab section that represents the name of this section0x04۴sh_typeIdentifies the type of this header.
ValueNameMeaning0x0SHT_NULLSection header table entry unused0x1SHT_PROGBITSProgram data0x2SHT_SYMTABSymbol table0x3SHT_STRTABString table0x4SHT_RELARelocation entries with addends0x5SHT_HASHSymbol hash table0x6SHT_DYNAMICDynamic linking information0x7SHT_NOTENotes0x8SHT_NOBITSProgram space with no data (bss)0x9SHT_RELRelocation entries, no addends0x0ASHT_SHLIBReserved0x0BSHT_DYNSYMDynamic linker symbol table0x0ESHT_INIT_ARRAYArray of constructors0x0FSHT_FINI_ARRAYArray of destructors0x10SHT_PREINIT_ARRAYArray of pre-constructors0x11SHT_GROUPSection group0x12SHT_SYMTAB_SHNDXExtended section indices0x13SHT_NUMNumber of defined types.0x60000000SHT_LOOSStart OS-specific..........0x08۴۸sh_flagsIdentifies the attributes of the section.
ValueNameMeaning0x1SHF_WRITEWritable0x2SHF_ALLOCOccupies memory during execution0x4SHF_EXECINSTRExecutable0x10SHF_MERGEMight be merged0x20SHF_STRINGSContains nul-terminated strings0x40SHF_INFO_LINK'sh_info' contains SHT index0x80SHF_LINK_ORDERPreserve order after combining0x100SHF_OS_NONCONFORMINGNon-standard OS specific handling required0x200SHF_GROUPSection is member of a group0x400SHF_TLSSection hold thread-local data0x0ff00000SHF_MASKOSOS-specific0xf0000000SHF_MASKPROCProcessor-specific0x4000000SHF_ORDEREDSpecial ordering requirement (Solaris)0x8000000SHF_EXCLUDESection is excluded unless referenced or allocated (Solaris)0x0C0x10۴۸sh_addrVirtual address of the section in memory, for sections that are loaded.0x100x18۴۸sh_offsetOffset of the section in the file image.0x140x20۴۸sh_sizeSize in bytes of the section in the file image. May be 0.0x180x28۴sh_linkContains the section index of an associated section. This field is used for several purposes, depending on the type of section.0x1C0x2C۴sh_infoContains extra information about the section. This field is used for several purposes, depending on the type of section.0x200x30۴۸sh_addralignContains the required alignment of the section. This field must be a power of two.0x240x38۴۸sh_entsizeContains the size, in bytes, of each entry, for sections that contain fixed-size entries. Otherwise, this field contains zero.0x280x40End of Section Header (size)

 ابزارها 
 readelf یک ابزار باینری یونیکس است که اطلاعات مربوط به یک یا چند فایل ELF را نمایش می‌دهد. پیاده‌سازی نرم‌افزار رایگان توسط GNU Binutils ارائه شده‌است.
 elfutils ابزارهای جایگزین را برای GNU Binutils صرفاً برای لینوکس فراهم می‌کند.
 elfdump یک فرمان برای مشاهده اطلاعات ELF در یک فایل ELF است که تحت Solaris و FreeBSD موجود است.
 objdump طیف گسترده‌ای از اطلاعات مربوط به فایل‌های ELF و سایر فرمت‌های شی را فراهم می‌کند. objdump از کتابخانه توصیفگر فایل باینری به عنوان پایه برای ساخت داده‌های ELF استفاده می‌کند.
 ابزار file یونیکس می‌تواند برخی از اطلاعات مربوط به فایل‌های ELF را نمایش دهد، از جمله معماری تنظیم دستورالعمل که کد آن در یک فایل قابل جابجایی، اجرایی یا شی مشترک، مورد نظر قرار می‌گیرد یا در آن یک تخلیه هسته ای ال اف (ELF core dump) تولید شده‌است.

 برنامه‌های کاربردی 
 سیستم‌های شبه یونیکس 
فرمت ELF جایگزین فرمت‌های اجرایی قدیمی در محیط‌های مختلف شده‌است. این فرمت، فرمت‌های a.out و COFF را در سیستم عامل‌های شبه یونیکس جایگزین کرده‌است:
 لینوکس
 solaris/ Illumos
 IRIX
 FreeBSD
 NetBSD
 OpenBSD
 Redox
 DragonFly BSD
 Syllable
 HP-UX (به جز برنامه‌های ۳۲ بیتی PA-RISC که همچنان از SOM استفاده می‌کنند)
 QNX Neutrino
 MINIX

 تصویب غیریونیکس 
ELF همچنین مورد تصویب برخی از سیستم‌های عامل غیر یونیکس بوده‌است، مانند:
 OpenVMS, در ورژن‌های Itanium و x86-64
 BeOS Revision 4 وبعدتر برای کامپیوترهایی که پایهٔ آن‌ها x86 است. (که فرمت Portable Executable را جایگزین کرد؛ ورژن PowerPC همچنان با فرمت Preferred Executable Format باقی ماند)
 Haiku, یک پیاده‌سازی مجدد متن باز برای BeOS
 RISC OS
 Stratus VOS, در ورژن‌های PA-RISC و x86
 Windows 10 Anniversary Update با استفاده از Windows Subsystem for Linux.
 SkyOS
 Fuchsia OS
 Z/TPF
 HPE NonStop OS

 کنسول‌های بازی 
همچنین برخی از کنسول‌های بازی از ELF استفاده می‌کنند:
 PlayStation Portable , استفاده از PlayStation Portable ELF رمزگذاری شده و انتقال یافته‌است: PSP  PlayStation Vita، PlayStation 2، PlayStation 3، PlayStation 4
 GP2X
 رویای
 Wii

 PowerPC 
سایر سیستم عامل‌های فعال در PowerPC که از ELF استفاده می‌کنند:
 AmigaOS 4، ای ال اف اجرایی (ELF executableج ایگزین Format Extended Hunk Format (EHF) شده‌است که در Amigas که مجهز به کارتهای توسعه PPC است، استفاده شده‌است.
 MorphOS
 AROS

 تلفن‌های همراه 
برخی از سیستم عامل‌های تلفن همراه و دستگاه‌های تلفن همراه از ELF استفاده می‌کنند:
 Symbian OS v9 از فرمت E32Image کند که بر اساس فرمت فایل ELF است؛
 برای مثال سونی اریکسون، W800i، W610، W300 و غیره
 سیستم‌های زیمنس، سکوهای SGOLD و SGOLD2: از زیمنس C65 تا S75 و BenQ-Siemens E71 / EL71؛
 موتورولا، به عنوان مثال، E398، SLVR L7، v360، v3i (و تمام گوشی LTE2 که دارای پچ است).
 برای مثال بادا، سامسونگ Wave S8500
 تلفن‌های نوکیا یا تبلت‌های نوکیا که Maemo یا Meego OS را اجرا می‌کنند، به عنوان مثال Nokia N900.
 اندروید از کتابخانه‌های (ELF .so (shared object برای رابط بومی جاوا استفاده می‌کند. با استفاده از Android Runtime (ART)، به‌طور پیش فرض از Android 5.0 "Lollipop"، تمام برنامه‌های کاربردی در هنگام نصب به صورت ELFهای بومی باینری کامپایل می‌شوند.

برخی از تلفن‌ها می‌توانند فایل‌های ELF را از طریق استفاده از یک پچ که کد مونتاژ را به سیستم عامل اصلی اضافه می‌کند، اجرا کنند که این ویژگی با عنوان ELFPack در فرهنگ مودینگ زیرزمینی، شناخته شده‌است. فرمت فایل ELF همچنین با Atmel AVR (8 بیتی)، AVR32 و با معماری میکروکنترلر Texas Instruments MSP430 مورد استفاده قرار می‌گیرد. برخی از پیاده‌سازی‌های Firmware Open همچنین می‌توانند فایل‌های ELF را بارگذاری کنند، به ویژه پیاده‌سازی‌های اپل که در تقریباً تمامی دستگاه‌های PowerPC که توسط خود شرکت تولید شده‌اند، مورد استفاده قرار می‌گیرند.

 مشخصات فنی 

 Generic:
 System V Application Binary Interface Edition 4.1 (1997-03-18)
 System V ABI Update (اکتبر ۲۰۰۹)
 AMD64:
 System V ABI, AMD64 Supplement
 ARM:
 ELF for the ARM Architecture
 IA-32:
 System V ABI, Intel386 Architecture Processor Supplement
 IA-64:
 Itanium Software Conventions and Runtime Guide (سپتامبر ۲۰۰۰)
 M32R:
 M32R ELF ABI Supplement Version 1.2 (2004-08-26)
 MIPS:
 System V ABI, MIPS RISC Processor Supplement
 MIPS EABI documentation (2003-06-11)
 Motorola 6800:
 Motorola 8- and 16- bit Embedded ABI
 PA-RISC:
 ELF Supplement for PA-RISC Version 1.43 (۶ اکتبر ۱۹۹۷)
 PowerPC:
 System V ABI, PPC Supplement
 PowerPC Embedded Application Binary Interface 32-Bit Implementation (1995-10-01)
 64-bit PowerPC ELF Application Binary Interface Supplement Version 1.9 (2004)
 SPARC:
 System V ABI, SPARC Supplement S/390:
 S/390 32bit ELF ABI Supplement zSeries:
 zSeries 64bit ELF ABI Supplement Symbian OS 9:
 E32Image file format on Symbian OS 9 پایگاه استاندارد لینوکس (LSB) بعضی از ویژگی‌های فوق را برای معماری‌هایی که مشخص شده‌اند، می‌افزاید. به عنوان مثال، برای System V ABI، مکمل AMD64 وجود دارد.

 86open 
86open یک پروژه برای شکل‌گیری توافق عمومی بر روی یک فرمت فایل باینری رایج برای سیستم عامل‌های یونیکس و شبه یونیکس روی کامپیوترهای رایج سازگار با معماری x86 بود تا توسعه دهندگان نرم‌افزار تشویق شوند که به این معماری روی بیاورند. ایده اولیه این بود که بر روی یک زیر مجموعه کوچک از Spec 1170، یک پیشین برای مشخصات یونیکس تک و کتابخانه GNU C (glibc) استانداردسازی شود تا باینری‌های غیر اصلاح شده بتوانند در سیستم عامل‌های یونیکس x86 اجرا شوند. این پروژه در ابتدا "Spec 150" نامگذاری شد.

فرمتی که در نهایت انتخاب شد، ELF بود، به ویژه ELF پیاده‌سازی شده برای لینوکس که پس از آن تبدیل شده بود به استاندارد de facto که توسط همه فروشندگان و سیستم عامل‌های مرتبط پشتیبانی می‌شد.

این گروه در سال ۱۹۹۷ بحث‌های ایمیلی را آغاز کرد و برای اولین بار در ۲۲ اوت ۱۹۹۷ با یکدیگر در دفتر Santa Cruz Operation ملاقات کرد.

کمیته فرماندهی مارک ایوینگ، دیون جانسون، ایوان لیبوویچ، بروس پرونس، اندرو روچ، برین اسپارکس و لینوس توروالدز بودند. دیگر افراد در این پروژه عبارت اند از: کیت بستیک، چاک کرانور، مایکل دیویدسون، کریس جی. دمتریو، اولریش دپپر، دون دوگگر، استیو گینزبورگ، جان دانیل هال، رون هولت، اردن هابارد، دیو جانسن، کین جانستون، اندرو جوزی، رابرت لیپ، بلا لوبکین، تیم مارسلند، گرگ پیج، رونالدو جو رکورد، تیم راکله، جوئل سیلور اشتاین، چیا پی تیین و اریک تران.

سیستم‌های عامل و شرکت‌های موجود عبارت بودند از BeOS، BSDI، FreeBSD، اینتل، لینوکس، NetBSD , SCO و SunSoft, Inc..

این پروژه پیشرفت کرد و در اواسط سال ۱۹۹۸، SCO شروع به توسعه lxrun کرد که یک لایه سازگاری با منبع باز بود که قادر به اجرای باینری‌های لینوکس در OpenServer , UnixWare و Solaris بود. SCO حمایت رسمی خود را از lxrun در LinuxWorld در ماه مارس ۱۹۹۹ اعلام کرد. Sun Microsystems در اوایل سال ۱۹۹۹ به‌طور رسمی از lxrun برای سولاریس پشتیبانی کرد و بعد به پشتیبانی یکپارچه از فرمت دودویی لینوکس از طریق Solaris Containers for Linux Applications پرداخت.

با استفاده از BSDهایی که به مدت طولانی لینوکس را پشتیبانی می‌کنند (از طریق یک لایه سازگاری) و فروشندگان اصلی x86 Unix با پشتیبانی از فرمت اضافه شده‌است، این پروژه تصمیم گرفت که ELF لینوکس فرمت انتخاب شده توسط صنعت باشد و «اعلام کند که خودش حل شده» در ۲۵ ژوئیه ۱۹۹۹.

 FatELF: باینری‌های جهانی برای لینوکس 
FatELF یک فرمت دودویی گسترش یافتهٔ ELF است که قابلیت‌های باینری fat را اضافه می‌کند. ّFatELF برای لینوکس و سایر سیستم عامل‌های مشابه یونیکس بشمار می‌رود. علاوه بر انتزاع معماری پردازنده (ترتیب بایت، اندازهٔ word، دستورالعمل CPU و غیره)، در software-platform abstraction مزیت بالقوه ای وجد دارد مانند باینری‌هایی که از نسخه‌های متعددی از کرنل ABI پشتیبانی می‌کنند. تا سال ۲۰۱۴، پشتیبانی از FatELF در خط اصلی کرنل لینوکس یکپارچه نیست.

 جستارهای وابسته 

 رابط باینری برنامه
 مقایسه فرمت‌های فایل اجرایی
 DWARF - یک فرمت برای اشکال زدایی داده‌ها
 استاندارد سازگاری باینری اینتل
 اجرایی قابل حمل - فرمت مورد استفاده توسط ویندوز
 virtual DSO - vDSO

 منابع 

 خواندن بیشتر 



 An unsung hero: The hardworking ELF by Peter Seebach, December 20, 2005, archived from the original on February 24, 2007

 The ELF Object File Format by Dissection by Eric Youngdale (1995-05-01)
 A Whirlwind Tutorial on Creating Really Teensy ELF Executables for Linux by Brian Raiter
 ELF relocation into non-relocatable objects by Julien Vanegue (2003-08-13)
 Embedded ELF debugging without ptrace by the ELFsh team (2005-08-01)
 Study of ELF loading and relocs'' by Pat Beirne (1999-08-03)

 پیوند به بیرون 

 FreeBSD Handbook: Binary formats (archived version)
 FreeBSD elf(5) manual page
 NetBSD ELF FAQ
 Linux elf(5) manual page
 Oracle Solaris Linker and Libraries Guide
 The ERESI project : reverse engineering on ELF-based operating systems 
 Linux Today article on 86open ۲۶ ژوئیه ۱۹۹۹
 Announcement of 86open on Debian Announce mailing list October 10, 1997, Bruce Perens
 Declaration of Ulrich Drepper (PDF) in The SCO Group vs IBM, ۱۹ سپتامبر ۲۰۰۶
 86open and ELF discussion on Groklaw, ۱۳ اوت ۲۰۰۶

رده:صفحات با ترجمه بازبینی‌نشده
رده:قالب‌های پرونده‌ای اجراپذیر
رده:ویکی‌سازی رباتیک