linker script per il C

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
Calzo
Linux 1.x
Linux 1.x
Messaggi: 112
Iscritto il: sab 6 ott 2007, 22:21
Slackware: 10.2 | 13
Desktop: Fluxbox | KDE
Località: MN

linker script per il C

Messaggio 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.

Avatar utente
V
Linux 2.x
Linux 2.x
Messaggi: 313
Iscritto il: gio 23 mar 2006, 10:54

Re: linker script per il C

Messaggio da V »

Se non sbaglio, dovresti prepararti un cross-compilatore....
Cerca su google 'cross compiling'.....

Tienimi informato, mi interessa assai! :D

Avatar utente
Calzo
Linux 1.x
Linux 1.x
Messaggi: 112
Iscritto il: sab 6 ott 2007, 22:21
Slackware: 10.2 | 13
Desktop: Fluxbox | KDE
Località: MN

Re: linker script per il C

Messaggio 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: )

Avatar utente
Calzo
Linux 1.x
Linux 1.x
Messaggi: 112
Iscritto il: sab 6 ott 2007, 22:21
Slackware: 10.2 | 13
Desktop: Fluxbox | KDE
Località: MN

Re: linker script per il C

Messaggio 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

Rispondi