Newsgroup: it.comp.os.linux.iniziare
Titolo: compilare il kernel a 64bit

Salve.
Ho una distribuzione running a 32bit.
Volevo compilare un kernel a 64bit per poi portarlo dove mi serve.
Cosa mi serve?
al momento ho fatto
make menuconfig ARCH=x86_64
ma al
make bzImage ARCH=x86_64
mi dà
arch/x86/kernel/asm-offsets.c:1: error: code model 'kernel' not
supported in the 32 bit mode
arch/x86/kernel/asm-offsets.c:1: sorry, unimplemented: 64-bit mode not
compiled in
nota...
in arch/ non trovo x86_64!

 in arch/ non trovo x86_64!
Le architetture i386 e x86_64 sono state unificate, da un paio di release 
a questa parte.
-- 
Best Regards, Jack
Linux User #264449
Powered by Debian GNU/Linux on AMD64

 
Non puoi. Ti manca tutta la catena a 64 bit, dal compilatore alle 
librerie. E poi ti manca la cpu a 64 bit quindi non hai modo di eseguirne 
il codice.
Come dici? Hai un Core 2 Duo o un X2? D'accordo, ma se sei in modo 64 bit 
puoi eseguire codice a 32, non viceversa.
Insomma con la distribuzione a 64 bit fai quel che vuoi, con la 32 no. 
Ecco uno dei tanti motivi perche' non ha molto senso usarne una a 32.

 il codice.
e infatti il finale lo voglio eseguire su un altro pc (che poi
eseguire ha poco senso, visto che parliamo di un kernel)
Matteo


mmm
ho preso i sorgenti del kernel di slamd64 e lì l'x86_64 c'è.
Matteo

 e infatti il finale lo voglio eseguire su un altro pc 
Come debbo dirtelo che non puoi farlo su i386?

 Come debbo dirtelo che non puoi farlo su i386?
LOL.
basta crosscompilare. => 
http://en.wikipedia.org/wiki/Cross_compiler
Ciao Jack

 basta crosscompilare
Certo. Adesso crosscompili per x864_64 su i386. Provaci, dai.
Sto gia' ridendo, conosco il risultato.
ROTFL carpiato.

 Sto gia' ridendo, conosco il risultato.
Non credo che tu lo conosca. Puoi crosscompilare tranquillamente per
x86_64 su una macchina i386.
Giusto per fornirti una prova questo e' il primo link che ho trovato
con google:
http://groups.google.com/group/linux.kernel/browse_frm/thread/c8d02838ab778eaf/6f74e6acacb78e92?lnk=gst&q=i386+-%3E+x86_64+cross+compile+failure#6f74e6acacb78e92
Saluti,
The Librarian

 Non credo che tu 
Non darmi il link. Fallo. Che noi ci facciamo quattro risate.

 ROTFL carpiato.
LOLLA quanto ti pare, da linux ho le toolchain pronte (e funzionanti)
per crosscompilare per ARM, 8051 e HC08.
Su mac crosscompilo per ppc32, ppc64, intel32 e intel64.
Non vedo il problema a crosscompilare da i386 a x86_64 una volta che
hai pronta la toolchain.
Visto che dici che non si puo' spiega il motivo invece trollare qua
dentro.
Ciao Jack

 The Librarian
