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シリーズ)
- 作者: 宗像尚郎/海老原祐太郎
- 出版社/メーカー: CQ出版
- 発売日: 2016/04/15
- メディア: 単行本
- この商品を含むブログ (3件) を見る