Problème après mise à jour Fedora

Fermé
Sya - 14 déc. 2011 à 10:07
 Sya - 22 déc. 2011 à 14:03
Bonjour,

J'ai un grand problème dont ma vie en depend!!!!!
Après avoir installé la mise à jour de fedora, un programme C crucial ne fonctionne plus!!!
Ce programme effectue la connection entre un PC et un telemètre laser LMS200 et sauvegarde les données lues par lms.
Il fonctionnait à merveille avant mais maintenant il ne peut même pas passer l'étape d'initialisation.
J'aimerai revenir avant les 750 paquets mis à jour comment faire????

PS: Le pc que j'utilise n'est pas le mien donc je ne peux pas faire tout ce qui me plait avec et il contient beaucoup de données ne me concernant pas => je ne peux pas réinstaller le système.....
Que faire??? Je suis à court d'idées et de temps!!!!!
Je vais être mise à la porte!!!!!!!!
Help me, pleaaaaase!!!


A voir également:

11 réponses

Bonjour,

Lance la commande suivante :
ldd /chemin/complet/vers/ton/programme


Note le résultat : c'est la liste des lib utilisées par ton programme.

La commande suivante te donnera tous les paquets mis à jour :
rpm -qa --last

Vérifie s'il n'y a pas dedans une bibliothèque utilisée par ton programme C.

Si c'est le cas, à mon avis tu as juste à recompiler ton C.
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
Modifié par mamiemando le 14/12/2011 à 10:46
J'ai un grand problème dont ma vie en depend!!!!!

Oula rien que ça :-/

Après avoir installé la mise à jour de fedora, un programme C crucial ne fonctionne plus!!!
Ce programme effectue la connection entre un PC et un telemètre laser LMS200 et sauvegarde les données lues par lms.


Pré-requis : une bonne partie de ce qui suit requiert des droits root. Pour passer root dans un terminal, lance la commande :

su -


1) Est-ce que tu as encore les sources de ce programme (fichiers .c, makefile etc...) ? Il est très probable que ce fichier soit lié à des librairies qui n'existe plus.

1)a) Si oui recompile-le et si des messages d'erreur apparaissent reporte-les nous.
1)b) Sinon, supposons que le chemin de l'exécutable soit /a/b/c/programme, que donne la commande :

ldd /a/b/c/programme


En temps normal, toutes les librairies doivent être trouvées.

Exemple :

(mando@aldur) (~) $ ldd /bin/ls  
        linux-vdso.so.1 =>  (0x00007fff85d6d000)  
        libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007ff8fc4c5000)  
        librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007ff8fc2bd000)  
        libacl.so.1 => /lib/x86_64-linux-gnu/libacl.so.1 (0x00007ff8fc0b4000)  
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff8fbd30000)  
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ff8fbb2c000)  
        /lib64/ld-linux-x86-64.so.2 (0x00007ff8fc6fd000)  
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007ff8fb90f000)  
        libattr.so.1 => /lib/x86_64-linux-gnu/libattr.so.1 (0x00007ff8fb70b000)


S'il en manque (not found), c'est que tu dois installer les paquets qui les installent. Sous fedora, yum permet de retrouver (avec l'option whatprovides) quel paquet fournit tel ou tel fichier. Une fois trouvé, il suffit de faire un "yum install ..." de cette librairie.
http://yum.baseurl.org/wiki/YumCommands

C'est l'approche que tu dois privilégier (par rapport à l'approche (2) qui n'est pas sûre de marcher)

2) Il se peut aussi que ton programme soit lié à une librairie qui est toujours installée, mais dont le numéro de version est différent. Normalement, linux utilise un mécanisme de lien symbolique pour éviter ce problème.

Exemple : j'ai pris une librairie au pif, peu importe laquelle tu considère c'est toujours le même principe

