mirror of
https://github.com/clearlinux/graphene.git
synced 2026-09-06 22:01:29 +00:00
- 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.
123 lines
3.4 KiB
Bash
Executable File
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[@]}"
|