4

x86 Linux に組み込みシステム (mipsel) 用のクロスコンパイル ツールチェーンがあります。カスタムカーネル(イメージを「vmlinux」と呼びましょう)を構築する方法と、そのイメージを削除する方法を知っています

objcopy -S -O binary vmlinux vmlinux.bin

さらに処理するには、イメージのロード アドレスとエントリ ポイントも必要です。ストリッピングする前にscripts/mksysmap、それらを介して、またはより明示的に決定することは問題ありません

nm -n vmlinux | grep -v '\( [aNUw] \)\|\(__crc_\)\|\( \$[adt]\)' > System.map

次に、ロードアドレスとエントリポイントを決定できます

awk '/A _text/ { print "0x"$1; }' < _System.map
awk '/T kernel_entry/ { print "0x"$1; }' < System.map

ここでの課題は、カーネルを自分でビルドするのではなく、objcopyを介してシンボルを既に削除したに、事前にビルドされたカーネルを取得することがあるということです。誰でもこれを行う方法を教えてもらえますか? 私はカーネルの構築とツールチェーンの使用にあまり精通していません。nmobjdumpの両方が、ストリップされたイメージを気に入らず、次のように述べています。

vmlinux.bin: File format not recognized
4

1 に答える 1

1

objcopy マニュアルページから

objcopy を使用すると、バイナリの出力ターゲットを使用して生のバイナリ ファイルを生成できます (たとえば、-O binaryを使用します)。objcopy が未加工のバイナリ ファイルを生成する場合、基本的に、入力オブジェクト ファイルの内容のメモリ ダンプが生成されます。すべてのシンボルと再配置情報は破棄されます。メモリ ダンプは、出力ファイルにコピーされた最下位セクションの仮想アドレスから開始されます。

PowerPC アーキテクチャで使用できる例を次に示します。

元の vmlinux

bash-3.2$ file vmlinux
vmlinux: ELF 32-bit MSB executable, PowerPC or cisco 4500, version 1 (SYSV), statically linked, not stripped

ストリップされた vmlinux は「データ」ファイルと見なされます

bash-3.2$ file vmlinux.bin
vmlinux.bin: data

PowerPC 用にバイナリを ELF 形式に変換する

bash-3.2$ powerpc-440fp-linux-objcopy -I binary vmlinux.bin -B powerpc -O elf32-powerpc vmlinux.bin.x

vmlinux の出力が ELF ファイルと見なされるようになりました

bash-3.2$ file vmlinux.bin.x
vmlinux.bin.x: ELF 32-bit MSB relocatable, PowerPC or cisco 4500, version 1 (SYSV), not stripped

-I-B、および-Oパラメーターを渡す必要があります。このパラメーターは、objcopy のドキュメントから取得できます。

しかし、バイナリはすでに逆コンパイルしようとしてストリップされているため、セクション情報が利用できないため、価値がない可能性があります。ファイル内のすべてのデータが .data セクションにダンプされます。

于 2012-01-12T11:31:00.447 に答える