وقتی یه کدی رو به طور مثال با C مینویسیم، کامپایلر اول کدهامونو به Object file تبدیل میکنه و بعد Linker از اون ها یه فایل قابل اجرا میسازه.
فرمت ELF، مخفف Executable and linking format قالبیه برای همین فایل های باینری قابل اجرا، حالا ممکنه این فایل قابل اجرا یه فایل executable باشه یا یه لایبرری.
این فرمت در سیستم های Unixی و شبه Unixی به عنوان استاندارد فایل های باینری انتخاب شده؛ حالا بسته به هر سیستم عاملی که توش قراره یه فایل با فرمت elf ساخته شه و بسته به این که اون فایل لایبرریه یا چیز دیگه، ممکنه پسوند فایل bin یا so یا o یا elf باشه.
حالا خود این قالب چه جور ساختاریه؟
فایل های ELFی به طور کلی از دو بخش (سرتیتر)Header و (محتوای فایل)File data تشکیل میشه
این بخش یه long سی و دو بایتیه که اولش برای مشخص کردن فرمت فایله که با چهار تا Byteی که این زیر میبینید شروع میشه، ابتدا 7f به معنای .، سپس 45 به معنای E، سپس 4c به معنای L و 46 به معنای F
$ hd /usr/bin/touch | head -5 00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............|
و ما بقیش هم اطلاعاتی از قبیل این که آیا برای فرمت ۶۴ بیته یا ۳۲ بیت و یا این که برا چه سیستم عاملی کامپایل شده.
تو توزیع Debian GNU/Linux یه دستور readelf -h هست که میتونید باهاش هدر فایل ELFی رو به طور Human friendly ببینید
Program header or Segments:
محتوای فایل در ابتدا از یه Program Header یا به عبارتی Segments تشکیل میشه که حاوی اطلاعاتیه برای Runtime؛ این بخش برای این که linker اجازه ی اجرا شدن رو بده استفاده میشه.
همچنین Kernel از این اطلاعات به همراه ساختار اطلاعاتی زیربنایی که تو فایل وجود داره، برای تشکیل یک پردازش استفاده میکننه
Section header or Sections:
سپس محتوای فایل از یک بخش به نام Section Header یا Sections تشکیل میشه که برای linking و relocating استفاده میشه
تک تک بخش های فایل باینری توش لیست شده و بیانگر اینه که این بخش ها سایزشون چقدره، نوعشون چیه، آدرسشون کجاست و memory offsetشون چقدره
بیشتر بخوانید:
https://linux-audit.com/elf-binaries-on-linux-understanding-and-analysis/