xref: /freebsd/libexec/rtld-elf/Makefile (revision 7fdf597e96a02165cfe22ff357b857d5fa15ed8a)
1# Use the following command to build local debug version of dynamic
2# linker:
3# make DEBUG_FLAGS=-g WITHOUT_TESTS=yes all
4
5RTLD_ELF_DIR:=	${.PARSEDIR}
6
7.include <src.opts.mk>
8PACKAGE=	clibs
9MK_PIE=		no # Always position independent using local rules
10# Not compatible with sanitizer instrumentation or SSP.
11MK_ASAN=	no
12MK_SSP=		no
13MK_UBSAN=	no
14
15.include <bsd.compat.pre.mk>
16
17# SSP forced off already implies FORTIFY_SOURCE=0, but we must make sure that
18# one cannot turn it back on.
19FORTIFY_SOURCE=	0
20
21.if !defined(NEED_COMPAT)
22CONFS=		libmap.conf
23.endif
24PROG?=		ld-elf.so.1
25.for _libcompat in ${_ALL_libcompats}
26.if ${PROG:M*ld-elf${_libcompat}[-.]*} != ""
27TAGS+=		lib${_libcompat}
28.endif
29.endfor
30SRCS= \
31	crtbrand.S \
32	rtld_start.S \
33	reloc.c \
34	rtld.c \
35	rtld_lock.c \
36	rtld_malloc.c \
37	rtld_printf.c \
38	map_object.c \
39	xmalloc.c \
40	debug.c \
41	libmap.c
42MAN?=		rtld.1
43ACFLAGS+=	-DLOCORE
44CFLAGS+=	-Wall -DIN_RTLD -ffreestanding
45CFLAGS+=	-I${SRCTOP}/lib/csu/common
46.if exists(${RTLD_ELF_DIR}/${MACHINE_ARCH:S/powerpc64le/powerpc64/})
47RTLD_ARCH=	${MACHINE_ARCH:S/powerpc64le/powerpc64/}
48.else
49RTLD_ARCH=	${MACHINE_CPUARCH}
50.endif
51CFLAGS+=	-I${RTLD_ELF_DIR}/${RTLD_ARCH} -I${RTLD_ELF_DIR}
52
53NO_WCAST_ALIGN=	yes
54INSTALLFLAGS=	-C -b
55PRECIOUSPROG=
56BINDIR=		/libexec
57SYMLINKS=	../..${BINDIR}/${PROG} ${LIBEXECDIR}/${PROG}
58MLINKS?=	rtld.1 ld-elf.so.1.1 \
59		rtld.1 ld.so.1
60
61CFLAGS+=	-fpic -DPIC $(DEBUG)
62
63LDFLAGS+=	-shared -Wl,-Bsymbolic -Wl,-z,defs -nostdlib -e ${RTLD_ENTRY}
64# Pull in the dependencies that we use from libc
65.include "rtld-libc/Makefile.inc"
66
67VERSION_DEF=	${LIBCSRCDIR}/Versions.def
68SYMBOL_MAPS=	${RTLD_ELF_DIR}/Symbol.map
69VERSION_MAP=	Version.map
70LDFLAGS+=	-Wl,--version-script=${VERSION_MAP}
71
72.if exists(${RTLD_ELF_DIR}/${RTLD_ARCH}/Symbol.map)
73SYMBOL_MAPS+=	${RTLD_ELF_DIR}/${RTLD_ARCH}/Symbol.map
74.endif
75
76.sinclude "${RTLD_ELF_DIR}/${RTLD_ARCH}/Makefile.inc"
77RTLD_ENTRY?=	.rtld_start
78
79# Always produce the map file so that may be inspected to confirm
80# undesired code is not linked from libsys/libc.
81MAPFILE=	ld-elf.so.1.map
82LDFLAGS+=	-Wl,-Map=${MAPFILE} -Wl,--cref
83CLEANFILES+=	${MAPFILE}
84
85afterbuild:
86	@if grep __libsys_interposing ${MAPFILE} >/dev/null ; then \
87		echo "libsys_interposing leaked" 1>&2 ; \
88		exit 1 ; \
89	fi
90	@if grep __libc_interposing ${MAPFILE} >/dev/null ; then \
91		echo "libc_interposing leaked" 1>&2 ; \
92		exit 1 ; \
93	fi
94	@if grep xlocale ${MAPFILE} >/dev/null ; then \
95		echo "xlocale leaked" 1>&2 ; \
96		exit 1 ; \
97	fi
98	@if grep fprintf ${MAPFILE} >/dev/null ; then \
99		echo "stdio leaked" 1>&2 ; \
100		exit 1 ; \
101	fi
102
103
104# Since moving rtld-elf to /libexec, we need to create a symlink.
105# Fixup the existing binary that's there so we can symlink over it.
106beforeinstall:
107.if exists(${DESTDIR}/usr/libexec/${PROG}) && ${MK_STAGING} == "no"
108	-chflags -h noschg ${DESTDIR}/usr/libexec/${PROG}
109.endif
110
111.PATH: ${RTLD_ELF_DIR}/${RTLD_ARCH} ${SRCTOP}/lib/csu/common
112
113.if ${.CURDIR} == ${RTLD_ELF_DIR}
114HAS_TESTS=
115SUBDIR.${MK_TESTS}+= tests
116.endif
117
118# Some of the required math functions (div & mod) are implemented in
119# libcompiler_rt on some architectures.
120LIBADD+=	compiler_rt
121
122.include <bsd.prog.mk>
123${PROG_FULL}:	${VERSION_MAP}
124.include <bsd.symver.mk>
125
126.if ${COMPILER_TYPE} == "gcc"
127# GCC warns about redeclarations even though they have __exported
128# and are therefore not identical to the ones from the system headers.
129CFLAGS+=	-Wno-redundant-decls
130.endif
131