“Symbole indéfini _memset”

J’ai posé une question similaire, mais j’ai quelques mises à jour qui me déroutent vraiment. Essentiellement, je souhaite lier un certain nombre de fichiers object au lieur comme suit:

/usr/ccs/bin/ld -oq -e start_master -dn -z defs -M ../../../mapfile.q {list of object files} 

Je reçois l’erreur suivante:

 Undefined first referenced symbol in file _memset reconf.o 

Ce qui est intéressant, c’est que memset n’est pas référencé dans reconf.c et que j’ai également ajouté le répertoire entier, mais qu’aucun des autres fichiers ne fait référence à _memset. Par conséquent, je me demande pourquoi je reçois ce message d’erreur de l’éditeur de liens, même si nulle part dans mon code source, _memset n’est réellement utilisé. Quelqu’un a une idée de ce qui pourrait se passer ici?

Merci beaucoup, cette erreur nous rend mentaux!

MODIFIER:

J’ai essayé d’append le chemin d’access à la bibliothèque de memset et de le lier avec -lc et de l’exécuter en mode prolixe:

 /usr/ccs/bin/ld -oq -e start_master -dn -z defs -z verbose -L/usr/lib -M ../../../mapfile.q {list of object files} -lc 

Ensuite, j’obtiens l’erreur suivante: ld: fatal: bibliothèque -lc: non trouvé ld: fatal: erreurs de traitement de fichier. Aucune sortie écrite dans q

Et ceci bien que libc.so soit clairement dans / usr / lib …

Déroutant

EDIT II:

En faisant d’autres recherches, il semble que sous Solaris 10, la liaison statique disparaisse, comme vous pouvez le lire ici:

http://blogs.oracle.com/rie/entry/static_linking_where_did_it

C’est probablement mon problème. Quelqu’un at-il une idée de la façon dont je pourrais réécrire ma commande de l’éditeur de liens pour remédier à ce problème?

Merci beaucoup!

    Vous avez probablement fait:

     struct S v = { 0 }; 

    ou

     struct S v; v = (some const-variable). 

    ou

     uint8_t b[100] = { 0 }; 

    .

    Certains compilateurs mettent implicitement le memset (ou memcpy) intégré pour de telles choses. Le memset intégré s’appelle alors _memset (dans votre cas). Une fois que vous avez créé un lien et que votre bibliothèque (ou ce qui fournit une fonction standard dans votre cas) ne l’a pas fournie, vous obtenez cette erreur de lien.

    En supposant que vous libc.so Solaris, vous trouverez memset dans la bibliothèque libc.so :

     /usr/lib-> nm libc.so | grep memset [7122] | 201876| 104|FUNC |GLOB |0 |9 |_memset 

    Ajoutez simplement -lc à la ligne de commande

    Memset est une fonction de bibliothèque issue de la bibliothèque standard C. Si vous n’utilisez pas gcc pour la liaison (qui lie par défaut vos fichiers à des bibliothèques standard), vous devez explicitement lier votre progrom à la libc.

    Sur l’autre option, vous n’utilisez probablement pas la libc. Dans ce cas, l’appel de memset pourrait être généré par gcc.

    De l’ man gcc :

    -nodefaultlibs

    N’utilisez pas les bibliothèques système standard lors de la liaison. Seules les bibliothèques que vous spécifiez seront transmises à l’éditeur de liens. Les options spécifiant la liaison des bibliothèques système, telles que -static-libgcc ou -shared-libgcc, seront ignorées. Les fichiers de démarrage standard sont utilisés normalement, sauf si -nostartfiles est utilisé. Le compilateur peut générer des appels à memcmp, memset, memcpy et memmove. Ces entrées sont généralement résolues par les entrées de libc. Ces points d’entrée doivent être fournis via un autre mécanisme lorsque cette option est spécifiée.

    Dans ce cas, écrivez simplement memset (c’est une proc. Triviale) et fournissez-le à l’éditeur de liens.