Como fazer um Cross Compiler MIPS-gcc [RESOLVIDO]

1. Como fazer um Cross Compiler MIPS-gcc [RESOLVIDO]

Plinio
pliniofernando

(usa Ubuntu)

Enviado em 18/04/2010 - 04:03h

Boa noite pessoal,
Estou com muitissima dificuldade de conseguir fazer meu compilador gcc compilar um código em linguagem C para linguagem Assemble MIPS. Já achei alguns artigos na internet(ingles) que explicava sobre o assunto mas na hora de fazer as configurações não dá certo. Os artigos que li sobre o assunto são um pouco antigo(sei pelas versões dos aplicativos citados). Gostaria que alguém me ajudasse nessa tarefa. Gostaria de ver funcionado: Um compilador pegar meu código em C e passar para Assemble do MIPS. Se alguém já fez isso um dia ou deseja compartilhar comigo esse desafio. Aguardo retorno. Abraços.
Detalhe: Estou usando o Ubuntu 9.10


  


2. Re: Como fazer um Cross Compiler MIPS-gcc [RESOLVIDO]

Marcelo A. B. Slomp
mslomp

(usa Slackware)

Enviado em 18/04/2010 - 13:59h

embora não pareça, seu caso é relativamente simples, visto que é um caso build == host =/= target, o que na maioria dos casos elimina
a necessidade de uma toolchain específica para o alvo.

então a primeira coisa a se fazer é compilar o binutils para o alvo mips, observando nesse caso se a máquina-alvo (mesmo que fictícia)
será big-endian - o padrão mips - ou little-endian. assumindo seu uso em uma máquina intel, usaremos little-endian.

passo a passo:
1 - crie um diretório de trabalho e dentro dele um para os fontes e outro para compilação.
por exemplo: /home/usuario/mips-cross/{build,source}
$ mkdir ~/mips-cross/{build,source}
$ cd ~/mips-cross

1 - baixar o fonte do binutils e extraí-lo em source:
$ cd source
$ wget ftp://ftp.gnu.org/gnu/binutils/binutils-2.20.1.tar.bz2
$ tar jxvf binutils-2.20.1.tar.bz2

2 - acessar o diretório build e efetuar a compilação:
$ cd ../build
$ ../source/binutils-2.20.1/configure --prefix=/usr --target=mipsel
$ make LDFLAGS="-s"
# make install
observe que utilizei /usr como raiz para instalação. não há perigo de sobrescrever o binutils nativo,
visto que por padrão, os binários são produzidos com o nome canônico da máquina alvo como prefixo: mipsel-ar, mipsel-as, etc.
caso não deseje esse prefixo, use a flag --program-prefix="", mas nesse caso você deve evitar instalar em /usr, sob pena de
sobrescrever os binários nativos.

3 - baixar os fontes do gcc e preparar a compilação:
vamos utilizar a última versão estável da série 4.4, visto que você pode ter problemas com a libssp da nova versão 4.5.0,
além de evitar a lib mpc.
$ cd ../source
$ wget ftp://ftp.gnu.org/gnu/gcc/gcc-4.4.3/gcc-core-4.4.3.tar.bz2 (apenas C)
agora, baixar as libs mandatórias (mpfr e gmp)
$ wget http://www.mpfr.org/mpfr-current/mpfr-2.4.2.tar.bz2
$ wget ftp://ftp.gmplib.org/pub/gmp-4.3.2/gmp-4.3.2.tar.bz2
extrair tudo:
$ tar jxvf gcc-core-4.4.3.tar.bz2
$ tar jxvf mpfr-2.4.2.tar.bz2
$ tar jxvf gmp-4.3.2.tar.bz2
copiar mpfr e gmp para dentro dos fontes do gcc - remover número de versão:
$ mv mpfr-2.4.2 gcc-4.4.3/mpfr
$ mv gmp-4.3.2 gcc-4.4.3/gmp
sim, teoricamente você pode utilizar essas libs se pré-instaladas no sistema, porém costumam dar dor de cabeça.
além disso, esse procedimento fará o gcc compilar a própria versão dessas libs tornando-o inclusive mais intercambiável
entre diferentes máquinas - ideal para distribuição.

