mirror of
https://github.com/elua/elua.git
synced 2025-01-08 20:56:17 +08:00
bd1465ca50
Conflicts: SConstruct doc/en/arch_platform.html doc/en/comunity.html doc/en/overview.html doc/en/refman.html doc/en/refman_gen.html doc/en/status.html doc/en/tut_bootstick.html doc/images/lng_pt.png doc/images/minusnode.png doc/images/next.png doc/images/node.png doc/images/nodelast.png doc/images/plusnode.png doc/images/plusnodelast.png doc/images/previous.png doc/images/showall.png doc/images/sync.png doc/images/vertline.png doc/pt/arch.html doc/pt/arch_coding.html doc/pt/arch_con_term.html doc/pt/arch_newport.html doc/pt/arch_overview.html doc/pt/arch_platform.html doc/pt/arch_tcpip.html doc/pt/building.html doc/pt/comunity.html doc/pt/dl_binaries.html doc/pt/dl_old.html doc/pt/dl_sources.html doc/pt/downloads.html doc/pt/examples.html doc/pt/faq.html doc/pt/installing_i386.html doc/pt/installing_lm3s.html doc/pt/news.html doc/pt/overview.html doc/pt/refman_dep.html doc/pt/refman_gen.html doc/pt/status.html doc/pt/tc_386.html doc/pt/toolchains.html doc/pt/tut_openocd.html doc/pt/using.html romfs/LM3S.lua romfs/led.lua romfs/morse.lua romfs/pong.lua src/lua/linit.c src/modules/auxmods.h src/platform/lm3s/platform.c src/platform/lm3s/platform_conf.h src/platform/sim/platform_conf.h
235 lines
11 KiB
HTML
235 lines
11 KiB
HTML
$$HEADER$$
|
|
<p>Inicialmente, a idéia de um "i386" cross "compiler" em Linux parece estranha. Afinal, você já roda Linux numa plataforma compatível com i386. Porém, o compilador as vezes segue certos caminhos misteriosos junto com o sistema operacional onde este está rodando (veja por exemplo <a href="http://wiki.osdev.org/GCC_Cross-Compiler">esta página</a> para alguns sintomas possíveis). E ainda, você deseja usar uma NewLib, e não uma Libc, e ainda adaptar o máximo possível o seu ambiente às suas necessidades. Portanto, este tutorial irá mostrá-lo como fazer isso.</p>
|
|
<p><strong>AVISO: Não sou um especialista no processo de construção de uma GCC/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 neste processo. Se você acha que, o que fiz aqui está errado, impreciso ou, simplesmente, escandalosamente feio, não hesite em <a href="overview.html#contacts">contactar-me</a> e farei as correções necessárias. E claro, este tutorial é fornecido sem qualquer 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á funcionar, 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 de instalado. No entanto, você precisa verificar a sua distribuição específica.</li>
|
|
|
|
|
|
<li>GNU binutils: faça o download clicando <a href="http://ftp.gnu.org/gnu/binutils/">aqui</a>. No momento em que estava fazendo 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> logo após de ter escolhido o seu mirror.</li>
|
|
|
|
|
|
<li>Newlib: enquanto preparava este tutorial, a versão mais recentes era a 1.16.0. Faça o download do diretório <a href="ftp://sources.redhat.com/pub/newlib/index.html">FTP Newlib</a>.</li>
|
|
|
|
<li>Além disso, este tutorial assume que você esteja usando o bash como seu shell. Se você usar qualquer outra coisa, provavelmente você precisará ajustar alguns comandos do shell específico.</li>
|
|
|
|
</ul>
|
|
|
|
<p>Você ainda precisará de outros programas e bibliotecas a fim de construir 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, decida onde pretende instalar o seu toolchain. Eles geralmente são instalados no diretório /usr/local/, logo, assumiremos o diretório /usr/local/cross-i386 para este tutorial. Para agilizarmos 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-i686</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 style="text-align: left;">$ tar -xvjf binutils-2.17.tar.bz2</th>
|
|
</tr>
|
|
<tr align="left">
|
|
<th>$ cd binutils-2.17</th>
|
|
</tr>
|
|
<tr align="left">
|
|
<th>$ mkdir build</th>
|
|
</tr>
|
|
<tr align="left">
|
|
<th>$ cd build</th>
|
|
</tr>
|
|
<tr align="left">
|
|
<th>$ ../configure --target=i686-elf --prefix=$TOOLPATH --with-gnu-as --with-gnu-ld --disable-nls</th>
|
|
</tr>
|
|
<tr align="left">
|
|
<th>$ make all</th>
|
|
</tr>
|
|
<tr align="left">
|
|
<th>$ sudo make install</th>
|
|
</tr>
|
|
<tr align="left">
|
|
<th>$ export PATH=${TOOLPATH}/bin:$PATH</th>
|
|
</tr>
|
|
</tbody></table>
|
|
|
|
|
|
|
|
|
|
<p>Agora você tem os "binutils" para a CPU i386(assembler, linker, disassembler ...) em seu PATH.</p>
|
|
<h2>› Passo 2: GCC básico</h2>
|
|
|
|
<p>Nesta etapa iremos criar uma GCC "básica" (ou seja, uma GCC sem nenhuma bibliotecas de suporte, a qual utilizaremos 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, emitindo o seguinte erro muito estranho "Link tests are not allowed after GCC_NO_EXECUTABLES". Após googlear um pouco, encontrei a seguinte solução:</p>
|
|
|
|
<p><br></p>
|
|
|
|
<table class="table_cod">
|
|
<tbody><tr align="left">
|
|
<th>$ tar -xvjf gcc-4.3.1.tar.bz2</th>
|
|
</tr>
|
|
<tr align="left">
|
|
<th>$ cd gcc-4.3.1/libstdc++-v3</th>
|
|
</tr>
|
|
<tr align="left">
|
|
<th>$ joe configure.ac</th>
|
|
</tr>
|
|
</tbody></table>
|
|
|
|
|
|
|
|
<p>Estou usando o "joe", como meu editor de Linux favorito, no entanto, 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>
|
|
|
|
<pre><code> # AC_LIBTOOL_DLOPEN<br></code></pre>
|
|
|
|
<p>Salve o arquivo e saia do editor de texto.</p>
|
|
|
|
<p><br></p>
|
|
|
|
<table class="table_cod">
|
|
<tbody><tr align="left">
|
|
<th>$ autoconf</th>
|
|
</tr>
|
|
<tr align="left">
|
|
<th>$ 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=i686-elf --prefix=$TOOLPATH
|
|
--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><br></p>
|
|
|
|
<table class="table_cod">
|
|
<tbody><tr>
|
|
<th>$ sudo -s -H</th>
|
|
</tr>
|
|
</tbody></table>
|
|
|
|
|
|
<pre><code> # export PATH=/usr/local/cross-i686/bin:$PATH<br> # make install-gcc<br> # exit<br></code></pre>
|
|
|
|
|
|
<h2>› Passo 3: Newlib</h2>
|
|
|
|
<p>Outra vez, esse passo 3 NewLib, é tão fácil quanto descompactar, configurar e compilar. Mas eu preciso que a minha biblioteca seja do menor tamanho possível (em contraposição, a tão rápida quanto possível) e só quero manter o 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=i686-elf --prefix=$TOOLPATH
|
|
--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 -D__PREFER_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 inteira, mas não dá para fazê-lo aqui. Para um melhor entendimento, veja <a href="http://openhardware.net/Embedded_ARM/NewLib_Stubs/">esta página</a>.</li>
|
|
|
|
<li><code>-D__PREFER_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 criaçã da GCC. Nesta etapa, várias bibliotecas de suporte do compilador são montadas (sendo a mais importante a libgcc.a). Felizmente isto é mais simples do que a compilacriaçã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>Finalmente, você poderá usar o seu toolchain para i386, e compilar eLua com ele :) Após completar os passos acima, você será capaz de dar boot em eLua direto do seu PC, como descrito <a href="tut_bootpc.html">aqui</a>, e não precisará fazer o download do arquivo ELF da página do projeto eLua, já que você o gerou usando sua própria toolchain!
|
|
Se você precisar de mais explicações ou se as instruções acima não funcionaram para você, sinta-se a vontade para <a href="overview.html#contacts">contactar-me</a>.</p>
|
|
$$FOOTER$$
|