(mando@aldur) (~) $ ls -l --color /usr/lib/libraptor*  
lrwxrwxrwx 1 root root     19 nov.  28 04:07 /usr/lib/libraptor2.so.0 -> libraptor2.so.0.0.0  
-rw-r--r-- 1 root root 427504 nov.  28 04:07 /usr/lib/libraptor2.so.0.0.0  
lrwxrwxrwx 1 root root     18 août  26 17:41 /usr/lib/libraptor.so.1 -> libraptor.so.1.2.0  
-rw-r--r-- 1 root root 426840 août  26 17:41 /usr/lib/libraptor.so.1.2.0 


Ici tu vois qu'un programme lié à libraptor2.so.0 utilisera en réalité libraptor2.so.0.0.0. Les liens symboliques sont normalement créés automatiquement par ton gestionnaire de paquets (plus précisément par la commande ldconfig), qui fait appel à la commande ln.

Exemple : Ici on construit /usr/lib/libraptor2.so.0 qui pointe sur /usr/lib/libraptor2.so.0.0.0

ln -s /usr/lib/libraptor2.so.0.0.0 /usr/lib/libraptor2.so.0


En admettant que le numéro de version soit la cause du problème, tu peux toujours essayer de créer ce lien symbolique à la main, mais ce n'est pas garanti que ça marche (il est très probable que le programme se lance, mais ne trouve pas les "éléments" dont il a besoin dans le .so vers lequel tu l'auras réaiguillé).

Utilise la commande ls pour vérifier que le lien est bien construit (cf exemple ci-dessus), il doit être en bleu (sinon c'est que tu t'es trompée en le construisant).

ls -l --color  /usr/lib/libraptor2.so.0


Enfin ça ne coûte rien d'essayer, tu pourras toujours supprimer le lien symbolique avec la commande rm si ça ne marche pas.

rm  /usr/lib/libraptor2.so.0


3) Quand le programme "plante", quel message est écrit dans la console ?

Il fonctionnait à merveille avant mais maintenant il ne peut même pas passer l'étape d'initialisation.
J'aimerai revenir avant les 750 paquets mis à jour comment faire????


À mon avis c'est très difficilement réalisable.

PS: Le pc que j'utilise n'est pas le mien donc je ne peux pas faire tout ce qui me plait avec et il contient beaucoup de données ne me concernant pas => je ne peux pas réinstaller le système.....

Si tu as fait une mise à jour, c'est que tu as des droits root et donc que tu peux tout faire. Partant de là, pas de soucis.

Bon courage !
0
Bon, en executant la commande ldd ~/Bureau/testlms j'ai les resultats:
linux-gate.so.1 =>  (0x004d7000)
	libm.so.6 => /lib/libm.so.6 (0x002d8000)
	libc.so.6 => /lib/libc.so.6 (0x00b5a000)
	/lib/ld-linux.so.2 (0x00216000)


je ne peux pas utiliser la commande rpm -qa --list puisque j'ai fait la mise à jour de 750 paquets et que je ne sais pas dans lequel ou lesquels les librairies citées se trouvent!

J'ai le source du programme c et la recompilation se fait sans erreurs.

Quand le programme plante il n'affiche aucune erreur (il ne me donne pas la main jusqu'à ce que je fait ctrl-c)
en voici un exemple:
gdb testlms 
GNU gdb (GDB) Fedora (7.0.1-48.fc12)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /root/Bureau/testlms...done.
(gdb) run -n 1 -r 180 -s 1.0 -p /dev/ttyUSB0 
Starting program: /root/Bureau/testlms -n 1 -r 180 -s 1.0 -p /dev/ttyUSB0
donnez nom du fichier pour evitement: obsNumero  12
ok 1:

init lms





