você está aqui: Home  → Arquivo de Mensagens

Criando um Cross Compiler entre Linux e Solaris

Colaboração: André Marques Saunite

Data de Publicação: 28 de fevereiro de 2011

Eu trabalho muito com servidores Solaris 10 Sparc e, como qualquer bom servidor, não temos instalados compiladores neles, como minha estação de trabalho é Linux x86_64 e nem sempre tenho uma máquina Sparc com Solaris disponível para instalar um compilador, eu resolvi pesquisar para criar um GCC Cross Compiler entre meu Debian Linux x86_64 e um Solaris 10 Sparc, o que tem funcionado muito bem para os casos que venho necesitado.

A primeira coisa é baixar o códogo fonte do "binutils" e "gcc" eu utilizei o binutils versão 2.21.0.20110216 e o gcc versão 4.4.2.

Os código fonte podem ser encontrados aqui: http://ftp.gnu.org/gnu/binutils/

e aqui: http://ftp.gnu.org/gnu/gcc/

(Para o binutils eu peguei pelo apt-get source binutils)

Configurando o ambiente

  export TARGET=sparc-sun-solaris2.10
  export PREFIX=/opt/solaris-cross-compiler/
  export SYSROOT=$PREFIX/sysroot/
  mkdir -p $SYSROOT

Copiando Bibliotecas

Para que os programas que forem criados utilizem as bibliotecas corretas do solaris, precisamos copiar as bibliotecas do servidor solaris para nossa máquina, os que deve ser feito é o seguinte:

  Copiar /usr/include do Solaris para $SYSROOT/usr/include da sua máquina;
  Copiar /usr/local/include do Solaris para $SYSROOT/usr/local/include/ da sua máquina;
  Copiar /lib do Solaris para $SYSROOT/usr/local/include/ da sua máquina;
  Copiar /usr/lib do Solaris para $SYSROOT/usr/lib/ da sua máquina;
  Copiar /usr/local/lib do Solaris para $SYSROOT/usr/local/lib/ da sua máquina;

Caso também necessite criar programas gráficos, talvez necessite também:

  Copiar /usr/openwin/include do Solaris para $SYSROOT/usr/openwin/include da sua máquina;
  Copiar /usr/dt/include do Solaris para $SYSROOT/usr/dt/include da sua máquina;
  Copiar /usr/X11/include do Solaris para $SYSROOT/usr/X11/include da sua máquina;
  Copiar /usr/openwin/lib do Solaris para $SYSROOT/usr/openwin/lib da sua máquina;
  Copiar /usr/dt/lib do Solaris para $SYSROOT/usr/dt/lib da sua máquina;
  Copiar /usr/X11/lib do Solaris para $SYSROOT/usr/X11/lib da sua máquina;

Criando ambiente de compilação

  mkdir $PREFIX/sources/
  cd $PREFIX/sources/

Baixe os códigos fontes do binutils e gcc para o diretório $PREFIX/sources;

Compilando binutils

  $ tar -xvzf binutils-2.21.0.20110216.tar.gz
  $ mkdir build-binutils
  $ cd build-binutils/
  $ ../binutils-2.21.0.20110216/configure -target=$TARGET --prefix=$PREFIX -with-sysroot=$SYSROOT -v
  $ make
  $ make install

Compilando GCC

Antes de instalar o GCC eu tive que instalar os pacotes libmpfr-dev e libgmp3-dev.

  $ tar -xvzf gcc-4.4.2.tar.gz
  $ mkdir build-gcc
  $ cd build-gcc
  $ ../gcc-4.4.2/configure --target=sparc-sun-solaris2.10 --with-gnu-as
  --with-gnu-ld  --prefix=$PREFIX -with-sysroot=$SYSROOT --disable-libgcj
  --enable-languages=c,c++ --enable-threads --with-cpu=ultrasparc
  --with-headers=$SYSROOT/usr/include/ --with-libs=$SYSROOT/lib/
  --disable-multilib --without-newlib --disable-shared --disable-nls -v
  $ make
  $ make install

Testando

Crie um bom e velho helloWorld.c com o conteúdo:

  #include < stdio.h>
  void main () {
        printf ("Hello World!\n");
  }

