小松です
From: MURASE Katsunori <katsunori.murase@xxxxxxxxxxx>
Subject: [obu:01457] Re: クロスコンパイルして作成したファイルを実行できない
Date: Fri, 08 Mar 2002 22:07:24 +0900
> ぜひお願いします。見るだけになってしまうかもしれませんが。
> 僕も自前で色々と作ってはいるのですが、なかなか奇麗にまとまり
> ません。参考にさせて頂きたいので、お願いします。
えっと, 現状でどれだけコメントできてるかどうかはおいとて
リクエストがあったので流します.
前提としては
1. どこかに Linux の 2.0.4 以上のソースがあり
make oldconfig && make dep
が実行されていること.
この程度であれば, bash と gnu-make と native の gcc があ
れば OK のはず.
注)
ターゲットに載っているカーネル以降のバージョンだと結
構悲しい目に会います.
2. スクリプトの実行ディレクトリー下に
binutils-2.11.2
gcc-core-2.95.3
glibc-2.2.4
glibc-linuxthread-2.2.4
が展開されていること
gcc は gcc-core と gcc-g++ が必要です
thread サポートはスクリプトを読んでお好きなように...
glibc は現在のプロジェク用に適当に選んだものなので, obu
に会わせてください
注)
この設定でも obSS デフォルトの glibc-2.1.3(だったよな?)
ではバイナリは動作しているようです.
ただし調子こいて /lib に ${targetroot}/lib をマウント
すると悲しい思いをします.
3. 個人的な趣味により, FreeBSD は -CURRENT です.
の条件が必須です.
コメント読んで, ``これちゃうんとちゃうかぁ''と思った方は, な
んぼでも突っ込んでください.
あと, ``動かへんぞぉ!!!''って, 場合は
sh -x "<script-name>" > "<build-log-name>" 2>&1
あるいは
sh -x "<script>" >& "<build-log-name>"
の結果と
ls -lR
の結果を送ってください.
以下スクリプトです.
-------------------- >8 -- >8 --------------------
#!/bin/sh
boot="yes" # binutils と gcc は動いてる場合 no
crossglibc="yes" # glibc は既にある場合 no
crossgcc="yes" # gcc/g++/libstdg++ も動いてる場合 no
targetself="yes" # target 上でのセルフコンパイラ/ライブ
# ラリが要らない場合 no
kernroot=`pwd`/linux # Linux カーネルの位置
kernvers="2.4.2" # Linux カーネルのバージョン
topdir=`pwd` # スクリプトがあるディレクトリ
# 以下の作業は全部木の下で
# 当然, ソース類もこのディレクトリ直下
# ソースコード
binutils=${topdir}/binutils-2.11.2
gcc=${topdir}/gcc-2.95.3
glibc=${topdir}/glibc-2.2.4
# コンパイルに必要なマシンアーキテクチャ
fbsd="i386-freebsd" # なぜだか知らないが binutils はバージョ
fbsd5="i386-freebsd5" # ンをつけるといやがる.
# configure に freebsd* って書けよぉ...
linux="powerpc-linux"
# 作業ディレクトリのプリフィックス
scratch="${topdir}/scratch"
crossroot="/usr/local/ppc-linux-cross"
targetdir="${topdir}/target-self"
# ターゲットセルフ環境のインストール先
targetroot="${topdir}/linux-root"
# 以下は試行錯誤の結果
gnutool="--with-gnu-as --with-gnu-ld"
# glibc 全部作ってもいいのかしら?
# どっかから srpm 引いてきて通常の Linux の場合を調べなきゃ...
# multilib は作っても全然うれしくないので作らない.
case $gcc in
*gcc-2*)
glibcopts="--enable-multilib=no --enable-add-ons=linuxthreads
--enable-kernel=${kernvers} --with-headers=${kernroot}/include"
;;
*gcc-3*)
glibcopts="--enable-multilib=no --enable-add-ons=linuxthreads
--enable-kernel=${kernvers} --with-headers=${kernroot}/include
--disable-sanity-checks"
;;
*)
exit
;;
esac
scratchglibcopts="--with-included-gettext=no --with-catgets=no --without-cvs
--disable-nls ${glibcopts}"
crossglibcprefixes="--prefix=${crossroot}/${linux}"
if [ "${boot}" = "yes" ]; then
mkdir ${linux}-binutils
(
cd ${linux}-binutils
echo "#### binutils"
echo "## configure"
${binutils}/configure \
--target=${linux} --host=${fbsd} --build=${fbsd} \
--prefix=${crossroot} --program-prefix=${linux}-
echo "## make"
gmake || exit
echo "## install"
gmake install || exit
) || exit
mkdir ${scratch}-gcc
(
cd ${scratch}-gcc
# glibc が出来ないとg++ は作れないので gcc だけ作る
# libstdc++ なんてもってのほか
echo "#### scratch gcc"
echo "## configure"
${gcc}/configure \
--target=${linux} --host=${fbsd5} --build=${fbsd5} \
--prefix=${scratch} ${gnutool} \
--disable-libstdcxx --enable-languages=c
# ったくぅ... gcc と glibc がニワトリとタマゴ状態になって
# るしぃ...
# libgcc では gnu/stubs.h の内容は使っていないようなのでダ
# ミーのファイルを作っておく.
mkdir -p ${scratch}/${linux}/include/gnu
touch ${scratch}/${linux}/include/gnu/stubs.h
echo "## make"
GCC_FOR_TARGET="${scratch}-gcc/gcc/xgcc \
-B${scratch}-gcc/gcc/ -B${crossroot}/${linux}/bin/ \
-I${glibc}/include -I${glibc} \
-I${glibc}/sysdeps/unix/sysv/linux \
-I${glibc}/sysdeps/powerpc \
-I${glibc}/sysdeps/generic \
-I${scratch}/${linux}/include \
-I${kernroot}/include"
gmake all-gcc \
CFLAGS_FOR_TARGET="-O2 -g -Dinhibit_libc" \
GCC_FOR_TARGET="${GCC_FOR_TARGET}" \
CC_FOR_TARGET="${GCC_FOR_TARGET}" \
AR_FOR_TARGET=${crossroot}/bin/${linux}-ar \
|| exit
echo "## install"
gmake install || exit
) || exit
fi
if [ "${crossglibc}" = "yes" ]; then
mkdir ${linux}-glibc
(
cd ${linux}-glibc
echo "#### glibc"
echo "## config"
CC="${scratch}/bin/${linux}-gcc \
-B${scratch}/lib/gcc-lib/powerpc-linux/2.95.3/ \
-B${crossroot}/${linux}/bin/ -isystem ${kernroot}/include" \
AS="${crossroot}/bin/${linux}-as" \
LD="${crossroot}/bin/${linux}-ld" \
AR="${crossroot}/bin/${linux}-ar" \
NM="${crossroot}/bin/${linux}-nm" \
RANLIB="${crossroot}/bin/${linux}-ranlib" \
${glibc}/configure \
--target=${linux} --host=${linux} --build=${fbsd} \
${crossglibcprefixes} ${glibcopts}
echo "## make"
gmake || exit
echo "## install"
gmake install || exit
# カーネルへッダコピーしてリンクを張っとく
cd ${crossroot}/${linux}
mkdir -p src/linux
(cd ${kernroot}; tar cf - include) | tar xf - -C src/linux
cd include
ln -sf ../src/linux/include/asm ./asm
ln -sf ../src/linux/include/linux ./linux
) || exit
fi
if [ "${crossglibc}" = "yes" -a "${crossgcc}" = "yes" ]; then
#
# build cross compiler
#
mkdir ${linux}-gcc
(
cd ${linux}-gcc
xgcc="${topdir}/${linux}-gcc/gcc/xgcc \
-B${topdir}/${linux}-gcc/gcc/ -B${crossroot}/${linux}/bin/ \
-I${crossroot}/${linux}/include"
echo "#### gcc"
echo "## configure"
${gcc}/configure \
--target=${linux} --host=${fbsd5} --build=${fbsd5} \
--prefix=${crossroot} --program-prefix=${linux}- ${gnutool} \
--oldincludedir=${crosstool}/${linux}/include \
--with-thread --enable-languages=c,c++ \
--enable-multilib=no
# multilib 作るとむごいめにあったので慌てて禁止
echo "## make"
gmake all CC_FOR_TARGET="${xgcc}" GCC_FOR_TARGET="${xgcc}" \
CXX_FOR_TARGET="${xgcc}" \
AR_FOR_TARGET=${crossroot}/bin/${linux}-ar \
RANLIB_FOR_TARGET=${crossroot}/bin/${linux}-ranlib || exit
# instal の時にも ar と ranlib は使ってる
# glibc は使ってないのに, なぜだ???
echo "## install"
gmake install AR_FOR_TARGET=${crossroot}/bin/${linux}-ar \
RANLIB_FOR_TARGET=${crossroot}/bin/${linux}-ranlib || exit
) || exit
fi
# ターゲット用のセルフコンパイラの作成.
# こいつが実機で動けばよしとしよう...
# glibc は --prefix=/usr を指定するとかってに /lib と /usr/lib に振分
# けてくれるらしい. さっき作ったのを手で振分けるのはいやなのでもう一回
# コンパイルする.
if [ "${targetself}" = "yes" ]; then
# DESTDIR を指定すればうまく行きそうなもんだが, 敢えなく敗退...
# なんでだぁ??? 追っ掛ける暇をくれ! 暇を...
# しょうがないので強引に sed することにした.
toolprefixes="prefix=/usr exec-prefix=/usr bindir=/usr/bin sbindir=/usr/sbin
libexecdir=/usr/libexec datadir=/usr/share sysconfdir=/etc
sharedstatedir=/usr/com localstatedir=/var libdir=/usr/lib
includedir=/usr/include infodir=/usr/share/info
mandir=/usr/share/man"
mkdir ${targetdir}-binutils
(
cd ${targetdir}-binutils
echo "#### binutils"
echo "## configure"
CC=${crossroot}/bin/${linux}-gcc \
AS=${crossroot}/bin/${linux}-as \
LD=${crossroot}/bin/${linux}-ld \
NM=${crossroot}/bin/${linux}-nm \
AR=${crossroot}/bin/${linux}-ar \
RANLIB=${crossroot}/bin/${linux}-ranlib \
${binutils}/configure \
--target=${linux} --host=${linux} --build=${fbsd} \
--enable-multilib=no \
`echo ${toolprefixes} | sed 's/\([^ ][^ ]*\)/--\1/g'`
# /usr/powerpc-linux をサプレスする方法探さなきゃ...
# そもそも mac-linux には /usr/powerpc-linux とか
# /usr/mac-linux ってディレクトリはあるのか?
echo "## make"
gmake || exit
echo "## install"
x=`echo ${toolprefixes} |
sed "s/-/_/g; \
s+\([^ =][^ =]*\)=\([^ ][^ ]*\)+\1=${targetroot}/\2+g"`
gmake install $x \
|| exit
) || exit
mkdir ${targetdir}-gcc
(
cd ${targetdir}-gcc
echo "#### gcc"
echo "## configure"
CC=${crossroot}/bin/${linux}-gcc \
AS=${crossroot}/bin/${linux}-as \
LD=${crossroot}/bin/${linux}-ld \
NM=${crossroot}/bin/${linux}-nm \
AR=${crossroot}/bin/${linux}-ar \
RANLIB=${crossroot}/bin/${linux}-ranlib \
${gcc}/configure \
--target=${linux} --host=${linux} --build=${fbsd5} \
`echo ${toolprefixes} | sed 's/\([^ ][^ ]*\)/--\1/g'` \
${gnutool} --oldincludedir=${crosstool}/${linux}/include \
--with-thread --enable-languages=c,c++ \
--enable-multilib=no --verbose
echo "## make"
base="${crossroot}/bin/${linux}"
xgcc=${crossroot}/bin/${linux}-gcc
gmake CC_FOR_TARGET="${xgcc}" GCC_FOR_TARGET="${xgcc}" \
CXX_FOR_TARGET="${xgcc}" \
AR_FOR_TARGET=${crossroot}/bin/${linux}-ar \
RANLIB_FOR_TARGET=${crossroot}/bin/${linux}-ranlib || exit
echo "## install"
gmake install `echo ${toolprefixes} | \
sed "s/-/_/g;
s+\([^ =][^ =]*\)=\([^ ][^ ]*\)+\1=${targetroot}/\2+g"` \
AR_FOR_TARGET=${crossroot}/bin/${linux}-ar \
RANLIB_FOR_TARGET=${crossroot}/bin/${linux}-ranlib || exit
)
glibcprefixes="prefix=/usr exec-prefix=/usr bindir= sbindir=
libexecdir=/usr/libexec datadir=/usr/share sysconfdir=/etc
sharedstatedir=/usr/com localstatedir=/var libdir=/usr/lib
includedir=/usr/include infodir=/usr/share/info
mandir=/usr/share/man"
mkdir ${targetdir}-glibc
(
cd ${targetdir}-glibc
echo "#### glibc"
# compile glibc for target tree
echo "## configure"
CC=${crossroot}/bin/${linux}-gcc \
AS=${crossroot}/bin/${linux}-as \
LD=${crossroot}/bin/${linux}-ld \
NM=${crossroot}/bin/${linux}-nm \
AR=${crossroot}/bin/${linux}-ar \
RANLIB=${crossroot}/bin/${linux}-ranlib \
${glibc}/configure \
--target=${linux} --host=${linux} --build=${fbsd} \
`echo ${glibcprefixes} | sed 's/\([^ ][^ ]*\)/--\1/g'` \
${glibcopts} || exit
echo "## make"
gmake || exit
echo "## install"
mkdir ${targetroot}
gmake install install_root=${targetroot} || exit
# ガーン(; ;) glibc は install_root が使える
# glibcprefixes はたぶん --prefix=/usr 一発で OK のはず.
echo "## copy kernel headers"
cd ${targetroot}/usr
mkdir -p src/linux
(cd ${kernroot}; tar cf - include) | tar xf - -C src/linux
cd include
ln -sf ../src/linux/include/asm ./asm
ln -sf ../src/linux/include/linux ./linux
) || exit
fi
Follow-Ups:
- [obu:01459] Re: クロスコンパイルして作成したファイルを実行できないHiroyuki Komatsu
- [obu:01461] FreeBSD でのクロスコンパイル環境構築 (Re: Re: クロスコンパイルして作成したファイルを実行できない)TANABE Hiroyasu
- [obu:01430] Re: クロスコンパイルして作成したファイルを実行できないfujii_ma
- [obu:01456] Re: クロスコンパイルして作成したファイルを実行できないHiroyuki Komatsu
- [obu:01457] Re: クロスコンパイルして作成したファイルを実行できないMURASE Katsunori
- Prev by Subject: [obu:01457] Re: クロスコンパイルして作成したファイルを実行できない
- Next by Subject: [obu:01459] Re: クロスコンパイルして作成したファイルを実行できない
- Previous by thread: [obu:01457] Re: クロスコンパイルして作成したファイルを実行できない
- Next by thread: [obu:01459] Re: クロスコンパイルして作成したファイルを実行できない
- Indexes:[Main][Thread]