ftrace(二)实现-----scripts/recordmcount.pl 解析(二)

当解析出jerry.txt文件后,尝试着写个脚本来生成相应的section。但是bash并不擅长此事。用python处理数据比较合适,但是我并不熟悉python。
如果有人可以能够用python按照下文的意图处理jerry.txt,可否将脚本发至primerlink@gmail.com。                             

jerry.txt中已经列出了各个section,而且每个section中都包含了一些函数,以及调用mcount处相对于section的偏移量。

1) 如果此section有一个global函数,则将mcount的偏移量,改成基于此函数的偏移,例如:
    43 function: 0x0000000000000020 gfun_four_text_default T
   47 mcount: mcount    0x25    
    ===> .long gfun_four_text_default + 0x5
2) 如果此section没有global函数,那么就选出该section中的第一个static函数,将mcount的偏移量,改成基于此函数的偏移,例如:
    76 function: 0x0000000000000000 lfun_six_set_own t
   80 mcount: mcount    0x5
        85 function: 0x0000000000000010 lfun_seven_set_own t
   89 mcount: mcount    15
    ===>.long lfun_six_set_own + 0x5 
        .long lfun_six_set_own + 0x15

基1) & 2),我们生成mcount_own.S文件,其内定义了一个section: __mcount_loc

.section __mcount_loc, "a"
.align 8
.long gfun_four_text_default - 0x15
.long gfun_four_text_default - 0x5
.long gfun_four_text_default + 0x5
.long gfun_five_set_sched - 0x5
.long gfun_five_set_sched + 0x5
.long lfun_six_set_own + 0x5
.long lfun_six_set_own + 0x15
.long lfun_six_set_own + 0x25

gcc -c mcount_own.S -o mcount_own.o

如果都是基于全局符号,那就很容易了:

1) ld -r test.o mcount_own.o -o test_link.o
2) mv test_link.o test.o

但是,问题在于使用局部符号做为基地址在链接时是无效的,那么问题就在于如何将局部符号全局化,同时不会影响最终链接入的可重定位文件。方
法:

1) objcopy --globalize-symbol lfun_six_set_own test.o test_new.o
2) ld -r test_new.o mcount_own.o -o test_link.o
3) objcopy --localize-symbol lfun_six_set_own test_link.o test.o
4) rm test_new.o test.o

通过这样的方式,我们就把每处调用mcount的地址全都记录在__mcount_loc段内。在链接脚本中记录此段的起始结束地址,我们就可以在最终生成的
可执行文件中以此段内的每个item值作为指针,直接修改指令。

现在还有一个没搞清楚,如果函数A调用了mcount,内核初始化时可以将此处的指令修改我nop。此后,如果需要trace A函数,那么有时如是找到A函数处的调用mcount的地址的呢?在__mcount_loc段内,并没有标记可以指明每个mcount是隶属于哪个函数的啊?????

posted on 2014-12-20 12:22  阿加  阅读(952)  评论(0)    收藏  举报

导航