ARM V8をシミュレータで試食（自分でクロスコンパイルしたコードをLinuxで動かす）

前回 http://qiita.com/chromabox/items/343147fce4ccf36b041f のつづきです。

実際に自分でコンパイルしたコードをシミュレータ上のLinuxで動かしてみます。

## gccの在り処

gccは次のところにあるので、ダウンロードします。
http://releases.linaro.org/14.04/components/toolchain/binaries
の
gcc-linaro-aarch64-linux-gnu-4.8-2014.04_linux.tar.xz
です。
(14.04 のところは変わるかもしれません。ディスクイメージにあったものを使ってください。)

ダウンロードしたら適当なところで展開します。


## コンパイル方法

単純に
`[フルパス]aarch64-linux-gnu-gcc sample.c`
とやればAArch64なコードを吐いてくれるみたいです。

毎回パスを指定するのは面倒なので、環境変数設定シェルスクリプトを用意しておくとよいでしょう。


```bash:v8env.sh
#!/bin/bash
export CROSS_COMPILE=aarch64-linux-gnu-
export  PATH=[hogehoge]gcc-linaro-aarch64-linux-gnu-4.8-2014.04_linux/bin:$PATH
echo "set armfoundation v8 linaro 14.04"

```

コンパイルした実行可能ファイルは前回のイメージマウント方法でマウントしたファイルシステムにコピーします。

## サンプル

以下のサンプルを作って動かしてみました。

```c:sizeoftest.c

#include <stdio.h>
#include <wchar.h>

int main(int argc, char *argv[])
{
	printf("char size %d \n",sizeof(char));
	printf("wchar_T size %d \n",sizeof(wchar_t));
	printf("int size %d \n",sizeof(int));
	printf("long int size %d \n",sizeof(long int));
	printf("unsigned long size %d \n",sizeof(unsigned long));
	printf("long long size %d \n",sizeof(long long));
	printf("short int size %d \n",sizeof(short int));
	
	printf("\n");
	printf("float size %d \n",sizeof(float));
	printf("double size %d \n",sizeof(double));
	printf("long double size %d \n",sizeof(long double));
	
	printf("\n");
	printf("void pointer size %d \n",sizeof(void *));
	printf("int pointer size %d \n",sizeof(int *));
	
    return 0;
}

```

実行結果はこんな感じになりました。

```console:log

$ ./sizeofs 
char size 1 
wchar_T size 4 
int size 4 
long int size 8 
unsigned long size 8 
long long size 8 
short int size 2 

float size 4 
double size 8 
long double size 16 

void pointer size 8 
int pointer size 8

```

何もしなくてもAArch64で動いてるのがわかると思います。
ポインタが軒並み8Byte、long intも8Byteになってますね。
long double も16Byteになってます。
この辺もIntel86系と同じでホッとしました。

(注意：ARM社にあるABI仕様書はBetaとかかれてるのでもしかしたら今後変更があるのかもしれません。
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.subset.swdev.abi/index.html
)

##逆アセンブル結果はどうなってるか？

とりあえずMainだけ逆アセンブルするとこんな感じです。
レジスタの名前がxほげほげとかwほげほげになってますね。
ちなみに、xは64Bitレジスタでwは32Bitレジスタです。

以前のARMとは違い、AArch64の時、SPは独立したレジスタになっている事に注意です。

関数の入り口のコードも32BitARMの時より変わってますね。
個人的には小ざっぱりしたなぁと感じました。

