2013-10-19 12 views
5

Właśnie zacząłem uczyć się programowania ARM i utknąłem w lekko irytującym problemie. Toolchain używam skompilować swoje źródła jest Sourcery CodeBench Lite 2013.05-23 (można znaleźć tutaj: https://sourcery.mentor.com/GNUToolchain/release2449)GCC: jak powiedzieć GCC, aby umieścić funkcję "główną" na początku sekcji .text?

Co muszę to powiedzieć GCC lub LD lub objcopy umieścić skompilowanego kodu bajtowego zasady „Głównym "funkcja na początku sekcji .text.

Czy jest jakiś sposób, aby to osiągnąć? (Być może przez skrypt linkera?)

Dziękuję

Odpowiedz

8

rozwiązało problem. Bo kto stoi go:

  • Podczas kompilacji z GCC, dodaj -ffunction poprzecznych opcji w linii poleceń. To powie GCC, aby umieścić każdą funkcję w osobnej sekcji. Format nazwy sekcji będzie następujący: .text. # Nazwa funkcji #, bez # (to znaczy, jeśli funkcja należy do sekcji .text [która domyślnie jest prawdą]).
  • Po drugie, użyj skryptu linkera, aby zamówić te "sekcje funkcyjne" w ostatniej dużej sekcji tekstowej. Jako przykład, kładąc główny funkcję na początku sekcji .text skutkowałoby skrypcie LD, który wygląda mniej więcej tak:

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

Można również użyć: „int main (int argc, char ** argv) __attribute __ ((sekcja (”. text.main "))); i zachowaj resztę w domyślnej sekcji. –

1

Można też po prostu umieścić „głównym” w jego własny odcinek za pomocą __attribute__:

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

a następnie w pliku ld:

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

Istnieje wiele innych ciekawych __attributes__, przeczytaj więcej o nich tutaj: http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html

+0

Poprawnym typem zwracania dla 'main' jest' int', a nie 'void'. ("void main (void)" może być dozwolone przez niektóre kompilatory; 'int main (void)' jest uniwersalne dla hostowanych implementacji.) –

+3

Był tylko przykładem użycia '__attributes__' - nie wiem jak wygląda jego główna wersja:) – ordahan

1

pierwsze, zobaczyć jak to jest sekcja .text zdefiniowane w skrypcie linkera swojej domyślnej GCC (więc nie trzeba wprowadzać własne), przez wywołanie go jako:

gcc -Wl,-verbose 

, który wydrukuje domyślny skrypt linkera. Kopalnia pokazuje to dla .text odcinku:

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

Tak więc w celu uzyskania „głównym” funkcja być pierwszym w sekcji .text (i reszta graniczyć), trzeba ustawić „sekcja” atrybut dla wszystkie inne funkcje. Na przykład:

void main(void); 
void funct1(....) __attribute__ ((section (".text.A"))); 
void funct2(....) __attribute__ ((section (".text.A"))); 
void funct3(....) __attribute__ ((section (".text.A"))); 

Wystarczy z "przypisaniem" prototypów funkcji. W ten sposób, kiedy skompilujesz teraz, "główna" funkcja będzie pierwsza w sekcji ".text", a wszystkie pozostałe będą następować po kolejnych kolejnych adresach.

Jeśli chcesz umieścić sekcję ".text" (tj."Main" funkcja) pod określonym adresem (na przykład 0x1000), należy pamiętać, aby połączyć się z:

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

Podczas gdy to zadziała, dodanie sekcji do wszystkich innych funkcji jest daleka od najprostszej - patrz zaakceptowana odpowiedź na prostsze rozwiązanie. – mdma