Kernel-headers in openWRT - kernel-module

How to bring kernel-headers in openwrt custom based image?
In the image which it is built by us in which how to bring build file.
/lib/modules/kernel-number-generic/build: No such file or directory.
Which file or directory we want to enable to bring the kernel build in final image.

Related

How to generate .ko file in linux kernel sources?

I am learning linux kernel with the help of qemu. I download the source files of linux kernel(linux-4.4.251) from http://kernel.org, build an initrd and use qemu to boot a system on them.
Recently I am trying to work on the NAND Flash Simulator provided by the kernel. It is a kernel module that simulate a virtual Flash device (using RAM by default). I can enable this function with make menuconfig, and then recompile the kernel image. In this way, the module will be included statically as a part of the kernel image.
But now I want to generate the corresponding .ko file so that I can use insmod or insprobe to load this module dynamically, and provide some arguments to it to control its behavior (like using a file in stead of RAM to simulate the Flash device).
However, the make modules command doesn't generate the .ko file for me, even though I have already enabled that module with make menuconfig.
root#Acesrc:~/linux-4.4.251# ls
arch build.virt64le COPYING crypto drivers fs init Kbuild kernel MAINTAINERS mm README samples security tools virt
block certs CREDITS Documentation firmware include ipc Kconfig lib Makefile net REPORTING-BUGS scripts sound usr
root#Acesrc:~/linux-4.4.251# make O=build.virt64le ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j2 modules
make[1]: Entering directory '/root/linux-4.4.251/build.virt64le'
CHK include/config/kernel.release
GEN ./Makefile
CHK include/generated/uapi/linux/version.h
CHK include/generated/utsrelease.h
Using .. as source for kernel
CHK scripts/mod/devicetable-offsets.h
CHK include/generated/timeconst.h
CHK include/generated/bounds.h
CHK include/generated/asm-offsets.h
CALL ../scripts/checksyscalls.sh
Building modules, stage 2.
MODPOST 5 modules
make[1]: Leaving directory '/root/linux-4.4.251/build.virt64le'
root#Acesrc:~/linux-4.4.251# find . -name '*.ko'
./build.virt64le/crypto/hmac.ko
./build.virt64le/crypto/sha256_generic.ko
./build.virt64le/crypto/drbg.ko
./build.virt64le/crypto/echainiv.ko
./build.virt64le/crypto/jitterentropy_rng.ko
How could I generate the .ko file of that modules?
Btw, after I obtained a .ko file, where should I put that file so that qemu will load it into the system?

u-boot.cfg file in U-boot

I am understanding the U-boot build, it seems the selected config options in Kconfig are updated in u-boot.cfg file.
Can you guide to understand how it is created and the usage of this file(who will use this file).
The current U-Boot configuration options are stored in file .config.
You can create a default configuration my using one of the filenames in configs/, e.g.
make qemu_arm64_defconfig
To adjust the configuation use
make menuconfig
https://opensource.com/article/18/10/kbuild-and-kconfig has some more detail about the internals of the Kconfig system.
The u-boot.cfg file is produced when you build U-Boot. It is just there to let you see what config options were selected.
Normally you edit the configs/..._defconfig files to actually change the configuration of U-Boot for a board.

Coverage data without system header files in QNX

I have generated gcno and gcda files required for code coverage.
After importing these files into QNX IDE, it shows code coverage for all system included header files (like <vector>) also whose values are zero%.
Is there any option/flags while build to remove system header files from code coverage data in QNX IDE.

Configuration file in U-boot

Is there any config file in U-boot similar to config files(in arch/arm/configs/ for ARM) in Linux.
My doubht here is, while building U-boot it is taking CPUDIR(in the top Makefile) as "arch/arm/cpu/armv7". I am trying to understand from where it is taking the configuration as "arm" and "armv7".
If you see the U-Boot tree on the directory
/configs
you will have the board default configuration files.
I believe the header files in include/configs are what you're looking for. You'll need to determine which file is used for your board.
From http://www.stlinux.com/u-boot/modifying:
Configuration files
The important configuration information for U-Boot is defined in the file:
include/configs/<board>.h
For example, the Espresso board default configuration file is:
include/configs/espresso.h

Cross compile kernel modules using kernel-headers from rootfs of target ARM board

