ELF
এক্সিকিউটেবল অ্যান্ড লিংকেবল ফরম্যাট
Linux-এর বাইনারি container format — object file, executable, shared library তিনটাই একই ফরম্যাট, ELF header-এর e_type ফিল্ড দিয়ে আলাদা।
also: Executable and Linkable Format
Magic bytes 7f 45 4c 46 ("\x7fELF") দিয়ে শুরু — execve() এই
চার byte চেক করেই বুঝে ফাইলটা কীভাবে পড়তে হবে।
e_type — একই format, তিন ভূমিকা:
| e_type | মানে |
|---|---|
ET_REL | .o — linked হয়নি |
ET_EXEC | পুরনো-স্টাইল non-PIE executable |
ET_DYN | shared library অথবা PIE executable |
ET_CORE | crash-এর memory snapshot |
Section বনাম segment — সবচেয়ে সাধারণ বিভ্রান্তি। Section
(.text, .data, .bss, .symtab) সূক্ষ্ম-দানার, নাম-করা,
linker/analysis টুলের জন্য (readelf -S)। Segment (program
header, PT_LOAD) মোটা-দানার, নামহীন memory region, loader/kernel-এর
জন্য (readelf -l) — execve() শুধু segment পড়ে, section header
স্পর্শও করে না। সম্পর্কটা many-to-one: অনেক section একটা segment-এ
গোষ্ঠীবদ্ধ হয়, একই page-permission-এর ভিত্তিতে।
.bss ফাইলে নেই। Type = NOBITS — uninitialized data (ডিফল্ট
মান শূন্য) সংরক্ষণ করার কোনো মানে নেই, তাই ফাইলে শুধু একটা Size
সংখ্যা থাকে, প্রকৃত byte না। একটা 40 MB uninitialized array ফাইলের
আকারে প্রায় কিছুই যোগ করে না — একই আকারের initialized (.data)
array সত্যিই 40 MB যোগ করে।
strip-করা বাইনারিতে section header সম্পূর্ণ অনুপস্থিত থাকতে
পারে, তবু নিখুঁতভাবে চলে — কারণ runtime শুধু program header-এর
উপর নির্ভর করে।