22-7-03 - Boletim ViaLinuxis em sintonia com o Fórum
gcc como cross compiler para o 68000
seu email: subscribe unsubscribe

Editorial

Um cross compilador gera código em uma máquina (ex: PC com linux) para uma outra máquina (ex: kit do 68000). Isto é muito importante quando se quer construir máquinas novas. Imagine por exemplo que alguém construa um microprocessador novo e gostaria de migrar o código do Linux para lá. Com certeza vai ser preciso um cross compilador. Gerar um cross compilador a partir do gcc foi mais difícil do que eu supunha em boa parte devido à documentação existente na internet. Em http://www.sthoward.com/CrossGCC/FAQ-4.html#ss4.1 e também em http://www.pcs.usp.br/~jkinoshi/lindocs/68k-flavio.doc se vê algo como:
cd /home/foo
host=sparc-sun-solaris2
target=m68k-coff
prefix=/bar
i=$prefix/bin
mkdir build-binutils build-gcc build-newlib build-gdb
# Configure, build and install binutils
 cd build-binutils
../binutils-2.9.1/configure --target=$target --prefix=$prefix -v
make all install
# Configure, build and install gcc
cd ../build-gcc
../gcc-2.8.1/configure --target=$target --prefix=$prefix -v
make all install
# Configure, build and install newlib 
cd ../build-newlib 
../newlib-1.8.1/configure --target=$target --prefix=$prefix -v 
# The settings for FOO_FOR_TARGET aren't necessary if you put $prefix/bin 
# in your path before running this. 
make all install \ 
        CC_FOR_TARGET=$i/${target}-gcc \ 
        AS_FOR_TARGET=$i/${target}-as \ 
        LD_FOR_TARGET=$i/${target}-ld \ 
        AR_FOR_TARGET=$i/${target}-ar \ 
        RANLIB_FOR_TARGET=$i/${target}-ranlib
Infelizmente isto não funcionou para mim e para muita gente (vendo as mensagens de erro na internet). Isto porque o cross gcc (xgcc) não consegue compilar as funções matemáticas por falta de headers. Muitas pessoas construiram soluções ruins para este problema como por exemplo a criação de patch para o compilador suprindo os headers. Entretanto a melhor resposta para este problema está em http://crossgcc.billgatliff.com/crossgccfaq/t1.html que faz duas compilações, primeiro sem a biblioteca newlib e depois com newlib.

Meu objetivo é gerar código para o kit do 68000 que usamos no laboratório através do Linux. Veja como isto foi feito desde a construção do cross compilador até o seu uso:

# GERANDO o ambiente de desenvolvimento m68k-coff:
# obter os arquivos para a criação do cross compiler
  wget -t0 http://ftp.gnu.org/gnu/binutils/binutils-2.13.1.tar.gz
  wget -t0 -c ftp://ftp.gnu.org/pub/gnu/gcc/gcc-2.95.1.tar.gz
  wget -t0 ftp://sources.redhat.com/pub/newlib/newlib-1.8.1.tar.gz
# expande os arquivos
  tar -zxvf binutils-2.13.1.tar.gz
  tar -zxvf gcc-2.95.1.tar.gz
  tar -zxvf newlib-1.8.1.tar.gz
# acerta as variaveis de ambiente
  target=m68k-coff  
  prefix=/usr/local # em que lugar vai ser instalado
  i=$prefix/bin
# cria binutils - contém utilitários como o assembler, criador do srec, etc.
  mkdir build-binutils build-gcc 
  cd build-binutils
  ../binutils-2.13.1/configure --target=$target --prefix=$prefix -v
  make all install
  cd ..
# cria o gcc sem as funções matemáticas (elas serão compiladas posteriormente).
  cd build-gcc
  ../gcc-2.95.1/configure --target=$target --prefix=$prefix --host=i586-pc-linux-gnu --enable-languages=c --without-headers --with-newlib 2>&1 | tee config.log
  make all-gcc install-gcc 2>&1 | tee make.log
  cd ..
# cria a biblioteca
  mkdir build-newlib
  cd build-newlib/
  echo $target
  ../newlib-1.8.1/configure --target=$target --prefix=$prefix 2>&1 | tee configure.log
  make all install 2>&1| tee make.log
# cria o gcc com as funções da newlib
  cd ../build-gcc
  ../gcc-2.95.1/configure --target=$target --prefix=$prefix --enable-languages=c  2>&1 | tee config.log
  make all install 2>&1 |tee make.log
# antes de usar o cross compiler precisa de criar o ldscript:
 more ldscript # este ldscript vai colocar o código (text) (e subsequentemente variáveis, etc.) a partir da posição 0x1000
----------------------------------------------
SECTIONS {.text 0x1000 : {*(.txt)}}
----------------------------------------------







# USANDO o cross gcc:
m68k-coff-gcc -m68000 -mshort -c -S teste.c # gera o código em assembly teste.s
m68k-coff-gcc -m68000 -mshort -c  teste.c # gera o objeto
m68k-coff-ld -r -dp -e main -T ldscript teste.o -o projeto.o
m68k-coff-objcopy -O srec projeto.o projeto.srec

# o arquivo projeto.srec pode ser enviado para o kit 68000 sbc68k.
# Para ver o código no assembly do 68K:
 m68k-coff-objdump -D -mm68k projeto.o



Perguntas & Respostas

16-07-03
awlinux
Gostaria de saber como configura e ultilisar o LiNeighborhood, em uma maquina Linux onde todas as outras são windows. Osa os servidores tb
16-07-03
awlinux
Gostaria de saber como implementar um servidor de aplicaçãcom tomcat , java , no linux
14-07-03
cad
[1] Como faço para desligar o linux pelo terminal windows sem ter que logar com root
18-07-03
jkinoshi
  • altere as permissoes do shutdown.
14-07-03
travocheir
Como faço para montar o cdrom no zipslack? Já tentei de varias formas mas não consegui, a montagem do disquete é normal!!!!
07-07-03
enio
[2] Como posso mudar a senha do root, que esqueci, no boot do RH8 usando o GRUB? O GRUB tem o seguinte: root (hd0,0) kernel /vmlinuz-2.4.18-14 ro root=LABEL=/
14-07-03
cvasco18
  • Com o Grub, primeiro selecione a particao que contém o Linux. Aperte a letra e 2 vezes. A linha do kernel ficará editável. Em seguida, digite o numero 1 e a