存在する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ソースファイル。