私は現在、単純なLinuxカーネルモジュールを開発しており、makeコマンドとsudo makeコマンドの実行に関する問題を抱えています。これは私のMakefileの内容です。
obj-m := main.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
通常のユーザーとしてmakeを実行すると、コンパイルプロセスは完全に機能します。しかし、sudo makeを試してみると、$(PWD)コマンドが失敗してエラーが発生するようです。 pwd は環境変数で、シェルから root でシャットダウンして実行する場合でもうまくコンパイルされます。作るrootユーザーとして
sudo makeを実行するとエラー出力が発生します。:
make -C /lib/modules/`uname -r`/build M= modules
make[1]: Entering directory '/usr/src/linux-headers-6.2.0-39-generic'
make[2]: *** No rule to make target 'arch/x86/entry/syscalls/syscall_32.tbl', needed by 'arch/x86/include/generated/uapi/asm/unistd_32.h'. Stop.
make[1]: *** [arch/x86/Makefile:248: archheaders] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-6.2.0-39-generic'
make: *** [Makefile:4: all] Error 2
$(PWD)コマンドが失敗してエラーが発生したようです。誰もが理解するのに役立つか、実際に役立つ可能性のある洞察力がある場合は非常に感謝します。ありがとう
答え1
あなたのsudo
設定は、与えられたコマンドを実行する前に環境を整理することPWD
ですmake
。
この設定を変更するように依頼してください。sudo
いいえ環境を浄化する:
sudo -E make
(設定が許可されている場合)またはPWD
手動で値を指定してください。
sudo make PWD="$PWD"
Make自体の「現在のディレクトリ」変数を使用するようにMakefileを変更することも可能でなければなりませんCURDIR
。
all:
make -C /lib/modules/$(shell uname -r)/build M=$(CURDIR) modules