2014-01-17 4 views
0

Я читаю исходные файлы ядра и получаю несколько вопросов:, какой путь к файлу заголовка используется компилятором при компиляции ядра?

1) какой путь к файлу заголовка использует компилятор при компиляции ядра? В дереве исходного файла я нашел директорию с именем «include». Однако в '/ usr/include /' я также могу найти некоторые файлы заголовков ядра. , который использует компилятор?

2) некоторые файлы включают в себя заголовки, как это: «#include», , но я не мог найти директорию с именем «ASM» как под деревом исходного кода и «/ USR/включать /», однако, оба у них есть каталог под названием «asm_generic». Когда я использую команду «make headers_install», сгенерированные файлы содержат «asm» Выполняет ли процесс компиляции ядра сначала установки заголовков? И заставить компилятор обрабатывать их?

p.s. Я хочу преобразовать исходные файлы ядра в граф вызывающего абонента, чтобы провести некоторое исследование. Поэтому мне нужны инструменты для статического анализа. Я пробовал «call-tree», но результаты полны ошибок, вы могли бы ввести более мощные инструменты?

+0

Добро пожаловать в SO. Пожалуйста, задавайте только один вопрос за раз, иначе вы полностью подрываете цель этого сайта как базу знаний, доступную для поиска. Вы можете легко изменить свой вопрос, чтобы уменьшить его до чистого, единственного вопроса, а затем, в конце концов, спросить других в отдельных потоках. –

+0

Используются копии в исходном дереве. Файлы в/usr/include перегоняют экспортированные версии для программы пользовательского режима, которые связывают ядро ​​с длиной оружия. Каталог asm/является специфичным для платформы, в то время как источники ядра агностические, поэтому процесс сборки получает вещи, указывающие на конкретный каталог, соответствующий построенной конфигурации. Вы можете найти команды 'find' и' grep -r', интересные в вашем исследовании ... –

+0

Ядро Linux является «самодостаточным», оно не зависит от каких-либо библиотек. Это означает, что все файлы заголовков, на которые ссылаются исходный код ядра, также являются частью ядра. –

ответ

1

Запустите make с параметром V=1, и вы увидите точные строки, которые передаются в gcc и другие программы. Это точно скажет вам, что происходит (тем самым отвечая на ваши вопросы). Однако в ответ на (2) no make не устанавливает никаких заголовков, он просто устанавливает путь включения с параметром -I в gcc.

+1

Также полезно [kbuild docs] (https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/kbuild), особенно [makefiles.txt] (https: //git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/kbuild/makefiles.txt). Как правило, существует три группы. Общий Linux, * include/*, architechure, * arch/arm/include * и machine * arch/arm/mach-davinci *. Они включают в себя файл '.config'. Некоторые из них ** API **. [Редкий инструмент] (https://sparse.wiki.kernel.org/index.php/Main_Page) станет хорошим началом, который проверяет ** API **. –

Смежные вопросы