Compile:

  $ $PREFIX/bin/sparc-sun-solaris2.10-gcc helloWorld.c -o helloWorld.solaris

Verifique se está com o formato correto:

  $ file helloWorld.solaris
  helloWorld.solaris: ELF 32-bit MSB executable, SPARC32PLUS, V8+ Required,
  version 1 (SYSV), dynamically linked (uses shared libs), not stripped

Se está assim, é só copiar o binário para o Solaris 10 e executar!

Fontes de pesquisa:



Veja a relação completa dos artigos de André Marques Saunite

 

 

Opinião dos Leitores

Márcio C. M. Rezende
28 Fev 2011, 17:01
Grato pelo retorno.
Sim, concordo que a geração de binários não seria feita diretamente só por estar no S.O. alvo. (:-P--) Esta é a tarefa do compilador! A vantagem, se tivesse alguma, seria que as libs estariam lá para testar no ambiente Solaris, sem ter que copiá-las, pressupondo que as chamadas à elas fossem compatíves e contidas nos headers.
Entratanto, no final iria requerer, também, mesmo estando numa máquina virtual, uma compilação cruzada. Desculpe pela bola fora.
De qualquer forma ficou entendido o procedimento de colocação das libs no linux. Maravilha.
{}'s
MaRZ
Rodrigo
28 Fev 2011, 16:06
Concordo com a ideia de deixar o mínimo de serviços necessários para a operação do servidor, no entanto, no meu entendimento, os compiladores não se enquadram nesse caso, pois conforme o seu exemplo, se algum invasor consegue acesso root (onde o mesmo não será exploitado pelo compilador, e sim por um serviço), a menor dificuldade dele será a de instalar compiladores.

Volto afirmar, excelente artigo! Só questionei essa posição, para trocar ideias sobre o assunto.

Muito obrigado!
Abs

Rodrigo
André Saunite
28 Fev 2011, 15:48
Oi galera,

Márcio, os headers e os libs foram copiados pra um diretório a parte que é o root apenas para o cross compiler, não ficam no mesmo diretório das headers e libs do sistema. Quer dizer, tudo fica dentro do que estiver definido como $SYSROOT (que no caso da dica enviada é /opt/solaris-cross-compiler/).

Sobre instalar o solaris numa VM, não funcionaria para o meu caso, pois eu preciso criar binários para solaris sparc, e não solaris i386 ou amd64, e não posso instalar o solaris sparc numa VM de um servidor amd64. (Ou posso?!!? Sempre pensei que não). E mesmo que funcionasse, como vc disse, ele vai comer muito mais CPU e memória do que ter o cross compiler.

Rodrigo,

Talvez seja paranóia, é que na minha opinião, um servidor, principalmente se for algo critico, não pode ter NADA além do que ele realmente precisa, por isso eu usualmente não deixo nem ambiente grafico nem compilador nem nada que não seja absolutamente necessário.

No caso do compilador ainda tem o fator adicional que eu não quero nenhum espertinho compilando nada num servidor critico e consumindo os recursos da máquina, e além disso, se alguém consegue a senha de root do servidor e quer instalar algo via fonte não vai conseguir (ou pelo menos vai ter muito mais de trabalho).

Abraços,
André Saunite
Márcio C. M. Rezende
28 Fev 2011, 10:16
Gostei da dica.
Sempre imaginei se, para trabalhar com compilação cruzada, precisaríamos de copiar os arquivos da máquina-alvo para a máquina host.
Vou tentar isto com os ativos do windowz e do OpenVMS.
Mas fiquei imaginando: misturar os headers e libs do solaris nos diretórios do linux diretamente, assim como foi feito, não causará nenhuma inconveniência?
Suponho que isto deva ser feito numa sandbox ou com o chroot, certo?
Outra solução possivel: já instalei um Solaris 64 no vmware. Ficou muito bom. Tá certo que fica comendo ciclos da cpu e deixando seu computador bem mais lento do que deveria, mas é uma solução menos invasiva.
Rodrigo
28 Fev 2011, 07:16
Olá André.

Excelente matéria. Gostaria de entender os motivos que o leva afirmar que um bom servidor não pode ter compiladores?

Abs
Rodrigo
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script