[解決済み] GCCクロスコンパイラ使用時のprintfへの未定義参照について
質問
次のような単純な 'Hello World' プログラムをクロスコンパイラ (GCC 4.9.2) をターゲットにしてコンパイルしようとしています。
mips
:
#include <stdio.h>
int main()
{
int x = 5;
printf("x = %d\n", x);
}
は
x
変数は、GCC が
printf
から
puts
これは、単純な改行で終わる文字列に対して自動的に行われるようです。
の下にクロスコンパイラを構築してみました。
${HOME}/xc
で、以下のコマンドで実行中です。
${HOME}/xc/bin/mips-gcc -v hello.c
しかし、以下のようなエラーが発生します。
/tmp/ccW5mHJu.o: In function `main':
(.text+0x24): undefined reference to `printf'
collect2: error: ld returned 1 exit status
これはリンカーの問題だと思います。例えば、次のような場合、もっと早い段階で処理が失敗すると思うからです。
stdio.h
が検索パスで見つかりませんでした。もっと単純なプログラムをコンパイルすると、単にゼロを返すので、ツールチェーン全体が壊れているわけではなく、おそらく標準ライブラリのリンクだけだと思います(newlib 2.2.0-1 を使用しています)。
Linux (Ubuntu 14.10) と Cygwin (Windows 8) のどちらでクロスコンパイラを実行しても同じエラーが出ます。
GCCからの全出力は
Using built-in specs.
COLLECT_GCC=/home/paul/xc/bin/mips-gcc
COLLECT_LTO_WRAPPER=/home/paul/xc/libexec/gcc/mips/4.9.2/lto-wrapper
Target: mips
Configured with: /home/paul/xc/mips/tmp/gcc-4.9.2/configure --prefix=/home/paul/xc --target=mips --enable-languages=c --with-newlib --without-isl --without-cloogs --disable-threads --disable-libssp --disable-libgomp --disable-libmudflap
Thread model: single
gcc version 4.9.2 (GCC)
COLLECT_GCC_OPTIONS='-v'
/home/paul/xc/libexec/gcc/mips/4.9.2/cc1 -quiet -v hello.c -quiet -dumpbase hello.c -auxbase hello -version -o /tmp/ccCpAajQ.s
GNU C (GCC) version 4.9.2 (mips)
compiled by GNU C version 4.9.1, GMP version 6.0.0, MPFR version 3.1.2, MPC version 1.0.3
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory "/home/paul/xc/lib/gcc/mips/4.9.2/../../../../mips/sys-include"
#include "..." search starts here:
#include <...> search starts here:
/home/paul/xc/lib/gcc/mips/4.9.2/include
/home/paul/xc/lib/gcc/mips/4.9.2/include-fixed
/home/paul/xc/lib/gcc/mips/4.9.2/../../../../mips/include
End of search list.
GNU C (GCC) version 4.9.2 (mips)
compiled by GNU C version 4.9.1, GMP version 6.0.0, MPFR version 3.1.2, MPC version 1.0.3
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: cffaaedf0b24662e67a5d97387fc5b17
COLLECT_GCC_OPTIONS='-v'
/home/paul/xc/lib/gcc/mips/4.9.2/../../../../mips/bin/as -EB -O1 -no-mdebug -mabi=32 -o /tmp/ccW5mHJu.o /tmp/ccCpAajQ.s
COMPILER_PATH=/home/paul/xc/libexec/gcc/mips/4.9.2/:/home/paul/xc/libexec/gcc/mips/4.9.2/:/home/paul/xc/libexec/gcc/mips/:/home/paul/xc/lib/gcc/mips/4.9.2/:/home/paul/xc/lib/gcc/mips/:/home/paul/xc/lib/gcc/mips/4.9.2/../../../../mips/bin/
LIBRARY_PATH=/home/paul/xc/lib/gcc/mips/4.9.2/:/home/paul/xc/lib/gcc/mips/4.9.2/../../../../mips/lib/
COLLECT_GCC_OPTIONS='-v'
/home/paul/xc/libexec/gcc/mips/4.9.2/collect2 -plugin /home/paul/xc/libexec/gcc/mips/4.9.2/liblto_plugin.so -plugin-opt=/home/paul/xc/libexec/gcc/mips/4.9.2/lto-wrapper -plugin-opt=-fresolution=/tmp/cc8TAJb9.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc -EB /home/paul/xc/lib/gcc/mips/4.9.2/crti.o /home/paul/xc/lib/gcc/mips/4.9.2/crtbegin.o -L/home/paul/xc/lib/gcc/mips/4.9.2 -L/home/paul/xc/lib/gcc/mips/4.9.2/../../../../mips/lib /tmp/ccW5mHJu.o -lgcc -lgcc /home/paul/xc/lib/gcc/mips/4.9.2/crtend.o /home/paul/xc/lib/gcc/mips/4.9.2/crtn.o
/home/paul/xc/lib/gcc/mips/4.9.2/../../../../mips/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000000400050
/tmp/ccW5mHJu.o: In function `main':
(.text+0x24): undefined reference to `printf'
collect2: error: ld returned 1 exit status
私が使っているビルドスクリプトはこちらです(半ダースのチュートリアルを元に書きましたが、どれも微妙に異なることを示唆していました)。
https://github.com/UoMCS/mips-cross-compile
基本的には以下のような手順で行います。
- binutilsをビルドします。
- GCCをビルドします(ステージ1)。
- newlibをビルドします。
- GCC(第2ステージ)をビルドします。
crosstool-ngやbuiltrootのような他のツールがあることは知っていますが、私がこのツールチェーンを構築している人は、構築プロセスを開始する前にbinutilsの一部を編集したいと考えており、ツールチェーンはまたCygwinで動作しなければなりません(大文字小文字を区別するファイルパスなどの様々な理由からcrosstool-ngでは動きません)。
おそらくこれは明白な何かになると思うのですが、1週間もいじくりまわして、何が原因なのかがわかりません。何か手助けがあれば、非常にありがたいです。
解決方法は?
クロスコンパイラに対応したライブラリの構築が必要です。 特に、glibc やその他の標準ライブラリの実装のクロスコンパイルバージョンが必要で、そのバージョンで
printf()
.
をご覧ください。 このリンク クロスコンパイラ、ヘッダ、ライブラリなど、必要なものをすべて入手するために考慮すべきことの一例です。
関連
-
[解決済み】Cコンパイルエラー。"変数サイズのオブジェクトが初期化されていない可能性がある"
-
[解決済み】strcmpが機能しない
-
[解決済み】ポインタと整数の比較で警告が出る
-
[解決済み】 error: too few arguments to function `printDay' (C言語)
-
[解決済み】 strcpyとstrdupの比較
-
[解決済み】メモリー・クロバリング・エラー
-
[解決済み] struct has no member named
-
[解決済み】argv[]をint型として取得するには?
-
[解決済み】未定義参照 makefile が間違っているのかも?
-
[解決済み] experimental::filesystem リンカエラー
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】valgrind - サイズ8のブロックが割り当てられた後、アドレス ---- が0バイトになる。
-
[解決済み】LEALアセンブリ命令は何をするのですか?
-
[解決済み] [Solved] なぜこのようなエラーが発生するのでしょうか。「データ定義に型またはストレージクラスがない」?
-
[解決済み】MB/sとMiB/sを計算する方法は?
-
[解決済み】LinuxのI_PUSHに相当するもの
-
[解決済み】int型配列へのポインタのスカラ・イニシャライザの過剰要素
-
[解決済み】makefile:4。*** missing separator. 停止する
-
[解決済み】Linuxソケットのwrite()でBad File Descriptorが発生するC
-
[解決済み】C言語でpow( )への未定義参照、math.hを含むにもかかわらず【重複】。
-
[解決済み】なぜC言語で数学ライブラリをリンクする必要があるのですか?