Я пытаюсь получить следующую простую программу 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
Строка script, которую я использую, здесь (я написал ее на основе полдюжины обучающих программ, которые все предложили несколько разные вещи):
https://github.com/UoMCS/mips-cross-compile
В основном он выполняет следующие действия:
- Построить binutils.
- Сборка GCC (этап 1).
- Построить newlib.
- Сборка GCC (этап 2).
Я знаю, что есть другие инструменты, такие как crosstool-ng и builtroot, однако человек, которого я создаю, для этой инструментальной цепочки, хочет отредактировать части binutils перед тем, как начать процесс сборки, и инструментальная цепочка также должна работать под Cygwin (crosstool-ng не будет использоваться по разным причинам, в том числе к файлам, зависящим от регистра).
Я думаю, что это, вероятно, будет чем-то очевидным, но я занимаюсь этим неделю и не вижу, что это может быть. Любая помощь будет принята с благодарностью!