Невозможно выполнить кросс-компиляцию для mips

Я попытался перекрестно скомпилировать простой hello.c с помощью кросс-компилятора mips, который выдает мне ошибку.

Ниже ошибка

satya@satya-dev:~/Test/kernel/check$ make ARCH=mips CROSS_COMPILE=mips-buildroot-linux-uclib-
make -C /opt/toolchains/crosstools-mips-gcc-5.3-linux-4.1-uclibc-1.0.12-binutils-2.25-NPTL/usr/bin/ M=/home/satya/Test/kernel/check modules
make[1]: Entering directory '/opt/toolchains/crosstools-mips-gcc-5.3-linux-4.1-uclibc-1.0.12-binutils-2.25-NPTL/usr/bin'
make[1]: *** No rule to make target 'modules'.  Stop.
make[1]: Leaving directory '/opt/toolchains/crosstools-mips-gcc-5.3-linux-4.1-uclibc-1.0.12-binutils-2.25-NPTL/usr/bin'
Makefile:7: recipe for target 'all' failed
make: *** [all] Error 2

Мой Makefile:

obj-m := hello.o
#KDIR := /lib/modules/$(shell uname -r)/build/
KDIR := /opt/toolchains/crosstools-mips-gcc-5.3-linux-4.1-uclibc-1.0.12-binutils-2.25-NPTL/usr/bin/
#PWD = $(shell pwd)

all:
        $(MAKE) -C $(KDIR) M=$(shell pwd) modules
clean:
        $(MAKE) -C $(KDIR) M=$(shell pwd) clean

Я также добавил путь к компилятору в / bin

satya@satya-dev:~/Test/kernel/check$ echo $PATH
/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/sbin:/opt/toolchains/crosstools-mips-gcc-5.3-linux-4.1-uclibc-1.0.12-binutils-2.25-NPTL:/opt/toolchains/crosstools-mips-gcc-5.3-linux-4.1-uclibc-1.0.12-binutils-2.25-NPTL/usr/bin

Даже компилятор отлично работает без файла makefile

satya@satya-dev:~/Test/kernel/check$ /opt/toolchains/crosstools-mips-gcc-5.3-linux-4.1-uclibc-1.0.12-binutils-2.25-NPTL/usr/bin/mips-buildroot-linux-uclibc-gcc in.c -o temp
satya@satya-dev:~/Test/kernel/check$ ll
total 24
-rw-rw-r-- 1 satya satya 1135 Aug 10 05:06 hello.c
-rw-rw-r-- 1 satya satya    0 Aug 10 06:29 Module.symvers
-rw-rw-r-- 1 satya satya   52 Aug 10 07:48 modules.order
-rw-rw-r-- 1 satya satya   66 Aug 10 07:59 in.c
-rw-rw-r-- 1 satya satya  281 Aug 10 08:30 Makefile
-rwxrwxr-x 1 satya satya 5604 Aug 10 09:37 temp

Я знаю, что делаю некоторую неопределенную ошибку, но я не мог ее понять. Может ли кто-нибудь сказать мне, где я ошибаюсь?

KDIR - это путь к части исходных текстов ядра, а не к каталогу bin кросс-компилятора. Вам нужно что-то вроде этого: blukat29.github.io/2017/12/cross-compile-arm-kernel-module
Dark Falcon 10.08.2018 16:00

Цели вашего make-файла не вызывают ваш gcc для компиляции и не упоминают hello.c - они просто запускают make в KDIR.

ewindes 10.08.2018 16:22
0
2
1 252
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

I know I am doing some vague mistake, but I couldn't figure it out. Can anyone tell me where am I going wrong?

Нет, это не «расплывчатая ошибка». В вашем Makefile есть допустимый форма, но его содержимое в значительной степени бессмысленно.

При вызове make из командной строки вы не называете цель, поэтому make выбирает значение по умолчанию (первое) в вашем Makefile, «all». Это, вероятно, то, что вы хотите, насколько это возможно.

Рецепт для цели «все» содержит только одну команду:

       $(MAKE) -C $(KDIR) M=$(shell pwd) modules

Это запускает суб-make в каталоге $(KDIR), что удивительно, потому что не похоже, что значение, установленное для KDIR, является частью проекта, который вы пытаетесь построить.

Суб-make просят создать цель с именем «modules», и сообщение об ошибке указывает, что make не имеет правила, как это сделать. Вероятно, он не видит make-файл (под любым из распознаваемых им имен) в каталоге сборки, но если он его видит, то он не содержит правила для этой цели. Я отмечаю, что Makefile, который вы представляете, также не имеет правила для такой цели, поэтому я понятия не имею, откуда это взялось.

Even compiler works fine without makefile

По крайней мере, это хорошие новости.

Ключ к кросс-компиляции - использовать для этой цели правильный набор инструментов. Вы можете сделать это несколькими способами, но большинство из них начинается с надлежащего определения некоторых стандартных переменных make. Например:

tooldir = /opt/toolchains/crosstools-mips-gcc-5.3-linux-4.1-uclibc-1.0.12-binutils-2.25-NPTL/usr/bin
CC = $(tooldir)/mips-buildroot-linux-uclibc-gcc
LD = $(CC)

Переменная CC дает имя компилятору C, а переменная LD дает имя компоновщику. Есть и другие переменные, которые вы можете захотеть или должны также установить, например CFLAGS для любых флагов компилятора C, которые вы хотите использовать, и LDFLAGS для любых флагов компоновщика.

Есть несколько способов, которыми вы можете пойти оттуда, но самым простым было бы назвать цель по умолчанию «hello» вместо «all»:

hello:

И это, вероятно, все, что вам нужно для создания специальной программы "hello".

Я зашел в каталог «/opt/toolchains/crosstools-mips-gcc-5.3-linux-4.1-uclibc-1.‌ 0.12-binutils-2.25-N‌ PTL / usr / bin». Вот такой кросс-компилятор $ ll | grep mips-buildroot-linux-uclibc-gcc lrwxrwxrwx 1 501 501 17 мая 2017 г. mips-buildroot-linux-uclibc-gcc -> toolchain-wrapper Но у меня нет файла make. Как я могу продолжить

satyaGolladi 10.08.2018 16:47

Нет, @satyaGolladi, все дело в том, что вы не должен переходите в этот каталог. Он содержит инструменты, которые вы должны использовать, но вы не хотите выполнять там сборку. Я уже дал вам полный или почти полный пример того, как написать простой Makefile для построения вашей программы «hello».

John Bollinger 10.08.2018 19:19

Джон, в моем новом make-файле чем я должен заменить строку ниже? привет: $ (KDIR) -C $ (CC) M = $ (shell pwd) module Примечание: я новичок в разработке драйверов, пожалуйста, несите меня

satyaGolladi 13.08.2018 07:31

@satyaGolladi, для создания программы с именем «hello» из единственного исходного файла с именем «hello.c», вы можете заменить эту строку ничем. Рецепт с нулевой линией. Просто назовите цель по умолчанию «привет» и установите переменные, которые я описал в ответе. Я имел в виду, что вы должны буквально "это, вероятно, все, что вам нужно для создания программы" hello "".

John Bollinger 13.08.2018 13:50

Другие вопросы по теме