^C
Program received signal SIGINT, Interrupt.
0x00cdd424 in __kernel_vsyscall ()
Missing separate debuginfos, use: debuginfo-install glibc-2.11.2-1.i686
(gdb) where
#0  0x00cdd424 in __kernel_vsyscall ()
#1  0x002b9b83 in __open_nocancel () from /lib/libc.so.6
#2  0x08048dde in initLMS (serialdev=0xbffff459 "/dev/ttyUSB0", oldtio=0x804bd00) at lmsTest.c:235
#3  0x080499f9 in main (argc=9, argv=0xbffff264) at lmsTest.c:504
(gdb) up
#1  0x002b9b83 in __open_nocancel () from /lib/libc.so.6
(gdb) up
#2  0x08048dde in initLMS (serialdev=0xbffff459 "/dev/ttyUSB0", oldtio=0x804bd00) at lmsTest.c:235
warning: Source file is more recent than executable.
235	  fd = open(serialdev, O_RDWR | O_NOCTTY );
(gdb) 




J'ai peut être les droits root mais je ne peux pas m'en servir quand je veux o'u je veux!
0
jeanbi Messages postés 15118 Date d'inscription samedi 9 décembre 2006 Statut Contributeur Dernière intervention 6 février 2023 2 177
14 déc. 2011 à 15:42
bonjour,
il suffit de recompiler le programme avec le kernel , le kernel a du être mis à jour !
make
make install pour reinstaller le .ko dans le bon kernel
perso ma cle usb tv tnt c'est comme cela que je suis oblige de faire à chaque changement de kernel.
pour etre sur , il suffit de lancer le programme dans la console

a+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
14 déc. 2011 à 19:33
Pour les librairies tout à l'air ok. Pour la compilation, si les sources sont accompagnées d'un "configure", as-tu pensé à le lancer au préalable ?

./configure
make


Il y a quoi dans le fichier lmsTest.c aux alentours de la ligne 235 ? Si les sources sont disponibles publiquement, peux-tu les mettre à disposition quelque part pour qu'on tente de les compiler ?

Est-ce que le fichier /dev/ttyUSB0 existe ?

ls -l /dev/ttyUSB0


Bonne chance
0
Le programme est compilé avec un simple gcc -o testlms -g -lm lmsTest.c
et dans /dev/ttyUSB0 il y a une carte PCI Express reconnue.

aux alentours de la ligne 235 il y a la fonction initLMS qui initialise le capteur sick lms 200 dont fd= open (serialdev, O_RDWR | O_NOCTTY) est la première instruction.

Vous pouvez trouver le source ici:
http://people.mech.kuleuven.be/~orocos/pub/stable/documentation/ocl/v1.10.x/api/html/SickLMS200_8cpp_source.html
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
15 déc. 2011 à 01:01
Le truc c'est que le doxygen ne m'aide pas vraiment, il me faudrait une archive avec les sources et le makefile, chose qui ne semble pas mise à disposition sur le lien que tu donnes.
0
Bonjour,
Il n'y a pas de makefile, je compile directement dans un terminal avec gcc.
Et le lien que j'ai mis contient les mêmes procedures utilisées dans mon programme.
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
16 déc. 2011 à 19:52
Est-ce que dans ce cas tu peux me transmettre une archive avec les sources que tu compiles (un truc que je peux tester de a à z) et la commande gcc qui tu utilises ?
0
Bonjour,

Est-ce que le problème peut être causé par le port série (la carte rs232 a besoin d'être reconfigurée aprés une mise à jour .....????)
En tout cas le port est détécté normalement:

ll /dev/ttyUSB0
crw-rw----. 2 root dialout 188, 0 déc.  22 12:01 /dev/ttyUSB0


J'ai pas essayé cette commande avant de faire la mise à jour donc est ce qu'il affichait ça avant? Je n'en ai aucune idée!
Je ne sais pas si j'ai raison! Ce n'ai qu'une supposition!!!
Que ce que vous en dites??
0
J'ai trouvé la solution!!!!
C'était bien ce que je pensais, il falait executer deux commandes :

modprobe -r pl2303
modprobe pl2303


pour que le port serie soit reconnu ou adapté à a nouvelle version du système!

Merci pour votre aide!!!!!
0