用bfd显示ARM共享库的依赖关系

转载时请注明出处和作者联系方式
文章出处:http://www.limodev.cn/blog
作者联系方式:李先静 <xianjimli at hotmail dot com>

PC 上可以用ldd显示共享库的依赖关系,但它不能显示交叉编译出来的共享库。要显示交叉编译的共享库,通常做的法是在目标板上用/lib/ld- linux.so.2 –list来显示。那有点有麻烦,由于通常我们并不关心所依赖共享库的加载地址,所以自己写了小程序来实现这个功能,顺便学习一下BFD的使用方法。

o 源代码

static void show_so_dependance(bfd* b,asection* s)
{
char* str = NULL;
char* buff = NULL;
size_t length = 0;

length = s->size;
buff = (char*)malloc(length + 1);
bfd_get_section_contents(b,s,buff,length);
buff[length] = '/0';

for(str = buff; str < (buff + length); str += (strlen(str) + 1))
{
if(strstr(str,".so") != NULL)
{
printf(" ");
printf("%s/n",str);
}
}
free(buff);

return;
}

int main(int argc,char* argv[])
{
int i = 0;
bfd* b = NULL;
asection* s = NULL;
char **matching = NULL;

bfd_init();

if(argc < 2)
{
printf("usage: %s filename/n",argv[0]);

return 0;
}

b = bfd_openr(argv[1],NULL);
if(bfd_check_format_matches (b,bfd_object,&matching))
{
if((s = bfd_get_section_by_name(b,".dynstr")) != NULL)
{
show_so_dependance(b,s);
}
}
bfd_close(b);

return 0;
}

o 编译

gcc -g depend_so.c -lbfd -liberty -o depend_so

o使用方法

[root@lixj bfd]# ./depend_so /usr/bin/xmlwf
libexpat.so.1
libc.so.6
/lib/ld-linux.so.2

代码请到这里下载。

相关文章

什么是设计模式一套被反复使用、多数人知晓的、经过分类编目...
单一职责原则定义(Single Responsibility Principle,SRP)...
动态代理和CGLib代理分不清吗,看看这篇文章,写的非常好,强...
适配器模式将一个类的接口转换成客户期望的另一个接口,使得...
策略模式定义了一系列算法族,并封装在类中,它们之间可以互...
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,...