Trying to build kernel module : modprobe Exec format error



  • I'm trying to build a kernel module that I cannot seem to find anywhere for XCP-ng 7.5.0. It is the USB Modem module, I believe, controlled via the kernel option:

    CONFIG_USB_ACM=m
    

    To start, I followed the steps on xcp-ng / xcp-ng-build-env to create a docker container and spun it up:

     $ ./build.sh 7.5
     $ ./run.py -b 7.5 -n --name xcp 
    

    I downloaded all the kernel* dependencies, and ran make menuconfig to find the right kernel module.

    [root@543abc754417 4.4.0+10-x86_64]# rpm -qa | grep kernel
    kernel-devel-4.4.52-4.0.7.1.x86_64
    kernel-tools-libs-devel-3.10.0-327.36.3.el7.x86_64
    kernel-headers-4.4.52-4.0.7.1.x86_64
    kernel-tools-3.10.0-327.36.3.el7.x86_64
    kernel-debug-devel-3.10.0-327.36.3.el7.x86_64
    kernel-tools-libs-3.10.0-327.36.3.el7.x86_64
    kernel-4.4.52-4.0.7.1.x86_64
    

    But when I try to prepare the module, I get an error:

    [root@543abc754417 4.4.0+10-x86_64]# pwd
    /usr/src/kernels/4.4.0+10-x86_64
    [root@543abc754417 4.4.0+10-x86_64]# make modules_prepare
      CHK     include/config/kernel.release
      CHK     include/generated/uapi/linux/version.h
      CHK     include/generated/utsrelease.h
      HOSTCC  scripts/selinux/genheaders/genheaders
    scripts/selinux/genheaders/genheaders.c:13:22: fatal error: classmap.h: No such file or directory
     #include "classmap.h"
                          ^
    compilation terminated.
    make[3]: *** [scripts/selinux/genheaders/genheaders] Error 1
    make[2]: *** [scripts/selinux/genheaders] Error 2
    make[1]: *** [scripts/selinux] Error 2
    make: *** [scripts] Error 2
    [root@543abc754417 4.4.0+10-x86_64]#
    

    So I downloaded the kernel sources from https://updates.xcp-ng.org/7/7.5/base/Source/SPackages/kernel-4.4.52-4.0.7.src.rpm:

    [root@543abc754417 kernel-4.4.52]# rpm -i kernel-4.4.52-4.0.7.src.rpm
    [root@543abc754417 kernel-4.4.52]#  cd ~/rpmbuild/SPECS
    [root@543abc754417 kernel-4.4.52]# rpmbuild -bp --target=$(uname -m) kernel.spec
    [root@543abc754417 kernel-4.4.52]# cd ~/rpmbuild/BUILD//kernel-4.4.52/
    [root@543abc754417 kernel-4.4.52]# make menuconfig
    [root@543abc754417 kernel-4.4.52]# make modules_prepare
    [root@543abc754417 kernel-4.4.52]# make M=drivers/usb modules
    [root@543abc754417 kernel-4.4.52]# find drivers/usb/ -name cd*.ko
    drivers/usb/class/cdc-acm.ko
    drivers/usb/class/cdc-wdm.ko
    

    Success!

    So I copied the cdc-acm.ko from the container to my DOM0 in the modules/extra folder:

    [root@xenserver class]# pwd                               
    /lib/modules/4.4.0+10/extra/class                         
    [root@xenserver class]# ls  -l                            
    total 416                                                 
    -rwxr--r-- 1 root root 421069 May 16 00:29 cdc-acm.ko     
    

    Next run depmod to update module info and dependencies, and try to load the module, and modprobe fails.

    [root@xenserver class]# depmod
    [root@xenserver class]# modprobe cdc-acm
    modprobe: ERROR: could not insert 'cdc_acm': Exec format error
    

    At this point I am seriously stuck. I would have thought/expected that having built the module in the 7.5 container would produce the exact module that I needed for the DOM0.

    What am I doing wrong? Am I missing something? Did I use the incorrect sources?

    Thanks,

    Eric


  • XCP-ng Team

    Ping @r1 and @stormi


  • XCP-ng Team

    @benze what does # modinfo drivers/usb/class/cdc-acm.ko says?

    Are you able to # insmod cdc-acm.ko manually? Share # dmesg | tail after it.

    AFAIK Exec format error is most likely due to loading a module which was not built for the kernel.



  • @r1 modinfo displays a huge number of aliases (abrieviated, but can include the entire list if helpful at all):

    root@xenserver class]# modinfo cdc-acm.ko
    filename:       /lib/modules/4.4.0+10/extra/class/cdc-acm.ko
    alias:          char-major-166-*
    license:        GPL
    description:    USB Abstract Control Model driver for USB modems and ISDN adapters
    author:         Armin Fuerst, Pavel Machek, Johannes Erdfelt, Vojtech Pavlik, David Kubicek, Johan Hovold
    srcversion:     4DA17ECECFACCD02EC1D87C
    alias:          usb:v1519p0452d*dc*dsc*dp*ic*isc*ip*in*
    alias:          usb:v*p*d*dc*dsc*dp*ic02isc02ip06in*
    alias:          usb:v*p*d*dc*dsc*dp*ic02isc02ip05in*
    alias:          usb:v*p*d*dc*dsc*dp*ic02isc02ip04in*
    alias:          usb:v*p*d*dc*dsc*dp*ic02isc02ip03in*
    alias:          usb:v*p*d*dc*dsc*dp*ic02isc02ip02in*
    alias:          usb:v*p*d*dc*dsc*dp*ic02isc02ip01in*
    alias:          usb:v*p*d*dc*dsc*dp*ic02isc02ip00in*
    alias:          usb:v058Bp0041d*dc*dsc*dp*ic*isc*ip*in*
    alias:          usb:v04E8p685Dd*dc*dsc*dp*ic*isc*ip*in*
    alias:          usb:v04D8p000Bd*dc*dsc*dp*ic*isc*ip*in*
    alias:          usb:v03EBp0030d*dc*dsc*dp*ic*isc*ip*in*
    alias:          usb:v04E7p6651d*dc*dsc*dp*ic02isc02ipFFin*
    ...
    ...
    ...
    alias:          usb:v22B8p7000d*dc*dsc*dp*ic*isc*ip*in*
    alias:          usb:v0ACEp1611d*dc*dsc*dp*ic*isc*ip*in*
    alias:          usb:v0ACEp1608d*dc*dsc*dp*ic*isc*ip*in*
    alias:          usb:v0ACEp1602d*dc*dsc*dp*ic*isc*ip*in*
    alias:          usb:v079Bp000Fd*dc*dsc*dp*ic*isc*ip*in*
    alias:          usb:v0482p0203d*dc*dsc*dp*ic*isc*ip*in*
    alias:          usb:v0E8Dp3329d*dc*dsc*dp*ic*isc*ip*in*
    alias:          usb:v0E8Dp0003d*dc*dsc*dp*ic*isc*ip*in*
    alias:          usb:v0870p0001d*dc*dsc*dp*ic*isc*ip*in*
    alias:          usb:v17EFp7000d*dc*dsc*dp*ic*isc*ip*in*
    alias:          usb:v076Dp0006d*dc*dsc*dp*ic*isc*ip*in*
    depends:
    vermagic:       4.4.0+10 SMP mod_unload modversions
    [root@xenserver class]#
    

    insmod fails with similar error messages.

    insmod: ERROR: could not insert module cdc-acm.ko: Invalid module format 
    [root@xenserver class]# dmesg | tail -n 5                                
    [529766.051521] cdc_acm: no symbol version for module_layout             
    [529886.114801] cdc_acm: no symbol version for module_layout             
    [530436.174773] cdc_acm: no symbol version for module_layout             
    [593078.042958] cdc_acm: no symbol version for module_layout             
    [593101.361321] cdc_acm: no symbol version for module_layout             
    

    What I don't understand is why this module built using the docker container for XCP 7.5 would fail, unless the kernel was different.

    [root@xenserver class]# uname -a
    Linux xenserver 4.4.0+10 #1 SMP Thu Aug 9 14:42:20 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
    [root@xenserver class]# md5sum /boot/initrd-4.4.0+10.img
    def1ea3930f11bb46abfec42c3b9d6ec  /boot/initrd-4.4.0+10.img
    [root@xenserver class]# file /boot/vmlinuz-4.4.0+10                                                                                                                               
    /boot/vmlinuz-4.4.0+10: Linux kernel x86 boot executable bzImage, version 4.4.0+10 (mockbuild@6fb104f99393) #1 SMP Thu Aug 9 14:42:20 UTC, RO-rootFS, swap_dev 0x4, Normal VGA    
    [root@xenserver class]# md5sum /boot/vmlinuz-4.4.0+10                                                                                                                             
    d5de46e85a4047faf427932ecc41969f  /boot/vmlinuz-4.4.0+10                                                                                                                          
    

    Any ideas? Is my kernel not actually 4.4.0+10? What I don't understand is why it is v4.4.0+10, but the rpm source package lists it as 4.4.52-4.0.7. Can there be 2 different versions of the same build somehow?

    Thanks,

    Eric


  • XCP-ng Team

    Short answer is that the module is referring to wrong symbol table. Its a lookup table for function interaction between module and kernel.

    Easy answer is to use this .config file and build full kernel.


Log in to reply
 

XCP-ng Pro Support

XCP-ng Pro Support