2010-12-08 31 views
6

je reçois l'erreur suivante lorsque je tente d'exécuter un script que je n'ai que l'accès d'exécution pour:Réglage ma lib LD_PRELOAD fait certains processus produisent des erreurs de chargeur

uname: symbol lookup error: /home/dumindara/random/sotest/a.out: undefined symbol: dlsym

Ceci est après avoir mis environnement LD_PRELOAD variable à /home/dumindara/random/sotest/a.out.

a.out a une fonction de test malloc et appelle dlsym en interne.

Je n'obtiens pas ce problème lors de l'exécution ls. La plupart des processus donnent cette erreur. Pourquoi cela arrive-t-il et que puis-je faire pour le faire fonctionner?

+0

Il est généralement une bonne idée de définir LD_PRELOAD uniquement pour a.out, plutôt que de modifier l'environnement shell. Dans la plupart des shells UNIX, vous pouvez taper: 'LD_PRELOAD = xyz./A.out'. Sinon, essayez '(LD_PRELOAD = xyz; ./a.out)'. –

+0

@Tony: Je pense que a.out est un objet partagé dans ce cas, malgré son nom mal choisi. L'OP essaie apparemment de surcharger 'malloc()' avec sa propre version, puis de passer directement au malloc réel. – thkala

+0

@tkhala: ah, bonne capture ... serait plus comme 'LD_PRELOAD = \' pwd \ '/a.out program_to_test' alors .... –

Répondre

13

Je suppose que votre fichier a.out est un objet partagé et non un exécutable et se déplacer sur ...

dlsym() est une fonction de la bibliothèque libdl, qui réside habituellement dans le libdl.so.2 partagé objet sur les systèmes Linux modernes.

Je vais deviner que votre objet partagé a.out n'est pas lié à libdl. Cela signifie que lorsque vous préchargez dans un binaire simple comme uname qui ne tire pas dans beaucoup d'autres bibliothèques, libdl.so.2 peut ne pas être tiré dedans et vous obtenez une erreur de symbole indéfinie.

Si, en revanche, vous le préchargez sur un binaire lié à et libère finalement libdl.so.2, votre objet partagé fonctionne correctement.

Je vérifierais avec ldd si votre propre objet partagé est lié à libdl comme il se doit, et aussi quelles bibliothèques sont tirées directement ou indirectement lorsque uname et ls s'exécutent.

EDIT:

Je viens de le confirmer. Le moyen de corriger cette erreur est de lier votre objet partagé à libdl. Ajouter -ldl à son LDFLAGS devrait faire l'affaire.

+0

Notez que -ldl peut être nécessaire avant les autres fichiers .o, par exemple"gcc -ldl -shared foo.o bar.o -o baz.so". –

16

Je ne peux pas commenter à la réponse acceptée, mais il est utile de mentionner ici que l'on peut rencontrer le problème de ne pas avoir libdl.so.2 lié correctement quand -ldl est utilisé devant la commande de compilation (en supposant que la liaison et la compilation est exécutée par la même commande, ce qui est possible puisque les bibliothèques LD_PRELOAD sont généralement basées sur un fichier source).

Alors appelez gcc avec -ldl à la fin:

gcc -shared -fPIC fakeuname.c -o libfakeuname.so -ldl

Dans mon cas, ayant -ldl à l'avant a entraîné une erreur identique en question:

uname: symbol lookup error: ./libfakehostname.so: undefined symbol: dlsym

+0

Point très important .. – user1173339

+0

yes thumbs up !!! La réponse de thkala me donnait encore une erreur, mais votre "-ldl" à la fin a tout résolu. –

+0

Merci! Cela a fonctionné pour moi! –