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