libcompat: build 32-bit rtld and ldd as part of "everything"

Alter bsd.compat.mk to set MACHINE and MACHINE_ARCH when included
directly so MD paths in Makefiles work. In the process centralize
setting them in LIBCOMPATWMAKEENV.

Alter .PATH and CFLAGS settings in work when the Makefile is included.

While here only support LIB32 on supported platforms rather than always
enabling it and requiring users of MK_LIB32 to filter based
TARGET/MACHINE_ARCH.

The net effect of this change is to make Makefile.libcompat only build
compatability libraries.

Reviewed by:	imp, kib
Obtained from:	CheriBSD (conceptually)
Sponsored by:	DARPA, AFRL
Differential Revision:	https://reviews.freebsd.org/D22251
This commit is contained in:
Brooks Davis
2019-11-07 17:10:33 +00:00
parent 751d8d156a
commit 36712a9497
9 changed files with 61 additions and 38 deletions
+2 -3
View File
@@ -802,11 +802,10 @@ XCFLAGS+= --sysroot=${WORLDTMP}
XCFLAGS+= ${BFLAGS} XCFLAGS+= ${BFLAGS}
.endif .endif
.if ${MK_LIB32} != "no" && (${TARGET_ARCH} == "amd64" || \ .if ${MK_LIB32} == "yes"
${TARGET_ARCH} == "powerpc64" || ${TARGET_ARCH:Mmips64*} != "")
_LIBCOMPAT= 32 _LIBCOMPAT= 32
.include "Makefile.libcompat" .include "Makefile.libcompat"
.elif ${MK_LIBSOFT} != "no" && ${TARGET_ARCH:Marmv[67]*} != "" .elif ${MK_LIBSOFT} == "yes"
_LIBCOMPAT= SOFT _LIBCOMPAT= SOFT
.include "Makefile.libcompat" .include "Makefile.libcompat"
.endif .endif
+1 -19
View File
@@ -111,28 +111,10 @@ build${libcompat}: .PHONY
.endfor .endfor
${_+_}cd ${.CURDIR}; \ ${_+_}cd ${.CURDIR}; \
${LIBCOMPATWMAKE} -f Makefile.inc1 -DNO_FSCHG libraries ${LIBCOMPATWMAKE} -f Makefile.inc1 -DNO_FSCHG libraries
.if ${libcompat} == "32"
.for _t in ${_obj} all
.if !defined(NO_RTLD)
${_+_}cd ${.CURDIR}/libexec/rtld-elf; PROG=ld-elf32.so.1 ${LIBCOMPATWMAKE} \
-DNO_FSCHG DIRPRFX=libexec/rtld-elf/ ${_t}
.endif
${_+_}cd ${.CURDIR}/usr.bin/ldd; PROG=ldd32 ${LIBCOMPATWMAKE} \
DIRPRFX=usr.bin/ldd ${_t}
.endfor
.endif
distribute${libcompat} install${libcompat}: .PHONY distribute${libcompat} install${libcompat}: .PHONY
.for _dir in ${_LC_LIBDIRS.yes} .for _dir in ${_LC_LIBDIRS.yes}
${_+_}cd ${.CURDIR}/${_dir}; ${LIBCOMPATIMAKE} ${.TARGET:S/${libcompat}$//} ${_+_}cd ${.CURDIR}/${_dir}; ${LIBCOMPATIMAKE} ${.TARGET:S/${libcompat}$//}
.endfor .endfor
.if ${libcompat} == "32"
.if !defined(NO_RTLD)
${_+_}cd ${.CURDIR}/libexec/rtld-elf; \
PROG=ld-elf32.so.1 ${LIBCOMPATIMAKE} ${.TARGET:S/32$//}
.endif
${_+_}cd ${.CURDIR}/usr.bin/ldd; PROG=ldd32 ${LIBCOMPATIMAKE} \
${.TARGET:S/32$//}
.endif
.endif .endif # !targets(__<${_this:T}>__)
+1
View File
@@ -74,6 +74,7 @@ _tftp-proxy= tftp-proxy
.if !defined(NO_PIC) && !defined(NO_RTLD) .if !defined(NO_PIC) && !defined(NO_RTLD)
_rtld-elf= rtld-elf _rtld-elf= rtld-elf
SUBDIR.${MK_LIB32}+= rtld-elf32
.endif .endif
.if ${MK_RBOOTD} != "no" .if ${MK_RBOOTD} != "no"
+12 -8
View File
@@ -4,6 +4,8 @@
# linker: # linker:
# make DEBUG_FLAGS=-g WITHOUT_TESTS=yes all # make DEBUG_FLAGS=-g WITHOUT_TESTS=yes all
RTLD_ELF_DIR:= ${.PARSEDIR}
.include <src.opts.mk> .include <src.opts.mk>
PACKAGE= clibs PACKAGE= clibs
MK_PIE= no # Always position independent using local rules MK_PIE= no # Always position independent using local rules
@@ -25,16 +27,16 @@ SRCS= \
xmalloc.c \ xmalloc.c \
debug.c \ debug.c \
libmap.c libmap.c
MAN= rtld.1 MAN?= rtld.1
CSTD?= gnu99 CSTD?= gnu99
CFLAGS+= -Wall -DFREEBSD_ELF -DIN_RTLD -ffreestanding CFLAGS+= -Wall -DFREEBSD_ELF -DIN_RTLD -ffreestanding
CFLAGS+= -I${SRCTOP}/lib/csu/common CFLAGS+= -I${SRCTOP}/lib/csu/common
.if exists(${.CURDIR}/${MACHINE_ARCH}) .if exists(${RTLD_ELF_DIR}/${MACHINE_ARCH})
RTLD_ARCH= ${MACHINE_ARCH} RTLD_ARCH= ${MACHINE_ARCH}
.else .else
RTLD_ARCH= ${MACHINE_CPUARCH} RTLD_ARCH= ${MACHINE_CPUARCH}
.endif .endif
CFLAGS+= -I${.CURDIR}/${RTLD_ARCH} -I${.CURDIR} CFLAGS+= -I${RTLD_ELF_DIR}/${RTLD_ARCH} -I${RTLD_ELF_DIR}
.if ${MACHINE_ARCH} == "powerpc64" .if ${MACHINE_ARCH} == "powerpc64"
LDFLAGS+= -nostdlib -e _rtld_start LDFLAGS+= -nostdlib -e _rtld_start
.else .else
@@ -81,16 +83,16 @@ LIBADD+= compiler_rt
.if ${MK_SYMVER} == "yes" .if ${MK_SYMVER} == "yes"
VERSION_DEF= ${LIBCSRCDIR}/Versions.def VERSION_DEF= ${LIBCSRCDIR}/Versions.def
SYMBOL_MAPS= ${.CURDIR}/Symbol.map SYMBOL_MAPS= ${RTLD_ELF_DIR}/Symbol.map
VERSION_MAP= Version.map VERSION_MAP= Version.map
LDFLAGS+= -Wl,--version-script=${VERSION_MAP} LDFLAGS+= -Wl,--version-script=${VERSION_MAP}
.if exists(${.CURDIR}/${RTLD_ARCH}/Symbol.map) .if exists(${RTLD_ELF_DIR}/${RTLD_ARCH}/Symbol.map)
SYMBOL_MAPS+= ${.CURDIR}/${RTLD_ARCH}/Symbol.map SYMBOL_MAPS+= ${RTLD_ELF_DIR}/${RTLD_ARCH}/Symbol.map
.endif .endif
.endif .endif
.sinclude "${.CURDIR}/${RTLD_ARCH}/Makefile.inc" .sinclude "${RTLD_ELF_DIR}/${RTLD_ARCH}/Makefile.inc"
# Since moving rtld-elf to /libexec, we need to create a symlink. # 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. # Fixup the existing binary that's there so we can symlink over it.
@@ -99,10 +101,12 @@ beforeinstall:
-chflags -h noschg ${DESTDIR}/usr/libexec/${PROG} -chflags -h noschg ${DESTDIR}/usr/libexec/${PROG}
.endif .endif
.PATH: ${.CURDIR}/${RTLD_ARCH} .PATH: ${RTLD_ELF_DIR}/${RTLD_ARCH}
.if ${.CURDIR} == ${RTLD_ELF_DIR}
HAS_TESTS= HAS_TESTS=
SUBDIR.${MK_TESTS}+= tests SUBDIR.${MK_TESTS}+= tests
.endif
.include <bsd.prog.mk> .include <bsd.prog.mk>
${PROG_FULL}: ${VERSION_MAP} ${PROG_FULL}: ${VERSION_MAP}
+10
View File
@@ -0,0 +1,10 @@
# $FreeBSD$
NEED_COMPAT= 32
.include <bsd.compat.mk>
PROG= ld-elf32.so.1
MAN=
.PATH: ${SRCTOP}/libexec/rtld-elf
.include "${SRCTOP}/libexec/rtld-elf/Makefile"
+17 -7
View File
@@ -26,8 +26,9 @@ LIB32CPUFLAGS= -march=${COMPAT_CPUTYPE}
LIB32CPUFLAGS+= -target x86_64-unknown-freebsd13.0 LIB32CPUFLAGS+= -target x86_64-unknown-freebsd13.0
.endif .endif
LIB32CPUFLAGS+= -m32 LIB32CPUFLAGS+= -m32
LIB32WMAKEENV= MACHINE=i386 MACHINE_ARCH=i386 \ LIB32_MACHINE= i386
MACHINE_CPU="i686 mmx sse sse2" LIB32_MACHINE_ARCH= i386
LIB32WMAKEENV= MACHINE_CPU="i686 mmx sse sse2"
LIB32WMAKEFLAGS= \ LIB32WMAKEFLAGS= \
AS="${XAS} --32" \ AS="${XAS} --32" \
LD="${XLD} -m elf_i386_fbsd -L${LIBCOMPATTMP}/usr/lib32" LD="${XLD} -m elf_i386_fbsd -L${LIBCOMPATTMP}/usr/lib32"
@@ -40,7 +41,8 @@ LIB32CPUFLAGS= -mcpu=powerpc
LIB32CPUFLAGS= -mcpu=${COMPAT_CPUTYPE} LIB32CPUFLAGS= -mcpu=${COMPAT_CPUTYPE}
.endif .endif
LIB32CPUFLAGS+= -m32 LIB32CPUFLAGS+= -m32
LIB32WMAKEENV= MACHINE=powerpc MACHINE_ARCH=powerpc LIB32_MACHINE= powerpc
LIB32_MACHINE_ARCH= powerpc
LIB32WMAKEFLAGS= \ LIB32WMAKEFLAGS= \
LD="${XLD} -m elf32ppc_fbsd" LD="${XLD} -m elf32ppc_fbsd"
@@ -61,7 +63,8 @@ LIB32CPUFLAGS= -target mips-unknown-freebsd13.0
.endif .endif
.endif .endif
LIB32CPUFLAGS+= -mabi=32 LIB32CPUFLAGS+= -mabi=32
LIB32WMAKEENV= MACHINE=mips MACHINE_ARCH=mips LIB32_MACHINE= mips
LIB32_MACHINE_ARCH= mips
.if ${COMPAT_ARCH:Mmips64el*} != "" .if ${COMPAT_ARCH:Mmips64el*} != ""
LIB32WMAKEFLAGS= LD="${XLD} -m elf32ltsmip_fbsd" LIB32WMAKEFLAGS= LD="${XLD} -m elf32ltsmip_fbsd"
.else .else
@@ -82,7 +85,9 @@ LIB32WMAKEFLAGS+= -DCOMPAT_32BIT
HAS_COMPAT=SOFT HAS_COMPAT=SOFT
LIBSOFTCFLAGS= -DCOMPAT_SOFTFP LIBSOFTCFLAGS= -DCOMPAT_SOFTFP
LIBSOFTCPUFLAGS= -mfloat-abi=softfp LIBSOFTCPUFLAGS= -mfloat-abi=softfp
LIBSOFTWMAKEENV= CPUTYPE=soft MACHINE=arm MACHINE_ARCH=${COMPAT_ARCH} LIBSOFT_MACHINE= arm
LIBSOFT_MACHINE_ARCH= ${COMPAT_ARCH}
LIBSOFTWMAKEENV= CPUTYPE=soft
LIBSOFTWMAKEFLAGS= -DCOMPAT_SOFTFP LIBSOFTWMAKEFLAGS= -DCOMPAT_SOFTFP
.endif .endif
@@ -114,8 +119,8 @@ _LIBCOMPAT:= ${WANT_COMPAT}
# Generic code for each type. # Generic code for each type.
# Set defaults based on type. # Set defaults based on type.
libcompat= ${_LIBCOMPAT:tl} libcompat= ${_LIBCOMPAT:tl}
_LIBCOMPAT_MAKEVARS= _OBJTOP TMP CPUFLAGS CFLAGS CXXFLAGS WMAKEENV \ _LIBCOMPAT_MAKEVARS= _OBJTOP TMP CPUFLAGS CFLAGS CXXFLAGS \
WMAKEFLAGS WMAKE _MACHINE _MACHINE_ARCH WMAKEENV WMAKEFLAGS WMAKE
.for _var in ${_LIBCOMPAT_MAKEVARS} .for _var in ${_LIBCOMPAT_MAKEVARS}
.if !empty(LIB${_LIBCOMPAT}${_var}) .if !empty(LIB${_LIBCOMPAT}${_var})
LIBCOMPAT${_var}?= ${LIB${_LIBCOMPAT}${_var}} LIBCOMPAT${_var}?= ${LIB${_LIBCOMPAT}${_var}}
@@ -131,6 +136,9 @@ LIBCOMPATCFLAGS+= ${LIBCOMPATCPUFLAGS} \
--sysroot=${LIBCOMPATTMP} \ --sysroot=${LIBCOMPATTMP} \
${BFLAGS} ${BFLAGS}
LIBCOMPATWMAKEENV+= MACHINE=${LIBCOMPAT_MACHINE}
LIBCOMPATWMAKEENV+= MACHINE_ARCH=${LIBCOMPAT_MACHINE_ARCH}
# -B is needed to find /usr/lib32/crti.o for GCC and /usr/libsoft/crti.o for # -B is needed to find /usr/lib32/crti.o for GCC and /usr/libsoft/crti.o for
# Clang/GCC. # Clang/GCC.
LIBCOMPATCFLAGS+= -B${LIBCOMPATTMP}/usr/lib${libcompat} LIBCOMPATCFLAGS+= -B${LIBCOMPATTMP}/usr/lib${libcompat}
@@ -139,6 +147,8 @@ LIBCOMPATCFLAGS+= -B${LIBCOMPATTMP}/usr/lib${libcompat}
LIBDIR_BASE:= /usr/lib${libcompat} LIBDIR_BASE:= /usr/lib${libcompat}
_LIB_OBJTOP= ${LIBCOMPAT_OBJTOP} _LIB_OBJTOP= ${LIBCOMPAT_OBJTOP}
CFLAGS+= ${LIBCOMPATCFLAGS} CFLAGS+= ${LIBCOMPATCFLAGS}
MACHINE= ${LIBCOMPAT_MACHINE}
MACHINE_ARCH= ${LIBCOMPAT_MACHINE_ARCH}
.endif .endif
.endif .endif
+7 -1
View File
@@ -126,7 +126,6 @@ __DEFAULT_YES_OPTIONS = \
LDNS \ LDNS \
LDNS_UTILS \ LDNS_UTILS \
LEGACY_CONSOLE \ LEGACY_CONSOLE \
LIB32 \
LIBPTHREAD \ LIBPTHREAD \
LIBTHR \ LIBTHR \
LLVM_COV \ LLVM_COV \
@@ -358,6 +357,13 @@ __DEFAULT_NO_OPTIONS+=GDB_LIBEXEC
.else .else
__DEFAULT_YES_OPTIONS+=GDB_LIBEXEC __DEFAULT_YES_OPTIONS+=GDB_LIBEXEC
.endif .endif
# LIB32 is supported on amd64, mips64, and powerpc64
.if (${MACHINE_ARCH} == "amd64" || ${MACHINE_ARCH:Mmips64*} || \
${MACHINE_ARCH} == "powerpc64")
__DEFAULT_YES_OPTIONS+=LIB32
.else
BROKEN_OPTIONS+=LIB32
.endif
# Only doing soft float API stuff on armv6 and armv7 # Only doing soft float API stuff on armv6 and armv7
.if ${__T} != "armv6" && ${__T} != "armv7" .if ${__T} != "armv6" && ${__T} != "armv7"
BROKEN_OPTIONS+=LIBSOFT BROKEN_OPTIONS+=LIBSOFT
+1
View File
@@ -226,6 +226,7 @@ SUBDIR.${MK_KDUMP}+= truss
SUBDIR.${MK_KERBEROS_SUPPORT}+= compile_et SUBDIR.${MK_KERBEROS_SUPPORT}+= compile_et
SUBDIR.${MK_LDNS_UTILS}+= drill SUBDIR.${MK_LDNS_UTILS}+= drill
SUBDIR.${MK_LDNS_UTILS}+= host SUBDIR.${MK_LDNS_UTILS}+= host
SUBDIR.${MK_LIB32}+= ldd32
SUBDIR.${MK_LOCATE}+= locate SUBDIR.${MK_LOCATE}+= locate
# XXX msgs? # XXX msgs?
SUBDIR.${MK_MAIL}+= biff SUBDIR.${MK_MAIL}+= biff
+10
View File
@@ -0,0 +1,10 @@
# $FreeBSD$
NEED_COMPAT= 32
.include <bsd.compat.mk>
PROG= ldd32
MAN=
.PATH: ${SRCTOP}/usr.bin/ldd
.include "${SRCTOP}/usr.bin/ldd/Makefile"