Home | History | Annotate | Download | only in build
      1 #!/bin/bash
      2 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
      3 # Use of this source code is governed by a BSD-style license that can be
      4 # found in the LICENSE file.
      5 #
      6 # Saves the gdb index for a given binary and its shared library dependencies.
      7 
      8 set -e
      9 
     10 if [[ ! $# == 1 ]]; then
     11   echo "Usage: $0 path-to-binary"
     12   exit 1
     13 fi
     14 
     15 FILENAME="$1"
     16 if [[ ! -f "$FILENAME" ]]; then
     17   echo "Path $FILENAME does not exist."
     18   exit 1
     19 fi
     20 
     21 # We're good to go! Create temp directory for index files.
     22 DIRECTORY=$(mktemp -d)
     23 echo "Made temp directory $DIRECTORY."
     24 
     25 # Always remove directory on exit.
     26 trap "{ echo -n Removing temp directory $DIRECTORY...;
     27   rm -rf $DIRECTORY; echo done; }" EXIT
     28 
     29 # Grab all the chromium shared library files.
     30 so_files=$(ldd "$FILENAME" 2>/dev/null \
     31   | grep $(dirname "$FILENAME") \
     32   | sed "s/.*[ \t]\(.*\) (.*/\1/")
     33 
     34 # Add index to binary and the shared library dependencies.
     35 for file in "$FILENAME" $so_files; do
     36   basename=$(basename "$file")
     37   echo -n "Adding index to $basename..."
     38   readelf_out=$(readelf -S "$file")
     39   if [[ $readelf_out =~ "gdb_index" ]]; then
     40     echo "already contains index. Skipped."
     41   else
     42     gdb -batch "$file" -ex "save gdb-index $DIRECTORY" -ex "quit"
     43     objcopy --add-section .gdb_index="$DIRECTORY"/$basename.gdb-index \
     44       --set-section-flags .gdb_index=readonly "$file" "$file"
     45     echo "done."
     46   fi
     47 done
     48