1# $FreeBSD$
2# This makefiles adds the necessary libc dependencies for RTLD without pulling
3# in all of the complex libc bits such as locales, etc.
4
5.include <bsd.compiler.mk>
6
7LIBC_SRCTOP=${SRCTOP}/lib/libc
8.if exists(${LIBC_SRCTOP}/${MACHINE_ARCH:S/powerpc64le/powerpc64/})
9LIBC_ARCH=${MACHINE_ARCH:S/powerpc64le/powerpc64/}
10.else
11LIBC_ARCH=${MACHINE_CPUARCH}
12.endif
13
14CFLAGS+=	-I${SRCTOP}/libexec/rtld-elf/rtld-libc
15
16# Build all the libc files that use interposed symbols or pthreads again for
17# RTLD. We compile with a different libc_private.h and namespace.h that
18# redirects all calls to interposed functions to use the non-interposed version
19# instead.
20.PATH: ${LIBC_SRCTOP}/gen
21SRCS+=	opendir.c closedir.c readdir.c telldir.c
22
23# Avoid further dependencies by providing simple implementations of libc
24# functions such as __error(), etc.
25.PATH: ${SRCTOP}/libexec/rtld-elf/rtld-libc
26SRCS+=	rtld_libc.c
27
28# Now build the remaining files from libc:
29.PATH: ${LIBC_SRCTOP}/stdlib
30SRCS+=	reallocf.c realpath.c getenv.c merge.c reallocarray.c
31# TODO: fix merge.c to build with WARNS=6
32.if ${COMPILER_TYPE} == "clang"
33CFLAGS.merge.c+=-Wno-error=null-pointer-arithmetic
34.endif
35.PATH: ${LIBC_SRCTOP}/gen
36SRCS+=	errlst.c getcwd.c getprogname.c raise.c sigsetops.c sysctlnametomib.c \
37    __xuname.c
38# errlst.c needs the errlst.h header from libc:
39CFLAGS.errlst.c+=-I${LIBC_SRCTOP}/include
40
41# Use the string and memory .o files from libc instead of rebuilding them (they
42# might be using optimized assembly and duplicating that logic here is awkward).
43_libc_string_objects=	bcmp bcopy bzero memset memchr memcmp memcpy memmove \
44    stpncpy strcat strchr strchrnul strcmp stpcpy strcpy strcspn strdup \
45    strlcat strlcpy strlen strncmp strncpy strrchr strsep strspn strstr strtok
46# Also use all the syscall .o files from libc_nossp_pic:
47_libc_other_objects= sigsetjmp lstat stat fstat fstatat fstatfs syscall \
48    cerror geteuid getegid sigfastblock munmap mprotect \
49    sysarch __sysctl issetugid __getcwd utrace getpid \
50    thr_self thr_kill pread mmap lseek _exit _fstat _fstatat _fstatfs \
51    getdirentries _getdirentries _close _fcntl _open _openat _read \
52    _sigprocmask _write readlink __realpathat _setjmp setjmp setjmperr
53
54
55# Finally add additional architecture-dependent libc dependencies
56.if ${LIBC_ARCH} == "arm"
57# ARM needs aeabi_unwind_cpp for _setjmp
58_libc_other_objects+=aeabi_unwind_cpp
59.elif ${LIBC_ARCH} == "i386"
60# i386 needs i386_set_gsbase for allocate_initial_tls()
61_libc_other_objects+=i386_set_gsbase
62.elif ${LIBC_ARCH} == "powerpc" || ${LIBC_ARCH} == "powerpcspe"
63# ppc needs __syncicache and abs for reloc.c
64_libc_other_objects+=syncicache abs
65.elif ${LIBC_ARCH} == "powerpc64"
66# ppc64 needs __syncicache for reloc.c
67_libc_other_objects+=syncicache
68.endif
69
70_libc_other_objects+=_get_tp
71
72# Extract all the .o files from libc_nossp_pic.a. This ensures that
73# we don't accidentally pull in the interposing table or similar by linking
74# directly against libc_nossp_pic.a
75_rtld_libc_objs=
76.for _obj in ${_libc_other_objects} ${_libc_string_objects}
77_rtld_libc_objs+=${_obj}.nossppico
78CLEANFILES+=${_obj}.nossppico
79# LDFLAGS+=	-Wl,--trace-symbol=${_obj}
80.endfor
81# LDFLAGS+=	-Wl,--trace
82
83# We insert all the .o files from libc_nossp_pic.a into a new rtld_libc.a file
84# to ensure that only .o files that are actually used end up being included.
85rtld_libc.a: ${LIBC_NOSSP_PIC} ${SRCTOP}/libexec/rtld-elf/rtld-libc/Makefile.inc
86	@rm -f ${.TARGET}
87	${AR} x ${LIBC_NOSSP_PIC} ${_rtld_libc_objs}
88	${AR} cr ${.TARGET} ${_rtld_libc_objs}
89CLEANFILES+=rtld_libc.a
90LDADD+=${.OBJDIR}/rtld_libc.a
91beforelinking: rtld_libc.a
92