ELF فائل فارمیٹ کو سمجھنا۔

Understanding Elf File Format



سورس کوڈ سے بائنری کوڈ تک۔

پروگرامنگ کا آغاز ہوشیار خیال رکھنے ، اور اپنی پسند کی پروگرامنگ زبان میں سورس کوڈ لکھنے سے ہوتا ہے ، مثال کے طور پر سی ، اور سورس کوڈ کو فائل میں محفوظ کرنا۔ ایک مناسب مرتب کی مدد سے ، مثال کے طور پر جی سی سی ، آپ کا سورس کوڈ سب سے پہلے آبجیکٹ کوڈ میں ترجمہ کیا جاتا ہے۔ آخر کار ، لنکر آبجیکٹ کوڈ کو بائنری فائل میں ترجمہ کرتا ہے جو آبجیکٹ کوڈ کو حوالہ شدہ لائبریریوں سے جوڑتا ہے۔ یہ فائل مشین کوڈ کے طور پر واحد ہدایات پر مشتمل ہے جو سی پی یو کے ذریعہ سمجھی جاتی ہے ، اور مرتب شدہ پروگرام چلتے ہی اس پر عمل درآمد کیا جاتا ہے۔

مذکورہ بائنری فائل ایک مخصوص ڈھانچے کی پیروی کرتی ہے ، اور سب سے عام میں سے ایک کا نام ELF ہے جو مختصرا Ex قابل عمل اور لنک ایبل فارمیٹ ہے۔ یہ وسیع پیمانے پر قابل عمل فائلوں ، قابل نقل آبجیکٹ فائلوں ، مشترکہ لائبریریوں اور بنیادی ڈمپوں کے لیے استعمال کیا جاتا ہے۔







بیس سال پہلے 1999 میں خوش قسمتی سے ، ELF فارمیٹ پہلے سسٹم V ایپلی کیشن بائنری انٹرفیس ، اور ٹول انٹرفیس سٹینڈرڈ [4] دونوں میں دستاویزی کیا گیا تھا۔ اس حقیقت نے یونیکس پر مبنی آپریٹنگ سسٹمز کے مختلف دکانداروں اور ڈویلپرز کے درمیان معیاری کاری کے معاہدے کو بہت آسان بنا دیا۔



اس فیصلے کے پیچھے کی وجہ ELF کا ڈیزائن تھا-مختلف اینڈین فارمیٹس اور ایڈریس سائز کے لیے لچک ، توسیع ، اور کراس پلیٹ فارم سپورٹ۔ ELF کا ڈیزائن کسی مخصوص پروسیسر ، انسٹرکشن سیٹ ، یا ہارڈ ویئر فن تعمیر تک محدود نہیں ہے۔ قابل عمل فائل فارمیٹس کی تفصیلی موازنہ کے لیے ، یہاں دیکھیں [3]۔



تب سے ، ELF فارمیٹ کئی مختلف آپریٹنگ سسٹمز کے زیر استعمال ہے۔ دوسروں کے علاوہ ، اس میں لینکس ، سولاریس/الوموس ، فری- ، نیٹ- اور اوپن بی ایس ڈی ، کیو این ایکس ، بی او ایس/ہائکو ، اور فوشیا او ایس [2] شامل ہیں۔ مزید برآں ، آپ اسے اینڈرائیڈ ، میمو یا میگو او ایس/سیل فش او ایس کے ساتھ ساتھ پلے اسٹیشن پورٹیبل ، ڈریم کاسٹ ، اور وائی جیسے گیم کنسولز پر چلنے والے موبائل آلات پر پائیں گے۔





تفصیلات ELF فائلوں کے فائل نام کی توسیع کو واضح نہیں کرتی ہے۔ استعمال میں مختلف حروف کے مجموعے ہیں ، جیسے .axf ، .bin ، .elf ، .o ، .prx ، .puff ، .ko ، .so ، اور .mod ، یا کوئی نہیں۔

ELF فائل کی ساخت

لینکس ٹرمینل پر ، کمان مین ایلف آپ کو ELF فائل کی ساخت کے بارے میں ایک آسان خلاصہ دیتا ہے۔



لسٹنگ 1: ELF ڈھانچے کا مین پیج۔

$ گیارہ آدمی۔

ELF (5) لینکس پروگرامر کا دستی ELF (5)

NAME
elf - قابل عمل اور لنکنگ فارمیٹ (ELF) فائلوں کا فارمیٹ۔

سینوپسس۔
#شامل کریں

