<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress.com" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>binutils &amp;laquo; WordPress.com Tag Feed</title>
	<link>http://wordpress.com/tag/binutils/</link>
	<description>Feed of posts on WordPress.com tagged "binutils"</description>
	<pubDate>Tue, 07 Oct 2008 22:11:34 +0000</pubDate>

	<generator>http://wordpress.com/tags/</generator>
	<language>en</language>

<item>
<title><![CDATA[Make your programs lose weight: stripping binaries]]></title>
<link>http://sigquit.wordpress.com/?p=5</link>
<pubDate>Sun, 14 Sep 2008 12:16:35 +0000</pubDate>
<dc:creator>drehbahn</dc:creator>
<guid>http://sigquit.pt-br.wordpress.com/2008/09/14/make-your-programs-lose-weight-stripping-binaries/</guid>
<description><![CDATA[`objcopy&#8216;  is one of the utilities included in the GNU Binutils package. This tool allows cop]]></description>
<content:encoded><![CDATA[<p>`<strong>objcopy</strong>'  is one of the utilities included in the <strong>GNU Binutils package</strong>. This tool allows copying binary files while transforming them in the process.</p>
<p>One of the typical purposes of modifying binary files after they have been compiled is to separate the debugging symbols and sections and the real executable. If you compiled you binary with debugging information (option '-g' in gcc), the size of the binary will grow a lot due to the extra symbols, sections and human-readable stuff stored within the binary. That information is really useful when you are debugging your app, anyway, so you don't really want to completely get rid of it.</p>
<p>So, we can use objcopy to move all the debugging information from the binary to another file, so that:</p>
<ul>
<li>Binary is smaller</li>
<li>Binary does not include any 'human-readable' information of the program</li>
<li>Debugging information can be kept by the developers, so that if any 'core' file is received for that specific binary, debugging with GDB is possible.</li>
</ul>
<p><strong>[Step 1]</strong> Copy the binary to another file, keeping only the debugging information. This will create the <strong>symbol file</strong> for the binary, and will be kept by the developers of the program for debugging purposes:<br />
<code><br />
objcopy &#45;&#45;only-keep-debug $BINARY_PATH $DEBUG_INFO_FILE<br />
</code></p>
<p><strong>[Step 2]</strong> Once you have created the symbol file, you can now remove all the debugging information from the binary itself:<br />
<code><br />
objcopy &#45;&#45;strip-debug $BINARY_PATH<br />
</code></p>
<p><strong>[Step 3]</strong> After you have created both files, an extra optional option is to add a debug-link to the binary, to specify which is the exact file containing the debug information for that binary:<br />
<code><br />
objcopy &#45;&#45;add-gnu-debuglink=$DEBUG_INFO_FILE $BINARY_PATH<br />
</code><br />
Please note that this third step is optional, as we can use specific GDB commands when debugging a core file to specify in which file the debug information is located.</p>
<p>[References]</p>
<ol>
<li><a href="http://sourceware.org/binutils">http://sourceware.org/binutils</a></li>
<li><a href="http://www.gnu.org/software/binutils">http://www.gnu.org/software/binutils</a></li>
</ol>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Extraindo o conteúdo de formatos .deb]]></title>
<link>http://escovandobits.wordpress.com/?p=47</link>
<pubDate>Fri, 29 Feb 2008 02:15:33 +0000</pubDate>
<dc:creator>Tiago Maluta</dc:creator>
<guid>http://escovandobits.pt-br.wordpress.com/2008/02/29/extraindo-o-conteudo-de-formatos-deb/</guid>
<description><![CDATA[Esse post mostra como extrair o conteúdo de um arquivo no formato deb, sem gerenciadores como o dpk]]></description>
<content:encoded><![CDATA[<p align="justify">Esse <i>post</i> mostra como extrair o conteúdo de um arquivo no formato <a href="http://en.wikipedia.org/wiki/Deb_(file_format)" target="_blank">deb</a>, sem gerenciadores como o dpkg e os utilitários apt/aptitude.  O formato deb foi originalmente desenvolvido para o Debian e, devido a distribuições como o Ubuntu, tem se tornado bem popular.</p>
<p align="center"><img src="http://escovandobits.wordpress.com/files/2008/02/debian_wikipedia.png" alt="Informações acerca formato deb" /></p>
<p><!--more--></p>
<p><b>O problema </b></p>
<p align="justify">Recentemente eu precisei do binário de um programa (o software pré-compilado) para utilizar no Gentoo. Esse programa era o <b>make</b> [<a href="http://www.gnu.org/software/make/" target="_blank">1</a>]. Logo, não era possível utilizar o emerge e muito menos acessar o repositório do projeto GNU, fazer o download do código-fonte e compilá-lo manualmente.  Como, normalmente o desenvolvedor não oferece pacotes pré-compilados, eu tinha duas opções. A primeira, entrar com o Live CD e copiar o respectivo arquivo, a outra seria utilizar algum arquivo pré-compilado de outras distribuições, como o Debian, Ubuntu, etc. Por razões práticas optei pela segunda.</p>
<p><b>Procedimento</b></p>
<p align="justify">Para o processo, utilizaremos basicamente programas no canivete suíço no UNIX, principalmente os utilitários dos pacote binutils [<a href="http://www.gnu.org/software/binutils/" title="Binutils" target="_blank">2</a>]. Depois de efetuar o download:</p>
<blockquote><p># <b>wget</b> http://ftp.br.debian.org/debian/pool/main/m/make-dfsg/make_3.81-2_i386.deb<br />
# file make_3.81-2_i386.deb<br />
make_3.81-2_i386.deb: Debian binary package (format 2.0)</p></blockquote>
<p>Para listar os símbolos desse arquivo, utilizaremos o <b>nm</b>:</p>
<blockquote><p>#<b> nm -s</b> make_3.81-2_i386.deb<br />
nm: debian-binary: File format not recognized<br />
nm: control.tar.gz: File format not recognized<br />
nm: data.tar.gz: File format not recognized</p></blockquote>
<p align="justify">Podemos ver que existem 3 arquivos: <b>debian-binary</b>,<b> control.tar.gz</b> e <b>data.tar.gz. </b>Vamos extraí-los com o <b>ar, </b>uma ferramenta para criar, modificar e extraír de arquivos, mais informações nas páginas do man ou <a href="http://www.gnu.org/software/binutils/manual/html_chapter/binutils_1.html" target="_blank">aqui</a>.</p>
<blockquote><p># <b>ar -x</b> make_3.81-2_i386.deb</p></blockquote>
<p>Analisando cada arquivo temos:</p>
<blockquote><p># <b>cat debian-binary</b><br />
2.0</p></blockquote>
<p align="justify">Que são informações da versão do binário, o próximo arquivo (control.tar.gz) armazena informações  sobre o pacote</p>
<blockquote><p># <b>tar zxvf</b> <b>control.tar.gz</b><br />
./<br />
./control<br />
# <b>cat control</b><br />
<i> Package: make<br />
Version: 3.81-2<br />
Section: devel<br />
Priority: standard<br />
Architecture: i386<br />
Depends: libc6 (&#62;= 2.3.6-6)<br />
Suggests: make-doc-non-dfsg<br />
Installed-Size: 1572<br />
Maintainer: Manoj Srivastava<br />
Source: make-dfsg<br />
Description: The GNU version of the "make" utility.<br />
GNU Make is a program that determines which pieces of a large<br />
program need to be recompiled and issues the commands to recompile<br />
them, when necessary. More information about GNU Make can be found in<br />
the `make' Info page. The upstream sources for this package are<br />
available at the location ftp://ftp.gnu.org/gnu/make/. The<br />
documentation for this package does not meet the Debian Free Software<br />
Guidelines, and has been removed from this package.</i></p></blockquote>
<p align="justify">Faltando apenas o programa propriamente dito, no arquivo data.tar.gz, eu recomendo descarregar os arquivos em um pasta separada e depois copiar apenas o que interessa, em outras palavras, você pode descarregar os arquivos na raíz do sistema e ele ficar nas pastas do sistema ou então criar um diretório qualquer (mkdir ~/teste)  e fazer tudo lá. No meu caso eu copiei apenas o executável para a pasta /usr/bin do sistema.</p>
<blockquote><p># tar zxvf data.tar.gz<br />
./<br />
./usr/<br />
./usr/bin/<br />
./usr/bin/make<br />
./usr/lib/<br />
./usr/share/<br />
./usr/share/man/<br />
(...)</p></blockquote>
<p>Pronto! No meu caso eu pude recuperar o make no meu sistema.<b></b></p>
<p><b>Conclusões</b></p>
<p>Há programas que fazem isso automaticamente como o <a href="http://www.miketaylor.org.uk/tech/deb/" target="_blank">deb2targz</a>, o objetivo é apresentar o conceito por trás do formato .deb. Esse método é uma solução paliativa, pode não funcionar em casos de programa com muitas dependências, exceto se você arrumá-las, mas aí é preferível usar o gerenciador de pacotes da sua distribuição (apt, emerge, yum). Em <i>posts</i> futuros apresentarei outros formatos de arquivos, como o rpm, e maneiras de trabalhar com seu conteúdo.</p>
<p><b>Referências</b><br />
http://www.gnu.org/software/make/<br />
http://www.gnu.org/software/binutils/<br />
http://www.miketaylor.org.uk/tech/deb/</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Gerando um assembler para Z80 (Sega Master System ou Sega Megadrive)]]></title>
<link>http://aventuranolinux.wordpress.com/2008/01/16/gerando-um-assembler-para-z80-sega-master-system-ou-sega-megadrive/</link>
<pubDate>Wed, 16 Jan 2008 04:15:05 +0000</pubDate>
<dc:creator>aventuranolinux</dc:creator>
<guid>http://aventuranolinux.pt-br.wordpress.com/2008/01/16/gerando-um-assembler-para-z80-sega-master-system-ou-sega-megadrive/</guid>
<description><![CDATA[Seguindo as instruções de um post meu mesmo &#8220;antigo&#8221;, fui capaz de gerar um assembler ]]></description>
<content:encoded><![CDATA[<p>Seguindo as instruções de <a HREF="http://aventuranolinux.wordpress.com/2007/11/04/gerando-um-assembler-para-sega-mega-drive-genesis/">um post meu mesmo "antigo"</a>, fui capaz de gerar um assembler e linker para o processador Z80, que o Megadrive usa como coprocessador de som e o Master System como principal (e única) CPU.</p>
<p>A única diferença é que, infelizmente, não há suporte para arquivos-objeto ELF ainda (binutils versão 2.18), só COFF. E, esquisitamente, só permite rodar o <em>configure</em>, se o alvo (<em>--target</em>) for <strong>z80-unknown-coff</strong>. O resto seguiu sem maiores problemas.</p>
<p>Meus agradecimentos à <a TITLE="WikiTI" HREF="http://aventuranolinux.wordpress.com/wp-admin/WikiTI">WikiTI</a> por me dar essa informação sem saber =]</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Correção para o uso de bibliotecas estáticas]]></title>
<link>http://aventuranolinux.wordpress.com/2007/11/18/correcao-para-o-uso-de-bibliotecas-estaticas/</link>
<pubDate>Sun, 18 Nov 2007 22:13:04 +0000</pubDate>
<dc:creator>aventuranolinux</dc:creator>
<guid>http://aventuranolinux.pt-br.wordpress.com/2007/11/18/correcao-para-o-uso-de-bibliotecas-estaticas/</guid>
<description><![CDATA[Em um post anterior, cometi um equívoco de ignorar a ordem de passagem dos parâmetros de ligação]]></description>
<content:encoded><![CDATA[<p>Em <a HREF="http://aventuranolinux.wordpress.com/2007/11/07/como-gerar-e-utilizar-bibliotecas-estaticas/">um post anterior</a>, cometi um equívoco de ignorar a ordem de passagem dos parâmetros de ligação a uma biblioteca estática.</p>
<p>Ao menos no caso do m68k e no x86_64 (amd64), a biblioteca deve vir depois de quem a precisa. Caso contrário, os símbolos contidos serão descartados, pensando-se ser inúteis.</p>
<p>Portanto, em vez de:<br />
<code>$ gcc -L. -lengine main.o -o programa</code></p>
<p>O <strong>correto</strong> é:<br />
<code>$ gcc -L.  main.o <strong>-lengine</strong> -o programa</code></p>
<p>Ou, usando o <em>ld</em>:<br />
<code>ld -static principal.elf -L. <strong>-lengine</strong> -o jogo.elf</code></p>
<p>A posição do argumento <strong>-L</strong> não tem importância.</p>
<p>O post foi corrigido.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Como gerar e utilizar bibliotecas estáticas]]></title>
<link>http://aventuranolinux.wordpress.com/2007/11/07/como-gerar-e-utilizar-bibliotecas-estaticas/</link>
<pubDate>Wed, 07 Nov 2007 02:34:19 +0000</pubDate>
<dc:creator>aventuranolinux</dc:creator>
<guid>http://aventuranolinux.pt-br.wordpress.com/2007/11/07/como-gerar-e-utilizar-bibliotecas-estaticas/</guid>
<description><![CDATA[Novamente, uma outra necessidade quando se modulariza as coisas e se quer reaproveitá-las (ou simpl]]></description>
<content:encoded><![CDATA[<p>Novamente, uma outra necessidade quando se modulariza as coisas e se quer reaproveitá-las (ou simplesmente empacotá-las ;) ) é utilizar/criar bibliotecas. Como o meu foco ainda é geração de jogos de Megadrive, não há sentido fazer uma biblioteca dinâmica, apenas estáticas. Quem tiver interesse em dinâmicas, consulte <a HREF="http://users.actcom.co.il/~choo/lupg/tutorials/libraries/unix-c-libraries.html#creating_shared_library">outras fontes</a>.</p>
<p>Descobri, em <a HREF="http://www.adp-gmbh.ch/cpp/gcc/create_lib.html">sites por aí</a>, que uma biblioteca é uma coleção de arquivos objetos bem indexados. O binutils nos fornece a ferramenta necessária para sua geração, o <a HREF="http://sourceware.org/binutils/docs-2.18/binutils/ar.html#ar">ar</a> (<em>GNU archiver</em>).</p>
<p>Desejando-se construir uma biblioteca de nome <strong>Engine</strong>, por exemplo, constituída pelos arquivos objetos som.elf, video.elf e chars.elf, faz-se algo assim:</p>
<p><code>$ ar rc libengine.a som.elf video.elf  chars.elf<br />
$ ranlib libengine.a</code></p>
<p>O argumento <strong>rc</strong> na verdade são 2: "r" e "c". O "<strong>c</strong>" indica que é para criar a biblioteca se ela não existir. Conforme o próprio manual, essa opção é só para não emitir uma mensagem de aviso: a biblioteca é gerada em todo caso. O argumento "<strong>r</strong>" é para indicar que, se a biblioteca já existe e já contém o arquivo <strong>video.elf</strong>, por exemplo, que o substitua pela versão mais nova.</p>
<p>O nome da biblioteca sempre deve começar com <em>lib</em> (de <em>library</em>) e sua extensão oficial para estática é <strong>.a</strong>.</p>
<p>O comando <a HREF="http://sourceware.org/binutils/docs-2.18/binutils/ranlib.html#ranlib">ranlib</a> serve para garantir a agilidade (em tempo de compilação) do índice de símbolos (nomes de funções, variáveis, etc.) dos arquivos contidos na biblioteca, bem como garantir que a ordem do arquivamento não influencie em nada. Muitas vezes, o próprio <em>ar</em> faz isso, mas é para garantir =].</p>
<p>Para realizar uma ligação com a biblioteca usa-se dois parâmetros do <em>ld</em>: -l (ou --library=) e -L (ou --library-path=).</p>
<p>No caso do Mega:</p>
<p><code>$ m68k-megadrive-elf-ld -static  principal.elf -L. -lengine -o jogo.elf</code></p>
<ul>
<li><strong>-lengine</strong>: a biblioteca. Suprime-se o "lib" inicial do nome e a extensão ".a".</li>
<li><strong>-L.</strong>: um dos caminhos para procurar as bibliotecas a linkar é o diretório atual (<strong>.</strong> - ponto)</li>
<li><strong>-static</strong>: só para assegurar que a ligação é estática. Se existir uma biblioteca de mesmo nome, mas dinâmica, ignorá-la e usar a sua versão estática.</li>
</ul>
<p>Se for desejado usar direto pelo gcc, seria algo assim:</p>
<p><code>$ gcc -static principal.c -L. -lmedia -o prog_ligacao_estatica</code></p>
<p>Próximo tópico, geração do gcc para Megadrive.</p>
<blockquote><p>Editado: A ordem aparentemente importa nos parâmetros... Ao menos para o m68k e x86_64 (AMD64). Referenciei a biblioteca depois de ela se fazer necessária e tudo deu certo =)</p></blockquote>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Criando o binário para Megadrive a partir de mais de um arquivo-objeto]]></title>
<link>http://aventuranolinux.wordpress.com/2007/11/06/criando-o-binario-para-megadrive-a-partir-de-mais-de-um-arquivo-objeto/</link>
<pubDate>Tue, 06 Nov 2007 02:21:36 +0000</pubDate>
<dc:creator>aventuranolinux</dc:creator>
<guid>http://aventuranolinux.pt-br.wordpress.com/2007/11/06/criando-o-binario-para-megadrive-a-partir-de-mais-de-um-arquivo-objeto/</guid>
<description><![CDATA[Quando se é uma pessoa organizada (ou quando o projeto cresce/tende a crescer muito), o projeto dev]]></description>
<content:encoded><![CDATA[<p>Quando se é uma pessoa organizada (ou quando o projeto cresce/tende a crescer muito), o projeto deve ser desenvolvido de forma modularizada. Isso tanto por causa de conferência do código, quanto de reaproveitamento do mesmo.</p>
<p>Modularizar quase sempre em dividir o código em arquivos fontes diferentes. Ou seja, implica em montagem/compilação por partes. Por exemplo, dividir o jogo em 3 arquivos 1) "<a HREF="http://pt.wikibooks.org/wiki/Desenvolvimento_de_jogos/Programação_Megadrive#Cabe.C3.A7alho_da_ROM">cabeçalho da ROM</a>" (cabecalho.s) e 2) instruções do processador (codigo.s) 3) imagem da tela de abertura (imagem.s).</p>
<p>Para "compilar" (o correto em assembly é "<em>montar</em>") isso:<br />
<code>$ m68k-megadrive-as -m68000 cabecalho.s -o cabecalho.elf<br />
$ m68k-megadrive-as -m68000 codigo.s -o codigo.elf<br />
$ m68k-megadrive-as -m68000 imagem.s -o imagem.elf</code></p>
<p>Como fazer tudo isso virar um único arquivo? Esse processo é chamado de ligação (<em>linkagem</em> ou <em>link</em>) e o programa GNU que faz isso é o <a HREF="http://sourceware.org/binutils/docs-2.18/ld/index.html">ld</a> (<em>GNU linker</em>).</p>
<p>Teoricamente, poderia se fazer desta forma:<br />
<code>$ m68k-megadrive-ld cabecalho.elf codigo.elf imagem.elf -o jogo.elf<br />
$ m68k-megadrive-objcopy -O binary jogo.elf -o jogo.bin</code><br />
No entanto, a saída pode não sair da forma esperada. Se ordem dos parâmetros for diferente (imagem.elf cabecalho.elf codigo.elf), o arquivo elf de união pode sair em uma ordem interna diferente. O problema é o <a HREF="http://sourceware.org/binutils/docs-2.18/binutils/objcopy.html#objcopy">objcopy</a>, que, quando passa para o formato binário (dump de memória), ele segue a ordem das seções internas do elf, <a href="http://users.actcom.co.il/~choo/lupg/tutorials/libraries/unix-c-libraries.html#link_order">pelo que entendo</a>. Isso faz com que o cabeçalho não fique necessariamente no começo da ROM, como é obrigatório ser. Quem determina essa ordem, é a seqüência dos arquivos objetos passadas ao <em>ld</em>. No entanto, como não sei se essa regra da ordem é ainda realmente válida e nem por quanto tempo vai durar, segue aqui uma forma segura de corrigir isso.</p>
<p>É necessário obrigar, então, com que o elf da união dos códigos esteja bem ordenado (sem se preocupar com a ordem dos parâmetros): que o cabeçalho fique na posição 0x00000000, que o código comece, por exemplo (o caso padrão), na posição 0x00000200, etc. Para ter esse controle, é preciso escrever um <a HREF="http://sourceware.org/binutils/docs-2.18/ld/Scripts.html#Scripts">script pro linker</a> que ordene as coisas da forma correta. O script é um arquivo texto comum contendo algo assim:<br />
<code><br />
SECTIONS {<br />
  _cabecalho 0x00000000 :<br />
  {<br />
    *(cabecalho)<br />
  }<br />
  _principal 0x00000200 :<br />
  {<br />
    codigo.elf(.text)<br />
  }<br />
  _resto :<br />
  {<br />
    *(*)<br />
  }<br />
}<br />
</code><br />
Da forma como o script está escrito, o elf gerado (jogo.elf - nome definido na linha de comando) terá 3 sessões: _cabecalho (localizada na posição 0x00), _principal (residindo na posição 0x0200) e _resto. Nessa nova sessão chamada _cabeçalho , estará o código (no caso, serão apenas dados) assembly que estiver na seção <strong>cabecalho</strong> de qualquer .elf passado na linha de comando do <em>ld</em>. As instruções iniciais do jogo devem estar escritas no arquivo <strong>codigo.elf</strong>. A seção .text (que implica em ser código, em geral) dele ficará na posição 0x200. Por fim, vêm todas as outras seções e arquivos .elf não contemplados.</p>
<p>Isso não funcionou aqui. O objcopy descartou a seção _cabeçalho pelo fato de eu não ter usado nenhuma referência de lá em lugar algum, tornando-o desnecessário.</p>
<p>O script então ficou assim:<br />
<code>SECTIONS {<br />
rom 0x00000000 :<br />
{<br />
*(cabecalho)<br />
codigo.elf(.text)<br />
}<br />
resto :<br />
{<br />
*(*)<br />
}<br />
}</code></p>
<p>Para realizar a ligação, então fica:</p>
<p><code>$ m68k-megadrive-ld -dT ldscript cabecalho.elf codigo.elf imagem.elf -o jogo.elf<br />
$ m68k-megadrive-objcopy -O binary jogo.elf -o jogo.bin</code></p>
<p>Repare que para chamar o script, usei a opção <strong>-dT </strong>.</p>
<p>E, assim, consegui fazer a geração do binário para o megadrive a partir de vários arquivos-objetos.</p>
<p>Obs.: Para quem tentar usar a diretiva assembly <strong>.org </strong>um aviso: no GNU assembler, ele dita a posição relativa na seção do .elf em questão (chama-se <em>location counter</em>  ou <em>lc</em>), e não a posição absoluta que a diretiva <strong>ORG</strong> que a maioria dos assembler faz acontecer.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Gerando um assembler para SEGA Mega Drive (Genesis)]]></title>
<link>http://aventuranolinux.wordpress.com/2007/11/04/gerando-um-assembler-para-sega-mega-drive-genesis/</link>
<pubDate>Sun, 04 Nov 2007 22:41:05 +0000</pubDate>
<dc:creator>aventuranolinux</dc:creator>
<guid>http://aventuranolinux.pt-br.wordpress.com/2007/11/04/gerando-um-assembler-para-sega-mega-drive-genesis/</guid>
<description><![CDATA[Querendo usar ferramentas GNU para criar softwares (jogos?) em liguagem assembly e/ou C para Mega Dr]]></description>
<content:encoded><![CDATA[<p>Querendo usar ferramentas GNU para criar softwares (jogos?) em liguagem assembly e/ou C para Mega Drive, fui em busca do <a href="http://www.gnu.org/software/binutils/" target="_blank" title="GNU binutils"> binutils</a> para ter um assembler para Motorola 68000 (o processador do console).</p>
<p>Aqui está como eu fiz para gerar meu <a href="http://sourceware.org/binutils/docs-2.18/as/index.html" title="gas" target="_blank">gas</a> - o GNU assembler - (meus passos foram baseados na fonte <a href="http://darkdust.net/marc/sega/m68k-cross-compiling.php" title="Marc's Realm" target="_blank">Marc's Realm</a>):</p>
<p>Primeiro, obtive a versão mais nova do <a href="ftp://sourceware.org/pub/binutils/snapshots/binutils.tar.bz2" title="binutils">binutils</a>, que no caso foi a <a href="ftp://ftp.gnu.org/pub/gnu/binutils/binutils-2.18.tar.bz2" title="2.18">2.18</a>. Então, descompactei o arquivo com "tar jxf binutils-2.18.tar.bz2". Ele cria uma pasta chamada <i>binutils-2.18</i>.</p>
<p>Criei um diretório chamado <i>binutils-build</i>, onde ficará os arquivos de compilação do binutils, deixando a árvore do código fonte intacta.</p>
<p>De dentro desse diretório, via terminal, chamei o script configure do binutils:</p>
<pre>$ ../binutils-2.18/configure --prefix=/opt/m68k --target=m68k-megadrive-elf --disable-libada --disable-libssp</pre>
<p>Lembrando:</p>
<ul>
<li><b>--prefix</b> diz a pasta onde será instalado o programa pelo comando<i> make install</i>. É opcional, mas prefiro não deixar nas pastas convencionais.</li>
<li><b>--target </b>indica para qual arquitetura e/ou processador as ferramentas gerarão o código.</li>
<li>O alvo (<b>m68k-megadrive-elf</b>) é dividido em 3 partes: X-Y-Z, sendo X  o processador (família <b>m68k</b>), Y é o nome da plataforma (à escolha: linux, jumento, unknown, etc.), e Z é o formato do arquivo de saída (no caso, <b>elf</b>).</li>
<li><b>--disable-libada </b> desabilita a compilação da biblioteca ADA, completamente desnecessária para o meu caso.</li>
<li><b>--disable-libssp</b> inibe a compilação da biblioteca SSP, que não sei para que serve, então não preciso ;)</li>
</ul>
<p>Após realizada a geração dos makefiles, hora de gerar os binários!</p>
<pre>$ make</pre>
<p>Feito isso com sucesso, basta instalar as ferramentas como super-usuário (root):</p>
<pre>$ su -c "make install"</pre>
<p>Lembre-se de colocar o diretório do prefix (caso tenha usado essa opção) na variável de ambiente $PATH para atalhar as coisas!</p>
<pre>export PATH=$PATH:/opt/m68k</pre>
<p>Inclua isso, por exemplo, no arquivo <b>.bashrc</b>.</p>
<p>Agora, terás o assembler (e outras ferramentas úteis) para m68k!</p>
<ul>
<li>m68k-megadrive-elf-as: o assembler</li>
<li>m68k-megadrive-elf-objcopy: converte de elf/coff para binário</li>
<li>m68k-megadrive-elf-ld: o linker</li>
</ul>
<p>Para gerar um arquivo binário para o Megadrive, deve fazer:</p>
<pre>
$ m68k-megadrive-elf-as -m68000 codigo.s -o codigo.elf
$ m68k-megadrive-elf-objcopy -O binary codigo.elf codigo.bin</pre>
<p>Et voilà! Seu jogo em formato direitinho pro Megadrive e emuladores.</p>
<p>Inconveniente do processo: O assembler gerado é para a família m68k, isso quer dizer que variantes como 68010 e 68020 também podem ser montados. Como o Mega só usa o 68000, os programas são desnecessariamente maiores. E o pior: o 68020 é dado como padrão. Isso implica em ficar definindo toda vez que for montar que o processador é o 68000 e não o 68020. Só descobri uma forma de definir o 68000 como único processador de montagem: ao realizar o <b>configure</b> do binutils, definir o alvo (<i>target</i>) como m68000-megadrive-elf. Entretanto, isso elimina a opção -m68000 (desnecessária, agora) do assembler, o que estraga as coisas para  a compilação do gcc, que mostrarei em um post futuro...</p>
<p>Se alguém souber como definir pro assembler o processador 68000 como padrão,  agradeço.</p>
]]></content:encoded>
</item>

</channel>
</rss>
