今天一个朋友问我一个问题,就是如何查询编译之后的二进制目标文件中其中某一个函数所占的内存空间。当时我对这个问题毫无头绪,因为我以前没有遇到这个问题,所以自然也无从得知。但实验室有大牛存在,所以这个问题最终还是解决了。大牛告诉我linux 下 objdump 工具可以解决。在google的帮助下,我最终找到了两种方法。
1.使用nm命令 nm --size-sort filename(其中filename是生成的二进制目标文件)
2.使用objdump objdump -t filename
使用上面两个均可以得到想要的结果,当然你可以利用管道和grep命令在输出结果中查找你要的函数和所占的内存空间大小。
至于nm和objdump的用法,你可以man或者info一下,还可以求助与google,在这里我不再赘述。值得一提的是第二条命令会输出整个二进制文件的symbol table,并且没有相应数值的说明,所以必须查看linux下elf文件中symbol table的规范。下面是我在symbol table中摘取的一段,简单解释下各个字段的意思。
080483c4 g F .text 00000028 function
080483c4指的是该符号的地址,g表示该符号绑定的属性是global(除了g,还有l 和w ,分别表示 local 和 weak),F表示这个符号是一个函数名,.text表示这个符号属于.text这个section,然后00000028表示的就是该符号所占的内存空间大小(是十六进制表示)。function就是这个符号的名字了(我在源文件中把函数取名function)。
objdump工具很强大,如果你对自己的程序要求不高,能跑就好,就不必要了解。但是对于想对系统了解更多,学习一些底层的东西,这个工具就非常有用了。更多详细内容可以求助google。
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。