Что делает #define __REDIRECT_NTH в unistd.h? - PullRequest
3 голосов
/ 19 декабря 2010

В 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?

Ответы [ 3 ]

5 голосов
/ 29 ноября 2013

Подробнее о том, что означает REDIRECT_NTH: макрос генерирует объявление функции, которое указывает компилятору использовать определенный символ для функции в выводе ELF компилятора.По умолчанию компилятор использует символ ELF "lseek" для функции C с именем "lseek" (или, в некоторых системах, "_lseek").Этот макрос расширяется до кода, который говорит компилятору использовать символ «lseek64».Таким образом, в коде C есть функция с именем «lseek», но когда вы смотрите в объектном коде (например, с помощью программы «nm»), вы видите «lseek64».

Цель этогочто функция действительно lseek64 на двоичном уровне - она ​​работает с 64-битными смещениями файлов.Но исходный код объявил, что хочет назвать его lseek по причинам обратной совместимости (это то, что говорит _FILE_OFFSET_BITS=64).

Если исходная программа хочет вызвать lseek64 с таким именем,и lseek относится к старой 32-битной версии, оно должно определять _LARGEFILE64_SOURCE, а не _FILE_OFFSET_BITS=64.

Кстати, "NTH" в "REDIRECT_NTH" относится к "нет броска", "который является атрибутом объявления функции, которую генерирует макрос.

2 голосов
/ 19 декабря 2010

Это макрос в пространстве имен, зарезервированный для реализации.Он появляется только на вашей платформе;он делает все, что подходит для вашей платформы, потому что реализация решила, что это правильно.

Если вы не можете легко это выяснить, вам, вероятно, не следует использовать его напрямую.Даже если вы сможете это выяснить, есть большая вероятность, что вы не должны использовать его напрямую.

Тем не менее, похоже, что он организует перевод звонков на lseek() на lseek64(), предположительно наобеспечить поддержку больших файлов (больше 2 ГБ) на 32-разрядных компьютерах (или в рамках 32-разрядного системного API на 64-разрядном компьютере).

0 голосов
/ 19 декабря 2010

Никогда не трогайте хаки большого файла самостоятельно. Всегда включайте -D_FILE_OFFSET_BITS=64 в ваш CFLAGS, и вы никогда не ошибетесь.

...