ELF ফাইল ফরম্যাট বোঝা

Understanding Elf File Format



সোর্স কোড থেকে বাইনারি কোড

প্রোগ্রামিং একটি বুদ্ধিমান ধারণা, এবং আপনার পছন্দের একটি প্রোগ্রামিং ভাষায় সোর্স কোড লেখার সাথে শুরু হয়, উদাহরণস্বরূপ C, এবং একটি ফাইলে সোর্স কোড সংরক্ষণ করা। একটি পর্যাপ্ত কম্পাইলারের সাহায্যে, উদাহরণস্বরূপ GCC, আপনার সোর্স কোডটি প্রথমে অবজেক্ট কোডে অনুবাদ করা হয়। অবশেষে, লিঙ্কার অবজেক্ট কোডটিকে একটি বাইনারি ফাইলে অনুবাদ করে যা অবজেক্ট কোডটিকে রেফারেন্সকৃত লাইব্রেরির সাথে লিঙ্ক করে। এই ফাইলে মেশিন কোড হিসাবে একক নির্দেশনা রয়েছে যা সিপিইউ দ্বারা বোঝা যায়, এবং সংকলিত প্রোগ্রামটি চালানোর সাথে সাথে কার্যকর করা হয়।

উপরে উল্লিখিত বাইনারি ফাইলটি একটি নির্দিষ্ট কাঠামো অনুসরণ করে এবং সবচেয়ে সাধারণগুলির মধ্যে একটি হল ELF যা এক্সিকিউটেবল এবং লিঙ্কযোগ্য ফর্ম্যাটকে সংক্ষিপ্ত করে। এটি এক্সিকিউটেবল ফাইল, রিলোকেটেবল অবজেক্ট ফাইল, শেয়ার্ড লাইব্রেরি এবং কোর ডাম্পের জন্য ব্যাপকভাবে ব্যবহৃত হয়।







বিশ বছর আগে-1999 সালে-86open প্রকল্পটি ELF কে x86 প্রসেসরের ইউনিক্স এবং ইউনিক্স-এর মতো সিস্টেমের জন্য স্ট্যান্ডার্ড বাইনারি ফাইল ফরম্যাট হিসেবে বেছে নিয়েছে। ভাগ্যক্রমে, ইএলএফ ফর্ম্যাটটি আগে সিস্টেম ভি অ্যাপ্লিকেশন বাইনারি ইন্টারফেস এবং টুল ইন্টারফেস স্ট্যান্ডার্ড [4] উভয়টিতেই নথিভুক্ত করা হয়েছিল। এই সত্যটি ইউনিক্স-ভিত্তিক অপারেটিং সিস্টেমের বিভিন্ন বিক্রেতা এবং বিকাশকারীদের মধ্যে মানকরণের চুক্তিকে ব্যাপকভাবে সরল করেছে।



এই সিদ্ধান্তের পিছনে কারণটি ছিল ELF- এর নমনীয়তা, এক্সটেনসিবিলিটি এবং বিভিন্ন এন্ডিয়ান ফরম্যাট এবং ঠিকানা আকারের জন্য ক্রস-প্ল্যাটফর্ম সমর্থন। ELF- এর নকশা একটি নির্দিষ্ট প্রসেসর, নির্দেশনা সেট, অথবা হার্ডওয়্যার আর্কিটেকচারের মধ্যে সীমাবদ্ধ নয়। এক্সিকিউটেবল ফাইল ফরম্যাটের বিস্তারিত তুলনার জন্য এখানে দেখুন [3]।



তারপর থেকে, ELF বিন্যাসটি বিভিন্ন অপারেটিং সিস্টেম দ্বারা ব্যবহৃত হয়। অন্যদের মধ্যে, এর মধ্যে রয়েছে লিনাক্স, সোলারিস/ইলুমোস, ফ্রি-, নেট- এবং ওপেনবিএসডি, কিউএনএক্স, বিওএস/হাইকু এবং ফুচসিয়া ওএস [2]। উপরন্তু, আপনি এটি Android, Maemo বা Meego OS/Sailfish OS এর সাথে চলমান মোবাইল ডিভাইসের পাশাপাশি প্লেস্টেশন পোর্টেবল, ড্রিমকাস্ট এবং Wii এর মত গেম কনসোলে পাবেন।





স্পেসিফিকেশন ELF ফাইলের জন্য ফাইলের নাম এক্সটেনশন স্পষ্ট করে না। বিভিন্ন অক্ষর সংমিশ্রণ ব্যবহার করা হয়, যেমন .axf, .bin, .elf, .o, .prx, .puff, .ko, .so, এবং .mod, অথবা কোনটিই নয়।

