ぱたへね!(出張所)

はてなダイアリーはrustの色分けができないのでこっちに来た

Cygwinで動くsparc64クロス環境

cygwinで64bit SPARCのクロス環境を作りました。バイナリ一式はこちらです。
sparc64-elf_2009_2_26.zip
ファイルを展開して、/usr/local/sparc64/binに実行ファイルが来るようにコピーし、/usr/local/sparc64/binにパスを通せばOKです。

クロス環境構築時のエラー

途中まで作ったバイナリを元にこのコマンドを実行しました。
../configure --without-fp --with-newlib --with-headers=/usr/local/sparc64-elf/include --target=sparc64-elf --prefix=/usr/local/sparc64-elf --enable-languages=c

以前に行ったsparcのクロスコンパイル環境を用意する。と同じエラーがでます。前回は32bit、今回は64bit環境ですがエラーは同じでした。

checking for shl_load... configure: error: Link tests are not allowed after GCC_NO_EXECUTABLES.

検索してみると分かるのですが、このエラーに対していくつものパッチがあります。どれを試しても上手くいかなかったので、別のやり方で回避しました。自分でやっていることを理解していないので後から問題が出てくる可能性もありますが、とりあえずmakeは最後まで行きました。

ソースを展開したフォルダーにあるlibtool.m4の、shl_loadに絡んでいるところをコメントアウトしました。1630行目付近です。

  # if libdl is installed we need to link against it
    AC_CHECK_LIB([dl], [dlopen],
		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
    lt_cv_dlopen="dyld"
    lt_cv_dlopen_libs=
    lt_cv_dlopen_self=yes
    ])
    ;;

  *)
#   AC_CHECK_FUNC([shl_load],
#	  [lt_cv_dlopen="shl_load"],
#     [AC_CHECK_LIB([dld], [shl_load],
#	    [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"],
#	[AC_CHECK_FUNC([dlopen],
#	      [lt_cv_dlopen="dlopen"],
#	  [AC_CHECK_LIB([dl], [dlopen],
#		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
#	    [AC_CHECK_LIB([svld], [dlopen],
#		  [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
#	      [AC_CHECK_LIB([dld], [dld_link],
#		    [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"])
#	      ])
#	    ])
#	  ])
#	])
#      ])
    ;;
  esac

ファイルを修正した後、そのフォルダーで

YUKI.N>autoconf

を実行し、cofigureを作り直しました。後は

YUKI.N>mkdir objdir
YUKI.N>cd objdir
YUKI.N>../configure --target=sparc64-elf --prefix=/usr/local/sparc64-elf
YUKI.N>make
YUKI.N>make install

で最後まで行きました

newlib

このgccでnewlibを作ろうとすると、このようなエラーがでます。

../../../../libgloss/sparc/cygmon-crt0.S:64: Error: detected global register use not covered by .register pseudo-op

ソースを見た所bssの初期化だったので、今は必要無いだろうとコメントアウトしました。OSを使わない環境であれば、HWブート時にメモリを0クリアーしておけば同じ事です。

	/* zero the bss section */
        !sethi %hi(__bss_start),%g2
        !or    %g2,%lo(__bss_start),%g2		! start of bss
        !sethi %hi(_end),%g3
        !or    %g3,%lo(_end),%g3			! end of bss
        !mov   %g0,%g1				! so std has two zeros
zerobss:
        !std    %g0,[%g2]
        !add    %g2,8,%g2
        !cmp    %g2,%g3
        !bleu,a zerobss
        nop

ちなみにSPRACのアセンブラは!でコメントです。
http://docs.sun.com/app/docs/doc/816-1681/6m83631jh?a=view
Twitterで教わりました。いつもありがとうございます。

同じようにTRAP.Sでもエラーがでました。こちらは何をしているか分からなかったので、ごっそりコメントアウトしました。ここに処理が飛んできたら二度と戻れないはずです。

もう少しSPARCが動き出したら、このあたりもちゃんとしていきましょう。