2011-04-11 4 views
4

J'utilise gcc 4.3.4 et ld 20/02/51 dans Cygwin sous Windows 7. Voici une version simplifiée de mon problème:gcc/ld: Référence non définie à la fonction non utilisée

  • foo.o contient la fonction qui foo_bar() appelle à bar() bar.o
  • bar.o contient la fonction bar()
  • main.c fonctions appels à foo.o, mais foo_bar() est pas dans la chaîne d'appel

Si j'essaie de compiler main.c et de le lier à foo.o, j'obtiens une erreur undefined reference to _foo_bar de ld. Comme vous pouvez le voir à partir de mon Makefile, sauf ci-dessous, j'ai essayé d'utiliser des drapeaux pour placer chaque fonction dans sa propre section et que l'éditeur de liens supprime les sections inutilisées.

COMPILE_CYGWIN = gcc -iquote$(INCDIR) 
COMPILE = $(COMPILE_CYGWIN) -g -MMD -MP -Wall -ffunction-sections -Wl,-gc-sections $(DEFINE) 
main_OBJECTS = main.o foo.o 
main.exe : $(main_OBJECTS) 
    $(COMPILE) -o main.exe $(main_OBJECTS) 

La fonction foo_bar() est une fonction courte qui fournit une connexion entre deux couches de réseau dans une pile de protocoles. Certains programmes n'en ont pas besoin, donc ils ne lieront pas dans les autres fichiers objet liés à la couche supérieure de la pile. C'est une petite fonction, et il semble inapproprié de le mettre dans son propre fichier .o.

Je ne comprends pas pourquoi ld lève l'erreur - rien n'appelle foo_bar(), il n'est donc pas nécessaire d'inclure bar() dans l'exécutable final. Un collègue vient de me dire que ld n'est pas un "éditeur de liens intelligent", alors peut-être que ce que j'essaie de faire n'est pas possible?

+0

'-fonction-sections' aurait été nécessaire lors de la compilation de' foo'. Y a-t-il un problème particulier avec la liaison avec 'bar'? – rlibby

+0

Dans ce cas, la liaison dans 'bar.o' nécessite au moins 15 fichiers objets supplémentaires pour remplir ses dépendances.Je pense que j'ai atteint un point où je dois lier les fichiers d'objet dans une bibliothèque et faire référence à mes programmes à la place. – tomlogic

+0

Sauf si vous avez d'autres contraintes, ce n'est pas aussi grave que cela puisse paraître. C'est un peu mal à l'avant mais ça n'aura pas de coût d'exécution significatif. Je ne sais pas comment fonctionne l'éditeur de liens dynamiques sous Windows, mais en supposant qu'il soit à moitié décent, ce code supplémentaire ne sera jamais chargé de toute façon. – rlibby

Répondre

7

À moins que le lieur ne soit de Cyberdyne Systems, il n'a aucun moyen de savoir exactement quelles fonctions seront réellement appelées. Il sait seulement lesquels sont référencés. Même éditeur de liens Skynet's ne peut pas prédire quelles décisions d'exécution seront effectuées ou ce qui se passera si vous chargez un module dynamiquement à l'exécution et il commence à appeler diverses fonctions globales .

Ainsi, si vous lien dans le module m et références fonction f, vous devrez créer un lien avec ce module a f.


1. Ce problème est lié à la Halting Problem et a été prouvé undecidable.