4 - compilar o gcc:
para simplificar e agilizar, vou evitar aqui muitas flags. elas não são cruciais para esse caso.
mas, caso queira um resultado fine-tunned, podemos entrar nesse mérito após uma compilação com sucesso.
$ cd ../build
$ rm -rf * (apagar os restos da compilação do binutils e 'zerar' o diretório)
$ ../source/gcc-4.4.3/configure --prefix=/usr --target=mipsel --disable-multilib
$ make LDFLAGS="-s"
# make install

em resumo resumido é isso aí. fiz um teste rápido aqui utilizando o fonte 4.6.0 (devel) e foi tranquilo, então creio que
não haverá maiores problemas com a versão estável.


3. Qual Sistema esta sendo usado

Plinio
pliniofernando

(usa Ubuntu)

Enviado em 05/05/2010 - 11:06h

Bom dia meu amigo. Já tentei compilar o gcc de diversas maneiras. Gostaria de saber Qual distribuição Você está utilizando e qual a versão. Gostaria tb de saber as versões dos sources porque com as versões que você me passou nos links não está funcionado. O erro ocorre quando o make entra dentro da pasta ..build/mipsel/libcpp. Estou usando a versão do Ubuntu 9.10. e para compilar o codigo estou usando o gcc que já vem no ubuntu. Testei tb a nova versao do Ubuntu(10.4) e nada. No Ubuntu eu nao consigo nem compilar o binultils numa pasta separada da source(para compilar o binultils o make deve ser chamado dentro da pasta binultils.xx.xx). Já agradeço pela grande ajuda. Abraços.


4. Re: Como fazer um Cross Compiler MIPS-gcc [RESOLVIDO]

Marcelo A. B. Slomp
mslomp

(usa Slackware)

Enviado em 05/05/2010 - 19:10h

na ocasião compilei num arch linux, gcc 4.5.0, usando os fontes do 4.6.0 (svn, devel). a princípio, a distribuição não afeta a compilação, visto que sugeri utilizar compilações dedicadas da gmp e mpfr. porém, uma coisa importante e que *deve ser seguida à risca* é compilar o gcc em um diretório externo (mandatoriamente *fora da raiz* do gcc). para o binutils, é apenas uma recomendação - compilar a partir da raiz raramente produz algum erro misterioso. poucas vezes compilei o gcc em um ubuntu, mas nunca tive problemas. porém, por se tratar de um cross compiler, o buraco sempre é mais embaixo e pode estar havendo algum conflito 'do além'. tenho um note com um ubuntu 10.04 recém instalado e ainda pouco fuçado, então será ideal para testar. não estou com ele no momento - farei o teste amanhã e assim que eu tiver notícias, volto a postar.

ah, se possível poste aqui o erro que você está obtendo na saída, pois às vezes é apenas uma questão específica de configuração.


5. Re: Como fazer um Cross Compiler MIPS-gcc [RESOLVIDO]

Marcelo A. B. Slomp
mslomp

(usa Slackware)

Enviado em 06/05/2010 - 14:11h

bem, eu testei no ubuntu, e consegui reproduzir o problema. conforme eu havia mencionado no primeiro post, poderia ocorrer problemas com a libssp, daí a recomendação de se utilizar a série 4.4 do gcc. pois bem, acontece que consegui reproduzir o erro na série 4.4 - o que não ocorreu em meu teste anterior por n motivos, inclusive por utilizar a 4.6.0-svn já corrigida. ok, então para contornar o problema, utilize a versão 4.4.4 (lançada nesse meio tempo) e utilize a seguinte configuração:
$ ../source/gcc-4.4.4/configure --prefix=/usr --disable-multilib --disable-libssp

feito isso, você deve conseguir um build com sucesso utilizando a mesma metodologia do meu post anterior.
gcc 4.4.4 aqui: http://ftp.gnu.org/pub/gnu/gcc/gcc-4.4.4/gcc-core-4.4.4.tar.bz2

caso algum outro problema surja aí e você resolva mandar tudo para o inferno :D, avise-me e posso disponibilizar os binários para download (host=x86_64, target=mipsel).

segue a saída:
marcelo@skepticism:~$ mipsel-gcc -v
Using built-in specs.
Target: mipsel
Configured with: ../../source/gcc-4.4.4/configure --prefix=/usr --target=mipsel --disable-multilib --disable-libssp
Thread model: single
gcc version 4.4.4 (GCC)






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts