2010-10-13 17 views
1

J'ai une affaire dans linux où gcc et ld construisent des choses proprement, mais à l'exécution j'obtiens un symbole indéfini (pour quelque chose dans libxerces-c.so.28), rapporté par une de mes propres bibliothèques partagées, lors de l'exécution mon programme.Pourquoi un symbole indéfini d'exécution serait-il corrigé en ajoutant/usr/lib à ld.so.conf?

La première hypothèse était que le cache était cassé, les xerces récemment installés, ou quelque chose de similaire, alors j'ai lancé ldconfig. Je ne l'ai pas réparé. Mais ajouter/usr/lib à ld.so.conf et lancer ldconfig l'a corrigé.

Ma compréhension est/lib,/usr/lib, et peut-être un ou deux autres points sont toujours recherchés par le lieur dynamique d'exécution.

??

(La seule chose qui sort de l'ordinaire est qu'il s'agit d'un programme java utilisant jni pour accéder à des bibliothèques partagées d'application.Par ailleurs, si c'était quelque chose de rationnel, j'aurais dû voir cette erreur à n'importe quel moment. application.)

Répondre

3

Dans ce cas particulier, la bibliothèque se trouvait dans/usr/lib, mais aussi dans un autre projet (et l'éditeur de liens en trouvait un en premier). Et ça devait être un mauvais/incomplet, puisqu'il manquait évidemment un symbole.

Je compris cela en exécutant mon programme

LD_DEBUG=libs ./a.out 

Cela me laisse regarder l'éditeur de liens creuser à travers les différents chemins de recherche, et je l'ai vu saisir le mauvais.

Oh - et d'ajouter explicitement/usr/lib à la configuration ld? Cela a juste mis/usr/lib plus tôt dans le chemin de recherche que cela aurait normalement été, et (chance?) A fait trouver à ld la bonne bibliothèque avant la mauvaise.