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是隶属于哪个函数的啊?????
浙公网安备 33010602011771号