module makefile falha para armv7l quando os módulos são compactados

0

Eu escrevi um gancho de rede usando o netfilter. Este módulo compila com sucesso no meu Ubuntu 16.04.

Agora eu quero compilá-lo na minha placa embutida, que usa um Linux personalizado usando a mesma versão do kernel no meu laptop. O único problema é que todos os módulos da minha placa embutida estão em .ko.xz format e meu makefile falha e não sei como resolver o problema.

Meu makefile original é:

obj-m += sysfirewall.o
all:
    make -C  /lib/modules/$(shell uname -r)/build -I/usr/Include/ M=$(PWD) modules
clean:
    make -C /lib/modules/$(shell uname -r)/build -I/usr/Include/ M=$(PWD) clean

Mas isso falhou porque não consegui encontrar nenhuma pasta de compilação no meu Linux incorporado. Em vez da pasta build, havia uma pasta do kernel que eu substituo pelo kernel.

Agora meu makefile é:

obj-m += sysfirewall.o
all:
    make -C  /lib/modules/$(shell uname -r)/kernel -I/usr/Include/ M=$(PWD) modules
clean:
    make -C /lib/modules/$(shell uname -r)/kernel -I/usr/Include/ M=$(PWD) clean

Mas quando executo o make no diretório atual, ele apresenta o seguinte erro:

$ make -C  /lib/modules/4.14.49-ti-r54/kernel -I/usr/Include/ M=/home/parsa/firewall/ modules
make[1]: Entering directory '/lib/modules/4.14.49-ti-r54/kernel'
make[1]: *** No rule to make target 'modules'.  Stop.
make[1]: Leaving directory '/lib/modules/4.14.49-ti-r54/kernel'9-ti-r54/uname -i 
Makefile:3: recipe for target 'all' failed
make: *** [all] Error 2

Como posso resolver este problema? Devo descompactar todos os módulos no meu kernel? Será que realmente é uma questão de módulos de kernel Linux compactados ou o erro mostra outra coisa?

P.S: não quero compilar de forma cruzada o módulo no meu laptop.

Editado: Eu notei que deveria haver um Makefile na pasta "/ lib / modules / $ (shell uname -r) / kernel" que não está na minha placa embutida. Eu rastreei o arquivo Make na pasta "/ lib / modules / $ (shell uname -r) / build" no meu laptop e percebi que é um link para /usr/src/linux-headers-4.4.0-128/Makefile . mas eu não tenho nada no meu / usr / src na minha placa embutida. então eu acho que tenho que encontrar um arquivo make para compilar este módulo e não sei como!

    
por PsP 03.07.2018 / 08:09

1 resposta

1

O problema não está na compactação, mas com make não encontrando os arquivos corretos. Observe que o comando make está inserindo o diretório /lib/modules/<kernel version>/kernel e relatando apenas um erro. Então não está encontrando o que precisa lá.

Você não pode substituir /lib/modules/<kernel version>/kernel to /lib/modules/<kernel version>/build : seus conteúdos são diferentes. O diretório kernel contém os módulos já compilados que vieram com essa versão específica do kernel. Isso não ajuda em nada o comando make : ele precisa dos arquivos makefiles e .h que vêm com o código-fonte do kernel. Algumas delas são geradas dinamicamente como parte da compilação principal do kernel.

Normalmente, o /lib/modules/<kernel version>/build é um link simbólico apontando para onde os cabeçalhos do kernel associados à versão do kernel em questão estão localizados. Se a sua placa incorporada usa um kernel que foi compilado na "maneira Debian" (isto é, com make bindeb-pkg ou similar no diretório fonte do kernel), o processo de compilação do kernel deveria ter produzido vários .deb packages:

  • linux-image-<version>_<patchversion>_<architecture>.deb = o kernel compilado e seus módulos
  • linux-headers-<version>_<patchversion>_<architecture>.deb = os cabeçalhos que você precisará para compilar mais módulos do kernel para este kernel específico

Nesse caso, você só precisará encontrar e instalar o pacote linux-headers correspondente à versão exata do kernel que você está usando na sua placa ARM. Ele fornecerá automaticamente o link /lib/modules/<kernel version>/build para você.

Se você tiver compilado seu próprio kernel personalizado com o tradicional make bzimage ou similar, você deverá fornecer o link /lib/modules/<kernel version>/build você mesmo. Se você ainda tem o diretório de compilação do kernel disponível, basta vinculá-lo a /lib/modules/<kernel version>/build .

    
por 03.07.2018 / 08:45