背景
当初入了vim的坑,习惯了vim的编辑方式和命令。现在发现eclips,visual studio code这些工具门槛更低,而且有很多优秀的功能。
vim的特点是这些优秀的功能可以靠插件实现。
目前我的vim配置了:YouCompleteMe,cscope,配置了cscope的快捷键可以一件找到定义处和调用处。
在有cscope阅读代码是遇见已经糟心事:linux kernel代码和uboot代码等,有很多函数的定义因为有不同的board和arch的实现,所以多处有定义。这和时候就需要在几百个选项中找到我们使用的代码中的定义。
思路
最开始想既然我们编译的时候能更具编译规则找出需要编译的文件,那么我们弄个工具按照编译规则去生成需要的文件列表。这个思路来自与YCM。
但是这个方法不可行,因为很多项目的编译系统并不一致,比如有makefile,还有cmake,nmake等要去适配众多编译系统是个巨大的工作任务。
偶遇
直到最近我买了jlink在官网下载了Ozone调试软件,当我用Ozone打开elf调试文件时,它会自动把使用的文件显示出来。这个功能给我迎头一击。
它肯定是用了elf中的调试信息,说明elf调试信息中会包含使用文件的记录。然后就搜出了dwarf
简单的介绍:
http://www.cnblogs.com/zqingnn/archive/2011/01/05/1926384.html
通过搜索引擎知道,可以通过 readelf 命令来获取到调试信息。
解决方法
readelf -wL 可以将这些文件打印处出来,然后重定向到cscope.files
${cross}readelf -wL OUT/u-boot |grep "CU:" |sed -e 's/:$//g' > cscope.files
这个时候通过cscope生成的cscope.out文件它只会去索引cscope.files中的文件。