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 =)



2 Responses to “Como gerar e utilizar bibliotecas estáticas”  

  1. 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)


  1. 1 Correção para o uso de bibliotecas estáticas « Aventura no Linux

Leave a Reply