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是什么意思?
答案 0 :(得分:5)
关于REDIRECT_NTH
含义的更多细节:宏生成一个函数声明,告诉编译器在编译器的ELF输出中使用特定符号作为函数。默认情况下,编译器将ELF符号“lseek
”用于名为“lseek
”的C函数(或者,在某些系统上使用“_lseek
”)。此宏扩展为代码,告诉编译器使用符号“lseek64”。所以C代码有一个名为“lseek
”的函数,但当你查看目标代码(例如程序'nm')时,你会看到“lseek64
”。
这样做的目的是该函数实际上是二进制级别的lseek64 - 它处理64位文件偏移。但源代码已声明它要调用它lseek
,原因是出于向后兼容性原因(这就是_FILE_OFFSET_BITS=64
所说的内容)。
如果源程序想要按该名称调用lseek64
,并且lseek
引用旧的32位版本,则必须定义_LARGEFILE64_SOURCE
而不是_FILE_OFFSET_BITS=64
。
顺便说一下,“REDIRECT_NTH
”中的“NTH”是指“no throw”,它是宏生成的函数声明的属性。
答案 1 :(得分:2)
它是为实现保留的命名空间中的宏。它只出现在您的平台上;它会在您的平台上执行任何适当的操作,因为实现确定它是正确的。
如果您无法轻易找到,您可能不应该直接使用它。即使你能找到答案,也很有可能你不应该直接使用它。
也就是说,它似乎安排将lseek()
的调用转换为lseek64()
,可能是为了在32位计算机上提供对大文件(大于2 GiB)的支持(或者在64位计算机上的32位系统API下。)
答案 2 :(得分:0)
永远不要触摸大文件黑客攻击。始终在-D_FILE_OFFSET_BITS=64
中加入CFLAGS
,您永远不会出错。