Как поместить выходные файлы компиляции C (модули ядра Linux) в папку, отличную от исходных файлов (используя Makefile) - PullRequest
4 голосов
/ 21 мая 2019

Я посмотрел на эти и эти другие решения , но не могу написать правильный Makefile для получения желаемого результата.

Итак, у меня есть simple.c файл.Он имитирует загрузку и удаление модулей ядра Linux.Местоположение: /path/to/dir/simple.c

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

/* This function is called when the module is loaded. */
int simple_init(void)
{
       printk(KERN_INFO "Loading Module\n");

       return 0;
}

/* This function is called when the module is removed. */
void simple_exit(void) {
    printk(KERN_INFO "Removing Module\n");
}

/* Macros for registering module entry and exit points. */
module_init( simple_init );
module_exit( simple_exit );

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Simple Module");
MODULE_AUTHOR("SGG");

У меня также есть этот Makefile в том же каталоге, что и simple.c, расположение: /path/to/dir/Makefile.

obj-m += simple.o
all:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

Когда на терминале Iзапустите:

cd path/to/dir/
make

все скомпилировано правильно (в том же каталоге path/to/dir/.

Что я хочу это:

Расположение simple.c в /path/to/dir/src/.

Расположение Makefile в /path/to/dir/.

Расположение выходов в /path/to/dir/bin/ или / и /path/to/dir/obj/.

Когда makeВыполните, выходные данные должны заканчиваться в каталогах bin, obj.

В Makefile есть некоторые сложности (/lib/modules/$(shell uname -r)/build), которые я не совсем понимаю. Все различные изменения в Makefile для того, чтобы достичь желаемого результата, закончились безуспешно с ошибками.

Как мне это сделать?

Редактировать:

Makefile в /lib/modules/$(shell uname -r)/buildимеет следующий код:

VERSION = 4
PATCHLEVEL = 4
SUBLEVEL = 162
EXTRAVERSION =
NAME = Blurry Fish Butt

# *DOCUMENTATION*
# To see a list of typical targets execute "make help"
# More info can be located in ./README
# Comments in this file are targeted only to the developer, do not
# expect to learn how to build the kernel reading this file.

# o Do not use make's built-in rules and variables
#   (this increases performance and avoids hard-to-debug behaviour);
# o Look for make include files relative to root of kernel src
MAKEFLAGS += -rR --include-dir=$(CURDIR)

# Avoid funny character set dependencies
unexport LC_ALL
LC_COLLATE=C
LC_NUMERIC=C
export LC_COLLATE LC_NUMERIC

# Avoid interference with shell env settings
unexport GREP_OPTIONS

# We are using a recursive build, so we need to do a little thinking
# to get the ordering right.
#
# Most importantly: sub-Makefiles should only ever modify files in
# their own directory. If in some directory we have a dependency on
# a file in another dir (which doesn't happen often, but it's often
# unavoidable when linking the built-in.o targets which finally
# turn into vmlinux), we will call a sub make in that other dir, and
# after that we are sure that everything which is in that other dir
# is now up to date.
#
# The only cases where we need to modify files which have global
# effects are thus separated out and done before the recursive
# descending is started. They are now explicitly listed as the
# prepare rule.

# Beautify output
# ---------------------------------------------------------------------------
#
# Normally, we echo the whole command before executing it. By making
"/lib/modules/4.4.0-141-generic/build/Makefile" [readonly] 1650L, 57062C

1 Ответ

0 голосов
/ 28 мая 2019

Я не знаю, понял ли я вопрос. Прежде всего, я рекомендую вам найти исходный код в папке SRC. После этого выберите каталог, в котором вы хотите создать Makefile.

Следующим шагом является определение набора кодов, которые вам понадобятся для связи вашей программы. Не забудьте путь к папке SRC.

Теперь пришло время создавать объектные файлы. На этом шаге выберите параметр -o [путь_объекта] / [имя_файла] .o.

Последний шаг состоит в том, чтобы связать программу, не забывайте, что объекты находятся в папке [path_obj].

Простой пример может быть:

#path definitions

SRC_path = /path_to_src/
OBJ_path = /path_to_obj/
BIN_path = /path_to_bin/

#lists definitions
SRC = [file1].c [file2].c
OBJ = $(addsuffix .o, $(basename ${SRC}))

#Suffixes definitions
.suffixes:
.suffixes: .c .o

#Create objects
.c.o:   gcc -I[include_files] -c $(SRC_path)$< -o $(OBJ_path)$@

#Link program
TAG:    gcc  $(addprefix $(OBJ_path), $(OBJ)) -o $(BIN_path)[program_name]

Надеюсь, вы найдете это полезным

...