(Courriels de diversion: <justificative@biner-replet.com> <petrins@allongerez-economisent.com> <reservistes@affinerais-referait.com> <embrayerais@phonologique-appela.com> <brilleront@hispanophone-clopiner.com> <pal@retombez-confirmes.com> <impunie@propageons-geniale.com> <demaquillerait@purgeons-ecuelles.com> <tintouin@toquer-suintant.com> <concerto@devoyee-remontrerait.com> )
Bonsoir,
Le vendredi 17 novembre 2006 23:22, Jean-Michel a écrit :
Je viens de jeter un coup d'oeil sur le source ddrescue de debian testing, et je ne comprends pas bien comme l'outil peut supporter l'accès au partitions de plus de 2Go, avec la ligne suivante( #if 0):
ddrescue-1.10:
/* Large file support on kernel 2.4 glibc 2.1 systems */
/* _FILE_OFFSET_BITS=64 should take care of it */
#if 0 && defined(__GLIBC__) && __GLIBC__ == 2 && __GLIBC_MINOR__ == 1 &&
defined(O_LARGEFILE)
const unsigned int olarge = O_LARGEFILE;
#else
const unsigned int olarge = 0;
#endif
La réponse est dans la question :
/* _FILE_OFFSET_BITS=64 should take care of it */
Plus haut, il y a effectivement :
#define _LARGEFILE_SOURCE #define _FILE_OFFSET_BITS 64
Cela ordonne à la libc de mapper toutes les fonctions relative aux fichiers vers leurs versions 64 bits. Ces deux lignes permettent de porter un code en 64 bits sans avoir à le modifier. En contrepartie, cela casse la compatibilité binaire avec le code compilé sans ces defines.
En effet, il existe des effets de bord:
Dans fcntl.h:
#ifndef __USE_FILE_OFFSET64
extern int open (__const char *__file, int __oflag, ...) __nonnull ((1));
#else
# ifdef __REDIRECT
extern int __REDIRECT (open, (__const char *__file, int __oflag, ...), open64)
__nonnull ((1));
# else
# define open open64
# endif
#endif
#ifdef __USE_LARGEFILE64
extern int open64 (__const char *__file, int __oflag, ...) __nonnull ((1));
#endif
L'autre solution est d'utiliser :
#define _LARGEFILE64_SOURCE
Cela active les fonction 64 bits en plus des fonctions 32 bits habituelles. Il faut donc transformer les off_t en off64_t, open() en open64(), etc.
Et pour vérifier que la programme tourne bien en 64 bits:
objdump /bin/dd_rescue -T | grep open 00000000 DF *UND* 0000023d GLIBC_2.1 fdopen 00000000 DF *UND* 000000be GLIBC_2.1 open64
-------------------------------------------------------------------- Les listes de diffusion occultes: <URL:http://www.CULTe.org/listes/>