LINUX.ORG.RU

Кросскомпиляция модуля linux

 , ,


0

2

Опять я пытаюсь скомпилировать модуль ядра под arm.

Установил aarch64-linux-gnu-gcc


cat Makefile 

CC=aarch64-linux-gnu-gcc
ARCH=arm64
PWD = $(shell pwd)
KVERSION = $(uname -r)
K_DIR = /lib/modules/5.13.0-rc5/build

MODULE_NAME = charDevice
obj-m = char.o

all:
        make -C $(K_DIR) M=$(PWD) modules
clean:
        make -C $(K_DIR) M=$(PWD) clean

В итоге

aarch64-linux-gnu-gcc: error: unrecognized argument in option ‘-mcmodel=kernel’
aarch64-linux-gnu-gcc: note: valid arguments to ‘-mcmodel=’ are: large small tiny
aarch64-linux-gnu-gcc: error: unrecognized command-line option ‘-mno-sse’; did you mean ‘-fno-dse’?
aarch64-linux-gnu-gcc: error: unrecognized command-line option ‘-mno-mmx’
aarch64-linux-gnu-gcc: error: unrecognized command-line option ‘-mno-sse2’
aarch64-linux-gnu-gcc: error: unrecognized command-line option ‘-mno-3dnow’
aarch64-linux-gnu-gcc: error: unrecognized command-line option ‘-mno-avx’
aarch64-linux-gnu-gcc: error: unrecognized command-line option ‘-m64’
aarch64-linux-gnu-gcc: error: unrecognized command-line option ‘-mno-80387’
aarch64-linux-gnu-gcc: error: unrecognized command-line option ‘-mno-fp-ret-in-387’
aarch64-linux-gnu-gcc: error: unrecognized command-line option ‘-mpreferred-stack-boundary=3’
aarch64-linux-gnu-gcc: error: unrecognized command-line option ‘-mskip-rax-setup’
aarch64-linux-gnu-gcc: error: unrecognized command-line option ‘-mno-red-zone’
aarch64-linux-gnu-gcc: error: unrecognized command-line option ‘-mindirect-branch=thunk-extern’
aarch64-linux-gnu-gcc: error: unrecognized command-line option ‘-mindirect-branch-register’
aarch64-linux-gnu-gcc: error: unrecognized command-line option ‘-mrecord-mcount’
aarch64-linux-gnu-gcc: error: unrecognized command-line option ‘-mfentry’; did you mean ‘--entry’?

С обычным gcc проблем нет.

Я так понимаю он не поддерживает эти флаги, но я их и не передаю..

Как можно решить?

★★

Если этот код предназначен для функционирования на arm архитектурах, то видимо его сборку надо как-то дополнительно сконфигурировать. Судя по набору флагов(если автор их не от балды добавил), ты собираешь оптимизированную под x86 архитектуру версию.

pon4ik ★★★★★ ()
Ответ на: комментарий от pon4ik

Обычный модуль.

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>

MODULE_LICENSE("GPL");


int hello_init(void)
{

	return 0;
}

static void hello_exit(void)
{


}

module_init(hello_init);
module_exit(hello_exit);
tyamur ★★ ()
Ответ на: комментарий от pon4ik

Почему-то make запускает gcc с такими флагами да еще и include файлы от x86 подключает..

make --trace

