dc653882d4
Previously the linker emulation was only passed when building binary objects for firmware modules. This change always passes the desired output format for kernel modules and kernels rather than requiring the toolchain's default output format to match the desired output format. This in turn permits use of external toolchains whose default output format does not match the desired output format. Reviewed by: imp, emaste Sponsored by: DARPA / AFRL Differential Revision: https://reviews.freebsd.org/D10085
171 lines
5.1 KiB
Makefile
171 lines
5.1 KiB
Makefile
# Makefile.arm -- with config changes.
|
|
# Copyright 1990 W. Jolitz
|
|
# from: @(#)Makefile.i386 7.1 5/10/91
|
|
# $FreeBSD$
|
|
#
|
|
# Makefile for FreeBSD
|
|
#
|
|
# This makefile is constructed from a machine description:
|
|
# config machineid
|
|
# Most changes should be made in the machine description
|
|
# /sys/arm/conf/``machineid''
|
|
# after which you should do
|
|
# config machineid
|
|
# Generic makefile changes should be made in
|
|
# /sys/conf/Makefile.arm
|
|
# after which config should be rerun for all machines.
|
|
#
|
|
|
|
# Which version of config(8) is required.
|
|
%VERSREQ= 600013
|
|
|
|
STD8X16FONT?= iso
|
|
|
|
.if !defined(S)
|
|
.if exists(./@/.)
|
|
S= ./@
|
|
.else
|
|
S= ../../..
|
|
.endif
|
|
.endif
|
|
.include "$S/conf/kern.pre.mk"
|
|
|
|
INCLUDES+= -I$S/contrib/libfdt -I$S/gnu/dts/include
|
|
|
|
SYSTEM_LD:= ${SYSTEM_LD:$S/conf/ldscript.$M=ldscript.$M}
|
|
SYSTEM_DEP:= ${SYSTEM_DEP:$S/conf/ldscript.$M=ldscript.$M}
|
|
|
|
.if !defined(DEBUG) && !defined(PROFLEVEL)
|
|
STRIP_FLAGS = -S
|
|
.endif
|
|
|
|
# We don't support gcc's thump interwork stuff, so disable it
|
|
CFLAGS.gcc += -mno-thumb-interwork
|
|
|
|
# We generally don't want fpu instructions in the kernel.
|
|
CFLAGS.clang += -mfpu=none
|
|
|
|
.if !empty(DDB_ENABLED)
|
|
CFLAGS += -funwind-tables
|
|
.if ${COMPILER_TYPE} == "clang" && ${COMPILER_VERSION} < 30500
|
|
# clang < 3.5.0 requires us to tell it to emit assembly with unwind information
|
|
CFLAGS += -mllvm -arm-enable-ehabi
|
|
.endif
|
|
.endif
|
|
|
|
# hack because genassym.c includes sys/bus.h which includes these.
|
|
genassym.o: bus_if.h device_if.h
|
|
|
|
SYSTEM_LD_ = ${LD} -m ${LD_EMULATION} -Bdynamic -T ldscript.$M.noheader \
|
|
${_LDFLAGS} --no-warn-mismatch --warn-common --export-dynamic \
|
|
--dynamic-linker /red/herring \
|
|
-o ${FULLKERNEL}.noheader -X ${SYSTEM_OBJS} vers.o
|
|
SYSTEM_LD_TAIL +=;sed s/" + SIZEOF_HEADERS"// ldscript.$M\
|
|
>ldscript.$M.noheader; \
|
|
${SYSTEM_LD_}; \
|
|
${OBJCOPY} -S -O binary ${FULLKERNEL}.noheader \
|
|
${KERNEL_KO}.bin; \
|
|
rm ${FULLKERNEL}.noheader
|
|
|
|
FILES_CPU_FUNC = \
|
|
$S/$M/$M/cpufunc_asm_arm9.S \
|
|
$S/$M/$M/cpufunc_asm_xscale.S $S/$M/$M/cpufunc_asm.S \
|
|
$S/$M/$M/cpufunc_asm_xscale_c3.S $S/$M/$M/cpufunc_asm_armv5_ec.S \
|
|
$S/$M/$M/cpufunc_asm_fa526.S $S/$M/$M/cpufunc_asm_sheeva.S \
|
|
$S/$M/$M/cpufunc_asm_pj4b.S $S/$M/$M/cpufunc_asm_armv6.S \
|
|
$S/$M/$M/cpufunc_asm_armv7.S
|
|
|
|
.if ${MACHINE_ARCH} != "armv6" && defined(KERNPHYSADDR)
|
|
KERNEL_EXTRA=trampoline
|
|
KERNEL_EXTRA_INSTALL=kernel.gz.tramp
|
|
trampoline: ${KERNEL_KO}.tramp
|
|
${KERNEL_KO}.tramp: ${KERNEL_KO} $S/$M/$M/inckern.S $S/$M/$M/elf_trampoline.c
|
|
echo "#define KERNNAME \"${KERNEL_KO}.tmp\"" >opt_kernname.h
|
|
sed s/${KERNVIRTADDR}/${KERNPHYSADDR}/ ldscript.$M > ldscript.$M.tramp
|
|
sed s/" + SIZEOF_HEADERS"// ldscript.$M.tramp > \
|
|
ldscript.$M.tramp.noheader
|
|
echo "#include <machine/asm.h>" >tmphack.S
|
|
echo "ENTRY(_start)" >>tmphack.S
|
|
echo "bl _startC" >>tmphack.S
|
|
${OBJCOPY} --strip-symbol '$$d' --strip-symbol '$$a' \
|
|
-g --strip-symbol '$$t' ${FULLKERNEL} ${KERNEL_KO}.tmp
|
|
eval $$(stat -s ${KERNEL_KO}.tmp) && \
|
|
echo "#define KERNSIZE $$st_size" >>opt_kernname.h
|
|
${CC} -O -nostdlib -I. -I$S \
|
|
-Xlinker -T -Xlinker ldscript.$M.tramp \
|
|
-DELF_TRAMPOLINE \
|
|
tmphack.S \
|
|
$S/$M/$M/elf_trampoline.c \
|
|
$S/$M/$M/inckern.S \
|
|
${FILES_CPU_FUNC} \
|
|
-o ${KERNEL_KO}.tramp
|
|
${CC} -O -nostdlib -I. -I$S \
|
|
-Xlinker -T -Xlinker ldscript.$M.tramp.noheader \
|
|
-DELF_TRAMPOLINE \
|
|
tmphack.S \
|
|
$S/$M/$M/elf_trampoline.c \
|
|
$S/$M/$M/inckern.S \
|
|
${FILES_CPU_FUNC} \
|
|
-o ${KERNEL_KO}.tramp.noheader
|
|
${OBJCOPY} -S -O binary ${KERNEL_KO}.tramp.noheader \
|
|
${KERNEL_KO}.tramp.bin
|
|
${OBJCOPY} ${STRIP_FLAGS} ${KERNEL_KO}.tmp
|
|
echo "#define KERNNAME \"${KERNEL_KO}.tmp.gz\"" >opt_kernname.h
|
|
eval $$(stat -s ${KERNEL_KO}.tmp) && \
|
|
echo "#define KERNSIZE $$st_size" >>opt_kernname.h
|
|
gzip -f9 ${KERNEL_KO}.tmp
|
|
eval $$(stat -s ${KERNEL_KO}.tmp.gz) && \
|
|
echo "#define KERNCOMPSIZE $$st_size" >>opt_kernname.h
|
|
${CC} -O2 -ffreestanding -I. -I$S -c \
|
|
-DKZIP -DELF_TRAMPOLINE \
|
|
$S/kern/inflate.c \
|
|
-o inflate-tramp.o
|
|
${CC} -O -nostdlib -I. -I$S \
|
|
-Xlinker -T -Xlinker ldscript.$M.tramp \
|
|
-DKZIP -DELF_TRAMPOLINE \
|
|
tmphack.S \
|
|
$S/$M/$M/elf_trampoline.c \
|
|
inflate-tramp.o \
|
|
$S/$M/$M/inckern.S \
|
|
${FILES_CPU_FUNC} \
|
|
-o ${KERNEL_KO}.gz.tramp
|
|
${CC} -O -nostdlib -I. -I$S \
|
|
-Xlinker -T -Xlinker ldscript.$M.tramp.noheader \
|
|
-DKZIP -DELF_TRAMPOLINE \
|
|
tmphack.S \
|
|
$S/$M/$M/elf_trampoline.c \
|
|
inflate-tramp.o \
|
|
$S/$M/$M/inckern.S \
|
|
${FILES_CPU_FUNC} \
|
|
-o ${KERNEL_KO}.tramp.noheader
|
|
${OBJCOPY} -S -O binary ${KERNEL_KO}.tramp.noheader \
|
|
${KERNEL_KO}.gz.tramp.bin
|
|
rm ${KERNEL_KO}.tmp.gz ${KERNEL_KO}.tramp.noheader opt_kernname.h \
|
|
inflate-tramp.o tmphack.S
|
|
.endif
|
|
|
|
%BEFORE_DEPEND
|
|
|
|
%OBJS
|
|
|
|
%FILES.c
|
|
|
|
%FILES.s
|
|
|
|
%FILES.m
|
|
|
|
%CLEAN
|
|
|
|
CLEAN+= ldscript.$M ${KERNEL_KO}.bin ldscript.$M.noheader
|
|
|
|
CLEAN+= ${KERNEL_KO}.tramp ${KERNEL_KO}.tramp.bin ldscript.$M.tramp \
|
|
ldscript.$M.tramp.noheader ${KERNEL_KO}.gz.tramp \
|
|
${KERNEL_KO}.gz.tramp.bin
|
|
|
|
ldscript.$M: $S/conf/ldscript.$M
|
|
cat $S/conf/ldscript.$M|sed s/KERNPHYSADDR/${KERNPHYSADDR}/g| \
|
|
sed s/KERNVIRTADDR/${KERNVIRTADDR}/g > ldscript.$M
|
|
%RULES
|
|
|
|
.include "$S/conf/kern.post.mk"
|