Ошибки в заголовках ядра Linux - PullRequest
1 голос
/ 20 мая 2011

Я пытаюсь скомпилировать библиотеку, которая включает некоторые заголовки из пакета 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 / Р.

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

1 Ответ

2 голосов
/ 23 мая 2011

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

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

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

...