Undefined reference to printf lors de l'utilisation de GCC le compilateur croisé

Je vais essayer d'obtenir les suivantes simple 'Bonjour le Monde' programme pour compiler à l'aide d'un cross compilateur (GCC 4.9.2) ciblage mips:

#include <stdio.h>

int main()
{
  int x = 5;
  printf("x = %d\n", x);
}

La x variable est là pour arrêter de GCC changer printf à puts, dont il semble faire automatiquement pour un simple retour à la ligne-chaîne terminée.

J'ai construit un cross compilateur sous ${HOME}/xc et je suis d'exécution à l'aide de la commande suivante:

${HOME}/xc/bin/mips-gcc -v hello.c

Cependant, j'obtiens l'erreur suivante:

/tmp/ccW5mHJu.o: In function `main':
(.text+0x24): undefined reference to `printf'
collect2: error: ld returned 1 exit status

Je suppose que c'est un problème avec l'éditeur de liens, que je m'attends à de l'échec du processus plus tôt si par exemple stdio.h ne pouvait pas être trouvé sur le chemin de recherche. Je peux compiler un programme plus simple qui retourne simplement zéro, il n'est donc pas le cas que l'ensemble de la chaîne est cassée, probablement juste de la bibliothèque standard de liens (je suis en utilisant newlib 2.2.0-1).

Je reçois la même erreur, indépendamment de savoir si je lance le compilateur croisé sous Linux (Ubuntu 14.10) ou Cygwin (Windows 8).

La sortie complète de GCC est:

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

Le script de build que j'utilise est ici (je l'ai écrit basé sur une demi-douzaine de tutoriels qui ont tous suggéré des choses légèrement différentes):

https://github.com/UoMCS/mips-cross-compile

Fondamentalement, il ne les étapes suivantes:

  1. Construire binutils.
  2. Construire GCC (étape 1).
  3. Construire newlib.
  4. Construire GCC (étape 2).

Je suis conscient qu'il existe d'autres outils tels que crosstool-ng et builtroot, cependant, la personne que je suis en train de construire cette suite d'outils pour veut modifier des parties de binutils avant de démarrer le processus de construction, et la suite d'outils doit aussi travailler sous Cygwin (crosstool-ng ne sera pas, pour diverses raisons, y compris les fichiers sensible à la casse des chemins).

Je pense que cela va probablement être quelque chose d'évident, mais j'ai été déconner avec ce pour une semaine et ne peut pas voir ce qu'elle pourrait être. Toute aide serait grandement appréciée!

Essayez de dumping de la liste des symboles définis par newlib
Comment dois-je procéder?
Juste par curiosité: est-ce int main(void) {}; compiler?
Oui, j'ai toujours l' cannot find entry symbol _start d'avertissement (qui je pense peut être ignoré basé sur mon expérience avec les BRAS), mais il n'a compiler avec succès.
Si je lance gcc -v test.c sur mon Linux, dans sa sortie est un -lc pour le c-bibliothèque qui n'est pas présent dans votre sortie d'où le undefined reference to printf.

OriginalL'auteur pwaring | 2015-05-03