opnsense-src/libexec/rtld-elf/rtld-libc/Makefile.inc
Konstantin Belousov d40daefca6 libc/gen: split user-visible opendir()-like functions into separate source files
This allows, for instance, to interpose opendir() with an implementation
that calls into fdopendir(), without causing multiple symbol definitions
when libc is linked in statically.

This is aligned with the quality of implementation principle that single
object file from a static library should not provide more than one
app-visible symbol.

[The copyright for fopendir() was copied, it might be refined by the
author]

Reviewed by:	brooks
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential revision:	https://reviews.freebsd.org/D49089
2025-02-25 09:09:29 +02:00

98 lines
3.7 KiB
Makefile

# This makefiles adds the necessary libc dependencies for RTLD without pulling
# in all of the complex libc bits such as locales, etc.
.include <bsd.compiler.mk>
LIBC_SRCTOP=${SRCTOP}/lib/libc
.if exists(${LIBC_SRCTOP}/${MACHINE_ARCH:S/powerpc64le/powerpc64/})
LIBC_ARCH=${MACHINE_ARCH:S/powerpc64le/powerpc64/}
.else
LIBC_ARCH=${MACHINE_CPUARCH}
.endif
CFLAGS+= -I${SRCTOP}/libexec/rtld-elf/rtld-libc
# Build all the libc files that use interposed symbols or pthreads again for
# RTLD. We compile with a different libc_private.h and namespace.h that
# redirects all calls to interposed functions to use the non-interposed version
# instead.
.PATH: ${LIBC_SRCTOP}/gen
SRCS+= fdopendir.c opendir.c opendir2.c closedir.c readdir.c telldir.c
# Avoid further dependencies by providing simple implementations of libc
# functions such as __error(), etc.
.PATH: ${SRCTOP}/libexec/rtld-elf/rtld-libc
SRCS+= rtld_libc.c
# Now build the remaining files from libc:
.PATH: ${LIBC_SRCTOP}/stdlib
SRCS+= reallocf.c realpath.c merge.c reallocarray.c
# TODO: fix merge.c to build with WARNS=6
.if ${COMPILER_TYPE} == "clang"
CFLAGS.merge.c+=-Wno-error=null-pointer-arithmetic
.endif
.PATH: ${LIBC_SRCTOP}/gen
SRCS+= errlst.c getcwd.c getprogname.c raise.c sigsetops.c sysctlnametomib.c \
__xuname.c
# errlst.c needs the errlst.h header from libc:
CFLAGS.errlst.c+=-I${LIBC_SRCTOP}/include
# use generic versions of string functions to avoid potential ifunc dispatch
.PATH: ${LIBC_SRCTOP}/string
SRCS+= bcopy.c bzero.c memchr.c memcmp.c memcpy.c memmove.c memset.c strcat.c \
strchr.c strchrnul.c strcmp.c strcpy.c strcspn.c strdup.c strlcat.c \
strlcpy.c strlen.c strncmp.c strncpy.c strrchr.c strsep.c strspn.c \
strstr.c strtok.c
CFLAGS.memchr.c+=-Wno-cast-qual
CFLAGS.strchr.c+=-Wno-cast-qual
CFLAGS.strchrnul.c+=-Wno-cast-qual
CFLAGS.strcspn.c+=-Wno-sign-compare
CFLAGS.strrchr.c+=-Wno-cast-qual
CFLAGS.strspn.c+=-Wno-sign-compare
CFLAGS.strstr.c+=-Wno-cast-qual -Wno-sign-compare
CFLAGS.strtok.c+=-Wno-cast-qual
# Also use all the syscall .o files from libc_nossp_pic:
_libc_other_objects= sigsetjmp lstat stat fstat fstatat fstatfs syscall \
cerror geteuid getegid sigfastblock munmap mprotect \
sysarch __sysctl issetugid __getcwd utrace getpid \
thr_self thr_kill pread mmap lseek _exit \
getdirentries _close _fcntl _open _openat _read \
_sigprocmask _write readlink ___realpathat _setjmp setjmp setjmperr
# Finally add additional architecture-dependent libc dependencies
.if ${LIBC_ARCH} == "arm"
# ARM needs aeabi_unwind_cpp for _setjmp
_libc_other_objects+=aeabi_unwind_cpp
.elif ${LIBC_ARCH} == "i386"
# i386 needs i386_set_gsbase for allocate_initial_tls()
_libc_other_objects+=i386_set_gsbase
.elif ${LIBC_ARCH} == "powerpc" || ${LIBC_ARCH} == "powerpcspe"
# ppc needs __syncicache and abs for reloc.c
_libc_other_objects+=syncicache abs
.elif ${LIBC_ARCH} == "powerpc64"
# ppc64 needs __syncicache for reloc.c
_libc_other_objects+=syncicache
.endif
# Extract all the .o files from libc_nossp_pic.a. This ensures that
# we don't accidentally pull in the interposing table or similar by linking
# directly against libc_nossp_pic.a
_rtld_libc_objs=
.for _obj in ${_libc_other_objects}
_rtld_libc_objs+=${_obj}.nossppico
CLEANFILES+=${_obj}.nossppico
# LDFLAGS+= -Wl,--trace-symbol=${_obj}
.endfor
# LDFLAGS+= -Wl,--trace
# We insert all the .o files from libc_nossp_pic.a into a new rtld_libc.a file
# to ensure that only .o files that are actually used end up being included.
rtld_libc.a: ${LIBC_NOSSP_PIC} ${SRCTOP}/libexec/rtld-elf/rtld-libc/Makefile.inc
@rm -f ${.TARGET}
${AR} x ${LIBC_NOSSP_PIC} ${_rtld_libc_objs}
${AR} cr ${.TARGET} ${_rtld_libc_objs}
CLEANFILES+=rtld_libc.a
LDADD+=${.OBJDIR}/rtld_libc.a
beforelinking: rtld_libc.a