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

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

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

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

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

هدر فایل 
هدر ELF تعریف می‌کند که از آدرس‌های ۳۲ بیتی استفاده شده‌است یا ۶۴ بیتی. هدر حاوی سه فیلد است که از ۳۲ بیتی یا ۶۴ بیتی بودن تأثیر می‌پذیرند و شروع فیلدهای دیگری را که آنها را دنبال می‌کنند، تعیین می‌کنند. هدر ELF به ترتیب برای ۳۲ بیت و ۶۴ بیت، ۵۲ یا ۶۴ بایت طول دارد.

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

هدر برنامه در محل نشانگر فایل e_phoff یافت می‌شود و شامل ورودی‌های e_phnum است که هر کدام با اندازه e_phentsize هستند. طرح بندی در ELF ۳۲ بیتی نسبت به ELF 64 بیتی کمی متفاوت است، زیرا p_flags به دلیل ایجاد هماهنگی در مکان ساختاری متفاوت قرار دارند. هر ورودی به صورت زیر تشکیل شده‌است:

سربرگ بخش

ابزارها 
 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 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, ۱۳ اوت ۲۰۰۶

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