выбор правильных заголовочных файлов ядра для сборки busybox

При сборке busybox я обнаружил, что некоторые исходные файлы включают заголовки ядра Linux. Я добавил #define __KERNEL__, чтобы выбрать часть строк файла заголовка. и я также добавил #define _BUSYBOX_ и вставил #ifndef _BUSYBOX_ в заголовочный файл ядра, чтобы какая-то конкретная часть не выбиралась компилятором. (Я не знаю, что это правильный подход)
Следующая проблема, с которой я сталкиваюсь, ниже. В нем говорится, что fd_set определен дважды.

In file included from /opt/snakede/lib/gcc/sparc-snake-linux/4.6.2/../../../../sparc-snake-linux/sys-include/linux/thread_info.h:10:0,
                 from /opt/snakede/lib/gcc/sparc-snake-linux/4.6.2/../../../../sparc-snake-linux/sys-include/linux/preempt.h:9,
                 from /opt/snakede/lib/gcc/sparc-snake-linux/4.6.2/../../../../sparc-snake-linux/sys-include/linux/spinlock.h:50,
                 from /opt/snakede/lib/gcc/sparc-snake-linux/4.6.2/../../../../sparc-snake-linux/sys-include/linux/mmzone.h:7,
                 from /opt/snakede/lib/gcc/sparc-snake-linux/4.6.2/../../../../sparc-snake-linux/sys-include/linux/gfp.h:4,
                 from /opt/snakede/lib/gcc/sparc-snake-linux/4.6.2/../../../../sparc-snake-linux/sys-include/linux/slab.h:12,
                 from archival/libarchive/unxz/xz_private.h:16,
                 from archival/libarchive/unxz/xz_dec_bcj.c:11,
                 from archival/libarchive/decompress_unxz.c:36:
/opt/snakede/lib/gcc/sparc-snake-linux/4.6.2/../../../../sparc-snake-linux/sys-include/linux/types.h:23:26: error: conflicting types for 'fd_set'
/opt/snakede/lib/gcc/sparc-snake-linux/4.6.2/../../../../sparc-snake-linux/include/sys/select.h:75:5: note: previous declaration of 'fd_set' was here

Сообщение показывает, что fd_set был сначала определен в sparc-snake-linux/include/sys/select.h, а затем снова в sparc-snake-linux/sys-include/linux/types.h. Использование
эхо "" | sparc-snake-linux-gcc -o /tmp/tmp.o -v -x c -
Я мог видеть, что путь включения по умолчанию

#include <...> search starts here:
 /opt/snakede/lib/gcc/sparc-snake-linux/4.6.2/include
 /opt/snakede/lib/gcc/sparc-snake-linux/4.6.2/include-fixed
 /opt/snakede/sparc-snake-linux/sys-include
 /opt/snakede/sparc-snake-linux/include

Он сначала ищет /opt/snakede/sparc-snake-linux/sys-include перед /opt/snakede/sparc-snake-linux/include, но файл в /opt/snakede/sparc-snake-linux/include был выбран первым в любом случае . Поэтому вставлено много #ifndef BUSYBOX Guard, чтобы вторые определения были заблокированы при компиляции. Заблокированные строки в основном находятся в каталоге sys-include. Я хочу знать, является ли это допустимым методом (просто блокируя второе определение) или есть другой, более приятный, четко определенный метод для такого рода ситуаций (например, вместо этого я должен был заблокировать первое определение - в основном из файлов заголовков gcc include) - и используйте файлы в каталоге sys-include, которые предназначены для целевой системы) РЕДАКТИРОВАТЬ: с помощью #ifndef BUSYBOX я заблокировал более 20 определений, появляющихся во второй раз, и все еще вижу такие ошибки. Не знаю, правильный ли это подход.


person Chan Kim    schedule 14.08.2014    source источник


Ответы (1)


пару дней спустя я обнаружил, что заголовок ядра Linux определен для сборки Linux, поэтому некоторые определения конфликтуют с определениями пользователя. Поэтому нам нужно использовать «очищенный заголовок», который может использовать пользовательская программа. Для этого я запустил
'make ARCH=.. CROSS_COMPILE=.. headers_install INSTALL_HDR_PATH=..
Эти новые заголовки linux должны заменить каталог sparc-snake-linux/sys-include. Кстати, этот make headers_install хорошо работал до linux 2.6, поэтому заголовки, добавленные позже версии 2.6, должны быть скопированы вручную в новые каталоги заголовков. (в основном linux/xx.h asm-generci/xx.h asm/xx.h. Мне даже пришлось скопировать некоторые отсутствующие определения в новые заголовки из соответствующих частей файлов sys-include. Надеюсь, это поможет!

person Chan Kim    schedule 20.08.2014