1. ホーム
  2. c

[解決済み] GCCクロスコンパイラ使用時のprintfへの未定義参照について

2022-02-02 05:20:47

質問

次のような単純な '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

基本的には以下のような手順で行います。

  1. binutilsをビルドします。
  2. GCCをビルドします(ステージ1)。
  3. newlibをビルドします。
  4. GCC(第2ステージ)をビルドします。

crosstool-ngやbuiltrootのような他のツールがあることは知っていますが、私がこのツールチェーンを構築している人は、構築プロセスを開始する前にbinutilsの一部を編集したいと考えており、ツールチェーンはまたCygwinで動作しなければなりません(大文字小文字を区別するファイルパスなどの様々な理由からcrosstool-ngでは動きません)。

おそらくこれは明白な何かになると思うのですが、1週間もいじくりまわして、何が原因なのかがわかりません。何か手助けがあれば、非常にありがたいです。

解決方法は?

クロスコンパイラに対応したライブラリの構築が必要です。 特に、glibc やその他の標準ライブラリの実装のクロスコンパイルバージョンが必要で、そのバージョンで printf() .

をご覧ください。 このリンク クロスコンパイラ、ヘッダ、ライブラリなど、必要なものをすべて入手するために考慮すべきことの一例です。