warning: ISO C forbids assignment between function pointer and `void * - C - Programmation
Marsh Posté le 17-07-2011 à 18:46:09
Si tu veux rester en ISO C, il faut caster les appels à dlsym:
http://pubs.opengroup.org/onlinepu [...] dlsym.html
Donc par exemple quelque chose comme
hook._open = (int (*)(const char *, int , mode_t)) dlsym( RTLD_NEXT, "open" );
hook._close = (int (*)(int)) dlsym( RTLD_NEXT, "close" );
A+,
Marsh Posté le 17-07-2011 à 18:58:48
Mais il y a des problèmes d'indirection dans ton code:
hook._open est un pointeur sur une fonction. Il doit donc être appelé comme (*(hook._open))(...)
Et quand tu fais hook._open( pathname, flags, mode ); il n'y a pas de raison que ça marche, puisque ce devrait être (*(hook._open))(pathname, flags, mode );
et idem pour return hook._close( fd ); ce devrait être (*(hook._close))( fd );
Je vois le même problème dans le code posté dans ton autre sujet:
if ( ! hook._gettimeofday )
hook._gettimeofday = (int (*)(struct timeval *, struct timezone *))dlsym( RTLD_NEXT, "gettimeofday" );
if (test == 0) {
test++;
process_run(123);
test--;
}
ret = wrapper._gettimeofday( tv, tz );
Le hook est casté avec une structure d'arguments incorrecte, et si tu utilises la même technique, l'appel au wrapper devrait être ret = (*(wrapper._gettimeofday))( tv, tz );
A+,
Marsh Posté le 17-07-2011 à 20:15:22
Merci à tous pour votre aide.
La réponse finale est ici :
http://www.developpez.net/forums/d [...] -and-void/
Obsidian est un authentique guru, merci à lui de prendre le temps de faire part de son savoir à des développeurs de mon niveau.
Marsh Posté le 17-07-2011 à 17:58:02
Si vous savez comment solutionner ça, je suis preneur :
http://www.siteduzero.com/forum-83 [...] rning.html