플래그 D_FILE_OFFSET_BITS와 D_LARGEFILE64_SOURCE 간의 관계

플래그 D_FILE_OFFSET_BITS와 D_LARGEFILE64_SOURCE 간의 관계

저는 Yocto에서 32비트 버전의 Linux를 사용하고 있습니다. 2038년 이후 타임스탬프에 대한 지원을 추가하고 싶었기 때문에 로컬 .conf파일에 다음을 추가했습니다.

TARGET_CPPFLAGS += "-D_FILE_OFFSET_BITS=64"
TARGET_CPPFLAGS += "-D_TIME_BITS=64"

매뉴얼에 따르면 첫 번째 플래그를 사용하여 이미지를 빌드하려면 두 번째 플래그가 필요합니다 glibc. glibc 파일 중 하나( features-time64.h)에는 다음 코드 조각이 있습니다.

#if defined _TIME_BITS
# if _TIME_BITS == 64
#  if ! defined (_FILE_OFFSET_BITS) || _FILE_OFFSET_BITS != 64
#   error "_TIME_BITS=64 is allowed only with _FILE_OFFSET_BITS=64"
#  elif __TIMESIZE == 32
#   define __USE_TIME_BITS64    1
#  endif
# elif _TIME_BITS == 32
#  if __TIMESIZE > 32
#   error "_TIME_BITS=32 is not compatible with __TIMESIZE > 32"
#  endif
# else
#  error Invalid _TIME_BITS value (can only be 32 or 64-bit)
# endif
#endif

이미지에는 기본적으로 플래그가 설정된 zlib프로그램이 있습니다. D_LARGEFILE64_SOURCE=1코드 zlib( gzguts.h)에는 다음과 같은 코드가 있습니다.

#ifdef _LARGEFILE64_SOURCE
#  ifndef _LARGEFILE_SOURCE
#    define _LARGEFILE_SOURCE 1
#  endif
#  ifdef _FILE_OFFSET_BITS
#    undef _FILE_OFFSET_BITS
#  endif
#endif

D_LARGEFILE64_SOURCE=1, 플래그가 정의되지 않게 zlib되고 FILE_OFFSET_BITS파일의 위 코드는 features_time.h오류를 보고합니다.

_TIME_BITS=64는 _FILE_OFFSET_BITS=64인 경우에만 허용됩니다.

따라서 이미지는 zlib빌드를 원하지 않기 때문에 빌드되지 않습니다. 설정 D_LARGEFILE64_SOURCE=1과 플래그를 동시에 설정할 수 없는 이유는 무엇입니까 ? D_FILE_OFFSET_BITS=64이 문제를 어떻게든 해결할 수 있을까요?

답변1

Github에는 아직 미해결 문제가 있습니다.https://github.com/madler/zlib/issues/447

그러나 댓글에서 누군가가 이 해결 방법을 언급했습니다.

https://stackoverflow.com/questions/72801397/glibc-build-with-flags-file-offset-bits-64-and-time-bits-64-fails/72854884#72854884

오늘 장기 지원 지점 "kirkstone"에 이미지를 구축하는 동안 동일한 문제가 발생했습니다.

관련 정보