set -e;  echo '  CC [M]  /home/timursergeevich/linuxDriver/charDevice/char.o'; aarch64-linux-gnu-gcc -Wp,-MMD,/home/timursergeevich/linuxDriver/charDevice/.char.o.d -nostdinc -isystem /usr/lib/gcc/x86_64-linux-gnu/10/include -I./arch/x86/include -I./arch/x86/include/generated  -I./include -I./arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I./include/uapi -I./include/generated/uapi -include ./include/linux/compiler-version.h -include ./include/linux/kconfig.h -include ./include/linux/compiler_types.h -D__KERNEL__ -fmacro-prefix-map=./= -Wall -Wundef -Werror=strict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -fshort-wchar -fno-PIE -Werror=implicit-function-declaration -Werror=implicit-int -Werror=return-type -Wno-format-security -std=gnu89 -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-avx -fcf-protection=none -m64 -falign-jumps=1 -falign-loops=1 -mno-80387 -mno-fp-ret-in-387 -mpreferred-stack-boundary=3 -mskip-rax-setup -mtune=generic -mno-red-zone -mcmodel=kernel -DCONFIG_X86_X32_ABI -Wno-sign-compare -fno-asynchronous-unwind-tables -mindirect-branch=thunk-extern -mindirect-branch-register -fno-jump-tables -fno-delete-null-pointer-checks -Wno-frame-address -Wno-format-truncation -Wno-format-overflow -Wno-address-of-packed-member -O2 -fno-allow-store-data-races -Wframe-larger-than=1024 -fstack-protector-strong -Wimplicit-fallthrough -Wno-unused-but-set-variable -Wno-unused-const-variable -fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-stack-clash-protection -pg -mrecord-mcount -mfentry -DCC_USING_FENTRY -Wdeclaration-after-statement -Wvla -Wno-pointer-sign -Wno-stringop-truncation -Wno-zero-length-bounds -Wno-array-bounds -Wno-stringop-overflow -Wno-restrict -Wno-maybe-uninitialized -fno-strict-overflow -fno-stack-check -fconserve-stack -Werror=date-time -Werror=incompatible-pointer-types -Werror=designated-init -Wno-packed-not-aligned  -DMODULE  -DKBUILD_BASENAME='"char"' -DKBUILD_MODNAME='"char"' -D__KBUILD_MODNAME=kmod_char -c -o /home/timursergeevich/linuxDriver/charDevice/char.o /home/timursergeevich/linuxDriver/charDevice/char.c; scripts/basic/fixdep /home/timursergeevich/linuxDriver/charDevice/.char.o.d /home/timursergeevich/linuxDriver/charDevice/char.o 'aarch64-linux-gnu-gcc -Wp,-MMD,/home/timursergeevich/linuxDriver/charDevice/.char.o.d -nostdinc 

tyamur ★★ ()
Ответ на: комментарий от pon4ik

Добавил ARCH=arm64. Теперь include поменялись на правильные.

Но осталась ошибка.

aarch64-linux-gnu-gcc: error: unrecognized command-line option ‘-mrecord-mcount’

tyamur ★★ ()
Последнее исправление: tyamur (всего исправлений: 1 )
Ответ на: комментарий от tyamur

Я собирал ядро 1.5 раза в жизни, но кажется, там был какой-то makeconfig и чтобы оно работало «всё само» нужно натыкать правильную архитектуру на этом этапе, иначе архитектура будет host и чуда не будет.

pon4ik ★★★★★ ()
Ответ на: комментарий от tyamur

Погуглил за тебя, это о5 же специфичный для x86 флаг, нужен для возможности аппаратного ускорения профилирования как я понял, видимо для bpf всякого.

pon4ik ★★★★★ ()
Ответ на: комментарий от pon4ik

make make ARCH=arm64 CC=/usr/bin/aarch64-linux-gnu-gcc menuconfig

save

make // ядро компилируется.



Теперь


make ARCH=arm64

make -C /lib/modules/5.13.0-rc5/build M=/home/timursergeevich/linuxDriver/charDevice modules
make[1]: вход в каталог «/home/timursergeevich/linux-5.13-rc5»
  CC [M]  /home/timursergeevich/linuxDriver/charDevice/char.o
  MODPOST /home/timursergeevich/linuxDriver/charDevice/Module.symvers
  CC [M]  /home/timursergeevich/linuxDriver/charDevice/char.mod.o
  LD [M]  /home/timursergeevich/linuxDriver/charDevice/char.ko
ld: не распознан режим эмуляции: aarch64linux
Поддерживаемые эмуляции: elf_x86_64 elf32_x86_64 elf_i386 elf_iamcu elf_l1om elf_k1om i386pep i386pe
make[3]: *** [scripts/Makefile.modfinal:78: /home/timursergeevich/linuxDriver/charDevice/char.ko] Ошибка 1
make[2]: *** [scripts/Makefile.modpost:156: __modpost] Ошибка 2
make[1]: *** [Makefile:1759: modules] Ошибка 2
make[1]: выход из каталога «/home/timursergeevich/linux-5.13-rc5»
make: *** [Makefile:12: all] Ошибка 2

tyamur ★★ ()
Последнее исправление: tyamur (всего исправлений: 1 )
Ответ на: комментарий от pon4ik
/usr/bin/aarch64-linux-gnu-ld: drivers/built-in.a: архивный член drivers/media/pci/ngene/built-in.a не является объектом

file drivers/media/pci/ngene/built-in.a 
drivers/media/pci/ngene/built-in.a: empty

неа

tyamur ★★ ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.