mirror of
https://github.com/opnsense/src.git
synced 2026-07-16 12:33:07 -04:00
Previously we (appropriately, but incorrectly) attempted to depend on
LIBC_NOSSP_PIC and LIBSYS_PIC for rtld_libc.a. Unfortunately,
variables in dependency lists are expanded at parse time and those
variables are defined in bsd.libnames.mk which *must* be included by
bsd.{lib,prog}.mk. As such, they were undefined and thus expanded to
the empty string resulting in no dependency with predictable and highly
confusing results.
Move the declaration of these dependencies to after the include of
bsd.prog.mk and add comments on both side in hopes of keeping any future
dependencies in sync.
Reviewed by: kib
Differential Revision: https://reviews.freebsd.org/D51790
134 lines
3.5 KiB
Makefile
134 lines
3.5 KiB
Makefile
# Use the following command to build local debug version of dynamic
|
|
# linker:
|
|
# make DEBUG_FLAGS=-g WITHOUT_TESTS=yes all
|
|
|
|
RTLD_ELF_DIR:= ${.PARSEDIR}
|
|
|
|
.include <src.opts.mk>
|
|
PACKAGE= clibs
|
|
MK_PIE= no # Always position independent using local rules
|
|
# Not compatible with sanitizer instrumentation or SSP.
|
|
MK_ASAN= no
|
|
MK_SSP= no
|
|
MK_UBSAN= no
|
|
|
|
.include <bsd.compat.pre.mk>
|
|
|
|
# SSP forced off already implies FORTIFY_SOURCE=0, but we must make sure that
|
|
# one cannot turn it back on.
|
|
FORTIFY_SOURCE= 0
|
|
|
|
.if !defined(NEED_COMPAT)
|
|
CONFS= libmap.conf
|
|
.endif
|
|
PROG?= ld-elf.so.1
|
|
.for _libcompat in ${_ALL_libcompats}
|
|
.if ${PROG:M*ld-elf${_libcompat}[-.]*} != ""
|
|
TAGS+= lib${_libcompat}
|
|
.endif
|
|
.endfor
|
|
SRCS= \
|
|
crtbrand.S \
|
|
rtld_start.S \
|
|
reloc.c \
|
|
rtld.c \
|
|
rtld_lock.c \
|
|
rtld_malloc.c \
|
|
rtld_printf.c \
|
|
map_object.c \
|
|
xmalloc.c \
|
|
debug.c \
|
|
libmap.c
|
|
MAN?= rtld.1
|
|
ACFLAGS+= -DLOCORE
|
|
CFLAGS+= -Wall -DIN_RTLD -ffreestanding
|
|
CFLAGS+= -I${SRCTOP}/lib/csu/common
|
|
.if exists(${RTLD_ELF_DIR}/${MACHINE_ARCH:S/powerpc64le/powerpc64/})
|
|
RTLD_ARCH= ${MACHINE_ARCH:S/powerpc64le/powerpc64/}
|
|
.else
|
|
RTLD_ARCH= ${MACHINE_CPUARCH}
|
|
.endif
|
|
CFLAGS+= -I${RTLD_ELF_DIR}/${RTLD_ARCH} -I${RTLD_ELF_DIR}
|
|
|
|
NO_WCAST_ALIGN= yes
|
|
INSTALLFLAGS= -C -b
|
|
PRECIOUSPROG=
|
|
BINDIR= /libexec
|
|
SYMLINKS= ../..${BINDIR}/${PROG} ${LIBEXECDIR}/${PROG}
|
|
MLINKS?= rtld.1 ld-elf.so.1.1 \
|
|
rtld.1 ld.so.1
|
|
|
|
CFLAGS+= -fpic -DPIC $(DEBUG)
|
|
|
|
LDFLAGS+= -shared -Wl,-Bsymbolic -Wl,-z,defs -nostdlib -e ${RTLD_ENTRY}
|
|
# Pull in the dependencies that we use from libc
|
|
.include "rtld-libc/Makefile.inc"
|
|
|
|
VERSION_DEF= ${LIBCSRCDIR}/Versions.def
|
|
SYMBOL_MAPS= ${RTLD_ELF_DIR}/Symbol.map
|
|
VERSION_MAP= Version.map
|
|
LDFLAGS+= -Wl,--version-script=${VERSION_MAP}
|
|
|
|
.if exists(${RTLD_ELF_DIR}/${RTLD_ARCH}/Symbol.map)
|
|
SYMBOL_MAPS+= ${RTLD_ELF_DIR}/${RTLD_ARCH}/Symbol.map
|
|
.endif
|
|
|
|
.sinclude "${RTLD_ELF_DIR}/${RTLD_ARCH}/Makefile.inc"
|
|
RTLD_ENTRY?= .rtld_start
|
|
|
|
# Always produce the map file so that may be inspected to confirm
|
|
# undesired code is not linked from libsys/libc.
|
|
MAPFILE= ld-elf.so.1.map
|
|
LDFLAGS+= -Wl,-Map=${MAPFILE} -Wl,--cref
|
|
CLEANFILES+= ${MAPFILE}
|
|
|
|
afterbuild:
|
|
@if grep __libsys_interposing ${MAPFILE} >/dev/null ; then \
|
|
echo "libsys_interposing leaked" 1>&2 ; \
|
|
exit 1 ; \
|
|
fi
|
|
@if grep __libc_interposing ${MAPFILE} >/dev/null ; then \
|
|
echo "libc_interposing leaked" 1>&2 ; \
|
|
exit 1 ; \
|
|
fi
|
|
@if grep xlocale ${MAPFILE} >/dev/null ; then \
|
|
echo "xlocale leaked" 1>&2 ; \
|
|
exit 1 ; \
|
|
fi
|
|
@if grep fprintf ${MAPFILE} >/dev/null ; then \
|
|
echo "stdio leaked" 1>&2 ; \
|
|
exit 1 ; \
|
|
fi
|
|
|
|
|
|
# Since moving rtld-elf to /libexec, we need to create a symlink.
|
|
# Fixup the existing binary that's there so we can symlink over it.
|
|
beforeinstall:
|
|
.if exists(${DESTDIR}/usr/libexec/${PROG}) && ${MK_STAGING} == "no"
|
|
-chflags -h noschg ${DESTDIR}/usr/libexec/${PROG}
|
|
.endif
|
|
|
|
.PATH: ${RTLD_ELF_DIR}/${RTLD_ARCH} ${SRCTOP}/lib/csu/common
|
|
|
|
.if ${.CURDIR} == ${RTLD_ELF_DIR}
|
|
HAS_TESTS=
|
|
SUBDIR.${MK_TESTS}+= tests
|
|
.endif
|
|
|
|
# Some of the required math functions (div & mod) are implemented in
|
|
# libcompiler_rt on some architectures.
|
|
LIBADD+= compiler_rt
|
|
|
|
.include <bsd.prog.mk>
|
|
${PROG_FULL}: ${VERSION_MAP}
|
|
.include <bsd.symver.mk>
|
|
|
|
.if ${COMPILER_TYPE} == "gcc"
|
|
# GCC warns about redeclarations even though they have __exported
|
|
# and are therefore not identical to the ones from the system headers.
|
|
CFLAGS+= -Wno-redundant-decls
|
|
.endif
|
|
|
|
# Add dependencies on libc and libsys archives after bsd.prog.mk
|
|
# includes bsd.libnames.mk so they are defined.
|
|
rtld_libc.a: ${LIBC_NOSSP_PIC} ${LIBSYS_PIC}
|