• 締切済み

[GCC]libgccをコンパイルするのに適切なヘッダファイルは?

ルネサスSH系CPU用のGCCクロスコンパイラをmakeしようとしています。 ところどころパッチを当てながら、libgccをコンパイルするstageまで来たのですが、その途中でエラーになって先に進めません。 エラーとソースコードから読み取れる範囲では、どうもpthread.hで定義されるべきpthread_tなどの構造体が定義されていないか、または、#if~#endifブロックでスキップされてしまっているようです。 今回はクロスコンパイラ用ということで、--with-headersオプションを使って、newlib用のヘッダファイルを使用してビルドしようとしていますが、newlibのヘッダファイルはlibgccのビルド用としては不適当なのでしょうか?他におすすめできるライブラリヘッダはありますでしょうか? (環境) ホストOS:cygwin-i686 ターゲット:sh-linux (elf) ビルドしようとしているGCC:4.3.3 binutils:2.19.51 newlib:1.19.0 (コンフィグレーション) configure --target=sh-linux --prefix=/usr --with-gnu-as --with-gnu-ld --with-headers=(newlibのlibc/include) --with-newlib 以上です。よろしくお願いいたします。

みんなの回答

  • entree
  • ベストアンサー率55% (405/735)
回答No.4

> いずれにせよ、_POSIX_PTHREADマクロが定義されるべきかどうか?、そしてもしそうならなぜ定義されていないのか?というあたりを解明したいです。 実際にコード内を検索してみました。カーネルヘッダ、gcc、newlib、glibcを検索しましたが、_POSIX_PTHREADマクロはnewlibの中にしか現れず、どこにもdefineされている箇所はありませんでした。 このことから、CFLAGSなどで強制的にdefineしない限りdefineされることはなさそうです。 ただ、この問題が解決しても、newlibには存在しないヘッダファイルを読み込んでいる箇所があるようで、newlibでは難しいと感じました。glibcで試すことは難しいですか? linuxはglibcを前提としている?少なくともgccは・・・

haniriito
質問者

お礼

entreeさん、たびたびありがとうございます。また、お手を煩わせてまでマクロの存在を調べていただきましてありがとうございました。 そうですね、私は「クロス開発用」→「組み込み用で省メモリが要求される」→「newlibしかない」という固定観念にとらわれすぎていたのは間違いありません。他のバージョンではnewlibでクロスgccがビルドできていたものですから余計にそう思いこんでいました。 そもそも、今回GCC4.3が欲しい理由はlinuxカーネル2.6.21あたりをコンパイルしたいだけなので、なんちゃってライブラリ(というと誤解が大きい?)newlibよりも、glibcの方が向いているというご指摘はごもっともだと思います。 で、やってみました。glibcは2.9です。が、今度は、 checking how to run the C preprocessor... /lib/cpp configure: error: C preprocessor "/lib/cpp" fails sanity check See `config.log' for more details. make[1]: *** [configure-target-libgcc] Error 1 make[1]: Leaving directory `/home/_/sh-cross/build-gcc/gcc-4.3.3/work-with-glibc' make: *** [all] Error 2 というエラーです・・・。 とりあえず、ライブラリはglibcを使う方向に固定して、このエラーの原因を探っていきたいと思います。 ありがとうございました。

  • entree
  • ベストアンサー率55% (405/735)
回答No.3

