mirror of
https://github.com/elua/elua.git
synced 2025-01-08 20:56:17 +08:00
263 lines
11 KiB
HTML
263 lines
11 KiB
HTML
$$HEADER$$
|
|
<p> Esse tutorial explica como criar um toolchain com GCC+Newlib para ser usado na compilação de programas usando a arquitetura ARM, tornando assim possível a compilação de programas para um grande número de CPUs com arquitetura ARM. Você precisará desse recurso se pretende compilar eLua para as CPUs com arquitetura ARM. Esse tutorial é semelhante a muitos outros encontrados na Internet (particularmente o <a href="http://www.gnuarm.com/">gnuarm</a>, que serviu de base para esse tutorial), no entanto, este possui um maior detalhamento e mostra alguns "dicas" que você poderá utilizar quando estiver compilando a Newlib.</p>
|
|
|
|
<p><strong>AVISO: Eu não sou um especialista no processo de montagem de CGC/newlib/binutils. Tenho certeza de que existem melhores formas de realizar o que estou descrevendo aqui, no entanto, apresento apenas uma maneira rápida de construir um toolchain, não tenho nenhuma intenção de me aprofundar no processo de montagem. Se você encontrar algum erro, por favor entre em <a href="http://www.eluaproject.net/en/Contact">contato comigo</a> e farei as correções necessárias. Acrescento ainda, que esse tutorial não possui nenhum tipo de garantia.</strong></p>
|
|
|
|
<h2>Pré-requisitos</h2>
|
|
<p>Para construir seu toolchain você precisará de:</p>
|
|
|
|
<ul>
|
|
<li>Um computador rodando Linux: Eu uso Ubuntu 8.04, mas qualquer Linux irá fazer, desde que você saiba como encontrar o equivalente do "apt-get" para a sua distribuição. Não entrarei em detalhes sobre isso, pesquise no Google e você encontrará o que precisa. Assumimos também que o Linux já tem uma "base" nativa toolchain instalada (gcc/make e afins). Isto é verdadeiro para o Ubuntu depois da instalação. No entanto, você precisa verificar a sua distribuição específica.</li>
|
|
<li>GNU binutils: faça o download <a href="http://ftp.gnu.org/gnu/binutils/">aqui</a>. No momento em que elaborava este tutorial, as versões mais recentes eram 2.18, que por algum motivo desconhecido não compilava no meu sistema, por isso estou usando a versão 2,17.</li>
|
|
<li>GCC: versão 4.3.0 ou superior é recomendada. No momento em que escrevia este tutorial, a versão mais recente era a 4.3.1, a qual usarei para este tutorial. Faça o download <a href="http://gcc.gnu.org/mirrors.html">aqui</a> depois de escolher um bom servidor de mirror.</li>
|
|
<li>Newlib: enquanto preparava este tutorial, a versão mais recentes era a 1.16.0. Faça o download do <a href="ftp://sources.redhat.com/pub/newlib/index.html">diretório FTP Newlib</a>.</li>
|
|
<li>Além disso, o tutorial assume que você esteja usando o bash como seu shell. Se você usar qualquer outra coisa, talvez você precise ajustar alguns comandos do shell específico.</li>
|
|
</ul>
|
|
|
|
<p>Você ainda precisará de outros programas e bibliotecas a fim de montar o toolchain. Para instalá-los:</p>
|
|
|
|
<p><br></p>
|
|
|
|
<table class="table_cod">
|
|
<tbody><tr>
|
|
<th>$ sudo apt-get install flex bison libgmp3-dev libmpfr-dev autoconf texinfo</th>
|
|
</tr>
|
|
</tbody></table>
|
|
|
|
|
|
<p>Em seguida, defina onde pretende instalar o seu toolchain. Eles geralmente são instalados no diretório /usr/local/, logo, assumiremos o diretório /usr/local/cross-arm para este tutorial. Para agilizar a digitação, defina este caminho como padrão na variável de ambiente:</p>
|
|
|
|
<p><br></p>
|
|
|
|
<table class="table_cod">
|
|
<tbody><tr>
|
|
<th>$ export TOOLPATH=/usr/local/cross-arm</th>
|
|
</tr>
|
|
</tbody></table>
|
|
|
|
|
|
<h2>› Passo 1: binutils</h2>
|
|
<p>Este é o passo mais fácil: descompactar, configurar, compilar.</p>
|
|
|
|
<p><br></p>
|
|
|
|
<table class="table_cod">
|
|
<tbody><tr>
|
|
<th>$ tar -xvjf binutils-2.17.tar.bz2</th>
|
|
</tr>
|
|
</tbody></table>
|
|
|
|
|
|
<table class="table_cod">
|
|
<tbody><tr>
|
|
<th>$ cd binutils-2.17</th>
|
|
</tr>
|
|
</tbody></table>
|
|
|
|
|
|
<table class="table_cod">
|
|
<tbody><tr>
|
|
<th>$ mkdir build</th>
|
|
</tr>
|
|
</tbody></table>
|
|
|
|
|
|
<table class="table_cod">
|
|
<tbody><tr>
|
|
<th>$ cd build</th>
|
|
</tr>
|
|
</tbody></table>
|
|
|
|
|
|
<table class="table_cod">
|
|
<tbody><tr>
|
|
<th style="text-align: left;">$ ../configure --target=arm-elf --prefix=$TOOLPATH --enable-interwork --enable-multilib--with-gnu-as --with-gnu-ld --disable-nls</th>
|
|
</tr>
|
|
</tbody></table>
|
|
|
|
|
|
<table class="table_cod">
|
|
<tbody><tr>
|
|
<th>$ make all</th>
|
|
</tr>
|
|
</tbody></table>
|
|
|
|
|
|
<table class="table_cod">
|
|
<tbody><tr>
|
|
<th>$ sudo make install</th>
|
|
</tr>
|
|
</tbody></table>
|
|
|
|
|
|
<table class="table_cod">
|
|
<tbody><tr>
|
|
<th>$ export PATH=${TOOLPATH}/bin:$PATH</th>
|
|
</tr>
|
|
</tbody></table>
|
|
|
|
|
|
<p>Agora você tem os "binutils" da CPU ARM(assembler, linker, disassembler ...) em seu PATH.</p>
|
|
|
|
<h2>Passo 2: basic GCC</h2>
|
|
|
|
<p>Nesta etapa vamos montar uma "base" GCC (ou seja, uma GCC sem nenhuma lib, a qual usaremos, a fim de criar todas as bibliotecas para o nosso objetivo). Mas primeiro temos que fazer uma rápida modificação nos arquivos de configuração. Fora desse ambiente, o pacote GCC 4.3.1/newlib não compilará corretamente, dando um erro muito estranho "Link tests are not allowed after GCCNOEXECUTABLES". Após uma procura no google, encontrei a solução para isso:</p>
|
|
|
|
<p><br></p>
|
|
|
|
<table class="table_cod">
|
|
<tbody><tr>
|
|
<th>$ tar -xvjf gcc-4.3.1.tar.bz2</th>
|
|
</tr>
|
|
<tr>
|
|
<th>$ cd gcc-4.3.1/libstdc++-v3</th>
|
|
</tr>
|
|
<tr>
|
|
<th style="text-align: left;">$ joe configure.ac</th>
|
|
</tr>
|
|
</tbody></table>
|
|
|
|
|
|
<p> Estou usando "joe" aqui, como meu editor de texto Linux favorito, você pode usar qualquer outro editor de texto. Agora encontre a linha que tenha o string "AC_LIBTOOL_DLOPEN" e adicione um "#" no inicio da linha:</p>
|
|
|
|
<p><code># AC_LIBTOOL_DLOPEN</code></p>
|
|
|
|
<p>Salve o arquivo alterado e saia do editor. </p>
|
|
|
|
<p><br> </p>
|
|
|
|
<table class="table_cod">
|
|
<tbody><tr>
|
|
<th>$ autoconf</th>
|
|
</tr>
|
|
<tr>
|
|
<th style="text-align: left;">$ cd ..</th>
|
|
</tr>
|
|
</tbody></table>
|
|
|
|
|
|
|
|
<p>Ótimo, agora sabemos que podemos compilar, então vamos em frente:</p>
|
|
|
|
<p><br></p>
|
|
|
|
<table class="table_cod">
|
|
<tbody><tr align="left">
|
|
<th>$ mkdir build</th>
|
|
</tr>
|
|
<tr align="left">
|
|
<th>$ cd build</th>
|
|
</tr>
|
|
<tr align="left">
|
|
<th>$
|
|
../configure --target=arm-elf --prefix=$TOOLPATH --enable-interwork
|
|
--enable-multilib --enable-languages="c,c++" --with-newlib
|
|
--without-headers --disable-shared--with-gnu-as --with-gnu-ld</th>
|
|
</tr>
|
|
<tr align="left">
|
|
<th>$ make all-gcc</th>
|
|
</tr>
|
|
<tr align="left">
|
|
<th>$ sudo make install-gcc</th>
|
|
</tr>
|
|
</tbody></table>
|
|
|
|
|
|
|
|
|
|
<p>No meu sistema, a última linha acima (sudo make install-gcc) termina com erros, devido a impossibilidade de encontrar a binutils recentemente compilada. Se isso acontece para qualquer tipo de comando "make install", aqui está uma maneira rápida de resolver isso:</p>
|
|
|
|
<p style="text-align: left;"><br></p><div style="text-align: left;"></div>
|
|
<table class="table_cod">
|
|
<tbody><tr align="left">
|
|
<th>$ sudo -s -H</th>
|
|
</tr>
|
|
<tr align="left">
|
|
<th># export PATH=/usr/local/cross-arm/bin:$PATH</th>
|
|
</tr>
|
|
<tr align="left">
|
|
<th># make install-gcc</th>
|
|
</tr>
|
|
<tr>
|
|
<th style="text-align: left;"># exit</th>
|
|
</tr>
|
|
</tbody></table>
|
|
|
|
|
|
|
|
|
|
<h2>Passo 3: Newlib</h2>
|
|
|
|
<p>Mais uma vez, este etapa é tão fácil quanto descompactar, configurar, compilar. Mas eu preciso que a minha biblioteca seja do menor tamanho possível (em contraposição, tão rápida quanto possível) e eu só queria manter o que é necessário no executável, por isso, acrescentei os flags "-ffunction-sections -fdata-sections" para permitir que o linker execute "dead code stripping":</p>
|
|
|
|
<p><br></p>
|
|
|
|
<table class="table_cod">
|
|
<tbody><tr align="left">
|
|
<th>$ tar xvfz newlib-1.16.0.tar.gz</th>
|
|
</tr>
|
|
<tr align="left">
|
|
<th>$ cd newlib-1.16.0</th>
|
|
</tr>
|
|
<tr align="left">
|
|
<th>$ mkdir build</th>
|
|
</tr>
|
|
<tr align="left">
|
|
<th>$ cd build</th>
|
|
</tr>
|
|
<tr align="left">
|
|
<th>$
|
|
../configure --target=arm-elf --prefix=$TOOLPATH --enable-interwork
|
|
--disable-newlib-supplied-syscalls --with-gnu-ld --with-gnu-as
|
|
--disable-shared</th>
|
|
</tr>
|
|
<tr align="left">
|
|
<th>$ make
|
|
CFLAGS_FOR_TARGET="-ffunction-sections -fdata-sections
|
|
-DPREFER_SIZE_OVER_SPEED -D__OPTIMIZE_SIZE__ -Os -fomit-frame-pointer
|
|
-D__BUFSIZ__=256"</th>
|
|
</tr>
|
|
<tr align="left">
|
|
<th>$ sudo make install</th>
|
|
</tr>
|
|
</tbody></table>
|
|
|
|
|
|
|
|
<p>Algumas observações sobre os flags usados na sequência acima:</p>
|
|
|
|
<ul>
|
|
<li><code>--disable-newlib-supplied-syscalls</code>: isto merece uma página própria, mas não vou fazê-lo aqui. Para uma explicação, por exemplo, ver <a href="http://openhardware.net/Embedded_ARM/NewLib_Stubs/">esta página</a></li>
|
|
<li><code>-DPREFER_SIZE_OVER_SPEED -D__OPTIMIZE_SIZE__</code>: compila Newlib otimizando o tamanho, não a performance (estes são específicos da Newlib).</li>
|
|
<li><code>-Os -fomit-frame-pointer</code>: indica para GCC otimizar o tamnho, não a velocidade.</li>
|
|
<li><code>-D__BUFSIZ__=256</code>:
|
|
novamente específico da Newlib, este é o tamanho default do buffer alocado para arquivos abertos via fopen(). O padrão é 1024, cujo tamanho considerei muito para eLua, logo estou usando 256 aqui. Certamente, você pode mudar este valor.</li>
|
|
</ul>
|
|
|
|
|
|
<h2>Passo 4: full GCC</h2>
|
|
|
|
<p>Finalmente, no último passo deste tutorial, completamos a construção do GCC. Nesta etapa, várias bibliotecas de suporte do compilador são montadas (sendo a mais importante a libgcc.a). Felizmente este á o mais simples dos passos de compilação da NewLib:</p>
|
|
|
|
|
|
<p><br></p>
|
|
|
|
<table class="table_cod">
|
|
<tbody><tr align="left">
|
|
<th>$ cd gcc-4.3.1/build</th>
|
|
</tr>
|
|
<tr align="left">
|
|
<th>$ make all</th>
|
|
</tr> <tr align="left">
|
|
<th>$ sudo make install</th>
|
|
</tr>
|
|
</tbody></table>
|
|
|
|
|
|
|
|
|
|
<h2>Passo 5: Tudo pronto!</h2>
|
|
|
|
<p>
|
|
Agora você pode finalmente desfrutar do seu toolchain para ARM, e compile eLua com ele :) Se você precisar de mais explicações, ou se as instruções acima não funcionaram para você, sinta-se a vontade para entrar em <a href="http://www.eluaproject.net/en/Contact">contato comigo.</a>.</p>
|
|
$$FOOTER$$ |