Verificando links, arquivos e compiladores

Uma das coisas mais chatas com relação a estes drivers é que os módulos gerados durante a instalação funcionam apenas numa versão específica do Kernel. Ao atualizar o Kernel, ou reinstalar uma distribuição diferente, você precisará sempre reinstalar os drivers.

Existem muitas coisas que podem dar errado na hora de compilar estes drivers. Vamos a um checklist dos problemas mais comuns:


– Kernel Headers
: Os headers do Kernel são um pré-requisito para instalar qualquer driver. Os arquivos vão na pasta “/usr/src/kernel-headers-2.6.x/” ou “/usr/src/linux-headers-2.6.x/“.

Os headers, ou cabeçalhos, incluem um conjunto de endereços e comandos, necessários para que o instalador do driver conheça o Kernel em que está trabalhando e consiga gerar um módulo sob medida para ele, mesmo sem ter o código fonte completo. É como um marceneiro que constrói móveis sob medida apenas com as medidas dos cômodos da casa.

Dentro da pasta devem existir pelo menos as pastas “arch/“, “include/” e “scripts/“:

Geralmente, o pacote “kernel-headers” incluído nas distribuições inclui apenas a pasta “include”, que não é suficiente para instalar muitos drivers, incluindo o VMware, por exemplo. Nestes casos você precisará instalar também o pacote “kernel-source” que contém o código fonte completo do Kernel, copiando as outras duas pastas de que precisamos a partir da pasta “/usr/src/linux/2.6.x”.

Outra coisa importante a verificar o conteúdo da pasta “arch/”. Ela deve conter a pasta “i386” e dentro desta, um conjunto com várias pastas e arquivos. Em muitas distribuições, a pasta arch vem vazia dentro do pacote kernel-headers e o conteúdo é movido para dentro do pacote kernel-source. Nestes casos você precisa mesmo ter instalados os dois pacotes.


– Kernel Source
: O código fonte completo do Kernel vai na pasta “/usr/src/linux-2.6.x/” ou em alguns casos na pasta “/usr/src/kernel-source-2.6.x“, onde o “2.6.x” é a versão do Kernel.

Em muitos casos, como no Debian por exemplo, ao instalar o pacote kernel-source será apenas copiado um arquivo compactado em .tar.bz2 para a pasta “/usr/src/”. Para concluir a instalação, você ainda precisará descompactá-lo com o comando “tar -jxvf kernel-source-2.6.x”.

Dentro da pasta “/usr/src/linux-2.x.x” devem existir as pastas “arch/”, “include/” e “scripts/”, juntamente com vários outras que contém o restante do código fonte. Em alguns casos, o source não contém a pasta include/. Neste caso, copie-a a partir da pasta com os headers.

Desde que as três pastas estejam em ordem, o source completo substitui a pasta com os headers e pode ser usado no lugar deles na hora de compilar drivers.


– O link “/usr/src/linux”
: Em geral, os scripts de instalação dos drivers não se preocupam em tentar descobrir em qual pasta estão os headers do Kernel. No lugar disso eles simplesmente acessam a pasta “/usr/src/linux“, que é na verdade um link simbólico que deve apontar a pasta correta, com os headers ou o source do Kernel.

Em alguns casos, ele é criado automaticamente a instalar os pacotes com os headers ou o fonte do Kernel, em outros você deverá criá-lo manualmente, apontando ou para a pasta com os headers, ou para a pasta com o fonte completo.

Lembre-se de que os links simbólicos são criados com o comando “ln -s pasta_destino link”, como em ln -s /usr/src/linux-headers-2.6.14-kanotix-6 /usr/src/linux“.


– O link /lib/modules/2.x.x/build
: Muitos scripts checam outro link, o build, dentro da pasta com os módulos do Kernel, que também deve apontar para os headers ou os fontes do Kernel. Caso seja necessário criá-lo manualmente, rode o comando:

# ln -s /usr/src/kernel-headers-2.6.x /lib/modules/2.6.x/build

Não se esqueça de substituir o “2.6.x” em todos os exemplos pela versão do Kernel instalada na sua máquina.

– A versão do gcc: O compilador mais usado no Linux é o gcc. Ele compila não apenas código fonte em C mas também em várias outras linguagens.

Infelizmente, o gcc possui um histórico de incompatibilidades entre suas diferentes versões, o que faz com que o mesmo código fonte compilado em versões diferentes gere binários diferentes e em muitos casos até mesmo incompatíveis entre si.

Os desenvolvedores conhecem bem estes problemas, por isso sempre recomendam que você sempre use a mesma versão do gcc que foi usada para compilar o Kernel para compilar qualquer módulo ou driver que seja instalado posteriormente. Módulos compilados com versões diferentes do gcc muitas vezes não funcionam ou apresentam problemas diversos.

Normalmente as distribuições incluem sempre a mesma versão do gcc que foi usada para compilar o Kernel. Mas, caso você tenha atualizado o gcc ou atualizado o Kernel, vai acabar com versões diferentes.

A partir daí, muitos drivers não vão mais compilar, reclamando que a versão do gcc instalada é diferente da usada para compilar o Kernel.

Nestes casos, a solução ideal é procurar a versão correta do gcc e instalá-la. Mas, se por qualquer motivo não for possível fazer isso, você pode forçar os instaladores a usarem a versão instalada configurando a variável CC do sistema para apontar para a versão atual do CC. Este comando deve ser dado no terminal, antes de chamar o instalador. Ele não é persistente, você deve usá-lo antes de cada instalação:

# export CC=/usr/bin/gcc-4.0
(onde o “/usr/bin/gcc-4.0” é a localização do executável do gcc atualmente instalado)

Caso isso não seja suficiente, configure a variável IGNORE_CC_MISMATCH com o valor 1, o que faz com que a checagem da versão do GCC seja desativado completamente:

# export IGNORE_CC_MISMATCH=1


– Outros compiladores
: Além do gcc, alguns drivers podem precisar de outros compiladores ou bibliotecas, como o g++ e o libc6-dev. Por isso é sempre interessante marcar a categoria “compiladores” durante a instalação da distribuição. Isso assegura que você possui o conjunto completo. No Kurumin você pode usar o ícone mágico “instalar-compiladores”.

Sobre o Autor

Redes Sociais:

Deixe seu comentário

X