とりあえず以下の点だけ。 > いずれにせよ、_POSIX_PTHREADマクロが定義されるべきかどうか?、そしてもしそうならなぜ定義されていないのか?というあたりを解明したいです。 以下のようなコードを xgcc を使ってコンパイルして、sh-linux 環境で実行してみれば分かるかと思います。あとは、gcc/config/sh にあるヘッダファイル (tm_file) や specs ファイルを参照して _POSIX_PTHREAD がdefine されているか確認することもできるでしょう。 int main () { #ifdef _POSIX_PTHREAD return 1; #else return 0; #endif }

  • entree
  • ベストアンサー率55% (405/735)
回答No.2

> エラーとソースコードから読み取れる範囲では、どうもpthread.hで定義されるべきpthread_tなどの構造体が定義されていないか、または、#if~#endifブロックでスキップされてしまっているようです。 プリプロセスは試されましたか? -c を -E に替えて実行。 $ cd <下記コマンドが実行されたディレクトリ> $ /home/_/cross-sh/build-gcc/gcc-4.3.3/work/./gcc/xgcc -B/home/_/cross-sh/build-gcc/gcc-4.3.3/work/./gcc/ -B/usr/local/cross/sh-linux/bin/ -B/usr/local/cross/sh-linux/lib/ -isystem /usr/local/cross/sh-linux/include -isystem /usr/local/cross/sh-linux/sys-include -O2 -g -g -O2 -mb -O2 -O2 -g -g -O2 -DIN_GCC -DCROSS_DIRECTORY_STRUCTURE -W -Wall -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition -isystem ./include -fPIC -g -DHAVE_GTHR_DEFAULT -DIN_LIBGCC2 -D__GCC_FLOAT_NOT_NEEDED -fpic -DNO_FPSCR_VALUES -I. -I. -I../../.././gcc -I../../../../libgcc -I../../../../libgcc/. -I../../../../libgcc/../gcc -I../../../../libgcc/../include -DHAVE_CC_TLS -o unwind-dw2.out -MT unwind-dw2.o -MD -MP -MF unwind-dw2.dep -fexceptions -E ../../../../libgcc/../gcc/unwind-dw2.c -fvisibility=hidden -DHIDE_EXPORTS pthread_key_t が定義されていないように見えますが、期待通りであれば、newlib の sys/types.h に以下のコードがあるので、定義されていると思います。 typedef __uint32_t pthread_key_t; /* thread-specific data keys */ 確認のポイント /usr/sh-linux/sys-include に pthread.h が存在している。 (--with-headers が指定された場合、最初にコピーが行われます。) ※--with-headers で /usr を指定するのはあまり望ましくないです。 > newlibのヘッダファイルはlibgccのビルド用としては不適当なのでしょうか?他におすすめできるライブラリヘッダはありますでしょうか? 普通は glibc だと思います。既にネイティブ環境があるのであればそこからヘッダファイルとライブラリを持ってくることが手っ取り早いです。 > --with-gnu-as --with-gnu-ld クロス開発用に gas と GNU ld をインストールしているでしょうから、--with-as、--with-ld を使用した方が、ネイティブの gas や GNU ld を使用してエラーになるようなことがなくてよいです。 > その後の調査で、どうもCygwin上でmakeしているのがよくないような気がしてきました。ソースコード上のコメントに「Cygwinは完全にはposixに準拠していないのでpthread関係はちゃんと動かない(コンパイルできない)」といったような書き込みを見つけました。確かに、make中に_UNIX98_THREAD_MUTEX_ATTRIBUTESマクロが定義されておらず、コンパイルを通すために必要と思われる#if~#endifブロックがskipされていました。 クロスコンパイルなので、libgccは target (sh-linux) 向けライブラリを生成する gcc (xgcc) でコンパイルされます。なので、ここで発生する問題は Cygwin の問題ではないでしょう。 > とりあえず、コメントありがとうございました。この”補足”と同時に添付ファイルがアップロードできるようでしたら、アドバイスいただいたエラーメッセージとヘッダファイル一覧をアップしたいと思いますが、この質問ページの仕様的に画像や動画以外は無理かもしれません。 ヘッダファイルの中身を言っているのではありません。configure スクリプトの中で以下が実行されますが、そこで実際に出力されている内容を言っています。( $tm_file の内容。config.status や Makefile を確認しても分かります ) for f in $tm_file; do count=${count}x done if test $count = ax; then echo "Using \`$srcdir/config/$tm_file' as target machine macro file." else echo "Using the following target machine macro files:" for f in $tm_file; do echo " $srcdir/config/$f" done fi

haniriito
質問者

お礼

(つづきです) > 普通は glibc だと思います。既にネイティブ環境があるのであればそこからヘッダファイルとライブラリを持ってくることが手っ取り早いです。 すみませんが、「既にネイティブ環境がある」とはどういうことなのでしょうか?sh-linuxが動作する環境があるか?という意味ですか?それとも、古いバージョンのsh用クロスコンパイラのビルドに成功したときのヘッダファイルが残っているか?という意味でしょうか? 前者の意味ならありません。後者の意味なら、単に違うバージョンのnewlibを使う、という意味になりますね。 > クロス開発用に gas と GNU ld をインストールしているでしょうから、--with-as、--with-ld を使用した方が、ネイティブの gas や GNU ld を使用してエラーになるようなことがなくてよいです。 ありがとうございます。makeログを見る限りでは、先にビルドしておいたsh用gasとldはちゃんと見つけられているようです。 > ヘッダファイルの中身を言っているのではありません。configure スクリプトの中で以下が実行されますが、そこで実際に出力されている内容を言っています。( $tm_file の内容。config.status や Makefile を確認しても分かります ) そういう意味でしたか・・・。失礼しました。 Using `../../gcc/config/sh/sh.c' for machine-specific logic. Using `../../gcc/config/sh/sh.md' as machine description file. Using the following target machine macro files: ../../gcc/config/sh/little.h ../../gcc/config/sh/sh.h ../../gcc/config/dbxelf.h ../../gcc/config/elfos.h ../../gcc/config/svr4.h ../../gcc/config/sh/elf.h ../../gcc/config/linux.h ../../gcc/config/sh/linux.h Using `../../gcc/config/ i386/xm-cygwin.h' as host machine macro file. Using host-cygwin.o for host machine hooks. こんな感じでした。これが正しいのかどうかは、ちょっといまの私のレベルでは判断できないです。 いずれにせよ、_POSIX_PTHREADマクロが定義されるべきかどうか?、そしてもしそうならなぜ定義されていないのか?というあたりを解明したいです。 何かありましたら、引き続きよろしくお願いいたします。

haniriito
質問者

補足

たびたびのアドバイスありがとうございます。 文字数制限のため「補足」と「お礼」に分けて書き込みます。 > プリプロセスは試されましたか? -c を -E に替えて実行。 こういう方法は知りませんでした。が、プリプロセスだけ通して何か意味のある結果が得られることがあるのでしょうか? とりあえずやってみたところ、 In file included from ../../../../libgcc/../gcc/unwind-dw2.c:338: ../../../../libgcc/../gcc/config/sh/linux-unwind.h:33:26: error: sys/ucontext.h: No such file or directory となります。これは、前回提示したエラーメッセージのもっと後の方で既に出ていたものなので「pthread_key_tが未定義」という問題が解決した後、どうにかしようと考えてました。 > pthread_key_t が定義されていないように見えますが、期待通りであれば、newlib の sys/types.h に以下のコードがあるので、定義されていると思います。 ありがとうございます。その通りです。この件は先に調べていて、分かっていました。newlibのpthread.hの前の方に #if defined(_POSIX_THREADS) #include <sys/types.h> #include <time.h> #include <sys/sched.h> : : : : : とありますが、_POSIX_THREADが定義されていないので、sys/types.hがインクルードされていないことまで調べがついています。 しかし、私には分からないのが、この環境・このコンフィグレーションにおいて、_POSIX_THREADSは定義されているべきなのかどうかが、分からないということです。とにかく、大量の#ifdef が埋め込まれていますので、それぞれのマクロの意味を理解して正しい定義の有無を判別するのはかなり困難なのではないかと思っています。 > ※--with-headers で /usr を指定するのはあまり望ましくないです。 実際には、/usr/local/crossを指定しています。

  • entree
  • ベストアンサー率55% (405/735)
回答No.1

エラーメッセージを載せることなしに回答は困難です。これでは以下がどの部分でエラーを返しているのかさえ回答者は分かりません。 > エラーとソースコードから読み取れる範囲では、どうもpthread.hで定義されるべきpthread_tなどの構造体が定義されていないか、または、#if~#endifブロックでスキップされてしまっているようです。 次に、gccのconfigure時にロードしているターゲットヘッダファイルの一覧(configureのアウトプットにgcc/config/***.h、gcc/config/sh/***.hなどのファイルがロードされた出力があると思います)も載せていただいた方がベターです。 あと、binutilsの最新バージョンは2.19、newlibは1.17.0です。 安定版を使われることをお勧めします。 # binutils:2.19.51 # newlib:1.19.0

haniriito
質問者

補足

アドバイスありがとうございます。 エラーメッセージは載せた方が良いとは思ったのですが、大量なので文字数制限のため貼り付けきれないのと、ズバリそのままの回答がほしいというよりは自力で解決するための手がかりがほしいと思って敢えて載せませんでした。 その後の調査で、どうもCygwin上でmakeしているのがよくないような気がしてきました。ソースコード上のコメントに「Cygwinは完全にはposixに準拠していないのでpthread関係はちゃんと動かない(コンパイルできない)」といったような書き込みを見つけました。確かに、make中に_UNIX98_THREAD_MUTEX_ATTRIBUTESマクロが定義されておらず、コンパイルを通すために必要と思われる#if~#endifブロックがskipされていました。このブロックはnewlib中のpthread.h内にあるものなので、newlibのライブラリヘッダはlibgccをmakeするのに向かないのかと思っていました。もしそうならnewlibに固執するのはムダな努力なのでそのあたりを確認したくて質問した次第です。 とりあえず、コメントありがとうございました。この”補足”と同時に添付ファイルがアップロードできるようでしたら、アドバイスいただいたエラーメッセージとヘッダファイル一覧をアップしたいと思いますが、この質問ページの仕様的に画像や動画以外は無理かもしれません。 (エラーメッセージ一部) make[4]: Entering directory `/home/_/cross-sh/build-gcc/gcc-4.3.3/work/sh-linux/mb/libgcc' # If this is the top-level multilib, build all the other # multilibs. /home/_/cross-sh/build-gcc/gcc-4.3.3/work/./gcc/xgcc -B/home/_/cross-sh/build-gcc/gcc-4.3.3/work/./gcc/ -B/usr/local/cross/sh-linux/bin/ -B/usr/local/cross/sh-linux/lib/ -isystem /usr/local/cross/sh-linux/include -isystem /usr/local/cross/sh-linux/sys-include -O2 -g -g -O2 -mb -O2 -O2 -g -g -O2 -DIN_GCC -DCROSS_DIRECTORY_STRUCTURE -W -Wall -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition -isystem ./include -fPIC -g -DHAVE_GTHR_DEFAULT -DIN_LIBGCC2 -D__GCC_FLOAT_NOT_NEEDED -fpic -DNO_FPSCR_VALUES -I. -I. -I../../.././gcc -I../../../../libgcc -I../../../../libgcc/. -I../../../../libgcc/../gcc -I../../../../libgcc/../include -DHAVE_CC_TLS -o unwind-dw2.o -MT unwind-dw2.o -MD -MP -MF unwind-dw2.dep -fexceptions -c ../../../../libgcc/../gcc/unwind-dw2.c -fvisibility=hidden -DHIDE_EXPORTS In file included from ../../.././gcc/gthr-default.h:1, from ../../../../libgcc/../gcc/gthr.h:132, from ../../../../libgcc/../gcc/unwind-dw2.c:42: ../../../../libgcc/../gcc/gthr-posix.h:46: error: expected '=', ',', ';', 'asm' or '__attribute__' before '__gthread_key_t' ../../../../libgcc/../gcc/gthr-posix.h:47: error: expected '=', ',', ';', 'asm' or '__attribute__' before '__gthread_once_t' ../../../../libgcc/../gcc/gthr-posix.h:48: error: expected '=', ',', ';', 'asm' or '__attribute__' before '__gthread_mutex_t'