====== emdebian のリポジトリを追加し、クロスコンパイラを導入する方法 ======
[[http://qiita.com/myahal@github/items/fc332e53713df244518f|armhfクロスコンパイル環境を作る - Qiita]] をやってみます。
\\
===== 設定 =====
==== apt-line の追加 ====
/etc/apt/sources.list.d/crosstools.list を追加します。
root@jessie:~# nano -w /etc/apt/sources.list.d/crosstools.list
deb http://emdebian.org/tools/debian/ jessie main
\\
==== curl の導入 ====
root@jessie:~# apt-get install curl
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
libcurl3
The following NEW packages will be installed:
curl libcurl3
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 459 kB of archives.
After this operation, 933 kB of additional disk space will be used.
Do you want to continue? [Y/n]
Get:1 http://ftp.jaist.ac.jp/debian/ jessie/main libcurl3 amd64 7.38.0-4+deb8u2 [259 kB]
Get:2 http://ftp.jaist.ac.jp/debian/ jessie/main curl amd64 7.38.0-4+deb8u2 [200 kB]
Fetched 459 kB in 3s (116 kB/s)
Selecting previously unselected package libcurl3:amd64.
(Reading database ... 31327 files and directories currently installed.)
Preparing to unpack .../libcurl3_7.38.0-4+deb8u2_amd64.deb ...
Unpacking libcurl3:amd64 (7.38.0-4+deb8u2) ...
Selecting previously unselected package curl.
Preparing to unpack .../curl_7.38.0-4+deb8u2_amd64.deb ...
Unpacking curl (7.38.0-4+deb8u2) ...
Processing triggers for man-db (2.7.0.2-5) ...
Setting up libcurl3:amd64 (7.38.0-4+deb8u2) ...
Setting up curl (7.38.0-4+deb8u2) ...
Processing triggers for libc-bin (2.19-18+deb8u1) ...
\\
==== archive keyのインストール ====
root@jessie:~# curl http://emdebian.org/tools/debian/emdebian-toolchain-archive.key | apt-key add -
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2398 100 2398 0 0 394 0 0:00:06 0:00:06 --:--:-- 524
OK
\\
==== crossbuild-essential-armhfのインストール ====
root@jessie:~# dpkg --add-architecture armhf
root@jessie:~# apt-get update
Ign http://ftp.jaist.ac.jp jessie InRelease
Hit http://ftp.jaist.ac.jp jessie-updates InRelease
Hit http://ftp.jaist.ac.jp jessie Release.gpg
Hit http://ftp.jaist.ac.jp jessie Release
Hit http://ftp.jaist.ac.jp jessie-updates/main Sources
Hit http://ftp.jaist.ac.jp jessie-updates/contrib Sources
Get:1 http://ftp.jaist.ac.jp jessie-updates/main amd64 Packages/DiffIndex [367 B]
Hit http://ftp.jaist.ac.jp jessie-updates/contrib amd64 Packages
Hit http://ftp.jaist.ac.jp jessie-updates/contrib Translation-en
Hit http://ftp.jaist.ac.jp jessie-updates/main Translation-en
Hit http://ftp.jaist.ac.jp jessie/main Sources
Hit http://security.debian.org jessie/updates InRelease
Hit http://ftp.jaist.ac.jp jessie/main amd64 Packages
Hit http://ftp.jaist.ac.jp jessie/main Translation-en
Hit http://security.debian.org jessie/updates/main Sources
Hit http://security.debian.org jessie/updates/contrib Sources
Hit http://security.debian.org jessie/updates/main amd64 Packages
Get:2 http://emdebian.org jessie InRelease [30.7 kB]
Hit http://security.debian.org jessie/updates/contrib amd64 Packages
Hit http://security.debian.org jessie/updates/contrib Translation-en
Hit http://security.debian.org jessie/updates/main Translation-en
Get:3 http://emdebian.org jessie/main amd64 Packages [14.8 kB]
Ign http://emdebian.org jessie/main Translation-en_US
Ign http://emdebian.org jessie/main Translation-en
Fetched 45.9 kB in 4s (9,391 B/s)
Reading package lists... Done
root@jessie:~# apt-cache search crossbuild
crossbuild-essential-arm64 - Informational list of cross-build-essential packages
crossbuild-essential-armel - Informational list of cross-build-essential packages
crossbuild-essential-armhf - Informational list of cross-build-essential packages
crossbuild-essential-mipsel - Informational list of cross-build-essential packages
crossbuild-essential-powerpc - Informational list of cross-build-essential packages
crossbuild-essential-ppc64el - Informational list of cross-build-essential packages
root@jessie:~# apt-get install crossbuild-essential-armhf
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
binutils binutils-arm-linux-gnueabihf build-essential cpp cpp-4.9 cpp-4.9-arm-linux-gnueabihf dpkg-cross
dpkg-dev fakeroot g++ g++-4.9 g++-4.9-arm-linux-gnueabihf g++-arm-linux-gnueabihf gcc gcc-4.9
gcc-4.9-arm-linux-gnueabihf gcc-4.9-base:armhf gcc-arm-linux-gnueabihf libalgorithm-diff-perl
libalgorithm-diff-xs-perl libalgorithm-merge-perl libasan1 libasan1:armhf libatomic1 libatomic1:armhf
libc-dev-bin libc6:armhf libc6-dev libc6-dev:armhf libcilkrts5 libcloog-isl4 libconfig-auto-perl
libconfig-inifiles-perl libdebian-dpkgcross-perl libdpkg-perl libfakeroot libfile-fcntllock-perl
libfile-homedir-perl libfile-which-perl libgcc-4.9-dev libgcc-4.9-dev:armhf libgcc1:armhf libgomp1
libgomp1:armhf libisl10 libitm1 liblist-moreutils-perl liblsan0 libmpc3 libmpfr4 libquadmath0
libstdc++-4.9-dev libstdc++-4.9-dev:armhf libstdc++6:armhf libtsan0 libubsan0 libubsan0:armhf
libxml-simple-perl libyaml-libyaml-perl libyaml-perl linux-libc-dev linux-libc-dev:armhf make manpages-dev
Suggested packages:
binutils-doc cpp-doc gcc-4.9-locales binutils-multiarch debian-keyring g++-multilib g++-4.9-multilib
gcc-4.9-doc libstdc++6-4.9-dbg libstdc++6-4.9-dbg:armhf gcc-multilib autoconf automake libtool flex bison
gdb gcc-doc gcc-4.9-multilib libgcc1-dbg libgomp1-dbg libitm1-dbg libatomic1-dbg libasan1-dbg liblsan0-dbg
libtsan0-dbg libubsan0-dbg libcilkrts5-dbg libquadmath0-dbg libgcc1-dbg:armhf libgomp1-dbg:armhf
libitm1-dbg:armhf libatomic1-dbg:armhf libasan1-dbg:armhf liblsan0-dbg:armhf libtsan0-dbg:armhf
libubsan0-dbg:armhf libcilkrts5-dbg:armhf libquadmath-dbg:armhf glibc-doc:armhf locales:armhf glibc-doc
manpages-dev:armhf libstdc++-4.9-doc libstdc++-4.9-doc:armhf libyaml-shell-perl make-doc
The following NEW packages will be installed:
binutils binutils-arm-linux-gnueabihf build-essential cpp cpp-4.9 cpp-4.9-arm-linux-gnueabihf
crossbuild-essential-armhf dpkg-cross dpkg-dev fakeroot g++ g++-4.9 g++-4.9-arm-linux-gnueabihf
g++-arm-linux-gnueabihf gcc gcc-4.9 gcc-4.9-arm-linux-gnueabihf gcc-4.9-base:armhf gcc-arm-linux-gnueabihf
libalgorithm-diff-perl libalgorithm-diff-xs-perl libalgorithm-merge-perl libasan1 libasan1:armhf
libatomic1 libatomic1:armhf libc-dev-bin libc6:armhf libc6-dev libc6-dev:armhf libcilkrts5 libcloog-isl4
libconfig-auto-perl libconfig-inifiles-perl libdebian-dpkgcross-perl libdpkg-perl libfakeroot
libfile-fcntllock-perl libfile-homedir-perl libfile-which-perl libgcc-4.9-dev libgcc-4.9-dev:armhf
libgcc1:armhf libgomp1 libgomp1:armhf libisl10 libitm1 liblist-moreutils-perl liblsan0 libmpc3 libmpfr4
libquadmath0 libstdc++-4.9-dev libstdc++-4.9-dev:armhf libstdc++6:armhf libtsan0 libubsan0 libubsan0:armhf
libxml-simple-perl libyaml-libyaml-perl libyaml-perl linux-libc-dev linux-libc-dev:armhf make manpages-dev
0 upgraded, 65 newly installed, 0 to remove and 0 not upgraded.
Need to get 77.8 MB of archives.
After this operation, 253 MB of additional disk space will be used.
Do you want to continue? [Y/n]
\\
==== gcc 起動の確認 ====
root@jessie:~# arm-linux-gnueabihf-gcc -v
Using built-in specs.
COLLECT_GCC=arm-linux-gnueabihf-gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/4.9/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: ../src/configure -v --with-pkgversion=' 4.9.2-10' --with-bugurl=file:///usr/share/doc/gcc-4.9/README.Bugs --enable-languages=c,c++,go,fortran,objc --prefix=/usr --program-suffix=-4.9 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.9 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libitm --disable-libquadmath --enable-plugin --with-system-zlib --enable-objc-gc --enable-multiarch --disable-sjlj-exceptions --with-arch=armv7-a --with-fpu=vfpv3-d16 --with-float=hard --with-mode=thumb --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=arm-linux-gnueabihf --program-prefix=arm-linux-gnueabihf-
Thread model: posix
gcc version 4.9.2 ( 4.9.2-10)
root@jessie:~#
\\
===== 簡単なプログラムのビルド・テスト =====
『Hello, World!』的な単純なコードをクロスコンパイルし、MA-E320 実機に転送して実行できるか試してみます。
#include
int main(int argc, char **argv)
{
printf("Hello!\n");
return 0;
}
\\
ビルドします。
root@jessie:~# arm-linux-gnueabihf-gcc -O2 -Wall hello.c -o hello
root@jessie:~# ls -l hello
-rwxr-xr-x 1 root root 5416 Jan 8 14:30 hello
root@jessie:~# file hello
hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 2.6.32, BuildID[sha1]=388d399d609ced3b732f5e7c9e01ff90507754a1, not stripped
\\
MA-E320 実機 に転送します。
root@jessie:~# sftp user1@192.168.253.35
The authenticity of host '192.168.253.35 (192.168.253.35)' can't be established.
ECDSA key fingerprint is 25:33:3b:8d:99:f4:ae:72:88:51:cc:75:52:cd:20:69.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.253.35' (ECDSA) to the list of known hosts.
user1@192.168.253.35's password:
Connected to 192.168.253.35.
sftp> cd /tmp
sftp> put hello
Uploading hello to /tmp/hello
hello 100% 5416 5.3KB/s 00:00
sftp> quit
\\
MA-E320 で実行してみます。
root@plum:/tmp# ls -l hello
-rwxr-xr-x 1 user1 user1 5416 Jan 8 14:27 hello
root@plum:/tmp# ./hello
Hello!
単純なプログラムはクロスコンパイラでビルドできました。
様々なライブラリをリンクするプログラムの場合、ライブラリのヘッダや共有ライブラリがリンク時に必要となるため、\\
このように簡単にはビルドできません。
もし難しいようであれば、実機でのセルフビルドもしくは 『[[mae3xx_devel:chroot_qemu:start]]』 でchrootした環境でのビルドをお勧めします。