11

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!)

3 Answers3

16

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

Anatoly
  • 20,799
  • 3
  • 28
  • 42
Jester
  • 56,577
  • 4
  • 81
  • 125
0

change the Makefile to:

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
Mahdi Mohammadi
  • 239
  • 2
  • 7
-2

k you have to use gcc to compile it k and link it with the kernel directory...

  • Welcome to SO! Thank you for your time in answering this question. Can you please give more details about your solution? For example, why is your solution better than the accepted answer? Also, the question was asked and answered 7 years ago. Be sure to look at the date of the original question when answering. Please read [How to Answer](https://stackoverflow.com/help/how-to-answer). – above_c_level Jul 31 '20 at 09:06