Sto cercando di ottenere il seguente programma semplice 'Ciao Mondo' per compilare utilizzando un cross-compilatore (GCC 4.9.2) mira mips
:undefined reference to printf quando si usa GCC croce compilatore
#include <stdio.h>
int main()
{
int x = 5;
printf("x = %d\n", x);
}
Il x
variabile è lì per fermare GCC cambiando printf
a puts
, che sembra fare automaticamente per una semplice stringa terminata a capo.
Ho costruito un compilatore croce sotto ${HOME}/xc
e sto eseguendo utilizzando il seguente comando:
${HOME}/xc/bin/mips-gcc -v hello.c
Tuttavia, sto ottenendo il seguente errore:
/tmp/ccW5mHJu.o: In function `main':
(.text+0x24): undefined reference to `printf'
collect2: error: ld returned 1 exit status
Sto assumendo questo è un problema con il linker, poiché mi aspetto che il processo fallisca prima se non è stato possibile trovare ad esempio stdio.h
nel percorso di ricerca. Posso compilare un programma più semplice che restituisce semplicemente zero, quindi non è il caso che l'intera toolchain sia rotta, presumibilmente solo il collegamento della libreria standard (sto usando newlib 2.2.0-1).
Ottengo lo stesso errore indipendentemente dal fatto che eseguo il cross compiler sotto Linux (Ubuntu 14.10) o Cygwin (Windows 8).
L'uscita completa dal GCC è:
sceneggiaturaUsing 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
La build che sto utilizzando è qui (ho scritto basa su una mezza dozzina di tutorial che tutto ha suggerito cose leggermente diverse):
https://github.com/UoMCS/mips-cross-compile
Fondamentalmente si fa le seguenti fasi:
- Corporatura Binu TILS.
- Build GCC (fase 1).
- Costruisci newlib.
- Build GCC (stage 2).
Sono consapevole del fatto che ci sono altri strumenti come CrossTool-ng e builtroot, tuttavia la persona che sto costruendo questo toolchain per vuole modificare parti del binutils prima di partire il processo di compilazione, e la toolchain anche deve lavorare sotto Cygwin (crosstool-ng non per vari motivi, compresi i percorsi dei file sensibili al maiuscolo/minuscolo).
Penso che questo probabilmente sarà qualcosa di ovvio, ma ci ho lavorato per una settimana e non riesco a vedere cosa potrebbe essere. Qualsiasi aiuto sarebbe molto apprezzato!
Provare a scaricare l'elenco di simboli definiti da newlib –
Come fare? – pwaring
Solo per curiosità: 'int main (void) {};' compila? – alk