PE Format
Spesifikasi ini menjelaskan struktur file yang dapat dieksekusi (gambar) dan file objek di bawah keluarga sistem operasi Windows. File-file ini disebut sebagai file Portable Executable (PE) dan Common Object File Format (COFF), masing-masing.
Catatan
Dokumen ini disediakan untuk membantu dalam pengembangan alat dan aplikasi untuk Windows tetapi tidak dijamin menjadi spesifikasi lengkap dalam segala hal. Microsoft berhak mengubah dokumen ini tanpa pemberitahuan.
Revisi Spesifikasi Microsoft Portable Executable dan Common Object File Format ini menggantikan semua revisi sebelumnya dari spesifikasi ini.
Dokumen ini menentukan struktur file yang dapat dieksekusi (gambar) dan file objek di bawah keluarga sistem operasi Microsoft Windows. File-file ini disebut sebagai file Portable Executable (PE) dan Common Object File Format (COFF), masing-masing. Nama "Portable Executable" mengacu pada fakta bahwa formatnya tidak spesifik untuk arsitektur.
Konsep tertentu yang muncul di seluruh spesifikasi ini dijelaskan dalam tabel berikut:
Nama | Deskripsi |
---|---|
sertifikat atribut |
Sertifikat yang digunakan untuk mengaitkan pernyataan yang dapat diverifikasi dengan gambar. Sejumlah pernyataan yang dapat diverifikasi yang berbeda dapat dikaitkan dengan file; salah satu yang paling berguna adalah pernyataan oleh produsen perangkat lunak yang menunjukkan apa hash pesan gambar yang diharapkan. Hash pesan mirip dengan checksum kecuali bahwa sangat sulit untuk dipalsukan. Oleh karena itu, sangat sulit untuk memodifikasi file agar memiliki hash pesan yang sama dengan file asli. Pernyataan ini dapat diverifikasi sebagai dibuat oleh produsen dengan menggunakan skema kriptografi kunci publik atau privat. Dokumen ini menjelaskan detail tentang sertifikat atribut selain untuk memungkinkan penyisipannya ke dalam file gambar. |
stempel tanggal/waktu |
Stempel yang digunakan untuk tujuan yang berbeda di beberapa tempat dalam file PE atau COFF. Dalam kebanyakan kasus, format setiap stempel sama dengan yang digunakan oleh fungsi waktu di pustaka run-time C. Untuk pengecualian, lihat deskripsi IMAGE_DEBUG_TYPE_REPRO dalam Jenis Debug. Jika nilai stempel adalah 0 atau 0xFFFFFFFF, nilai tersebut tidak mewakili stempel tanggal/waktu nyata atau bermakna. |
penunjuk file |
Lokasi item dalam file itu sendiri, sebelum diproses oleh linker (dalam kasus file objek) atau loader (dalam kasus file gambar). Dengan kata lain, ini adalah posisi dalam file seperti yang disimpan pada disk. |
Linker |
Referensi ke linker yang disediakan dengan Microsoft Visual Studio. |
file objek |
File yang diberikan sebagai input ke linker. Linker menghasilkan file gambar, yang pada gilirannya digunakan sebagai input oleh loader. Istilah "file objek" tidak selalu menyiratkan koneksi apa pun ke pemrograman berorientasi objek. |
dicadangkan, harus 0 |
Deskripsi bidang yang menunjukkan bahwa nilai bidang harus nol untuk generator dan konsumen harus mengabaikan bidang . |
Alamat virtual relatif (RVA) |
Dalam file gambar, ini adalah alamat item setelah dimuat ke dalam memori, dengan alamat dasar file gambar dikurangi darinya. RVA item hampir selalu berbeda dari posisinya dalam file pada disk (penunjuk file). Dalam file objek, RVA kurang bermakna karena lokasi memori tidak ditetapkan. Dalam hal ini, RVA akan menjadi alamat dalam bagian (dijelaskan nanti dalam tabel ini), tempat relokasi kemudian diterapkan selama penautan. Untuk kesederhanaan, pengkompilasi harus mengatur RVA pertama di setiap bagian ke nol. |
bagian |
Unit dasar kode atau data dalam file PE atau COFF. Misalnya, semua kode dalam file objek dapat digabungkan dalam satu bagian atau (tergantung pada perilaku pengompilasi) setiap fungsi dapat menempati bagiannya sendiri. Dengan lebih banyak bagian, ada lebih banyak overhead file, tetapi linker dapat menautkan kode secara lebih selektif. Bagian mirip dengan segmen dalam arsitektur Intel 8086. Semua data mentah di suatu bagian harus dimuat secara berdampingan. Selain itu, file gambar dapat berisi sejumlah bagian, seperti .tls atau .reloc , yang memiliki tujuan khusus. |
Alamat Virtual (VA) |
Sama seperti RVA, kecuali bahwa alamat dasar file gambar tidak dikurangi. Alamat ini disebut VA karena Windows membuat ruang VA yang berbeda untuk setiap proses, terlepas dari memori fisik. Untuk hampir semua tujuan, VA harus dianggap hanya alamat. VA tidak dapat diprediksi sebagai RVA karena loader mungkin tidak memuat gambar di lokasi pilihannya. |
Daftar berikut ini menjelaskan format Microsoft PE yang dapat dieksekusi, dengan dasar header gambar di bagian atas. Bagian dari Header EXE yang Kompatibel MS-DOS 2.0 hingga bagian yang tidak digunakan tepat sebelum header PE adalah Bagian MS-DOS 2.0, dan hanya digunakan untuk kompatibilitas MS-DOS.
Header EXE yang Kompatibel MS-DOS 2.0
tidak digunakan
Pengidentifikasi OEM
Informasi OEM
Offset ke Header PE
MS-DOS 2.0 Stub Program dan Tabel Relokasi
tidak digunakan
Header PE (diratakan pada batas 8-byte)
Header Bagian
Halaman Gambar:
impor info
info ekspor
relokasi dasar
info sumber daya
Daftar berikut ini menjelaskan format modul objek Microsoft COFF:
Microsoft COFF Header
Header Bagian
Data Mentah:
kode
data
info debug
relokasi
- Stub MS-DOS (Hanya gambar)
- Tanda tangan (Hanya Gambar)
- Header File COFF (Objek dan Gambar)
- Header Opsional (Hanya Gambar)
Header file PE terdiri dari stub Microsoft MS-DOS, tanda tangan PE, header file COFF, dan header opsional. Header file objek COFF terdiri dari header file COFF dan header opsional. Dalam kedua kasus, header file segera diikuti oleh header bagian.
Stub MS-DOS adalah aplikasi valid yang berjalan di bawah MS-DOS. Ini ditempatkan di bagian depan gambar EXE. Linker menempatkan stub default di sini, yang mencetak pesan "Program ini tidak dapat dijalankan dalam mode DOS" ketika gambar dijalankan di MS-DOS. Pengguna dapat menentukan stub yang berbeda dengan menggunakan opsi linker /STUB.
Di lokasi 0x3c, stub memiliki offset file ke tanda tangan PE. Informasi ini memungkinkan Windows untuk menjalankan file gambar dengan benar, meskipun memiliki stub MS-DOS. Offset file ini ditempatkan di lokasi 0x3c selama penautan.
Setelah stub MS-DOS, pada offset file yang ditentukan pada offset 0x3c, adalah tanda tangan 4 byte yang mengidentifikasi file sebagai file gambar format PE. Tanda tangan ini adalah "PE\0\0" (huruf "P" dan "E" diikuti oleh dua byte null).
Di awal file objek, atau segera setelah tanda tangan file gambar, adalah header file COFF standar dalam format berikut. Perhatikan bahwa pemuat Windows membatasi jumlah bagian hingga 96.
Offset | Ukuran | Bidang | Deskripsi |
---|---|---|---|
0 |
2 |
Mesin |
Jumlah yang mengidentifikasi jenis komputer target. Untuk informasi selengkapnya, lihat Jenis Mesin. |
2 |
2 |
NumberOfSections |
Jumlah bagian. Ini menunjukkan ukuran tabel bagian, yang segera mengikuti header. |
4 |
4 |
TimeDateStamp |
32 bit rendah dari jumlah detik sejak 00:00 1 Januari 1970 (nilai time_t run-time C), yang menunjukkan kapan file dibuat. |
8 |
4 |
PointerToSymbolTable |
Offset file dari tabel simbol COFF, atau nol jika tidak ada tabel simbol COFF yang ada. Nilai ini harus nol untuk gambar karena informasi penelusuran kesalahan COFF tidak digunakan lagi. |
12 |
4 |
NumberOfSymbols |
Jumlah entri dalam tabel simbol. Data ini dapat digunakan untuk menemukan tabel string, yang segera mengikuti tabel simbol. Nilai ini harus nol untuk gambar karena informasi penelusuran kesalahan COFF tidak digunakan lagi. |
16 |
2 |
SizeOfOptionalHeader |
Ukuran header opsional, yang diperlukan untuk file yang dapat dieksekusi tetapi tidak untuk file objek. Nilai ini harus nol untuk file objek. Untuk deskripsi format header, lihat Header Opsional (Hanya Gambar). |
18 |
2 |
Karakteristik |
Bendera yang menunjukkan atribut file. Untuk nilai bendera tertentu, lihat Karakteristik. |
Bidang Mesin memiliki salah satu nilai berikut, yang menentukan jenis CPU. File gambar hanya dapat dijalankan pada komputer yang ditentukan atau pada sistem yang menimulasi komputer yang ditentukan.
Terus-menerus | Nilai | Deskripsi |
---|---|---|
IMAGE_FILE_MACHINE_UNKNOWN |
0x0 |
Konten bidang ini diasumsikan berlaku untuk jenis komputer apa pun |
IMAGE_FILE_MACHINE_ALPHA |
0x184 |
Alpha AXP, ruang alamat 32-bit |
IMAGE_FILE_MACHINE_ALPHA64 |
0x284 |
Ruang alamat Alpha 64, 64-bit |
IMAGE_FILE_MACHINE_AM33 |
0x1d3 |
Matsushita AM33 |
IMAGE_FILE_MACHINE_AMD64 |
0x8664 |
x64 |
IMAGE_FILE_MACHINE_ARM |
0x1c0 |
Arm little endian |
IMAGE_FILE_MACHINE_ARM64 |
0xaa64 |
ARM64 little endian |
IMAGE_FILE_MACHINE_ARMNT |
0x1c4 |
ARM Thumb-2 little endian |
IMAGE_FILE_MACHINE_AXP64 |
0x284 |
AXP 64 (Sama dengan Alpha 64) |
IMAGE_FILE_MACHINE_EBC |
0xebc |
Kode byte EFI |
IMAGE_FILE_MACHINE_I386 |
0x14c |
Prosesor Intel 386 atau yang lebih baru dan prosesor yang kompatibel |
IMAGE_FILE_MACHINE_IA64 |
0x200 |
Keluarga prosesor Intel Itanium |
IMAGE_FILE_MACHINE_LOONGARCH32 |
0x6232 |
Keluarga prosesor LoongArch 32-bit |
IMAGE_FILE_MACHINE_LOONGARCH64 |
0x6264 |
Keluarga prosesor LoongArch 64-bit |
IMAGE_FILE_MACHINE_M32R |
0x9041 |
Mitsubishi M32R little endian |
IMAGE_FILE_MACHINE_MIPS16 |
0x266 |
MIPS16 |
IMAGE_FILE_MACHINE_MIPSFPU |
0x366 |
MIPS dengan FPU |
IMAGE_FILE_MACHINE_MIPSFPU16 |
0x466 |
MIPS16 dengan FPU |
IMAGE_FILE_MACHINE_POWERPC |
0x1f0 |
Power PC little endian |
IMAGE_FILE_MACHINE_POWERPCFP |
0x1f1 |
Power PC dengan dukungan titik mengambang |
IMAGE_FILE_MACHINE_R4000 |
0x166 |
MIPS little endian |
IMAGE_FILE_MACHINE_RISCV32 |
0x5032 |
Ruang alamat RISC-V 32-bit |
IMAGE_FILE_MACHINE_RISCV64 |
0x5064 |
Ruang alamat RISC-V 64-bit |
IMAGE_FILE_MACHINE_RISCV128 |
0x5128 |
Ruang alamat RISC-V 128-bit |
IMAGE_FILE_MACHINE_SH3 |
0x1a2 |
Hitachi SH3 |
IMAGE_FILE_MACHINE_SH3DSP |
0x1a3 |
Hitachi SH3 DSP |
IMAGE_FILE_MACHINE_SH4 |
0x1a6 |
Hitachi SH4 |
IMAGE_FILE_MACHINE_SH5 |
0x1a8 |
Hitachi SH5 |
IMAGE_FILE_MACHINE_THUMB |
0x1c2 |
Jempol |
IMAGE_FILE_MACHINE_WCEMIPSV2 |
0x169 |
MIPS little-endian WCE v2 |
Bidang Karakteristik berisi bendera yang menunjukkan atribut objek atau file gambar. Bendera berikut saat ini ditentukan:
Bendera | Nilai | Deskripsi |
---|---|---|
IMAGE_FILE_RELOCS_STRIPPED |
0x0001 |
Hanya gambar, Windows CE, dan Microsoft Windows NT dan yang lebih baru. Ini menunjukkan bahwa file tidak berisi relokasi dasar dan oleh karena itu harus dimuat pada alamat dasar pilihannya. Jika alamat dasar tidak tersedia, loader melaporkan kesalahan. Perilaku default linker adalah untuk menghapus relokasi dasar dari file executable (EXE). |
IMAGE_FILE_EXECUTABLE_IMAGE |
0x0002 |
Hanya gambar. Ini menunjukkan bahwa file gambar valid dan dapat dijalankan. Jika bendera ini tidak diatur, bendera ini menunjukkan kesalahan linker. |
IMAGE_FILE_LINE_NUMS_STRIPPED |
0x0004 |
Nomor baris COFF telah dihapus. Bendera ini tidak digunakan lagi dan harus nol. |
IMAGE_FILE_LOCAL_SYMS_STRIPPED |
0x0008 |
Entri tabel simbol COFF untuk simbol lokal telah dihapus. Bendera ini tidak digunakan lagi dan harus nol. |
IMAGE_FILE_AGGRESSIVE_WS_TRIM |
0x0010 |
Kedaluwarsa. Secara agresif memangkas set kerja. Bendera ini tidak digunakan lagi untuk Windows 2000 dan yang lebih baru dan harus nol. |
IMAGE_FILE_LARGE_ADDRESS_ AWARE |
0x0020 |
Aplikasi dapat menangani > alamat 2 GB. |
0x0040 |
Bendera ini dicadangkan untuk digunakan di masa mendatang. |
|
IMAGE_FILE_BYTES_REVERSED_LO |
0x0080 |
Little endian: bit paling tidak signifikan (LSB) mendahului bit paling signifikan (MSB) dalam memori. Bendera ini tidak digunakan lagi dan harus nol. |
IMAGE_FILE_32BIT_MACHINE |
0x0100 |
Mesin didasarkan pada arsitektur kata 32-bit. |
IMAGE_FILE_DEBUG_STRIPPED |
0x0200 |
Informasi penelusuran kesalahan dihapus dari file gambar. |
IMAGE_FILE_REMOVABLE_RUN_ FROM_SWAP |
0x0400 |
Jika gambar berada di media yang dapat dilepas, muat sepenuhnya dan salin ke file swap. |
IMAGE_FILE_NET_RUN_FROM_SWAP |
0x0800 |
Jika gambar berada di media jaringan, muat sepenuhnya dan salin ke file swap. |
IMAGE_FILE_SYSTEM |
0x1000 |
File gambar adalah file sistem, bukan program pengguna. |
IMAGE_FILE_DLL |
0x2000 |
File gambar adalah pustaka tautan dinamis (DLL). File tersebut dianggap file yang dapat dieksekusi untuk hampir semua tujuan, meskipun file tersebut tidak dapat dijalankan secara langsung. |
IMAGE_FILE_UP_SYSTEM_ONLY |
0x4000 |
File harus dijalankan hanya pada mesin uniprocessor. |
IMAGE_FILE_BYTES_REVERSED_HI |
0x8000 |
Big endian: MSB mendahului LSB dalam memori. Bendera ini tidak digunakan lagi dan harus nol. |
Setiap file gambar memiliki header opsional yang menyediakan informasi ke loader. Header ini bersifat opsional dalam arti bahwa beberapa file (khususnya, file objek) tidak memilikinya. Untuk file gambar, header ini diperlukan. File objek dapat memiliki header opsional, tetapi umumnya header ini tidak memiliki fungsi dalam file objek kecuali untuk meningkatkan ukurannya.
Perhatikan bahwa ukuran header opsional tidak diperbaiki. Bidang SizeOfOptionalHeader di header COFF harus digunakan untuk memvalidasi bahwa pemeriksaan ke dalam file untuk direktori data tertentu tidak melampaui SizeOfOptionalHeader. Untuk informasi selengkapnya, lihat Header File COFF (Objek dan Gambar).
Bidang NumberOfRvaAndSizes dari header opsional juga harus digunakan untuk memastikan bahwa tidak ada pemeriksaan untuk entri direktori data tertentu melampaui header opsional. Selain itu, penting untuk memvalidasi nomor ajaib header opsional untuk kompatibilitas format.
Angka ajaib header opsional menentukan apakah gambar adalah PE32 atau PE32+ yang dapat dieksekusi.
Nomor ajaib | Format PE |
---|---|
0x10b |
PE32 |
0x20b |
PE32+ |
Gambar PE32+ memungkinkan ruang alamat 64-bit sambil membatasi ukuran gambar hingga 2 gigabyte. Modifikasi PE32+ lainnya dibahas di bagian masing-masing.
Header opsional itu sendiri memiliki tiga bagian utama.
Offset (PE32/PE32+) | Ukuran (PE32/PE32+) | Bagian header | Deskripsi |
---|---|---|---|
0 |
28/24 |
Bidang standar |
Bidang yang didefinisikan untuk semua implementasi COFF, termasuk UNIX. |
28/24 |
68/88 |
Bidang khusus Windows |
Bidang tambahan untuk mendukung fitur Tertentu Windows (misalnya, subsistem). |
96/112 |
Variabel |
Direktori data |
Pasangan alamat/ukuran untuk tabel khusus yang ditemukan dalam file gambar dan digunakan oleh sistem operasi (misalnya, tabel impor dan tabel ekspor). |
Delapan bidang pertama dari header opsional adalah bidang standar yang ditentukan untuk setiap implementasi COFF. Bidang ini berisi informasi umum yang berguna untuk memuat dan menjalankan file yang dapat dieksekusi. Mereka tidak berubah untuk format PE32+.
Offset | Ukuran | Bidang | Deskripsi |
---|---|---|---|
0 |
2 |
Sihir |
Bilangan bulat yang tidak ditandatangani yang mengidentifikasi status file gambar. Angka yang paling umum adalah 0x10B, yang mengidentifikasinya sebagai file yang dapat dieksekusi normal. 0x107 mengidentifikasinya sebagai gambar ROM, dan 0x20B mengidentifikasinya sebagai PE32+ yang dapat dieksekusi. |
2 |
1 |
MajorLinkerVersion |
Nomor versi utama linker. |
3 |
1 |
MinorLinkerVersion |
Nomor versi minor linker. |
4 |
4 |
SizeOfCode |
Ukuran bagian kode (teks), atau jumlah semua bagian kode jika ada beberapa bagian. |
8 |
4 |
SizeOfInitializedData |
Ukuran bagian data yang diinisialisasi, atau jumlah semua bagian tersebut jika ada beberapa bagian data. |
12 |
4 |
SizeOfUninitializedData |
Ukuran bagian data yang tidak diinisialisasi (BSS), atau jumlah semua bagian tersebut jika ada beberapa bagian BSS. |
16 |
4 |
AddressOfEntryPoint |
Alamat titik masuk relatif terhadap basis gambar ketika file yang dapat dieksekusi dimuat ke dalam memori. Untuk gambar program, ini adalah alamat awal. Untuk driver perangkat, ini adalah alamat fungsi inisialisasi. Titik masuk bersifat opsional untuk DLL. Ketika tidak ada titik masuk, bidang ini harus nol. |
20 |
4 |
BaseOfCode |
Alamat yang relatif terhadap basis gambar bagian awal kode saat dimuat ke dalam memori. |
PE32 berisi bidang tambahan ini, yang tidak ada di PE32+, mengikuti BaseOfCode.
Offset | Ukuran | Bidang | Deskripsi |
---|---|---|---|
24 |
4 |
BaseOfData |
Alamat yang relatif terhadap basis gambar bagian awal data saat dimuat ke dalam memori. |
21 bidang berikutnya adalah ekstensi untuk format header opsional COFF. Mereka berisi informasi tambahan yang diperlukan oleh linker dan loader di Windows.
Offset (PE32/ PE32+) | Ukuran (PE32/ PE32+) | Bidang | Deskripsi |
---|---|---|---|
28/24 |
4/8 |
ImageBase |
Alamat yang disukai dari byte gambar pertama saat dimuat ke dalam memori; harus kelipatan 64 K. Default untuk DLL adalah 0x10000000. Default untuk WINDOWS CE EXEs adalah 0x00010000. Default untuk Windows NT, Windows 2000, Windows XP, Windows 95, Windows 98, dan Windows Me 0x00400000. |
32/32 |
4 |
SectionAlignment |
Perataan (dalam byte) bagian saat dimuat ke dalam memori. Ini harus lebih besar dari atau sama dengan FileAlignment. Defaultnya adalah ukuran halaman untuk arsitektur. |
36/36 |
4 |
FileAlignment |
Faktor perataan (dalam byte) yang digunakan untuk menyelaraskan data mentah bagian dalam file gambar. Nilai harus berupa kekuatan 2 antara 512 dan 64 K, inklusif. Defaultnya adalah 512. Jika SectionAlignment kurang dari ukuran halaman arsitektur, maka FileAlignment harus cocok dengan SectionAlignment. |
40/40 |
2 |
MajorOperatingSystemVersion |
Nomor versi utama dari sistem operasi yang diperlukan. |
42/42 |
2 |
MinorOperatingSystemVersion |
Nomor versi minor dari sistem operasi yang diperlukan. |
44/44 |
2 |
MajorImageVersion |
Nomor versi utama gambar. |
46/46 |
2 |
MinorImageVersion |
Nomor versi minor gambar. |
48/48 |
2 |
MajorSubsystemVersion |
Nomor versi utama subsistem. |
50/50 |
2 |
MinorSubsystemVersion |
Nomor versi minor subsistem. |
52/52 |
4 |
Win32VersionValue |
Dicadangkan, harus nol. |
56/56 |
4 |
SizeOfImage |
Ukuran (dalam byte) gambar, termasuk semua header, karena gambar dimuat dalam memori. Ini harus kelipatan SectionAlignment. |
60/60 |
4 |
SizeOfHeaders |
Ukuran gabungan stub MS-DOS, header PE, dan header bagian dibulatkan ke kelipatan FileAlignment. |
64/64 |
4 |
Checksum |
Checksum file gambar. Algoritma untuk menghitung checksum dimasukkan ke dalam IMAGHELP.DLL. Berikut ini diperiksa untuk validasi pada waktu pemuatan: semua driver, DLL apa pun yang dimuat pada waktu boot, dan DLL apa pun yang dimuat ke dalam proses Windows penting. |
68/68 |
2 |
Subsistem |
Subsistem yang diperlukan untuk menjalankan gambar ini. Untuk informasi selengkapnya, lihat Subsistem Windows. |
70/70 |
2 |
DllCharacteristics |
Untuk informasi selengkapnya, lihat Karakteristik DLL nanti dalam spesifikasi ini. |
72/72 |
4/8 |
SizeOfStackReserve |
Ukuran tumpukan yang akan dipesan. Hanya SizeOfStackCommit yang diterapkan; sisanya tersedia satu halaman pada satu waktu sampai ukuran cadangan tercapai. |
76/80 |
4/8 |
SizeOfStackCommit |
Ukuran tumpukan yang akan dikomit. |
80/88 |
4/8 |
SizeOfHeapReserve |
Ukuran ruang timbunan lokal untuk dipesan. Hanya SizeOfHeapCommit yang diterapkan; sisanya tersedia satu halaman pada satu waktu sampai ukuran cadangan tercapai. |
84/96 |
4/8 |
SizeOfHeapCommit |
Ukuran ruang timbunan lokal yang akan dilakukan. |
88/104 |
4 |
LoaderFlags |
Dicadangkan, harus nol. |
92/108 |
4 |
NumberOfRvaAndSizes |
Jumlah entri direktori data di sisa header opsional. Masing-masing menjelaskan lokasi dan ukuran. |
Nilai berikut yang ditentukan untuk bidang Subsistem header opsional menentukan subsistem Windows mana (jika ada) yang diperlukan untuk menjalankan gambar.
Terus-menerus | Nilai | Deskripsi |
---|---|---|
IMAGE_SUBSYSTEM_UNKNOWN |
0 |
Subsistem yang tidak diketahui |
IMAGE_SUBSYSTEM_NATIVE |
1 |
Driver perangkat dan proses Windows asli |
IMAGE_SUBSYSTEM_WINDOWS_GUI |
2 |
Subsistem antarmuka pengguna grafis (GUI) Windows |
IMAGE_SUBSYSTEM_WINDOWS_CUI |
3 |
Subsistem karakter Windows |
IMAGE_SUBSYSTEM_OS2_CUI |
5 |
Subsistem karakter OS/2 |
IMAGE_SUBSYSTEM_POSIX_CUI |
7 |
Subsistem karakter Posix |
IMAGE_SUBSYSTEM_NATIVE_WINDOWS |
8 |
Driver Win9x asli |
IMAGE_SUBSYSTEM_WINDOWS_CE_GUI |
9 |
Windows CE |
IMAGE_SUBSYSTEM_EFI_APPLICATION |
10 |
Aplikasi Extensible Firmware Interface (EFI) |
IMAGE_SUBSYSTEM_EFI_BOOT_ SERVICE_DRIVER |
11 |
Driver EFI dengan layanan boot |
IMAGE_SUBSYSTEM_EFI_RUNTIME_ DRIVER |
12 |
Driver EFI dengan layanan run-time |
IMAGE_SUBSYSTEM_EFI_ROM |
13 |
Gambar ROM EFI |
IMAGE_SUBSYSTEM_XBOX |
14 |
XBOX |
IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION |
16 |
Aplikasi boot Windows. |
Nilai berikut didefinisikan untuk bidang DllCharacteristics dari header opsional.
Terus-menerus | Nilai | Deskripsi |
---|---|---|
0x0001 |
Dicadangkan, harus nol. |
|
0x0002 |
Dicadangkan, harus nol. |
|
0x0004 |
Dicadangkan, harus nol. |
|
0x0008 |
Dicadangkan, harus nol. |
|
IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA |
0x0020 |
Gambar dapat menangani ruang alamat virtual 64-bit entropi tinggi. |
IMAGE_DLLCHARACTERISTICS_ DYNAMIC_BASE |
0x0040 |
DLL dapat direlokasi pada waktu pemuatan. |
IMAGE_DLLCHARACTERISTICS_ FORCE_INTEGRITY |
0x0080 |
Pemeriksaan Integritas Kode diberlakukan. |
IMAGE_DLLCHARACTERISTICS_ NX_COMPAT |
0x0100 |
Gambar kompatibel dengan NX. |
IMAGE_DLLCHARACTERISTICS_ NO_ISOLATION |
0x0200 |
Isolasi sadar, tetapi jangan mengisolasi gambar. |
IMAGE_DLLCHARACTERISTICS_ NO_SEH |
0x0400 |
Tidak menggunakan penanganan pengecualian terstruktur (SE). Tidak ada handler SE yang dapat dipanggil dalam gambar ini. |
IMAGE_DLLCHARACTERISTICS_ NO_BIND |
0x0800 |
Jangan mengikat gambar. |
IMAGE_DLLCHARACTERISTICS_APPCONTAINER |
0x1000 |
Gambar harus dijalankan di AppContainer. |
IMAGE_DLLCHARACTERISTICS_ WDM_DRIVER |
0x2000 |
Driver WDM. |
IMAGE_DLLCHARACTERISTICS_GUARD_CF |
0x4000 |
Gambar mendukung Control Flow Guard. |
IMAGE_DLLCHARACTERISTICS_ TERMINAL_SERVER_AWARE |
0x8000 |
Server Terminal sadar. |
Setiap direktori data memberikan alamat dan ukuran tabel atau string yang digunakan Windows. Entri direktori data ini semuanya dimuat ke dalam memori sehingga sistem dapat menggunakannya pada waktu proses. Direktori data adalah bidang 8-byte yang memiliki deklarasi berikut:
typedef struct _IMAGE_DATA_DIRECTORY {
DWORD VirtualAddress;
DWORD Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
Bidang pertama, VirtualAddress, sebenarnya adalah RVA tabel. RVA adalah alamat tabel relatif terhadap alamat dasar gambar saat tabel dimuat. Bidang kedua memberikan ukuran dalam byte. Direktori data, yang membentuk bagian terakhir dari header opsional, tercantum dalam tabel berikut.
Perhatikan bahwa jumlah direktori tidak diperbaiki. Sebelum mencari direktori tertentu, periksa bidang NumberOfRvaAndSizes di header opsional.
Selain itu, jangan asumsikan bahwa RVA dalam tabel ini menunjuk ke awal bagian atau bahwa bagian yang berisi tabel tertentu memiliki nama tertentu.
Offset (PE/PE32+) | Ukuran | Bidang | Deskripsi |
---|---|---|---|
96/112 |
8 |
Ekspor Tabel |
Alamat dan ukuran tabel ekspor. Untuk informasi selengkapnya, lihat Bagian .edata (Hanya Gambar). |
104/120 |
8 |
Impor Tabel |
Alamat dan ukuran tabel impor. Untuk informasi selengkapnya, lihat Bagian .idata. |
112/128 |
8 |
Tabel Sumber Daya |
Alamat dan ukuran tabel sumber daya. Untuk informasi selengkapnya, lihat Bagian .rsrc. |
120/136 |
8 |
Tabel Pengecualian |
Alamat dan ukuran tabel pengecualian. Untuk informasi selengkapnya, lihat Bagian .pdata. |
128/144 |
8 |
Tabel Sertifikat |
Alamat dan ukuran tabel sertifikat atribut. Untuk informasi selengkapnya, lihat Tabel Sertifikat Atribut (Hanya Gambar). |
136/152 |
8 |
Tabel Relokasi Dasar |
Alamat dan ukuran tabel relokasi dasar. Untuk informasi selengkapnya, lihat Bagian .reloc (Hanya Gambar). |
144/160 |
8 |
Awakutu |
Alamat dan ukuran awal data debug. Untuk informasi selengkapnya, lihat Bagian .debug. |
152/168 |
8 |
Arsitektur |
Dicadangkan, harus 0 |
160/176 |
8 |
Global Ptr |
RVA dari nilai yang akan disimpan dalam daftar pointer global. Anggota ukuran struktur ini harus diatur ke nol. |
168/184 |
8 |
Tabel TLS |
Alamat dan ukuran tabel penyimpanan lokal utas (TLS). Untuk informasi selengkapnya, lihat Bagian .tls. |
176/192 |
8 |
Muat Tabel Konfigurasi |
Alamat dan ukuran tabel konfigurasi beban. Untuk informasi selengkapnya, lihat Struktur Konfigurasi Beban (Hanya Gambar). |
184/200 |
8 |
Impor Terikat |
Alamat dan ukuran tabel impor terikat. |
192/208 |
8 |
IAT |
Alamat dan ukuran tabel alamat impor. Untuk informasi selengkapnya, lihat Mengimpor Tabel Alamat. |
200/216 |
8 |
Tunda Impor Deskriptor |
Alamat dan ukuran deskriptor impor penundaan. Untuk informasi selengkapnya, lihat Tabel Impor Tunda Muat (Hanya Gambar). |
208/224 |
8 |
CLR Runtime Header |
Alamat dan ukuran header runtime CLR. Untuk informasi selengkapnya, lihat Bagian .cormeta (Khusus Objek). |
216/232 |
8 |
Dicadangkan, harus nol |
Entri Tabel Sertifikat menunjuk ke tabel sertifikat atribut. Sertifikat ini tidak dimuat ke dalam memori sebagai bagian dari gambar. Dengan demikian, bidang pertama dari entri ini, yang biasanya merupakan RVA, adalah penunjuk file sebagai gantinya.
Setiap baris tabel bagian, berlaku, header bagian. Tabel ini segera mengikuti header opsional, jika ada. Penempatan ini diperlukan karena header file tidak berisi penunjuk langsung ke tabel bagian. Sebagai gantinya, lokasi tabel bagian ditentukan dengan menghitung lokasi byte pertama setelah header. Pastikan untuk menggunakan ukuran header opsional seperti yang ditentukan di header file.
Jumlah entri dalam tabel bagian diberikan oleh bidang NumberOfSections di header file. Entri dalam tabel bagian diberi nomor mulai dari satu (1). Entri bagian kode dan memori data berada dalam urutan yang dipilih oleh linker.
Dalam file gambar, VAs untuk bagian harus ditetapkan oleh linker sehingga berada dalam urutan naik dan berdekatan, dan harus berupa kelipatan nilai SectionAlignment di header opsional.
Setiap header bagian (entri tabel bagian) memiliki format berikut, dengan total 40 byte per entri.
Offset | Ukuran | Bidang | Deskripsi |
---|---|---|---|
0 |
8 |
Nama |
String yang dikodekan UTF-8 dengan 8 byte dan null-padded. Jika panjang string persis 8 karakter, tidak ada penghentian null. Untuk nama yang lebih panjang, bidang ini berisi garis miring (/) yang diikuti oleh representasi ASCII dari angka desimal yang merupakan offset ke dalam tabel string. Gambar yang dapat dieksekusi tidak menggunakan tabel string dan tidak mendukung nama bagian yang lebih panjang dari 8 karakter. Nama panjang dalam file objek dipotong jika dipancarkan ke file yang dapat dieksekusi. |
8 |
4 |
VirtualSize |
Ukuran total bagian saat dimuat ke dalam memori. Jika nilai ini lebih besar dari SizeOfRawData, bagiannya adalah zero-padded. Bidang ini hanya valid untuk gambar yang dapat dieksekusi dan harus diatur ke nol untuk file objek. |
12 |
4 |
VirtualAddress |
Untuk gambar yang dapat dieksekusi, alamat byte pertama bagian relatif terhadap basis gambar saat bagian dimuat ke dalam memori. Untuk file objek, bidang ini adalah alamat byte pertama sebelum relokasi diterapkan; untuk kesederhanaan, pengkompilasi harus mengatur ini ke nol. Jika tidak, itu adalah nilai arbitrer yang dikurangi dari offset selama relokasi. |
16 |
4 |
SizeOfRawData |
Ukuran bagian (untuk file objek) atau ukuran data yang diinisialisasi pada disk (untuk file gambar). Untuk gambar yang dapat dieksekusi, ini harus berupa kelipatan FileAlignment dari header opsional. Jika ini kurang dari VirtualSize, sisa bagian tidak terisi. Karena bidang SizeOfRawData dibulatkan tetapi bidang VirtualSize tidak, dimungkinkan bagi SizeOfRawData untuk menjadi lebih besar dari VirtualSize juga. Ketika bagian hanya berisi data yang tidak diinisialisasi, bidang ini harus nol. |
20 |
4 |
PointerToRawData |
Penunjuk file ke halaman pertama bagian dalam file COFF. Untuk gambar yang dapat dieksekusi, ini harus berupa kelipatan FileAlignment dari header opsional. Untuk file objek, nilai harus diselaraskan pada batas 4 byte untuk performa terbaik. Ketika bagian hanya berisi data yang tidak diinisialisasi, bidang ini harus nol. |
24 |
4 |
PointerToRelocations |
Penunjuk file ke awal entri relokasi untuk bagian tersebut. Ini diatur ke nol untuk gambar yang dapat dieksekusi atau jika tidak ada relokasi. |
28 |
4 |
PointerToLinenumbers |
Penunjuk file ke awal entri nomor baris untuk bagian tersebut. Ini diatur ke nol jika tidak ada nomor baris COFF. Nilai ini harus nol untuk gambar karena informasi penelusuran kesalahan COFF tidak digunakan lagi. |
32 |
2 |
NumberOfRelocations |
Jumlah entri relokasi untuk bagian tersebut. Ini diatur ke nol untuk gambar yang dapat dieksekusi. |
34 |
2 |
NumberOfLinenumbers |
Jumlah entri nomor baris untuk bagian tersebut. Nilai ini harus nol untuk gambar karena informasi penelusuran kesalahan COFF tidak digunakan lagi. |
36 |
4 |
Karakteristik |
Bendera yang menjelaskan karakteristik bagian . Untuk informasi selengkapnya, lihat Bendera Bagian. |
Bendera bagian di bidang Karakteristik header bagian menunjukkan karakteristik bagian.
Bendera | Nilai | Deskripsi |
---|---|---|
0x00000000 |
Disiapkan untuk penggunaan masa mendatang. |
|
0x00000001 |
Disiapkan untuk penggunaan masa mendatang. |
|
0x00000002 |
Disiapkan untuk penggunaan masa mendatang. |
|
0x00000004 |
Disiapkan untuk penggunaan masa mendatang. |
|
IMAGE_SCN_TYPE_NO_PAD |
0x00000008 |
Bagian tidak boleh diisi ke batas berikutnya. Bendera ini usang dan digantikan oleh IMAGE_SCN_ALIGN_1BYTES. Ini hanya valid untuk file objek. |
0x00000010 |
Disiapkan untuk penggunaan masa mendatang. |
|
IMAGE_SCN_CNT_CODE |
0x00000020 |
Bagian berisi kode yang dapat dieksekusi. |
IMAGE_SCN_CNT_INITIALIZED_DATA |
0x00000040 |
Bagian berisi data yang diinisialisasi. |
IMAGE_SCN_CNT_UNINITIALIZED_ DATA |
0x00000080 |
Bagian berisi data yang tidak diinisialisasi. |
IMAGE_SCN_LNK_OTHER |
0x00000100 |
Disiapkan untuk penggunaan masa mendatang. |
IMAGE_SCN_LNK_INFO |
0x00000200 |
Bagian berisi komentar atau informasi lainnya. Bagian .drectve memiliki jenis ini. Ini hanya berlaku untuk file objek. |
0x00000400 |
Disiapkan untuk penggunaan masa mendatang. |
|
IMAGE_SCN_LNK_REMOVE |
0x00000800 |
Bagian tidak akan menjadi bagian dari gambar. Ini hanya valid untuk file objek. |
IMAGE_SCN_LNK_COMDAT |
0x00001000 |
Bagian ini berisi data COMDAT. Untuk informasi selengkapnya, lihat Bagian COMDAT (Khusus Objek). Ini hanya valid untuk file objek. |
IMAGE_SCN_GPREL |
0x00008000 |
Bagian ini berisi data yang dirujuk melalui pointer global (GP). |
IMAGE_SCN_MEM_PURGEABLE |
0x00020000 |
Disiapkan untuk penggunaan masa mendatang. |
IMAGE_SCN_MEM_16BIT |
0x00020000 |
Disiapkan untuk penggunaan masa mendatang. |
IMAGE_SCN_MEM_LOCKED |
0x00040000 |
Disiapkan untuk penggunaan masa mendatang. |
IMAGE_SCN_MEM_PRELOAD |
0x00080000 |
Disiapkan untuk penggunaan masa mendatang. |
IMAGE_SCN_ALIGN_1BYTES |
0x00100000 |
Meratakan data pada batas 1 byte. Hanya berlaku untuk file objek. |
IMAGE_SCN_ALIGN_2BYTES |
0x00200000 |
Meratakan data pada batas 2 byte. Hanya berlaku untuk file objek. |
IMAGE_SCN_ALIGN_4BYTES |
0x00300000 |
Meratakan data pada batas 4 byte. Hanya berlaku untuk file objek. |
IMAGE_SCN_ALIGN_8BYTES |
0x00400000 |
Meratakan data pada batas 8-byte. Hanya berlaku untuk file objek. |
IMAGE_SCN_ALIGN_16BYTES |
0x00500000 |
Meratakan data pada batas 16 byte. Hanya berlaku untuk file objek. |
IMAGE_SCN_ALIGN_32BYTES |
0x00600000 |
Meratakan data pada batas 32 byte. Hanya berlaku untuk file objek. |
IMAGE_SCN_ALIGN_64BYTES |
0x00700000 |
Meratakan data pada batas 64 byte. Hanya berlaku untuk file objek. |
IMAGE_SCN_ALIGN_128BYTES |
0x00800000 |
Meratakan data pada batas 128 byte. Hanya berlaku untuk file objek. |
IMAGE_SCN_ALIGN_256BYTES |
0x00900000 |
Meratakan data pada batas 256 byte. Hanya berlaku untuk file objek. |
IMAGE_SCN_ALIGN_512BYTES |
0x00A00000 |
Meratakan data pada batas 512 byte. Hanya berlaku untuk file objek. |
IMAGE_SCN_ALIGN_1024BYTES |
0x00B00000 |
Meratakan data pada batas 1024-byte. Hanya berlaku untuk file objek. |
IMAGE_SCN_ALIGN_2048BYTES |
0x00C00000 |
Meratakan data pada batas 2048-byte. Hanya berlaku untuk file objek. |
IMAGE_SCN_ALIGN_4096BYTES |
0x00D00000 |
Meratakan data pada batas 4096 byte. Hanya berlaku untuk file objek. |
IMAGE_SCN_ALIGN_8192BYTES |
0x00E00000 |
Meratakan data pada batas 8192 byte. Hanya berlaku untuk file objek. |
IMAGE_SCN_LNK_NRELOC_OVFL |
0x01000000 |
Bagian berisi relokasi yang diperluas. |
IMAGE_SCN_MEM_DISCARDABLE |
0x02000000 |
Bagian dapat dibuang sesuai kebutuhan. |
IMAGE_SCN_MEM_NOT_CACHED |
0x04000000 |
Bagian tidak dapat di-cache. |
IMAGE_SCN_MEM_NOT_PAGED |
0x08000000 |
Bagian ini tidak dapat di-pageable. |
IMAGE_SCN_MEM_SHARED |
0x10000000 |
Bagian dapat dibagikan dalam memori. |
IMAGE_SCN_MEM_EXECUTE |
0x20000000 |
Bagian dapat dijalankan sebagai kode. |
IMAGE_SCN_MEM_READ |
0x40000000 |
Bagian dapat dibaca. |
IMAGE_SCN_MEM_WRITE |
0x80000000 |
Bagian dapat ditulis. |
IMAGE_SCN_LNK_NRELOC_OVFL menunjukkan bahwa jumlah relokasi untuk bagian melebihi 16 bit yang dicadangkan untuk itu di header bagian. Jika bit diatur dan bidang NumberOfRelocations di header bagian 0xffff, jumlah relokasi aktual disimpan di bidang VirtualAddress 32-bit dari relokasi pertama. Ini adalah kesalahan jika IMAGE_SCN_LNK_NRELOC_OVFL diatur dan ada kurang dari 0xffff relokasi di bagian .
Karakter "$" (tanda dolar) memiliki interpretasi khusus dalam nama bagian dalam file objek.
Saat menentukan bagian gambar yang akan berisi konten bagian objek, linker membuang "$" dan semua karakter yang mengikutinya. Dengan demikian, bagian objek bernama .text$X sebenarnya berkontribusi pada bagian .text dalam gambar.
Namun, karakter yang mengikuti "$" menentukan urutan kontribusi ke bagian gambar. Semua kontribusi dengan nama bagian objek yang sama dialokasikan secara berdekatan dalam gambar, dan blok kontribusi diurutkan dalam urutan leksikal menurut nama bagian objek. Oleh karena itu, semua yang ada dalam file objek dengan nama bagian .text$X berakhir bersama-sama, setelah kontribusi .text$W dan sebelum kontribusi .text$Y .
Nama bagian dalam file gambar tidak pernah berisi karakter "$".
- Data Bagian
- Relokasi COFF (Objek Saja)
- Nomor Baris COFF (Tidak digunakan lagi)
- Tabel Simbol COFF
- Rekaman Simbol Tambahan
- Tabel String COFF
- Tabel Sertifikat Atribut (Hanya Gambar)
- Tabel Impor Tunda-Muat (Hanya Gambar)
Struktur data yang dijelaskan sejauh ini, hingga dan termasuk header opsional, semuanya terletak di offset tetap dari awal file (atau dari header PE jika file adalah gambar yang berisi stub MS-DOS).
Sisa objek COFF atau file gambar berisi blok data yang belum tentu pada offset file tertentu. Sebagai gantinya, lokasi ditentukan oleh penunjuk di header opsional atau header bagian.
Pengecualian adalah untuk gambar dengan nilai SectionAlignment kurang dari ukuran halaman arsitektur (4 K untuk Intel x86 dan untuk MIPS, dan 8 K untuk Itanium). Untuk deskripsi SectionAlignment, lihat Header Opsional (Hanya Gambar). Dalam hal ini, ada batasan pada offset file dari data bagian, seperti yang dijelaskan dalam bagian 5.1, "Data Bagian." Pengecualian lain adalah bahwa sertifikat atribut dan informasi debug harus ditempatkan di akhir file gambar, dengan tabel sertifikat atribut segera mendahului bagian debug, karena loader tidak memetakannya ke dalam memori. Namun, aturan tentang sertifikat atribut dan informasi debug tidak berlaku untuk file objek.
Data yang diinisialisasi untuk bagian terdiri dari blok byte sederhana. Namun, untuk bagian yang berisi semua nol, data bagian tidak perlu disertakan.
Data untuk setiap bagian terletak di offset file yang diberikan oleh bidang PointerToRawData di header bagian. Ukuran data ini dalam file ditunjukkan oleh bidang SizeOfRawData. Jika SizeOfRawData kurang dari VirtualSize, sisanya diisi dengan nol.
Dalam file gambar, data bagian harus diratakan pada batas seperti yang ditentukan oleh bidang FileAlignment di header opsional. Data bagian harus muncul dalam urutan nilai RVA untuk bagian yang sesuai (seperti halnya header bagian individual dalam tabel bagian).
Ada batasan tambahan pada file gambar jika nilai SectionAlignment di header opsional kurang dari ukuran halaman arsitektur. Untuk file tersebut, lokasi data bagian dalam file harus cocok dengan lokasinya dalam memori ketika gambar dimuat, sehingga offset fisik untuk data bagian sama dengan RVA.
File objek berisi relokasi COFF, yang menentukan bagaimana data bagian harus dimodifikasi ketika ditempatkan dalam file gambar dan kemudian dimuat ke dalam memori.
File gambar tidak berisi relokasi COFF, karena semua simbol yang direferensikan telah ditetapkan alamat di ruang alamat datar. Gambar berisi informasi relokasi dalam bentuk relokasi dasar di bagian .relokasi (kecuali gambar memiliki atribut IMAGE_FILE_RELOCS_STRIPPED). Untuk informasi selengkapnya, lihat Bagian .reloc (Hanya Gambar).
Untuk setiap bagian dalam file objek, array rekaman panjang tetap menyimpan relokasi COFF bagian. Posisi dan panjang array ditentukan di header bagian. Setiap elemen array memiliki format berikut.
Offset | Ukuran | Bidang | Deskripsi |
---|---|---|---|
0 |
4 |
VirtualAddress |
Alamat item tempat relokasi diterapkan. Ini adalah offset dari awal bagian, ditambah nilai bidang RVA/Offset bagian. Lihat Tabel Bagian (Header Bagian). Misalnya, jika byte pertama bagian memiliki alamat 0x10, byte ketiga memiliki alamat 0x12. |
4 |
4 |
SymbolTableIndex |
Indeks berbasis nol ke dalam tabel simbol. Simbol ini memberikan alamat yang akan digunakan untuk relokasi. Jika simbol yang ditentukan memiliki kelas penyimpanan bagian, maka alamat simbol adalah alamat dengan bagian pertama dengan nama yang sama. |
8 |
2 |
Ketikkan |
Nilai yang menunjukkan jenis relokasi yang harus dilakukan. Jenis relokasi yang valid bergantung pada jenis komputer. Lihat Indikator Tipe. |
Jika simbol yang dirujuk oleh bidang SymbolTableIndex memiliki kelas penyimpanan IMAGE_SYM_CLASS_SECTION, alamat simbol adalah awal dari bagian tersebut. Bagian biasanya dalam file yang sama, kecuali ketika file objek adalah bagian dari arsip (pustaka). Dalam hal ini, bagian dapat ditemukan di file objek lain dalam arsip yang memiliki nama anggota arsip yang sama dengan file objek saat ini. (Hubungan dengan nama arsip-anggota digunakan dalam penautan tabel impor, yaitu, bagian .idata.)
Bidang Jenis rekaman relokasi menunjukkan jenis relokasi apa yang harus dilakukan. Jenis relokasi yang berbeda didefinisikan untuk setiap jenis komputer.
Indikator jenis relokasi berikut didefinisikan untuk x64 dan prosesor yang kompatibel.
Terus-menerus | Nilai | Deskripsi |
---|---|---|
IMAGE_REL_AMD64_ABSOLUTE |
0x0000 |
Relokasi diabaikan. |
IMAGE_REL_AMD64_ADDR64 |
0x0001 |
VA 64-bit dari target relokasi. |
IMAGE_REL_AMD64_ADDR32 |
0x0002 |
VA 32-bit dari target relokasi. |
IMAGE_REL_AMD64_ADDR32NB |
0x0003 |
Alamat 32-bit tanpa basis gambar (RVA). |
IMAGE_REL_AMD64_REL32 |
0x0004 |
Alamat relatif 32-bit dari byte setelah relokasi. |
IMAGE_REL_AMD64_REL32_1 |
0x0005 |
Alamat 32-bit relatif terhadap jarak byte 1 dari relokasi. |
IMAGE_REL_AMD64_REL32_2 |
0x0006 |
Alamat 32-bit relatif terhadap jarak byte 2 dari relokasi. |
IMAGE_REL_AMD64_REL32_3 |
0x0007 |
Alamat 32-bit relatif terhadap jarak byte 3 dari relokasi. |
IMAGE_REL_AMD64_REL32_4 |
0x0008 |
Alamat 32-bit relatif terhadap jarak byte 4 dari relokasi. |
IMAGE_REL_AMD64_REL32_5 |
0x0009 |
Alamat 32-bit relatif terhadap jarak byte 5 dari relokasi. |
IMAGE_REL_AMD64_SECTION |
0x000A |
Indeks bagian 16-bit dari bagian yang berisi target. Ini digunakan untuk mendukung informasi penelusuran kesalahan. |
IMAGE_REL_AMD64_SECREL |
0x000B |
Offset 32-bit dari target dari awal bagiannya. Ini digunakan untuk mendukung informasi penelusuran kesalahan dan penyimpanan lokal utas statis. |
IMAGE_REL_AMD64_SECREL7 |
0x000C |
Offset 7-bit yang tidak ditandatangani dari dasar bagian yang berisi target. |
IMAGE_REL_AMD64_TOKEN |
0x000D |
Token CLR. |
IMAGE_REL_AMD64_SREL32 |
0x000E |
Nilai dependen rentang bertanda tangan 32-bit yang dipancarkan ke dalam objek. |
IMAGE_REL_AMD64_PAIR |
0x000F |
Pasangan yang harus segera mengikuti setiap nilai tergantung rentang. |
IMAGE_REL_AMD64_SSPAN32 |
0x0010 |
Nilai dependen rentang bertanda tangan 32-bit yang diterapkan pada waktu tautan. |
Indikator jenis relokasi berikut didefinisikan untuk prosesor ARM.
Terus-menerus | Nilai | Deskripsi |
---|---|---|
IMAGE_REL_ARM_ABSOLUTE |
0x0000 |
Relokasi diabaikan. |
IMAGE_REL_ARM_ADDR32 |
0x0001 |
VA 32-bit dari target. |
IMAGE_REL_ARM_ADDR32NB |
0x0002 |
RVA 32-bit dari target. |
IMAGE_REL_ARM_BRANCH24 |
0x0003 |
Perpindahan relatif 24-bit ke target. |
IMAGE_REL_ARM_BRANCH11 |
0x0004 |
Referensi ke panggilan subroutine. Referensi terdiri dari dua instruksi 16-bit dengan offset 11-bit. |
IMAGE_REL_ARM_REL32 |
0x000A |
Alamat relatif 32-bit dari byte setelah relokasi. |
IMAGE_REL_ARM_SECTION |
0x000E |
Indeks bagian 16-bit dari bagian yang berisi target. Ini digunakan untuk mendukung informasi penelusuran kesalahan. |
IMAGE_REL_ARM_SECREL |
0x000F |
Offset 32-bit dari target dari awal bagiannya. Ini digunakan untuk mendukung informasi penelusuran kesalahan dan penyimpanan lokal utas statis. |
IMAGE_REL_ARM_MOV32 |
0x0010 |
VA 32-bit dari target. Relokasi ini diterapkan menggunakan instruksi MOVW untuk 16 bit rendah diikuti oleh MOVT untuk 16 bit tinggi. |
IMAGE_REL_THUMB_MOV32 |
0x0011 |
VA 32-bit dari target. Relokasi ini diterapkan menggunakan instruksi MOVW untuk 16 bit rendah diikuti oleh MOVT untuk 16 bit tinggi. |
IMAGE_REL_THUMB_BRANCH20 |
0x0012 |
Instruksi diperbaiki dengan perpindahan relatif 21-bit ke target selaras 2-byte. Bit yang paling tidak signifikan dari perpindahan selalu nol dan tidak disimpan. Relokasi ini sesuai dengan instruksi Thumb-2 32-bit conditional B. |
Tidak terpakai |
0x0013 |
|
IMAGE_REL_THUMB_BRANCH24 |
0x0014 |
Instruksi diperbaiki dengan perpindahan relatif 25-bit ke target selaras 2 byte. Bit yang paling tidak signifikan dari perpindahan adalah nol dan tidak disimpan. Relokasi ini sesuai dengan instruksi Thumb-2 B. |
IMAGE_REL_THUMB_BLX23 |
0x0015 |
Instruksi diperbaiki dengan perpindahan relatif 25-bit ke target selaras 4-byte. 2 bit rendah dari perpindahan adalah nol dan tidak disimpan. Relokasi ini sesuai dengan instruksi Thumb-2 BLX. |
IMAGE_REL_ARM_PAIR |
0x0016 |
Relokasi hanya berlaku ketika segera mengikuti ARM_REFHI atau THUMB_REFHI. SymbolTableIndex berisi perpindahan dan bukan indeks ke dalam tabel simbol. |
Indikator jenis relokasi berikut didefinisikan untuk prosesor ARM64.
Terus-menerus | Nilai | Deskripsi |
---|---|---|
IMAGE_REL_ARM64_ABSOLUTE |
0x0000 |
Relokasi diabaikan. |
IMAGE_REL_ARM64_ADDR32 |
0x0001 |
VA 32-bit dari target. |
IMAGE_REL_ARM64_ADDR32NB |
0x0002 |
RVA 32-bit dari target. |
IMAGE_REL_ARM64_BRANCH26 |
0x0003 |
Perpindahan relatif 26-bit ke target, untuk instruksi B dan BL. |
IMAGE_REL_ARM64_PAGEBASE_REL21 |
0x0004 |
Basis halaman target, untuk instruksi ADRP. |
IMAGE_REL_ARM64_REL21 |
0x0005 |
Perpindahan relatif 12-bit ke target, untuk instruksi ADR |
IMAGE_REL_ARM64_PAGEOFFSET_12A |
0x0006 |
Offset halaman 12-bit dari target, untuk instruksi ADD/ADDS (langsung) dengan nol shift. |
IMAGE_REL_ARM64_PAGEOFFSET_12L |
0x0007 |
Offset halaman 12-bit dari target, untuk instruksi LDR (segera diindeks, tidak ditandatangani). |
IMAGE_REL_ARM64_SECREL |
0x0008 |
Offset 32-bit dari target dari awal bagiannya. Ini digunakan untuk mendukung informasi penelusuran kesalahan dan penyimpanan lokal utas statis. |
IMAGE_REL_ARM64_SECREL_LOW12A |
0x0009 |
Bit 0:11 dari offset bagian target, untuk instruksi ADD/ADDS (langsung) dengan nol shift. |
IMAGE_REL_ARM64_SECREL_HIGH12A |
0x000A |
Bit 12:23 dari offset bagian target, untuk instruksi ADD/ADDS (langsung) dengan nol shift. |
IMAGE_REL_ARM64_SECREL_LOW12L |
0x000B |
Bit 0:11 dari offset bagian target, untuk instruksi LDR (segera diindeks, tidak ditandatangani). |
IMAGE_REL_ARM64_TOKEN |
0x000C |
Token CLR. |
IMAGE_REL_ARM64_SECTION |
0x000D |
Indeks bagian 16-bit dari bagian yang berisi target. Ini digunakan untuk mendukung informasi penelusuran kesalahan. |
IMAGE_REL_ARM64_ADDR64 |
0x000E |
VA 64-bit dari target relokasi. |
IMAGE_REL_ARM64_BRANCH19 |
0x000F |
Offset 19-bit ke target relokasi, untuk instruksi B bersyarkat. |
IMAGE_REL_ARM64_BRANCH14 |
0x0010 |
Offset 14-bit ke target relokasi, untuk instruksi TBZ dan TBNZ. |
IMAGE_REL_ARM64_REL32 |
0x0011 |
Alamat relatif 32-bit dari byte setelah relokasi. |
Indikator jenis relokasi berikut didefinisikan untuk prosesor SH3 dan SH4. Relokasi khusus SH5 dicatat sebagai SHM (SH Media).
Terus-menerus | Nilai | Deskripsi |
---|---|---|
IMAGE_REL_SH3_ABSOLUTE |
0x0000 |
Relokasi diabaikan. |
IMAGE_REL_SH3_DIRECT16 |
0x0001 |
Referensi ke lokasi 16-bit yang berisi VA simbol target. |
IMAGE_REL_SH3_DIRECT32 |
0x0002 |
VA 32-bit dari simbol target. |
IMAGE_REL_SH3_DIRECT8 |
0x0003 |
Referensi ke lokasi 8-bit yang berisi VA simbol target. |
IMAGE_REL_SH3_DIRECT8_WORD |
0x0004 |
Referensi ke instruksi 8-bit yang berisi VA 16-bit yang efektif dari simbol target. |
IMAGE_REL_SH3_DIRECT8_LONG |
0x0005 |
Referensi ke instruksi 8-bit yang berisi VA 32-bit efektif dari simbol target. |
IMAGE_REL_SH3_DIRECT4 |
0x0006 |
Referensi ke lokasi 8-bit yang 4 bit rendahnya berisi VA simbol target. |
IMAGE_REL_SH3_DIRECT4_WORD |
0x0007 |
Referensi ke instruksi 8-bit yang 4 bit rendahnya berisi VA 16-bit yang efektif dari simbol target. |
IMAGE_REL_SH3_DIRECT4_LONG |
0x0008 |
Referensi ke instruksi 8-bit yang 4 bit rendahnya berisi VA 32-bit efektif dari simbol target. |
IMAGE_REL_SH3_PCREL8_WORD |
0x0009 |
Referensi ke instruksi 8-bit yang berisi offset relatif 16-bit efektif dari simbol target. |
IMAGE_REL_SH3_PCREL8_LONG |
0x000A |
Referensi ke instruksi 8-bit yang berisi offset relatif 32-bit efektif dari simbol target. |
IMAGE_REL_SH3_PCREL12_WORD |
0x000B |
Referensi ke instruksi 16-bit yang 12 bit rendahnya berisi offset relatif 16-bit yang efektif dari simbol target. |
IMAGE_REL_SH3_STARTOF_SECTION |
0x000C |
Referensi ke lokasi 32-bit yang merupakan VA dari bagian yang berisi simbol target. |
IMAGE_REL_SH3_SIZEOF_SECTION |
0x000D |
Referensi ke lokasi 32-bit yang merupakan ukuran bagian yang berisi simbol target. |
IMAGE_REL_SH3_SECTION |
0x000E |
Indeks bagian 16-bit dari bagian yang berisi target. Ini digunakan untuk mendukung informasi penelusuran kesalahan. |
IMAGE_REL_SH3_SECREL |
0x000F |
Offset 32-bit dari target dari awal bagiannya. Ini digunakan untuk mendukung informasi penelusuran kesalahan dan penyimpanan lokal utas statis. |
IMAGE_REL_SH3_DIRECT32_NB |
0x0010 |
RVA 32-bit dari simbol target. |
IMAGE_REL_SH3_GPREL4_LONG |
0x0011 |
GP relatif. |
IMAGE_REL_SH3_TOKEN |
0x0012 |
Token CLR. |
IMAGE_REL_SHM_PCRELPT |
0x0013 |
Offset dari instruksi saat ini dalam kata panjang. Jika bit NOMODE tidak diatur, masukkan inversi bit rendah pada bit 32 untuk memilih PTA atau PTB. |
IMAGE_REL_SHM_REFLO |
0x0014 |
16 bit rendah dari alamat 32-bit. |
IMAGE_REL_SHM_REFHALF |
0x0015 |
16 bit tinggi dari alamat 32-bit. |
IMAGE_REL_SHM_RELLO |
0x0016 |
16 bit rendah dari alamat relatif. |
IMAGE_REL_SHM_RELHALF |
0x0017 |
16 bit tinggi dari alamat relatif. |
IMAGE_REL_SHM_PAIR |
0x0018 |
Relokasi hanya berlaku ketika segera mengikuti relokasi REFHALF, RELHALF, atau RELLO. Bidang SymbolTableIndex dari relokasi berisi perpindahan dan bukan indeks ke dalam tabel simbol. |
IMAGE_REL_SHM_NOMODE |
0x8000 |
Relokasi mengabaikan mode bagian. |
Indikator jenis relokasi berikut didefinisikan untuk prosesor PowerPC.
Terus-menerus | Nilai | Deskripsi |
---|---|---|
IMAGE_REL_PPC_ABSOLUTE |
0x0000 |
Relokasi diabaikan. |
IMAGE_REL_PPC_ADDR64 |
0x0001 |
VA 64-bit dari target. |
IMAGE_REL_PPC_ADDR32 |
0x0002 |
VA 32-bit dari target. |
IMAGE_REL_PPC_ADDR24 |
0x0003 |
24 bit rendah dari VA target. Ini hanya berlaku ketika simbol target absolut dan dapat diperpanjang tanda ke nilai aslinya. |
IMAGE_REL_PPC_ADDR16 |
0x0004 |
16 bit rendah dari VA target. |
IMAGE_REL_PPC_ADDR14 |
0x0005 |
14 bit rendah dari VA target. Ini hanya berlaku ketika simbol target absolut dan dapat diperpanjang tanda ke nilai aslinya. |
IMAGE_REL_PPC_REL24 |
0x0006 |
Offset PC-relative 24-bit ke lokasi simbol. |
IMAGE_REL_PPC_REL14 |
0x0007 |
Offset PC-relative 14-bit ke lokasi simbol. |
IMAGE_REL_PPC_ADDR32NB |
0x000A |
RVA 32-bit dari target. |
IMAGE_REL_PPC_SECREL |
0x000B |
Offset 32-bit dari target dari awal bagiannya. Ini digunakan untuk mendukung informasi penelusuran kesalahan dan penyimpanan lokal utas statis. |
IMAGE_REL_PPC_SECTION |
0x000C |
Indeks bagian 16-bit dari bagian yang berisi target. Ini digunakan untuk mendukung informasi penelusuran kesalahan. |
IMAGE_REL_PPC_SECREL16 |
0x000F |
Offset 16-bit dari target dari awal bagiannya. Ini digunakan untuk mendukung informasi penelusuran kesalahan dan penyimpanan lokal utas statis. |
IMAGE_REL_PPC_REFHI |
0x0010 |
16 bit tinggi dari VA 32-bit target. Ini digunakan untuk instruksi pertama dalam urutan dua instruksi yang memuat alamat lengkap. Relokasi ini harus segera diikuti oleh relokasi PAIR yang SymbolTableIndex-nya berisi perpindahan 16-bit yang ditandatangani yang ditambahkan ke 16 bit atas yang diambil dari lokasi yang sedang direlokasi. |
IMAGE_REL_PPC_REFLO |
0x0011 |
16 bit rendah dari VA target. |
IMAGE_REL_PPC_PAIR |
0x0012 |
Relokasi yang hanya valid ketika segera mengikuti relokasi REFHI atau SECRELHI. SymbolTableIndex berisi perpindahan dan bukan indeks ke dalam tabel simbol. |
IMAGE_REL_PPC_SECRELLO |
0x0013 |
16 bit rendah dari offset 32-bit target dari awal bagiannya. |
IMAGE_REL_PPC_GPREL |
0x0015 |
Perpindahan target yang ditandatangani 16-bit relatif terhadap register GP. |
IMAGE_REL_PPC_TOKEN |
0x0016 |
Token CLR. |
Indikator jenis relokasi berikut didefinisikan untuk Intel 386 dan prosesor yang kompatibel.
Terus-menerus | Nilai | Deskripsi |
---|---|---|
IMAGE_REL_I386_ABSOLUTE |
0x0000 |
Relokasi diabaikan. |
IMAGE_REL_I386_DIR16 |
0x0001 |
Tidak didukung. |
IMAGE_REL_I386_REL16 |
0x0002 |
Tidak didukung. |
IMAGE_REL_I386_DIR32 |
0x0006 |
Target va 32-bit. |
IMAGE_REL_I386_DIR32NB |
0x0007 |
Targetnya adalah RVA 32-bit. |
IMAGE_REL_I386_SEG12 |
0x0009 |
Tidak didukung. |
IMAGE_REL_I386_SECTION |
0x000A |
Indeks bagian 16-bit dari bagian yang berisi target. Ini digunakan untuk mendukung informasi penelusuran kesalahan. |
IMAGE_REL_I386_SECREL |
0x000B |
Offset 32-bit dari target dari awal bagiannya. Ini digunakan untuk mendukung informasi penelusuran kesalahan dan penyimpanan lokal utas statis. |
IMAGE_REL_I386_TOKEN |
0x000C |
Token CLR. |
IMAGE_REL_I386_SECREL7 |
0x000D |
Offset 7-bit dari dasar bagian yang berisi target. |
IMAGE_REL_I386_REL32 |
0x0014 |
Perpindahan relatif 32-bit ke target. Ini mendukung cabang relatif x86 dan instruksi panggilan. |
Indikator jenis relokasi berikut didefinisikan untuk keluarga prosesor Intel Itanium dan prosesor yang kompatibel. Perhatikan bahwa relokasi pada instruksi menggunakan offset bundel dan nomor slot untuk offset relokasi.
Terus-menerus | Nilai | Deskripsi |
---|---|---|
IMAGE_REL_IA64_ABSOLUTE |
0x0000 |
Relokasi diabaikan. |
IMAGE_REL_IA64_IMM14 |
0x0001 |
Relokasi instruksi dapat diikuti dengan relokasi ADDEND yang nilainya ditambahkan ke alamat target sebelum dimasukkan ke slot yang ditentukan dalam bundel IMM14. Target relokasi harus absolut atau gambar harus diperbaiki. |
IMAGE_REL_IA64_IMM22 |
0x0002 |
Relokasi instruksi dapat diikuti dengan relokasi ADDEND yang nilainya ditambahkan ke alamat target sebelum dimasukkan ke dalam slot yang ditentukan dalam bundel IMM22. Target relokasi harus absolut atau gambar harus diperbaiki. |
IMAGE_REL_IA64_IMM64 |
0x0003 |
Nomor slot dari relokasi ini harus satu (1). Relokasi dapat diikuti dengan relokasi ADDEND yang nilainya ditambahkan ke alamat target sebelum disimpan di ketiga slot bundel IMM64. |
IMAGE_REL_IA64_DIR32 |
0x0004 |
Target va 32-bit. Ini hanya didukung untuk /LARGEADDRESSAWARE:NO images. |
IMAGE_REL_IA64_DIR64 |
0x0005 |
Target adalah VA 64-bit. |
IMAGE_REL_IA64_PCREL21B |
0x0006 |
Instruksi diperbaiki dengan perpindahan relatif 25-bit ke target selaras 16-bit. 4 bit rendah dari perpindahan adalah nol dan tidak disimpan. |
IMAGE_REL_IA64_PCREL21M |
0x0007 |
Instruksi diperbaiki dengan perpindahan relatif 25-bit ke target selaras 16-bit. 4 bit rendah dari perpindahan, yang nol, tidak disimpan. |
IMAGE_REL_IA64_PCREL21F |
0x0008 |
LSB offset relokasi ini harus berisi nomor slot sedangkan sisanya adalah alamat bundel. Bundel diperbaiki dengan perpindahan relatif 25-bit ke target selaras 16-bit. 4 bit rendah dari perpindahan adalah nol dan tidak disimpan. |
IMAGE_REL_IA64_GPREL22 |
0x0009 |
Relokasi instruksi dapat diikuti dengan relokasi ADDEND yang nilainya ditambahkan ke alamat target dan kemudian offset relatif GP 22-bit yang dihitung dan diterapkan ke bundel GPREL22. |
IMAGE_REL_IA64_LTOFF22 |
0x000A |
Instruksi diperbaiki dengan offset relatif GP 22-bit ke entri tabel literal simbol target. Linker membuat entri tabel harfiah ini berdasarkan relokasi ini dan relokasi ADDEND yang mungkin mengikuti. |
IMAGE_REL_IA64_SECTION |
0x000B |
Indeks bagian 16-bit dari bagian berisi target. Ini digunakan untuk mendukung informasi penelusuran kesalahan. |
IMAGE_REL_IA64_SECREL22 |
0x000C |
Instruksi diperbaiki dengan offset 22-bit dari target dari awal bagiannya. Relokasi ini dapat segera diikuti oleh relokasi ADDEND, yang bidang Nilainya berisi offset target yang tidak ditandatangani 32-bit dari awal bagian. |
IMAGE_REL_IA64_SECREL64I |
0x000D |
Nomor slot untuk relokasi ini harus satu (1). Instruksi diperbaiki dengan offset 64-bit dari target dari awal bagiannya. Relokasi ini dapat segera diikuti oleh relokasi ADDEND yang bidang Nilainya berisi offset target yang tidak ditandatangani 32-bit dari awal bagian. |
IMAGE_REL_IA64_SECREL32 |
0x000E |
Alamat data yang akan diperbaiki dengan offset 32-bit dari target dari awal bagiannya. |
IMAGE_REL_IA64_DIR32NB |
0x0010 |
Targetnya adalah RVA 32-bit. |
IMAGE_REL_IA64_SREL14 |
0x0011 |
Ini diterapkan ke segera 14-bit yang ditandatangani yang berisi perbedaan antara dua target yang dapat direlokasi. Ini adalah bidang deklaratif untuk linker yang menunjukkan bahwa pengkompilasi telah memancarkan nilai ini. |
IMAGE_REL_IA64_SREL22 |
0x0012 |
Ini diterapkan ke segera 22-bit yang ditandatangani yang berisi perbedaan antara dua target yang dapat direlokasi. Ini adalah bidang deklaratif untuk linker yang menunjukkan bahwa pengkompilasi telah memancarkan nilai ini. |
IMAGE_REL_IA64_SREL32 |
0x0013 |
Ini diterapkan ke segera 32-bit yang ditandatangani yang berisi perbedaan antara dua nilai yang dapat direlokasi. Ini adalah bidang deklaratif untuk linker yang menunjukkan bahwa pengkompilasi telah memancarkan nilai ini. |
IMAGE_REL_IA64_UREL32 |
0x0014 |
Ini diterapkan ke langsung 32-bit yang tidak ditandatangani yang berisi perbedaan antara dua nilai yang dapat direlokasi. Ini adalah bidang deklaratif untuk linker yang menunjukkan bahwa pengkompilasi telah memancarkan nilai ini. |
IMAGE_REL_IA64_PCREL60X |
0x0015 |
Perbaikan pc-relative 60-bit yang selalu tetap sebagai instruksi BRL dari bundel MLX. |
IMAGE_REL_IA64_PCREL60B |
0x0016 |
Perbaikan pc-relatif 60-bit. Jika perpindahan target pas di bidang 25-bit yang ditandatangani, konversikan seluruh bundel ke bundel MBB dengan NOP. B di slot 1 dan instruksi BR 25-bit (dengan 4 bit terendah semuanya nol dan dijatuhkan) di slot 2. |
IMAGE_REL_IA64_PCREL60F |
0x0017 |
Perbaikan pc-relatif 60-bit. Jika perpindahan target pas di bidang 25-bit yang ditandatangani, konversikan seluruh bundel ke bundel MFB dengan NOP. F di slot 1 dan instruksi BR 25-bit (4 bit terendah semua nol dan dijatuhkan) di slot 2. |
IMAGE_REL_IA64_PCREL60I |
0x0018 |
Perbaikan pc-relatif 60-bit. Jika perpindahan target pas di bidang 25-bit yang ditandatangani, konversikan seluruh bundel ke bundel MIB dengan NOP. Saya di slot 1 dan instruksi BR 25-bit (4 bit terendah semua nol dan dijatuhkan) di slot 2. |
IMAGE_REL_IA64_PCREL60M |
0x0019 |
Perbaikan pc-relatif 60-bit. Jika perpindahan target pas di bidang 25-bit yang ditandatangani, konversikan seluruh bundel ke bundel MMB dengan NOP. M di slot 1 dan instruksi BR 25-bit (4 bit terendah semua nol dan dijatuhkan) di slot 2. |
IMAGE_REL_IA64_IMMGPREL64 |
0x001a |
Perbaikan relatif GP 64-bit. |
IMAGE_REL_IA64_TOKEN |
0x001b |
Token CLR. |
IMAGE_REL_IA64_GPREL32 |
0x001c |
Perbaikan relatif GP 32-bit. |
IMAGE_REL_IA64_ADDEND |
0x001F |
Relokasi hanya berlaku ketika segera mengikuti salah satu relokasi berikut: IMM14, IMM22, IMM64, GPREL22, LTOFF22, LTOFF64, SECREL22, SECREL64I, atau SECREL32. Nilainya berisi addend untuk diterapkan ke instruksi dalam bundel, bukan untuk data. |
Indikator jenis relokasi berikut didefinisikan untuk prosesor MIPS.
Terus-menerus | Nilai | Deskripsi |
---|---|---|
IMAGE_REL_MIPS_ABSOLUTE |
0x0000 |
Relokasi diabaikan. |
IMAGE_REL_MIPS_REFHALF |
0x0001 |
16 bit tinggi dari VA 32-bit target. |
IMAGE_REL_MIPS_REFWORD |
0x0002 |
Target va 32-bit. |
IMAGE_REL_MIPS_JMPADDR |
0x0003 |
26 bit rendah dari VA target. Ini mendukung instruksi MIPS J dan JAL. |
IMAGE_REL_MIPS_REFHI |
0x0004 |
16 bit tinggi dari VA 32-bit target. Ini digunakan untuk instruksi pertama dalam urutan dua instruksi yang memuat alamat lengkap. Relokasi ini harus segera diikuti oleh relokasi PAIR yang SymbolTableIndex-nya berisi perpindahan 16-bit yang ditandatangani yang ditambahkan ke 16 bit atas yang diambil dari lokasi yang sedang direlokasi. |
IMAGE_REL_MIPS_REFLO |
0x0005 |
16 bit rendah dari VA target. |
IMAGE_REL_MIPS_GPREL |
0x0006 |
Perpindahan target yang ditandatangani 16-bit relatif terhadap register GP. |
IMAGE_REL_MIPS_LITERAL |
0x0007 |
Sama seperti IMAGE_REL_MIPS_GPREL. |
IMAGE_REL_MIPS_SECTION |
0x000A |
Indeks bagian 16-bit dari bagian berisi target. Ini digunakan untuk mendukung informasi penelusuran kesalahan. |
IMAGE_REL_MIPS_SECREL |
0x000B |
Offset 32-bit dari target dari awal bagiannya. Ini digunakan untuk mendukung informasi penelusuran kesalahan dan penyimpanan lokal utas statis. |
IMAGE_REL_MIPS_SECRELLO |
0x000C |
16 bit rendah dari offset 32-bit target dari awal bagiannya. |
IMAGE_REL_MIPS_SECRELHI |
0x000D |
16 bit tinggi dari offset 32-bit target dari awal bagiannya. Relokasi IMAGE_REL_MIPS_PAIR harus segera mengikuti relokasi ini. SymbolTableIndex dari relokasi PAIR berisi displacement 16-bit yang ditandatangani yang ditambahkan ke 16 bit atas yang diambil dari lokasi yang sedang direlokasi. |
IMAGE_REL_MIPS_JMPADDR16 |
0x0010 |
26 bit rendah dari VA target. Ini mendukung instruksi MIPS16 JAL. |
IMAGE_REL_MIPS_REFWORDNB |
0x0022 |
Targetnya adalah RVA 32-bit. |
IMAGE_REL_MIPS_PAIR |
0x0025 |
Relokasi hanya berlaku ketika segera mengikuti relokasi REFHI atau SECRELHI. SymbolTableIndex berisi perpindahan dan bukan indeks ke dalam tabel simbol. |
Indikator jenis relokasi berikut didefinisikan untuk prosesor Mitsubishi M32R.
Terus-menerus | Nilai | Deskripsi |
---|---|---|
IMAGE_REL_M32R_ABSOLUTE |
0x0000 |
Relokasi diabaikan. |
IMAGE_REL_M32R_ADDR32 |
0x0001 |
Target va 32-bit. |
IMAGE_REL_M32R_ADDR32NB |
0x0002 |
Targetnya adalah RVA 32-bit. |
IMAGE_REL_M32R_ADDR24 |
0x0003 |
Target adalah VA 24-bit. |
IMAGE_REL_M32R_GPREL16 |
0x0004 |
Offset 16-bit target dari register GP. |
IMAGE_REL_M32R_PCREL24 |
0x0005 |
Offset 24-bit target dari penghitung program (PC), digeser ke kiri 2 bit dan sign-extended |
IMAGE_REL_M32R_PCREL16 |
0x0006 |
Offset 16-bit target dari PC, digeser ke kiri 2 bit dan diperpanjang tanda |
IMAGE_REL_M32R_PCREL8 |
0x0007 |
Offset 8-bit target dari PC, digeser ke kiri 2 bit dan diperpanjang tanda |
IMAGE_REL_M32R_REFHALF |
0x0008 |
16 MSB dari VA target. |
IMAGE_REL_M32R_REFHI |
0x0009 |
16 MSB dari VA target, disesuaikan untuk ekstensi tanda LSB. Ini digunakan untuk instruksi pertama dalam urutan dua instruksi yang memuat alamat 32-bit lengkap. Relokasi ini harus segera diikuti oleh relokasi PAIR yang SymbolTableIndex-nya berisi perpindahan 16-bit yang ditandatangani yang ditambahkan ke 16 bit atas yang diambil dari lokasi yang sedang direlokasi. |
IMAGE_REL_M32R_REFLO |
0x000A |
16 LSB dari VA target. |
IMAGE_REL_M32R_PAIR |
0x000B |
Relokasi harus mengikuti relokasi REFHI. SymbolTableIndex berisi perpindahan dan bukan indeks ke dalam tabel simbol. |
IMAGE_REL_M32R_SECTION |
0x000C |
Indeks bagian 16-bit dari bagian yang berisi target. Ini digunakan untuk mendukung informasi penelusuran kesalahan. |
IMAGE_REL_M32R_SECREL |
0x000D |
Offset 32-bit dari target dari awal bagiannya. Ini digunakan untuk mendukung informasi penelusuran kesalahan dan penyimpanan lokal utas statis. |
IMAGE_REL_M32R_TOKEN |
0x000E |
Token CLR. |
Nomor baris COFF tidak lagi diproduksi dan, di masa depan, tidak akan dikonsumsi.
Nomor baris COFF menunjukkan hubungan antara kode dan nomor baris dalam file sumber. Format Microsoft untuk nomor baris COFF mirip dengan COFF standar, tetapi telah diperluas untuk memungkinkan satu bagian berhubungan dengan nomor baris dalam beberapa file sumber.
Nomor baris COFF terdiri dari array rekaman panjang tetap. Lokasi (offset file) dan ukuran array ditentukan di header bagian. Setiap rekaman nomor baris adalah format berikut.
Offset | Ukuran | Bidang | Deskripsi |
---|---|---|---|
0 |
4 |
Jenis (*) |
Ini adalah gabungan dua bidang: SymbolTableIndex dan VirtualAddress. Apakah SymbolTableIndex atau RVA digunakan tergantung pada nilai Linenumber. |
4 |
2 |
Linenumber |
Saat bukan nol, bidang ini menentukan nomor baris berbasis satu. Saat nol, bidang Jenis ditafsirkan sebagai indeks tabel simbol untuk fungsi. |
Bidang Jenis adalah gabungan dari dua bidang 4-byte: SymbolTableIndex dan VirtualAddress.
Offset | Ukuran | Bidang | Deskripsi |
---|---|---|---|
0 |
4 |
SymbolTableIndex |
Digunakan saat Linenumber adalah nol: indeks ke entri tabel simbol untuk fungsi. Format ini digunakan untuk menunjukkan fungsi yang dirujuk oleh sekelompok rekaman nomor baris. |
0 |
4 |
VirtualAddress |
Digunakan saat Linenumber bukan nol: RVA dari kode yang dapat dieksekusi yang sesuai dengan baris sumber yang ditunjukkan. Dalam file objek, ini berisi VA di dalam bagian . |
Rekaman nomor baris dapat mengatur bidang Linenumber ke nol dan menunjuk ke definisi fungsi dalam tabel simbol atau dapat berfungsi sebagai entri nomor baris standar dengan memberikan bilangan bulat positif (nomor baris) dan alamat yang sesuai dalam kode objek.
Sekelompok entri nomor baris selalu dimulai dengan format pertama: indeks simbol fungsi. Jika ini adalah rekaman nomor baris pertama di bagian , maka ini juga merupakan nama simbol COMDAT untuk fungsi jika bendera COMDAT bagian diatur. Lihat Bagian COMDAT (Objek Saja). Rekaman tambahan fungsi dalam tabel simbol memiliki penunjuk ke bidang Linenumber yang menunjuk ke rekaman nomor baris yang sama ini.
Catatan yang mengidentifikasi fungsi diikuti oleh sejumlah entri nomor baris yang memberikan informasi nomor baris aktual (yaitu, entri dengan Linenumber lebih besar dari nol). Entri ini berbasis satu, relatif terhadap awal fungsi, dan mewakili setiap baris sumber dalam fungsi kecuali untuk baris pertama.
Misalnya, rekaman nomor baris pertama untuk contoh berikut akan menentukan fungsi ReverseSign (SymbolTableIndex dari ReverseSign dan Linenumber diatur ke nol). Kemudian rekaman dengan nilai Linenumber 1, 2, dan 3 akan mengikuti, sesuai dengan baris sumber seperti yang ditunjukkan:
// some code precedes ReverseSign function
int ReverseSign(int i)
1: {
2: return -1 * i;
3: }
Tabel simbol di bagian ini diwarisi dari format COFF tradisional. Ini berbeda dari informasi debug Microsoft Visual C++. File dapat berisi tabel simbol COFF dan informasi debug Visual C++, dan keduanya dipisahkan. Beberapa alat Microsoft menggunakan tabel simbol untuk tujuan terbatas tetapi penting, seperti mengkomunikasikan informasi COMDAT ke linker. Nama bagian dan nama file, serta simbol kode dan data, tercantum dalam tabel simbol.
Lokasi tabel simbol ditunjukkan di header COFF.
Tabel simbol adalah array rekaman, masing-masing panjang 18 byte. Setiap rekaman adalah rekaman tabel simbol standar atau tambahan. Rekaman standar mendefinisikan simbol atau nama dan memiliki format berikut.
Offset | Ukuran | Bidang | Deskripsi |
---|---|---|---|
0 |
8 |
Nama (*) |
Nama simbol, diwakili oleh persatuan tiga struktur. Array 8 byte digunakan jika nama tidak lebih dari 8 byte. Untuk informasi selengkapnya, lihat Representasi Nama Simbol. |
8 |
4 |
Nilai |
Nilai yang terkait dengan simbol . Interpretasi bidang ini tergantung pada SectionNumber dan StorageClass. Arti umum adalah alamat yang dapat direlokasi. |
12 |
2 |
Nomor Bagian |
Bilangan bulat bertanda tangan yang mengidentifikasi bagian, menggunakan indeks berbasis satu ke dalam tabel bagian. Beberapa nilai memiliki arti khusus, seperti yang didefinisikan dalam bagian 5.4.2, "Nilai Nomor Bagian." |
14 |
2 |
Ketikkan |
Angka yang menunjukkan jenis. Alat Microsoft mengatur bidang ini ke 0x20 (fungsi) atau 0x0 (bukan fungsi). Untuk informasi selengkapnya, lihat Representasi Jenis. |
16 |
1 |
StorageClass |
Nilai enumerasi yang mewakili kelas penyimpanan. Untuk informasi selengkapnya, lihat Kelas Penyimpanan. |
17 |
1 |
NumberOfAuxSymbols |
Jumlah entri tabel simbol tambahan yang mengikuti rekaman ini. |
Nol atau lebih rekaman tabel simbol tambahan segera mengikuti setiap rekaman tabel simbol standar. Namun, biasanya tidak lebih dari satu rekaman tabel simbol tambahan mengikuti rekaman tabel simbol standar (kecuali untuk rekaman .file dengan nama file panjang). Setiap rekaman tambahan berukuran sama dengan rekaman tabel simbol standar (18 byte), tetapi daripada menentukan simbol baru, rekaman tambahan memberikan informasi tambahan pada simbol terakhir yang ditentukan. Pilihan dari beberapa format mana yang akan digunakan tergantung pada bidang StorageClass. Format yang saat ini ditentukan untuk rekaman tabel simbol tambahan diperlihatkan di bagian 5.5, "Rekaman Simbol Tambahan."
Alat yang membaca tabel simbol COFF harus mengabaikan rekaman simbol tambahan yang interpretasinya tidak diketahui. Ini memungkinkan format tabel simbol diperluas untuk menambahkan rekaman tambahan baru, tanpa merusak alat yang ada.
Bidang ShortName dalam tabel simbol terdiri dari 8 byte yang berisi nama itu sendiri, jika panjangnya tidak lebih dari 8 byte, atau bidang ShortName memberikan offset ke dalam tabel string. Untuk menentukan apakah nama itu sendiri atau offset diberikan, uji 4 byte pertama untuk kesetaraan hingga nol.
Menurut konvensi, nama diperlakukan sebagai string yang dikodekan UTF-8 yang dihentikan nol.
Offset | Ukuran | Bidang | Deskripsi |
---|---|---|---|
0 |
8 |
ShortName |
Array 8 byte. Array ini diisi dengan null di sebelah kanan jika panjang nama kurang dari 8 byte. |
0 |
4 |
Nol |
Bidang yang diatur ke semua nol jika namanya lebih panjang dari 8 byte. |
4 |
4 |
Offset |
Offset ke dalam tabel string. |
Biasanya, bidang Nilai Bagian dalam entri tabel simbol adalah indeks berbasis satu ke dalam tabel bagian. Namun, bidang ini adalah bilangan bulat bertanda tangan dan dapat mengambil nilai negatif. Nilai berikut, kurang dari satu, memiliki arti khusus.
Terus-menerus | Nilai | Deskripsi |
---|---|---|
IMAGE_SYM_UNDEFINED |
0 |
Catatan simbol belum ditetapkan bagian. Nilai nol menunjukkan bahwa referensi ke simbol eksternal ditentukan di tempat lain. Nilai non-nol adalah simbol umum dengan ukuran yang ditentukan oleh nilai . |
IMAGE_SYM_ABSOLUTE |
1- |
Simbol memiliki nilai absolut (tidak dapat direlokasi) dan bukan alamat. |
IMAGE_SYM_DEBUG |
2- |
Simbol menyediakan informasi jenis umum atau penelusuran kesalahan tetapi tidak sesuai dengan bagian. Alat Microsoft menggunakan pengaturan ini bersama dengan rekaman .file (FILE kelas penyimpanan). |
Bidang Jenis entri tabel simbol berisi 2 byte, di mana setiap byte mewakili informasi jenis. LSB mewakili jenis data sederhana (dasar), dan MSB mewakili jenis kompleks, jika ada:
MSB | LSB |
---|---|
Jenis kompleks: none, pointer, function, array. |
Jenis dasar: bilangan bulat, titik mengambang, dan sebagainya. |
Nilai berikut didefinisikan untuk jenis dasar, meskipun alat Microsoft umumnya tidak menggunakan bidang ini dan mengatur LSB ke 0. Sebagai gantinya, informasi debug Visual C++ digunakan untuk menunjukkan jenis. Namun, kemungkinan nilai COFF tercantum di sini untuk kelengkapan.
Terus-menerus | Nilai | Deskripsi |
---|---|---|
IMAGE_SYM_TYPE_NULL |
0 |
Tidak ada informasi jenis atau jenis dasar yang tidak diketahui. Alat Microsoft menggunakan pengaturan ini |
IMAGE_SYM_TYPE_VOID |
1 |
Tidak ada jenis yang valid; digunakan dengan penunjuk dan fungsi yang batal |
IMAGE_SYM_TYPE_CHAR |
2 |
Karakter (byte yang ditandatangani) |
IMAGE_SYM_TYPE_SHORT |
3 |
Bilangan bulat bertanda tangan 2-byte |
IMAGE_SYM_TYPE_INT |
4 |
Jenis bilangan bulat alami (biasanya 4 byte di Windows) |
IMAGE_SYM_TYPE_LONG |
5 |
Bilangan bulat bertanda tangan 4-byte |
IMAGE_SYM_TYPE_FLOAT |
6 |
Angka floating-point 4-byte |
IMAGE_SYM_TYPE_DOUBLE |
7 |
Angka floating-point 8-byte |
IMAGE_SYM_TYPE_STRUCT |
8 |
Struktur |
IMAGE_SYM_TYPE_UNION |
9 |
Serikat |
IMAGE_SYM_TYPE_ENUM |
10 |
Jenis enumerasi |
IMAGE_SYM_TYPE_MOE |
11 |
Anggota enumerasi (nilai tertentu) |
IMAGE_SYM_TYPE_BYTE |
12 |
Byte; bilangan bulat 1-byte yang tidak ditandatangani |
IMAGE_SYM_TYPE_WORD |
13 |
Sebuah kata; bilangan bulat 2-byte yang tidak ditandatangani |
IMAGE_SYM_TYPE_UINT |
14 |
Bilangan bulat berukuran alami yang tidak ditandatangani (biasanya, 4 byte) |
IMAGE_SYM_TYPE_DWORD |
15 |
Bilangan bulat 4-byte yang tidak ditandatangani |
Byte yang paling signifikan menentukan apakah simbol adalah penunjuk ke, fungsi yang mengembalikan, atau array dari jenis dasar yang ditentukan dalam LSB. Alat Microsoft hanya menggunakan bidang ini untuk menunjukkan apakah simbol adalah fungsi, sehingga satu-satunya dua nilai yang dihasilkan 0x0 dan 0x20 untuk bidang Jenis. Namun, alat lain dapat menggunakan bidang ini untuk mengomunikasikan lebih banyak informasi.
Sangat penting untuk menentukan atribut fungsi dengan benar. Informasi ini diperlukan agar penautan inkremental berfungsi dengan benar. Untuk beberapa arsitektur, informasi mungkin diperlukan untuk tujuan lain.
Terus-menerus | Nilai | Deskripsi |
---|---|---|
IMAGE_SYM_DTYPE_NULL |
0 |
Tidak ada jenis turunan; simbol adalah variabel skalar sederhana. |
IMAGE_SYM_DTYPE_POINTER |
1 |
Simbol adalah penunjuk ke jenis dasar. |
IMAGE_SYM_DTYPE_FUNCTION |
2 |
Simbol adalah fungsi yang mengembalikan jenis dasar. |
IMAGE_SYM_DTYPE_ARRAY |
3 |
Simbol adalah array jenis dasar. |
Bidang StorageClass dari tabel simbol menunjukkan jenis definisi yang diwakili simbol. Tabel berikut ini memperlihatkan kemungkinan nilai. Perhatikan bahwa bidang StorageClass adalah bilangan bulat 1 byte yang tidak ditandatangani. Oleh karena itu, nilai khusus -1 harus dianggap setara dengan yang tidak ditandatangani, 0xFF.
Meskipun format COFF tradisional menggunakan banyak nilai kelas penyimpanan, alat Microsoft mengandalkan format debug Visual C++ untuk sebagian besar informasi simbolis dan umumnya hanya menggunakan empat nilai kelas penyimpanan: EXTERNAL (2), STATIC (3), FUNCTION (101), dan FILE (103). Kecuali pada judul kolom kedua di bawah ini, "Nilai" harus diambil untuk berarti bidang Nilai dari rekaman simbol (yang interpretasinya tergantung pada angka yang ditemukan sebagai kelas penyimpanan).
Terus-menerus | Nilai | Deskripsi/interpretasi bidang Nilai |
---|---|---|
IMAGE_SYM_CLASS_END_OF_FUNCTION |
-1 (0xFF) |
Simbol khusus yang mewakili akhir fungsi, untuk tujuan penelusuran kesalahan. |
IMAGE_SYM_CLASS_NULL |
0 |
Tidak ada kelas penyimpanan yang ditetapkan. |
IMAGE_SYM_CLASS_AUTOMATIC |
1 |
Variabel otomatis (tumpukan). Bidang Nilai menentukan offset bingkai tumpukan. |
IMAGE_SYM_CLASS_EXTERNAL |
2 |
Nilai yang digunakan alat Microsoft untuk simbol eksternal. Bidang Nilai menunjukkan ukuran jika nomor bagian IMAGE_SYM_UNDEFINED (0). Jika nomor bagian bukan nol, maka bidang Nilai menentukan offset dalam bagian . |
IMAGE_SYM_CLASS_STATIC |
3 |
Offset simbol di dalam bagian . Jika bidang Nilai adalah nol, maka simbol mewakili nama bagian. |
IMAGE_SYM_CLASS_REGISTER |
4 |
Variabel register. Bidang Nilai menentukan nomor register. |
IMAGE_SYM_CLASS_EXTERNAL_DEF |
5 |
Simbol yang didefinisikan secara eksternal. |
IMAGE_SYM_CLASS_LABEL |
6 |
Label kode yang ditentukan dalam modul. Bidang Nilai menentukan offset simbol di dalam bagian . |
IMAGE_SYM_CLASS_UNDEFINED_LABEL |
7 |
Referensi ke label kode yang tidak ditentukan. |
IMAGE_SYM_CLASS_MEMBER_OF_STRUCT |
8 |
Anggota struktur. Bidang Nilai menentukan anggota ke-n. |
IMAGE_SYM_CLASS_ARGUMENT |
9 |
Argumen formal (parameter) fungsi. Bidang Nilai menentukan argumen n th. |
IMAGE_SYM_CLASS_STRUCT_TAG |
10 |
Entri nama tag struktur. |
IMAGE_SYM_CLASS_MEMBER_OF_UNION |
11 |
Anggota serikat. Bidang Nilai menentukan anggota ke-n. |
IMAGE_SYM_CLASS_UNION_TAG |
12 |
Entri nama tag Union. |
IMAGE_SYM_CLASS_TYPE_DEFINITION |
13 |
Entri Typedef. |
IMAGE_SYM_CLASS_UNDEFINED_STATIC |
14 |
Deklarasi data statis. |
IMAGE_SYM_CLASS_ENUM_TAG |
15 |
Entri nama tag jenis enumerasi. |
IMAGE_SYM_CLASS_MEMBER_OF_ENUM |
16 |
Anggota enumerasi. Bidang Nilai menentukan anggota ke-n. |
IMAGE_SYM_CLASS_REGISTER_PARAM |
17 |
Parameter register. |
IMAGE_SYM_CLASS_BIT_FIELD |
18 |
Referensi bit-field. Bidang Nilai menentukan n th bit di bidang bit. |
IMAGE_SYM_CLASS_BLOCK |
100 |
Rekaman .bb (awal blok) atau .eb (akhir blok). Bidang Nilai adalah alamat lokasi kode yang dapat direlokasi. |
IMAGE_SYM_CLASS_FUNCTION |
101 |
Nilai yang digunakan alat Microsoft untuk rekaman simbol yang menentukan tingkat fungsi: fungsi mulai (.bf ), fungsi akhir ( .ef ), dan baris dalam fungsi ( .lf ). Untuk rekaman .lf, bidang Nilai memberikan jumlah baris sumber dalam fungsi. Untuk rekaman .ef, bidang Nilai memberikan ukuran kode fungsi. |
IMAGE_SYM_CLASS_END_OF_STRUCT |
102 |
Entri akhir struktur. |
IMAGE_SYM_CLASS_FILE |
103 |
Nilai yang digunakan alat Microsoft, serta format COFF tradisional, untuk rekaman simbol file sumber. Simbol diikuti oleh rekaman tambahan yang memberi nama file. |
IMAGE_SYM_CLASS_SECTION |
104 |
Definisi bagian (alat Microsoft menggunakan kelas penyimpanan STATIC sebagai gantinya). |
IMAGE_SYM_CLASS_WEAK_EXTERNAL |
105 |
Eksternal lemah. Untuk informasi selengkapnya, lihat Format Tambahan 3: Eksternal Lemah. |
IMAGE_SYM_CLASS_CLR_TOKEN |
107 |
Simbol token CLR. Nama adalah string ASCII yang terdiri dari nilai heksadesimal token. Untuk informasi selengkapnya, lihat Definisi Token CLR (Khusus Objek). |
Rekaman tabel simbol tambahan selalu mengikuti, dan berlaku untuk, beberapa rekaman tabel simbol standar. Rekaman tambahan dapat memiliki format apa pun yang dapat dikenali alat, tetapi 18 byte harus dialokasikan untuk mereka sehingga tabel simbol dipertahankan sebagai array ukuran reguler. Saat ini, alat Microsoft mengenali format tambahan untuk jenis rekaman berikut: definisi fungsi, simbol awal dan akhir fungsi (.bf dan .ef), eksternal yang lemah, nama file, dan definisi bagian.
Desain COFF tradisional juga mencakup format catatan tambahan untuk array dan struktur. Alat Microsoft tidak menggunakan ini, tetapi menempatkan informasi simbolis tersebut dalam format debug Visual C++ di bagian debug.
Rekaman tabel simbol menandai awal definisi fungsi jika memiliki semua hal berikut: kelas penyimpanan EXTERNAL (2), nilai Jenis yang menunjukkan bahwa itu adalah fungsi (0x20), dan nomor bagian yang lebih besar dari nol. Perhatikan bahwa rekaman tabel simbol yang memiliki nomor bagian UNDEFINED (0) tidak menentukan fungsi dan tidak memiliki rekaman tambahan. Rekaman simbol definisi fungsi diikuti oleh rekaman tambahan dalam format yang dijelaskan di bawah ini:
Offset | Ukuran | Bidang | Deskripsi |
---|---|---|---|
0 |
4 |
TagIndex |
Indeks simbol-tabel dari rekaman simbol .bf (begin function) yang sesuai. |
4 |
4 |
TotalSize |
Ukuran kode yang dapat dieksekusi untuk fungsi itu sendiri. Jika fungsi berada di bagiannya sendiri, SizeOfRawData di header bagian lebih besar atau sama dengan bidang ini, tergantung pada pertimbangan perataan. |
8 |
4 |
PointerToLinenumber |
Offset file entri nomor baris COFF pertama untuk fungsi, atau nol jika tidak ada. Untuk informasi selengkapnya, lihat Nomor Baris COFF (Tidak digunakan lagi). |
12 |
4 |
PointerToNextFunction |
Indeks tabel simbol dari rekaman untuk fungsi berikutnya. Jika fungsi adalah yang terakhir dalam tabel simbol, bidang ini diatur ke nol. |
16 |
2 |
Tidak terpakai |
Untuk setiap definisi fungsi dalam tabel simbol, tiga item menjelaskan awal, akhir, dan jumlah baris. Masing-masing simbol ini memiliki kelas penyimpanan FUNCTION (101):
Rekaman simbol bernama .bf (fungsi mulai). Bidang Nilai tidak digunakan.
Rekaman simbol bernama .lf (baris dalam fungsi). Bidang Nilai memberikan jumlah baris dalam fungsi.
Rekaman simbol bernama .ef (akhir fungsi). Bidang Nilai memiliki angka yang sama dengan bidang Ukuran Total dalam rekaman simbol definisi fungsi.
Catatan simbol .bf dan .ef (tetapi bukan rekaman .lf) diikuti oleh rekaman tambahan dengan format berikut:
Offset | Ukuran | Bidang | Deskripsi |
---|---|---|---|
0 |
4 |
Tidak terpakai |
|
4 |
2 |
Linenumber |
Nomor baris ordinal aktual (1, 2, 3, dan sebagainya) dalam file sumber, sesuai dengan catatan .bf atau .ef. |
6 |
6 |
Tidak terpakai |
|
12 |
4 |
PointerToNextFunction ( hanya .bf) |
Indeks simbol-tabel dari rekaman simbol .bf berikutnya. Jika fungsi adalah yang terakhir dalam tabel simbol, bidang ini diatur ke nol. Ini tidak digunakan untuk rekaman .ef. |
16 |
2 |
Tidak terpakai |
"Eksternal lemah" adalah mekanisme untuk file objek yang memungkinkan fleksibilitas pada waktu tautan. Modul dapat berisi simbol eksternal yang tidak terselesaikan (sym1), tetapi juga dapat menyertakan rekaman tambahan yang menunjukkan bahwa jika sym1 tidak ada pada waktu tautan, simbol eksternal lain (sym2) digunakan untuk mengatasi referensi sebagai gantinya.
Jika definisi sym1 ditautkan, maka referensi eksternal ke simbol diselesaikan secara normal. Jika definisi sym1 tidak ditautkan, maka semua referensi ke eksternal lemah untuk sym1 mengacu pada sym2 sebagai gantinya. Simbol eksternal, sym2, harus selalu ditautkan; biasanya, ini didefinisikan dalam modul yang berisi referensi lemah ke sym1.
Eksternal yang lemah diwakili oleh rekaman tabel simbol dengan kelas penyimpanan EKSTERNAL, nomor bagian UNDEF, dan nilai nol. Rekaman simbol eksternal lemah diikuti oleh rekaman tambahan dengan format berikut:
Offset | Ukuran | Bidang | Deskripsi |
---|---|---|---|
0 |
4 |
TagIndex |
Indeks tabel simbol sym2, simbol yang akan ditautkan jika sym1 tidak ditemukan. |
4 |
4 |
Karakteristik |
Nilai IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY menunjukkan bahwa tidak ada pencarian pustaka untuk sym1 yang harus dilakukan. Nilai IMAGE_WEAK_EXTERN_SEARCH_LIBRARY menunjukkan bahwa pencarian pustaka untuk sym1 harus dilakukan. Nilai IMAGE_WEAK_EXTERN_SEARCH_ALIAS menunjukkan bahwa sym1 adalah alias untuk sym2. |
8 |
10 |
Tidak terpakai |
Perhatikan bahwa bidang Karakteristik tidak ditentukan dalam WINNT. H; sebagai gantinya, bidang Ukuran Total digunakan.
Format ini mengikuti rekaman tabel simbol dengan FILE kelas penyimpanan (103). Nama simbol itu sendiri harus .file, dan rekaman tambahan yang mengikutinya memberikan nama file kode sumber.
Offset | Ukuran | Bidang | Deskripsi |
---|---|---|---|
0 |
18 |
Nama File |
String ANSI yang memberikan nama file sumber. Ini diisi dengan null jika kurang dari panjang maksimum. |
Format ini mengikuti rekaman tabel simbol yang menentukan bagian. Rekaman semacam itu memiliki nama simbol yang merupakan nama bagian (seperti .text atau .drectve) dan memiliki kelas penyimpanan STATIC (3). Catatan tambahan menyediakan informasi tentang bagian yang dirujuknya. Dengan demikian, ini menduplikasi beberapa informasi di header bagian.
Offset | Ukuran | Bidang | Deskripsi |
---|---|---|---|
0 |
4 |
Panjangnya |
Ukuran data bagian; sama dengan SizeOfRawData di header bagian. |
4 |
2 |
NumberOfRelocations |
Jumlah entri relokasi untuk bagian tersebut. |
6 |
2 |
NumberOfLinenumbers |
Jumlah entri nomor baris untuk bagian tersebut. |
8 |
4 |
Checksum |
Checksum untuk data komunal. Ini berlaku jika bendera IMAGE_SCN_LNK_COMDAT diatur di header bagian. Untuk informasi selengkapnya, lihat Bagian COMDAT (Khusus Objek). |
12 |
2 |
Angka |
Indeks berbasis satu ke dalam tabel bagian untuk bagian terkait. Ini digunakan ketika pengaturan pemilihan COMDAT adalah 5. |
14 |
1 |
Pilihan |
Nomor pilihan COMDAT. Ini berlaku jika bagian tersebut adalah bagian COMDAT. |
15 |
3 |
Tidak terpakai |
Bidang Pilihan dari format tambahan definisi bagian berlaku jika bagian tersebut adalah bagian COMDAT. Bagian COMDAT adalah bagian yang dapat ditentukan oleh lebih dari satu file objek. (Bendera IMAGE_SCN_LNK_COMDAT diatur di bidang Bendera Bagian header bagian.) Bidang Pilihan menentukan cara linker menyelesaikan beberapa definisi bagian COMDAT.
Simbol pertama yang memiliki nilai bagian dari bagian COMDAT harus menjadi simbol bagian. Simbol ini memiliki nama bagian, bidang Nilai sama dengan nol, nomor bagian dari bagian COMDAT yang dimaksud, bidang Tipe sama dengan IMAGE_SYM_TYPE_NULL, bidang Kelas sama dengan IMAGE_SYM_CLASS_STATIC, dan satu rekaman tambahan. Simbol kedua disebut "simbol COMDAT" dan digunakan oleh linker bersama dengan bidang Pilihan.
Nilai untuk bidang Pilihan diperlihatkan di bawah ini.
Terus-menerus | Nilai | Deskripsi |
---|---|---|
IMAGE_COMDAT_SELECT_NODUPLICATES |
1 |
Jika simbol ini sudah ditentukan, linker mengeluarkan kesalahan "multiply defined symbol". |
IMAGE_COMDAT_SELECT_ANY |
2 |
Bagian apa pun yang mendefinisikan simbol COMDAT yang sama dapat ditautkan; sisanya dihapus. |
IMAGE_COMDAT_SELECT_SAME_SIZE |
3 |
Linker memilih bagian arbitrer di antara definisi untuk simbol ini. Jika semua definisi tidak berukuran sama, kesalahan "simbol yang ditentukan perkalian" dikeluarkan. |
IMAGE_COMDAT_SELECT_EXACT_MATCH |
4 |
Linker memilih bagian arbitrer di antara definisi untuk simbol ini. Jika semua definisi tidak cocok persis, kesalahan "simbol yang ditentukan perkalian" dikeluarkan. |
IMAGE_COMDAT_SELECT_ASSOCIATIVE |
5 |
Bagian ini ditautkan jika bagian COMDAT tertentu lainnya ditautkan. Bagian lain ini ditunjukkan oleh bidang Angka dari rekaman simbol tambahan untuk definisi bagian. Pengaturan ini berguna untuk definisi yang memiliki komponen di beberapa bagian (misalnya, kode dalam satu dan data di bagian lain), tetapi di mana semua harus ditautkan atau dibuang sebagai satu set. Bagian lain yang dikaitkan dengan bagian INI harus berupa bagian COMDAT, yang dapat menjadi bagian COMDAT asosiatif lainnya. Rantai asosiasi bagian COMDAT asosiatif tidak dapat membentuk perulangan. Rantai asosiasi bagian akhirnya harus datang ke bagian COMDAT yang tidak memiliki set IMAGE_COMDAT_SELECT_ASSOCIATIVE. |
IMAGE_COMDAT_SELECT_LARGEST |
6 |
Linker memilih definisi terbesar dari antara semua definisi untuk simbol ini. Jika beberapa definisi memiliki ukuran ini, pilihan di antaranya segan-segan. |
Simbol tambahan ini umumnya mengikuti IMAGE_SYM_CLASS_CLR_TOKEN. Ini digunakan untuk mengaitkan token dengan namespace tabel simbol COFF.
Offset | Ukuran | Bidang | Deskripsi |
---|---|---|---|
0 |
1 |
bAuxType |
Harus IMAGE_AUX_SYMBOL_TYPE_TOKEN_DEF (1). |
1 |
1 |
bReserved |
Dicadangkan, harus nol. |
2 |
4 |
SymbolTableIndex |
Indeks simbol simbol COFF yang dirujuk oleh definisi token CLR ini. |
6 |
12 |
Dicadangkan, harus nol. |
Segera setelah tabel simbol COFF adalah tabel string COFF. Posisi tabel ini ditemukan dengan mengambil alamat tabel simbol di header COFF dan menambahkan jumlah simbol dikalikan dengan ukuran simbol.
Di awal tabel string COFF adalah 4 byte yang berisi ukuran total (dalam byte) dari sisa tabel string. Ukuran ini mencakup bidang ukuran itu sendiri, sehingga nilai di lokasi ini akan menjadi 4 jika tidak ada string yang ada.
Mengikuti ukurannya adalah string yang dihentikan null yang ditunjukkan oleh simbol dalam tabel simbol COFF.
Sertifikat atribut dapat dikaitkan dengan gambar dengan menambahkan tabel sertifikat atribut. Tabel sertifikat atribut terdiri dari sekumpulan entri sertifikat atribut selaras quadword yang bersebelahan. Zero padding disisipkan antara akhir asli file dan awal tabel sertifikat atribut untuk mencapai perataan ini. Setiap entri sertifikat atribut berisi bidang berikut.
Offset | Ukuran | Bidang | Deskripsi |
---|---|---|---|
0 |
4 |
dwLength |
Menentukan panjang entri sertifikat atribut. |
4 |
2 |
wRevision |
Berisi nomor versi sertifikat. Untuk detailnya, lihat teks berikut. |
6 |
2 |
wCertificateType |
Menentukan jenis konten dalam bCertificate. Untuk detailnya, lihat teks berikut. |
8 |
Lihat yang berikut ini |
bCertificate |
Berisi sertifikat, seperti tanda tangan Authenticode. Untuk detailnya, lihat teks berikut. |
Nilai alamat virtual dari entri Tabel Sertifikat di Direktori Data Header Opsional adalah offset file ke entri sertifikat atribut pertama. Entri berikutnya diakses dengan memajukan byte dwLength entri tersebut, dibulatkan ke kelipatan 8 byte, dari awal entri sertifikat atribut saat ini. Ini berlanjut hingga jumlah nilai dwLength yang dibulatkan sama dengan nilai Ukuran dari entri Tabel Sertifikat di Direktori Data Header Opsional. Jika jumlah nilai dwLength yang dibulatkan tidak sama dengan nilai Ukuran, maka tabel sertifikat atribut atau bidang Ukuran rusak.
Misalnya, jika Entri Tabel Sertifikat Direktori Data Header Opsional berisi:
virtual address = 0x5000
size = 0x1000
Sertifikat pertama dimulai pada 0x5000 offset dari awal file pada disk. Untuk memajukan semua entri sertifikat atribut:
- Tambahkan nilai dwLength sertifikat atribut pertama ke offset awal.
- Bulatkan nilai dari langkah 1 ke atas ke kelipatan 8 byte terdekat untuk menemukan offset entri sertifikat atribut kedua.
- Tambahkan nilai offset dari langkah 2 ke nilai dwLength entri sertifikat atribut kedua dan bulatkan ke atas ke kelipatan 8 byte terdekat untuk menentukan offset entri sertifikat atribut ketiga.
- Ulangi langkah 3 untuk setiap sertifikat berturut-turut hingga offset terhitung sama dengan 0x6000 (0x5000 mulai + 0x1000 ukuran total), yang menunjukkan bahwa Anda telah memandu seluruh tabel.
Atau, Anda dapat menghitung entri sertifikat dengan memanggil fungsi Win32 ImageEnumerateCertificates dalam perulangan. Untuk tautan ke halaman referensi fungsi, lihat Referensi.
Entri tabel sertifikat atribut dapat berisi jenis sertifikat apa pun, selama entri memiliki nilai dwLength yang benar, nilai wRevision yang unik, dan nilai wCertificateType yang unik. Jenis entri tabel sertifikat yang paling umum adalah struktur WIN_CERTIFICATE, yang didokumentasikan dalam Wintrust.h dan dibahas di sisa bagian ini.
Opsi untuk anggota WIN_CERTIFICATE wRevision mencakup (tetapi tidak terbatas pada) berikut ini.
Nilai | Nama | Catatan |
---|---|---|
0x0100 |
WIN_CERT_REVISION_1_0 |
Versi 1, versi warisan dari struktur Win_Certificate. Ini hanya didukung untuk tujuan memverifikasi tanda tangan Authenticode warisan |
0x0200 |
WIN_CERT_REVISION_2_0 |
Versi 2 adalah versi struktur Win_Certificate saat ini. |
Opsi untuk anggota WIN_CERTIFICATE wCertificateType menyertakan (tetapi tidak terbatas pada) item dalam tabel berikut. Perhatikan bahwa beberapa nilai saat ini tidak didukung.
Nilai | Nama | Catatan |
---|---|---|
0x0001 |
WIN_CERT_TYPE_X509 |
bCertificate berisi Sertifikat X.509 Tidak Didukung |
0x0002 |
WIN_CERT_TYPE_PKCS_SIGNED_DATA |
bCertificate berisi struktur PKCS#7 SignedData |
0x0003 |
WIN_CERT_TYPE_RESERVED_1 |
Dipesan |
0x0004 |
WIN_CERT_TYPE_TS_STACK_SIGNED |
Penandatanganan Sertifikat Tumpukan Protokol Server Terminal Tidak Didukung |
Anggota bCertificate struktur WIN_CERTIFICATE berisi array byte panjang variabel dengan jenis konten yang ditentukan oleh wCertificateType. Jenis yang didukung oleh Authenticode WIN_CERT_TYPE_PKCS_SIGNED_DATA, struktur PKCS#7 SignedData . Untuk detail tentang format tanda tangan digital Authenticode, lihat Format Tanda Tangan Eksekusi Portabel Windows Authenticode.
Jika konten bCertificate tidak berakhir pada batas quadword, entri sertifikat atribut diisi dengan nol, dari akhir bCertificate ke batas quadword berikutnya.
Nilai dwLength adalah panjang struktur WIN_CERTIFICATE yang diselesaikan dan dihitung sebagai:
dwLength = offsetof(WIN_CERTIFICATE, bCertificate) + (size of the variable-length binary array contained within bCertificate)
Panjang ini harus mencakup ukuran padding apa pun yang digunakan untuk memenuhi persyaratan bahwa setiap struktur WIN_CERTIFICATE selaras dengan quadword:
dwLength += (8 - (dwLength & 7)) & 7;
Ukuran Tabel Sertifikat yang ditentukan dalam entri Tabel Sertifikat di Direktori Data Header Opsional (Khusus Gambar)- menyertakan padding.
Untuk informasi selengkapnya tentang menggunakan ImageHlp API untuk menghitung, menambahkan, dan menghapus sertifikat dari File PE, lihat Fungsi ImageHlp.
Seperti yang dinyatakan di bagian sebelumnya, sertifikat dalam tabel sertifikat atribut dapat berisi jenis sertifikat apa pun. Sertifikat yang memastikan integritas file PE dapat menyertakan hash gambar PE.
Hash gambar PE (atau hash file) mirip dengan checksum file karena algoritma hash menghasilkan hash pesan yang terkait dengan integritas file. Namun, checksum diproduksi oleh algoritma sederhana dan digunakan terutama untuk mendeteksi apakah blok memori pada disk telah buruk dan nilai yang disimpan di sana telah rusak. Hash file mirip dengan checksum karena juga mendeteksi kerusakan file. Namun, tidak seperti kebanyakan algoritma checksum, sangat sulit untuk memodifikasi file tanpa mengubah hash file dari nilai aslinya yang tidak dimodifikasi. Hash file dengan demikian dapat digunakan untuk mendeteksi modifikasi yang disengaja dan bahkan halus pada file, seperti yang diperkenalkan oleh virus, peretas, atau program kuda Trojan.
Ketika disertakan dalam sertifikat, hash gambar harus mengecualikan bidang tertentu dalam Gambar PE, seperti entri Checksum dan Tabel Sertifikat di Direktori Data Header Opsional. Ini karena tindakan menambahkan Sertifikat mengubah bidang ini dan akan menyebabkan nilai hash yang berbeda dihitung.
Fungsi Win32 ImageGetDigestStream menyediakan aliran data dari file PE target untuk fungsi hash. Aliran data ini tetap konsisten ketika sertifikat ditambahkan atau dihapus dari file PE. Berdasarkan parameter yang diteruskan ke ImageGetDigestStream, data lain dari gambar PE dapat dihilangkan dari komputasi hash. Untuk tautan ke halaman referensi fungsi, lihat Referensi.
Tabel ini ditambahkan ke gambar untuk mendukung mekanisme seragam bagi aplikasi untuk menunda pemuatan DLL hingga panggilan pertama ke DLL tersebut. Tata letak tabel cocok dengan tabel impor tradisional yang dijelaskan di bagian 6.4, Bagian .idata." Hanya beberapa detail yang dibahas di sini.
Tabel direktori tunda-muat adalah mitra tabel direktori impor. Ini dapat diambil melalui entri Tunda Impor Deskriptor dalam daftar direktori data header opsional (offset 200). Tabel disusun sebagai berikut:
Offset | Ukuran | Bidang | Deskripsi |
---|---|---|---|
0 |
4 |
Atribut |
Harus nol. |
4 |
4 |
Nama |
RVA nama DLL yang akan dimuat. Nama berada di bagian data baca-saja dari gambar. |
8 |
4 |
Handel Modul |
RVA handel modul (di bagian data gambar) DLL yang akan dimuat keterlambatan. Ini digunakan untuk penyimpanan oleh rutinitas yang disediakan untuk mengelola penundaan pemuatan. |
12 |
4 |
Tunda Impor Tabel Alamat |
RVA dari tabel alamat impor tunda-muat. Untuk informasi selengkapnya, lihat Menunda Tabel Alamat Impor (IAT). |
16 |
4 |
Tunda Impor Tabel Nama |
RVA tabel nama tunda-muat, yang berisi nama impor yang mungkin perlu dimuat. Ini cocok dengan tata letak tabel nama impor. Untuk informasi selengkapnya, lihat Tabel Petunjuk/Nama. |
20 |
4 |
Tabel Impor Penundaan Terikat |
RVA dari tabel alamat tunda-muat terikat, jika ada. |
24 |
4 |
Membongkar Tabel Impor Penundaan |
RVA tabel alamat delay-load unload, jika ada. Ini adalah salinan pasti dari tabel alamat impor penundaan. Jika pemanggil membongkar DLL, tabel ini harus disalin kembali melalui tabel alamat impor penundaan sehingga panggilan berikutnya ke DLL terus menggunakan mekanisme penghentian dengan benar. |
28 |
4 |
Stempel Waktu |
Tanda waktu DLL tempat gambar ini terikat. |
Tabel yang direferensikan dalam struktur data ini diatur dan diurutkan sama seperti rekan-rekan mereka untuk impor tradisional. Untuk detailnya, lihat Bagian .idata.
Namun, tidak ada bendera atribut yang didefinisikan. Linker mengatur bidang ini ke nol dalam gambar. Bidang ini dapat digunakan untuk memperluas rekaman dengan menunjukkan adanya bidang baru, atau dapat digunakan untuk menunjukkan perilaku terhadap fungsi pembantu penundaan atau pembongkaran.
Nama DLL yang akan dimuat keterlambatan berada di bagian data baca-saja dari gambar. Ini dirujuk melalui bidang szName.
Handel DLL yang akan dimuat keterlambatan ada di bagian data gambar. Bidang phmod menunjuk ke handel. Pembantu delay-load yang disediakan menggunakan lokasi ini untuk menyimpan handel ke DLL yang dimuat.
Tabel alamat impor penundaan (IAT) dirujuk oleh deskriptor impor penundaan melalui bidang pIAT. Penundaan-load helper memperbarui pointer ini dengan titik masuk nyata sehingga thunks tidak lagi dalam perulangan panggilan. Penunjuk fungsi diakses dengan menggunakan ekspresi pINT->u1.Function
.
Tabel nama impor penundaan (INT) berisi nama impor yang mungkin memerlukan pemuatan. Mereka dipesan dengan cara yang sama dengan penunjuk fungsi di IAT. Mereka terdiri dari struktur yang sama dengan INT standar dan diakses dengan menggunakan ekspresi pINT->u1.AddressOfData->Name[0]
.
Tabel alamat impor terikat penundaan (BIAT) adalah tabel opsional dari item IMAGE_THUNK_DATA yang digunakan bersama dengan bidang tanda waktu tabel direktori tunda-muat oleh fase pengikatan pasca-proses.
Tabel alamat impor bongkar tunda (UIAT) adalah tabel opsional dari item IMAGE_THUNK_DATA yang digunakan kode bongkar untuk menangani permintaan bongkar eksplisit. Ini terdiri dari data yang diinisialisasi di bagian baca-saja yang merupakan salinan yang tepat dari IAT asli yang merujuk kode ke thunks delay-load. Pada permintaan bongkar, pustaka dapat dibebaskan, *phmod dihapus, dan UIAT yang ditulis melalui IAT untuk memulihkan semuanya ke status pramuatnya.
- Bagian .debug
- Bagian .drectve (Objek Saja)
- Bagian .edata (Hanya Gambar)
- Bagian .idata
- Bagian .pdata
- Bagian .reloc (Hanya Gambar)
- Bagian .tls
- Struktur Konfigurasi Beban (Hanya Gambar)
- Bagian .rsrc
- Bagian .cormeta (Objek Saja)
- Bagian .sxdata
Bagian COFF umum berisi kode atau data yang diproses linker dan pemuat Microsoft Win32 tanpa pengetahuan khusus tentang konten bagian. Konten hanya relevan dengan aplikasi yang sedang ditautkan atau dijalankan.
Namun, beberapa bagian COFF memiliki arti khusus ketika ditemukan dalam file objek atau file gambar. Alat dan pemuat mengenali bagian ini karena memiliki bendera khusus yang diatur di header bagian, karena lokasi khusus dalam header opsional gambar menunjuk ke bagian tersebut, atau karena nama bagian itu sendiri menunjukkan fungsi khusus dari bagian tersebut. (Bahkan jika nama bagian itu sendiri tidak menunjukkan fungsi khusus bagian, nama bagian ditentukan oleh konvensi, sehingga penulis spesifikasi ini dapat merujuk ke nama bagian dalam semua kasus.)
Bagian yang dipesan dan atributnya dijelaskan dalam tabel di bawah ini, diikuti oleh deskripsi terperinci untuk jenis bagian yang dipertahankan ke dalam executable dan jenis bagian yang berisi metadata untuk ekstensi.
Nama bagian | Konten | Karakteristik |
---|---|---|
.Bss |
Data yang tidak diinisialisasi (format gratis) |
IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE |
.cormeta |
Metadata CLR yang menunjukkan bahwa file objek berisi kode terkelola |
IMAGE_SCN_LNK_INFO |
.data |
Data yang diinisialisasi (format gratis) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE |
.debug$F |
Informasi debug FPO yang dihasilkan (hanya objek, arsitektur x86 saja, dan sekarang usang) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE |
.debug$P |
Jenis debug yang telah dikompresi (hanya objek) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE |
.debug$S |
Simbol debug (hanya objek) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE |
.debug$T |
Jenis debug (objek saja) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE |
.drective |
Opsi linker |
IMAGE_SCN_LNK_INFO |
.edata |
Mengekspor tabel |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ |
.idata |
Mengimpor tabel |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE |
.idlsym |
Termasuk SEH terdaftar (hanya gambar) untuk mendukung atribut IDL. Untuk informasi, lihat "Atribut IDL" di Referensi di akhir topik ini. |
IMAGE_SCN_LNK_INFO |
.pdata |
Informasi pengecualian |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ |
.rdata |
Data yang diinisialisasi baca-saja |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ |
.reloc |
Relokasi gambar |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE |
.rsrc |
Direktori sumber daya |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ |
.sbss |
Data yang tidak diinisialisasi relatif GP (format gratis) |
IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE | IMAGE _SCN_GPREL Bendera IMAGE_SCN_GPREL harus diatur hanya untuk arsitektur IA64; bendera ini tidak valid untuk arsitektur lain. Bendera IMAGE_SCN_GPREL hanya untuk file objek; ketika jenis bagian ini muncul dalam file gambar, bendera IMAGE_SCN_GPREL tidak boleh diatur. |
.sdata |
Data yang diinisialisasi relatif GP (format gratis) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE | IMAGE _SCN_GPREL Bendera IMAGE_SCN_GPREL harus diatur hanya untuk arsitektur IA64; bendera ini tidak valid untuk arsitektur lain. Bendera IMAGE_SCN_GPREL hanya untuk file objek; ketika jenis bagian ini muncul dalam file gambar, bendera IMAGE_SCN_GPREL tidak boleh diatur. |
.srdata |
Data baca-saja relatif GP (format gratis) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE _SCN_GPREL Bendera IMAGE_SCN_GPREL harus diatur hanya untuk arsitektur IA64; bendera ini tidak valid untuk arsitektur lain. Bendera IMAGE_SCN_GPREL hanya untuk file objek; ketika jenis bagian ini muncul dalam file gambar, bendera IMAGE_SCN_GPREL tidak boleh diatur. |
.sxdata |
Data handler pengecualian terdaftar (format gratis dan x86/objek saja) |
IMAGE_SCN_LNK_INFO Berisi indeks simbol dari setiap handler pengecualian yang dirujuk oleh kode dalam file objek tersebut. Simbol dapat untuk simbol UNDEF atau simbol yang ditentukan dalam modul tersebut. |
.Teks |
Kode yang dapat dieksekusi (format gratis) |
IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IIMAGE_SCN_MEM_READ |
.tls |
Penyimpanan lokal utas (khusus objek) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE |
.tls$ |
Penyimpanan lokal utas (khusus objek) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE |
.vsdata |
Data yang diinisialisasi relatif GP (format gratis dan hanya untuk arsitektur ARM, SH4, dan Thumb) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE |
.xdata |
Informasi pengecualian (format gratis) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ |
Beberapa bagian yang tercantum di sini ditandai "objek saja" atau "hanya gambar" untuk menunjukkan bahwa semantik khusus mereka hanya relevan untuk file objek atau file gambar, masing-masing. Bagian yang ditandai "hanya gambar" mungkin masih muncul dalam file objek sebagai cara masuk ke file gambar, tetapi bagian tersebut tidak memiliki arti khusus untuk linker, hanya untuk pemuat file gambar.
Bagian .debug digunakan dalam file objek untuk berisi informasi debug yang dihasilkan kompilator dan dalam file gambar untuk berisi semua informasi debug yang dihasilkan. Bagian ini menjelaskan pengemasan informasi debug dalam file objek dan gambar.
Bagian berikutnya menjelaskan format direktori debug, yang dapat berada di mana saja dalam gambar. Bagian berikutnya menjelaskan "grup" dalam file objek yang berisi informasi debug.
Default untuk linker adalah bahwa informasi debug tidak dipetakan ke ruang alamat gambar. Bagian .debug hanya ada ketika informasi debug dipetakan di ruang alamat.
File gambar berisi direktori debug opsional yang menunjukkan bentuk informasi debug apa yang ada dan di mana itu berada. Direktori ini terdiri dari array entri direktori debug yang lokasi dan ukurannya ditunjukkan dalam header opsional gambar.
Direktori debug dapat berada di bagian .debug yang dapat dibuang (jika ada), atau dapat disertakan di bagian lain dalam file gambar, atau tidak berada di bagian sama sekali.
Setiap entri direktori debug mengidentifikasi lokasi dan ukuran blok informasi debug. RVA yang ditentukan dapat menjadi nol jika informasi debug tidak dicakup oleh header bagian (yaitu, berada di file gambar dan tidak dipetakan ke dalam ruang alamat run-time). Jika dipetakan, RVA adalah alamatnya.
Entri direktori debug memiliki format berikut:
Offset | Ukuran | Bidang | Deskripsi |
---|---|---|---|
0 |
4 |
Karakteristik |
Dicadangkan, harus nol. |
4 |
4 |
TimeDateStamp |
Waktu dan tanggal data debug dibuat. |
8 |
2 |
MajorVersion |
Nomor versi utama format data debug. |
10 |
2 |
MinorVersion |
Nomor versi minor dari format data debug. |
12 |
4 |
Ketikkan |
Format informasi penelusuran kesalahan. Bidang ini memungkinkan dukungan beberapa debugger. Untuk informasi selengkapnya, lihat Jenis Debug. |
16 |
4 |
SizeOfData |
Ukuran data debug (tidak termasuk direktori debug itu sendiri). |
20 |
4 |
AddressOfRawData |
Alamat data debug saat dimuat, relatif terhadap basis gambar. |
24 |
4 |
PointerToRawData |
Penunjuk file ke data debug. |
Nilai berikut didefinisikan untuk bidang Jenis entri direktori debug:
Terus-menerus | Nilai | Deskripsi |
---|---|---|
IMAGE_DEBUG_TYPE_UNKNOWN |
0 |
Nilai yang tidak diketahui yang diabaikan oleh semua alat. |
IMAGE_DEBUG_TYPE_COFF |
1 |
Informasi debug COFF (nomor baris, tabel simbol, dan tabel string). Jenis informasi debug ini juga ditujukan ke bidang di header file. |
IMAGE_DEBUG_TYPE_CODEVIEW |
2 |
Informasi debug Visual C++. |
IMAGE_DEBUG_TYPE_FPO |
3 |
Informasi kelalaian pointer bingkai (FPO). Informasi ini memberi tahu debugger cara menginterpretasikan bingkai tumpukan nonstandar, yang menggunakan register EBP untuk tujuan selain sebagai penunjuk bingkai. |
IMAGE_DEBUG_TYPE_MISC |
4 |
Lokasi file DBG. |
IMAGE_DEBUG_TYPE_EXCEPTION |
5 |
Salinan bagian .pdata. |
IMAGE_DEBUG_TYPE_FIXUP |
6 |
Dicadangkan. |
IMAGE_DEBUG_TYPE_OMAP_TO_SRC |
7 |
Pemetaan dari RVA dalam gambar ke RVA dalam gambar sumber. |
IMAGE_DEBUG_TYPE_OMAP_FROM_SRC |
8 |
Pemetaan dari RVA dalam gambar sumber ke RVA dalam gambar. |
IMAGE_DEBUG_TYPE_BORLAND |
9 |
Dicadangkan untuk Borland. |
IMAGE_DEBUG_TYPE_RESERVED10 |
10 |
Dicadangkan. |
IMAGE_DEBUG_TYPE_CLSID |
11 |
Dicadangkan. |
IMAGE_DEBUG_TYPE_REPRO |
16 |
Determinisme pe atau reprodusibilitas. |
Tidak terdefinisi |
17 |
Informasi penelusuran kesalahan disematkan dalam file PE di lokasi yang ditentukan oleh PointerToRawData. |
Tidak terdefinisi |
19 |
Menyimpan hash kripto untuk konten file simbol yang digunakan untuk membangun file PE/COFF. |
IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS | 20 | Bit karakteristik DLL yang diperluas. |
Jika bidang Jenis diatur ke IMAGE_DEBUG_TYPE_FPO, data mentah debug adalah array di mana setiap anggota menjelaskan bingkai tumpukan fungsi. Tidak setiap fungsi dalam file gambar harus memiliki informasi FPO yang ditentukan untuk itu, meskipun jenis debug adalah FPO. Fungsi-fungsi yang tidak memiliki informasi FPO diasumsikan memiliki bingkai tumpukan normal. Format untuk informasi FPO adalah sebagai berikut:
#define FRAME_FPO 0
#define FRAME_TRAP 1
#define FRAME_TSS 2
typedef struct _FPO_DATA {
DWORD ulOffStart; // offset 1st byte of function code
DWORD cbProcSize; // # bytes in function
DWORD cdwLocals; // # bytes in locals/4
WORD cdwParams; // # bytes in params/4
WORD cbProlog : 8; // # bytes in prolog
WORD cbRegs : 3; // # regs saved
WORD fHasSEH : 1; // TRUE if SEH in func
WORD fUseBP : 1; // TRUE if EBP has been allocated
WORD reserved : 1; // reserved for future use
WORD cbFrame : 2; // frame type
} FPO_DATA;
Kehadiran entri jenis IMAGE_DEBUG_TYPE_REPRO menunjukkan file PE dibangun dengan cara untuk mencapai determinisme atau reproduksi. Jika input tidak berubah, file PE output dijamin menjadi bit-for-bit yang identik tidak peduli kapan atau di mana PE diproduksi. Berbagai bidang stempel tanggal/waktu dalam file PE diisi dengan bagian atau semua bit dari nilai hash terhitung yang menggunakan konten file PE sebagai input, dan oleh karena itu tidak lagi mewakili tanggal dan waktu aktual ketika file PE atau data spesifik terkait dalam PE diproduksi. Data mentah entri debug ini mungkin kosong, atau mungkin berisi nilai hash terhitung yang didahului oleh nilai empat byte yang mewakili panjang nilai hash.
Jika bidang Jenis diatur ke IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS, data mentah debug berisi bit karakteristik DLL yang diperluas, selain yang dapat diatur dalam header opsional gambar. Lihat Karakteristik DLL di bagian Header Opsional Bidang Khusus Windows (Hanya Gambar).
Nilai berikut didefinisikan untuk bit karakteristik DLL yang diperluas.
Terus-menerus | Nilai | Deskripsi |
---|---|---|
IMAGE_DLLCHARACTERISTICS_EX_CET_COMPAT | 0x0001 | Gambar kompatibel dengan Control-flow Enforcement Technology (CET) Shadow Stack. |
IMAGE_DLLCHARACTERISTICS_EX_FORWARD_CFI_COMPAT | 0x0040 | Semua target cabang di semua bagian kode gambar diannotasi dengan instruksi pelindung integritas alur kontrol tepi depan seperti instruksi x86 CET-Indirect Branch Tracking (IBT) atau ARM Branch Target Identification (BTI). Bit ini tidak digunakan oleh Windows. |
Data di bagian ini telah digantikan dalam Visual C++ versi 7.0 dan yang lebih baru oleh sekumpulan data yang lebih luas yang dipancarkan ke dalam subbagian .debug$S .
File objek dapat berisi bagian .debug$F yang isinya adalah satu atau beberapa rekaman FPO_DATA (informasi kelalaian pointer bingkai). Lihat "IMAGE_DEBUG_TYPE_FPO" di Jenis Debug.
Linker mengenali rekaman .debug$F ini. Jika informasi debug sedang dibuat, linker mengurutkan rekaman FPO_DATA berdasarkan prosedur RVA dan menghasilkan entri direktori debug untuk mereka.
Pengkompilasi tidak boleh menghasilkan rekaman FPO untuk prosedur yang memiliki format bingkai standar.
Bagian ini berisi informasi debug Visual C++ (informasi simbolis).
Bagian ini berisi informasi debug Visual C++ (informasi yang telah dikommpilasikan sebelumnya). Ini adalah jenis bersama di antara semua objek yang dikompilasi dengan menggunakan header yang telah dikompilasi yang dihasilkan dengan objek ini.
Bagian ini berisi informasi debug Visual C++ (informasi jenis).
Untuk mendukung informasi debug, linker:
Mengumpulkan semua data debug yang relevan dari bagian .debug$F, debug$S, .debug$P, dan .debug$T .
Memproses data tersebut bersama dengan informasi debugging yang dihasilkan linker ke dalam file PDB, dan membuat entri direktori debug untuk merujuknya.
Bagian adalah bagian direktif jika memiliki bendera IMAGE_SCN_LNK_INFO yang diatur di header bagian dan memiliki nama bagian .drectve . Linker menghapus bagian .drectve setelah memproses informasi, sehingga bagian tidak muncul dalam file gambar yang sedang ditautkan.
Bagian .drectve terdiri dari string teks yang dapat dikodekan sebagai ANSI atau UTF-8. Jika penanda urutan byte UTF-8 (BOM, awalan tiga byte yang terdiri dari 0xEF, 0xBB, dan 0xBF) tidak ada, string direktif ditafsirkan sebagai ANSI. String direktif adalah serangkaian opsi linker yang dipisahkan oleh spasi. Setiap opsi berisi tanda hubung, nama opsi, dan atribut yang sesuai. Jika opsi berisi spasi, opsi harus diapit dalam tanda kutip. Bagian .drectve tidak boleh memiliki relokasi atau nomor baris.
Bagian ekspor data, bernama .edata, berisi informasi tentang simbol yang dapat diakses gambar lain melalui penautan dinamis. Simbol yang diekspor umumnya ditemukan di DLL, tetapi DLL juga dapat mengimpor simbol.
Gambaran umum struktur umum bagian ekspor dijelaskan di bawah ini. Tabel yang dijelaskan biasanya berdekatan dalam file dalam urutan yang ditampilkan (meskipun ini tidak diperlukan). Hanya tabel direktori ekspor dan tabel alamat ekspor yang diperlukan untuk mengekspor simbol sebagai ordinal. (Ordinal adalah ekspor yang diakses langsung oleh indeks tabel alamat ekspornya.) Tabel penunjuk nama, tabel ordinal, dan tabel nama ekspor semuanya ada untuk mendukung penggunaan nama ekspor.
Nama Tabel | Deskripsi |
---|---|
Ekspor tabel direktori |
Tabel hanya dengan satu baris (tidak seperti direktori debug). Tabel ini menunjukkan lokasi dan ukuran tabel ekspor lainnya. |
Ekspor tabel alamat |
Array RVA dari simbol yang diekspor. Ini adalah alamat aktual dari fungsi dan data yang diekspor dalam kode dan bagian data yang dapat dieksekusi. File gambar lain dapat mengimpor simbol dengan menggunakan indeks ke tabel ini (ordinal) atau, secara opsional, dengan menggunakan nama publik yang sesuai dengan ordinal jika nama publik ditentukan. |
Tabel penunjuk nama |
Array pointer ke nama ekspor publik, diurutkan dalam urutan naik. |
Tabel ordinal |
Array ordinal yang sesuai dengan anggota tabel penunjuk nama. Korespondensi berdasarkan posisi; oleh karena itu, tabel penunjuk nama dan tabel ordinal harus memiliki jumlah anggota yang sama. Setiap ordinal adalah indeks ke dalam tabel alamat ekspor. |
Ekspor tabel nama |
Serangkaian string ASCII null-terminated. Anggota tabel penunjuk nama menunjuk ke area ini. Nama-nama ini adalah nama publik tempat simbol diimpor dan diekspor; nama tersebut belum tentu sama dengan nama privat yang digunakan dalam file gambar. |
Ketika file gambar lain mengimpor simbol menurut nama, pemuat Win32 mencari tabel penunjuk nama untuk string yang cocok. Jika string yang cocok ditemukan, ordinal terkait diidentifikasi dengan mencari anggota yang sesuai dalam tabel ordinal (yaitu, anggota tabel ordinal dengan indeks yang sama dengan penunjuk string yang ditemukan dalam tabel penunjuk nama). Ordinal yang dihasilkan adalah indeks ke dalam tabel alamat ekspor, yang memberikan lokasi sebenarnya dari simbol yang diinginkan. Setiap simbol ekspor dapat diakses oleh ordinal.
Ketika file gambar lain mengimpor simbol menurut ordinal, tidak perlu mencari tabel penunjuk nama untuk string yang cocok. Oleh karena itu, penggunaan langsung ordinal lebih efisien. Namun, nama ekspor lebih mudah diingat dan tidak mengharuskan pengguna untuk mengetahui indeks tabel untuk simbol tersebut.
Informasi simbol ekspor dimulai dengan tabel direktori ekspor, yang menjelaskan sisa informasi simbol ekspor. Tabel direktori ekspor berisi informasi alamat yang digunakan untuk mengatasi impor ke titik masuk dalam gambar ini.
Offset | Ukuran | Bidang | Deskripsi |
---|---|---|---|
0 |
4 |
Ekspor Bendera |
Dicadangkan, harus 0. |
4 |
4 |
Stempel Waktu/Tanggal |
Waktu dan tanggal pembuatan data ekspor. |
8 |
2 |
Versi Utama |
Nomor versi utama. Nomor versi utama dan minor dapat diatur oleh pengguna. |
10 |
2 |
Versi Minor |
Nomor versi minor. |
12 |
4 |
Nama RVA |
Alamat string ASCII yang berisi nama DLL. Alamat ini relatif terhadap basis gambar. |
16 |
4 |
Dasar Ordinal |
Nomor ordinal awal untuk ekspor dalam gambar ini. Bidang ini menentukan nomor ordinal awal untuk tabel alamat ekspor. Biasanya diatur ke 1. |
20 |
4 |
Entri Tabel Alamat |
Jumlah entri dalam tabel alamat ekspor. |
24 |
4 |
Jumlah Penunjuk Nama |
Jumlah entri dalam tabel penunjuk nama. Ini juga jumlah entri dalam tabel ordinal. |
28 |
4 |
Ekspor Tabel Alamat RVA |
Alamat tabel alamat ekspor, relatif terhadap basis gambar. |
32 |
4 |
Nama Pointer RVA |
Alamat tabel penunjuk nama ekspor, relatif terhadap basis gambar. Ukuran tabel diberikan oleh bidang Jumlah Penunjuk Nama. |
36 |
4 |
Tabel Ordinal RVA |
Alamat tabel ordinal, relatif terhadap basis gambar. |
Tabel alamat ekspor berisi alamat titik masuk yang diekspor dan data dan absolut yang diekspor. Nomor ordinal digunakan sebagai indeks ke dalam tabel alamat ekspor.
Setiap entri dalam tabel alamat ekspor adalah bidang yang menggunakan salah satu dari dua format dalam tabel berikut. Jika alamat yang ditentukan tidak berada dalam bagian ekspor (seperti yang didefinisikan oleh alamat dan panjang yang ditunjukkan di header opsional), bidang adalah RVA ekspor, yang merupakan alamat aktual dalam kode atau data. Jika tidak, bidang adalah RVA penerus, yang menamai simbol di DLL lain.
Offset | Ukuran | Bidang | Deskripsi |
---|---|---|---|
0 |
4 |
Ekspor RVA |
Alamat simbol yang diekspor saat dimuat ke dalam memori, relatif terhadap basis gambar. Misalnya, alamat fungsi yang diekspor. |
0 |
4 |
Penerus RVA |
Penunjuk ke string ASCII yang dihentikan null di bagian ekspor. String ini harus berada dalam rentang yang diberikan oleh entri direktori data tabel ekspor. Lihat Direktori Data Header Opsional (Hanya Gambar). String ini memberikan nama DLL dan nama ekspor (misalnya, "MYDLL.expfunc") atau nama DLL dan nomor ordinal ekspor (misalnya, "MYDLL.#27"). |
Penerus RVA mengekspor definisi dari beberapa gambar lain, membuatnya tampak seolah-olah sedang diekspor oleh gambar saat ini. Dengan demikian, simbol diimpor dan diekspor secara bersamaan.
Misalnya, dalam Kernel32.dll di Windows XP, ekspor bernama "HeapAlloc" diteruskan ke string "NTDLL. RtlAllocateHeap." Ini memungkinkan aplikasi untuk menggunakan modul khusus Windows XP Ntdll.dll tanpa benar-benar berisi referensi impor ke dalamnya. Tabel impor aplikasi hanya mengacu pada Kernel32.dll. Oleh karena itu, aplikasi ini tidak spesifik untuk Windows XP dan dapat berjalan pada sistem Win32 apa pun.
Tabel penunjuk nama ekspor adalah array alamat (RVA) ke dalam tabel nama ekspor. Pointer masing-masing 32 bit dan relatif terhadap basis gambar. Pointer diurutkan secara leksikal untuk memungkinkan pencarian biner.
Nama ekspor ditentukan hanya jika tabel penunjuk nama ekspor berisi penunjuk ke dalamnya.
Tabel ordinal ekspor adalah array indeks 16-bit yang tidak bias ke dalam tabel alamat ekspor. Ordinal dibiaskan oleh bidang Ordinal Base dari tabel direktori ekspor. Dengan kata lain, basis ordinal harus dikurangi dari ordinal untuk mendapatkan indeks benar ke dalam tabel alamat ekspor.
Tabel penunjuk nama ekspor dan tabel ordinal ekspor membentuk dua array paralel yang dipisahkan untuk memungkinkan perataan bidang alami. Kedua tabel ini, berlaku, beroperasi sebagai satu tabel, di mana kolom Ekspor Penunjuk Nama menunjuk ke nama publik (diekspor) dan kolom Ekspor Ordinal memberikan ordinal yang sesuai untuk nama publik tersebut. Anggota tabel penunjuk nama ekspor dan anggota tabel ordinal ekspor dikaitkan dengan memiliki posisi (indeks) yang sama dalam array masing-masing.
Dengan demikian, ketika tabel penunjuk nama ekspor dicari dan string yang cocok ditemukan pada posisi i, algoritma untuk menemukan RVA simbol dan ordinal bias adalah:
i = Search_ExportNamePointerTable (name);
ordinal = ExportOrdinalTable [i];
rva = ExportAddressTable [ordinal];
biased_ordinal = ordinal + OrdinalBase;
Saat mencari simbol berdasarkan ordinal (bias), algoritma untuk menemukan RVA simbol dan nama adalah:
ordinal = biased_ordinal - OrdinalBase;
i = Search_ExportOrdinalTable (ordinal);
rva = ExportAddressTable [ordinal];
name = ExportNameTable [i];
Tabel nama ekspor berisi data string aktual yang diacu oleh tabel penunjuk nama ekspor. String dalam tabel ini adalah nama publik yang dapat digunakan gambar lain untuk mengimpor simbol. Nama ekspor publik ini belum tentu sama dengan nama simbol privat yang dimiliki simbol dalam file gambar dan kode sumber mereka sendiri, meskipun bisa.
Setiap simbol yang diekspor memiliki nilai ordinal, yang hanya merupakan indeks ke dalam tabel alamat ekspor. Namun, penggunaan nama ekspor bersifat opsional. Beberapa, semua, atau tidak ada simbol yang diekspor dapat memiliki nama ekspor. Untuk simbol yang diekspor yang memang memiliki nama ekspor, entri yang sesuai dalam tabel penunjuk nama ekspor dan ekspor tabel ordinal bekerja sama untuk mengaitkan setiap nama dengan ordinal.
Struktur tabel nama ekspor adalah serangkaian string ASCII panjang variabel yang dihentikan null.
Semua file gambar yang mengimpor simbol, termasuk hampir semua file executable (EXE), memiliki bagian .idata. Tata letak file umum untuk informasi impor mengikuti:
Tabel Direktori
Entri Direktori Null
Dll1 Impor Tabel Pencarian
Null
Dll2 Impor Tabel Pencarian
Null
Dll3 Impor Tabel Pencarian
Null
Tabel Nama Petunjuk
Informasi impor dimulai dengan tabel direktori impor, yang menjelaskan sisa informasi impor. Tabel direktori impor berisi informasi alamat yang digunakan untuk mengatasi referensi perbaikan ke titik masuk dalam gambar DLL. Tabel direktori impor terdiri dari array entri direktori impor, satu entri untuk setiap DLL yang dirujuk gambar. Entri direktori terakhir kosong (diisi dengan nilai null), yang menunjukkan akhir tabel direktori.
Setiap entri direktori impor memiliki format berikut:
Offset | Ukuran | Bidang | Deskripsi |
---|---|---|---|
0 |
4 |
Impor RVA Tabel Pencarian (Karakteristik) |
RVA tabel pencarian impor. Tabel ini berisi nama atau ordinal untuk setiap impor. (Nama "Karakteristik" digunakan di Winnt.h, tetapi tidak lagi menggambarkan bidang ini.) |
4 |
4 |
Stempel Waktu/Tanggal |
Stempel yang diatur ke nol hingga gambar terikat. Setelah gambar terikat, bidang ini diatur ke stempel waktu/data DLL. |
8 |
4 |
Rantai Penerus |
Indeks referensi penerus pertama. |
12 |
4 |
Nama RVA |
Alamat string ASCII yang berisi nama DLL. Alamat ini relatif terhadap basis gambar. |
16 |
4 |
Impor Tabel Alamat RVA (Tabel Thunk) |
RVA tabel alamat impor. Konten tabel ini identik dengan konten tabel pencarian impor hingga gambar terikat. |
Tabel pencarian impor adalah array angka 32-bit untuk PE32 atau array angka 64-bit untuk PE32+. Setiap entri menggunakan format bit-field yang dijelaskan dalam tabel berikut. Dalam format ini, bit 31 adalah bit paling signifikan untuk PE32 dan bit 63 adalah bit paling signifikan untuk PE32+. Kumpulan entri ini menjelaskan semua impor dari DLL tertentu. Entri terakhir diatur ke nol (NULL) untuk menunjukkan akhir tabel.
Bit | Ukuran | Bidang bit | Deskripsi |
---|---|---|---|
31/63 |
1 |
Bendera Ordinal/Nama |
Jika bit ini diatur, impor menurut ordinal. Jika tidak, impor berdasarkan nama. Bit ditutupi sebagai 0x80000000 untuk PE32, 0x8000000000000000 untuk PE32+. |
15-0 |
16 |
Nomor Ordinal |
Angka ordinal 16-bit. Bidang ini hanya digunakan jika bidang Bit Bendera Ordinal/Nama adalah 1 (impor menurut ordinal). Bit 30-15 atau 62-15 harus 0. |
30-0 |
31 |
Tabel Petunjuk/Nama RVA |
RVA 31-bit dari entri tabel petunjuk/nama. Bidang ini hanya digunakan jika bidang Bit Bendera Ordinal/Nama adalah 0 (impor menurut nama). Untuk PE32+ bit 62-31 harus nol. |
Satu cukup tabel petunjuk/nama untuk seluruh bagian impor. Setiap entri dalam tabel petunjuk/nama memiliki format berikut:
Offset | Ukuran | Bidang | Deskripsi |
---|---|---|---|
0 |
2 |
Petunjuk |
Indeks ke dalam tabel penunjuk nama ekspor. Kecocokan dicoba terlebih dahulu dengan nilai ini. Jika gagal, pencarian biner dilakukan pada tabel penunjuk nama ekspor DLL. |
2 |
variabel |
Nama |
String ASCII yang berisi nama yang akan diimpor. Ini adalah string yang harus dicocokkan dengan nama publik di DLL. String ini peka huruf besar/kecil dan dihentikan oleh byte null. |
* |
0 atau 1 |
Pad |
Byte nol-pad berikutnya yang muncul setelah byte null berikutnya, jika perlu, untuk menyelaraskan entri berikutnya pada batas genap. |
Struktur dan konten tabel alamat impor identik dengan tabel pencarian impor, hingga file terikat. Selama pengikatan, entri dalam tabel alamat impor ditimpa dengan alamat 32-bit (untuk PE32) atau 64-bit (untuk PE32+) dari simbol yang sedang diimpor. Alamat ini adalah alamat memori aktual dari simbol, meskipun secara teknis alamat tersebut masih disebut "alamat virtual." Loader biasanya memproses pengikatan.
Bagian .pdata berisi array entri tabel fungsi yang digunakan untuk penanganan pengecualian. Ini diarahkan ke oleh entri tabel pengecualian di direktori data gambar. Entri harus diurutkan sesuai dengan alamat fungsi (bidang pertama di setiap struktur) sebelum dipancarkan ke dalam gambar akhir. Platform target menentukan mana dari tiga variasi format entri tabel fungsi yang dijelaskan di bawah ini yang digunakan.
Untuk gambar MIPS 32-bit, entri tabel fungsi memiliki format berikut:
Offset | Ukuran | Bidang | Deskripsi |
---|---|---|---|
0 |
4 |
Mulai Alamat |
VA dari fungsi yang sesuai. |
4 |
4 |
Alamat Akhir |
VA akhir fungsi. |
8 |
4 |
Handler Pengecualian |
Penunjuk ke handler pengecualian yang akan dijalankan. |
12 |
4 |
Handler Data |
Penunjuk ke informasi tambahan yang akan diteruskan ke handler. |
16 |
4 |
Alamat Akhir Prolog |
VA dari akhir prolog fungsi. |
Untuk platform ARM, PowerPC, SH3, dan SH4 Windows CE, entri tabel fungsi memiliki format berikut:
Offset | Ukuran | Bidang | Deskripsi |
---|---|---|---|
0 |
4 |
Mulai Alamat |
VA dari fungsi yang sesuai. |
4 |
8 bit |
Panjang Prolog |
Jumlah instruksi dalam prolog fungsi. |
4 |
22 bit |
Panjang Fungsi |
Jumlah instruksi dalam fungsi. |
4 |
1 bit |
Bendera 32-bit |
Jika diatur, fungsi terdiri dari instruksi 32-bit. Jika jelas, fungsi terdiri dari instruksi 16-bit. |
4 |
1 bit |
Bendera Pengecualian |
Jika diatur, handler pengecualian ada untuk fungsi tersebut. Jika tidak, tidak ada handler pengecualian. |
Untuk platform x64 dan Itanium, entri tabel fungsi memiliki format berikut:
Offset | Ukuran | Bidang | Deskripsi |
---|---|---|---|
0 |
4 |
Mulai Alamat |
RVA dari fungsi yang sesuai. |
4 |
4 |
Alamat Akhir |
RVA dari akhir fungsi. |
8 |
4 |
Batalkan Informasi |
RVA dari informasi unwind. |
Tabel relokasi dasar berisi entri untuk semua relokasi dasar dalam gambar. Bidang Tabel Relokasi Dasar di direktori data header opsional memberikan jumlah byte dalam tabel relokasi dasar. Untuk informasi selengkapnya, lihat Direktori Data Header Opsional (Hanya Gambar). Tabel relokasi dasar dibagi menjadi blok. Setiap blok mewakili relokasi dasar untuk halaman 4K. Setiap blok harus dimulai pada batas 32-bit.
Loader tidak diperlukan untuk memproses relokasi dasar yang diselesaikan oleh linker, kecuali gambar beban tidak dapat dimuat di basis gambar yang ditentukan di header PE.
Setiap blok relokasi dasar dimulai dengan struktur berikut:
Offset | Ukuran | Bidang | Deskripsi |
---|---|---|---|
0 |
4 |
Halaman RVA |
Basis gambar ditambah halaman RVA ditambahkan ke setiap offset untuk membuat VA tempat relokasi dasar harus diterapkan. |
4 |
4 |
Ukuran Blok |
Jumlah total byte di blok relokasi dasar, termasuk bidang RVA Halaman dan Ukuran Blok dan bidang Jenis/Offset yang mengikutinya. |
Bidang Ukuran Blok kemudian diikuti oleh sejumlah entri bidang Tipe atau Offset. Setiap entri adalah WORD (2 byte) dan memiliki struktur berikut:
Offset | Ukuran | Bidang | Deskripsi |
---|---|---|---|
0 |
4 bit |
Ketikkan |
Disimpan dalam 4 bit tinggi WORD, nilai yang menunjukkan jenis relokasi dasar yang akan diterapkan. Untuk informasi selengkapnya, lihat Jenis Relokasi Dasar. |
0 |
12 bit |
Offset |
Disimpan dalam 12 bit WORD yang tersisa, offset dari alamat awal yang ditentukan di bidang RVA Halaman untuk blok tersebut. Offset ini menentukan di mana relokasi dasar akan diterapkan. |
Untuk menerapkan relokasi dasar, perbedaan dihitung antara alamat dasar pilihan dan basis tempat gambar benar-benar dimuat. Jika gambar dimuat pada basis pilihannya, perbedaannya adalah nol dan dengan demikian relokasi dasar tidak harus diterapkan.
Terus-menerus | Nilai | Deskripsi |
---|---|---|
IMAGE_REL_BASED_ABSOLUTE |
0 |
Relokasi dasar dilewati. Jenis ini dapat digunakan untuk melakukan pad blok. |
IMAGE_REL_BASED_HIGH |
1 |
Relokasi dasar menambahkan 16 bit tinggi dari perbedaan ke bidang 16-bit pada offset. Bidang 16-bit mewakili nilai tinggi kata 32-bit. |
IMAGE_REL_BASED_LOW |
2 |
Relokasi dasar menambahkan 16 bit rendah dari perbedaan ke bidang 16-bit pada offset. Bidang 16-bit mewakili setengah rendah dari kata 32-bit. |
IMAGE_REL_BASED_HIGHLOW |
3 |
Relokasi dasar menerapkan semua 32 bit perbedaan ke bidang 32-bit pada offset. |
IMAGE_REL_BASED_HIGHADJ |
4 |
Relokasi dasar menambahkan 16 bit tinggi dari perbedaan ke bidang 16-bit pada offset. Bidang 16-bit mewakili nilai tinggi kata 32-bit. 16 bit rendah dari nilai 32-bit disimpan dalam kata 16-bit yang mengikuti relokasi dasar ini. Ini berarti bahwa relokasi dasar ini menempati dua slot. |
IMAGE_REL_BASED_MIPS_JMPADDR |
5 |
Interpretasi relokasi tergantung pada jenis komputer. Ketika jenis komputer adalah MIPS, relokasi dasar berlaku untuk instruksi lompat MIPS. |
IMAGE_REL_BASED_ARM_MOV32 |
5 |
Relokasi ini bermakna hanya ketika jenis komputer adalah ARM atau Thumb. Relokasi dasar menerapkan alamat 32-bit simbol di seluruh pasangan instruksi MOVW/MOVT berturut-turut. |
IMAGE_REL_BASED_RISCV_HIGH20 |
5 |
Relokasi ini hanya bermakna ketika jenis komputer adalah RISC-V. Relokasi dasar berlaku untuk 20 bit tinggi dari alamat absolut 32-bit. |
6 |
Dicadangkan, harus nol. |
|
IMAGE_REL_BASED_THUMB_MOV32 |
7 |
Relokasi ini bermakna hanya ketika jenis komputer adalah Thumb. Relokasi dasar menerapkan alamat simbol 32-bit ke pasangan instruksi MOVW/MOVT berturut-turut. |
IMAGE_REL_BASED_RISCV_LOW12I |
7 |
Relokasi ini hanya bermakna ketika jenis komputer adalah RISC-V. Relokasi dasar berlaku untuk 12 bit rendah dari alamat absolut 32-bit yang terbentuk dalam format instruksi RISC-V tipe I. |
IMAGE_REL_BASED_RISCV_LOW12S |
8 |
Relokasi ini hanya bermakna ketika jenis komputer adalah RISC-V. Relokasi dasar berlaku untuk 12 bit rendah dari alamat absolut 32-bit yang dibentuk dalam format instruksi jenis RISC-V S. |
IMAGE_REL_BASED_LOONGARCH32_MARK_LA |
8 |
Relokasi ini hanya bermakna ketika jenis mesin adalah LoongArch 32-bit. Relokasi dasar berlaku untuk alamat absolut 32-bit yang dibentuk dalam dua instruksi berturut-turut. |
IMAGE_REL_BASED_LOONGARCH64_MARK_LA |
8 |
Relokasi ini hanya bermakna ketika jenis mesin adalah LoongArch 64-bit. Relokasi dasar berlaku untuk alamat absolut 64-bit yang dibentuk dalam empat instruksi berturut-turut. |
IMAGE_REL_BASED_MIPS_JMPADDR16 |
9 |
Relokasi hanya bermakna ketika jenis komputer adalah MIPS. Relokasi dasar berlaku untuk instruksi lompat MIPS16. |
IMAGE_REL_BASED_DIR64 |
10 |
Relokasi dasar menerapkan perbedaan ke bidang 64-bit saat offset. |
Bagian .tls menyediakan dukungan PE dan COFF langsung untuk penyimpanan lokal utas statis (TLS). TLS adalah kelas penyimpanan khusus yang didukung Windows di mana objek data bukan variabel otomatis (tumpukan), namun bersifat lokal untuk setiap utas individu yang menjalankan kode. Dengan demikian, setiap utas dapat mempertahankan nilai yang berbeda untuk variabel yang dideklarasikan dengan menggunakan TLS.
Perhatikan bahwa sejumlah data TLS dapat didukung dengan menggunakan panggilan API TlsAlloc, TlsFree, TlsSetValue, dan TlsGetValue. Implementasi PE atau COFF adalah pendekatan alternatif untuk menggunakan API dan memiliki keuntungan lebih sederhana dari sudut pandang pemrogram tingkat tinggi. Implementasi ini memungkinkan data TLS didefinisikan dan diinisialisasi mirip dengan variabel statis biasa dalam suatu program. Misalnya, di Visual C++, variabel TLS statis dapat didefinisikan sebagai berikut, tanpa menggunakan WINDOWS API:
__declspec (thread) int tlsFlag = 1;
Untuk mendukung konstruksi pemrograman ini, bagian PE dan COFF .tls menentukan informasi berikut: data inisialisasi, rutinitas panggilan balik untuk inisialisasi dan penghentian per utas, dan indeks TLS, yang dijelaskan dalam diskusi berikut.
Catatan
Sebelum Windows Vista, objek data TLS yang dideklarasikan secara statis hanya dapat digunakan dalam file gambar yang dimuat secara statis. Fakta ini membuatnya tidak dapat menggunakan data TLS statis dalam DLL kecuali Anda tahu bahwa DLL, atau apa pun yang terkait secara statis dengannya, tidak akan pernah dimuat secara dinamis dengan fungsi API LoadLibrary. Namun, dimulai dengan Windows Vista, peningkatan dilakukan pada pemuat Windows untuk mendukung pemuatan DLL dinamis dengan TLS statis dengan lebih baik. Perubahan ini berarti bahwa DLL dengan objek data TLS yang dideklarasikan secara statis sekarang dapat digunakan dengan lebih andal, bahkan jika dimuat secara dinamis menggunakan LoadLibrary. Loader mampu mengalokasikan slot TLS untuk DLL tersebut pada waktu pemuatan, mengurangi batasan yang ada di versi Windows sebelumnya.
Catatan
Referensi ke offset 32-bit dan pengali indeks 4 berlaku untuk sistem dengan arsitektur 32-bit. Dalam sistem berdasarkan arsitektur 64-bit, sesuaikan seperlunya.
Kode yang dapat dieksekusi mengakses objek data TLS statis melalui langkah-langkah berikut:
Pada waktu tautan, linker mengatur bidang Alamat Indeks direktori TLS. Bidang ini menunjuk ke lokasi di mana program mengharapkan untuk menerima indeks TLS.
Pustaka run-time Microsoft memfasilitasi proses ini dengan menentukan gambar memori direktori TLS dan memberinya nama khusus "__tls_used" (platform Intel x86) atau "_tls_used" (platform lain). Linker mencari gambar memori ini dan menggunakan data di sana untuk membuat direktori TLS. Pengkompilasi lain yang mendukung TLS dan bekerja dengan linker Microsoft harus menggunakan teknik yang sama ini.
Saat utas dibuat, loader mengomunikasikan alamat array TLS utas dengan menempatkan alamat blok lingkungan utas (TEB) di register FS. Penunjuk ke array TLS berada di offset 0x2C dari awal TEB. Perilaku ini khusus intel x86.
Loader menetapkan nilai indeks TLS ke tempat yang ditunjukkan oleh bidang Alamat Indeks.
Kode yang dapat dieksekusi mengambil indeks TLS dan juga lokasi array TLS.
Kode ini menggunakan indeks TLS dan lokasi array TLS (mengalikan indeks dengan 4 dan menggunakannya sebagai offset ke array) untuk mendapatkan alamat area data TLS untuk program dan modul tertentu. Setiap utas memiliki area data TLS sendiri, tetapi ini transparan untuk program, yang tidak perlu mengetahui bagaimana data dialokasikan untuk utas individual.
Objek data TLS individual diakses sebagai beberapa offset tetap ke area data TLS.
Array TLS adalah array alamat yang dipertahankan sistem untuk setiap utas. Setiap alamat dalam array ini memberikan lokasi data TLS untuk modul tertentu (EXE atau DLL) dalam program. Indeks TLS menunjukkan anggota array mana yang akan digunakan. Indeks adalah angka (bermakna hanya untuk sistem) yang mengidentifikasi modul.
Direktori TLS memiliki format berikut:
Offset (PE32/ PE32+) | Ukuran (PE32/ PE32+) | Bidang | Deskripsi |
---|---|---|---|
0 |
4/8 |
Va Mulai Data Mentah |
Alamat awal templat TLS. Templat adalah blok data yang digunakan untuk menginisialisasi data TLS. Sistem menyalin semua data ini setiap kali utas dibuat, sehingga tidak boleh rusak. Perhatikan bahwa alamat ini bukan RVA; ini adalah alamat yang harus ada relokasi dasar di bagian .reloc. |
4/8 |
4/8 |
VA Akhir Data Mentah |
Alamat byte terakhir TLS, kecuali untuk pengisian nol. Seperti bidang Raw Data Start VA, ini adalah VA, bukan RVA. |
8/16 |
4/8 |
Alamat Indeks |
Lokasi untuk menerima indeks TLS, yang ditetapkan loader. Lokasi ini berada di bagian data biasa, sehingga dapat diberi nama simbolis yang dapat diakses oleh program. |
12/24 |
4/8 |
Alamat Panggilan Balik |
Penunjuk ke array fungsi panggilan balik TLS. Array dihentikan null, jadi jika tidak ada fungsi panggilan balik yang didukung, bidang ini menunjuk ke 4 byte yang diatur ke nol. Untuk informasi tentang prototipe untuk fungsi-fungsi ini, lihat Fungsi Panggilan Balik TLS. |
16/32 |
4 |
Ukuran Isian Nol |
Ukuran dalam byte templat, di luar data yang diinisialisasi yang dibatasi oleh bidang Raw Data Start VA dan Raw Data End VA. Ukuran templat total harus sama dengan ukuran total data TLS dalam file gambar. Pengisian nol adalah jumlah data yang muncul setelah data nonzero yang diinisialisasi. |
20/36 |
4 |
Karakteristik |
Empat bit [23:20] menjelaskan info perataan. Nilai yang mungkin adalah nilai yang didefinisikan sebagai IMAGE_SCN_ALIGN_*, yang juga digunakan untuk menjelaskan perataan bagian dalam file objek. 28 bit lainnya dicadangkan untuk digunakan di masa mendatang. |
Program ini dapat menyediakan satu atau beberapa fungsi panggilan balik TLS untuk mendukung inisialisasi dan penghentian tambahan untuk objek data TLS. Penggunaan umum untuk fungsi panggilan balik seperti itu adalah memanggil konstruktor dan destruktor untuk objek.
Meskipun biasanya tidak ada lebih dari satu fungsi panggilan balik, panggilan balik diimplementasikan sebagai array untuk memungkinkan untuk menambahkan fungsi panggilan balik tambahan jika diinginkan. Jika ada lebih dari satu fungsi panggilan balik, setiap fungsi dipanggil dalam urutan alamatnya muncul dalam array. Penunjuk null mengakhiri array. Sangat valid untuk memiliki daftar kosong (tidak ada panggilan balik yang didukung), dalam hal ini array panggilan balik memiliki tepat satu anggota-penunjuk null.
Prototipe untuk fungsi panggilan balik (ditujukkan oleh penunjuk jenis PIMAGE_TLS_CALLBACK) memiliki parameter yang sama dengan fungsi titik masuk DLL:
typedef VOID
(NTAPI *PIMAGE_TLS_CALLBACK) (
PVOID DllHandle,
DWORD Reason,
PVOID Reserved
);
Parameter Yang Dipesan harus diatur ke nol. Parameter Alasan dapat mengambil nilai berikut:
Pengaturan | Nilai | Deskripsi |
---|---|---|
DLL_PROCESS_ATTACH |
1 |
Proses baru telah dimulai, termasuk utas pertama. |
DLL_THREAD_ATTACH |
2 |
Utas baru telah dibuat. Pemberitahuan ini dikirim untuk semua kecuali utas pertama. |
DLL_THREAD_DETACH |
3 |
Utas akan dihentikan. Pemberitahuan ini dikirim untuk semua kecuali utas pertama. |
DLL_PROCESS_DETACH |
0 |
Proses akan dihentikan, termasuk utas asli. |
Struktur konfigurasi beban (IMAGE_LOAD_CONFIG_DIRECTORY) sebelumnya digunakan dalam kasus yang sangat terbatas dalam sistem operasi Windows NT itu sendiri untuk menggambarkan berbagai fitur yang terlalu sulit atau terlalu besar untuk dijelaskan di header file atau header opsional gambar. Versi linker Microsoft saat ini dan Windows XP dan versi Windows yang lebih baru menggunakan versi baru struktur ini untuk sistem berbasis x86 32-bit yang mencakup teknologi SEH yang dicadangkan. Ini menyediakan daftar penangan pengecualian terstruktur yang aman yang digunakan sistem operasi selama pengiriman pengecualian. Jika alamat handler berada dalam rentang VA gambar dan ditandai sebagai sadar SEH khusus (yaitu, IMAGE_DLLCHARACTERISTICS_NO_SEH jelas di bidang DllCharacteristics dari header opsional, seperti yang dijelaskan sebelumnya), maka handler harus berada dalam daftar handler aman yang diketahui untuk gambar tersebut. Jika tidak, sistem operasi mengakhiri aplikasi. Ini membantu mencegah eksploitasi "pembajakan handler pengecualian x86" yang telah digunakan di masa lalu untuk mengendalikan sistem operasi.
Linker Microsoft secara otomatis menyediakan struktur konfigurasi beban default untuk menyertakan data SEH yang dipesan. Jika kode pengguna sudah menyediakan struktur konfigurasi beban, kode tersebut harus menyertakan bidang SEH baru yang dipesan. Jika tidak, linker tidak dapat menyertakan data SEH yang dipesan dan gambar tidak ditandai sebagai berisi SEH yang dipesan.
Entri direktori data untuk struktur konfigurasi beban SEH yang telah dipesan sebelumnya harus menentukan ukuran tertentu dari struktur konfigurasi beban karena pemuat sistem operasi selalu mengharapkannya menjadi nilai tertentu. Dalam hal ini, ukurannya benar-benar hanya pemeriksaan versi. Untuk kompatibilitas dengan Windows XP dan versi Windows yang lebih lama, ukurannya harus 64 untuk gambar x86.
Struktur konfigurasi beban memiliki tata letak berikut untuk file PE 32-bit dan 64-bit:
Offset | Ukuran | Bidang | Deskripsi |
---|---|---|---|
0 |
4 |
Karakteristik |
Bendera yang menunjukkan atribut file, saat ini tidak digunakan. |
4 |
4 |
TimeDateStamp |
Nilai stempel tanggal dan waktu. Nilai diwakili dalam jumlah detik yang telah berlalu sejak tengah malam (00:00:00), 1 Januari 1970, Universal Coordinated Time, sesuai dengan jam sistem. Stempel waktu dapat dicetak dengan menggunakan fungsi waktu runtime C (CRT). |
8 |
2 |
MajorVersion |
Nomor versi utama. |
10 |
2 |
MinorVersion |
Nomor versi minor. |
12 |
4 |
GlobalFlagsClear |
Loader global ditandai untuk menghapus proses ini saat loader memulai proses. |
16 |
4 |
GlobalFlagsSet |
Loader global ditandai untuk diatur untuk proses ini saat loader memulai proses. |
20 |
4 |
CriticalSectionDefaultTimeout |
Nilai batas waktu default yang digunakan untuk bagian penting proses ini yang ditinggalkan. |
24 |
4/8 |
DeCommitFreeBlockThreshold |
Memori yang harus dibebaskan sebelum dikembalikan ke sistem, dalam byte. |
28/32 |
4/8 |
DeCommitTotalFreeThreshold |
Jumlah total memori gratis, dalam byte. |
32/40 |
4/8 |
LockPrefixTable |
[x86 saja] VA dari daftar alamat tempat awalan LOCK digunakan sehingga dapat diganti dengan NOP pada mesin prosesor tunggal. |
36/48 |
4/8 |
MaximumAllocationSize |
Ukuran alokasi maksimum, dalam byte. |
40/56 |
4/8 |
VirtualMemoryThreshold |
Ukuran memori virtual maksimum, dalam byte. |
44/64 |
4/8 |
ProcessAffinityMask |
Mengatur bidang ini ke nilai bukan nol setara dengan memanggil SetProcessAffinityMask dengan nilai ini selama startup proses (hanya .exe) |
48/72 |
4 |
ProcessHeapFlags |
Proses bendera timbunan yang sesuai dengan argumen pertama fungsi HeapCreate. Bendera ini berlaku untuk tumpukan proses yang dibuat selama startup proses. |
52/76 |
2 |
CSDVersion |
Pengidentifikasi versi paket layanan. |
54/78 |
2 |
DependentLoadFlags |
Bendera beban default yang digunakan saat sistem operasi menyelesaikan impor modul yang ditautkan secara statis. |
56/80 |
4/8 |
EditList |
Dicadangkan untuk digunakan oleh sistem. |
60/88 |
4/8 |
SecurityCookie |
Penunjuk ke cookie yang digunakan oleh implementasi Visual C++ atau GS. |
64/96 |
4/8 |
SEHandlerTable |
[x86 saja] VA tabel RVA yang diurutkan dari setiap handler SE yang valid dan unik dalam gambar. |
68/104 |
4/8 |
SEHandlerCount |
[x86 saja] Jumlah handler unik dalam tabel. |
72/112 |
4/8 |
GuardCFCheckFunctionPointer |
VA tempat penunjuk fungsi pemeriksaan Control Flow Guard disimpan. |
76/120 |
4/8 |
GuardCFDispatchFunctionPointer |
VA tempat penunjuk fungsi pengiriman Control Flow Guard disimpan. |
80/128 |
4/8 |
GuardCFfunctionTable |
VA tabel RVA yang diurutkan dari setiap fungsi Control Flow Guard dalam gambar. |
84/136 |
4/8 |
GuardCFunctionCount |
Jumlah RVA unik dalam tabel di atas. |
88/144 |
4 |
GuardFlags |
Kontrol bendera terkait Flow Guard. |
92/148 |
12 |
CodeIntegrity |
Informasi integritas kode. |
104/160 |
4/8 |
GuardAddressTakenIatEntryTable |
VA tempat alamat Control Flow Guard mengambil tabel IAT disimpan. |
108/168 |
4/8 |
GuardAddressTakenIatEntryCount |
Jumlah RVA unik dalam tabel di atas. |
112/176 |
4/8 |
GuardLongJumpTargetTable |
VA tempat tabel target lompatan panjang Control Flow Guard disimpan. |
116/184 |
4/8 |
GuardLongJumpTargetCount |
Jumlah RVA unik dalam tabel di atas. |
Bidang GuardFlags berisi kombinasi satu atau beberapa bendera dan subbidang berikut:
Modul melakukan pemeriksaan integritas alur kontrol menggunakan dukungan yang disediakan sistem.
#define IMAGE_GUARD_CF_INSTRUMENTED 0x00000100
Modul melakukan alur kontrol dan pemeriksaan integritas tulis.
#define IMAGE_GUARD_CFW_INSTRUMENTED 0x00000200
Modul berisi metadata target alur kontrol yang valid.
#define IMAGE_GUARD_CF_FUNCTION_TABLE_PRESENT 0x00000400
Modul tidak menggunakan cookie keamanan /GS.
#define IMAGE_GUARD_SECURITY_COOKIE_UNUSED 0x00000800
Modul mendukung IAT penundaan baca saja.
#define IMAGE_GUARD_PROTECT_DELAYLOAD_IAT 0x00001000
Tunda muat tabel impor di bagian .didat sendiri (tanpa hal lain di dalamnya) yang dapat dilindungi kembali secara bebas.
#define IMAGE_GUARD_DELAYLOAD_IAT_IN_ITS_OWN_SECTION 0x00002000
Modul berisi informasi ekspor yang ditekan. Ini juga menyimpulkan bahwa alamat yang diambil tabel IAT juga ada dalam konfigurasi beban.
#define IMAGE_GUARD_CF_EXPORT_SUPPRESSION_INFO_PRESENT 0x00004000
Modul memungkinkan penindasan ekspor.
#define IMAGE_GUARD_CF_ENABLE_EXPORT_SUPPRESSION 0x00008000
Modul berisi informasi target longjmp.
#define IMAGE_GUARD_CF_LONGJUMP_TABLE_PRESENT 0x00010000
Masker untuk subbidang yang berisi langkah entri tabel fungsi Control Flow Guard (yaitu, jumlah tambahan byte per entri tabel).
#define IMAGE_GUARD_CF_FUNCTION_TABLE_SIZE_MASK 0xF0000000
Selain itu, header Windows SDK winnt.h menentukan makro ini untuk jumlah bit untuk menggeser kanan nilai GuardFlags untuk membenarkan kanan tabel fungsi Control Flow Guard:
#define IMAGE_GUARD_CF_FUNCTION_TABLE_SIZE_SHIFT 28
Sumber daya diindeks oleh struktur pohon yang diurutkan biner beberapa tingkat. Desain umum dapat menggabungkan 2**31 tingkat. Namun, berdasarkan konvensi, Windows menggunakan tiga tingkat:
- Bahasa Nama Jenis
Serangkaian tabel direktori sumber daya berkaitan dengan semua tingkat dengan cara berikut: Setiap tabel direktori diikuti oleh serangkaian entri direktori yang memberikan nama atau pengidentifikasi (ID) untuk tingkat tersebut (Jenis, Nama, atau Tingkat bahasa) dan alamat deskripsi data atau tabel direktori lain. Jika alamat menunjuk ke deskripsi data, maka data adalah daun di pohon. Jika alamat menunjuk ke tabel direktori lain, maka tabel tersebut mencantumkan entri direktori di tingkat berikutnya ke bawah.
Jenis, Nama, dan ID Bahasa daun ditentukan oleh jalur yang diambil melalui tabel direktori untuk mencapai daun. Tabel pertama menentukan ID Tipe, tabel kedua (diarahkan oleh entri direktori dalam tabel pertama) menentukan ID Nama, dan tabel ketiga menentukan ID Bahasa.
Struktur umum bagian .rsrc adalah:
Data | Deskripsi |
---|---|
Tabel Direktori Sumber Daya (dan Entri Direktori Sumber Daya) |
Serangkaian tabel, satu untuk setiap grup simpul di pohon. Semua simpul tingkat atas (Jenis) tercantum dalam tabel pertama. Entri dalam tabel ini menunjuk ke tabel tingkat kedua. Setiap pohon tingkat kedua memiliki ID Jenis yang sama tetapi ID Nama yang berbeda. Pohon tingkat ketiga memiliki ID Jenis dan Nama yang sama tetapi ID Bahasa yang berbeda. Setiap tabel individu segera diikuti oleh entri direktori, di mana setiap entri memiliki nama atau pengidentifikasi numerik dan penunjuk ke deskripsi data atau tabel di tingkat bawah berikutnya. |
String Direktori Sumber Daya |
Untai (karakter) Unicode selaras dua byte, yang berfungsi sebagai data string yang diarahkan oleh entri direktori. |
Deskripsi Data Sumber Daya |
Array rekaman, yang ditujukkan menurut tabel, yang menjelaskan ukuran aktual dan lokasi data sumber daya. Catatan ini adalah daun di pohon deskripsi sumber daya. |
Data Sumber Daya |
Data mentah dari bagian sumber daya. Informasi ukuran dan lokasi di bidang Deskripsi Data Sumber Daya memisahkan masing-masing wilayah data sumber daya. |
Setiap tabel direktori sumber daya memiliki format berikut. Struktur data ini harus dianggap sebagai judul tabel karena tabel sebenarnya terdiri dari entri direktori (dijelaskan dalam bagian 6.9.2, "Entri Direktori Sumber Daya") dan struktur ini:
Offset | Ukuran | Bidang | Deskripsi |
---|---|---|---|
0 |
4 |
Karakteristik |
Bendera sumber daya. Bidang ini dicadangkan untuk digunakan di masa mendatang. Saat ini diatur ke nol. |
4 |
4 |
Stempel Waktu/Tanggal |
Waktu data sumber daya dibuat oleh pengkompilasi sumber daya. |
8 |
2 |
Versi Utama |
Nomor versi utama, diatur oleh pengguna. |
10 |
2 |
Versi Minor |
Nomor versi minor, diatur oleh pengguna. |
12 |
2 |
Jumlah Entri Nama |
Jumlah entri direktori segera mengikuti tabel yang menggunakan string untuk mengidentifikasi entri Tipe, Nama, atau Bahasa (tergantung pada tingkat tabel). |
14 |
2 |
Jumlah Entri ID |
Jumlah entri direktori segera mengikuti entri Nama yang menggunakan ID numerik untuk entri Tipe, Nama, atau Bahasa. |
Entri direktori membentuk baris tabel. Setiap entri direktori sumber daya memiliki format berikut. Apakah entri adalah entri Nama atau ID ditunjukkan oleh tabel direktori sumber daya, yang menunjukkan berapa banyak entri Nama dan ID yang mengikutinya (ingat bahwa semua entri Nama mendahului semua entri ID untuk tabel). Semua entri untuk tabel diurutkan dalam urutan naik: entri Nama menurut string peka huruf besar/kecil dan entri ID menurut nilai numerik. Offset relatif terhadap alamat di IMAGE_DIRECTORY_ENTRY_RESOURCE DataDirectory. Lihat Peering Di Dalam PE: Tur Format File Eksekusi Portabel Win32 untuk informasi selengkapnya.
Offset | Ukuran | Bidang | Deskripsi |
---|---|---|---|
0 |
4 |
Offset Nama |
Offset string yang memberikan entri Jenis, Nama, atau ID Bahasa, tergantung pada tingkat tabel. |
0 |
4 |
ID bilangan bulat |
Bilangan bulat 32-bit yang mengidentifikasi entri Tipe, Nama, atau ID Bahasa. |
4 |
4 |
Offset Entri Data |
Bit tinggi 0. Alamat entri Data Sumber Daya (daun). |
4 |
4 |
Offset Subdirektori |
Bit tinggi 1. 31 bit yang lebih rendah adalah alamat tabel direktori sumber daya lain (tingkat berikutnya ke bawah). |
Area string direktori sumber daya terdiri dari string Unicode, yang selaras dengan kata. String ini disimpan bersama-sama setelah entri Resource Directory terakhir dan sebelum entri Data Sumber Daya pertama. Ini meminimalkan dampak string panjang variabel ini pada penyelarasan entri direktori ukuran tetap. Setiap string direktori sumber daya memiliki format berikut:
Offset | Ukuran | Bidang | Deskripsi |
---|---|---|---|
0 |
2 |
Panjangnya |
Ukuran string, tidak termasuk bidang panjang itu sendiri. |
2 |
variabel |
Untai (karakter) Unicode |
Data string Unicode dengan panjang variabel, diratakan kata. |
Setiap entri Data Sumber Daya menjelaskan unit aktual data mentah di area Data Sumber Daya. Entri Data Sumber Daya memiliki format berikut:
Offset | Ukuran | Bidang | Deskripsi |
---|---|---|---|
0 |
4 |
Data RVA |
Alamat unit data sumber daya di area Data Sumber Daya. |
4 |
4 |
Tingginya |
Ukuran, dalam byte, dari data sumber daya yang ditujukkan oleh bidang RVA Data. |
8 |
4 |
Halaman kode |
Halaman kode yang digunakan untuk mendekode nilai titik kode dalam data sumber daya. Biasanya, halaman kode akan menjadi halaman kode Unicode. |
12 |
4 |
Dicadangkan, harus 0. |
Metadata CLR disimpan di bagian ini. Ini digunakan untuk menunjukkan bahwa file objek berisi kode terkelola. Format metadata tidak didokumentasikan, tetapi dapat diserahkan ke antarmuka CLR untuk menangani metadata.
Handler pengecualian objek yang valid tercantum di bagian .sxdata objek tersebut. Bagian ditandai IMAGE_SCN_LNK_INFO. Ini berisi indeks simbol COFF dari setiap handler yang valid, menggunakan 4 byte per indeks.
Selain itu, pengkompilasi menandai objek COFF sebagai SEH terdaftar dengan memancarkan simbol absolut "@feat.00" dengan LSB bidang nilai yang diatur ke 1. Objek COFF tanpa handler SEH terdaftar akan memiliki simbol "@feat.00", tetapi tidak ada bagian .sxdata .
- Tanda Tangan File Arsip
- Header Anggota Arsip
- Anggota Penghubung Pertama
- Anggota Penghubung Kedua
- Anggota Nama Panjang
Format arsip COFF menyediakan mekanisme standar untuk menyimpan koleksi file objek. Koleksi ini biasanya disebut pustaka dalam dokumentasi pemrograman.
8 byte pertama arsip terdiri dari tanda tangan file. Sisa arsip terdiri dari serangkaian anggota arsip, sebagai berikut:
Anggota pertama dan kedua adalah "anggota linker." Masing-masing anggota ini memiliki formatnya sendiri seperti yang dijelaskan di bagian Impor Jenis Nama. Biasanya, linker menempatkan informasi ke dalam anggota arsip ini. Anggota linker berisi direktori arsip.
Anggota ketiga adalah anggota "nama panjang". Anggota opsional ini terdiri dari serangkaian string ASCII null-terminated di mana setiap string adalah nama anggota arsip lain.
Sisa arsip terdiri dari anggota standar (file objek). Masing-masing anggota ini berisi konten satu file objek secara keseluruhan.
Header anggota arsip mendahului setiap anggota. Daftar berikut menunjukkan struktur umum arsip:
Tanda tangan :"!<arch>\n" |
---|
Header |
---|
Anggota Linker ke-1 |
Header |
---|
Anggota Linker Ke-2 |
Header |
---|
Anggota Nama Panjang |
Header |
---|
Isi File OBJ 1 (Format COFF) |
Header |
---|
Isi File OBJ 2 (Format COFF) |
...
Header |
---|
Isi FILE OBJ N (Format COFF) |
Tanda tangan file arsip mengidentifikasi jenis file. Utilitas apa pun (misalnya, linker) yang mengambil file arsip sebagai input dapat memeriksa jenis file dengan membaca tanda tangan ini. Tanda tangan terdiri dari karakter ASCII berikut, di mana setiap karakter di bawah ini diwakili secara harfiah, kecuali untuk karakter baris baru (\n):
!<arch>\n
Header Windows SDK winnt.h menentukan makro berikut:
#define IMAGE_ARCHIVE_START_SIZE 8
#define IMAGE_ARCHIVE_START "!<arch>\n"
#define IMAGE_ARCHIVE_END "`\n"
#define IMAGE_ARCHIVE_PAD "\n"
#define IMAGE_ARCHIVE_LINKER_MEMBER "/ "
#define IMAGE_ARCHIVE_LONGNAMES_MEMBER "// "
#define IMAGE_ARCHIVE_HYBRIDMAP_MEMBER "/<HYBRIDMAP>/ "
Setiap anggota (linker, nama panjang, atau anggota file objek) didahului oleh header. Header anggota arsip memiliki format berikut, di mana setiap bidang adalah string teks ASCII yang dibiarkan dibenarkan dan diisi dengan spasi ke akhir bidang. Tidak ada penghentian karakter null di salah satu bidang ini.
Setiap header anggota dimulai pada alamat genap pertama setelah akhir anggota arsip sebelumnya, satu byte '\n' (IMAGE_ARCHIVE_PAD) dapat dimasukkan setelah anggota arsip untuk membuat anggota berikut dimulai pada alamat genap.
Offset | Ukuran | Bidang | Deskripsi |
---|---|---|---|
0 |
16 |
Nama |
Nama anggota arsip, dengan garis miring (/) ditambahkan untuk mengakhiri nama. Jika karakter pertama adalah garis miring, namanya memiliki interpretasi khusus, seperti yang dijelaskan dalam tabel berikut. |
16 |
12 |
Tanggal |
Tanggal dan waktu anggota arsip dibuat: Ini adalah representasi desimal ASCII dari jumlah detik sejak 1/1/1970 UCT. |
28 |
6 |
ID Pengguna |
Representasi desimal ASCII dari ID pengguna. Bidang ini tidak berisi nilai yang bermakna pada platform Windows karena alat Microsoft memancarkan semua kosong. |
34 |
6 |
ID Grup |
Representasi desimal ASCII dari ID grup. Bidang ini tidak berisi nilai yang bermakna pada platform Windows karena alat Microsoft memancarkan semua kosong. |
40 |
8 |
Modus |
Representasi oktal ASCII dari mode file anggota. Ini adalah nilai ST_MODE dari fungsi run-time C _wstat. |
48 |
10 |
Tingginya |
Representasi desimal ASCII dari ukuran total anggota arsip, tidak termasuk ukuran header. |
58 |
2 |
Akhir Header |
Dua byte (0x60 0x0A) dalam string C "'\n" (IMAGE_ARCHIVE_END). |
Bidang Nama memiliki salah satu format yang diperlihatkan dalam tabel berikut ini. Seperti disebutkan sebelumnya, masing-masing string ini dibiarkan dibenarkan dan diisi dengan spasi berikutnya dalam bidang 16 byte:
Isi bidang Nama | Deskripsi |
---|---|
Nama/ |
Nama anggota arsip. |
/ |
Anggota arsip adalah salah satu dari dua anggota linker. Kedua anggota linker memiliki nama ini. |
// |
Anggota arsip adalah anggota nama panjang, yang terdiri dari serangkaian string ASCII yang dihentikan null. Anggota nama panjang adalah anggota arsip ketiga dan bersifat opsional. |
/n |
Nama anggota arsip terletak di offset n dalam anggota nama panjang. Angka n adalah representasi desimal dari offset. Misalnya: "/26" menunjukkan bahwa nama anggota arsip terletak 26 byte di luar awal konten anggota nama panjang. |
Nama anggota linker pertama adalah "/" (IMAGE_ARCHIVE_LINKER_MEMBER). Anggota linker pertama disertakan untuk kompatibilitas mundur. Ini tidak digunakan oleh linker saat ini, tetapi formatnya harus benar. Anggota linker ini menyediakan direktori nama simbol, seperti halnya anggota linker kedua. Untuk setiap simbol, informasi menunjukkan tempat menemukan anggota arsip yang berisi simbol .
Anggota linker pertama memiliki format berikut. Informasi ini muncul setelah header:
Offset | Ukuran | Bidang | Deskripsi |
---|---|---|---|
0 |
4 |
Jumlah Simbol |
Panjang tidak ditandatangani yang berisi jumlah simbol terindeks. Angka ini disimpan dalam format big-endian. Setiap anggota file objek biasanya mendefinisikan satu atau beberapa simbol eksternal. |
4 |
4 * n |
Offset |
Array file mengimbangi untuk mengarsipkan header anggota, di mana n sama dengan bidang Jumlah Simbol. Setiap angka dalam array adalah panjang yang tidak ditandatangani yang disimpan dalam format big-endian. Untuk setiap simbol yang dinamai dalam tabel string, elemen yang sesuai dalam array offset memberikan lokasi anggota arsip yang berisi simbol . |
* |
* |
Tabel String |
Serangkaian string null-terminated yang menamai semua simbol dalam direktori. Setiap string dimulai segera setelah karakter null di string sebelumnya. Jumlah string harus sama dengan nilai bidang Jumlah Simbol. |
Elemen dalam array offset harus diatur dalam urutan naik. Fakta ini menyiratkan bahwa simbol dalam tabel string harus diatur sesuai dengan urutan anggota arsip. Misalnya, semua simbol dalam anggota file objek pertama harus dicantumkan sebelum simbol dalam file objek kedua.
Seperti anggota linker pertama, anggota linker kedua memiliki nama "/" (IMAGE_ARCHIVE_LINKER_MEMBER). Meskipun kedua anggota linker menyediakan direktori simbol dan anggota arsip yang berisi mereka, anggota linker kedua digunakan sebagai preferensi untuk yang pertama oleh semua linker saat ini. Anggota linker kedua menyertakan nama simbol dalam urutan leksikal, yang memungkinkan pencarian lebih cepat berdasarkan nama.
Anggota kedua memiliki format berikut. Informasi ini muncul setelah header:
Offset | Ukuran | Bidang | Deskripsi |
---|---|---|---|
0 |
4 |
Jumlah Anggota |
Panjang yang tidak ditandatangani yang berisi jumlah anggota arsip. |
4 |
4 * m |
Offset |
Array offset file untuk mengarsipkan header anggota, disusun dalam urutan naik. Setiap offset adalah panjang yang tidak ditandatangani . Angka m sama dengan nilai bidang Jumlah Anggota. |
* |
4 |
Jumlah Simbol |
Panjang yang tidak ditandatangani yang berisi jumlah simbol yang diindeks. Setiap anggota file objek biasanya mendefinisikan satu atau beberapa simbol eksternal. |
* |
2 * n |
Indeks |
Array indeks berbasis 1 (pendek tidak ditandatangani ) yang memetakan nama simbol untuk mengarsipkan offset anggota. Angka n sama dengan bidang Jumlah Simbol. Untuk setiap simbol yang dinamai dalam tabel string, elemen yang sesuai dalam array Indeks memberikan indeks ke dalam array offset. Array offset, pada gilirannya, memberikan lokasi anggota arsip yang berisi simbol . |
* |
* |
Tabel String |
Serangkaian string null-terminated yang menamai semua simbol dalam direktori. Setiap string dimulai segera setelah byte null di string sebelumnya. Jumlah string harus sama dengan nilai bidang Jumlah Simbol. Tabel ini mencantumkan semua nama simbol dalam urutan leksikal naik. |
Nama anggota nama panjang adalah "//" (IMAGE_ARCHIVE_LONGNAMES_MEMBER). Anggota nama panjang adalah serangkaian string nama anggota arsip. Nama muncul di sini hanya ketika ada ruang yang tidak mencukupi di bidang Nama (16 byte). Anggota nama panjang bersifat opsional. Ini bisa kosong hanya dengan header, atau bisa benar-benar tidak ada tanpa header.
String dihentikan null. Setiap string dimulai segera setelah byte null di string sebelumnya.
Pustaka impor tradisional, yaitu pustaka yang menjelaskan ekspor dari satu gambar untuk digunakan oleh gambar lain, biasanya mengikuti tata letak yang dijelaskan di bagian 7, Format File Arsip (Pustaka). Perbedaan utamanya adalah bahwa anggota pustaka impor berisi file objek pseudo alih-alih file asli, di mana setiap anggota menyertakan kontribusi bagian yang diperlukan untuk membangun tabel impor yang dijelaskan di bagian 6.4, Bagian .idata Linker menghasilkan arsip ini saat membangun aplikasi ekspor.
Kontribusi bagian untuk impor dapat disimpulkan dari sekumpulan informasi kecil. Linker dapat menghasilkan informasi verbose lengkap ke pustaka impor untuk setiap anggota pada saat pembuatan pustaka atau hanya menulis informasi kanonis ke pustaka dan membiarkan aplikasi yang nantinya menggunakannya menghasilkan data yang diperlukan dengan cepat.
Di pustaka impor dengan format panjang, satu anggota berisi informasi berikut:
- Header anggota arsip
- Header file
- Header bagian
- Data yang sesuai dengan setiap header bagian
- Tabel simbol COFF
- String
Sebaliknya, pustaka impor singkat ditulis sebagai berikut:
- Header anggota arsip
- Impor header
- String nama impor null-terminated
- String nama DLL null-terminated
Ini adalah informasi yang cukup untuk secara akurat membangun kembali seluruh konten anggota pada saat penggunaannya.
Header impor berisi bidang dan offset berikut:
Offset | Ukuran | Bidang | Deskripsi |
---|---|---|---|
0 |
2 |
Sig1 |
Harus IMAGE_FILE_MACHINE_UNKNOWN. Untuk informasi selengkapnya, lihat Jenis Mesin. |
2 |
2 |
Sig2 |
Pasti 0xFFFF. |
4 |
2 |
Versi |
Versi struktur. |
6 |
2 |
Mesin |
Jumlah yang mengidentifikasi jenis komputer target. Untuk informasi selengkapnya, lihat Jenis Mesin. |
8 |
4 |
Stempel Tanggal Waktu |
Waktu dan tanggal file dibuat. |
12 |
4 |
Ukuran data |
Ukuran string yang mengikuti header. |
16 |
2 |
Ordinal/Petunjuk |
Baik ordinal atau petunjuk untuk impor, ditentukan oleh nilai di bidang Jenis Nama. |
18 |
2 bit |
Ketikkan |
Jenis impor. Untuk nilai dan deskripsi tertentu, lihat Jenis Impor. |
3 bit |
Jenis Nama |
Jenis nama impor. Untuk informasi selengkapnya, lihat Mengimpor Jenis Nama. |
|
11 bit |
Dipesan |
Dicadangkan, harus 0. |
Struktur ini diikuti oleh dua string yang dihentikan null yang menjelaskan nama simbol yang diimpor dan DLL asalnya.
Nilai berikut didefinisikan untuk bidang Jenis di header impor:
Terus-menerus | Nilai | Deskripsi |
---|---|---|
IMPORT_OBJECT_CODE |
0 |
Kode yang dapat dieksekusi. |
IMPORT_OBJECT_DATA |
1 |
Data. |
IMPORT_OBJECT_CONST |
2 |
Ditentukan sebagai CONST dalam file .def. |
Nilai-nilai ini digunakan untuk menentukan kontribusi bagian mana yang harus dihasilkan oleh alat yang menggunakan pustaka jika harus mengakses data tersebut.
Nama simbol impor yang dihentikan null segera mengikuti header impor terkait. Nilai berikut didefinisikan untuk bidang Tipe Nama di header impor. Mereka menunjukkan bagaimana nama akan digunakan untuk menghasilkan simbol yang benar yang mewakili impor:
Terus-menerus | Nilai | Deskripsi |
---|---|---|
IMPORT_OBJECT_ORDINAL | 0 | Impornya bersifat ordinal. Ini menunjukkan bahwa nilai di bidang Ordinal/Petunjuk header impor adalah ordinal impor. Jika konstanta ini tidak ditentukan, maka bidang Ordinal/Petunjuk harus selalu ditafsirkan sebagai petunjuk impor. |
IMPORT_OBJECT_NAME | 1 | Nama impor identik dengan nama simbol publik. |
IMPORT_OBJECT_NAME_NOPREFIX | 2 | Nama impor adalah nama simbol publik, tetapi melewatkan yang di depan ?, @, atau secara opsional _. |
IMPORT_OBJECT_NAME_UNDECORATE | 3 | Nama impor adalah nama simbol publik, tetapi melewati di depan ?, @, atau opsional _, dan memotong pada @pertama. |
Beberapa sertifikat atribut diharapkan digunakan untuk memverifikasi integritas gambar. Namun, yang paling umum adalah tanda tangan Authenticode. Tanda tangan Authenticode dapat digunakan untuk memverifikasi bahwa bagian yang relevan dari file gambar PE belum diubah dengan cara apa pun dari formulir asli file. Untuk menyelesaikan tugas ini, tanda tangan Authenticode berisi sesuatu yang disebut hash gambar PE
Singkatnya hash gambar Authenticode PE, atau hash file, mirip dengan checksum file karena menghasilkan nilai kecil yang berkaitan dengan integritas file. Checksum diproduksi oleh algoritma sederhana dan digunakan terutama untuk mendeteksi kegagalan memori. Artinya, ini digunakan untuk mendeteksi apakah blok memori pada disk telah buruk dan nilai yang disimpan di sana telah rusak. Hash file mirip dengan checksum karena juga mendeteksi kerusakan file. Namun, tidak seperti kebanyakan algoritma checksum, sangat sulit untuk memodifikasi file sehingga memiliki hash file yang sama dengan bentuk aslinya (tidak dimodifikasi). Artinya, checksum dimaksudkan untuk mendeteksi kegagalan memori sederhana yang menyebabkan kerusakan, tetapi hash file dapat digunakan untuk mendeteksi modifikasi yang disengaja dan bahkan halus pada file, seperti yang diperkenalkan oleh virus, peretas, atau program kuda Troya.
Dalam tanda tangan Authenticode, hash file ditandatangani secara digital dengan menggunakan kunci privat yang hanya diketahui oleh penanda tangan file. Konsumen perangkat lunak dapat memverifikasi integritas file dengan menghitung nilai hash file dan membandingkannya dengan nilai hash yang ditandatangani yang terkandung dalam tanda tangan digital Authenticode. Jika hash file tidak cocok, bagian dari file yang dicakup oleh hash gambar PE telah dimodifikasi.
Tidak dimungkinkan atau diinginkan untuk menyertakan semua data file gambar dalam perhitungan hash gambar PE. Terkadang hanya menyajikan karakteristik yang tidak diinginkan (misalnya, informasi penelusuran kesalahan tidak dapat dihapus dari file yang dirilis secara publik); kadang-kadang itu tidak mungkin. Misalnya, tidak dimungkinkan untuk menyertakan semua informasi dalam file gambar dalam tanda tangan Authenticode, lalu menyisipkan tanda tangan Authenticode yang berisi hash gambar PE tersebut ke dalam gambar PE, dan nantinya dapat menghasilkan hash gambar PE yang identik dengan menyertakan semua data file gambar dalam perhitungan lagi, karena file sekarang berisi tanda tangan Authenticode yang awalnya tidak ada.
Bagian ini menjelaskan bagaimana hash gambar PE dihitung dan bagian mana dari gambar PE yang dapat dimodifikasi tanpa membatalkan tanda tangan Authenticode.
Catatan
Hash gambar PE untuk file tertentu dapat disertakan dalam file katalog terpisah tanpa menyertakan sertifikat atribut dalam file yang di-hash. Ini relevan, karena menjadi mungkin untuk membatalkan hash gambar PE dalam file katalog yang ditandatangani Authenticode dengan memodifikasi gambar PE yang sebenarnya tidak berisi tanda tangan Authenticode.
Semua data di bagian gambar PE yang ditentukan dalam tabel bagian di-hash secara keseluruhan kecuali untuk rentang pengecualian berikut:
Bidang CheckSum file dari bidang khusus Windows dari header opsional. Checksum ini mencakup seluruh file (termasuk sertifikat atribut apa pun dalam file). Dalam semua kemungkinan, checksum akan berbeda dari nilai asli setelah menyisipkan tanda tangan Authenticode.
Informasi yang terkait dengan sertifikat atribut. Area gambar PE yang terkait dengan tanda tangan Authenticode tidak disertakan dalam perhitungan hash gambar PE karena tanda tangan Authenticode dapat ditambahkan atau dihapus dari gambar tanpa memengaruhi integritas gambar secara keseluruhan. Ini bukan masalah, karena ada skenario pengguna yang bergantung pada penandatanganan ulang gambar PE atau menambahkan stempel waktu. Authenticode mengecualikan informasi berikut dari perhitungan hash:
Bidang Tabel Sertifikat dari direktori data header opsional.
Tabel Sertifikat dan sertifikat terkait yang ditujukkan oleh bidang Tabel Sertifikat yang tercantum tepat di atas.
Untuk menghitung hash gambar PE, Authenticode mengurutkan bagian yang ditentukan dalam tabel bagian menurut rentang alamat, lalu hash urutan byte yang dihasilkan, melewati rentang pengecualian.
Informasi sebelumnya dari akhir bagian terakhir. Area yang melewati bagian terakhir (didefinisikan oleh offset tertinggi) tidak di-hash. Area ini biasanya berisi informasi debug. Informasi debug umumnya dapat dianggap sebagai nasihat kepada debugger; ini tidak mempengaruhi integritas aktual dari program yang dapat dieksekusi. Sangat mungkin untuk menghapus informasi debug dari gambar setelah produk dikirimkan dan tidak memengaruhi fungsionalitas program. Bahkan, ini kadang-kadang dilakukan sebagai ukuran penghematan disk. Perlu dicatat bahwa informasi debug yang terkandung dalam bagian yang ditentukan dari Gambar PE tidak dapat dihapus tanpa membatalkan tanda tangan Authenticode.
Anda dapat menggunakan alat makecert dan signtool yang disediakan di SDK Platform Windows untuk bereksperimen dengan membuat dan memverifikasi tanda tangan Authenticode. Untuk informasi selengkapnya, lihat Referensi, di bawah ini.
Unduhan dan alat untuk Windows (termasuk Windows SDK)
Membuat, Menampilkan, dan Mengelola Sertifikat
Panduan Penandatanganan Kode Mode Kernel (.doc)
Format Tanda Tangan Eksekusi Portabel Windows Authenticode (.docx)