Ortak Nesne Dosyası Biçimi

Ortak Nesne Dosyası Biçimi ( COFF ; Alman  genel nesne dosya biçimi ) bir olduğu ikili biçim programları ve nesne dosyaları için. AT&T tarafından Unix System V işletim sistemi için tanıtıldı ve şimdi esas olarak Windows için PE formatında kullanılıyor (bkz. Portable Executable ). Dosya uzantıları için "cof", "obj" veya " lib " , varsa ve PE için kullanılan uzantılardan ayrı olarak sıklıkla kullanılır .

hikaye

A.out biçimi başlangıçta kullanıldı üzerinde çalıştırılabilir dosyalar için Unix . Ancak bu, gömülü hata ayıklama bilgileri veya dinamik kitaplıklar gibi modern gelişmeleri desteklemiyordu . Bu nedenle AT&T, Unix System V Sürüm 3 için Ortak Nesne Dosya Formatını geliştirdi. Orijinal COFF tasarım açısından sınırlı olduğundan, Unix üreticileri arasında farklı varyantlar geliştirildi (örneğin, AIX için IBM'den XCOFF, SGI'dan ECOFF ve diğerleri). 1989'da System V'in 4. Sürümü ile AT&T, COFF'u Sun Microsystems ile birlikte geliştirilen ELF (Yürütülebilir ve Bağlama Biçimi) yeni biçimiyle değiştirdi .

özellikleri

COFF ile hata ayıklama bilgilerini doğrudan ikili bir dosyaya gömmek mümkün hale geldi. Kitaplıklar dinamik olarak bağlanabilir ve ayrı dosyalar olarak ele alınabilir, bu nedenle bir program dosyasının değiştirilemez, değiştirilemez bir parçası olmaları gerekmez. Bu amaçla, yer değiştirme girişlerindeki tüm adresler, bölümün gerçek adresine göre uygulamanın sanal belleğine yüklenir. Bu adres, bölümün yalnızca derleme zamanının programlamada zaten yerinde ayarlanması için gereksinimlerini karşılamaktadır . COFF'a göre geliştirilen formatlar da bu yeteneklere sahiptir.

kullanım

Modern Unix ve Linux sürümleri artık COFF'yi desteklemiyor, ancak yine de gömülü sistemler için kullanılıyor. Altında Windows NT (ve öncesi) COFF varyantı taşınabilir çalıştırılabilir (PE, bazen de PE / COFF) kütüphaneler ve yürütülebilir için standart dosya biçimidir, ancak bu varyant farklılık hafifçe orijinal COFF dan.

yapı

Bir COFF dosyası birkaç bölümden oluşur. Dosya başlığı ve isteğe bağlı bir başlık ile başlar . Bunu bir başlık, bir veri bölümü ve satır numarası girişleri için bir alan ve yer değiştirme girişleri için bir alandan oluşan bir dizi bölüm izler . Dosyanın sonunda bir sembol tablosu ve bir karakter dizisi tablosu gelir .

Dosya başlığı

Dosya başlığı dosyanın başında bulunmaktadır. Veriler, tüm dosyanın yapısını tanımlayan burada saklanır. Bu, farklı varyantlar ( PE , XCOFF, vb.) İçin farklı olan sihirli sayıyı , dosyanın oluşturulduğu zamanla birlikte bir Unix zaman damgasını ve diğer bölümlerin konumunu ve boyutunu içerir. Tanımlanacak dosyanın çeşitli özelliklerini (örneğin yürütülebilir olup olmadığı gibi) Bayrak kullanımına ek olarak .

struct filehdr {
    unsigned short  f_magic;        /* Magische Zahl */
    unsigned short  f_nscns;        /* Anzahl der Sektionen in der Datei */
    long            f_timdat;       /* Zeitstempel der Erstellung */
    long            f_symptr;       /* Zeiger zur Symboltabelle */
    long            f_nsyms;        /* Größe der Symboltabelle */
    unsigned short  f_opthdr;       /* Größe der "optional header" */
    unsigned short  f_flags;        /* Flags */
};

İsteğe bağlı başlık

İsteğe bağlı başlık COFF modeline bağlı olarak, farklı veri içerir. Genellikle yürütme için gerekli olan diğer bilgiler için kullanılır (örneğin, giriş adresi). Farklı uzunluklarda olabileceğinden, boyutu "Dosya Başlığı" nda saklanır.

Bölüm başlığı

Bölüm başlığı bir o kadar büyük, özellikle bölüm ve burada bu ilgili verileri içeren yüklenmiş olması gerekir içine sanal bellek . Yürütülebilir dosyalar için, genellikle belleğin başlangıcı, örn. H. ilk bölüm 0 adresine yüklenir; bu bağlantılı veriler için farklı olabilir. Ayrıca bir işaretçi ve satır numarası girişlerinin ve yeniden konumlandırma girişlerinin boyutunu içerirler .

struct sectionhdr {
    char           s_name[8];  /* Name der Sektion */
    unsigned long  s_paddr;    /* Speicheradresse, an die diese Sektion geladen werden soll*/
    unsigned long  s_vaddr;    /* virtuelle Adresse, an die diese Sektion geladen werden soll */
    unsigned long  s_size;     /* Größe der Sektion (inklusive Header)*/
    unsigned long  s_scnptr;   /* Zeiger zu den Daten dieser Sektion */
    unsigned long  s_relptr;   /* Zeiger zu den Relokationseinträgen dieser Sektion */
    unsigned long  s_lnnoptr;  /* Zeiger zu dem Zeilennummerneinträgen dieser Sektion */
    unsigned short s_nreloc;   /* Anzahl der Relokationseinträge */
    unsigned short s_nlnno;    /* Anzahl der Zeilennummerneinträge */
    unsigned long  s_flags;    /* Flags */
};

