再構築せずにvmlinux.bin(組み込みinitramfs)にファイルシステムイメージを再パッケージしますか?

再構築せずにvmlinux.bin(組み込みinitramfs)にファイルシステムイメージを再パッケージしますか?

存在するvmlinux.binからファイルシステムイメージを抽出する方法は?そしてhttps://wiki.gentoo.org/wiki/Custom_Initramfs#Salvagingカーネルイメージに含まれる組み込みinitramfs / initrdを取得して解凍する方法を提供します。

cpioこれで、変更されたファイルシステム(たとえばパッケージングが有効lzma)を再コンパイルせずにカーネル実行可能ファイルに挿入したいと思います。このようにカーネルのELFイメージを変更できますか?それではどうでしょうか?単にバイトを変更する場合(たぶんハッシュで?)何かを保存する必要がありますか?


objdump-h出力:
vmlinux.64.orig:     file format elf64-big

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .text         004162b8  ffffffff80100000  ffffffff80100000  00010000  2**7
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 __ex_table    000063a0  ffffffff805162c0  ffffffff805162c0  004262c0  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  2 .notes        00000024  ffffffff8051c660  ffffffff8051c660  0042c660  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  3 .rodata       0041f700  ffffffff8051d000  ffffffff8051d000  0042d000  2**8
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  4 .pci_fixup    00000d40  ffffffff8093c700  ffffffff8093c700  0084c700  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  5 __ksymtab     0000a430  ffffffff8093d440  ffffffff8093d440  0084d440  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  6 __ksymtab_gpl 00004ff0  ffffffff80947870  ffffffff80947870  00857870  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  7 __ksymtab_strings 00010f14  ffffffff8094c860  ffffffff8094c860  0085c860  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  8 __init_rodata 00000500  ffffffff8095d778  ffffffff8095d778  0086d778  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  9 __param       00001388  ffffffff8095dc78  ffffffff8095dc78  0086dc78  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 10 .data         000508c0  ffffffff80960000  ffffffff80960000  00870000  2**14
                  CONTENTS, ALLOC, LOAD, DATA
 11 .init.text    0002b084  ffffffff809b1000  ffffffff809b1000  008c1000  2**5
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 12 .init.data    00bc6d78  ffffffff809dc088  ffffffff809dc088  008ec088  2**3
                  CONTENTS, ALLOC, LOAD, DATA
 13 .exit.text    000019e0  ffffffff815a2e00  ffffffff815a2e00  014b2e00  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 14 .data.percpu  00003680  ffffffff815a5000  ffffffff815a5000  014b5000  2**7
                  CONTENTS, ALLOC, LOAD, DATA
 15 .bss          00068fb0  ffffffff815b0000  ffffffff815b0000  014b8680  2**16
                  ALLOC
 16 .mdebug.abi64 00000000  ffffffff81618fb0  ffffffff81618fb0  014b8680  2**0
                  CONTENTS, READONLY
 17 .comment      0000cd74  0000000000000000  0000000000000000  014b8680  2**0
                  CONTENTS, READONLY
 18 .gnu.attributes 00000010  0000000000000000  0000000000000000  014c53f4  2**0

ベストアンサー1

はい、可能です。ただし、カーネルのELF実行可能ファイルが仮想アドレスに静的にリンクされているため、.init.ramfsセクションのサイズとアドレスを変更するだけでは不十分です。始まりと終わりinitramfsセクション。

Linuxソースコードでは、関連コードはiniramfs.cソースファイルにあります。

void __init populate_rootfs(void)
{
  char *err = unpack_to_rootfs(__initramfs_start, __initramfs_end - __initramfs_start, 0); 
...
}

したがって、.init.textセクションのunpack_to_rootfs()関数を呼び出す機械語コードでも、これら2つのオフセットを変更する必要があります。 (再配置テーブルに関連項目があることを確認してください!...ある場合)

また、Icarusの回答を参照すると、initramfsセクションのサイズ、ファイルオフセット、および開始仮想アドレスの操作と、上記の2つのオフセット(unpack_to_rootfs()関数のパラメータ)を介してカスタムを直接追加できます。大きいinitramfsセクションは、ELFファイルの最大仮想アドレスの上にロードされます。プログラムヘッダー(PHeader)の「メモリサイズ」フィールドも、以前の仮想アドレス空間の末尾に追加されたより大きなinitramfsセクションを反映するように変更する必要があります。

ポリスチレン もともとinit.ramfsセクションを新しいハイスタート仮想アドレスに移動した後、カーネル仮想アドレス空間に残っている「穴」は何の害もありません。接続されたメモリは、後でinitで定義されたfree_initmem(void)関数によって解放されるためです。 .cソースファイル。

おすすめ記事