2013-09-25 10 views

risposta

26
  • .rdata è per i dati const. È la versione di sola lettura del segmento .data.

  • .idata contiene la directory di importazione (.edata per le esportazioni). Viene utilizzato da EXE e DLL per designare le funzioni importate ed esportate. Vedere le specifiche del formato PE (http://msdn.microsoft.com/library/windows/hardware/gg463125) per i dettagli.

Riassumendo nomi dei segmenti tipici:

.text: Code 
.data: Initialized data 
.bss: Uninitialized data 
.rdata: Const/read-only (and initialized) data 
.edata: Export descriptors 
.idata: Import descriptors 
.reloc: Relocation table (for code instructions with absolute addressing when 
      the module could not be loaded at its preferred base address) 
.rsrc: Resources (icon, bitmap, dialog, ...) 
.tls: __declspec(thread) data (Fails with dynamically loaded DLLs -> hard to find bugs) 

Come Martin Rosenau cita, i nomi dei segmenti sono tipici solo. Il vero tipo di segmento è specificato nell'intestazione del segmento o è definito dall'utilizzo dei dati memorizzati nel segmento.

4

Infatti, i nomi dei segmenti vengono ignorati da Windows.

Esistono linker che utilizzano nomi di segmenti diversi ed è persino possibile memorizzare i descrittori di importazione, i descrittori di esportazione, le risorse ecc. Nel segmento ".text" anziché utilizzare segmenti separati.

Tuttavia sembra essere più semplice creare sezioni separate per tali metadati in modo che molti linker utilizzino sezioni separate.

Ciò significa: Sezioni ".idata", ".rdata", ".rsrc", ... do non contengono dati del programma (anche se il loro nome termina con 'dati'), ma contengono meta-informazioni che sono utilizzato dal sistema operativo. La sezione ".rsrc" per esempio contiene informazioni sull'icona che viene mostrata quando si guarda il file eseguibile in Explorer.

".idata" contiene informazioni su tutti i file DLL richiesti dal programma.