sò che tocca cross compilare (infatti mi serviva più capire di quali
strumenti avevo bisogno, in modo un po' più pratico che concettuale),
solo che in quel link si parla di una patch per linux/arch/x86_64/...
che però nel kernel della distribuzione (slackware, e quindi quasi
vanilla) non c'è. Ma se mi dite che i386 e x86_64 è stato unificato
negli ultimi kernel, allora procedo con il resto.
Però per cominciare cerco prima di crosscompilare un classico
helloworld.c, in modo di non aver bisogno di chissà quali strumenti
particolari.
Matteo

 LOLLA quanto ti pare,
Allora mostrami questo kernel, forza. Fatti, non chiacchiere.


ahahah, a quanto apre non riesci fornire prove del fatto che NON si
possa fare, quindi plonk.
addio troll, fa attenzione a non prendere troppo sole, altrimenti
diventi di pietra.

 ahahah, a quanto apre non riesci
Tu non riesci a farlo. Stai zitto, somaro.

 negli ultimi kernel, allora procedo con il resto.
Te lo confermo.
Saluti,
The Librarian


Non c'e' alcuna ragione perche' io lo debba fare. Ho gia' cross-
compilato piu' volte senza grossi problemi ed il meccanismo e' sempre
lo stesso. In piu', come ti ho fatto notare, su internet c'e' un bel
po' di gente che dice di averlo fatto e da anche le istruzioni.
Ora e' meglio chiarire una cosa: tu non sai di cosa stai parlando.
Saluti,
The Librarian

 il config giusto, tanto ci vuole poco tempo.
si, infatti stavo facendo così (come è scritto nel wiki indicato):
non ho il portatile dove stò compilando sottomano, ma più o meno ho
fatto così
compilazione e installazione di binutils con --prefix=/usr/cross --
target=x86_64-slackware-linux
export PATH=/usr/cross/bin:$PATH
compilazione e installazione di gcc come sopra (e qualcosaltro che ora
non ricordo).
# type gcc
/usr/cross/bin/gcc
se dò gcc helloworld.c produce codice a 32bit
non conosco bene i vari parametri di gcc, quindi ho dato
-march=x86_64 ma sembra non gli piaccia
da una rapida lettura del link che mi hai dato sembra serva -m64
appena accendo il portatile provo.
Matteo

pur non conoscendo ancora la teoria e tutto il resto e forse sò poco
di cosa si stà parlando, ma immagino che si possa fare per uno e un
solo motivo:
se per compilare un programma per una determinata cpu, devo avere un
linux running sulla stessa cpu, allora non esisterebbe alcuna
distribuzione per quella cpu, in quanto nessuno potrebbe compilare la
prima distribuzione running su quella cpu.
più concreto:
supponiamo che al mondo esista una sola distribuzione, per esempio
slackware (ma anche altre vanno bene)
fino al 2004 non esisteva alcun porting a 64bit
come è nata slamd64?
visto che invece esistono già versioni di suse, ubuntu.. a 64bit,
potrei lanciare quelle e compilare slamd64.
vero, si, ma come sono state compilate suse e ubuntu a 64bit?
se ora, invece, fosse possibile ottenere un compilatore e un linker
che abbiano gli header e le info per compilare a 64 bit, allora
compilo un programma a 64bit, che NON posso avviare, naturalmente.
Allora compilo il kernel a 64bit; compilo anche bash a 64 bit metto in
lilo e riavvio; a questo punto il programmino lo posso lanciare.
smentiscimi e ti darò ragione...
ma poi mi spieghi come si crea una distribuzione a 64bit, o una per
mips, sparc, ecc..
Ciao,
Matteo

 Non c'e' alcuna ragione perche' io lo debba fare.
Una c'e'. Non ne sei capace.

 pur non conoscendo ancora la teoria
Mi sa che non cogli il punto.
Mica ho detto che non esiste il cross-compiler.
Ho detto che non ci riuscirai.
Provami il contrario. Ma perderai solo tempo.
Intanto dov'e' il "hello world" che dovevi provare? E' roba di pochi 
secondi.


non ho mica detto che ci metto un attimo (considerando che devo ancora
imparare e che tocco il computer solo ora da ieri sera)
Matteo

 il config giusto, tanto ci vuole poco tempo.
infatti è quello che stò cercando di fare
le binutils si sono compilate bene
./configure --prefix=/usr/cross --target=x86_64-slackware-linux
ma gcc non ne vuole sapere
export PATH=/usr/cross/bin:$PATH
./configure --prefix=/usr/cross --target=x86_64-slackware-linux --
enable-languages=c
il problema è che in fase di compilazione ad un certo punto va a
cercare un paio di include (pthread.h e unistd.h) che si trovano nel
pacchetto glibc, nel path /usr/include
che mi manca?
Matteo

 che mi manca?
Mancano proprio gli header della glibc.
Ti consiglio di seguire bene una guida passo passo la prima volta che
costruisci una toolchain per un crosscompiler.
Non ho molto tempo, ma ho trovato questa che sembra essere fatta molto
bene:
http://cross-lfs.org/view/clfs-2.0/arm/cross-tools/introduction.html
La guida fa parte di Cross-Compiled Linux From Scratch, quindi
presuppone un ambiente di partenza molto minimale. Tu avrai bisogno di
fare meno della meta' delle operazioni descritte. Inoltre alcune
operazioni nel tuo caso non sono applicabili (la guida e' per arm) e
le versioni dei pacchetti gcc, glibc e binutils potrebbero differire
da quelle che utilizzi tu. Sono sicuro che se ci spendi un po' di
tempo trovi una guida piu' generale, ma comunque questa dovrebbe darti
sufficienti hint per riuscire nell'impresa.
Un'altra possibilita' e' quella di usare degli script per creare la
toolchain. Qui trovi gli script:
http://www.kegel.com/crosstool/
Pero' la prima volta IMHO e' meglio fare le cose a manina cosi' si
impara e soprattutto si capisce che creare una toolchain non e' una
cosa poi cosi' complicata.
Saluti,
The Librarian



Toglimi una curiosita'...
Lo so che puo' sembrare strana come domanda...
si, insomma, non e' il tipo di domanda che uno si sente fare tutti i
giorni...
Pero' la devo fare perche' sono troppo curioso...
Ma non e' che per caso quando eri piccolo hai avuto un qualche trauma
con i crosscompiler?
No, perche' senno' non si spiega questa tua ostinazione...
O forse pensi di essere un genio incompreso e credi che siccome tu non
sei capace di costruire una toolchain allora nessun altro possa
riuscirci.
Boh, chi lo sa...
Saluti,
The Librarian

grazie

 Toglimi una curiosita'.
Ignoro i motivi della tua incapacita'. Ne' mi interessa. 
Resterai con la curiosita'.

 imparare e che tocco il computer solo ora da ieri sera)
Classico caso di mirror climbing.

 che dici che il cross-compiling esiste
forse è meglio chiarire alcuni punti (così parliamo la stessa lingua):
dici che non è possibile compilare in _nessun_ caso un programma a
64bit (per essere eseguito su una piattaforma a 64bit), nemmeno cross-
compilando,
oppure dici che non è possibile compilarlo con il gcc e gli strumenti
così come sono (perchè in tal caso mi sembra ovvio che non si possa
fare)
traslando il discorso su mips, sparc... il discorso cambia o è uguale?
è importante sapere questo.
Matteo

 č importante sapere questo.
l'essere con cui stai tentando una discussione seria e' un troll.
lascia perdere.
Ciao Jack
-- 
Yoda of Borg am I! Assimilated shall you be! Futile resistance is, hmm?


Si, la guida è fatta molto bene.
Stò utilizzando la versione per alpha che mi mette una aggiunta per il
64bit
secondo le istruzioni ho compilato binutils, glibc e gcc, ma alla
compilazione di un programma non mi trova il crt1.o perchè le glibc me
le fa compilare con make install-headers
poco male... lancio make da solo.
ma ad un certo punto mi dà
../sysdeps/unix/sysv/linux/accept.S:5:20: error: socket.S: No such
file or directory
e difatti socket.S in quella directory non esiste.
dov'è l'inghippo?
Matteo

 dov'è l'inghippo?
Il tuo problema e' che non hai seguito le istruzioni fino in fondo.
Da quello che ho capito tu hai seguito le seguenti indicazioni (in
ordine):
http://cross-lfs.org/view/clfs-2.0/alpha/cross-tools/binutils.html
http://cross-lfs.org/view/clfs-2.0/alpha/cross-tools/glibc-headers.html
http://cross-lfs.org/view/clfs-2.0/alpha/cross-tools/gcc-static.html
dopodiche' hai visto che la glibc non era stata compilata e sei andato
direttamente di make.
Invece avresti dovuto seguire le istruzioni riportate qui:
http://cross-lfs.org/view/clfs-2.0/alpha/cross-tools/glibc.html
E io a questo punto farei anche questo:
http://cross-lfs.org/view/clfs-2.0/alpha/cross-tools/gcc-final.html
Se c'e' qualcosa che non ti funziona riprova da capo, inquanto e'
probabile che tu abbia inavvertitamente saltato qualche passaggio.
Infatti le indicazioni della guida sono giuste al 99% (quelli di LFS &
CO testano tutto piu' volte prima di pubblicare una guida).
Saluti,
The Librarian

ok.
prima di riprovare...
io stò utilizzando i pacchetti delle ultime versioni presi
direttamente dai siti originali, e non usavo le patch perchè non
sapevo dove prenderle... (ora lo so).
dici che è meglio usare le versioni specificate?
un altro problema a volte è capire se utilizzare 'x86' o 'x86_64' al
posto di 'alpha', p.e. per prelevare le kernel header, lui le andrebbe
a cercare su x86_64, ma, non esistendo, ho dovuto copiarle
manualmente.
Mi ero messo a leggere la guida anche un po' indietro di quel capitolo
e ho capito qualcos'altro... ora riprovo da zero.
Matteo

sembrerebbe andare tutto bene, ma con una eccezione.
stò compilando le glibc (non le header),
ma mi da una valanga di warning:
warning: C99 inline functions are not supported; using GNU89
cioè non gli piace -std=gnu99 ed userà -ansi
sono solo warning, ma al termine da un errore; non so quanto siano
collegati:
/home/clfs/clfs/cross-tools/lib/gcc/x86_64-unknown-linux-gnu/
4.2.1/../../../../x86_64-unknown-linux-gnu/bin/ld: cannot open linker
script file /home/clfs/glibc-build/ld.map: No such file or directory
(il linker ha come parametro --version-script=/home/clfs/glibc-build/
ld.map)
e in effetti ld.map non esiste, MA esiste nella directory glibc-build
della precedente compilazione (quella di glibc-header) in quanto non
ho riciclato la stessa ma ne ho fatta una nuova (riscompattato il
tar.bz2)
premetto che in aggiunta al tutorial ho solamente fatto:
export PATH="/home/clfs/clfs/cross-tools/bin:$PATH"
in quanto il configure non riusciva a trovare x86_64-unknown-linux-gnu-
gcc
inoltre non mi tornano questi switch
--prefix=/usr --libexecdir=/usr/lib/glibc
non dovrebbe essere --prefix=$CLFS/usr --libexecdir=$CLFS/usr/lib/
glibc
o addirittura --prefix=$CLFS/usr/cross-tools --libexecdir=$CLFS/usr/
cross-tools/lib/glibc ?
Matteo

VITTORIA:
clfs@portros:~/clfs/cross-tools/bin$ uname -a
Linux portros 2.6.24.5-smp #1 SMP Wed Apr 30 13:18:13 CDT 2008 i686
Intel(R) Core(TM)2 Duo CPU     T5550  @ 1.83GHz GenuineIntel GNU/Linux
clfs@portros:~/clfs/cross-tools/bin$ cat ~/helloworld.c
#include <stdio.h>
int main() {
        printf("Hello World x64!\n");
        return 0;
}
clfs@portros:~/clfs/cross-tools/bin$ ./x86_64-unknown-linux-gnu-gcc ~/
helloworld.c -o ~/helloworld.o
clfs@portros:~/clfs/cross-tools/bin$ file ~/helloworld.o
/home/clfs/helloworld.o: ELF 64-bit LSB executable, x86-64, version 1
(SYSV), dynamically linked (uses shared libs), not stripped
clfs@portros:~/clfs/cross-tools/bin$ ~/helloworld.o
-su: /home/clfs/helloworld.o: cannot execute binary file
reboot
root@darkstar:/clfs# uname -a
Linux darkstar 2.6.24.5 #1 SMP Sun May 4 16:51:34 BST 2008 x86_64
x86_64 x86_64 GNU/Linux
root@darkstar:/clfs# ./helloworld.o
Hello World x64!
Matteo


e ho anche ricompilato il kernel
root@darkstar:/clfs# uname -a
Linux darkstar 2.6.24.5 #2 SMP Mon May 26 15:05:27 CEST 2008 x86_64
x86_64 x86_64 GNU/Linux
(notare la data)

 l'essere 
Zitto idiota di uno zerbino.
Hai avuto abbastanza tempo, dov'e' il risultato?
Fatti aiutare da quel subnormale, facciamoci 4 risate.

> Hai avuto abbastanza tempo, dov'e' il risultato?
toh, pensavo che il topic fosse chiuso con i miei post del 25 e 26
maggio (se li hai letti).
li riporto. Dopo magari dai uno sguardo a linux from scratch:
http://trac.cross-lfs.org
============================================================
VITTORIA:
clfs@portros:~/clfs/cross-tools/bin$ uname -a
Linux portros 2.6.24.5-smp #1 SMP Wed Apr 30 13:18:13 CDT 2008 i686
Intel(R) Core(TM)2 Duo CPU     T5550  @ 1.83GHz GenuineIntel GNU/Linux
clfs@portros:~/clfs/cross-tools/bin$ cat ~/helloworld.c
#include <stdio.h>
int main() {
        printf("Hello World x64!\n");
        return 0;
}
clfs@portros:~/clfs/cross-tools/bin$ ./x86_64-unknown-linux-gnu-gcc ~/
helloworld.c -o ~/helloworld.o
clfs@portros:~/clfs/cross-tools/bin$ file ~/helloworld.o
/home/clfs/helloworld.o: ELF 64-bit LSB executable, x86-64, version 1
(SYSV), dynamically linked (uses shared libs), not stripped
clfs@portros:~/clfs/cross-tools/bin$ ~/helloworld.o
-su: /home/clfs/helloworld.o: cannot execute binary file
reboot
root@darkstar:/clfs# uname -a
Linux darkstar 2.6.24.5 #1 SMP Sun May 4 16:51:34 BST 2008 x86_64
x86_64 x86_64 GNU/Linux
root@darkstar:/clfs# ./helloworld.o
Hello World x64!
Matteo
=======================================================


(notare la data)
=======================================================

 Zitto idiota di uno zerbino.
Tu è MOLTISSIMO che non scopi, vero?
-- 
GenTLe ...di Varese, provincia.
TL1000S + Mito 125 per la pista
La mia HP: 
http://digilander.iol.it/thegentle/index.htm
Debian Lenny powered... Again :-)

 Tu è MOLTISSIMO che non scopi, vero?
No, tua madre e tua sorella me la danno quotidianamente.

 
http://trac.cross-lfs.org
Cioe' faresti girare eseguibili a 64 su una distribuzione a 32? Kernel 
compreso?
C'e' qualcosa che non va.


no. questo non l'ho mai detto e so benissimo che non è possibile.
io *compilo* su una distribuzione a 32 bit, come puoi vedere seguendo
bene gli output che ho postato.
Il compilatore mi *genera* un binario a 64bit che *non* eseguo su
questa piattaforma, visto che è a 32bit.
prendo il binario che mi ha generato il compilatore, lo porto su una
distribuzione *già a 64bit* e lo eseguo... e funge.
nel caso del kernel, cross-compilo su una distro a *32bit* e mi viene
generato un kernel a *64bit*. Lo metto dentro lilo, rebootto e carico
il nuovo kernel che, sempre dall'output, vedi che è a *64bit*
a disposizione per ulteriori prove o spiegazioni di passi non chiari
Ciao
Matteo