mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-04 09:59:32 +00:00
![Sam Ravnborg](/assets/img/avatar_default.png)
Move the final link of vmlinux to a script to improve readability and maintainability of the code. The Makefile fragments used to link vmlinux has over the years seen far too many changes and the logic had become hard to follow. As the process by nature is serialized there was nothing gained including this in the Makefile. "um" has special link requirments - and the only way to handle this was to hard-code the linking of "um" in the script. This was better than trying to modularize it only for the benefit of "um" anyway. The shell script has been improved after input from: Arnaud Lacombe <lacombar@gmail.com> Nick Bowler <nbowler@elliptictech.com> Signed-off-by: Sam Ravnborg <sam@ravnborg.org> Cc: Arnaud Lacombe <lacombar@gmail.com> Cc: Nick Bowler <nbowler@elliptictech.com> Cc: Richard Weinberger <richard@nod.at> Signed-off-by: Michal Marek <mmarek@suse.cz>
156 lines
4.7 KiB
Makefile
156 lines
4.7 KiB
Makefile
#
|
|
# This file is included by the global makefile so that you can add your own
|
|
# architecture-specific flags and dependencies.
|
|
#
|
|
# Copyright (C) 2002 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
|
|
# Licensed under the GPL
|
|
#
|
|
|
|
ARCH_DIR := arch/um
|
|
OS := $(shell uname -s)
|
|
# We require bash because the vmlinux link and loader script cpp use bash
|
|
# features.
|
|
SHELL := /bin/bash
|
|
|
|
filechk_gen_header = $<
|
|
|
|
core-y += $(ARCH_DIR)/kernel/ \
|
|
$(ARCH_DIR)/drivers/ \
|
|
$(ARCH_DIR)/os-$(OS)/
|
|
|
|
MODE_INCLUDE += -I$(srctree)/$(ARCH_DIR)/include/shared/skas
|
|
|
|
HEADER_ARCH := $(SUBARCH)
|
|
|
|
# Additional ARCH settings for x86
|
|
ifeq ($(SUBARCH),i386)
|
|
HEADER_ARCH := x86
|
|
endif
|
|
ifeq ($(SUBARCH),x86_64)
|
|
HEADER_ARCH := x86
|
|
KBUILD_CFLAGS += -mcmodel=large
|
|
endif
|
|
|
|
HOST_DIR := arch/$(HEADER_ARCH)
|
|
|
|
include $(srctree)/$(ARCH_DIR)/Makefile-skas
|
|
include $(srctree)/$(HOST_DIR)/Makefile.um
|
|
|
|
core-y += $(HOST_DIR)/um/
|
|
|
|
SHARED_HEADERS := $(ARCH_DIR)/include/shared
|
|
ARCH_INCLUDE := -I$(srctree)/$(SHARED_HEADERS)
|
|
ARCH_INCLUDE += -I$(srctree)/$(HOST_DIR)/um/shared
|
|
KBUILD_CPPFLAGS += -I$(srctree)/$(HOST_DIR)/um
|
|
|
|
# -Dvmap=kernel_vmap prevents anything from referencing the libpcap.o symbol so
|
|
# named - it's a common symbol in libpcap, so we get a binary which crashes.
|
|
#
|
|
# Same things for in6addr_loopback and mktime - found in libc. For these two we
|
|
# only get link-time error, luckily.
|
|
#
|
|
# These apply to USER_CFLAGS to.
|
|
|
|
KBUILD_CFLAGS += $(CFLAGS) $(CFLAGS-y) -D__arch_um__ \
|
|
$(ARCH_INCLUDE) $(MODE_INCLUDE) -Dvmap=kernel_vmap \
|
|
-Din6addr_loopback=kernel_in6addr_loopback \
|
|
-Din6addr_any=kernel_in6addr_any -Dstrrchr=kernel_strrchr
|
|
|
|
KBUILD_AFLAGS += $(ARCH_INCLUDE)
|
|
|
|
USER_CFLAGS = $(patsubst $(KERNEL_DEFINES),,$(patsubst -D__KERNEL__,,\
|
|
$(patsubst -I%,,$(KBUILD_CFLAGS)))) $(ARCH_INCLUDE) $(MODE_INCLUDE) \
|
|
$(filter -I%,$(CFLAGS)) -D_FILE_OFFSET_BITS=64 -idirafter include
|
|
|
|
#This will adjust *FLAGS accordingly to the platform.
|
|
include $(srctree)/$(ARCH_DIR)/Makefile-os-$(OS)
|
|
|
|
KBUILD_CPPFLAGS += -I$(srctree)/$(HOST_DIR)/include \
|
|
-I$(HOST_DIR)/include/generated
|
|
|
|
# -Derrno=kernel_errno - This turns all kernel references to errno into
|
|
# kernel_errno to separate them from the libc errno. This allows -fno-common
|
|
# in KBUILD_CFLAGS. Otherwise, it would cause ld to complain about the two different
|
|
# errnos.
|
|
# These apply to kernelspace only.
|
|
#
|
|
# strip leading and trailing whitespace to make the USER_CFLAGS removal of these
|
|
# defines more robust
|
|
|
|
KERNEL_DEFINES = $(strip -Derrno=kernel_errno -Dsigprocmask=kernel_sigprocmask \
|
|
-Dmktime=kernel_mktime $(ARCH_KERNEL_DEFINES))
|
|
KBUILD_CFLAGS += $(KERNEL_DEFINES)
|
|
|
|
PHONY += linux
|
|
|
|
all: linux
|
|
|
|
linux: vmlinux
|
|
@echo ' LINK $@'
|
|
$(Q)ln -f $< $@
|
|
|
|
define archhelp
|
|
echo '* linux - Binary kernel image (./linux) - for backward'
|
|
echo ' compatibility only, this creates a hard link to the'
|
|
echo ' real kernel binary, the "vmlinux" binary you'
|
|
echo ' find in the kernel root.'
|
|
endef
|
|
|
|
KBUILD_KCONFIG := $(HOST_DIR)/um/Kconfig
|
|
|
|
archheaders:
|
|
$(Q)$(MAKE) -C '$(srctree)' KBUILD_SRC= \
|
|
ARCH=$(HEADER_ARCH) O='$(objtree)' archheaders
|
|
|
|
archprepare: include/generated/user_constants.h
|
|
|
|
LINK-$(CONFIG_LD_SCRIPT_STATIC) += -static
|
|
LINK-$(CONFIG_LD_SCRIPT_DYN) += -Wl,-rpath,/lib
|
|
|
|
CFLAGS_NO_HARDENING := $(call cc-option, -fno-PIC,) $(call cc-option, -fno-pic,) \
|
|
$(call cc-option, -fno-stack-protector,) \
|
|
$(call cc-option, -fno-stack-protector-all,)
|
|
|
|
# Options used by linker script
|
|
export LDS_START := $(START)
|
|
export LDS_ELF_ARCH := $(ELF_ARCH)
|
|
export LDS_ELF_FORMAT := $(ELF_FORMAT)
|
|
|
|
# The wrappers will select whether using "malloc" or the kernel allocator.
|
|
LINK_WRAPS = -Wl,--wrap,malloc -Wl,--wrap,free -Wl,--wrap,calloc
|
|
|
|
LD_FLAGS_CMDLINE = $(foreach opt,$(LDFLAGS),-Wl,$(opt))
|
|
|
|
# Used by link-vmlinux.sh which has special support for um link
|
|
export CFLAGS_vmlinux := $(LINK-y) $(LINK_WRAPS) $(LD_FLAGS_CMDLINE)
|
|
|
|
# When cleaning we don't include .config, so we don't include
|
|
# TT or skas makefiles and don't clean skas_ptregs.h.
|
|
CLEAN_FILES += linux x.i gmon.out
|
|
|
|
archclean:
|
|
@find . \( -name '*.bb' -o -name '*.bbg' -o -name '*.da' \
|
|
-o -name '*.gcov' \) -type f -print | xargs rm -f
|
|
|
|
# Generated files
|
|
|
|
$(HOST_DIR)/um/user-offsets.s: __headers FORCE
|
|
$(Q)$(MAKE) $(build)=$(HOST_DIR)/um $@
|
|
|
|
define filechk_gen-asm-offsets
|
|
(set -e; \
|
|
echo "/*"; \
|
|
echo " * DO NOT MODIFY."; \
|
|
echo " *"; \
|
|
echo " * This file was generated by arch/$(ARCH)/Makefile"; \
|
|
echo " *"; \
|
|
echo " */"; \
|
|
echo ""; \
|
|
sed -ne "/^->/{s:^->\([^ ]*\) [\$$#]*\([^ ]*\) \(.*\):#define \1 \2 /* \3 */:; s:->::; p;}"; \
|
|
echo ""; )
|
|
endef
|
|
|
|
include/generated/user_constants.h: $(HOST_DIR)/um/user-offsets.s
|
|
$(call filechk,gen-asm-offsets)
|
|
|
|
export SUBARCH USER_CFLAGS CFLAGS_NO_HARDENING OS DEV_NULL_PATH
|