0

1つの関数(seek)のパラメーターとしてoff_tを使用するライブラリ。ライブラリとアプリケーションのコンパイル方法は異なります。1つはラージファイルサポートがオフになっており、もう1つはラージファイルサポートがあります。どちらもoff_tの解釈が異なるため、この状況では奇妙なランタイムエラーが発生します。ライブラリは、実行時にアプリのoff_tのサイズをどのように確認できますか?または、少なくともユーザーが意味のあるエラーを受け取るように、別の解決策はありますか?

編集:ライブラリ(cでプログラムされ、autoconfを使用)はすでに存在し、一部のサードパーティアプリケーションがそれを使用しています。ライブラリは、ラージファイルサポートを使用してコンパイルできます(デフォルトではAC_SYS_LARGEFILEを介して)。Linuxだけでなく、マルチプラットフォームです。LFSの変更により、インストールされているアプリケーションが破損することをどのように検出/防止できますか?

4

3 に答える 3

2

ライブラリにAPIを追加してsizeof(off_t)を返し、クライアントからチェックすることができます。または、ライブラリが正常にリンクするために、すべてのアプリにAPIを提供するように要求することもできます。

library.c:

size_t lib_get_off_t_size (void)
{
    return (sizeof(off_t));
}

client.c(init_function):

if (lib_get_off_t_size() != sizeof(off_t) {
    printf("Oh no!\n");
    exit();
}

ライブラリにinit関数がある場合は、そこにチェックを入れることができますが、クライアントは、off_tのサイズを取得するためにAPIを提供する必要があります。これは、通常、ライブラリの動作方法ではありません。

于 2008-10-29T20:33:10.553 に答える
1

Linux では、大きなファイルのサポートをオンにしてライブラリをコンパイルすると、off_tは と同じに定義されますoff64_t。したがって、ライブラリが大きなファイルをサポートするようにコンパイルされたものである場合は、そのインターフェイスを変更して、off64_t代わりに常に使用するようにしoff_t(必要になる場合があります_LARGEFILE64_SOURCE)、問題を完全に回避できます。

また、アプリケーションが大きなファイルをサポートしてコンパイルされているかどうかを確認し (_FILE_OFFSET_BITSが定義されていないかを参照) 、間違った方法でコンパイルされている場合は32( を使用して) コンパイルを拒否することもできます。および機能テスト マクロ#errorを参照してください。/usr/include/features.h

于 2008-10-29T21:42:47.557 に答える
0

前に述べたように、ライブラリはアプリケーション(ライブラリのクライアント)がどのようにコンパイルされているかを知ることができませんが、逆の方法で機能する必要があります。その上、静的リンクは確かに同じビルド時に異なるスイッチを持たないので、動的リンクについて話していると思います。

「AndrewJohnson」によるすでに与えられた答えと同様に、ライブラリは、ラージファイルサポートを使用してコンパイルされたかどうかを確認するための方法を提供できます。このようなビルド時の切り替えは主にCの定義で行われることを知っているので、これは次のようになります。

//in library:
BOOL isLargeFileSupport (void)
{
#ifdef LARGE_FILE_SUPPORT
    return TRUE;
#else
    return FALSE;
#endif
}

アプリケーションは、そのlibによって報告されたファイルサイズを処理する方法を知っているか、互換性がない場合に動作を拒否できます。

//in application
BOOL bLibLFS = lib_isLargeFileSupport();
BOOL bAppLFS = FALSE;
#ifdef LARGE_FILE_SUPPORT
    bAppLFS = TRUE;
#endif

if (bLibLFS != bAppLFS)
    //incompatible versions, bail out
    exit(0);
于 2008-10-29T21:07:56.083 に答える