NetBSD/libexec/ld.elf_so/Makefile
joerg e45d4ba084 Replace COMBREL with just-in-time check in _rtld_relocate_nonplt_objects.
The COMBREL logic predates thread-safety of the dynamic linker and
breaks the use of shared locks for the common symbol lookup case. It is
unlikely to provide any benefit for lazy binding or PLT lookups, so
provide equivalent functionality in the non-PLT relocation handling loop
by checking if the symbol used by the current relocation is the same as
the one used during the last lookup. No inter-object cachine is done as
it is also unlikely to be benefical.

Testing with Firefox startup on AMD64 shows a small performance gain by
the new method.
2017-06-19 11:57:01 +00:00

178 lines
4.6 KiB
Makefile

# $NetBSD: Makefile,v 1.137 2017/06/19 11:57:01 joerg Exp $
#
# NOTE: when changing ld.so, ensure that ldd still compiles.
#
WARNS?=4
LDELFSO_MACHINE_ARCH?= ${MACHINE_ARCH}
# This needs to be before bsd.init.mk
.if defined(BSD_MK_COMPAT_FILE)
.include <${BSD_MK_COMPAT_FILE}>
.endif
# We are not building this with PIE
PIE_CFLAGS=
PIE_LDFLAGS=
.include <bsd.init.mk> # for MKPIC definition
.include <bsd.shlib.mk> # for SHLINKINSTALLDIR definition
.if defined(LDELFSO_MACHINE_CPU) && !empty(LDELFSO_MACHINE_CPU) && \
exists(${.CURDIR}/arch/${LDELFSO_MACHINE_CPU})
ARCHSUBDIR= ${LDELFSO_MACHINE_CPU}
.else
ARCHSUBDIR= ${MACHINE_CPU}
.endif
M= ${.CURDIR}/arch/${ARCHSUBDIR}
.if ((${MACHINE_CPU} == "aarch64") || \
(${LDELFSO_MACHINE_ARCH} == "alpha") || \
(${MACHINE_CPU} == "arm") || \
(${LDELFSO_MACHINE_ARCH} == "coldfire") || \
(${LDELFSO_MACHINE_ARCH} == "hppa") || \
(${LDELFSO_MACHINE_ARCH} == "i386") || \
(${LDELFSO_MACHINE_ARCH} == "m68k") || \
(${MACHINE_CPU} == "mips") || \
(${MACHINE_CPU} == "or1k") || \
(${MACHINE_CPU} == "powerpc") || \
(${MACHINE_CPU} == "riscv") || \
(${MACHINE_CPU} == "sh3") || \
(${LDELFSO_MACHINE_ARCH} == "sparc") || \
(${LDELFSO_MACHINE_ARCH} == "sparc64") || \
(${LDELFSO_MACHINE_ARCH} == "x86_64") || \
(${LDELFSO_MACHINE_ARCH} == "vax")) && \
${MKPIC} != "no"
LDFLAGS+= ${${ACTIVE_CC} == "clang":? -Wl,-Bsymbolic : -symbolic} \
-shared -nostartfiles -nodefaultlibs
LDFLAGS+= -Wl,-static
LDFLAGS+= -Wl,--warn-shared-textrel
LDFLAGS+= -Wl,-Map=${.TARGET}.map
COPTS+= -fvisibility=hidden
# Adds SRCS, CPPFLAGS, LDFLAGS, etc. Must go first so MD startup source
# is first.
.if exists($M/Makefile.inc)
.include "$M/Makefile.inc"
.endif
# Support compat ld.elf_so.
.if defined(MLIBDIR)
PROG= ld.elf_so-${MLIBDIR}
CPPFLAGS+= -DRTLD_ARCH_SUBDIR=\"${MLIBDIR}\"
. if ${MLIBDIR} == "o32"
. endif
.else
PROG= ld.elf_so
.endif
CLIBOBJ!= cd ${NETBSDSRCDIR}/lib/libc && ${PRINTOBJDIR}
SRCS+= rtld.c reloc.c symbol.c xmalloc.c xprintf.c debug.c \
map_object.c load.c search.c headers.c paths.c expand.c \
tls.c symver.c diagassert.c
.if ${USE_FORT} == "yes"
.PATH.c: ${NETBSDSRCDIR}/lib/libc/misc
SRCS+= stack_protector.c
.endif
.PATH.c: ${NETBSDSRCDIR}/lib/libc/stdlib
SRCS+= exit.c
errlist_concat.h: ${NETBSDSRCDIR}/lib/libc/gen/errlist.awk ${NETBSDSRCDIR}/sys/sys/errno.h
${TOOL_AWK} -v concat=1 -f ${.ALLSRC} > ${.TARGET}.tmp && \
mv -f ${.TARGET}.tmp ${.TARGET}
xprintf.c: errlist_concat.h
CLEANFILES+= errlist_concat.h ${PROG}.map
BINDIR= ${SHLINKINSTALLDIR}
CPPFLAGS+= -DLIBDIR=\"${LIBDIR}\" -D_PATH_RTLD=\"${BINDIR}/${PROG}\"
CPPFLAGS+= -I${.CURDIR} -I. -D_KERNTYPES
CPPFLAGS+= -DRTLD_LOADER
CPPFLAGS+= -DGNU_RELRO
CPPFLAGS+= -D_RTLD_SOURCE
#CPPFLAGS+= -DDEBUG
#CPPFLAGS+= -DRTLD_DEBUG
#CPPFLAGS+= -DRTLD_DEBUG_RELOC
.if !empty(LDELFSO_MACHINE_ARCH:Mearm*)
CPPFLAGS+= -I${NETBSDSRCDIR}/lib/libexecinfo
.endif
#DBG= -g
COPTS+= -O3
.if ${MACHINE_CPU} != "m68k" && ${MACHINE_CPU} != "sh3" && ${MACHINE_ARCH} != "vax"
COPTS+= -fomit-frame-pointer
.endif
.if ${LDELFSO_MACHINE_ARCH} == "i386" || ${LDELFSO_MACHINE_ARCH} == "x86_64"
COPTS+= -mno-3dnow -mno-mmx -mno-sse -mno-sse2 -mno-sse3
.endif
.if ${SHLIBDIR} != ${LIBDIR}
CPPFLAGS+= -DRTLD_DEFAULT_LIBRARY_PATH=\"${SHLIBDIR}:${LIBDIR}\"
.endif
# rtld.c and symbol.c use alloca, so disable SSP warnings.
COPTS.rtld.c+= -Wno-stack-protector
COPTS.symbol.c+=-Wno-stack-protector
LDADD+= -Wl,--version-script=${.CURDIR}/symbols.map
LDADD+= -L${CLIBOBJ} -L${DESTDIR}${LIBDIR}
.if ${MKPICLIB} != "no"
LDADD+= -lc_pic
.if ${MKPICINSTALL} != "no"
DPADD+= ${LIBC_PIC}
.endif
DPADD+= ${CLIBOBJ}/libc_pic.a
.else
LDADD+= -lc
DPADD+= ${CLIBOBJ}/libc.a
.endif
.if ${MACHINE_CPU} == "hppa" || ${MACHINE_CPU} == "sh3"
# for $$divU, $$remU etc. (millicode)
LDADD+= -lgcc
DPADD+= ${LIBGCC}
.endif
STRIPFLAG=
.PATH: $M
${PROG}: ${OBJS} ${DPADD}
${_MKMSG_LINK} ${PROG}
${CC} ${LDFLAGS} -o ${PROG} ${OBJS} ${LDADD}
.if ${MKDEBUG} != "no"
( ${OBJCOPY} --only-keep-debug ${.TARGET} ${.TARGET}.debug \
&& ${OBJCOPY} --strip-debug -p -R .gnu_debuglink \
--add-gnu-debuglink=${.TARGET}.debug ${.TARGET} \
) || (rm -f ${.TARGET}.debug; false)
_PROGDEBUG.${PROG} := ${PROG}.debug
.endif
.if ${SHLINKINSTALLDIR} != "/usr/libexec"
SYMLINKS+= ${SHLINKINSTALLDIR}/${PROG} /usr/libexec/${PROG}
.if ${MKDEBUG} != "no"
SYMLINKS+= ${DEBUGDIR}${BINDIR}/${PROG}.debug \
${DEBUGDIR}/usr${BINDIR}/${PROG}.debug
.endif
.endif
.include <bsd.prog.mk>
.else
MAN= ld.elf_so.1
.include <bsd.man.mk>
.endif