本文共 1936 字,大约阅读时间需要 6 分钟。
gcc
的 -pg
选项将在每个函数的入口处加入对mcount的代码调用;//$ cat foo.c void foo(void) { int a = 1;}
编译:
gcc foo.c -pg -S -o foo-pg.sgcc foo.c -pg -c -o foo-pg.ogcc foo.c -S -o foo.sgcc foo.c -c -o foo.o
foo.s文件:
;$ cat foo.s foo: pushq %rbp movq %rsp, %rbp movl $1, -4(%rbp) popq %rbp ret
foo-pg.s文件:
;$ cat foo-pg.s foo: pushq %rbp movq %rsp, %rbp subq $16, %rsp call mcount movl $1, -4(%rbp) leave ret
查看两个.o文件
[rongtao@localhost demo]$ readelf -s foo.o Symbol table '.symtab' contains 9 entries: Num: Value Size Type Bind Vis Ndx Name 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND 1: 0000000000000000 0 FILE LOCAL DEFAULT ABS foo.c 2: 0000000000000000 0 SECTION LOCAL DEFAULT 1 3: 0000000000000000 0 SECTION LOCAL DEFAULT 2 4: 0000000000000000 0 SECTION LOCAL DEFAULT 3 5: 0000000000000000 0 SECTION LOCAL DEFAULT 5 6: 0000000000000000 0 SECTION LOCAL DEFAULT 6 7: 0000000000000000 0 SECTION LOCAL DEFAULT 4 8: 0000000000000000 13 FUNC GLOBAL DEFAULT 1 foo[rongtao@localhost demo]$ readelf -s foo-pg.o Symbol table '.symtab' contains 10 entries: Num: Value Size Type Bind Vis Ndx Name 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND 1: 0000000000000000 0 FILE LOCAL DEFAULT ABS foo.c 2: 0000000000000000 0 SECTION LOCAL DEFAULT 1 3: 0000000000000000 0 SECTION LOCAL DEFAULT 3 4: 0000000000000000 0 SECTION LOCAL DEFAULT 4 5: 0000000000000000 0 SECTION LOCAL DEFAULT 6 6: 0000000000000000 0 SECTION LOCAL DEFAULT 7 7: 0000000000000000 0 SECTION LOCAL DEFAULT 5 8: 0000000000000000 22 FUNC GLOBAL DEFAULT 1 foo 9: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND mcount
转载地址:http://hivaf.baihongyu.com/