diff options
author | aoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-08-18 19:46:20 +0000 |
---|---|---|
committer | aoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-08-18 19:46:20 +0000 |
commit | a0316126342c9b21d00a8d6f3e212838148eee04 (patch) | |
tree | 66d9d32b50eb9a4a388121e0fbee9f95789f774d | |
parent | 64a22cae370858e65f9f3c2b916c1e004f4c9c6b (diff) |
* compare-debug: Don't fail just because of .eh_framevar-tracking-assignments-4_4-merge-150905-4_4
differences. Drop .eh_frame relocations too.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_4-branch@150902 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | contrib/ChangeLog | 5 | ||||
-rwxr-xr-x | contrib/compare-debug | 70 |
2 files changed, 74 insertions, 1 deletions
diff --git a/contrib/ChangeLog b/contrib/ChangeLog index 403927add77..0b9cf7a69a3 100644 --- a/contrib/ChangeLog +++ b/contrib/ChangeLog @@ -1,3 +1,8 @@ +2009-08-18 Alexandre Oliva <aoliva@redhat.com> + + * compare-debug: Don't fail just because of .eh_frame + differences. Drop .eh_frame relocations too. + 2009-07-22 Release Manager * GCC 4.4.1 released. diff --git a/contrib/compare-debug b/contrib/compare-debug index 6e979e9d786..9864ee91f30 100755 --- a/contrib/compare-debug +++ b/contrib/compare-debug @@ -2,7 +2,7 @@ # Compare stripped copies of two given object files. -# Copyright (C) 2007 Free Software Foundation +# Copyright (C) 2007, 2008, 2009 Free Software Foundation # Originally by Alexandre Oliva <aoliva@redhat.com> # This file is part of GCC. @@ -67,6 +67,74 @@ if cmp "$1.$suf1" "$2.$suf2"; then status=0 else status=1 + + # Assembler-generated CFI will add an .eh_frame section for -g not + # present in -g0. Try to cope with it by checking that an .eh_frame + # section is present in either object file, and then stripping it + # off before re-comparing. + + cmd= + cmp1= + cmp2= + + for t in objdump readelf eu-readelf; do + if ($t --help) 2>&1 | grep -e '--\[*section-\]*headers' > /dev/null; then + cmd=$t + + $cmd --section-headers "$1.$suf1" | grep '\.eh_frame' > /dev/null + cmp1=$? + + $cmd --section-headers "$2.$suf2" | grep '\.eh_frame' > /dev/null + cmp2=$? + + break + fi + done + + # If we found .eh_frame in one but not the other, or if we could not + # find a command to tell, try to strip off the .eh_frame section + # from both. + if test "x$cmp1" != "x$cmp2" || test "x$cmd" = "x"; then + suf3=$suf1. + while test -f "$1.$suf3"; do + suf3=$suf3. + done + + suf4=$suf2. + while test -f "$2.$suf4"; do + suf4=$suf4. + done + + trap 'rm -f "$1.$suf1" "$2.$suf2" "$1.$suf3" "$2.$suf4"' 0 1 2 15 + + echo stripping off .eh_frame, then retrying >&2 + + if (objcopy -v) 2>&1 | grep -e "--remove-section" > /dev/null; then + objcopy --remove-section .eh_frame --remove-section .rel.eh_frame --remove-section .rela.eh_frame "$1.$suf1" "$1.$suf3" + mv "$1.$suf3" "$1.$suf1" + + objcopy --remove-section .eh_frame --remove-section .rel.eh_frame --remove-section .rela.eh_frame "$2.$suf2" "$2.$suf4" + mv "$2.$suf4" "$2.$suf2" + elif (strip --help) 2>&1 | grep -e --remove-section > /dev/null; then + cp "$1.$suf1" "$1.$suf3" + strip --remove-section .eh_frame --remove-section .rel.eh_frame --remove-section .rela.eh_frame "$1.$suf3" + mv "$1.$suf3" "$1.$suf1" + + cp "$2.$suf2" "$2.$suf4" + strip --remove-section .eh_frame --remove-section .rel.eh_frame --remove-section .rela.eh_frame "$2.$suf4" + mv "$2.$suf4" "$2.$suf2" + else + echo failed to strip off .eh_frame >&2 + fi + + trap 'rm -f "$1.$suf1" "$2.$suf2"' 0 1 2 15 + + if cmp "$1.$suf1" "$2.$suf2"; then + status=0 + else + status=1 + fi + fi fi $rm "$1.$suf1" "$2.$suf2" |