(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> )


Gaël UTARD a écrit :
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:

#define _FILE_OFFSET_BITS 64


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


Mais quel est le lien entre __USE_FILE_OFFSET64 et _FILE_OFFSET_BITS ?
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/>