Repository 32bit  Forum
Repository 64bit  Wiki

linker script per il C

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata e la versione del Kernel. Questi dati aiutano le persone che possono rispondere.
2) Specificare sempre il tipo di shell (bash, sh, csh, etc...)
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 dell'ultima regola 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 » gio gen 24, 2008 0: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 22:21
Località: MN
Slackware: 10.2 | 13
Desktop: Fluxbox | KDE

Re: linker script per il C

Messaggioda V » ven gen 25, 2008 21: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 11:54

Re: linker script per il C

Messaggioda Calzo » lun gen 28, 2008 0: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 22:21
Località: MN
Slackware: 10.2 | 13
Desktop: Fluxbox | KDE

Re: linker script per il C

Messaggioda Calzo » gio gen 31, 2008 20: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 22:21
Località: MN
Slackware: 10.2 | 13
Desktop: Fluxbox | KDE


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 0 ospiti

cron