Знание файлов для компиляции при сборке ядра Linux - PullRequest
2 голосов
/ 22 мая 2009

Я хотел бы знать, можно ли узнать, как только ядро ​​настроено, какие файлы будут скомпилированы и в каком порядке?

Я хочу знать это, потому что меня интересуют варианты строительного процесса в зависимости от архитектуры, и я не хочу иметь столько наборов инструментов, сколько архитектура ...

спасибо

1 Ответ

3 голосов
/ 23 мая 2009

Полный редит:

Вы можете изменить процесс Make в исходном коде ядра для использования

-n, --just-print, --dry-run, --recon

Конечным результатом этого является то, что компилятор или любой исполняемый файл никогда не вызывается. Он просто подделывает его и говорит вам, что он сделает .

Опции и grep файлы из этого без создания источника. Это может быть так же просто, как настройка среды MAKE в оболочке для использования указанных выше параметров. Затем просто извлеките все команды компилятора, включающие файлы .c и .h. Загрузите исходный код ядра для 2.6.29.2, чтобы узнать, как это можно сделать. Изменить, чтобы прийти.

удачи

Отпишись, как ты поживаешь. Возможно выложите шелл-скрипт! :)

Followup

Строка 13 исходного кода ядра 2.6.29.2 включает в себя /2.6.19.2/Makefile

# Do not:
# o  use make's built-in rules and variables
#    (this increases performance and avoids hard-to-debug behaviour);
# o  print "Entering directory ...";
MAKEFLAGS += -rR --no-print-directory

# We are using a recursive build, so we need to do a little thinking
# to get the ordering right.

Редактирование переменной MAKEFLAGS для включения флагов dryrun должно позволить вам сохранить выходные данные конкретной конфигурации make, а затем выполнить grep позже. ала make> save.txt

Я изменил свой на

MAKEFLAGS += -rR --no-print-directory --just-print

Например (может быть намного лучше):

[aiden@host linux-2.6.29.2]$ \
make > build_out.txt; grep -o -E "[a-zA-Z0-9_-]+\.[ch]" build_out.txt 

Не идеально, но сработало для меня хакерским способом и должно помочь вам. Мы надеемся, что тот же базовый процесс будет применен после слепого создания с настроенным ядром.

предупреждение Без поддержки специфичных для архитектуры наборов инструментов или запуска Make на целевой архитектуре некоторые файлы ASM и специфичные для архитектуры отличаются от истинной сборки.

редактировать из комментария

Чтобы подавить ошибку ld, вам нужно найти следующий раздел (или аналогичный) в файле make вашего ядра.

# Make variables (CC, etc...)

AS              = $(CROSS_COMPILE)as
LD              = $(CROSS_COMPILE)ld
CC              = $(CROSS_COMPILE)gcc
CPP             = $(CC) -E
AR              = $(CROSS_COMPILE)ar

Вам нужно выполнить шаги по настройке, чтобы сконфигурировать источник, прежде чем пытаться перечислить исходные файлы, использованные на предыдущих шагах (конвейерная обработка и очистка от пробного запуска), чтобы вы могли внести свои изменения в Makefile.enum и использовать это после того, как вы выполните обычные шаги настройки (независимо от архитектуры, некоторые файлы типа config.h должны быть сгенерированы. Так что приведите исходный код ядра к точке, где вы собираетесь выполнить фактическую компиляцию, модули и все остальное). Уф!

Теперь, когда вы выполняете fake-make для перечисления исходных файлов, после публикации исходной конфигурации ядра (которая задает драйверы / модули, что угодно) LD завершится сбоем, как вы обнаружили. Вы можете изменить LD из

LD              = $(CROSS_COMPILE)ld

до

LD              = -$(CROSS_COMPILE)ld

Обратите внимание на символ «-». Это говорит Makefile игнорировать предупреждения. Очевидно, что вы пытаетесь сделать, это необычно, но довольно круто :) Дальнейшие ошибки можно подавить, найдя раздел Makefile и настроив выполненные команды. Я предлагаю вам очень дружить с Makefiles, так как вам может потребоваться изменить оператор IF позже. После того, как вы все разобрались, у вас будет «тупой» make-файл, который будет выплевывать файлы .c, чтобы вы могли сделать

make | grep -E "[a-zA-Z0-9_-]+\.[ch]"

Или что угодно.

У меня также есть классное предложение для проверки ваших результатов ... фактически собрать ядро ​​... но использовать API inotify Linux (вы можете получить привязки Python здесь http://pyinotify.sourceforge.net/) и наблюдать за событиями файловой системы в компиляции окно (например, файлы .c, читаемые gcc). Затем сравните это со своим списком из «тупого» make-файла.

Хорошо, я надеюсь, что это не слишком большая вафля! удачи

...