3

我必须向现有的目标文件添加一个符号。我目前正在尝试使用 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)

“+”模式是both_direction。

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

谁能告诉我们如何使用 BFD 接口为任何一个简单的用例编辑目标文件。

非常感谢!

4

1 回答 1

1

我自己想到了这个。我提到了 objcopy 实用程序代码。copy_object() 函数完成了我想要的任务。它基于命令行选项做了很多额外的事情。我不得不丢弃所有这些代码,只保留核心复制功能,如设置节、复制符号表、复制重定位、复制节内容和私有数据。如果有人感兴趣,我可以发布代码。

于 2014-09-28T06:41:32.383 回答