From 2b9f6e89d67b342593734d14f328625848fa5156 Mon Sep 17 00:00:00 2001 From: Tom de Vries Date: Sun, 16 Jun 2019 23:57:17 +0200 Subject: [gdb/contrib] Fix gdb/contrib/gdb-add-index.sh for dwz-m-ed execs Atm gdb-add-index.exp fails with target board cc-with-dwz-m. Fix this by updating gdb/contrib/gdb-add-index.sh to handle a dwz-m-ed executable. Tested on x86_64-linux. gdb/ChangeLog: 2019-06-16 Tom de Vries PR gdb/24445 * contrib/gdb-add-index.sh: Update to handle dwz-m-ed executable. --- gdb/ChangeLog | 5 ++ gdb/contrib/gdb-add-index.sh | 138 ++++++++++++++++++++++++++++--------------- 2 files changed, 96 insertions(+), 47 deletions(-) (limited to 'gdb') diff --git a/gdb/ChangeLog b/gdb/ChangeLog index cfc8e3d..51748a8 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2019-06-16 Tom de Vries + + PR gdb/24445 + * contrib/gdb-add-index.sh: Update to handle dwz-m-ed executable. + 2019-06-16 Tom Tromey * tui/tui-wingeneral.c (tui_unhighlight_win, tui_highlight_win) diff --git a/gdb/contrib/gdb-add-index.sh b/gdb/contrib/gdb-add-index.sh index efaad1d..5a37020 100755 --- a/gdb/contrib/gdb-add-index.sh +++ b/gdb/contrib/gdb-add-index.sh @@ -20,6 +20,7 @@ # If not, or you want others, pass the following in the environment GDB=${GDB:=gdb} OBJCOPY=${OBJCOPY:=objcopy} +READELF=${READELF:=readelf} myname="${0##*/}" @@ -43,15 +44,44 @@ fi dir="${file%/*}" test "$dir" = "$file" && dir="." -index4="${file}.gdb-index" -index5="${file}.debug_names" -debugstr="${file}.debug_str" -debugstrmerge="${file}.debug_str.merge" -debugstrerr="${file}.debug_str.err" -rm -f $index4 $index5 $debugstr $debugstrmerge $debugstrerr +dwz_file="" +if $READELF -S "$file" | grep -q " \.gnu_debugaltlink "; then + dwz_file=$($READELF --string-dump=.gnu_debugaltlink "$file" \ + | grep -A1 "'\.gnu_debugaltlink':" \ + | tail -n +2 \ + | sed 's/.*]//') + dwz_file=$(echo $dwz_file) + if $READELF -S "$dwz_file" | grep -E -q " \.(gdb_index|debug_names) "; then + # Already has an index, skip it. + dwz_file="" + fi +fi + +set_files () +{ + local file="$1" + + index4="${file}.gdb-index" + index5="${file}.debug_names" + debugstr="${file}.debug_str" + debugstrmerge="${file}.debug_str.merge" + debugstrerr="${file}.debug_str.err" +} + +tmp_files= +for f in "$file" "$dwz_file"; do + if [ "$f" = "" ]; then + continue + fi + set_files "$f" + tmp_files="$tmp_files $index4 $index5 $debugstr $debugstrmerge $debugstrerr" +done + +rm -f $tmp_files + # Ensure intermediate index file is removed when we exit. -trap "rm -f $index4 $index5 $debugstr $debugstrmerge $debugstrerr" 0 +trap "rm -f $tmp_files" 0 $GDB --batch -nx -iex 'set auto-load no' \ -ex "file $file" -ex "save gdb-index $dwarf5 $dir" || { @@ -67,50 +97,64 @@ $GDB --batch -nx -iex 'set auto-load no' \ # already stripped binary, it's a no-op. status=0 -if test -f "$index4" -a -f "$index5"; then - echo "$myname: Both index types were created for $file" 1>&2 - status=1 -elif test -f "$index4" -o -f "$index5"; then - if test -f "$index4"; then - index="$index4" - section=".gdb_index" - else - index="$index5" - section=".debug_names" - fi - debugstradd=false - debugstrupdate=false - if test -s "$debugstr"; then - if ! $OBJCOPY --dump-section .debug_str="$debugstrmerge" "$file" /dev/null \ - 2>$debugstrerr; then - cat >&2 $debugstrerr - exit 1 - fi - if grep -q "can't dump section '.debug_str' - it does not exist" \ - $debugstrerr; then - debugstradd=true +handle_file () +{ + local file + file="$1" + + set_files "$file" + + if test -f "$index4" -a -f "$index5"; then + echo "$myname: Both index types were created for $file" 1>&2 + status=1 + elif test -f "$index4" -o -f "$index5"; then + if test -f "$index4"; then + index="$index4" + section=".gdb_index" else - debugstrupdate=true - cat >&2 $debugstrerr + index="$index5" + section=".debug_names" + fi + debugstradd=false + debugstrupdate=false + if test -s "$debugstr"; then + if ! $OBJCOPY --dump-section .debug_str="$debugstrmerge" "$file" \ + /dev/null 2>$debugstrerr; then + cat >&2 $debugstrerr + exit 1 + fi + if grep -q "can't dump section '.debug_str' - it does not exist" \ + $debugstrerr; then + debugstradd=true + else + debugstrupdate=true + cat >&2 $debugstrerr + fi + cat "$debugstr" >>"$debugstrmerge" fi - cat "$debugstr" >>"$debugstrmerge" - fi - $OBJCOPY --add-section $section="$index" \ - --set-section-flags $section=readonly \ - $(if $debugstradd; then \ - echo --add-section .debug_str="$debugstrmerge"; \ - echo --set-section-flags .debug_str=readonly; \ - fi; \ - if $debugstrupdate; then \ - echo --update-section .debug_str="$debugstrmerge"; \ - fi) \ - "$file" "$file" + $OBJCOPY --add-section $section="$index" \ + --set-section-flags $section=readonly \ + $(if $debugstradd; then \ + echo --add-section .debug_str="$debugstrmerge"; \ + echo --set-section-flags .debug_str=readonly; \ + fi; \ + if $debugstrupdate; then \ + echo --update-section .debug_str="$debugstrmerge"; \ + fi) \ + "$file" "$file" + + status=$? + else + echo "$myname: No index was created for $file" 1>&2 + echo "$myname: [Was there no debuginfo? Was there already an index?]" \ + 1>&2 + fi +} - status=$? -else - echo "$myname: No index was created for $file" 1>&2 - echo "$myname: [Was there no debuginfo? Was there already an index?]" 1>&2 +handle_file "$file" +if [ "$dwz_file" != "" ]; then + handle_file "$dwz_file" fi exit $status -- cgit v1.1