| #!/bin/bash |
| |
| # Copyright 2019 The ChromiumOS Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| # |
| # A tool that can be passed in passed in as the strip command to the |
| # Linux kernel which will create split debug files and stash them away |
| # where portage expects them. |
| |
| die() { |
| if [[ "$#" -ge 1 ]]; then |
| echo "$@" >&2 |
| fi |
| |
| exit 1 |
| } |
| |
| main() { |
| local magic="$1" |
| local obj_file_abspath="$2" |
| local obj_file_relpath="${obj_file_abspath#${INSTALL_MOD_PATH}}" |
| local debug_file_relpath="usr/lib/debug/${obj_file_relpath}.debug" |
| local debug_file_abspath="${INSTALL_MOD_PATH}/${debug_file_relpath}" |
| |
| # We explicitly tell the kernel to pass us the argument "magic" so |
| # that we can predictably know that the object file to strip is in $2. |
| # Though right now the kernel's default flags still would have had the |
| # object file in $2 (the kernel by default passes in --strip-debug), |
| # it seems better not to rely upon that. |
| if [[ "${magic}" != "magic" ]]; then |
| die "Unexpected call to $0" |
| fi |
| |
| # If the kernel is calling strip on something that's not in the |
| # module directory then we don't do our magic. Detect this by seeing |
| # that we couldn't strip INSTALL_MOD_PATH from the start of the path. |
| # |
| # NOTE: we don't actually see this in practice since we only |
| # specify this script when building modules, but better safe |
| # than sorry. |
| if [[ "${obj_file_abspath}" == "${obj_file_relpath}" ]]; then |
| exec ${REAL_STRIP} --strip-debug "${obj_file_abspath}" |
| fi |
| |
| # Follow the recipe from the objcopy man page to split the debug. |
| mkdir -p "${debug_file_abspath%/*}" |
| ${OBJCOPY} --only-keep-debug \ |
| "${obj_file_abspath}" "${debug_file_abspath}" || die |
| ${REAL_STRIP} --strip-debug "${obj_file_abspath}" || die |
| ${OBJCOPY} --add-gnu-debuglink=${debug_file_abspath} \ |
| "${obj_file_abspath}" || die |
| } |
| |
| main "$@" |