読者です 読者をやめる 読者になる 読者になる

linux 4.7でライブパッチ用のカーネルモジュールにelfのセクションチェックが入ったのでめも

linux kernel

Linux 4.7からライブパッチ用のカーネルモジュールをロードする時にELFのセクションをチェックするようになりました。

このチェックが入ったこととで、今までのモジュールを再コンパイルするだけだと以下のようなエラーになってロードに失敗します。

[  153.824961] livepatch: module livetest is not marked as a livepatch module
[  153.826718] livetest: failed to register patch

これはkernel/livepatch/core.cのklp_resolve_symbols()という関数でチェックしています。

233         for (i = 0; i < relasec->sh_size / sizeof(Elf_Rela); i++) {
234                 sym = pmod->core_kallsyms.symtab + ELF_R_SYM(relas[i].r_info);
235                 if (sym->st_shndx != SHN_LIVEPATCH) {
236                         pr_err("symbol %s is not marked as a livepatch symbol",
237                                strtab + sym->st_name);
238                         return -EINVAL;
239                 }

SHN_LIVEPATCHはinclude/uapi/linux/elf.hで定義されています。 これをどうやって設定するかですが、livepatch: reuse module loader code to write relocations · torvalds/linux@425595a · GitHubを見ると、

MODULE_INFO(livepatch, "Y");

こんな行が追加されているので、自分のモジュールにも追加します。そして再度コンパイルすればロードできるようになります。

動くメカニズムを図解&実験! Linux超入門 (My Linuxシリーズ)

動くメカニズムを図解&実験! Linux超入門 (My Linuxシリーズ)