https://linux-audit.com/elf-binaries-on-linux-understanding-and-analytic/ 説明する
タイプフィールドは、ファイルがどの用途に使用されるかを示します。いくつかの一般的なファイル形式があります。
CORE (value 4) DYN (Shared object file), for libraries (value 3) EXEC (Executable file), for binaries (value 2) REL (Relocatable file), before linked into an executable file (value 1)
...
一般的な誤解は、ELFファイルがバイナリまたは実行可能ファイルにのみ適用されることです。私たちは、部分的フラグメント(オブジェクトコード)に使用できることを確認しました。別の例は、共有ライブラリまたはコアダンプ(そのコアまたはa.outファイル)です。 ELF仕様は、カーネル自体やLinuxのLinuxカーネルモジュールでも使用されます。
カーネル自体とカーネルモジュールにはどのタイプのELFがありますか?
私が試してみるカーネル自体やカーネルモジュール用のファイルの例を挙げてくださいfile
。 Ubuntu 18.04を使用しています。
ありがとうございます。
答え1
自分で見つけることができます:
モジュールの場合は、以下を確認してください/lib/modules/$(uname -r)/kernel/.../*.ko
。
$ file xfs.ko
xfs.ko: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), BuildID[sha1]=bcb5e287509cedbb0c5ece383e0b97fb99e4781e, not stripped
$ readelf -h xfs.ko
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: REL (Relocatable file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x0
Start of program headers: 0 (bytes into file)
Start of section headers: 1829088 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 0 (bytes)
Number of program headers: 0
Size of section headers: 64 (bytes)
Number of section headers: 45
Section header string table index: 44
カーネルの簡単な方法は、カーネルをコンパイルしてvmlinuxを見てみることです。
$ file vmlinux
vmlinux: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=eaf006a7ccfedbc40a6feddb04088bdb2ef0112f, with debug_info, not stripped
$ readelf -h vmlinux
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x1000000
Start of program headers: 64 (bytes into file)
Start of section headers: 171602920 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 5
Size of section headers: 64 (bytes)
Number of section headers: 43
Section header string table index: 42
答え2
ほとんどのLinuxディストリビューションでは、カーネルは/boot
圧縮ファイルとして保存されます。bz画像。スクリプト(Ubuntuシステムでパッケージ化されています)を使用してextract-vmlinux
解凍できます。linux-headers
Ubuntu 16.04では、次のコマンドを実行して4.4.0カーネルのELFタイプを確認できます。
$ sudo /usr/src/linux-headers-4.4.0-127/scripts/extract-vmlinux /boot/vmlinuz-4.4.0-127-generic > /tmp/vmlinux &&
readelf -h /tmp/vmlinux | grep Type
Type: EXEC (Executable file)