2011・04・27
BeagleBoardの開発環境を整える
連載トップ
http://itpro.nikkeibp.co.jp/article/COLUMN/20101019/353162/?ST=android-dev
直行
http://itpro.nikkeibp.co.jp/article/COLUMN/20101111/354030/?ST=android-dev
4/28
apt-getについて
$ sudo apt-get install パッケージ名
でインストールします.パッケージ名は,スペース区切りで複数指定可能です.GUIを用いたより使いやすい synaptic も便利です.
sudo apt-get install git-core gnupg sun-java5-jdk flex bison gperf libsdl-dev libesd0-dev(java以外ここまで完了<ー
libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev
Maverick Meerkat10.102010年10月10日2012年4月
libwxgtk2.5-devのだうんろーどに関して
amd64 と i386の違いについて
一般的なデスクトップ利用であれば、x64を利用するメリットはあまりありません。
x64にすることで利用可能なレジスタが増えるので、高負荷な演算を行う場合には
計算速度が速くなるメリットがありますが、これは普通のデスクトップ用途では
体感できないと思います。さらにCore 2 Duoの場合はx64処理が色々な事情で
低速なので、あまり意味がありません。
また、4GBを越えるメモリをPAEなしに利用することができ、PAEによる速度の
低下が発生しないというメリットもありますが、これもやはり普通のデスクトップ
では体感でき(略
そしてお使いのマシンがThinkpad X61だと最大搭載メモリが4GBなので、
これによって幸せになれるかというと……えーと……。
Linux特有の事情として、x64にしてアドレス空間が拡張されることで、メモリ全域を
lowmemとして扱うことができ、highmemにアクセスすることによるパフォーマンス
劣化が発生しないというメリットもありますが、これもやはり普通のデスクトッ(略
NFSサーバなどにする場合は大きくパフォーマンスが向上する可能性があります。
x64の方が茨の道なので、頑張るとその分詳しくなれる、という無形のメリットも
ありますが、充分に慣れるまではi386の方が幸せだと思います……。
結局i386をダウンロードしよう
5/9
まえから思っていたが、Ubuntuからapt-getなどをする際にプロキシAuthorizationに引っかかり、コマンドからの作業がかなり制限された状態だったので、それを解決することにした。
以下の方法は、Security点から、先生はやるなと仰っていたので、仕事などのときにはちゃんと確認をとってからやる。
>後、なにが問題なのか聞く
まずは、
ProxyServer > proxyserver.co.jp
Port > 8080
として、
端末から以下を実行
$ export
http_proxy="http://(username):(password)@proxyserver.co.jp:8080/
$printenvで確認
次に、
etc/apt/apt.conf の編集をする
geditからは、sudoで起動しても読み取り専用になって編集不可能だったので、
書き込み可能にするために
chmod u+w /ete/apt/apt.conf
を実行してみた。
しかし、依然geditからは編集不可
そこで、viで編集してみることに
端末から
$vi /ete/apt/apt.conf (必要ならsudoをつける)
と入力し、viから編集
以下のように、user:passwd@の部分を追加して編集完了
http://[ユーザID]:[パスワード]@ホスト:ポート
この書式が重要。
【apt-get】
/etc/apt/apt.conf
Acquire::http::Proxy "http://user:passwd@hoge.co.jp:port";
【wget】
/etc/wgetrc
http_proxy = http://user:passwd@hoge.co.jp:port
use_proxy = on
これにて解決。
********************************************
念のため、Synapticパッケージマネージャと、システム>設定>ネットワークプロキシの認証部部分を間違えないように丁寧に入力し換えて、<すでに設定していたのでからここの動作はいらなかったかも
再起動
Terminalより、apt-get updateを実行、、、
今まで出来なかったのに見事成功っっ!!
やったー=~www
これにより、今まで不可能だったシステムのUpdate、パッケージのインストールもできた
sudo apt-get install git-core gnupg sun-java5-jdk flex bison gperf libsdl-dev libesd0-dev(java以外ここまで完了<ー
libwxgtk2.6-dev build-essential zip curl libncurses5-dev
zlib1g-dev(jdk以外ここまですべて完了5/9)
明日は、jdkのインストールから 、またインストールしたパッケージの役割についてubuntuソフトウェアセンターなどで調べて纏める。
5/9
今日はせっかく書いた内容がすべて消えてしまったので残念。
*Ubuntu10.10から、jdk -> Openjdk
*defference between jdk and Openjdk
Memo1
この後にJAVA SDKをインストールします。JAVA SDKは5と6。で、以下のコマンドでインストールを実行。
$ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
<jdk6
$ sudo add-apt-repository "deb http://us.archive.ubuntu.com/ubuntu/ jaunty
multiverse" <jdk5
$ sudo add-apt-repository "deb http://us.archive.ubuntu.com/ubuntu/
jaunty-updates multiverse" <jdk5
$ sudo apt-get update
$ sudo apt-get install sun-java5-jdk
$ sudo apt-get install sun-java6-jdk
Memo2
jdk5インストールのためのrepositoryの追加
sudo apt-get updateでエラー
sourceslistを参照エラー原因はタイプミスと判明
改善し、再度update
つぎは、重複エラー、先ほどのエラーが原因で重複した項目が発生。
しかし、update作業自体はちゃんと終わった
geditから開き項目を慎重に削除
再びupdate>成功>OK
つぎは、jdkのインストール
sudo apt-get install sun-java5-jdk
これは難なく成功
$java
ちゃんと動作 > OK
次は、クロスコンパイル環境の構築を練習する。
表2のtarファイルをとってきて展開する
binutilsもとよりある
>./configureしようあとで
>./configureしようあとで
shotaro@yalab07:~$ tar xvzf Downloads/binutils-2.21.tar.gz
shotaro@yalab07:~/binutils-2.21$ ./configure --target=arm-linux-eabi
shotaro@yalab07: ~/binutils-2.21$ make
エラーなのか、大丈夫なのか?
mv -f .deps/earmelf.Tpo .deps/earmelf.Po
/bin/bash ./libtool --tag=CC --mode=link gcc -W -Wall
-Wstrict-prototypes -Wmissing-prototypes -Wshadow -Werror -g -O2 -o ld-new
ldgram.o ldlex-wrapper.o lexsup.o ldlang.o mri.o ldctor.o ldmain.o ldwrite.o
ldexp.o ldemul.o ldver.o ldmisc.o ldfile.o ldcref.o plugin.o earmelf.o
../bfd/libbfd.la ../libiberty/libiberty.a -lz -ldl
libtool: link: gcc -W -Wall -Wstrict-prototypes -Wmissing-prototypes
-Wshadow -Werror -g -O2 -o ld-new ldgram.o ldlex-wrapper.o lexsup.o ldlang.o
mri.o ldctor.o ldmain.o ldwrite.o ldexp.o ldemul.o ldver.o ldmisc.o ldfile.o
ldcref.o plugin.o earmelf.o ../bfd/.libs/libbfd.a ../libiberty/libiberty.a -lz
-ldl
make[4]: ディレクトリ `/home/shotaro/binutils-2.21/ld' から出ます
make[3]: ディレクトリ `/home/shotaro/binutils-2.21/ld' から出ます
make[2]: ディレクトリ `/home/shotaro/binutils-2.21/ld' から出ます
make[1]: `all-target' に対して行うべき事はありません.
make[1]: ディレクトリ `/home/shotaro/binutils-2.21' から出ます
shotaro@yalab07:~/binutils-2.21$
shotaro@yalab07:~/binutils-2.21$ make install
sudoで実行したららうまくいった
gccもとよりある
>./configureしようあとで
libcダウンロード
いまから展開。
libcダウンロード
いまから展開。
shotaro@yalab07:~/glibc-2.13$ tar xvzf Downloads/glibc-2.13.tar.gz
shotaro@yalab07:~/glibc-2.13$ cd glibc-2.13
shotaro@yalab07:~/glibc-2.13$ ./configure --target=arm-linux-eabi
configure: error: you must configure in a separate build directory
5/10
linux, unix系のOSで、アプリケーションをインストールする際、
./configure
make
make install
と決まり事のようにコマンドを入れますが、
> bash: ./configure: そのようなファイルやディレクトリはありません
エラーの表示されるディレクトリーで # ls とすると configure
はないですよね? 『./configure』の意味は、カレント・ディレクトリーにある『configure』を実行しなさい!ですから、存在しないから・・・『そのようなファイルやディレクトリはありません』と報告しています。
実行するディレクトリーをパッケージを解凍したディレクトリーに移動しすれば正常に実行できますよ ^ ^
OK(解決)
shotaro@yalab07:~/glibc-2.13$ ./configure --target=arm-linux-eabi
checking build system type... i686-pc-linux-gnu
checking host system type... i686-pc-linux-gnu
checking for gcc... gcc
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking how to run the C preprocessor... gcc -E
checking for g++... g++
checking whether we are using the GNU C++ compiler... yes
checking whether g++ accepts -g... yes
configure: error: you must configure in a separate build directory
shotaro@yalab07:~/glibc-2.13$
make 我うまくいかない
そのようなディレクトリはないと言われる
ソースからのビルド方法がちゃんと纏めてあったので、参考にしもう一度チャレンジ
ソースからビルド
さて、一番の山場は最後に。
ソースからビルドの方法を紹介しよう。
まずは、ビルドに必須のアプリケーションのインストールから
sudo aptitude install build-essential
sudo aptitude install linux-headers-’uname -r’
そして、もちろん
ソースファイルの解凍(Tarの説明にて解説済み)
tar xvzf ファイル名.tar.gz
ようやくビルド処理
cd /解凍/した/パッケージの/パス
./configure
make
make install
よくこの処理中エラーが出るが、大体はビルドするのに必要なファイルが欠けているから。
より、便利な方法を紹介しよう
パッケージのアンインストールが楽にできるよう、checkinstallを使おう。
まずは、checkinstallのインストールから
sudo aptitude install checkinstall
インストールできたら、
cd /解凍/した/パッケージの/パス
./configure
make
checkinstall
先ほどのビルド処理の代わりにこのcheckinstallを使うと、
.debファイルを生成するので、
sudo dpkg -i パッケージ名.deb
として、インストールの終了になる。
checkinstallを利用してビルドすると、Synapticからもパッケージをアンインストールできるようになる。
でも、もちろん、これからは
sudo dpkg -r パッケージ名
でアンインストールできるはずだ。
glibcの導入に関してはここを参照
http://www.nabe.bne.jp/linux/glibc-compile.html
玄箱用に glibc をコンパイルする
作業を行う IA-32
機には既にクロス・コンパイル環境が構築されているものとします。クロス・コンパイル環境の構築方法は こちら をご覧下さい。
glibc 2.5 の README には、 glibc 2.4 以降は Linux カーネル
2.6 以降でなくては動かない、広く利用されているのは glibc 2.3 系列であり、まだ保守されていると書かれています。 そこで、 glibc 2.3
系列の最新版である glibc 2.3.6 を使用することにします。 http://ftp.gnu.org/gnu/glibc から glibc のコアである
glibc-2.3.6.tar.bz2 とアドオンである glibc-linuxthreads-2.3.6.tar.bz2 をダウンロードします。 以前は
Crypt と Locale Data というアドオンが存在していましたが、現在はコアに統合されたようです。
作業ディレクトリに src ディレクトリを作成し glibc-2.3.6.tar.bz2
を展開します。 glibc-2.3.6.tar.gz2 を展開したディレクトリ配下に glibc-linuxthreads-2.3.6.tar.gz2
を展開します。
$ mkdir src $ cd src $ tar jxvf ../glibc-2.3.6.tar.bz2 $ cd glibc-2.3.6 $ tar jxvf ../../glibc-linuxthreads-2.3.6.tar.gz2
玄箱のプロセッサは PowerPC ですが、PowerPC 用の glibc 2.3.6
にはバグがあり、コンパイル時にエラーが出てしまいます。 エラーを回避するため下記のパッチを適用する必要があります。
やってみたが、今度は解凍がうまくいかない。
もう一度やり直し、
srcは作業用directory
$mkdir src
$cd src
shotaro@yalab07:~/src$tar xvzf ../Downloads/glibc-2.13.tar.gz
shotaro@yalab07:~/src$ ls
glibc-2.13
shotaro@yalab07:~/src$ cd glibc-2.13
shotaro@yalab07:~/src/glibc-2.13$ ./configure --target=arm-linux-eabi
>>
*** On GNU/Linux systems the GNU C Library should not be installed into
*** /usr/local since this might make your system totally unusable.
*** We strongly advise to use a different prefix. For details read the
FAQ.
*** If you really mean to do this, run configure again using the extra
*** parameter `--disable-sanity-checks'.
これは、どういうことじゃ
prefixについて調べてみる
$configure --help
Installation directories:
--prefix=PREFIX install architecture-independent files in
PREFIX
[/usr/local]
--exec-prefix=EPREFIX install architecture-dependent files in
EPREFIX
[PREFIX]
なんとなく分かった、とりあえずconfigureしなおす
shotaro@yalab07:~$ ls
Downloads glibc-2.13 src デスクトップ ビデオ 画像
examples.desktop glibc-build テンプレート ドキュメント 音楽 公開
shotaro@yalab07:~$ cd src
shotaro@yalab07:~/src$ ls
glibc-2.13 glibc-build
shotaro@yalab07:~/src$ cd glibc-build
shotaro@yalab07:~/src/glibc-build$ ls
config.log
shotaro@yalab07:~/src/glibc-build$ ../glibc-2.13/configure
--prefix=/usr/glibc --target=arm-linux-eabi
警告など出ずにうまく終了
やっとmake
$make
make[1]: *** `/home/shotaro/src/glibc-build/abi-versions.h' に必要なターゲット
`/home/shotaro/src/glibc-build/Versions.all' を make するルールがありません. 中止.
つぎはなんぞ
shotaro@yalab07:~/src/glibc-build$ sudo apt-get install gawk
無事終了
make again
$make
しかしエラーか変わらず
そこで一旦決して、もう一度やることに
shotaro@yalab07:~/src/glibc-build$ rm -r * #
shotaro@yalab07:~/src/glibc-build$ ../glibc-2.13/configure
--prefix=/usr/glibc --target=arm-linux-eabi
再び異なるエラー=!
../sysdeps/i386/fpu/s_frexp.S: Assembler messages:
../sysdeps/i386/fpu/s_frexp.S:66: Error: invalid identifier for
".ifdef"
../sysdeps/i386/fpu/s_frexp.S:66: Error: junk at end of line, first
unrecognized character is `1'
../sysdeps/i386/fpu/s_frexp.S:66: Error: junk at end of line, first
unrecognized character is `1'
../sysdeps/i386/fpu/s_frexp.S:66: Error: Missing symbol name in
directive
../sysdeps/i386/fpu/s_frexp.S:66: Error: junk at end of line, first
unrecognized character is `1'
../sysdeps/i386/fpu/s_frexp.S:66: Error: Missing symbol name in
directive
../sysdeps/i386/fpu/s_frexp.S:66: Error: junk at end of line, first
unrecognized character is `.'
../sysdeps/i386/fpu/s_frexp.S:66: Error: junk at end of line, first
unrecognized character is `1'
../sysdeps/i386/fpu/s_frexp.S:66: Error: expected comma after name `' in
.size directive
../sysdeps/i386/fpu/s_frexp.S:66: Error: ".endif" without ".if"
../sysdeps/i386/fpu/s_frexp.S:66: Error: junk `.get_pc_thunk.dx' after
expression
make[2]: *** [/home/shotaro/src/glibc-build/math/s_frexp.os] エラー 1
make[2]: ディレクトリ `/home/shotaro/src/glibc-2.13/math' から出ます
make[1]: *** [math/subdir_lib] エラー 2
make[1]: ディレクトリ `/home/shotaro/src/glibc-2.13' から出ます
make: *** [all] エラー 2
色々調べるといいサイトがあったので
上記のエラーメッセージにもあるように以下のファイルの66行目をLOOK
shotaro@yalab07:~/src/glibc-2.13$ gedit sysdeps/i386/fpu/s_frexp.S
cmpl $0x7ff00000, %eax
jae 1f
cmpl $0x00100000, %eax
jae 2f
fldl VAL0(%esp)
#ifdef PIC
LOAD_PIC_REG (dx) <ー
#endif
fmull MO(two54)
movl $-54, %ecx
fstpl VAL0(%esp)
fwait
movl VAL1(%esp), %eax
movl %eax, %edx
LOAD_PIC_REGマクロを展開した結果がおかしいと予想
LOAD_PIC_REGのマクロ定義(sysdeps/i386/sysdep.h)を調べてみる
shotaro@yalab07:~/src/glibc-2.13$ gedit sysdeps/i386/sysdep.h
>
# define SETUP_PIC_REG(reg) \
.ifndef __i686.get_pc_thunk.reg; \
.section .gnu.linkonce.t.__i686.get_pc_thunk.reg,"ax",@progbits;
\
.globl __i686.get_pc_thunk.reg; \
.hidden __i686.get_pc_thunk.reg; \
.type __i686.get_pc_thunk.reg,@function; \
__i686.get_pc_thunk.reg: \
movl (%esp), %e##reg; \
ret; \
.size __i686.get_pc_thunk.reg, . - __i686.get_pc_thunk.reg; \
.previous; \
.endif; \
call __i686.get_pc_thunk.reg
# define LOAD_PIC_REG(reg) \
SETUP_PIC_REG(reg); addl $_GLOBAL_OFFSET_TABLE_, %e##reg
本家ではここでpreprocecerの出力を確認するのだが、どうやったら確認できるかわからない。
とりあえずコピーしてのせておく
.ifndef 1 .get_pc_thunk.dx; .section .gnu.linkonce.t. 1 .get_pc_thunk.dx,"ax",@progbits; .globl 1 .get_pc_thunk.dx; .hidden 1 .get_pc_thunk.dx; .type 1 .get_pc_thunk.dx,@function; 1 .get_pc_thunk.dx: movl (%esp), %edx; ret; .size 1 .get_pc_thunk.dx, . - 1 .get_pc_thunk.dx; .previous; .endif; call 1 .get_pc_thunk.dx; addl $_GLOBAL_OFFSET_TABLE_, %edx
.ifndef 1 となっているのでエラーになるのは明らからしい。
SETUP_PIC_REGマクロ定義内の「_i686」がことどとく「1」に展開されているらしい。
それによって、意味不明なコードになっているらしい。
そこで、preprocessorに自動的に定義されるマクロを表示させてみるらしい
出来ないので後でやってみる
% gcc -E -dM -x c /dev/null #define __DBL_MIN_EXP__ (-1021) #define __pentiumpro__ 1 #define __FLT_MIN__ 1.17549435e-38F #define __DEC64_DEN__ 0.000000000000001E-383DD #define __CHAR_BIT__ 8 ... #define __i686 1 ... #define __i686__ 1 ...
「#define __i686 1」 だから当然そういうマクロ展開が行なわれる、 というわけ。 gcc と glibc
では違うソフトウェアであるとはいえ、 gcc のプリプロセッサで自動的に定義される 「#define __i686 1」 とバッティングするようなラベル
「__i686.get_pc_thunk.reg」 をマクロ中で使うというのは、 いかがなものか。> glibc
らしい。
「--with-arch=i686」付でビルドした gcc, あるいは 「-march=i686」 オプション付で実行した gcc は、 -march
を指定しない gcc と比べて、 プリプロセッサにおいて以下の定義が追加されるようだ:
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1 #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1 #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1 #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1 #define __i686 1 #define __i686__ 1 #define __pentiumpro 1 #define __pentiumpro__ 1
ちなみに、 SETUP_PIC_REG マクロ定義内で定義されている __i686.get_pc_thunk.reg は、 eip の値をレジスタ
reg へ代入するための関数 (というかサブルーチン)。 サブルーチン名の末尾の 「reg」 はマクロ引数で置換される。 この例では dx。 つまり
SETUP_PIC_REG マクロを展開することにより __i686.get_pc_thunk.dx というサブルーチンが定義される。
そして、 このサブルーチンを呼び出す (call __i686.get_pc_thunk.dx) と、 スタックトップをレジスタへ代入 (movl
(%esp), %edx) して復帰 (ret) する。 つまりプログラムカウンタ (スタックトップに積まれた戻りアドレス) の値がレジスタ edx
へ代入される、というわけ。
続いて、 edx に $_GLOBAL_OFFSET_TABLE_ を加算することにより edx にグローバル変数領域へのポインタが代入される
(addl $_GLOBAL_OFFSET_TABLE_, %edx)。
中略=============
話が脱線したので元に戻すと、 要は 「--with-arch=i686」 付でビルドした gcc だと、 C
のソースだろうとアセンブリ言語で書かれたソースだろうと見境なく 「#define __i686 1」 を定義してしまうので、 相手が C のソースの時のみ
「-march=i686」 を付けて gcc を実行すればよい。 つまり、 gcc は 「--with-arch=i686」
付でビルドしてはいけない。
ではどうすればいいか? いろいろ方法はあると思うが、 glibc をビルドするときに CFLAGS を 「CFLAGS="-g -O2
-march=i686"」 などと指定して configure を実行するのも一つの解決策。 CFLAGS は C のソースをコンパイルするときだけ使われて、
アセンブルするときには使われないので、 前述したようなコンパイラ/アセンブラ二律背反問題を回避できる。 というわけで、 無事 glibc 2.10.1
をビルドすることができた:
senri:/usr/local/src/glibc-2.10.1.i386 % ../glibc-2.10.1/configure CFLAGS="-g -O2 -march=i686" ... senri:/usr/local/src/glibc-2.10.1.i386 % make ...
ということらしいのでやってみよう
shotaro@yalab07:~/src/glibc-build$ ../glibc-2.13/configure CFLAGS="-g -O2
-march=i686" --prefix=/usr/glibc --target=arm-linux-eabi
成功
make
失敗
5/12
いかをさんこうに
Glibc が GCC-4.5.2 に対してビルドできなくなるバグを修正します。
patch -Np1 -i ../glibc-2.13-gcc_fix-1.patch
Glibc
のドキュメントでは、ソースディレクトリ以外の専用のビルドディレクトリを作成することが推奨されています。
mkdir -v ../glibc-build cd ../glibc-build
Glibc は i386 をサポートしなくなりました。開発者によると x86
マシンに対してはコンパイラフラグとして -march=i486
を指定する必要があります。
これを実際に指定する方法はいくつかあります。 もっとも試してみれば分かりますが、ビルド時の変数 「CFLAGS」 にて設定しておくのが一番です。 Glibc の内部的なビルドシステムが利用する CFLAGS
を上書き設定するのとは別に configparms
ファイルという特別なファイルを使って CFLAGS
に対して追加設定を行うこともできます。 -mtune=native というフラグも必要で -march を設定した際に変更される -mtune
の値を適切にリセットします。
case `uname -m` in i?86) echo "CFLAGS += -march=i486 -mtune=native" > configparms ;; esac
これはまだやらないでいいや。
他のサイトを調べ
最終更新:2011年05月19日 14:01