| #!/bin/bash |
| |
| # Copyright (c) 2011 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| # Debug a 32 bit binary on 64 bit linux. |
| |
| . /usr/lib/crosutils/common.sh || exit 1 |
| |
| # Command line options |
| DEFINE_string board "${DEFAULT_BOARD}" "The board to debug for." |
| DEFINE_string sysroot "" "Where your target binaries are." |
| DEFINE_string debug_file_dir "" "Where your split-out debug symbols are." |
| |
| # Parse command line and update positional args |
| FLAGS "$@" || exit 1 |
| eval set -- "${FLAGS_ARGV}" |
| |
| # Die on any errors |
| set -e |
| |
| if [[ -z "${FLAGS_board}" ]]; then |
| die "Error: --board is required." |
| fi |
| |
| if [ $# -gt 2 -o $# -lt 1 ]; then |
| die "usage $0 [flags] file [core]" |
| fi |
| |
| if [[ -n "${2}" ]]; then |
| CORE_CMD="core ${2}" |
| fi |
| |
| if [[ -z "${FLAGS_sysroot}" ]]; then |
| SYSROOT="/build/${FLAGS_board}" |
| BOARDROOT="${SYSROOT}" |
| else |
| SYSROOT="${FLAGS_sysroot}" |
| BOARDROOT="/build/${FLAGS_board}" |
| fi |
| if [[ -z "${FLAGS_debug_file_dir}" ]]; then |
| DEBUG_FILE_DIR="${SYSROOT}/usr/lib/debug/" |
| else |
| DEBUG_FILE_DIR="${FLAGS_debug_file_dir}" |
| DEBUG_FILE="${DEBUG_FILE_DIR}${1#${SYSROOT}}.debug" |
| if [[ -f "${DEBUG_FILE}" ]]; then |
| DEBUG_FILE_CMD="symbol-file -readnow ${DEBUG_FILE}" |
| fi |
| fi |
| GDB="${BOARDROOT}/usr/bin/gdb" |
| |
| # Use awk to pull the lib paths out of the board's /etc/ld.so.conf |
| LIB_PATHS=$(awk -v b="${BOARDROOT}" '$1 !~ /^#/ { p=p":"b$0 } \ |
| END{print substr(p,2)}' \ |
| "${BOARDROOT}/etc/ld.so.conf") |
| |
| export LD_LIBRARY_PATH="${LIB_PATHS}" |
| |
| # Using --exec, --core, etc makes gdb parse those files before the other |
| # settings take effect, causing the user to have to re-import them in order |
| # for the correct debug symbols to get used. |
| exec $GDB \ |
| --eval-command "set sysroot ${SYSROOT}" \ |
| --eval-command "set debug-file-directory ${DEBUG_FILE_DIR}" \ |
| --eval-command "set prompt (cros-gdb) " \ |
| --eval-command "${DEBUG_FILE_CMD}" \ |
| --eval-command "file ${1}" \ |
| --eval-command "${CORE_CMD}" |