mirror of
https://github.com/flatcar/scripts.git
synced 2025-08-12 15:36:58 +02:00
Dynamically use the 32-bit dump_syms for files when needed
'dump_syms' was recently changed to be built 64-bit, with a 32-bit version available as 'dump_syms.32'. This change makes use of the 32b dump_syms if a file is built 32b. For almost all targets nowadays, we should only see 64b files, but things like the installer can still be 32b. Also see https://gerrit.chromium.org/gerrit/14835. BUG=chromium-os:22778 TEST=Ran cros_generate_breakpad_symbols on 32/64-bit executables CQ-DEPEND=I6551fe22fb0caebd3584f76f95a543e9a91b7e1b Change-Id: I780c20eeb745a919dbe130cf3cede7ec5ca6483a Reviewed-on: https://gerrit.chromium.org/gerrit/18569 Commit-Ready: Michael Krebs <mkrebs@chromium.org> Tested-by: Michael Krebs <mkrebs@chromium.org> Reviewed-by: David James <davidjames@chromium.org>
This commit is contained in:
parent
c03f260bb2
commit
7515d89be7
@ -23,6 +23,9 @@ DEFINE_string minidump_symbol_root "" \
|
|||||||
"Symbol root (defaults to /usr/lib/debug/breakpad for board)"
|
"Symbol root (defaults to /usr/lib/debug/breakpad for board)"
|
||||||
DEFINE_boolean verbose ${FLAGS_FALSE} "Be verbose."
|
DEFINE_boolean verbose ${FLAGS_FALSE} "Be verbose."
|
||||||
|
|
||||||
|
DUMP_SYMS="dump_syms"
|
||||||
|
DUMP_SYMS32="dump_syms.32"
|
||||||
|
|
||||||
CUMULATIVE_SIZE=0
|
CUMULATIVE_SIZE=0
|
||||||
ANY_ERRORS=0
|
ANY_ERRORS=0
|
||||||
|
|
||||||
@ -49,28 +52,10 @@ function get_debug_for_text() {
|
|||||||
echo ${debug_path}
|
echo ${debug_path}
|
||||||
}
|
}
|
||||||
|
|
||||||
# Returns true if the file given is a 64-bit ELF file.
|
# Returns true if the file given is a 32-bit ELF file.
|
||||||
function is_64b_elf() {
|
function is_32b_elf() {
|
||||||
local elf="$1"
|
local elf="$1"
|
||||||
file "${elf}" | grep -q "ELF 64-bit"
|
file "${elf}" | grep -q "ELF 32-bit"
|
||||||
}
|
|
||||||
|
|
||||||
# Verify the file given is an ELF file that dump_syms can handle. A 32-bit
|
|
||||||
# dump_syms cannot dump a 64-bit ELF file, and vice versa.
|
|
||||||
function verify_not_mismatched_elf() {
|
|
||||||
local elf="$1"
|
|
||||||
if [ ${DUMP_SYMS_IS_64BIT} -ne 0 ]; then
|
|
||||||
if ! is_64b_elf "${elf}"; then
|
|
||||||
warn "Not dumping symbols for file ${elf} because it is not 64-bit"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
if is_64b_elf "${elf}"; then
|
|
||||||
warn "Not dumping symbols for file ${elf} because it is 64-bit"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
return 0
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Dump given debug and text file. Returns 1 if any errors, even
|
# Dump given debug and text file. Returns 1 if any errors, even
|
||||||
@ -80,14 +65,18 @@ function dump_file() {
|
|||||||
local debug_file="$1"
|
local debug_file="$1"
|
||||||
local text_file="$2"
|
local text_file="$2"
|
||||||
local debug_directory="$(dirname "${debug_file}")"
|
local debug_directory="$(dirname "${debug_file}")"
|
||||||
# 32-bit dump_syms cannot dump a 64-bit ELF file, and vice versa
|
local dump_syms_prog="${DUMP_SYMS}"
|
||||||
verify_not_mismatched_elf "${text_file}" || return 1
|
# 32-bit dump_syms must be used to dump a 32-bit ELF file
|
||||||
|
if is_32b_elf "${text_file}"; then
|
||||||
|
dump_syms_prog="${DUMP_SYMS32}"
|
||||||
|
info "Using ${dump_syms_prog} for 32-bit file ${text_file}"
|
||||||
|
fi
|
||||||
# Dump symbols as root in order to read all files.
|
# Dump symbols as root in order to read all files.
|
||||||
if ! sudo "${DUMP_SYMS}" "${text_file}" "${debug_directory}" > "${SYM_FILE}" \
|
if ! sudo "${dump_syms_prog}" "${text_file}" "${debug_directory}" \
|
||||||
2> "${ERR_FILE}"; then
|
> "${SYM_FILE}" 2> "${ERR_FILE}"; then
|
||||||
# Try dumping just the main file to get public-only symbols.
|
# Try dumping just the main file to get public-only symbols.
|
||||||
if ! sudo "${DUMP_SYMS}" "${text_file}" > "${SYM_FILE}" 2> "${ERR_FILE}";
|
if ! sudo "${dump_syms_prog}" "${text_file}" > "${SYM_FILE}" \
|
||||||
then
|
2> "${ERR_FILE}"; then
|
||||||
# A lot of files (like kernel files) contain no debug information, do
|
# A lot of files (like kernel files) contain no debug information, do
|
||||||
# not consider such occurrences as errors.
|
# not consider such occurrences as errors.
|
||||||
if grep -q "file contains no debugging information" "${ERR_FILE}"; then
|
if grep -q "file contains no debugging information" "${ERR_FILE}"; then
|
||||||
@ -145,6 +134,10 @@ function process_file() {
|
|||||||
# Allow files to not exist, for instance if they are in the INSTALL_MASK.
|
# Allow files to not exist, for instance if they are in the INSTALL_MASK.
|
||||||
warn "Binary does not exist: ${text_file}"
|
warn "Binary does not exist: ${text_file}"
|
||||||
return 0
|
return 0
|
||||||
|
elif [ ! -r "${text_file}" ]; then
|
||||||
|
# Allow files to not be readable, for instance setuid programs like passwd
|
||||||
|
warn "Binary is not readable: ${text_file}"
|
||||||
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
dump_file "${debug_file}" "${text_file}"
|
dump_file "${debug_file}" "${text_file}"
|
||||||
@ -162,19 +155,6 @@ function main() {
|
|||||||
|
|
||||||
[ -n "$FLAGS_board" ] || die "--board is required."
|
[ -n "$FLAGS_board" ] || die "--board is required."
|
||||||
|
|
||||||
case "$(portageq-${FLAGS_board} envvar ARCH)" in
|
|
||||||
amd64)
|
|
||||||
echo "Detected amd64 board.."
|
|
||||||
DUMP_SYMS="/build/${FLAGS_board}/usr/bin/dump_syms"
|
|
||||||
DUMP_SYMS_IS_64BIT=1
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
DUMP_SYMS="dump_syms"
|
|
||||||
DUMP_SYMS_IS_64BIT=0
|
|
||||||
esac
|
|
||||||
|
|
||||||
echo "Using dump_sys: $DUMP_SYMS"
|
|
||||||
|
|
||||||
SYSROOT="/build/${FLAGS_board}"
|
SYSROOT="/build/${FLAGS_board}"
|
||||||
|
|
||||||
if [[ -z "${FLAGS_minidump_symbol_root}" ]]; then
|
if [[ -z "${FLAGS_minidump_symbol_root}" ]]; then
|
||||||
|
Loading…
Reference in New Issue
Block a user