2018年07月17日

「ARMで学ぶアセンブリ言語入門」を読みながら、qemu-arm -L /usr/arm-linux-gnueabi/ helloworld.elf 実行してARMプロセッサ向け実行可能ファイルをQEMUを通して実行してみた

OS:Ubuntu18.04です。

「ARMで学ぶアセンブリ言語入門」を読みながら、P38 はじめてのクロス開発、
を実際に実行してみました。

まずは、パッケージのインストールから。

0.準備
apt install qemu
apt install qemu-kvm
apt install gcc-arm-linux-gnueabi
apt install libc6-armel-armhf-cross

apt install qemu-kvm-extras <=これはパッケージが無かった(PPAだとあるかな?)


1.ソース
  helloworld.c
----------------------
#include

int main(int argc,char argv[]){
printf("hello,world\n");
return 0;
}


2.ビルド
 クロスコンパイラ「arm-linux-gnueabi-gcc」でビルドします。
 -LでダイナミックリンクライブラリをPATH指定します。

arm-linux-gnueabi-gcc -o helloworld.elf helloworld.c


3.実行

qemu-arm(QEMUのARMプロセッサ向けユーザーエミュレーションモード)で実行します。

$ qemu-arm -L /usr/arm-linux-gnueabi/ helloworld.elf


helloworld.elf を通常のgccでコンパイルした実行可能ファイルと比較すると、


objdump -h helloworld.elf

15 .ARM.exidx とか  24 .ARM.attributesなどが表示されていることが確認できます。

通常のIntel CPUでの実行可能ファイルと違うので、これから調べてみます。


●参考1
http://blog.kmckk.com/archives/4950141.html
.ARM.exidxセクションは、libgcc によって使用される C++ の例外処理用コード等が含まれるセクション 、らしい。


●参考2
http://nsaito-nmiri.hateblo.jp/entry/2015/05/22/201534



◎ARMで学ぶアセンブリ言語入門:円

ARMで学ぶ アセンブリ言語入門
ARMで学ぶ アセンブリ言語入門



◎リンカ・ローダ実践開発テクニック:円
リンカ・ローダ実践開発テクニック―実行ファイルを作成するために必須の技術 (COMPUTER TECHNOLOGY)
リンカ・ローダ実践開発テクニック―実行ファイルを作成するために必須の技術 (COMPUTER TECHNOLOGY)




●追記

readelf -h helloworld.elf を実行すると、ARM と表示されていますね。

ELF ヘッダ:
マジック: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
クラス: ELF32
データ: 2 の補数、リトルエンディアン
バージョン: 1 (current)
OS/ABI: UNIX - System V
ABI バージョン: 0
型: EXEC (実行可能ファイル)
マシン: ARM
バージョン: 0x1
エントリポイントアドレス: 0x1030c
プログラムの開始ヘッダ: 52 (バイト)
セクションヘッダ始点: 6876 (バイト)
フラグ: 0x5000200, Version5 EABI, soft-float ABI
このヘッダのサイズ: 52 (バイト)
プログラムヘッダサイズ: 32 (バイト)
プログラムヘッダ数: 9
セクションヘッダ: 40 (バイト)
セクションヘッダサイズ: 29
セクションヘッダ文字列表索引: 28



検索していると、なにやら凄い役立ちそうなサイトも見つかったので、
リンクしておく。
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0474ej/DHCCFGFG.html




$ file helloworld.elf を実行すると、どのCPUアーキテクチャ向け実行可能ファイルか
確認可能です。

helloworld.elf: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=2a3eca168ccd376d0766be5df41db9762a915f46, not stripped



次は、P56 はじめてのアセンブリプログラミング(2つの値を加算する)、です。
posted by アンドレアス at 08:47| Comment(0) | vi上級 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。