2013-10-19 20 views
5

Ho appena iniziato a imparare alcuni programmi ARM e sono rimasto bloccato in un problema leggermente fastidioso. La toolchain che sto usando per compilare le mie fonti è Sourcery CodeBench Lite 2013.05-23 (può essere trovato qui: https://sourcery.mentor.com/GNUToolchain/release2449)GCC: come dire a GCC di inserire la funzione 'main' all'inizio della sezione .text?

Quello che mi serve è dire a GCC o LD o OBJCOPY di inserire il bytecode compilato del 'main 'funzione all'inizio della sezione .text.

Esiste un modo per raggiungere questo obiettivo? (Forse attraverso uno script del linker?)

Grazie

risposta

8

ha risolto il problema. Per chi deve affrontare è:

  • Quando si compila con GCC, aggiungere le -ffunction sezioni opzione nella riga di comando. Questo indicherà a GCC di inserire ciascuna funzione in una sezione separata. Il formato del nome della sezione sarà .text. # Nome funzione #, senza # (ovvero, se la funzione appartiene alla sezione .text [che per impostazione predefinita è true]).
  • In secondo luogo, utilizzare uno script linker per ordinare queste "sezioni funzionali" nella sezione finale grande .text. A titolo di esempio, mettendo la principale funzione di all'inizio della sezione .text si tradurrebbe in uno script LD che sembra circa come questo:

    ENTRY(main) 
    SECTIONS 
    { 
        .text : 
        { 
         *(.text.main); 
         *(.text*); 
        } 
    } 
    
+2

È inoltre possibile utilizzare: 'int main (int argc, char ** argv) __attribute __ ((la sezione (". text.main ")));' e mantieni il resto nella sezione predefinita. –

1

Si può anche solo mettere 'principale' nel suo propria sezione con un __attribute__:

void main (void) __attribute__ ((section ("entry"))); 

e poi nel file ld:

ENTRY(main) 
SECTIONS 
{ 
    .text : 
    { 
     *(main) 
     *(.text) 
    } 
} 

Ci sono molte altre interessanti __attributes__, saperne di più su di loro qui: http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html

+0

Il tipo di ritorno corretto per 'main' è' int', non 'void'. ('Void main (void)' potrebbe essere consentito da alcuni compilatori; 'int main (void)' è universale per implementazioni ospitati.) –

+3

era solo un esempio sull'utilizzo '__attributes__' - non so quanto il suo aspetto come principali:) – ordahan

1

In primo luogo, vedere come è la sezione .text definito script predefinito del linker del GCC (in modo da non dover fare il proprio), chiamandolo come:

gcc -Wl,-verbose 

che stamperà lo script del linker predefinito. La mia mostra questo per la sezione .text:

/* text: Program code section */ 
    .text : 
    { 
    *(.text) 
    *(.text.*) 
    *(.gnu.linkonce.t.*) 
    } 

Quindi, al fine di avere la funzione "principale" essere il primo nella sezione .text (e il resto essere contigue), è necessario impostare la "sezione" attributo per tutte le altre funzioni. Ad esempio:

È sufficiente "attribuire" i prototipi di funzione. In questo modo, quando si compila ora, la funzione "main" sarà la prima nella sezione ".text" e tutti gli altri seguiranno gli indirizzi immediatamente consecutivi.

Se si desidera posizionare la sezione ".text" (ad es.la funzione "main") ad un indirizzo specifico (ad esempio 0x1000), ricordate di collegare con:

gcc .... -Wl,-Ttext=0x1000 
+0

Anche se questo funzionerà, l'aggiunta di una sezione per tutte le altre funzioni è ben lungi dall'essere il modo più semplice - si veda la risposta accettata per una soluzione più semplice. – mdma