寻找libdwarf

1. 因为需要得到程序中,地址到符号的映射信息;而Pin只提供函数符号的信息,不提供其它符号,比如数据符号的信息,所以需要访问目标文件的调试信息。

2. 在Pin的讨论组中,发现需要libelf和libdwarf来访问其它符号。据论坛所说,libelf访问任意ELF文件的符号信息(比如全局变量的信息),而libdwarf提供更多的访问功能——但是有个条件,其目标文件需要gcc的-g选项(-g选项默认生成DWARF格式的调试信息)。并且,http://wiki.dwarfstd.org/index.php?title=Main_Page(该链接来自DWARF官网)以及一些用户推荐使用SGI的libdwarf实现。

3. 但是,SGI已经放弃了对libdwarf的支持。并且,上述推荐给出的链接http://reality.sgiweb.org/davea/dwarf.html已经失效(也有可能是服务器挂了?)。所以,放弃。后来,在google中用“open source libdwarf”搜索,找到了libdwarf的新的官网,在source forge上面(参考11)。可以使用一下命令下载libdwarf的源码:

git clone 

git://libdwarf.git.sourceforge.net/gitroot/libdwarf/libdwarf

4. 在Synpatic包管理器中搜索dwarf,有好几个实现。选择了一个,结果其说明中推荐使用更新版本,但是Synaptic中又不能直接更新。在http://packages.debian.org上找到了dwarf的包。根据提示,添加source list,然后在Synaptic包管理器中,发现可以更新了。可是,新问题出现了,包的依赖出现问题(让我先fix broken dependency)。不知到是什么依赖问题。于是从http://packages.debian.org上下载deb文件,使用#sudo dpkg -i *.deb,命令行安装。发现竟然可以正确安装。

5. 还有问题。要使用libdwarf,最好有详细的API文档。在网上怎么搜也搜不到。突然想到,去Synaptic中查看已安装包的属性。果然,在安装的文件中发现,在/usr/share/doc/libdwarf_dev中有pdf文档,分别介绍读/写DWARF信息的API。配置任务到此为止,以后再学习API。

6. 其实,因为gcc也实现了自己的dwarf格式的读取,最开始也是这么寻找的。可是,gcc的写dwarf是在编译器中实现的,读dwarf是在gdb中实现的。接口都不是很友好。gdb提供了MI interface(参考2),但是检查以后,发现基本上就是gdb命令行的重新组织,没有更多功能。仔细扫描一遍,不是我所需要的。

7. 总而言之,能够读取dwarf格式的工具包括,readelf,gdb,dwarfdump和libdwarf。要想编程,还是用libdwarf吧。


另外,发现Pin的讨论组可是相当地友好。

突然发现,这样子找到的libdwarf仍然是SGI的实现,:-)。

参考:

1. http://sourceforge.net/projects/libdwarf/

2. http://ftp.gnu.org/old-gnu/Manuals/gdb-5.1.1/html_node/gdb_211.html#SEC216


你可能感兴趣的:(api,gcc,文档,interface,编译器,Deb)