Home | History | Annotate | Line # | Download | only in contrib
      1 #! /bin/sh
      2 
      3 # Compare copies of two given object files.
      4 
      5 # Copyright (C) 2007-2024 Free Software Foundation, Inc.
      6 # Originally by Alexandre Oliva <aoliva (at] redhat.com>
      7 # Modified for LTO bootstrap by Richard Biener <rguenther (at] suse.de>
      8 
      9 # This file is part of GCC.
     10 
     11 # GCC is free software; you can redistribute it and/or modify it under
     12 # the terms of the GNU General Public License as published by the Free
     13 # Software Foundation; either version 3, or (at your option) any later
     14 # version.
     15 
     16 # GCC is distributed in the hope that it will be useful, but WITHOUT
     17 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     18 # or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
     19 # License for more details.
     20 
     21 # You should have received a copy of the GNU General Public License
     22 # along with GCC; see the file COPYING3.  If not see
     23 # <http://www.gnu.org/licenses/>.
     24 
     25 rm='rm -f'
     26 
     27 case $1 in
     28 -p | --preserve)
     29   rm='echo preserving'
     30   shift
     31   ;;
     32 esac
     33 
     34 if test $# != 2; then
     35   echo 'usage: compare-lto file1 file2' >&2
     36   exit 1
     37 fi
     38 
     39 if test ! -f "$1"; then
     40   echo "$1" does not exist >&2
     41   exit 1
     42 fi
     43 
     44 if test ! -f "$2"; then
     45   echo "$2" does not exist >&2
     46   exit 1
     47 fi
     48 
     49 suf1=stripped
     50 while test -f "$1.$suf1"; do
     51   suf1=$suf1.
     52 done
     53 
     54 suf2=stripped
     55 while test -f "$2.$suf2"; do
     56   suf2=$suf2.
     57 done
     58 
     59 trap 'rm -f "$1.$suf1" "$2.$suf2"' 0 1 2 15
     60 
     61 if cmp "$1" "$2"; then
     62   status=0
     63 else
     64   status=1
     65 
     66   cmd=
     67   for t in objdump readelf eu-readelf; do
     68     if ($t --help) 2>&1 | grep ' --\[*section-\]*headers' > /dev/null; then
     69       cmd=$t
     70       break
     71     fi
     72   done
     73 
     74   # If there are LTO option sections, try to strip them off.
     75   if test "x$cmd" = "x" ||
     76      $cmd --section-headers "$1" | grep '.gnu.lto_.opts' > /dev/null ||
     77      $cmd --section-headers "$2" | grep '.gnu.lto_.opts' > /dev/null ; then
     78 
     79     echo stripping off LTO option section, then retrying >&2
     80 
     81     seclist=".gnu.lto_.opts"
     82     rsopts=`for sec in $seclist; do echo " --remove-section $sec"; done`
     83 
     84     if (objcopy -v) 2>&1 | grep ' --remove-section' > /dev/null; then
     85       objcopy $rsopts "$1" "$1.$suf1"
     86       objcopy $rsopts "$2" "$2.$suf2"
     87     elif (strip --help) 2>&1 | grep ' --remove-section' > /dev/null; then
     88       cp "$1" "$1.$suf1"
     89       strip $rsopts "$1.$suf1"
     90 
     91       cp "$2" "$2.$suf2"
     92       strip $rsopts "$2.$suf2"
     93     else
     94       echo failed to strip off LTO option section >&2
     95     fi
     96 
     97     trap 'rm -f "$1.$suf1" "$2.$suf2"' 0 1 2 15
     98 
     99     if cmp "$1.$suf1" "$2.$suf2"; then
    100       status=0
    101     else
    102       status=1
    103     fi
    104 
    105   # PE-COFF executables are timestamped so skip leading bytes for them.
    106   else
    107     case "$1" in
    108       *.exe)
    109         if cmp -i 256 "$1" "$2"; then
    110           status=0
    111         else
    112           status=1
    113         fi
    114         ;;
    115       *)
    116         if test -f "$1.exe" && cmp -i 256 "$1.exe" "$2.exe"; then
    117           status=0
    118         else
    119           status=1
    120         fi
    121         ;;
    122     esac
    123   fi
    124 fi
    125 
    126 $rm "$1.$suf1" "$2.$suf2"
    127 
    128 trap "exit $status; exit" 0 1 2 15
    129 
    130 exit $status
    131