একটি ELF ফাইলের গঠন

একটি লিনাক্স টার্মিনালে, কমান্ড ম্যান এলফ আপনাকে একটি ELF ফাইলের গঠন সম্পর্কে একটি সহজ সারসংক্ষেপ দেয়:



তালিকা 1: ELF কাঠামোর ম্যানপেজ

$ এগারো জন

ELF (5) লিনাক্স প্রোগ্রামারের ম্যানুয়াল ELF (5)

নাম
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 40 38 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 | [ইমেল সুরক্ষিত] |

ডেবিয়ান জিএনইউ/লিনাক্স রিডেলফ কমান্ড প্রদান করে যা জিএনইউ 'বিনুটিলস' প্যাকেজে দেওয়া হয়। সুইচ -h (ile ফাইল -হেডারের সংক্ষিপ্ত সংস্করণ) এর সাথে এটি একটি 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 00
ক্লাস: ELF64
ডেটা: 2 এর পরিপূরক, সামান্য এন্ডিয়ান
সংস্করণ: 1 (বর্তমান)
ওএস / এবিআই: ইউনিক্স - সিস্টেম ভি
এবিআই সংস্করণ: 0
প্রকার: EXEC (এক্সিকিউটেবল ফাইল)
মেশিন: উন্নত মাইক্রো ডিভাইস X86-64
সংস্করণ: 0x1
প্রবেশ পয়েন্ট ঠিকানা: 0x4025e3
প্রোগ্রাম শিরোনাম শুরু: 64 (ফাইলে বাইট)
বিভাগ শিরোনাম শুরু: 58408 (ফাইলে বাইট)
পতাকা: 0x0
এই হেডারের আকার: 64 (বাইট)
প্রোগ্রাম হেডারের আকার: 56 (বাইট)
প্রোগ্রাম হেডারের সংখ্যা: 9
বিভাগ শিরোনামের আকার: 64 (বাইট)
বিভাগ শিরোনাম সংখ্যা: 27
বিভাগ হেডার স্ট্রিং টেবিল সূচক: 26

প্রোগ্রাম হেডার

প্রোগ্রাম হেডার রান-টাইমে ব্যবহৃত সেগমেন্টগুলি দেখায় এবং সিস্টেমকে কীভাবে একটি প্রসেস ইমেজ তৈরি করতে হয় তা বলে। তালিকা 2 থেকে শিরোনাম দেখায় যে ELF ফাইলটিতে 9 টি প্রোগ্রাম হেডার রয়েছে যার প্রত্যেকটির 56 বাইটের আকার রয়েছে এবং প্রথম হেডারটি বাইট 64 থেকে শুরু হয়।

আবার, readelf কমান্ড ELF ফাইল থেকে তথ্য বের করতে সাহায্য করে। সুইচ -এল (– প্রোগ্রাম -হেডার বা g সেগমেন্টের জন্য সংক্ষিপ্ত) তালিকা 4 -এ দেখানো হিসাবে আরো বিস্তারিত প্রকাশ করে।

তালিকা 4: প্রোগ্রাম শিরোনাম সম্পর্কে তথ্য প্রদর্শন করুন

$ readelf -l/usr/bin/touch

এলফ ফাইলের ধরন হল EXEC (এক্সিকিউটেবল ফাইল)
এন্ট্রি পয়েন্ট 0x4025e3
অফসেট 64 থেকে শুরু করে 9 টি প্রোগ্রাম হেডার রয়েছে

প্রোগ্রাম হেডার:
টাইপ করুন অফসেট VirtAddr PhysAddr
FileSiz MemSiz পতাকা সারিবদ্ধ
PHDR 0x0000000000000040 0x0000000000400040 0x0000000000400040
0x00000000000001f8 0x00000000000001f8 R E 8
INTERP 0x0000000000000238 0x0000000000400238 0x00000000400400238
0x000000000000001c 0x000000000000001c আর 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 0x00000000400400254
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 আর 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 কাঠামোর তৃতীয় অংশ হল সেকশন হেডার। এটি বাইনারি একক বিভাগ তালিকাভুক্ত করা হয়। সুইচ -এস (ction সেকশন -হেডার বা – সেকশনের জন্য সংক্ষিপ্ত) বিভিন্ন হেডার তালিকাভুক্ত করে। স্পর্শ কমান্ডের জন্য, 27 টি বিভাগ শিরোনাম রয়েছে এবং তালিকা 5 তাদের প্রথম চারটি এবং শেষটি শুধুমাত্র দেখায়। প্রতিটি লাইন সেকশন সাইজ, সেকশন টাইপের পাশাপাশি এর ঠিকানা এবং মেমরি অফসেট কভার করে।

