Feed e Twitter

Feed RSS Twitter

Busca

Por Lustosa em 10/11/2009 às 00:06

O Gentoo é uma distribuição Linux famosa por ter todos os seus pacotes compilados do código fonte durante a instalação. Dessa forma, é possível gerar binários otimizados especificamente para a máquina onde vai rodar, especificando as flags que serão passadas para o compilador.
Além disso, também é possível especificar quais features cada pacote terá disponível. Assim, é possível, por exemplo, ter um pacote instalado sem suporte a determinadas coisas que não serão necessárias, evitando-se assim a instalação como dependência de pacotes que não serão usados.
Um problema que tive em uma instalação foi exatamente com as CFLAGS, as tais flags de otimização que são passadas para o compilador. Estava usando flags bem básicas, assim:

CFLAGS="-O2 -fomit-frame-pointer -march=nocona -pipe"

Essas flags especificam uma otimização nível 2 (pode ir de 0 a 3 – o 3 quebra alguns pacotes, por isso é recomendável usar o 2), e especifica também para qual conjunto de instruções os binários serão gerados. No meu caso, estou dizendo que os binários deverão ser compilados para se usar todo o poder do processador nocona (os dual/quad cores da Intel).
Até aí, tudo funcionando bem. Montei um sistema todo com essas flags, e estava tudo muito bem, até que precisei instalar o Bacula, um software para se fazer backups de sistemas completos.
O Bacula, com as CFLAGS padrões estava gerando um binário quebrado. Pesquisando, descobri que o projeto Hardened do Gentoo, que usa uma série de artifícios para gerar executáveis mais seguros e imunes contra ataques como buffer overflow era o responsável, pois por padrão ele passa a flag “FORTIFY_SOURCE” para o compilador, e isso estava quebrando o Bacula.
Uma das formas de se resolver esse problema seria alterando as CFLAGS no /etc/make.conf, adicionando -U_FORTIFY_SOURCE a elas. Porém, o grande problema é que as CFLAGS são válidas globalmente, e dessa forma, todos os pacotes seriam compilados com essa flag extra, matando parte dos recursos do projeto Hardened.
O que eu queria era poder compilar somente o Bacula com essa flag extra. Uma das formas é usar o diretório /etc/portage/env para criar variáveis de ambientes específicas para cada pacote.
Basta seguir os seguintes passos:

  1. 1. Pegue o nome completo do pacote, na forma categoria/pacote. No caso do Bacula, o nome completo é app-backup/bacula.
  2. 2. Crie o arquivo /etc/portage/env/categoria/pacote, ou no nosso caso, /etc/portage/env/app-backup/bacula. Caso o diretório “env” não exista, crie toda a árvore necessária.
  3. 3. Nesse arquivo, você pode especificar as variáveis de ambiente que serão definidas exclusivamente para a compilação do pacote. Assim, podemos definir CFLAGS neste arquivo:
    CFLAGS="${CFLAGS} -U_FORTIFY_SOURCE"

Pronto. Com isso, temos a flag extra -U_FORTIFY_SOURCE adicionada às flags globais, e só serão utilizadas para o pacote em questão.

Artigos relacionados

Arquivado em dicas

Feed RSS para os comentários deste artigo.

URL para Trackback.


Um comentário em “Personalizando CFLAGS por pacote no Gentoo”

  1. Optimização de site | Jonathan Dos Santos Web design - Blog comentou:

    [...] Personalizando CFLAGS por pacote no Gentoo [...]


Comentar




Copyright 2009 Ataraxia!   Sinopse