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:
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.
Feed RSS para os comentários deste artigo.
January 14th, 2010 às 13:41
[...] Personalizando CFLAGS por pacote no Gentoo [...]