তালিকা 5: পাঠের দ্বারা প্রকাশিত বিভাগের বিবরণ

$ readelf -S/usr/bin/touch
0xe428 অফসেট থেকে শুরু করে 27 টি বিভাগের হেডার রয়েছে:

বিভাগ শিরোনাম:
[Nr] নামের ধরন ঠিকানা অফসেট
আকার EntSize পতাকা লিঙ্ক তথ্য সারিবদ্ধ
[0] শূন্য 00000000000000000000000000
0000000000000000 0000000000000000 0 0 0
[1] .interp PROGBITS 0000000000400238 00000238
000000000000001c 0000000000000000 এ 0 0 1
[2] .note.ABI-tag NOTE 0000000000400254 00000254
0000000000000020 0000000000000000 এ 0 0 4
[3] .note.gnu.build-i নোট 0000000000400274 00000274
...
...
[26] .shstrtab STRTAB 0000000000000000 0000e334
00000000000000ef 0000000000000000 0 0 1
পতাকার চাবি:
ডব্লিউ (লিখুন), এ (বরাদ্দ), এক্স (এক্সিকিউট), এম (মার্জ), এস (স্ট্রিং), এল (বড়)
আমি (তথ্য), এল (লিঙ্ক অর্ডার), জি (গ্রুপ), টি (টিএলএস), ই (বাদ), এক্স (অজানা)
O (অতিরিক্ত OS প্রক্রিয়াকরণ প্রয়োজন) o (OS নির্দিষ্ট), p (প্রসেসর নির্দিষ্ট)

একটি ELF ফাইল বিশ্লেষণ করার সরঞ্জাম

আপনি উপরের উদাহরণগুলি থেকে লক্ষ্য করতে পারেন যে, GNU/লিনাক্স বেশ কয়েকটি দরকারী সরঞ্জাম দিয়ে সতেজ হয়েছে যা আপনাকে একটি ELF ফাইল বিশ্লেষণ করতে সহায়তা করে। প্রথম প্রার্থী যা আমরা দেখব তা হল ফাইল ইউটিলিটি।

ফাইল ইএলএফ ফাইল সম্পর্কে প্রাথমিক তথ্য প্রদর্শন করে, যার মধ্যে রয়েছে নির্দেশনা সেট আর্কিটেকচার যার জন্য একটি স্থানান্তরযোগ্য, এক্সিকিউটেবল, বা শেয়ার্ড অবজেক্ট ফাইলের কোডটি উদ্দেশ্য। তালিকা 6 এ এটি আপনাকে বলে যে/bin/touch হল 64-বিট এক্সিকিউটেবল ফাইল যা লিনাক্স স্ট্যান্ডার্ড বেস (LSB), গতিশীলভাবে সংযুক্ত এবং GNU/Linux কার্নেল সংস্করণ 2.6.32 এর জন্য নির্মিত।

তালিকা 6: ফাইল ব্যবহার করে প্রাথমিক তথ্য

$ ফাইল /বিন /টাচ
/বিন/স্পর্শ: ELF 64-বিট LSB এক্সিকিউটেবল, x86-64, সংস্করণ 1 (SYSV), গতিশীলভাবে সংযুক্ত, দোভাষী/lib64/l,
GNU/Linux 2.6.32 এর জন্য, BuildID [sha1] = ec08d609e9e8e73d4be6134541a472ad0ea34502, ছিনতাই
$

দ্বিতীয় প্রার্থী রিডেলফ। এটি একটি ELF ফাইল সম্পর্কে বিস্তারিত তথ্য প্রদর্শন করে। সুইচগুলির তালিকা তুলনামূলকভাবে দীর্ঘ, এবং ELF বিন্যাসের সমস্ত দিক জুড়ে। সুইচ -এন (– নোটের জন্য সংক্ষিপ্ত) তালিকা 7 ব্যবহার করে শুধুমাত্র নোট বিভাগগুলি দেখায়, যা ফাইল স্পর্শে বিদ্যমান -ABI সংস্করণ ট্যাগ, এবং বিল্ড আইডি বিটস্ট্রিং।

তালিকা 7: একটি ELF ফাইলের নির্বাচিত বিভাগগুলি প্রদর্শন করুন

$ readelf -n/usr/bin/touch

