Files
graphene/Runtime/pal_loader
Paweł Marczewski 5ef9bdc861 [Pal] Unify debug maps
- Use the same mechanism (debug_map) in Pal/Linux and Pal/Linux-SGX.
  Previously, Pal/Linux emulated the _r_debug structure, normally
  maintained by ld.so, but that cannot be done in SGX outer PAL,
  because it's loaded by ld.so already.
- Maintain the debug maps outside of SGX enclave. This allows
  initializing them before enclave start, and potentially makes
  them easier to use.
- Initialize PAL debug map before enclave start. Previously, this
  was done from inside the enclave, so you couldn't set a
  breakpoint too early (e.g. in pal_linux_main).
- Store only load address, without list of sections. This is to
  avoid parsing the list of sections just to report them to the
  debugger. Unfortunately, the GDB version that we support still
  needs these sections, but we can retrieve them in GDB plugin.
- Move Python GDB code related to debug maps to a common file.
2021-01-18 03:49:18 +01:00

123 lines
3.4 KiB
Bash
Executable File

#!/usr/bin/env bash
# SPDX-License-Identifier: LGPL-3.0-or-later */
# Copyright (C) 2014 Stony Brook University
# Copyright (C) 2019 Invisible Things Lab
# Copyright (C) 2020 Intel Corporation
# Michał Kowalczyk <mkow@invisiblethingslab.com>
# Wojtek Porczyk <woju@invisiblethingslab.com>
# This is how we detect whether we're installed or running from inside git repo.
# If unchanged (i.e., if this reads IN_GIT between "at" characters), this is an
# ordinary string and test -n "$IN_GIT" is true. But when installing, this is
# rewritten using meson's configure_file() function to an empty string and the
# else branch is taken. See also: ./meson.build and
# https://mesonbuild.com/Reference-manual.html#configure_file.
IN_GIT=@IN_GIT@
if test -n "$IN_GIT"
then
while :
do
case "$1" in
"SGX")
SGX=1
export SGX
;;
"GDB")
GDB=1
;;
*)
break
;;
esac
shift
done
RUNTIME_DIR=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")
if [ -z "$PAL_HOST" ]; then
if ! command -v make >/dev/null; then
libpal="$RUNTIME_DIR/libpal-*.so"
libpal="$(echo -n "$libpal")"
libpal="${libpal//$RUNTIME_DIR\//}"
if [ "$libpal" = 'libpal-*.so' ]; then
echo "Unable to detect PAL_HOST. Please install the make program."
exit 1
fi
array=("$libpal")
if [ ${#array[@]} -ne 1 ]; then
echo "Multiple libpal detected ($libpal). Please explicitly set the environment variable PAL_HOST."
exit 1
fi
PAL_HOST="${libpal%.so}"
PAL_HOST="${PAL_HOST#libpal-}"
else
PAL_HOST=$(make --no-print-directory --quiet -f "$RUNTIME_DIR/../Scripts/Makefile.configs" print_host 2>&1)
fi
fi
PAL_CMD="$RUNTIME_DIR/pal-$PAL_HOST"
LIBPAL_PATH=$(realpath "$RUNTIME_DIR/libpal-$PAL_HOST.so")
HOST_PAL_PATH=$(realpath "$RUNTIME_DIR/../Pal/src/host/$PAL_HOST")
else
PAL_CMD=@PAL_CMD@
LIBPAL_PATH=@LIBPAL_PATH@
HOST_PAL_PATH=@HOST_PAL_PATH@
SGX=@SGX@
fi
MANIFEST=
ENVS=()
PREFIX=()
if [ "$GDB" == "1" ]; then
PREFIX=("gdb" "-q")
if [ -n "$INSIDE_EMACS" ]; then
PREFIX+=("-i=mi")
fi
if [ 0"$SGX" -gt 0 ]; then
PREFIX+=("-x" "$HOST_PAL_PATH/gdb_integration/debug_map_gdb.py")
PREFIX+=("-x" "$HOST_PAL_PATH/gdb_integration/graphene_sgx_gdb.py")
ENVS+=("LD_PRELOAD=$HOST_PAL_PATH/gdb_integration/sgx_gdb.so:$LD_PRELOAD")
else
PREFIX+=("-x" "$HOST_PAL_PATH/gdb_integration/debug_map_gdb.py")
PREFIX+=("-x" "$HOST_PAL_PATH/gdb_integration/graphene_gdb.py")
fi
if [ "$GDB_SCRIPT" != "" ]; then
# Run a script in batch mode, and without TTY (so that it can be piped, redirected etc.)
PREFIX+=("-x" "$GDB_SCRIPT" "-batch" "-tty=/dev/null")
fi
PREFIX+=("--args")
fi
if [ "$PERF" == "1" ]; then
PREFIX=(perf stat)
fi
while [ "$1" != "" ];
do
if [ "$MANIFEST" == "" ]; then
MANIFEST=$1
shift
continue
fi
break
done
if [ "$MANIFEST" == "" ]; then
echo "Usage: $0 [<application>] <args>..."
exit 1
fi
if [ ! -f "$PAL_CMD" ]; then
echo "$PAL_CMD not found"
exit 1
fi
CMD=("${ENVS[@]}")
CMD+=("${PREFIX[@]}")
CMD+=("$PAL_CMD" "$LIBPAL_PATH" init "$MANIFEST" "$@")
exec env "${CMD[@]}"