2013-10-15 6 views
6

Nei nostri file ELF generati tramite GCC linker, la parte superiore del file ELF è sempre l'identificativo di versione del codice eseguibile.Forzare un simbolo all'inizio di un file ELF

Questo si ottiene creando il file version.c e rendendo il file oggetto risultante il primo oggetto collegabile nel comando di collegamento.

Tuttavia, per un eseguibile questo non ha funzionato e l'unica differenza che possiamo trovare è che l'eseguibile contiene una combinazione di codice C e C++ e il simbolo della versione è stato trasferito altrove.

La domanda è quindi esiste un modo per garantire la posizione assoluta di un simbolo in un file ELF in modo tale che un simbolo si trovi sempre nella parte superiore del file tramite comandi del linker o direttive dell'attributo del codice?

+0

E a proposito di utilizzare 7 byte inutilizzati tra ['e_ident [EI_ABIVERSION] e e_type'] (http://en.wikipedia.org/wiki/Executable_and_Linkable_Format)? :) – Kamiccolo

+0

Suppongo che stai usando il linker GNU? Se è così, viene fornito con script che possono essere modificati secondo i tuoi gusti. Non penso che potresti cambiare lo script per forzare un simbolo in una posizione specifica, tuttavia, potresti creare una sezione speciale .appversion e assicurarti che questa nuova sezione appaia per prima. Ora non chiedermi come fare tutto questo ... So solo che puoi farlo. –

+0

Gli script di linker sembrano un'opzione, anche se come dici tu non è chiaro su come usarli per mettere un simbolo nella parte superiore del file ELF. Il mistero è perché questo si sta verificando. In precedenza, l'ordine dei collegamenti decise di posizionare i simboli. L'inclusione di una libreria C++ sembra aver influito su questo. Non so se il codice dell'oggetto C++ abbia requisiti speciali in termini di ordinamento ELF – user2881914

risposta

0

Nella parte superiore del file ELF deve essere la firma magica 0x7f, 'E', 'L', 'F' in base allo ELF specification. Invece di mettere la propria versione del codice nella parte superiore del file eseguibile, suppongo è possibile utilizzare alcuni campi unsignificant da intestazione Elf, per esempio ei_pad

struct E_Ident { 
    unsigned long ei_magic;  
    unsigned char ei_class;   
    unsigned char ei_data;   
    unsigned char ei_version;  
    unsigned char ei_pad[9];  
}; 
1

È possibile controllare l'output del linker tramite script. Nel tuo caso puoi controllare: https://sourceware.org/binutils/docs/ld/SECTIONS.html#SECTIONS per una possibile soluzione.

Ad esempio:

SECTIONS { 
    .version 0x2020 : { version.o } 
    .text : { *(.text) } 
    .data : { *(.data) } 
    .bss : { *(.bss) *(COMMON) } 
} 

Questo non controlla dove le sezioni verranno visualizzati esattamente nella eseguibile collegato, ma potrebbe influenzarlo (lo fa di certo quando si tratta di immagini ROM), dovrete per sperimentare te stesso.

Problemi correlati