我必须向现有的对象文件中添加一个符号。我目前正在尝试一个elf32-i 386目标。我尝试在读/写模式下打开对象文件:
abfd = bfd_fopen ("test.o", "elf32-i386", "r+", -1);我在阅读现有的符号表时没有问题。我把它与objdump输出进行了比较,结果很好。但是,当我将一个新符号添加到现有的非对称符号**列表中,并试图通过调用`bfd_set_symtab(abfd、newsymtab、newsymtab_count)来设置新符号表时,就会返回failure。
查看定义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接口来编辑一个对象文件,用于任何一个简单的用例。
非常感谢!
发布于 2014-09-28 06:41:32
我自己想到的。我参考了objcopy实用程序代码。copy_object()函数完成我想要的任务。它基于命令行选项做了许多额外的事情。我不得不丢弃所有这些代码,只保留核心复制函数,如设置节、复制符号表、复制重定位、复制节内容和私有数据。如果有人感兴趣的话,我可以贴出密码。
https://stackoverflow.com/questions/25790703
复制相似问题