blob: 7ba6e7a6cce76eaf85836d307569a23a59445b20 [file] [log] [blame]
GEN_KOBJ_LIST := $(srctree)/scripts/gen_kobject_list.py
PROCESS_GPERF := $(srctree)/scripts/process_gperf.py
OBJ_LIST := kobject_hash.gperf
OUTPUT_SRC_PRE := kobject_hash_preprocessed.c
OUTPUT_SRC := kobject_hash.c
OUTPUT_OBJ := kobject_hash.o
OUTPUT_OBJ_RENAMED := kobject_hash_renamed.o
SCRIPT_EXTRA_ARGS :=
ifeq ($(KBUILD_VERBOSE),1)
SCRIPT_EXTRA_ARGS += --verbose
endif
# Scan the kernel binary's DWARF information to produce a table of
# kernel objects which we will pass to gperf
quiet_cmd_gen_kobj_list = KOBJ $@
cmd_gen_kobj_list = $(GEN_KOBJ_LIST) --kernel $< --output $@ \
$(SCRIPT_EXTRA_ARGS)
$(OBJ_LIST): $(PREBUILT_KERNEL) $(GEN_KOBJ_LIST)
$(call cmd,gen_kobj_list)
# Generate C code which implements a perfect hashtable based on our
# table of kernel objects
quiet_cmd_gperf = GPERF $@
cmd_gperf = gperf --output-file=$@ $<
$(OUTPUT_SRC_PRE): $(OBJ_LIST)
$(call cmd,gperf)
# For our purposes, the code/data generated by gperf is not optimal.
# This script adjusts the generated .c file to greatly reduce the amount
# of code/data generated since we know we are always working with
# pointer values
quiet_cmd_process_gperf = PROCESS $@
cmd_process_gperf = $(PROCESS_GPERF) -i $< -o $@ $(SCRIPT_EXTRA_ARGS)
$(OUTPUT_SRC): $(OUTPUT_SRC_PRE) $(PROCESS_GPERF)
$(call cmd,process_gperf)
# We need precise control of where generated text/data ends up in the final
# kernel image. Disable function/data sections and use objcopy to move
# generated data into special section names
$(OUTPUT_OBJ): KBUILD_CFLAGS += -fno-function-sections -fno-data-sections
quiet_cmd_kobject_objcopy = OBJCOPY $@
cmd_kobject_objcopy = $(OBJCOPY) \
--rename-section .data=.kobject_data.data \
--rename-section .rodata=.kobject_data.rodata \
--rename-section .text=.kobject_data.text \
$< $@
$(OUTPUT_OBJ_RENAMED): $(OUTPUT_OBJ)
$(call cmd,kobject_objcopy)
GENERATED_KERNEL_OBJECT_FILES += $(OUTPUT_OBJ_RENAMED)