Currently for the MFS, firmware and VDSO template assembly files we pass the path to include with .incbin unquoted and use __XSTRING within the assembly file to stringify it. However, __XSTRING doesn't just perform a single level of expansion, it performs the normal full expansion of the macro, and so if the path itself happens to tokenise to something that includes a defined macro in it that will itself be substituted. For example, with #define MACRO 1, a path like /path/containing/MACRO/in/it will expand to /path/containing/1/in/it and then, when stringified, end up as "/path/containing/1/in/it", not the intended string. Normally, macros have names that start or end witih underscores and are unlikely to appear in a tokenised path (even if technically they could), but now that we've switched to GNU C as of commitec41a96daa
("sys: Switch the kernel's C standard from C99 to GNU99.") there are a few new macros defined which don't start or end with underscores: unix, which is always defined to 1, and i386, which is defined to 1 on i386. The former probably doesn't appear in user paths in practice, but the latter has been seen to and is likely quite common in the wild. Fix this by defining the macro pre-quoted instead of using __XSTRING. Note that technically we don't need to do this for vdso_wrap.S today as all the paths passed to it are safe file names with no user-controlled prefix but we should do it anyway for consistency and robustness against future changes. This allows make tinderbox to pass when built with source and object directories inside ~/path-with-unix, which would otherwise expand to ~/path-with-1 and break. PR: 272744 Fixes:ec41a96daa
("sys: Switch the kernel's C standard from C99 to GNU99.")
73 lines
2.9 KiB
Bash
73 lines
2.9 KiB
Bash
#!/bin/sh
|
|
# SPDX-License-Identifier: BSD-2-Clause
|
|
#
|
|
# Copyright (c) 2021 The FreeBSD Foundation
|
|
# All rights reserved.
|
|
#
|
|
# This software was developed by Konstantin Belousov <kib@FreeBSD.org>
|
|
# under sponsorship from the FreeBSD Foundation.
|
|
#
|
|
# Redistribution and use in source and binary forms, with or without
|
|
# modification, are permitted provided that the following conditions
|
|
# are met:
|
|
# 1. Redistributions of source code must retain the above copyright
|
|
# notice, this list of conditions and the following disclaimer.
|
|
# 2. Redistributions in binary form must reproduce the above copyright
|
|
# notice, this list of conditions and the following disclaimer in the
|
|
# documentation and/or other materials provided with the distribution.
|
|
#
|
|
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
# SUCH DAMAGE.
|
|
|
|
set -e
|
|
|
|
${CC} -x assembler-with-cpp -DLOCORE -fPIC -nostdinc -c \
|
|
-o sigtramp.pico -I. -I"${S}" -include opt_global.h \
|
|
"${S}"/amd64/amd64/sigtramp.S
|
|
|
|
# We need to make vdso as compact as possible, for it to leave space
|
|
# for other things in the shared page. For this, we pack everything
|
|
# into single loadable segment.
|
|
#
|
|
# -z rodynamic is undocumented lld-specific option, seemingly required
|
|
# for lld to avoid putting dynamic into dedicated writeable segment,
|
|
# despite ldscript placement. It is ignored by ld.bfd but ldscript
|
|
# alone is enough there.
|
|
#
|
|
${LD} --shared -Bsymbolic -soname="elf-vdso.so.1" \
|
|
-T "${S}"/conf/vdso_amd64.ldscript \
|
|
--eh-frame-hdr --no-undefined -z rodynamic -z norelro -nmagic \
|
|
--hash-style=sysv --fatal-warnings --strip-all \
|
|
-o elf-vdso.so.1 sigtramp.pico
|
|
|
|
if [ "$(wc -c elf-vdso.so.1 | ${AWK} '{print $1}')" -gt 2048 ]
|
|
then
|
|
echo "elf-vdso.so.1 too large" 1>&2
|
|
exit 1
|
|
fi
|
|
|
|
if [ -n "$(${ELFDUMP} -d elf-vdso.so.1 | \
|
|
${AWK} '/DT_REL.*SZ/{print "RELOCS"}')" ]
|
|
then
|
|
echo "elf-vdso.so.1 contains runtime relocations" 1>&2
|
|
exit 1
|
|
fi
|
|
|
|
${CC} ${DEBUG} -x assembler-with-cpp -DLOCORE -fPIC -nostdinc -c \
|
|
-o elf-vdso.so.o -I. -I"${S}" -include opt_global.h \
|
|
-DVDSO_NAME=elf_vdso_so_1 -DVDSO_FILE=\"elf-vdso.so.1\" \
|
|
"${S}"/tools/vdso_wrap.S
|
|
|
|
${NM} -D elf-vdso.so.1 | \
|
|
${AWK} '/__vdso_sigcode/{printf "#define VDSO_SIGCODE_OFFSET 0x%s\n",$1}' \
|
|
>vdso_offsets.h
|