5

GNU unistd.h 有这样的魔力:

/* Move FD's file position to OFFSET bytes from the
   beginning of the file (if WHENCE is SEEK_SET),
   the current position (if WHENCE is SEEK_CUR),
   or the end of the file (if WHENCE is SEEK_END).
   Return the new file position.  */
#ifndef __USE_FILE_OFFSET64
extern __off_t lseek (int __fd, __off_t __offset, int __whence) __THROW;                                                                    
#else
# ifdef __REDIRECT_NTH
extern __off64_t __REDIRECT_NTH (lseek,
                              (int __fd, __off64_t __offset, int __whence),
                               lseek64);                                                                                                    
# else
#  define lseek lseek64
# endif
#endif
#ifdef __USE_LARGEFILE64
extern __off64_t lseek64 (int __fd, __off64_t __offset, int __whence) __THROW;                                                              
#endif

__REDIRECT_NTH 是什么意思?

4

3 回答 3

7

有关含义的更多详细信息REDIRECT_NTH:宏生成一个函数声明,告诉编译器在编译器的 ELF 输出中为函数使用特定符号。默认情况下,编译器将 ELF 符号“ lseek”用于名为“ lseek”(或者,在某些系统上为“ _lseek”)的 C 函数。该宏扩展为告诉编译器使用符号“lseek64”的代码。所以 C 代码有一个名为“ lseek”的函数,但是当您查看目标代码(例如,使用程序“nm”)时,您会看到“ lseek64”。

这样做的目的是该函数实际上是二进制级别的 lseek64 - 它处理 64 位文件偏移量。但是出于向后源代码兼容性的原因,源代码已声明它想要调用它lseek(这就是_FILE_OFFSET_BITS=64所说的)。

如果源程序想lseek64用那个名字来调用,并且已经lseek引用了旧的 32 位版本,它必须定义_LARGEFILE64_SOURCE而不是_FILE_OFFSET_BITS=64.

顺便说一下,“”中的“NTH”REDIRECT_NTH指的是“不抛出”,它是宏生成的函数声明的一个属性。

于 2013-11-28T20:45:26.463 回答
2

它是保留给实现的命名空间中的宏。它只出现在您的平台上;它会在您的平台上执行任何适当的操作,因为实施决定它是正确的。

如果你不能轻易找到,你可能不应该直接使用它。即使你能找到,也很有可能你不应该直接使用它。

也就是说,它看起来好像安排将调用lseek()转换为lseek64(),大概是为了在 32 位机器上(或在 64 位机器上的 32 位系统 API 下)提供对大文件(大于 2 GiB)的支持)。

于 2010-12-19T02:25:27.200 回答
0

永远不要自己接触大文件黑客。始终包含-D_FILE_OFFSET_BITS=64在您的内容中CFLAGS,您永远不会出错。

于 2010-12-19T14:31:19.667 回答