I have an OLinuXino board. I downloaded the ArchLinux img file (ArchLinuxARM-2013.02-olinuxino-rootfs.img) and wrote it to the SD card using dd and booted the board using the card. I connected the board to the internet using ethernet and installed gcc and make on it using pacman. I was able to build userspace program for the board o n the board.
The ArchLinux SD card image already had the kernel headers directory in the rootfs (/lib/modules/linux-3.7.2-2-ARCH/build). And so I was able to build loadable kernel modules for the board on the board itself too.
I have an Ubuntu 12.04.1 development PC. I have installed Sourcery CodeBench Lite for ARM GNU/Linux (arm-2012.09-64-arm-none-linux-gnueabi.bin) on it. I am able to cross compile userspace programs for OLinuXino on this development PC and transfer it to the board over SFTP and run it on the board (using console over ttyAMA0 Serial port).
Now I want to cross compile kernel modules for the OLinuXino board. I have done this earlier for another custom build imx233 board - in that case I had configured the kernel build system (LTIB) to leave the kernel sources and rootfs intact after building the image. That way I was able to specify the kernel headers build directory for cross compiling the kernel module and it worked.
This time for OLinuXino I don't have the build sources so I copied the rootfs (using cp -dR) to my Ubuntu PC and tried cross compiling a hello world kernel module by specifying the kernel headers directory as /lib/modules/linux-3.7.2-2-ARCH/build and it threw the following error:
anurag#anurag-VirtualBox:~/HelloKS$ make
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- -C /mnt/ArchOL/lib/modules/3.7.2-2- ARCH/build M=/home/anurag/HelloKS modules
make[1]: Entering directory `/mnt/ArchOL/usr/src/linux-3.7.2-2-ARCH'
CC [M] /home/anurag/HelloKS/khello.o
/bin/sh: scripts/basic/fixdep: cannot execute binary file
make[2]: *** [/home/anurag/HelloKS/khello.o] Error 126
make[1]: *** [_module_/home/anurag/HelloKS] Error 2
make[1]: Leaving directory `/mnt/ArchOL/usr/src/linux-3.7.2-2-ARCH'
make: *** [all] Error 2
The fixdep binary in the scripts folder was precompiled for ARM, so I deleted the binary and recompiled it for x86 and placed it there. When I tried cross compiling the kernel module again, a similar error was thrown complaining about another executable in the scripts folder (this time modpost).
My question is how can I replace these arm binaries in the kernel-header / build folder with x86 version? is there a script in the build folder to do this? Can I replace the scripts folder in the copied ArchLinux with the scripts folder from my ubuntu's kernel module build folder? Or do I modify kernel modules's makefile to instruct the build script to rebuild binaries in the scripts folder or use a different scripts folder for this binary (I would specify) the path to ubuntu's scripts folder in its kernel headers folder?
Or am I going about this the wrong way and there a better way to setup cross compilation for the board and setup I have?
PS. FYI: Cross compiler uses libc 2.16 and the ArchLinux img for OLinuXino has libc 2.17 on it
I've successfully compiled a module without kernel sources, only with kernel headers. I used qemu and ARM version library files from gcc-libs and glibc.
Just copy over the host's scripts directory to override the ARM one, except the mod/modpost program. Edit mod/Makefile.modpost to run the modpost program with qemu-arm. If you don't want to actually change those files, you can of cause use aufs / overlayfs / bind mount to achieve the same.
Set QEMU_LD_PREFIX to where your ARM library files are, make sure qemu-arm .../modpost actually work. Then run make as you've tried to do.
If you can read Chinese, you can read my experience here.
If you are compiling for x86 should specify the kernel headers directory as /lib/modules/linux-3.7.2-2-ARCH/build. For cross-compiling either we will be downloading the linux source or use the linux source provided by the SOC manufacturer. Kernel header of the downloaded linux source has to be specified for compilation. Suppose have your downloaded linux source under /opt directory then sample "Makefile" would look like this
obj-m += name-of-driver.o
make -C /opt/linux(specify full version) M=${PWD} modules
Have to install the cross compiler and export i.e. export PATH=$PATH:<absolute-path-of-cross-compiler-binaries>. While compiling using make utility provide make ARCH=arm(Target for which you are compiling) CROSS_COMPILE=arm-none-linux-gnueabi-. Once all these procedure are followed you will be successfully compiling your kernel module for target.

Resources