Repository 32bit  Forum
Repository 64bit  Wiki

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.

linker script per il C

Messaggioda Calzo » mer gen 23, 2008 23:32

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
Calzo
Linux 2.0
Linux 2.0
 
Messaggi: 112
Iscritto il: sab ott 06, 2007 21:21
Località: MN
Slackware: 10.2 | 13
Desktop: Fluxbox | KDE

Re: linker script per il C

Messaggioda V » ven gen 25, 2008 20:52

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

Tienimi informato, mi interessa assai! :D
Avatar utente
V
Linux 2.4
Linux 2.4
 
Messaggi: 313
Iscritto il: gio mar 23, 2006 10:54

Re: linker script per il C

Messaggioda Calzo » dom gen 27, 2008 23:13

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 2.0
Linux 2.0
 
Messaggi: 112
Iscritto il: sab ott 06, 2007 21:21
Località: MN
Slackware: 10.2 | 13
Desktop: Fluxbox | KDE

Re: linker script per il C

Messaggioda Calzo » gio gen 31, 2008 19:54

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
Avatar utente
Calzo
Linux 2.0
Linux 2.0
 
Messaggi: 112
Iscritto il: sab ott 06, 2007 21:21
Località: MN
Slackware: 10.2 | 13
Desktop: Fluxbox | KDE


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti

cron