9 Ağustos 2020 Pazar

ELF Formatı

Giriş
Linux sadece ELF çalıştırmak zorunda değil.  Linux'ta bir çok dosya formatı var. AOUT, ELF, COFF , SHEBANG gibi.

Windows terminolojisi ile konuşursak, ELF formatı Linux'taki exe veya DLL dosyaların formatıdır diyebiliriz.

Magic Numbers
Kernel dosyayı çalıştırırken baş tarafını okur ve baştaki magic number'a göre dosya ile ne yapacağına karar verir.

ELF Magic Number
Eğer okunan birkaç byte ELF magic number yani \x7FELF (hex: 7f 45 4c 46 ile başlıyorsa bu dosya çalıştırılabilirdir der ve başlatır. Açıklaması şöyle
ELF object file starts with 0x7F 0x45 0x4C 0x46 (with bytes 2-4 being 'ELF' in ASCII).
Shebang Magic Number
Eğer magic number shebang yani #! (hex: 23 21) ise bu dosya bir script dosyasıdır der ve örneğin bash ile çalıştırır. Açıklaması şöyle.
The kernel opens the executable, and finds that it starts with #!.
The kernel closes the executable and opens the interpreter instead.
The kernel inserts the path to the script to the argument list (as argv[1]), and executes the interpreter.
Bir elf dosyasının başlığını görmek için şöyle yaparız.
$ readelf -a MyApp
Yapısı Nasıldır
Bu formatın başı şöyledir. Bu format Linux'ta elf.h dosyasında tanımlı.
typedef struct {
  uint8  e_ident[16];
  uint16 e_type;
  uint16 e_machine;
  uint32 e_version;
  uint32 e_entry;
  uint32 e_phoff;
  uint32 e_shoff;
  uint32 e_flags;
  uint16 e_ehsize;
  uint16 e_phentsize;
  uint16 e_phnum;
  uint16 e_shentsize;
  uint16 e_shnum;
  uint16 e_shstrndx;
} Elf32Hdr;
ident alanı
0x7f ve ELF ile başlar.
// check so its really an elf file
if(header.e_ident[0] == 0x7f &&
   header.e_ident[1] == 'E' &&
   header.e_ident[2] == 'L' &&
   header.e_ident[3] == 'F') {...}
ident alanının 6. byte'ı endiannes bilgisini verir. Açıklaması şöyle
This byte is set to either 1 or 2 to signify little or big endianness, respectively. This affects interpretation of multi-byte fields starting with offset 0x10.
Görmek için şöyle yaparız. Aşağıdaki örnekte LSB çıktısını görürüz. Uygulam little endian'dır.
 $ file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, 
interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, 
BuildID[sha1]=4637713da6cd9aa30d1528471c930f88a39045ff, stripped
type Alanı
ET_DYN veya ET_EXEC olabilir.

Hiç yorum yok:

Yorum Gönder