1

kernel-devel パッケージのヘッダーをいくつか含むライブラリをコンパイルしようとしています。適切なヘッダーをリンクしましたが、これらのヘッダー ファイルでコンパイル エラーが発生します。

/usr/include/asm-generic/bitops/fls64.h: In function ‘int fls64(__u64)’:
/usr/include/asm-generic/bitops/fls64.h:10: error: ‘fls’ was not declared in this scope
/usr/include/asm-generic/bitops/fls64.h:11: error: ‘fls’ was not declared in this scope

そして、ここに asm-generic/bitops/fls64.h のコードがあります

#ifndef _ASM_GENERIC_BITOPS_FLS64_H_
#define _ASM_GENERIC_BITOPS_FLS64_H_

#include <asm/types.h>

static inline int fls64(__u64 x)
{
        __u32 h = x >> 32;
        if (h)
                return fls(h) + 32;
        return fls(x);
}

#endif /* _ASM_GENERIC_BITOPS_FLS64_H_ */

"return fls(h)" でわかるように、fls() の定義はありません。「fls.h」をインクルードすることでこれを解決できますが、標準のカーネル ヘッダーでこのようなエラーを修正する必要がありますか??

なぜこのようになっているのか、そのような問題を回避するために何ができるのかを説明できるポインタはありますか?? ところで、ここで言及したエラーは氷山の一角にすぎません。複数のそのようなヘッダーには、そのような (宣言が欠落している) エラーがたくさんあります。

助けていただければ幸いです。ありがとう!

rgds/R.

PS: システムの詳細:

Linux ディストリビューション: CentOS (5.5)

[raj@localhost common]$ uname -a
Linux localhost.localdomain 2.6.18-238.9.1.el5 #1 SMP Tue Apr 12 18:10:56 EDT 2011 i686 i686 i386 GNU/Linux

[raj@localhost common]$ cat /proc/version 
Linux version 2.6.18-238.9.1.el5 (mockbuild@builder10.centos.org) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-50)) #1 SMP Tue Apr 12 18:10:56 EDT 2011
4

1 に答える 1

2

問題の根本は<asm-generic/fls64.h>、内部カーネル実装の一部であり、ユーザー空間で使用することをまったく意図していないヘッダー ファイルを使用していることです。実際、カーネル内でも、このヘッダー ファイルはヘッダーによってインクルードされることになっているだけで、アーキテクチャ固有のコードで定義されたものに基づいarch/XXX/include/bitops.hた汎用的な実装を提供します。fls64()fls()

言い換えれば、ライブラリには、使用するために実際にはユーザー空間にエクスポートされていないカーネル内部に依存しているため、さまざまなカーネルバージョンで壊れる可能性があるという問題があります。ライブラリは、一部の古いカーネルに対して正常にビルドされている可能性がありますが、これは運が良かっただけです。

正しい修正は、ライブラリが独自の fls64 定義を提供することであり、カーネルヘッダーのランダムなバージョンが偶然に定義するものについて幸運に頼ることに頼るのではありません。

于 2011-05-23T19:35:36.560 に答える