[OpenBlockS Users page]
[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

[obu:01458] Re: クロスコンパイルして作成したファイルを実行できない


小松です

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

この情報があなたの探していたものかどうか選択してください。
yes/まさにこれだ!   no/違うなぁ   part/一部見つかった   try/これで試してみる

あなたが探していた情報はどのようなことか、ご自由に記入下さい。特に「まさにこれだ!」と言う場合は記入をお願いします。
例:「複数のマシンからCATV経由でipmasqueradeを利用してWebを参照したい場合の設定について」
Follow-Ups: References: