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

本文介绍了一种用于显示交叉编译的共享库依赖关系的方法,并提供了一个小程序的源代码示例,该程序利用BFD库解析目标文件并列出其依赖的共享库。

转载时请注明出处和作者联系方式
文章出处: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, 0, 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

代码请到这里下载。

### 安装 bfd 库的方法 在 Linux 系统中安装 `bfd` 库通常涉及从源码编译并安装的过程。以下是具体的操作说明: #### 准备工作 为了成功安装 `bfd` 庿,需要先确认系统已安装必要的开发工具和依赖项。可以运行以下命令来安装这些基础环境: ```bash sudo apt-get update && sudo apt-get install build-essential gcc make libtool autoconf automake ``` #### 下载源码包 可以从 GNU 的官方网站下载最新的 `binutils` 源码包(因为 `bfd` 是作为 `binutils` 的一部分发布的)。使用如下命令获取最新版本的源码: ```bash wget https://ftp.gnu.org/gnu/binutils/binutils-latest.tar.gz tar -xzvf binutils-latest.tar.gz cd binutils-* ``` #### 配置编译选项 进入解压后的目录后,通过 `./configure` 命令设置编译参数。如果希望指定安装路径,则可以通过 `--prefix` 参数实现[^2]。例如,将库文件安装到 `/usr/local/bfd` 路径下: ```bash mkdir /usr/local/bfd ./configure --prefix=/usr/local/bfd ``` #### 编译与安装 完成配置之后,依次执行以下命令进行编译和安装: ```bash make sudo make install ``` 上述过程完成后,`bfd` 库及相关头文件会被放置于指定的目标路径。 #### 测试安装 验证安装是否成功的常用方式之一是尝试链接一个简单的测试程序。创建一个 C 文件 (如 test.c),其中包含调用 `bfd_init()` 或其他相关 API 的代码片段。随后利用 `-lbfd` 和 `-lintl` 这两个标志将其编译成可执行文件: ```c #include <bfd.h> int main() { bfd *abfd; abfd = bfd_alloc(); if (!abfd) return 1; printf("BFD initialized successfully.\n"); return 0; } ``` 保存以上内容至 `test.c` 并执行下面的指令构建它: ```bash gcc -o test_bfd test.c -I/usr/local/bfd/include -L/usr/local/bfd/lib -lbfd -lz -ldl ./test_bfd ``` 如果一切正常,应该能看到输出提示初始化成功的信息。 --- ### 注意事项 由于 `bfd` 属于较底层的技术组件,在某些发行版里可能已经预装或者被集成到了系统的标准库当中。因此建议事先检查是否存在可用版本再决定手动重新部署与否。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值