Pagina 1 di 1

linker script per il C

Inviato: mer 23 gen 2008, 23:32
da Calzo
Ciao a tutti.

Dovrei realizzare un programma per un micro processore e fare in modo che il codice generato venga messo in uno specifico indirizzo di memoria (che corrisponde alla flash).
Per farlo notavo che è necessario scrivere uno script per il linker simile a:

Codice: Seleziona tutto

MEMORY 
        {
        flash : ORIGIN = INDIRIZZO_FLASH,
                LENGTH = LUNGHEZZA_FLASH
        }

SECTIONS
{
        .text :
        {
                stext = . ;
                *(.text)
                etext = . ;
        } > flash
        .data :
        {
                *(.data)
                edata = . ;
        } > flash
}
Questo mi va bene se ho un file scritto in assembler, ma se il programma è interamente in C come posso fare a definire esattamente dove mettere il codice?
sapreste poi indicarmi della documentazione a riguardo? (io ho trovato solo documenti sull'assemblatore e su come scrivere lo script, ma non su come fare il mix :()

grazie

PS: il micro è un infineon tricore 1130 e il compilatore è il GCC.

Re: linker script per il C

Inviato: ven 25 gen 2008, 20:52
da V
Se non sbaglio, dovresti prepararti un cross-compilatore....
Cerca su google 'cross compiling'.....

Tienimi informato, mi interessa assai! :D

Re: linker script per il C

Inviato: dom 27 gen 2008, 23:13
da Calzo
V ha scritto:Se non sbaglio, dovresti prepararti un cross-compilatore....
Si, ma quello ce l'ho gia. Il problema è come definire le sezioni di codice... o quanto meno io intendo come fare a definire che una certa funzione o parte di codice risieda effettivamente ad un certo indirizzo (fisico o virtuale che sia).
Per esempio sui sistemi x86 lo script di default per il linker si può vedere con "ld --verbose" (così come anche per tutti gli altri come cris-ld pe processori ETRAX, tricore-ld per i tricore, ecc).

Ora: il problema è che se scrivo un programma in assembler scrivo per esempio:

.text1
; codice ASM
.text2
; altro codice ASM

e nel linker-script dico che .text1=0xA000 e .text2=0xB000, il codice che ho scritto risiederà proprio lì.
Ma se il codice lo scrivo in C e voglio una struttura come questa:

funzione1() {
//TODO
}
main() {
//TODO
}
voglio che il main parta da .text1, mentre funzione1 da .text2, e in C non so proprio come fare :-k
(hmm... che debba usare __attribute__? :idea: )

Re: linker script per il C

Inviato: gio 31 gen 2008, 19:54
da Calzo
Penso di aver (parzialmente) risolto. è ufficiente indicare nella sezione SECTION dove voglio che certi files vengano messi; per esempio se scrivo:
funzione1.c

Codice: Seleziona tutto

#include <stdio.h>
void funzione1() {
  printf("FUNZIONE 1 CHIAMATA!\n);
} 
main.c

Codice: Seleziona tutto

#include <stdio.h>
extern void funzione1();
int main() {
   printf("IDX Main\t%16X\nIDX func1\t%16X\n", main, funzione1);
   funzione1();
   return 0;
}
Poi definisco il linker script (ld --verbose > lks.ld epurato di alcune note iniziali e finali) andando a mettere all'inizio della sezione .text la riga:

Codice: Seleziona tutto

funzione1.o (.text)
Ora se compilo normalemnte il programma con gcc -c funzione1.c -o funzione 1; gcc main.c -o main ed eseguo il programma ho come risultato:
IDX Main 8048384
IDX func1 80483BC
FUNZIONE 1 CHIAMATA!!!
mentre se compilo con gcc -Tlks.ld main.c -o main ho:
IDX Main 80483A4
IDX func1 80482C0
FUNZIONE 1 CHIAMATA!!!

Il brutto è che così devo definire ogni funzione e/o variabile in file appositi, ma per ora è meglio che niente. Alcuni link utili a riguardo:
http://www.gnu.org/software/binutils/ma ... d_toc.html
http://www.mcs.vuw.ac.nz/cgi-bin/info2www?(ld)Top

bye