使用 BFD 接口更新目标文件

问题描述 投票:0回答:2

我必须向现有目标文件添加一个符号。我目前正在尝试使用 elf32-i386 目标。 我尝试以读/写模式打开目标文件:

abfd = bfd_fopen ("test.o", "elf32-i386", "r+", -1);

我读取现有的符号表没有问题。我将它与 objdump 输出进行了比较,结果很好。 但是,当我向现有的 asymbol** 列表添加新符号并尝试通过调用 `bfd_set_symtab(abfd, newsymtab, newsymtab_count) 设置新符号表时,会返回失败。

查看定义了

bfd_set_symtab()
的 syms.c 文件,似乎使用“只写”模式创建的 bfd 对象可以设置符号。

if (abfd->format != bfd_object || bfd_read_p (abfd))
{
      bfd_set_error (bfd_error_invalid_operation);
      return FALSE;
}

bfd_read_p (abfd) expands to : 
((abfd)->direction == read_direction || (abfd)->direction == both_direction)

“+”模式都是方向。

我无法以写入模式打开目标文件,因为它会清除文件中的现有数据。 我只剩下唯一的选择,即将使用读取模式创建的 BFD 对象复制到使用新输出对象文件的写入模式创建的另一个对象。查看 BFD 接口,我看不到任何用于复制/克隆现有 BFD 对象的 api。 BFD 文档有一个用于创建符号表的示例程序,但它位于新的输出目标文件中。我想更新现有的目标文件。

任何人都可以告诉我们如何使用 BFD 接口针对任何一个简单的用例编辑目标文件吗?

非常感谢!

bfd
2个回答
1
投票

我自己想到了这一点。我提到了 objcopy 实用程序代码。 copy_object() 函数完成了我想要的任务。它根据命令行选项执行许多额外的操作。我不得不扔掉所有这些代码,只保留核心复制功能,例如设置节、复制符号表、复制重定位、复制节内容和私有数据。如果有人感兴趣的话我可以发布代码。


0
投票

可以发布源代码吗?谢谢你

© www.soinside.com 2019 - 2024. All rights reserved.