Ошибки в заголовках ядра Linux

Я пытаюсь скомпилировать библиотеку, которая включает некоторые заголовки из пакета 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 ([email protected]) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-50)) #1 SMP Tue Apr 12 18:10:56 EDT 2011

person Raj    schedule 20.05.2011    source источник
comment
Пожалуйста, опубликуйте больше результатов компилятора. Настоящая ошибка, вероятно, выше цитированного вами отрывка.   -  person Robin Green    schedule 20.05.2011
comment
Робин, я больше не публиковал, потому что считаю это неуместным. Меня беспокоит то, что я думаю, что стандартный заголовочный файл Linux fls64.h использует функцию, для которой нет определения. Это нормально?   -  person Raj    schedule 20.05.2011
comment
Думаю, это тоже зависит от того, как настроить ядро. Код стандартный, но конфигурация может иметь 1000 или более возможностей.   -  person Jiang    schedule 21.05.2011


Ответы (1)


Корень проблемы в том, что вы используете файл заголовка <asm-generic/fls64.h>, который является частью внутренней реализации ядра и вообще не предназначен для использования в пользовательском пространстве. Фактически, даже в ядре этот файл заголовка должен быть включен в заголовки типа arch/XXX/include/bitops.h, чтобы обеспечить общую реализацию fls64() на основе fls(), определенного в коде для конкретной архитектуры.

Другими словами, у библиотеки есть проблема в том, что она зависит от внутренних компонентов ядра, которые на самом деле не экспортируются в пользовательское пространство для использования и, следовательно, могут не работать для различных версий ядра; библиотека вполне могла работать нормально против какого-нибудь старого ядра, но это было просто удачей.

Правильное исправление действительно состоит в том, чтобы библиотека предоставляла собственное определение fls64, а не полагалась на удачу в том, что случайно определяет какая-то случайная версия заголовков ядра.

person Roland    schedule 23.05.2011
comment
Роланд, не могли бы вы рассказать мне, как определить, какой файл действительно включал определенный .h файл из всего вложенного включения ?? На самом деле, моя библиотека напрямую не включает этот файл fls64.h. Я хотел бы узнать, где это включается. Я использую gcc. - person Raj; 24.05.2011
comment
Разве gcc не сообщает вам цепочку включений, когда сообщает об ошибке? Как в файл, включенный из / a / b / c из / a / b / d из / e / f / g ... fls не объявлен - person Roland; 24.05.2011