2011-04-23 3 views
10

J'ai un problème avec _sbrk. Dans une phase de compilation, j'utilise la commande ci-dessous pour lier mes objets et j'obtiens une référence indéfinie à _sbrk.Référence non définie à _sbrk

arm-none-eabi-ld -static -T linkerscript.ld -o exe timer_example.o /home/ziga/projects/cs_lite/arm-none-eabi/lib/libc.a /home/ziga/projects/cs_lite/lib/gcc/arm-none-eabi/4.5.1/libgcc.a 

Je compile pour ARM926EJ-s et en mode ARM donc je pense avoir choisi le bon multilib (libc.a et libgcc.a) qui est situé dans le dossier home/ziga/projets/cs_lite/bras -none-eabi/lib /.

J'ai cherché Internet pour la fonction _sbrk et c'est une sorte d'appel de gestion de mémoire qui n'est pas inclus dans les bibliothèques C standard car il dépend du microprocesseur. Soo dois-je écrire la fonction _sbrk par moi-même? Comment fait-on ça? Avez-vous un exemple pour arm926ej-s? Après avoir écrit cette fonction, j'ai l'intention de le compiler dans un fichier objet et de le lier avec d'autres objets, des bibliothèques.

Cordialement, Ziga.


J'ai résolu ce problème et ici poster solution pour que je donne quelque chose à comunauté. La fonction _sbrk est située dans le package NXP CDL pour ARM. Package est disponible en téléchargement (le lien est pour tous ceux qui DonT le savez déjà) ici: http://www.lpclinux.com/Downloads/WebHome Dans CDL_v005/sous-dossier CSPS/lpc313x/bsps/ea3131/source, vous trouverez le fichier source nommé libnosys_gnu.c qui devrait être ajouté à le projet et compilé à l'objet fichier et ensuite lié au fichier exécutable à côté d'autres objets et bibliothèques.

Meilleurs voeux et beaucoup de succès.

+7

vous devriez mettre cette réponse dans un _answer_ plutôt que d'éditer votre question. C'est bien de répondre à vos propres questions (même pour l'accepter). – paxdiablo

Répondre

3

Cela aide:

-mcpu = cortex m4 -mthumb -specs = nano.specs -specs = nosys.spécifications -mfpu = fpv4-sp-D16 -mfloat-abi = dur

Les commutateurs importants "semblent" être:

-specs = nano.specs -specs = nosys.specs

3

Le problème a peu à faire avec _sbrk lui-même, mais plutôt votre tentative d'invoquer l'éditeur de liens directement, en contournant le pilote du compilateur. À la place, utilisez la commande gcc pour appeler l'éditeur de liens et la syntaxe -Wl,-linkeroptionhere pour transmettre des options supplémentaires à l'éditeur de liens.

Une solution possible, si vous devez appeler l'éditeur de liens vous-même. Essayez de répéter les deux libc.a et libgcc.a une deuxième fois à la fin de la ligne de commande. Il y a aussi une option de linker "en tant que groupe" que vous pouvez utiliser pour réaliser ceci mais je ne le sais pas tout de suite.

+0

J'ai corrigé mon problème en regardant le message édité. – 71GA

2

récemment j'ai également couru dans ce (encore). la solution la plus simple qui a fonctionné pour moi était de fournir/rediriger "malloc" et "gratuit" apis à celui disponible à partir du SDK sur lequel je construisais ma demande. Fondamentalement, cela se produit parce que les apis de gestion mem sont manquants lors de la liaison. comme la réponse ci-dessus mentionne son pas que _sbrk est spécifiquement manquant ici. brk/sbrk syscall est utilisé pour la gestion des tas. d'où le _sbrk, chaînon manquant quand il s'agit de mem management apis. J'ai remarqué que l'ajout de -lnosys (c'est-à-dire libnosys.a) a également contribué à ce dans une certaine mesure dans certaines intégrations.