Incluindo blobs binários em um programa C

É comum fazer um programa em C que depende de arquivos externos. Um exemplo clássico pro povo que desenvolve com GTK+ são os arquivos do Glade ou do GtkBuilder (estes arquivos possuem uma descrição dos formulários em XML).

Isso causa um pouco de poluição no sistema de arquivos, e faz com que a execução do programa quando não instalado (principalmente quando se usa um ambiente de desenvolvimento onde não se tem acesso a usuário root) um bocado difícil. Existem alternativas — no HardInfo eu uso o binreloc (que permite guardar esse tipo de arquivo em locais diferentes dos hardcoded durante a compilação), parte da suíte do Autopackage — mas para alguns tipos de arquivos seria interessante que os dados estivessem dentro do próprio executável.

Alguns sistemas operacionais permitem a inclusão de uma seção de recursos. Provavelmente power users de Windows e MacOS já usaram programas de edição destes recursos inúmeras vezes: alterar ícones, telas e até mesmo tabelas de dispositivos de extensões do MacOS. Mas no Unix não existe uma maneira única para esse tipo de seção.

Lendo o Planet GNOME, vi um post do Ross Burton sobre o tema. Lá ele explica como fazer isso usando um truque com o ld (GNU Linker) e objcopy (utilitário do binutils) — e um leitor do blog dele mostra um truque mais legal ainda, usando o as (GNU Assembler). Baseado no post dele e nos comentários, eu fiz um script shell que gera tanto o arquivo objeto (funcionou em x86, x86-64 e sparc64) quanto um cabeçalho com a referência ao arquivo.

O cabeçalho possui uma definição do tipo extern char nomearquivo_extensao[1000];, onde 1000 é o tamanho do arquivo — o que ajuda um bocado em algumas situações (como no glade_xml_new_from_buffer).

Enfim, o script está disponível aqui.

Comentários? :)

Leave a Comment