6b7f07a1e4
This is based on a patch submitted on 16/04/2017 on tech-pkg@ and adapted by joerg@ for pkgtools/cwrappers. It only consists in the missing part to actually generate PIE executables with cwrappers if configured to do so (currently disabled by default). The aim is really to produce safer binaries where ASLR is in use. This part in pkgsrc is only supported on NetBSD (x86) with GCC at the moment. Tested on NetBSD/amd64, with and without cwrappers, with and without PKGSRC_MKPIE (all four combinations).
157 lines
5.1 KiB
Makefile
157 lines
5.1 KiB
Makefile
# $NetBSD: cwrappers.mk,v 1.29 2017/08/25 01:43:17 khorben Exp $
|
|
#
|
|
# This Makefile fragment implements integration of pkgtools/cwrappers.
|
|
|
|
.include "../../mk/wrapper/wrapper-defs.mk"
|
|
.include "../../mk/buildlink3/bsd.buildlink3.mk"
|
|
|
|
BUILD_DEPENDS+= cwrappers>=20150314:../../pkgtools/cwrappers
|
|
|
|
# XXX This should be PREFIX, but USE_CROSSBASE overrides it.
|
|
CWRAPPERS_SRC_DIR= ${LOCALBASE}/libexec/cwrappers
|
|
CWRAPPERS_CONFIG_DIR= ${WRKDIR}/.cwrapper/config
|
|
CONFIGURE_ENV+= CWRAPPERS_CONFIG_DIR=${CWRAPPERS_CONFIG_DIR}
|
|
MAKE_ENV+= CWRAPPERS_CONFIG_DIR=${CWRAPPERS_CONFIG_DIR}
|
|
ALL_ENV+= CWRAPPERS_CONFIG_DIR=${CWRAPPERS_CONFIG_DIR}
|
|
|
|
# TODO: Fix direct calls to CC and LIBTOOL to provide correct environment.
|
|
.export CWRAPPERS_CONFIG_DIR
|
|
|
|
CWRAPPERS_CONFIG.as= as
|
|
CWRAPPERS_CONFIG.cc= cc
|
|
CWRAPPERS_CONFIG.cxx= c++
|
|
CWRAPPERS_CONFIG.cpp= cpp
|
|
CWRAPPERS_CONFIG.f77= f77
|
|
CWRAPPERS_CONFIG.imake= imake
|
|
CWRAPPERS_CONFIG.ld= ld
|
|
CWRAPPERS_CONFIG.libtool= libtool
|
|
CWRAPPERS_CONFIG.shlibtool= shlibtool
|
|
|
|
CWRAPPERS_ALIASES.as= as
|
|
CWRAPPERS_ALIASES.cc= cc gcc clang
|
|
CWRAPPERS_ALIASES.cxx= c++ g++ cxx clang++
|
|
CWRAPPERS_ALIASES.cpp= cpp clang-cpp
|
|
CWRAPPERS_ALIASES.f77= f77 g77 gfortran
|
|
CWRAPPERS_ALIASES.imake= imake
|
|
CWRAPPERS_ALIASES.ld= ld
|
|
CWRAPPERS_ALIASES.libtool= libtool
|
|
CWRAPPERS_ALIASES.shlibtool= shlibtool
|
|
|
|
CWRAPPERS_WRAPPEE.as= ${AS:Ufalse}
|
|
CWRAPPERS_WRAPPEE.cxx= ${PKG_CXX:Ufalse}
|
|
CWRAPPERS_WRAPPEE.cc= ${PKG_CC:Ufalse}
|
|
CWRAPPERS_WRAPPEE.cpp= ${PKG_CPP:Ufalse}
|
|
CWRAPPERS_WRAPPEE.f77= ${PKG_FC:Ufalse}
|
|
CWRAPPERS_WRAPPEE.imake= ${TOOLS_PATH.imake:Ufalse}
|
|
CWRAPPERS_WRAPPEE.ld= ${LD:Ufalse}
|
|
CWRAPPERS_WRAPPEE.libtool= ${PKG_LIBTOOL:Ufalse}
|
|
CWRAPPERS_WRAPPEE.shlibtool= ${PKG_SHLIBTOOL:Ufalse}
|
|
|
|
# TODO: Find and fix packages depending on the implicit include path.
|
|
CWRAPPERS_APPEND.cc+= -I${PREFIX}/include
|
|
CWRAPPERS_APPEND.cxx+= -I${PREFIX}/include
|
|
CWRAPPERS_APPEND.cpp+= -I${PREFIX}/include
|
|
|
|
.if defined(USE_IMAKE) || !empty(USE_TOOLS:Mimake)
|
|
CWRAPPERS_TRANSFORM.imake+= I:${PREFIX}/lib/X11/config:${PREFIX}/lib/X11/config
|
|
CWRAPPERS_APPEND.imake+= ${IMAKEOPTS}
|
|
.endif
|
|
|
|
.PHONY: generate-cwrappers
|
|
|
|
.for _target_ in ${WRAPPER_TARGETS}
|
|
generate-cwrappers: ${_target_}
|
|
.endfor
|
|
|
|
generate-cwrappers:
|
|
.for wrappee in as cxx cc cpp f77 imake ld libtool shlibtool
|
|
${RUN}echo worklog=${WRKLOG:Q} > ${CWRAPPERS_CONFIG_DIR}/${CWRAPPERS_CONFIG.${wrappee}}
|
|
${RUN}echo wrksrc=${WRKSRC:Q} >> ${CWRAPPERS_CONFIG_DIR}/${CWRAPPERS_CONFIG.${wrappee}}
|
|
${RUN}case ${wrappee} in *libtool) ;; *) echo path=${_PATH_COMPONENTS:N${WRAPPER_BINDIR}:ts::Q} >> ${CWRAPPERS_CONFIG_DIR}/${CWRAPPERS_CONFIG.${wrappee}};; esac
|
|
${RUN}echo exec_path=${WRAPPER_BINDIR}/${CWRAPPERS_ALIASES.${wrappee}:[1]} >> ${CWRAPPERS_CONFIG_DIR}/${CWRAPPERS_CONFIG.${wrappee}}
|
|
${RUN}echo exec=${CWRAPPERS_WRAPPEE.${wrappee}:Q} >> ${CWRAPPERS_CONFIG_DIR}/${CWRAPPERS_CONFIG.${wrappee}}
|
|
. for cmd in ${WRAPPER_REORDER_CMDS}
|
|
${RUN}echo reorder=${cmd:S/^reorder://:Q} >> ${CWRAPPERS_CONFIG_DIR}/${CWRAPPERS_CONFIG.${wrappee}}
|
|
. endfor
|
|
. for cmd in ${CWRAPPERS_TRANSFORM.${wrappee}} ${_CWRAPPERS_TRANSFORM}
|
|
${RUN}echo transform=${cmd:u:Q} >> ${CWRAPPERS_CONFIG_DIR}/${CWRAPPERS_CONFIG.${wrappee}}
|
|
. endfor
|
|
. for cmd in ${CWRAPPERS_APPEND.${wrappee}:U}
|
|
${RUN}echo append=${cmd:Q} >> ${CWRAPPERS_CONFIG_DIR}/${CWRAPPERS_CONFIG.${wrappee}}
|
|
. endfor
|
|
. for cmd in ${CWRAPPERS_PREPEND.${wrappee}:U}
|
|
${RUN}echo prepend=${cmd:Q} >> ${CWRAPPERS_CONFIG_DIR}/${CWRAPPERS_CONFIG.${wrappee}}
|
|
. endfor
|
|
. for cmd in ${_CWRAPPERS_UNWRAP}
|
|
${RUN}echo unwrap=${cmd:Q} >> ${CWRAPPERS_CONFIG_DIR}/${CWRAPPERS_CONFIG.${wrappee}}
|
|
. endfor
|
|
. for alias in ${CWRAPPERS_ALIASES.${wrappee}}
|
|
${RUN}ln -s ${CWRAPPERS_SRC_DIR}/${CWRAPPERS_CONFIG.${wrappee}}-wrapper ${WRAPPER_BINDIR}/${alias}
|
|
. endfor
|
|
. if ${_PKGSRC_MKPIE} == "yes"
|
|
${RUN}echo append_executable=${_MKPIE_LDFLAGS.gcc} >> ${CWRAPPERS_CONFIG_DIR}/${CWRAPPERS_CONFIG.${wrappee}}
|
|
. endif
|
|
.endfor
|
|
|
|
PREPEND_PATH+= ${WRAPPER_BINDIR}
|
|
|
|
_COOKIE.wrapper= ${WRKDIR}/.wrapper_done
|
|
|
|
.PHONY: wrapper
|
|
.if !target(wrapper)
|
|
. if exists(${_COOKIE.wrapper})
|
|
wrapper:
|
|
@${DO_NADA}
|
|
. elif defined(_PKGSRC_BARRIER)
|
|
wrapper: check-vulnerable patch acquire-wrapper-lock ${_COOKIE.wrapper} release-wrapper-lock
|
|
. else
|
|
wrapper: barrier
|
|
. endif
|
|
.endif
|
|
|
|
.PHONY: acquire-wrapper-lock release-wrapper-lock
|
|
acquire-wrapper-lock: acquire-lock
|
|
release-wrapper-lock: release-lock
|
|
|
|
.if exists(${_COOKIE.wrapper})
|
|
${_COOKIE.wrapper}:
|
|
@${DO_NADA}
|
|
.else
|
|
${_COOKIE.wrapper}: real-wrapper
|
|
.endif
|
|
|
|
.PHONY: real-wrapper
|
|
real-wrapper: wrapper-message wrapper-dirs wrapper-vars pre-wrapper do-wrapper post-wrapper wrapper-cookie error-check
|
|
|
|
.PHONY: wrapper-message
|
|
wrapper-message:
|
|
@${PHASE_MSG} "Creating toolchain wrappers for ${PKGNAME}"
|
|
|
|
.PHONY: wrapper-dirs
|
|
wrapper-dirs:
|
|
${RUN}${MKDIR} ${CWRAPPERS_CONFIG_DIR} ${WRAPPER_BINDIR}
|
|
|
|
.PHONY: pre-wrapper do-wrapper post-wrapper
|
|
|
|
do-wrapper: generate-cwrappers
|
|
|
|
.if !target(do-wrapper)
|
|
do-wrapper:
|
|
@${DO_NADA}
|
|
.endif
|
|
|
|
.if !target(pre-wrapper)
|
|
pre-wrapper:
|
|
@${DO_NADA}
|
|
.endif
|
|
|
|
.if !target(post-wrapper)
|
|
post-wrapper:
|
|
@${DO_NADA}
|
|
.endif
|
|
|
|
.PHONY: wrapper-cookie
|
|
wrapper-cookie:
|
|
${RUN} [ ! -f ${_COOKIE.wrapper} ]
|
|
${RUN} ${MKDIR} ${_COOKIE.wrapper:H}
|
|
${RUN} ${ECHO} ${PKGNAME} > ${_COOKIE.wrapper}
|