0x00000254 দৈর্ঘ্য 0x00000254 ফাইলে পাওয়া নোটগুলি প্রদর্শন করা হচ্ছে:
মালিকের ডেটা সাইজের বর্ণনা
GNU 0x00000010 NT_GNU_ABI_TAG (ABI ভার্সন ট্যাগ)
ওএস: লিনাক্স, এবিআই: 2.6.32

0x00000274 দৈর্ঘ্য 0x00000274 ফাইলে পাওয়া নোটগুলি প্রদর্শন করা হচ্ছে:
মালিকের ডেটা সাইজের বর্ণনা
GNU 0x00000014 NT_GNU_BUILD_ID (অনন্য বিল্ড আইডি বিটস্ট্রিং)
বিল্ড আইডি: ec08d609e9e8e73d4be6134541a472ad0ea34502

লক্ষ্য করুন যে সোলারিস এবং ফ্রিবিএসডি এর অধীনে, ইউটিলিটি এলফডাম্প [7] রিডেলফের সাথে মিলে যায়। 2019 হিসাবে, 2003 থেকে নতুন প্রকাশ বা আপডেট হয়নি।

তিন নম্বর হল এলফুটিলস [6] নামের প্যাকেজ যা সম্পূর্ণরূপে লিনাক্সের জন্য উপলব্ধ। এটি জিএনইউ বিনুটিলসকে বিকল্প সরঞ্জাম সরবরাহ করে এবং ইএলএফ ফাইলগুলি যাচাই করার অনুমতি দেয়। নোট করুন যে প্যাকেজে প্রদত্ত সমস্ত ইউটিলিটিগুলির নাম 'এলফ ইউটিলস' এর জন্য eu দিয়ে শুরু হয়।

সর্বশেষ কিন্তু অন্তত আমরা objdump উল্লেখ করব। এই টুলটি রিডেলফের অনুরূপ কিন্তু অবজেক্ট ফাইলগুলিতে ফোকাস করে। এটি ইএলএফ ফাইল এবং অন্যান্য অবজেক্ট ফরম্যাট সম্বন্ধে একই ধরণের তথ্য সরবরাহ করে।

তালিকা 8: objdump দ্বারা নিষ্কাশিত ফাইল তথ্য

$ objdump -f /bin /touch

/বিন/টাচ: ফাইল ফরম্যাট elf64-x86-64
স্থাপত্য: i386: x86-64, পতাকা 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
শুরুর ঠিকানা 0x00000000004025e3

$

এছাড়াও একটি সফ্টওয়্যার প্যাকেজ আছে যাকে বলা হয় 'এলফকিকার্স' [9] যার মধ্যে রয়েছে একটি ইএলএফ ফাইলের বিষয়বস্তু পড়ার পাশাপাশি এটিকে ম্যানিপুলেট করার সরঞ্জাম। দুর্ভাগ্যবশত, রিলিজের সংখ্যা বরং কম, এবং সেই কারণেই আমরা এটি উল্লেখ করেছি, এবং আরও উদাহরণ দেখাই না।

একজন ডেভেলপার হিসেবে আপনি এর পরিবর্তে 'প্যাক্স-ইউটিলস' [10,11] দেখে নিতে পারেন। ইউটিলিটিগুলির এই সেটটি বেশ কয়েকটি সরঞ্জাম সরবরাহ করে যা ELF ফাইলগুলি যাচাই করতে সহায়তা করে। উদাহরণস্বরূপ, ডাম্পেলফ ELF ফাইল বিশ্লেষণ করে, এবং একটি সি হেডার ফাইল প্রদান করে যার বিশদ রয়েছে - চিত্র 2 দেখুন।

উপসংহার

চতুর নকশা এবং চমৎকার ডকুমেন্টেশনের সংমিশ্রণের জন্য ধন্যবাদ ELF ফর্ম্যাটটি খুব ভালভাবে কাজ করে এবং 20 বছর পরেও এটি ব্যবহার করা হচ্ছে। উপরে দেখানো ইউটিলিটিগুলি আপনাকে একটি ELF ফাইলের অন্তর্দৃষ্টি দেখার অনুমতি দেয় এবং আপনাকে একটি প্রোগ্রাম কী করছে তা বের করতে দেয়। সফ্টওয়্যার বিশ্লেষণের জন্য এটি প্রথম পদক্ষেপ - শুভ হ্যাকিং!

লিঙ্ক এবং রেফারেন্স
স্বীকৃতি

লেখক এই নিবন্ধের প্রস্তুতি সংক্রান্ত সহায়তার জন্য অ্যাক্সেল বেকার্টকে ধন্যবাদ জানাতে চান।