
저는 임베디드 장치를 위한 busy-box와 iptables를 구축 중이며 이에 대한 종속성 중 하나는 커널 헤더입니다.
전체 파일 시스템에서 *.ko 파일을 검색했지만 아무것도 찾지 못했습니다. 그래서 저는 앱이 로드 가능한 드라이버(커널 모듈)를 생성하지 않는다고 결론을 내렸습니다.
커널 헤더를 요구하는 사용자 공간 애플리케이션의 다른 경우는 무엇입니까?
답변1
해당 프로그램은 커널 헤더에 정의된 내용을 사용하도록 빌드되었기 때문입니다.
busybox-1.22.1]$ egrep -RHn '^#include <linux'
modutils/modutils-24.c:194:#include <linux/elf-em.h>
include/fix_u32.h:17:#include <linux/types.h>
libbb/loop.c:11:#include <linux/version.h>
console-tools/openvt.c:23:#include <linux/vt.h>
console-tools/kbd_mode.c:23:#include <linux/kd.h>
console-tools/showkey.c:19:#include <linux/kd.h>
util-linux/blockdev.c:36:#include <linux/fs.h>
util-linux/mkfs_ext2.c:50:#include <linux/fs.h>
util-linux/mkfs_vfat.c:28:#include <linux/hdreg.h> /* HDIO_GETGEO */
util-linux/mkfs_vfat.c:29:#include <linux/fd.h> /* FDGETPRM */
....
각각의 특정 도구에 대해 도구의 소스와 관련 커널 헤더를 읽어서 정확히 무엇인지 파악해야 합니다.
쉽게 설명하기 위해 몇 가지 사항이 주석 처리되어 있는 것을 볼 수 있습니다.
예를 들어 다음을 얻기 위해 mkfs_vfat
포함됩니다 .linux/fd.h
FDGETPRM
$ egrep -RHn FDGETPRM util-linux/mkfs_vfat.c
util-linux/mkfs_vfat.c:29:#include <linux/fd.h> /* FDGETPRM */
util-linux/mkfs_vfat.c:351: int not_floppy = ioctl(dev, FDGETPRM, ¶m);
관련 항목을 제거 #include
하고 컴파일러 오류를 감시하여 더 쉽게 만들 수 있습니다. 일부 항목이 정의되지 않았다는 경고가 표시됩니다. 이러한 것들은 커널 헤더에서 나올 가능성이 높습니다.