```console:objdump

$ aarch64-linux-gnu-objdump -d sizeofs
sizeofs:     ファイル形式 elf64-littleaarch64
セクション .text の逆アセンブル:
	...
00000000004005a0 <main>:
  4005a0:	a9be7bfd 	stp	x29, x30, [sp,#-32]!
  4005a4:	910003fd 	mov	x29, sp
  4005a8:	b9001fa0 	str	w0, [x29,#28]
  4005ac:	f9000ba1 	str	x1, [x29,#16]
  4005b0:	90000000 	adrp	x0, 400000 <_init-0x3b8>
  4005b4:	911c8000 	add	x0, x0, #0x720
  4005b8:	d2800021 	mov	x1, #0x1                   	// #1
  4005bc:	97ffff99 	bl	400420 <printf@plt>
  4005c0:	90000000 	adrp	x0, 400000 <_init-0x3b8>
  4005c4:	911cc000 	add	x0, x0, #0x730
  4005c8:	d2800081 	mov	x1, #0x4                   	// #4
  4005cc:	97ffff95 	bl	400420 <printf@plt>
  4005d0:	90000000 	adrp	x0, 400000 <_init-0x3b8>
  4005d4:	911d2000 	add	x0, x0, #0x748
  4005d8:	d2800081 	mov	x1, #0x4                   	// #4
  4005dc:	97ffff91 	bl	400420 <printf@plt>
  4005e0:	90000000 	adrp	x0, 400000 <_init-0x3b8>
  4005e4:	911d6000 	add	x0, x0, #0x758
  4005e8:	d2800101 	mov	x1, #0x8                   	// #8
  4005ec:	97ffff8d 	bl	400420 <printf@plt>
  4005f0:	90000000 	adrp	x0, 400000 <_init-0x3b8>
  4005f4:	911dc000 	add	x0, x0, #0x770
  4005f8:	d2800101 	mov	x1, #0x8                   	// #8
  4005fc:	97ffff89 	bl	400420 <printf@plt>
  400600:	90000000 	adrp	x0, 400000 <_init-0x3b8>
  400604:	911e2000 	add	x0, x0, #0x788
  400608:	d2800101 	mov	x1, #0x8                   	// #8
  40060c:	97ffff85 	bl	400420 <printf@plt>
  400610:	90000000 	adrp	x0, 400000 <_init-0x3b8>
  400614:	911e8000 	add	x0, x0, #0x7a0
  400618:	d2800041 	mov	x1, #0x2                   	// #2
  40061c:	97ffff81 	bl	400420 <printf@plt>
  400620:	52800140 	mov	w0, #0xa                   	// #10
  400624:	97ffff83 	bl	400430 <putchar@plt>
  400628:	90000000 	adrp	x0, 400000 <_init-0x3b8>
  40062c:	911ee000 	add	x0, x0, #0x7b8
  400630:	d2800081 	mov	x1, #0x4                   	// #4
  400634:	97ffff7b 	bl	400420 <printf@plt>
  400638:	90000000 	adrp	x0, 400000 <_init-0x3b8>
  40063c:	911f2000 	add	x0, x0, #0x7c8
  400640:	d2800101 	mov	x1, #0x8                   	// #8
  400644:	97ffff77 	bl	400420 <printf@plt>
  400648:	90000000 	adrp	x0, 400000 <_init-0x3b8>
  40064c:	911f8000 	add	x0, x0, #0x7e0
  400650:	d2800201 	mov	x1, #0x10                  	// #16
  400654:	97ffff73 	bl	400420 <printf@plt>
  400658:	52800140 	mov	w0, #0xa                   	// #10
  40065c:	97ffff75 	bl	400430 <putchar@plt>
  400660:	90000000 	adrp	x0, 400000 <_init-0x3b8>
  400664:	911fe000 	add	x0, x0, #0x7f8
  400668:	d2800101 	mov	x1, #0x8                   	// #8
  40066c:	97ffff6d 	bl	400420 <printf@plt>
  400670:	90000000 	adrp	x0, 400000 <_init-0x3b8>
  400674:	91204000 	add	x0, x0, #0x810
  400678:	d2800101 	mov	x1, #0x8                   	// #8
  40067c:	97ffff69 	bl	400420 <printf@plt>
  400680:	52800000 	mov	w0, #0x0                   	// #0
  400684:	a8c27bfd 	ldp	x29, x30, [sp],#32
  400688:	d65f03c0 	ret

```