|go text: || - index - problems - systems - [ libraries ] - converting - programming - old library - new library - links -
||topics: || - [ libc ..(3264) ] - zlib ..(-32-) - gtk2 ..(-64-) - The C Library

The C library

The Unix98 specs require that largefile must be supported and in consequence the C library should export 64bit-off_t calls as well. However, older software has been compiled with a 32bit-off_t and therefore library makers can not simply change the API-calls as it would result in a callframe-mismatch. That's been the reason for specifying the 64on32 extensions to the C library.

This transitional API will make a sister symbol available for each call that would be affected by a change from 32bit-off_t into the 64bit-off_t - they follow a common naming scheme as that the original posix-name is used and a "64" appended. The glibc-2.2 does export all the relevant sister symbols (actually, since 2.1.3). - There are:

               "creat64", "open64", "ftw64", "nftw64", "fgetpos64",
               "fopen64", "freopen64", "fseeko64", "fsetpos64", 
               "ftello64", "tmpfile64", "mmap64", "fstat64",
               "lstat64", "stat64", "statvfs64", "fstatvfs64",
               "lockf64", "lseek64", "ftruncate64", "truncate64",
               "aio_read64", "aio_write64", "lio_listio64", "aio_erro64",
               "aio_return64", "aio_cancel64", "aio_suspend64";

Any software is free to use these API calls directly. The header files of the C library do export also sister typedefs that are relevant for the transitional API calls - most prominently you will find off64_t type that will always be 64bit even that the standard system defines off_t to be 32bit. The long description should be looked up in Section 4 of the LargeFile Specification:
       http://ftp.sas.com/standards/large.file/specs/api+.007.html#Sec4

While the transitional API is part of -D_LARGEFILE64_SOURCE, the largefile specification defines also a way that the traditional off_t has been made non-constant - here, a software may simply be compiled with -D_FILE_OFFSET_BITS=64 and that will make for a global redefine of this (almost basic) integral type

               typedef off64_t off_t;

and furthermore all the various API-calls are remapped to their 64-bit sister-calls from the transitional 64on32 - while the sourcecode of an application might read "open()" or "lseek()" the binary code will in fact be linked to C library symbols calls "open64()" and "lseek64()". This scheme of 64on32 support is called "largefile sensitive" headers - depending on compile-defines they will change the off_t mode and make a program get linked to different symbols.

              #define fopen    fopen64
              #define lseek    lseek64