2009-11-13 6 views
0

J'ai une bibliothèque compilée dans un fichier .a, lié à mon application. (iphone, développement avec Xcode)lier mess avec libc

Tout semble bien se passer, la liaison semble réussir, mais quand je lance le programme, il plante. Le point de crash est à un appel de memcmp() dans la bibliothèque liée statiquement. Le débogueur montre toutes sortes de choses appelées avec "dyld" dans leurs noms, il semble donc que pour une raison quelconque, il ne peut pas résoudre memcmp, commence à chercher des bibliothèques dynamiques, puis échoue. AFAIK memcmp est en libc, cela ne devrait donc pas poser de problème. (essayé aussi en passant -lc à l'éditeur de liens, et cela n'a pas aidé, comme je m'y attendais)

Alors, comment cela est censé fonctionner? Pourquoi une bibliothèque statique ne peut-elle pas utiliser quoi que ce soit de libc? Comment dois-je le compiler?

Merci

+1

La bibliothèque que vous avez liée à votre application est-elle celle que vous avez écrite vous-même? - Je ne peux m'empêcher de me douter qu'il utilise un pointeur non initialisé ou nul. Ou peut-être que vous n'utilisez pas la bibliothèque correctement, ce qui provoque le pointeur invalide? Que dit le backtrace? –

+0

Non, c'est une bibliothèque largement utilisée, fonctionnant de manière fiable sur beaucoup de plates-formes, et elle échoue au tout début, avec une fonction d'initialisation. Le même extrait de code (en réalité 2 appels de fonction pour configurer les choses) Le backtrace pointe vers une fonction memcmp. (la bibliothèque a été compilée en mode debug) –

Répondre

0

Peut-être quelqu'un trouvera utile si je partage ce que le problème était:

La bibliothèque n'a pas été compilé pour la même version du système d'exploitation que le programme principal, il attendait un autre libc que ce qu'il a trouvé lors de l'exécution .

0

libc est apparemment lié dynamiquement sur votre plate-forme. Une version correspondante ne peut pas être trouvée à l'exécution pour satisfaire la dépendance générée au moment de la liaison.

Je ne peux pas expliquer comment cela se produirait à part la corruption du système de fichiers ou l'appel de chroot avant que la liaison dynamique ne se produise (ce qui semble improbable).

+0

La chose étrange est que je peux appeler memcmp() à partir de mon programme principal, mais la bibliothèque ne peut toujours pas l'utiliser. –

+1

Certains compilateurs gèrent memcmp() comme intrinsèque. Autrement dit, si vous l'appelez, il met du code en place pour l'implémenter au lieu d'appeler une fonction de bibliothèque. –