Veri bölümü

Veri bölümü farklı uzunluklarda olabilir. Dosyadaki gerçek verileri içerir. Bunlar genellikle makine kodundaki talimatlar, yürütme için gereken değişkenler ve veriler için alan - kısaca, gerçek programdır.

Yer değiştirme girişi

Bir yeniden konumlandırma girişi, sembollerin veri bölümünde nerede bulunabileceğini tanımlar. Bu, her sembol için ayrı ayrı tanımlanır.

typedef struct reloc{
    unsigned long  r_vaddr;   /* Adresse für die Relokation */
    unsigned long  r_symndx;  /* Symbol, für das die Relokation gilt */
    unsigned short r_type;    /* Type der Relokation*/
};

Satır numarası girişi

Satır numarası girişi, kaynak kodundaki hangi satırın makine kodundaki hangi talimata karşılık geldiğini tanımlar . Bu, özellikle uygulamalarda hata ayıklama için önemlidir . Her bölümün kendi satır numaraları tablosu vardır. Hatlar , bölümdeki her işlev için ayrı ayrı sayılır.

typedef struct lineno{
    union l_addr{
        unsigned long l_symndx;  /* Index des Namens der Funktion */
        unsigned long l_paddr;   /* Adresse der Zeilennummer */
    };
    unsigned short l_lnno;  /* Zeilennummer */
};

Satır numaraları, her işlevin başında 0'dan artırılır. Bir fonksiyonun başladığı bir satır için l_lnno = 0, l_symndxyaratıldığı şekliyle fonksiyonun sembolü ve ile bir giriş . Fonksiyondaki her ek satır için, fonksiyonun başlangıcından itibaren satır sayısı l_lnnove bu satırdan ilk ifadenin adresi ile bir giriş oluşturulur l_paddr.

Sembol tablosu

Sembol tablosu, dosyadaki semboller hakkında bilgi içerir. Semboller örn. B. Diğer programlar tarafından kullanılabilen işlevler veya değişkenler. Sembol tablosunun boyutu ve konumu dosya başlığında belirtilir. Sembol tablosu, formun girişlerinden oluşur

typedef struct sysent{
  union e {
    char e_name[8];             /* Name des Symbols */
    struct e {
      unsigned long e_zeroes;   /* Falls 0, ist der Name des Symbols in der Zeichenkettentabelle angelegt*/
      unsigned long e_offset;   /* Position des Symbols in der Zeichenkettentabelle */
    };
  };
  unsigned long e_value;        /* Wert (in der Regel Adresse) des Symbols */
  short e_scnum;                /* Sektion */
  unsigned short e_type;        /* Datentyp */
  unsigned char e_sclass;       /* Speicherklasse */
  unsigned char e_numaux;       /* Anzahl zusätzlicher Einträge*/
};

e_nameSekiz veya daha az karakterden oluşan sembolün adı kaydedilir. Aksi takdirde, karakter dizisi tablosunda saklanır, sonra olur e_zeros = 0ve e_offsetbu girişin karakter dizisi tablosundaki konumunu gösterir. Sembolün "değeri" e_valuekaydedilir. Bu genellikle bu sembolün depolandığı adrestir ve bu da veri türüne ve e_sclassiçinde depolanan depolama sınıfına bağlıdır . e_typesembolün veri türünü tanımlar. Bu, bir temel tür (int, float vb.) Veya bir bileşik tür (struct, union) olabilir. Ek olarak, sembol bir değer, işaretçi, alan ("dizi") veya bu değeri döndüren bir işlevi tanımlayabilir. e_classdepolama sınıfını, yani sembolün nerede ve nasıl depolandığını tanımlar (örneğin, bir harici sembol, bir fonksiyon argümanı, global veya statik bir değişken, vb.). Sembol türüne bağlı olarak ek girişler yapılabilir. Bu girişlerin sayısı da e_numauxbelirtilir.

Dize tablosu

Dize tablosu sondaki dosyayı takip eder. Tablonun uzunluğunun saklandığı bir tamsayı ile başlar. Sonra tüm dizeler birbirini takip eder. Bir karakter dizisini okumak için, konumunu bilmeniz gerekir ve bu noktada okumaya başlayabilirsiniz. Dizeler sıfır sonludur .

Bireysel kanıt

  1. Common Object File Format Texas Instruments, erişim tarihi 8 Mart 2014
  2. SCO System V Sürüm 3'e Genel Bakış ( İnternet Arşivinde 9 Mart 2014 tarihli orijinalin Memento'su ) Bilgi: Arşiv bağlantısı otomatik olarak eklendi ve henüz kontrol edilmedi. Lütfen orijinal ve arşiv bağlantısını talimatlara göre kontrol edin ve ardından bu uyarıyı kaldırın. HP, 8 Mart 2014'te erişildi  @ 1@ 2Şablon: Webachiv / IABot / h10025.www1.hp.com
  3. ^ XCOFF Object File Format IBM, 8 Mart 2013'te erişildi
  4. Object File / Symbol Table Format Specification Compaq / HP, erişim tarihi 8 Mart 2014
  5. Typer of Executable ( İnternet Arşivi'nde 9 Mart 2014 tarihli orijinalin Memento ) Bilgi: Arşiv bağlantısı otomatik olarak eklendi ve henüz kontrol edilmedi. Lütfen orijinal ve arşiv bağlantısını talimatlara göre kontrol edin ve ardından bu uyarıyı kaldırın. Linux.org, 8 Mart 2014'te erişildi @ 1@ 2Şablon: Webachiv / IABot / www.linux.org
  6. PE ve COFF Spesifikasyonu , Microsoft Developer Network, 8 Mart 2014'te erişildi

İnternet linkleri