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 outras fontes.
Descobri, em sites por 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 ar (GNU archiver).
Desejando-se construir uma biblioteca de nome Engine, por exemplo, constituída pelos arquivos objetos som.elf, video.elf e chars.elf, faz-se algo assim:
$ ar rc libengine.a som.elf video.elf chars.elf
$ ranlib libengine.a
O argumento rc na verdade são 2: “r” e “c”. O “c” 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 “r” é para indicar que, se a biblioteca já existe e já contém o arquivo video.elf, por exemplo, que o substitua pela versão mais nova.
O nome da biblioteca sempre deve começar com lib (de library) e sua extensão oficial para estática é .a.
O comando ranlib 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 ar faz isso, mas é para garantir =].
Para realizar uma ligação com a biblioteca usa-se dois parâmetros do ld: -l (ou –library=) e -L (ou –library-path=).
No caso do Mega:
$ m68k-megadrive-elf-ld -static principal.elf -L. -lengine -o jogo.elf
- -lengine: a biblioteca. Suprime-se o “lib” inicial do nome e a extensão “.a”.
- -L.: um dos caminhos para procurar as bibliotecas a linkar é o diretório atual (. – ponto)
- -static: 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.
Se for desejado usar direto pelo gcc, seria algo assim:
$ gcc -static principal.c -L. -lmedia -o prog_ligacao_estatica
Próximo tópico, geração do gcc para Megadrive.
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 =)
Filed under: gcc | 2 Comments
Tags: ar, biblioteca, binutils, gcc, genesis, megadrive, ranlib, sega
Thanks, I was looking for a way to create library.
I don’t understand brazilian but your example is easy too follow.
I’ll try as soon as possible…on Windows (sorry)