Для каждого патча, отправленного для драйвера ядра Linux, необходимо убедиться, что файл .o был получен после компиляции измененного файла .c. Драйвер может содержать смесь файлов, предназначенных для различных архитектур машин, таких как blackfin, arm, sparc, mips, x86 и т. д. Может случиться так, что файл .c, написанный для архитектуры arm, может не скомпилироваться на моей машине, основанной на х86 архитектура. Чтобы решить эту проблему и отправить патч для файлов на основе архитектуры arm с моей машины, мне нужно выполнить кросс-компиляцию файлов для arm.

Всякий раз, когда запускается команда make ‹driver-path›, все файлы .c и заголовки компилируются и получаются соответствующие файлы .o. Но, как упоминалось выше, некоторые файлы, написанные для другой архитектуры, могут не компилироваться на компьютере с архитектурой x86 или какой-либо другой. В этом случае файл .o не будет получен.

Когда отдельный файл .o компилируется с помощью команды make ‹path-of.o-file›, файл либо компилируется, либо выдает ошибку компиляции. Ниже приведен один такой случай, с которым я столкнулся несколько недель назад. Я выполнил команду: make drivers/remoteproc/da8xx_remoteproc.o, но получил следующую ошибку, так как файл не предназначен для компиляции на x86.

drivers/remoteproc/da8xx_remoteproc.c:22:72: fatal error: mach/clock.h: No such file or directory
 #include <mach/clock.h>   /* for davinci_clk_reset_assert/deassert() */
                                                                        ^
compilation terminated.
make[1]: *** [drivers/remoteproc/da8xx_remoteproc.o] Error 1
make: *** [drivers/remoteproc/da8xx_remoteproc.o] Error 2

Когда я запустил «make drivers/remoteproc/», драйвер скомпилировался без ошибок, но после компиляции я не получил файл drivers/remoteproc/da8xx_remoteproc.o. Итак, чтобы быть полностью уверенным в изменениях, всегда выполняйте кросс-компиляцию измененных файлов.

Но тогда как это сделать?

Мой наставник Юлия прислала мне скрипт make.cross, который кросс-компилирует файлы .o на любой машине, независимо от ее архитектуры. Сохраните этот скрипт в репозиторий git ядра и выполните следующие действия.

Ниже приведены шаги для кросс-компиляции файла:

  1. Перейдите в make-файл вспомогательного драйвера или в родительский каталог и найдите символ конфигурации для файла .o.
  2. Для приведенного выше случая make-файл в drivers/remoteproc/driver имеет следующую строку для файла drivers/remoteproc/da8xx_remoteproc.o: obj-$(CONFIG_DA8XX_REMOTEPROC) += da8xx_remoteproc.o
  3. Теперь выполните grep для символа конфигурации CONFIG_DA8XX_REMOTEPROC в arch/ и найдите архитектуру, в которой находится этот символ. На этот случай он находится в файле arch/arm/mach-davinci/devices-da8xx.c.
  4. Это показывает, что архитектура является «рукой». Теперь запустите: make.cross ARCH=arm allyesconfig; make.cross ARCH=драйверы/remoteproc/da8xx_remoteproc.o. Это должно скомпилировать файл .o.

Может случиться так, что файл .o все равно не скомпилируется, потому что нужны еще какие-то настройки. В таком случае отправьте патч, но упомяните, что файл .o не может быть получен, и разработчики обязательно предоставят способ перекрестной компиляции драйвера и файла .o.