Como aplico um patch?

2

Eu preciso aplicar o seguinte patch, e não quero estragar o que tenho até agora. Abaixo, postei o conteúdo completo que encontrei on-line, que foi a resposta de alguém a uma pergunta semelhante à minha.

On Tue, 2007-03-20 at 14:32 -0500, James Bottomley wrote:

Is MODULE set to 'n'? It looks like the symbol export is guarded by #ifdef MODULE for some reason ... other than that, I can't explain this.

     

Na verdade, esse é o bug ... a configuração modular é MODULES não MÓDULO.   Você pode tentar isso:

---
diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig
diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c
index 0949145..a67f315 100644
--- a/drivers/scsi/scsi_scan.c
+++ b/drivers/scsi/scsi_scan.c
@@ -181,10 +181,8 @@ int scsi_complete_async_scans(void)
        return 0;
 }

-#ifdef MODULE
 /* Only exported for the benefit of scsi_wait_scan */
 EXPORT_SYMBOL_GPL(scsi_complete_async_scans);
-#endif

 /**
  * scsi_unlock_floptical - unlock device via a special MODE SENSE command

Encontrei o código acima on-line como uma solução para o problema que estou encontrando. Eu estou tentando construir módulos para o meu próprio kernel. Minha pergunta é como aplico o patch acima, por favor? Eu acho que tenho que estar em um diretório que eu possa ver /drivers , certo? O que devo fazer depois disso, por favor?

Aqui está o erro que recebo quando emito "make modules" para criar meu kernel e os drivers de dispositivos associados:

sansari@ubuntu:~/WORKING_DIRECTORY$ make modules
scripts/kconfig/conf --silentoldconfig Kconfig
sound/soc/codecs/audience/Kconfig:40:warning: type of 'SND_SOC_ES_SLIM' redefined from 'boolean' to 'tristate'
sound/soc/codecs/audience/Kconfig:43:warning: type of 'SND_SOC_ES_I2C' redefined from 'boolean' to 'tristate'
sound/soc/codecs/audience/Kconfig:44:warning: choice value used outside its choice group
sound/soc/codecs/audience/Kconfig:41:warning: choice value used outside its choice group
  CHK     include/linux/version.h
  CHK     include/generated/utsrelease.h
make[1]: 'include/generated/mach-types.h' is up to date.
  CC      arch/arm/kernel/asm-offsets.s
  GEN     include/generated/asm-offsets.h
  CALL    scripts/checksyscalls.sh
  CC [M]  drivers/scsi/scsi_wait_scan.o
  Building modules, stage 2.
  MODPOST 1 modules
ERROR: "__aeabi_unwind_cpp_pr0" [drivers/scsi/scsi_wait_scan.ko] undefined!
ERROR: "__aeabi_unwind_cpp_pr1" [drivers/scsi/scsi_wait_scan.ko] undefined!
ERROR: "scsi_complete_async_scans" [drivers/scsi/scsi_wait_scan.ko] undefined!
ERROR: "wait_for_device_probe" [drivers/scsi/scsi_wait_scan.ko] undefined!
make[1]: *** [__modpost] Error 1
make: *** [modules] Error 2

@faheem - Obrigado. Ainda não estou claro em quais arquivos aplicar essa alteração. Alguém poderia explicar o que a correção está fazendo? Quais arquivos estão sendo atualizados e como? Meu entendimento do patch é que você o adiciona a um arquivo. Tem algumas linhas antes e depois da mudança. O programa corresponde às cadeias no arquivo de destino e, em seguida, aplica a alteração. Estou correto em dizer que a correção acima está mudando o kconfig e o scsi_scan.c?

    
por user3326293 01.05.2015 / 17:23

1 resposta

4

Os patches são aplicados 1 com o comando patch . O diretório drivers/ que você está procurando está no nível superior da árvore de origem do kernel; você aplicaria algo assim:

$ cd ~/linux
$ ls
arch           firmware  lib              README          usr
block          fs        MAINTAINERS      REPORTING-BUGS  virt
COPYING        include   Makefile         samples         vmlinux
CREDITS        init      mm               scripts         vmlinux-gdb.py
crypto         ipc       modules.builtin  security        vmlinux.o
debian         Kbuild    modules.order    sound
Documentation  Kconfig   Module.symvers   System.map
drivers        kernel    net              tools
$ patch -p1 < ~/path/patch-file.diff

Esse ls é apenas para mostrar a você como deve ser o diretório correto. Alguns desses arquivos estão lá apenas após a criação (por exemplo, vmlinux), portanto, não se preocupe se eles estiverem ausentes. O -p1 significa ignorar a/ e b/ na frente dos nomes de caminho no patch ( -p0 não ignoraria nada, -p2 ignoraria a/drivers , etc.)

Isso irá responder a sua pergunta, mas a menos que você tenha realmente construído seu kernel sem módulos carregáveis (o que você não tem, se você está fazendo make modules ), é pouco provável que conserte o erro que você está vendo .

Notas de rodapé
1 Você também pode usar git para aplicá-las se estiver usando para controle de versão, mas eu estou supondo que você não são.

    
por 01.05.2015 / 18:22