وضاحت
ہیڈر فائل ELF قابل عمل بائنری کی شکل کی وضاحت کرتی ہے۔
فائلوں. ان فائلوں میں عمومی قابل عمل فائلیں ہیں ، جو قابل منتقلی ہیں۔
آبجیکٹ فائلیں ، بنیادی فائلیں اور مشترکہ لائبریریاں۔

ELF فائل فارمیٹ کا استعمال کرتے ہوئے ایک قابل عمل فائل ELF ہیڈر پر مشتمل ہے ،
اس کے بعد پروگرام ہیڈر ٹیبل یا سیکشن ہیڈر ٹیبل ، یا دونوں۔
ELF ہیڈر ہمیشہ فائل کے آفسیٹ صفر پر ہوتا ہے۔ پروگرام
ہیڈر ٹیبل اور سیکشن ہیڈر ٹیبل فائل میں آفسیٹ ہیں۔
ELF ہیڈر میں وضاحت کی گئی ہے۔ دو میزیں باقی کی وضاحت کرتی ہیں۔
فائل کی خصوصیات

...

جیسا کہ آپ اوپر دی گئی تفصیل سے دیکھ سکتے ہیں ، ایک ELF فائل دو حصوں پر مشتمل ہے - ایک ELF ہیڈر ، اور فائل ڈیٹا۔ فائل ڈیٹا سیکشن ایک پروگرام ہیڈر ٹیبل پر مشتمل ہوسکتا ہے جو صفر یا اس سے زیادہ حصوں کی وضاحت کرتا ہے ، ایک سیکشن ہیڈر ٹیبل جو صفر یا اس سے زیادہ سیکشنز کو بیان کرتا ہے ، اس کے بعد پروگرام ہیڈر ٹیبل سے اندراجات کے ذریعہ حوالہ کردہ ڈیٹا اور سیکشن ہیڈر ٹیبل پر مشتمل ہوتا ہے۔ ہر طبقہ ایسی معلومات پر مشتمل ہوتا ہے جو فائل کے رن ٹائم پر عمل درآمد کے لیے ضروری ہوتی ہے ، جبکہ حصوں میں لنکنگ اور ری لوکیشن کے لیے اہم ڈیٹا ہوتا ہے۔ چترا 1 اس کو واضح طور پر واضح کرتا ہے۔

ELF ہیڈر۔

ELF ہیڈر 32 بائٹس لمبا ہے ، اور فائل کی شکل کی شناخت کرتا ہے۔ یہ چار منفرد بائٹس کی ترتیب سے شروع ہوتا ہے جو 0x7F کے بعد 0x45 ، 0x4c ، اور 0x46 ہے جو تین حروف E ، L اور F میں ترجمہ کرتا ہے۔ 64 بٹ فارمیٹ ، چھوٹی یا بڑی برداشت کا استعمال کرتا ہے ، ELF ورژن دکھاتا ہے اور ساتھ ہی آپریٹنگ سسٹم جس کے لیے فائل کو مرتب کیا گیا تھا تاکہ صحیح ایپلی کیشن بائنری انٹرفیس (ABI) اور سی پی یو انسٹرکشن سیٹ کے ساتھ مل کر کام کیا جا سکے۔

بائنری فائل ٹچ کا ہیکس ڈمپ مندرجہ ذیل نظر آتا ہے:

.لسٹنگ 2: بائنری فائل کا ہیکس ڈمپ۔

