アセンブラレベルで変更差分を見る(gcc,svn)

今回も前回と同じレポジトリを使って戯れます。

takk@deb8:~/a/work$ svn log
------------------------------------------------------------------------
r4 | takk | 2017-02-16 22:18:12 +0900 (2017年02月16日 (木)) | 1 line

sample log
------------------------------------------------------------------------
r3 | takk | 2017-02-15 20:09:24 +0900 (2017年02月15日 (水)) | 1 line

second
------------------------------------------------------------------------
r2 | takk | 2017-02-15 20:07:55 +0900 (2017年02月15日 (水)) | 1 line

sample modified
------------------------------------------------------------------------
r1 | takk | 2017-02-15 19:59:40 +0900 (2017年02月15日 (水)) | 1 line

first
------------------------------------------------------------------------
takk@deb8:~/a/work$ 

前回は、svnのコマンドのみでソース差分を確認しましたが、今回はgccでアセンブラソースを生成して差分確認します。

まず最新レビジョンでgccをかけて、そのアセンブラをテキストに保存します。

takk@deb8:~/a/work$ gcc -S *.c;head -9999 *.s >r4

次に差分を見るレビジョン、ここではr1、updateしてソースを取り出します。

takk@deb8:~/a/work$ svn update -r1
Updating '.':
U    func_03.c
U    func_04.c
U    func_07.c
リビジョン 1 に更新しました。

同じくgccをかけてアセンブラを保存します。

takk@deb8:~/a/work$ gcc -S *.c;head -9999 *.s >r1

両者を比較します。

takk@deb8:~/a/work$ diff r1 r4
622c622
< 	call	func_033
---
> 	call	func_050
837a838
> 	call	func_044
1425c1426
< 	call	func_074
---
> 	call	func_094
takk@deb8:~/a/work$ 

アセンブラで差分がある箇所が表示されました。

どの関数が変更になったか(SVN)」でやったように、関数単位で表示するとわかりやすいです。

takk@deb8:~/a/work$ diff -y -W80 r1 r4 | tac | perl -ne '$f=1 if/ {6}\|/; print if $f==1; $f=0 if(/^\w+/);' | tac
func_032:                               func_032:
.LFB1:                                  .LFB1:
        .cfi_startproc                          .cfi_startproc
        pushl   %ebp                            pushl   %ebp
        .cfi_def_cfa_offset 8                   .cfi_def_cfa_offset 8
        .cfi_offset 5, -8                       .cfi_offset 5, -8
        movl    %esp, %ebp                      movl    %esp, %ebp
        .cfi_def_cfa_register 5                 .cfi_def_cfa_register 5
        subl    $8, %esp                        subl    $8, %esp
        call    func_033              |         call    func_050
func_073:                               func_073:
.LFB2:                                  .LFB2:
        .cfi_startproc                          .cfi_startproc
        pushl   %ebp                            pushl   %ebp
        .cfi_def_cfa_offset 8                   .cfi_def_cfa_offset 8
        .cfi_offset 5, -8                       .cfi_offset 5, -8
        movl    %esp, %ebp                      movl    %esp, %ebp
        .cfi_def_cfa_register 5                 .cfi_def_cfa_register 5
        subl    $8, %esp                        subl    $8, %esp
        call    func_074              |         call    func_094
takk@deb8:~/a/work$ 

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA