2011-10-27 9 views
0

J'ai un objet partagé qui fait printf() s via attribut pour init; Assez simple. Cela m'informe juste de certaines variables que j'ai définies.LD_PRELOAD, bash et printf

Quand je fais LD_PRELOAD=mylib.so ./program.sh -flags le program.sh crache des erreurs en raison des printfs:

./program_run: line 16: cd: mylib.so: Startup 
.: File name too long 
./program_run: line 18: test: too many arguments 

Ensuite, le programme commence normalement vers le haut. Il semble que le script bash soit corrompu avec les printf() lors de la vérification des variables.

Y a-t-il une solution de contournement?

+0

Imprime dans 'stderr' au lieu de' stdout'. De nombreuses commandes dans les scripts bash utilisent 'stdout' et vous ne pouvez pas leur ajouter un texte aléatoire. –

Répondre

0

Essayez avec cela change:

export LD_PRELOAD=mylib.so ; ./program.sh -flags 

Est-ce que vous printf() utiliser les arguments variables?

+0

L'un d'eux le fait, je passe un numéro de version via define, c'est à dire: #define VERSION 2.000 puis printf ("Current Version:% f", VERSION) – user1016031

+0

essayez de le commenter et de reconstruire. Cela vous donne-t-il encore une erreur? –

+0

J'ai commenté tout printfs() dans l'objet partagé. Le script bash ne donne plus d'erreurs. essayer de chercher un moyen d'afficher le texte de ce module sans corrompre ce que bash fait. – user1016031

0

Essayez ceci:

LD_PRELOAD=./mylib.so ./program.sh -flags 

Notez que le chemin devant mylib.so

Mon expérience a été qu'il est préférable d'utiliser un chemin complet, par exemple

LD_PRELOAD=/home/source/mylib/mylib.so ./program.sh -flags 

prudent en utilisant exporter comme mentionné ci-dessus.

Il peut causer toutes sortes de problèmes inattendus.