$ hd/usr/bin/touch | سر -5
00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 00 | .ELF ........... |
00000010 02 00 3e 00 01 00 00 00 e3 25 40 00 00 00 00 00 | ..> ......٪ @ ..... |
00000020 40 00 00 00 00 00 00 00 00 28 e4 00 00 00 00 00 00 | @ ....... (....... |
00000030 00 00 00 00 40 00 38 00 09 00 40 00 1b 00 1a 00 | [ای میل محفوظ] @..... |
00000040 06 00 00 00 05 00 00 00 40 00 00 00 00 00 00 00 | [ای میل محفوظ] |

ڈیبین GNU/لینکس ریڈیلف کمانڈ پیش کرتا ہے جو GNU 'binutils' پیکج میں فراہم کی جاتی ہے۔ سوئچ -h (ilefile -header کا مختصر ورژن) کے ساتھ یہ ایک ELF فائل کا ہیڈر اچھی طرح دکھاتا ہے۔ لسٹنگ 3 کمانڈ ٹچ کے لیے اس کی وضاحت کرتی ہے۔

.لسٹنگ 3: ELF فائل کا ہیڈر ڈسپلے کرنا۔

$ readelf -h/usr/bin/touch
ELF ہیڈر:
جادو: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
کلاس: ELF64
ڈیٹا: 2 کی تکمیل ، چھوٹا اینڈین۔
ورژن: 1 (موجودہ)
OS / ABI: UNIX - System V
اے بی آئی ورژن: 0۔
قسم: EXEC (قابل عمل فائل)
مشین: ایڈوانسڈ مائیکرو ڈیوائسز X86-64۔
ورژن: 0x1۔
انٹری پوائنٹ کا پتہ: 0x4025e3۔
پروگرام ہیڈر کا آغاز: 64 (فائل میں بائٹس)
سیکشن ہیڈر کا آغاز: 58408 (فائل میں بائٹس)
جھنڈے: 0x0
اس ہیڈر کا سائز: 64 (بائٹس)
پروگرام ہیڈر کا سائز: 56 (بائٹس)
پروگرام ہیڈر کی تعداد: 9۔
سیکشن ہیڈر کا سائز: 64 (بائٹس)
سیکشن ہیڈرز کی تعداد: 27۔
سیکشن ہیڈر سٹرنگ ٹیبل انڈیکس: 26۔

پروگرام ہیڈر۔

پروگرام ہیڈر رن ٹائم میں استعمال ہونے والے حصوں کو دکھاتا ہے ، اور سسٹم کو بتاتا ہے کہ عمل کی تصویر کیسے بنائی جائے۔ لسٹنگ 2 کے ہیڈر سے پتہ چلتا ہے کہ ELF فائل 9 پروگرام ہیڈر پر مشتمل ہے جس کا سائز 56 بائٹس ہے اور پہلا ہیڈر بائٹ 64 سے شروع ہوتا ہے۔

ایک بار پھر ، رییلف کمانڈ ELF فائل سے معلومات نکالنے میں مدد کرتا ہے۔ سوئچ -l (gram پروگرام ہیڈر یا g سیکشن کے لیے مختصر) مزید تفصیلات ظاہر کرتا ہے جیسا کہ لسٹنگ 4 میں دکھایا گیا ہے۔

.لسٹنگ 4: پروگرام ہیڈر کے بارے میں معلومات دکھائیں۔

$ readelf -l/usr/bin/touch

ایلف فائل کی قسم EXEC ہے (قابل عمل فائل)
انٹری پوائنٹ 0x4025e3۔
پروگرام کے 9 ہیڈر ہیں ، جو آفسیٹ 64 سے شروع ہوتے ہیں۔

پروگرام ہیڈر:
ٹائپ کریں آفسیٹ VirtAddr PhysAddr
FileSiz MemSiz پرچم سیدھ کریں۔
PHDR 0x0000000000000040 0x0000000000400040 0x0000000000400040
0x00000000000001f8 0x00000000000001f8 R E 8
انٹرپ 0x0000000000000238 0x0000000000400238 0x0000000000400238
0x000000000000001c 0x000000000000001c R 1۔
[پروگرام مترجم کی درخواست: /lib64/ld-linux-x86-64.so.2]
لوڈ 0x0000000000000000 0x0000000000400000 0x0000000000400000
0x000000000000d494 0x000000000000d494 R E 200000۔
لوڈ 0x000000000000de10 0x000000000060de10 0x000000000060de10
0x0000000000000524 0x0000000000000748 RW 200000۔
ڈائنامک 0x000000000000de28 0x000000000060de28 0x000000000060de28
0x00000000000001d0 0x00000000000001d0 RW 8۔
نوٹ 0x0000000000000254 0x0000000000400254 0x0000000000400254
0x0000000000000044 0x0000000000000044 R 4۔
GNU_EH_FRAME 0x000000000000bc40 0x000000000040bc40 0x000000000040bc40
0x00000000000003a4 0x00000000000003a4 R 4
GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 RW 10۔
GNU_RELRO 0x000000000000de10 0x000000000060de10 0x000000000060de10
0x00000000000001f0 0x00000000000001f0 R 1۔

سیکشن ٹو سیگمنٹ میپنگ:
سیکشن سیکشنز ...
00۔
01. انٹرپ
02 .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .text .fini rodata .eh_frame_hdr .eh_frame
03 .init_array .fini_array .jcr .dynamic .got .got.plt .data .bss
04. ڈائنامک
05 .note.ABI-tag .note.gnu.build-id
06 .eh_frame_hdr
07۔
08 .init_array .fini_array .jcr .dynamic .got

سیکشن ہیڈر۔

ELF ڈھانچے کا تیسرا حصہ سیکشن ہیڈر ہے۔ اس کا مقصد بائنری کے واحد حصوں کی فہرست بنانا ہے۔ سوئچ -S (سیکشن ہیڈرز یا سیکشنز کے لیے مختصر) مختلف ہیڈرز کی فہرست بناتا ہے۔ جہاں تک ٹچ کمانڈ کا تعلق ہے ، وہاں 27 سیکشن ہیڈر ہیں ، اور لسٹنگ 5 ان میں سے پہلے چار کے علاوہ آخری کو دکھاتی ہے۔ ہر لائن سیکشن سائز ، سیکشن ٹائپ کے ساتھ ساتھ اس کا ایڈریس اور میموری آفسیٹ پر محیط ہے۔

.لسٹنگ 5: سیکشن کی تفصیلات ریفیلف کے ذریعے سامنے آئی ہیں۔

$ readelf -S/usr/bin/touch
یہاں 27 سیکشن ہیڈر ہیں ، جو 0xe428 آفسیٹ سے شروع ہوتے ہیں۔

سیکشن ہیڈر:
[Nr] نام کی قسم ایڈریس آفسیٹ۔
سائز EntSize پرچم لنک معلومات سیدھ کریں۔
[0] NULL 0000000000000000 00000000۔
0000000000000000 0000000000000000 0 0 0۔
[1] .انٹرپ پروبیٹس 0000000000400238 00000238۔
000000000000001c 0000000000000000 A 0 0 1
[2] .note.ABI-tag NOTE 0000000000400254 00000254
0000000000000020 0000000000000000 A 0 0 4۔
[3] .note.gnu.build-i نوٹ 0000000000400274 00000274
...
...
[26] .shstrtab STRTAB 0000000000000000 0000e334
00000000000000ef 0000000000000000 0 0 1۔
پرچم کی کلید:
ڈبلیو (لکھیں) ، اے (مختص) ، ایکس (عملدرآمد) ، ایم (انضمام) ، ایس (تار) ، ایل (بڑے)
I (معلومات) ، L (لنک آرڈر) ، G (گروپ) ، T (TLS) ، E (خارج) ، x (نامعلوم)
O (اضافی OS پروسیسنگ درکار) o (OS مخصوص) ، p (پروسیسر مخصوص)

ELF فائل کا تجزیہ کرنے کے اوزار

جیسا کہ آپ نے اوپر دی گئی مثالوں سے نوٹ کیا ہو گا ، GNU/Linux کو بہت سے مفید ٹولز سے بھرا ہوا ہے جو آپ کو ELF فائل کا تجزیہ کرنے میں مدد دیتے ہیں۔ پہلا امیدوار جس پر ہم نظر ڈالیں گے وہ فائل کی افادیت ہے۔

فائل ELF فائلوں کے بارے میں بنیادی معلومات دکھاتی ہے ، بشمول انسٹرکشن سیٹ آرکیٹیکچر جس کے لیے کوڈ ایک قابل منتقلی ، قابل عمل ، یا مشترکہ شے فائل میں ہے۔ لسٹنگ 6 میں یہ آپ کو بتاتا ہے کہ/bin/touch ایک 64 بٹ قابل عمل فائل ہے جو لینکس سٹینڈرڈ بیس (LSB) کے بعد متحرک طور پر منسلک ہے اور GNU/Linux کرنل ورژن 2.6.32 کے لیے بنائی گئی ہے۔

.لسٹنگ 6: فائل کا استعمال کرتے ہوئے بنیادی معلومات۔

$ فائل /بن /ٹچ۔
/bin/touch: ELF 64-bit LSB قابل عمل ، x86-64 ، ورژن 1 (SYSV) ، متحرک طور پر منسلک ، ترجمان/lib64/l ،
GNU/Linux 2.6.32 کے لیے ، BuildID [sha1] = ec08d609e9e8e73d4be6134541a472ad0ea34502 ، چھین لیا گیا
$

دوسرا امیدوار پڑھا لکھا ہے۔ یہ ELF فائل کے بارے میں تفصیلی معلومات دکھاتا ہے۔ سوئچ کی فہرست نسبتا long طویل ہے ، اور ELF فارمیٹ کے تمام پہلوؤں کا احاطہ کرتی ہے۔ سوئچ -این کا استعمال کرتے ہوئے (– نوٹوں کے لیے مختصر) لسٹنگ 7 صرف نوٹ کے حصے دکھاتا ہے ، جو کہ فائل ٹچ میں موجود ہے -اے بی آئی ورژن ٹیگ ، اور بلڈ آئی ڈی بٹ سٹرنگ۔

.لسٹنگ 7: ELF فائل کے منتخب حصے دکھائیں۔

$ readelf -n/usr/bin/touch

فائل آفسیٹ 0x00000254 کی لمبائی 0x00000020 کے ساتھ ملنے والے نوٹوں کی نمائش:
مالک کے ڈیٹا سائز کی تفصیل۔
GNU 0x00000010 NT_GNU_ABI_TAG (ABI ورژن ٹیگ)
OS: لینکس ، ABI: 2.6.32۔

فائل آفسیٹ 0x00000274 کی لمبائی 0x00000024 پر پائے جانے والے نوٹ دکھانا:
مالک کے ڈیٹا سائز کی تفصیل۔
GNU 0x00000014 NT_GNU_BUILD_ID (منفرد بلڈ ID بٹ سٹرنگ)
تعمیر ID: ec08d609e9e8e73d4be6134541a472ad0ea34502

نوٹ کریں کہ سولاریس اور فری بی ایس ڈی کے تحت ، یوٹیلٹی ایلف ڈمپ [7] ریفیلف کے مطابق ہے۔ 2019 تک ، 2003 کے بعد سے کوئی نئی ریلیز یا اپ ڈیٹ نہیں ہوئی ہے۔

تیسرا نمبر پیکیج ہے جس کا نام ایلفٹائلز ہے [6] جو کہ مکمل طور پر لینکس کے لیے دستیاب ہے۔ یہ GNU Binutils کو متبادل ٹولز مہیا کرتا ہے ، اور ELF فائلوں کی توثیق کی بھی اجازت دیتا ہے۔ نوٹ کریں کہ پیکیج میں فراہم کی جانے والی تمام افادیت کے نام 'elf utils' کے لیے eu سے شروع ہوتے ہیں۔

آخری لیکن کم از کم ہم objdump کا ذکر کریں گے۔ یہ ٹول ریفیلف کی طرح ہے لیکن آبجیکٹ فائلوں پر فوکس کرتا ہے۔ یہ ELF فائلوں اور دیگر آبجیکٹ فارمیٹس کے بارے میں معلومات کی اسی طرح کی رینج فراہم کرتا ہے۔

.لسٹنگ 8: فائل کی معلومات objdump کے ذریعے نکالی گئی۔

$ objdump -f /bin /touch

/bin/touch: فائل کی شکل elf64-x86-64۔
فن تعمیر: i386: x86-64 ، جھنڈے 0x00000112:
EXEC_P ، HAS_SYMS ، D_PAGED۔
شروع کا پتہ 0x00000000004025e3

$

ایک سافٹ ویئر پیکیج بھی ہے جسے 'ایلفککرز' [9] کہا جاتا ہے جس میں ELF فائل کے مندرجات کو پڑھنے کے ساتھ ساتھ اس میں ہیرا پھیری کے لیے ٹولز شامل ہیں۔ بدقسمتی سے ، ریلیز کی تعداد کم ہے ، اور اسی وجہ سے ہم صرف اس کا ذکر کرتے ہیں ، اور مزید مثالیں نہیں دکھاتے ہیں۔

ایک ڈویلپر کی حیثیت سے آپ اس کے بجائے 'pax-utils' [10،11] پر ایک نظر ڈال سکتے ہیں۔ افادیت کا یہ سیٹ متعدد ٹولز مہیا کرتا ہے جو ELF فائلوں کی توثیق کرنے میں مدد کرتے ہیں۔ ایک مثال کے طور پر ، ڈمپلف ELF فائل کا تجزیہ کرتا ہے ، اور ایک C ہیڈر فائل واپس کرتا ہے جس میں تفصیلات موجود ہیں - شکل 2 دیکھیں۔

نتیجہ

ہوشیار ڈیزائن اور عمدہ دستاویزات کے امتزاج کی بدولت ELF فارمیٹ بہت اچھا کام کرتا ہے ، اور 20 سال بعد بھی استعمال میں ہے۔ اوپر دکھائی گئی افادیت آپ کو ایک ELF فائل میں ایک بصیرت دیکھنے کی اجازت دیتی ہے ، اور آپ کو یہ معلوم کرنے دیتا ہے کہ ایک پروگرام کیا کر رہا ہے۔ سافٹ ویئر کا تجزیہ کرنے کے لیے یہ پہلا قدم ہے - خوش ہیکنگ!

لنکس اور حوالہ جات۔
اعترافات

مصنف اس مضمون کی تیاری کے حوالے سے ایکسل بیکرٹ کا شکریہ ادا کرنا چاہتا ہے۔