I try write simple kernel module (v3.6) in nasm, but insmod say me:
$ sudo insmod ./hello.ko
insmod: ERROR: could not insert module ./hello.ko: Invalid module format
$ echo $?
1
I compile my code with:
$ nasm -f elf64 -o hello.m hello.asm
$ ld -m elf_x86_64 -r -o hello.ko hello.m
and my module code:
section .modinfo
__mod_kernel_version db "kernel_version=3.6.8", 0
__mod_license db "license=GPL", 0
__mod_author db "author=actics", 0
__mod_description db "description=hello world module in nasm", 0
section .data
init_mess db "init_module", 10, 0
cleanup_mess db "cleanup_module", 10, 0
section .text
global init_module
global cleanup_module
extern printk
init_module:
push rbp
mov rbp, rsp
xor rax, rax
mov rdi, init_mess
call printk
xor rax, rax
mov rsp, rbp
pop rbp
ret
cleanup_module:
push rbp
mov rbp, rsp
xor rax, rax
mov rdi, cleanup_mess
call printk
xor rax, rax
mov rsp, rbp
pop rbp
ret
Please help. In internets i found 1 link with equal code for 2.4, but he doesnt work too My system - archlinux with 3.6.8 kernel
UPDATE: in nasm forum i find thread with interesting solution. It's work for me, if my module do return 0 and exit :) But if i try add "extern printk" the insmod say me next:
ERROR: could not insert module hello.ko: Invalid parameters
What i'm doing wrong? my code:
[bits 64]
global init_module
global cleanup_module
;extern printk
section .modinfo
__mod_description8 db 'description=Simple module',0
align 16,db 0
__mod_author7 db 'author=That´s me',0
__mod_license6 db 'license=GPL',0
align 16,db 0
__module_depends db 'depends=',0
align 32,db 0
__mod_vermagic5 db 'vermagic=3.6.8-1-ARCH SMP preempt mod_unload modversions ',0 ;from a .ko module of my system
section __versions
____versions db 0xdf, 0xbc, 0xbf, 0x8c, 0, 0, 0, 0, "module_layout" ;from a .ko module of my system
align 64,db 0
section .data
init_mess db "init_module", 10, 0
cleanup_mess db "cleanup_module", 10, 0
section .text
init_module:
xor rax, rax
ret
cleanup_module:
xor rax, rax
ret
section .gnu.linkonce.this_module
times 24 db 0
__name: db 'Simple', 0
times (0x168 - 24 - 7) db 0
__init_module: dq init_module
times 0x2ac db 0
__cleanup_module: dq cleanup_module
times 1152 db 0
this code work with: nasm -f elf64 hello.asm -o hello.o
but if i uncomment printk this no working!)
What I did was write a small C wrapper using the standard module macros and link it with the main module code that's written in asm. Use the normal kernel build system to build it.
module.c:
#include <linux/module.h>
MODULE_AUTHOR("A. U. Thor");
MODULE_DESCRIPTION("Description");
MODULE_LICENSE("GPL");
extern int asm_init(void);
int main_init(void)
{
return asm_init();
}
module_init(main_init);
main.asm:
[bits 64]
global asm_init
asm_init:
xor rax, rax
ret
Makefile:
obj-m += test.o
test-objs := module.o main.o
$(KBUILD_EXTMOD)/main.o: main.asm
nasm -f elf64 -o $@ $^
obj-m += memory_asm.o
memory_asm-objs := module.o main.o
$(KBUILD_EXTMOD)/main.o: $(src)/main.asm
nasm -f elf64 -o $@ $^ && echo "" > $(src)/.main.o.cmd
Build using command: make -C <path_to_kernel_src> M=$PWD
Jester, thank you, its very good solution. In my case it's work, but with some problems. I'll try to do it good.
All works good. But we can define in module.c only include and MODULE macros. I dont use extern because in asm file i named function like init_module