summaryrefslogtreecommitdiff
path: root/scripts/Makefile.vmlinux
blob: 7c6ae9886f8f76d6f0a42ec9aa43fbbe1a324167 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# SPDX-License-Identifier: GPL-2.0-only

PHONY := __default
__default: vmlinux

include include/config/auto.conf
include $(srctree)/scripts/Kbuild.include
include $(srctree)/scripts/Makefile.lib

targets :=

%.o: %.c FORCE
	$(call if_changed_rule,cc_o_c)

%.o: %.S FORCE
	$(call if_changed_rule,as_o_S)

# Built-in dtb
# ---------------------------------------------------------------------------

quiet_cmd_wrap_dtbs = WRAP    $@
      cmd_wrap_dtbs = {							\
	echo '\#include <asm-generic/vmlinux.lds.h>';			\
	echo '.section .dtb.init.rodata,"a"';				\
	while read dtb; do						\
		symbase=__dtb_$$(basename -s .dtb "$${dtb}" | tr - _);	\
		echo '.balign STRUCT_ALIGNMENT';			\
		echo ".global $${symbase}_begin";			\
		echo "$${symbase}_begin:";				\
		echo '.incbin "'$$dtb'" ';				\
		echo ".global $${symbase}_end";				\
		echo "$${symbase}_end:";				\
	done < $<;							\
	} > $@

.builtin-dtbs.S: .builtin-dtbs-list FORCE
	$(call if_changed,wrap_dtbs)

quiet_cmd_gen_dtbs_list = GEN     $@
      cmd_gen_dtbs_list = \
	$(if $(CONFIG_BUILTIN_DTB_NAME), echo "arch/$(SRCARCH)/boot/dts/$(CONFIG_BUILTIN_DTB_NAME).dtb",:) > $@

.builtin-dtbs-list: arch/$(SRCARCH)/boot/dts/dtbs-list FORCE
	$(call if_changed,$(if $(CONFIG_BUILTIN_DTB_ALL),copy,gen_dtbs_list))

targets += .builtin-dtbs-list

ifdef CONFIG_GENERIC_BUILTIN_DTB
targets += .builtin-dtbs.S .builtin-dtbs.o
vmlinux.unstripped: .builtin-dtbs.o
endif

# vmlinux.unstripped
# ---------------------------------------------------------------------------

ifdef CONFIG_ARCH_WANTS_PRE_LINK_VMLINUX
vmlinux.unstripped: arch/$(SRCARCH)/tools/vmlinux.arch.o

arch/$(SRCARCH)/tools/vmlinux.arch.o: vmlinux.o FORCE
	$(Q)$(MAKE) $(build)=arch/$(SRCARCH)/tools $@
endif

ARCH_POSTLINK := $(wildcard $(srctree)/arch/$(SRCARCH)/Makefile.postlink)

# Final link of vmlinux with optional arch pass after final link
cmd_link_vmlinux =							\
	$< "$(LD)" "$(KBUILD_LDFLAGS)" "$(LDFLAGS_vmlinux)" "$@";	\
	$(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true)

targets += vmlinux.unstripped .vmlinux.export.o
vmlinux.unstripped: scripts/link-vmlinux.sh vmlinux.o .vmlinux.export.o $(KBUILD_LDS) FORCE
	+$(call if_changed_dep,link_vmlinux)
ifdef CONFIG_DEBUG_INFO_BTF
vmlinux.unstripped: $(RESOLVE_BTFIDS)
endif

ifdef CONFIG_BUILDTIME_TABLE_SORT
vmlinux.unstripped: scripts/sorttable
endif

# vmlinux
# ---------------------------------------------------------------------------

remove-section-y                                   := .modinfo
remove-section-$(CONFIG_ARCH_VMLINUX_NEEDS_RELOCS) += '.rel*'

remove-symbols := -w --strip-symbol='__mod_device_table__*'

# To avoid warnings: "empty loadable segment detected at ..." from GNU objcopy,
# it is necessary to remove the PT_LOAD flag from the segment.
quiet_cmd_strip_relocs = OBJCOPY $@
      cmd_strip_relocs = $(OBJCOPY) $(patsubst %,--set-section-flags %=noload,$(remove-section-y)) $< $@; \
                         $(OBJCOPY) $(addprefix --remove-section=,$(remove-section-y)) $(remove-symbols) $@

targets += vmlinux
vmlinux: vmlinux.unstripped FORCE
	$(call if_changed,strip_relocs)

# modules.builtin.modinfo
# ---------------------------------------------------------------------------

OBJCOPYFLAGS_modules.builtin.modinfo := -j .modinfo -O binary

targets += modules.builtin.modinfo
modules.builtin.modinfo: vmlinux.unstripped FORCE
	$(call if_changed,objcopy)

# modules.builtin
# ---------------------------------------------------------------------------

__default: modules.builtin

# The second line aids cases where multiple modules share the same object.

quiet_cmd_modules_builtin = GEN     $@
      cmd_modules_builtin = \
	tr '\0' '\n' < $< | \
	sed -n 's/^[[:alnum:]:_]*\.file=//p' | \
	tr ' ' '\n' | uniq | sed -e 's:^:kernel/:' -e 's/$$/.ko/' > $@

targets += modules.builtin
modules.builtin: modules.builtin.modinfo FORCE
	$(call if_changed,modules_builtin)

# modules.builtin.ranges
# ---------------------------------------------------------------------------
ifdef CONFIG_BUILTIN_MODULE_RANGES
__default: modules.builtin.ranges

quiet_cmd_modules_builtin_ranges = GEN     $@
      cmd_modules_builtin_ranges = gawk -f $(real-prereqs) > $@

targets += modules.builtin.ranges
modules.builtin.ranges: $(srctree)/scripts/generate_builtin_ranges.awk \
			modules.builtin vmlinux.map vmlinux.o.map FORCE
	$(call if_changed,modules_builtin_ranges)

vmlinux.map: vmlinux.unstripped
	@:

endif

# Add FORCE to the prerequisites of a target to force it to be always rebuilt.
# ---------------------------------------------------------------------------

PHONY += FORCE
FORCE:

# Read all saved command lines and dependencies for the $(targets) we
# may be building above, using $(if_changed{,_dep}). As an
# optimization, we don't need to read them if the target does not
# exist, we will rebuild anyway in that case.

existing-targets := $(wildcard $(sort $(targets)))

-include $(foreach f,$(existing-targets),$(dir $(f)).$(notdir $(f)).cmd)

.PHONY: $(PHONY)