Makefile revision 1.143 1 # $NetBSD: Makefile,v 1.143 2020/02/09 09:11:59 kamil Exp $
2 #
3 # NOTE: when changing ld.so, ensure that ldd still compiles.
4 #
5 NOLIBCSANITIZER=# defined
6 NOSANITIZER= # defined
7 WARNS?=4
8
9 LDELFSO_MACHINE_ARCH?= ${MACHINE_ARCH}
10
11 # This needs to be before bsd.init.mk
12 .if defined(BSD_MK_COMPAT_FILE)
13 .include <${BSD_MK_COMPAT_FILE}>
14 .endif
15
16 # We are not building this with PIE
17 PIE_CFLAGS=
18 PIE_LDFLAGS=
19 .include <bsd.init.mk> # for MKPIC definition
20 .include <bsd.shlib.mk> # for SHLINKINSTALLDIR definition
21
22 .if defined(LDELFSO_MACHINE_CPU) && !empty(LDELFSO_MACHINE_CPU) && \
23 exists(${.CURDIR}/arch/${LDELFSO_MACHINE_CPU})
24 ARCHSUBDIR= ${LDELFSO_MACHINE_CPU}
25 .else
26 ARCHSUBDIR= ${MACHINE_CPU}
27 .endif
28 M= ${.CURDIR}/arch/${ARCHSUBDIR}
29
30 .if ((${MACHINE_CPU} == "aarch64") || \
31 (${LDELFSO_MACHINE_ARCH} == "alpha") || \
32 (${MACHINE_CPU} == "arm") || \
33 (${LDELFSO_MACHINE_ARCH} == "coldfire") || \
34 (${LDELFSO_MACHINE_ARCH} == "hppa") || \
35 (${LDELFSO_MACHINE_ARCH} == "i386") || \
36 (${LDELFSO_MACHINE_ARCH} == "m68k") || \
37 (${MACHINE_CPU} == "mips") || \
38 (${MACHINE_CPU} == "or1k") || \
39 (${MACHINE_CPU} == "powerpc") || \
40 (${MACHINE_CPU} == "riscv") || \
41 (${MACHINE_CPU} == "sh3") || \
42 (${LDELFSO_MACHINE_ARCH} == "sparc") || \
43 (${LDELFSO_MACHINE_ARCH} == "sparc64") || \
44 (${LDELFSO_MACHINE_ARCH} == "x86_64") || \
45 (${LDELFSO_MACHINE_ARCH} == "vax")) && \
46 ${MKPIC} != "no"
47
48 LDFLAGS+= ${${ACTIVE_CC} == "clang":? -Wl,-Bsymbolic : -symbolic} \
49 -shared -nostartfiles -nodefaultlibs
50 LDFLAGS+= -Wl,-static
51 LDFLAGS+= -Wl,--warn-shared-textrel
52 LDFLAGS+= -Wl,-Map=${.TARGET}.map
53
54 COPTS+= -fvisibility=hidden
55
56 # Adds SRCS, CPPFLAGS, LDFLAGS, etc. Must go first so MD startup source
57 # is first.
58 .if exists($M/Makefile.inc)
59 .include "$M/Makefile.inc"
60 .endif
61
62 # Support compat ld.elf_so.
63 .if defined(MLIBDIR)
64 PROG= ld.elf_so-${MLIBDIR}
65 CPPFLAGS+= -DRTLD_ARCH_SUBDIR=\"${MLIBDIR}\"
66 . if ${MLIBDIR} == "o32"
67 . endif
68 .else
69 PROG= ld.elf_so
70 .endif
71
72 CLIBOBJ!= cd ${NETBSDSRCDIR}/lib/libc && ${PRINTOBJDIR}
73
74 SRCS+= rtld.c reloc.c symbol.c xmalloc.c xprintf.c debug.c \
75 map_object.c load.c search.c headers.c paths.c expand.c \
76 tls.c symver.c diagassert.c compat.c
77
78 .if ${USE_FORT} == "yes"
79 .PATH.c: ${NETBSDSRCDIR}/lib/libc/misc
80 SRCS+= stack_protector.c
81 .endif
82
83 .PATH.c: ${NETBSDSRCDIR}/lib/libc/stdlib
84 SRCS+= exit.c
85
86 errlist_concat.h: ${NETBSDSRCDIR}/lib/libc/gen/errlist.awk ${NETBSDSRCDIR}/sys/sys/errno.h
87 ${TOOL_AWK} -v concat=1 -f ${.ALLSRC} > ${.TARGET}.tmp && \
88 mv -f ${.TARGET}.tmp ${.TARGET}
89
90 xprintf.c: errlist_concat.h
91
92 CLEANFILES+= errlist_concat.h ${PROG}.map
93
94 BINDIR= ${SHLINKINSTALLDIR}
95
96 CPPFLAGS.tls.c+= -std=gnu11
97 CPPFLAGS+= -DLIBDIR=\"${LIBDIR}\" -D_PATH_RTLD=\"${BINDIR}/${PROG}\"
98 CPPFLAGS+= -I${.CURDIR} -I. -D_KERNTYPES
99 CPPFLAGS+= -DRTLD_LOADER
100 CPPFLAGS+= -DGNU_RELRO
101 CPPFLAGS+= -D_RTLD_SOURCE
102 CPPFLAGS+= -DHAVE_INITFINI_ARRAY
103 #CPPFLAGS+= -DDEBUG
104 #CPPFLAGS+= -DRTLD_DEBUG
105 #CPPFLAGS+= -DRTLD_DEBUG_RELOC
106 .if !empty(LDELFSO_MACHINE_ARCH:Mearm*)
107 CPPFLAGS+= -I${NETBSDSRCDIR}/lib/libexecinfo
108 .endif
109 #DBG= -g
110 COPTS+= -O3
111
112 .if ${MACHINE_CPU} != "m68k" && ${MACHINE_CPU} != "sh3" && ${MACHINE_ARCH} != "vax"
113 COPTS+= -fomit-frame-pointer
114 .endif
115
116 .if ${LDELFSO_MACHINE_ARCH} == "i386" || ${LDELFSO_MACHINE_ARCH} == "x86_64"
117 COPTS+= -mno-3dnow -mno-mmx -mno-sse -mno-sse2 -mno-sse3
118 .endif
119
120
121 .if ${SHLIBDIR} != ${LIBDIR}
122 CPPFLAGS+= -DRTLD_DEFAULT_LIBRARY_PATH=\"${SHLIBDIR}:${LIBDIR}\"
123 .endif
124
125 # rtld.c and symbol.c use alloca, so disable SSP warnings.
126 COPTS.rtld.c+= -Wno-stack-protector
127 COPTS.symbol.c+=-Wno-stack-protector
128
129 .if ${MACHINE_CPU} == "vax"
130 COPTS.rtld.c+= -O0
131 .endif
132
133 LDADD+= -Wl,--version-script=${.CURDIR}/symbols.map
134 LDADD+= -L${CLIBOBJ} -L${DESTDIR}${LIBDIR}
135 .if ${MKPICLIB} != "no"
136 LDADD+= -lc_pic
137 .if ${MKPICINSTALL} != "no"
138 DPADD+= ${LIBC_PIC}
139 .endif
140 DPADD+= ${CLIBOBJ}/libc_pic.a
141 .else
142 LDADD+= -lc
143 DPADD+= ${CLIBOBJ}/libc.a
144 .endif
145
146 .if ${MACHINE_CPU} == "hppa" || ${MACHINE_CPU} == "sh3"
147 # for $$divU, $$remU etc. (millicode)
148 LDADD+= -lgcc
149 DPADD+= ${LIBGCC}
150 .endif
151
152 STRIPFLAG=
153
154 .PATH: $M
155
156
157 ${PROG}: ${OBJS} ${DPADD}
158 ${_MKMSG_LINK} ${PROG}
159 ${CC} ${LDFLAGS} -o ${PROG} ${OBJS} ${LDADD}
160 .if ${MKDEBUG} != "no"
161 ( ${OBJCOPY} --only-keep-debug ${.TARGET} ${.TARGET}.debug \
162 && ${OBJCOPY} --strip-debug -p -R .gnu_debuglink \
163 --add-gnu-debuglink=${.TARGET}.debug ${.TARGET} \
164 ) || (rm -f ${.TARGET}.debug; false)
165
166 _PROGDEBUG.${PROG} := ${PROG}.debug
167 .endif
168
169
170 .if ${SHLINKINSTALLDIR} != "/usr/libexec"
171 SYMLINKS+= ${SHLINKINSTALLDIR}/${PROG} /usr/libexec/${PROG}
172 .if ${MKDEBUG} != "no"
173 SYMLINKS+= ${DEBUGDIR}${BINDIR}/${PROG}.debug \
174 ${DEBUGDIR}/usr${BINDIR}/${PROG}.debug
175 .endif
176 .endif
177
178 .include <bsd.prog.mk>
179 .else
180
181 MAN= ld.elf_so.1
182
183 .include <bsd.man.mk>
184 .endif
185