フラグ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"

マニュアルによると、最初のフラグを使用して画像を構築するには2番目のフラグが必要ですglibc。 glibcファイルの1つ(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コードzlibgzguts.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」にイメージを構築する際に同じ問題が発生しました。

関連情報