Assine a Lista Dicas-L
Receba diariamente por email as dicas
de informática publicadas neste site
Para se descadastrar, clique aqui.
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:
- http://linux.bytesex.org/cross-compiler.html
- http://www.cis.upenn.edu/~milom/cross-compile.html
- http://ninjamonkey.us/wordpress/2004/07/solaris-cross-compiler/
Referências Adicionais
Referências adicionais sobre os assuntos abordados neste site podem ser encontradas em nossa Bibliografia.
Avalie esta dica
Opinião dos Leitores
28 Fev 2011, 17:01
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
28 Fev 2011, 16:06
Volto afirmar, excelente artigo! Só questionei essa posição, para trocar ideias sobre o assunto.
Muito obrigado!
Abs
Rodrigo
28 Fev 2011, 15:48
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
28 Fev 2011, 10:16
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.
28 Fev 2011, 07:16
Excelente matéria. Gostaria de entender os motivos que o leva afirmar que um bom servidor não pode ter compiladores?
Abs
Rodrigo





