我必须在现有的目标文件中添加一个符号。我目前正在尝试使用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)
“+”模式都是_direction。
我无法在写入模式下打开目标文件,因为它会清除文件中的现有数据。 我只剩下将使用读取模式创建的BFD对象复制到使用新输出对象文件的写入模式创建的另一个对象的唯一选项。查看BFD接口,我无法看到任何api来复制/克隆现有的BFD对象。 BFD文档有一个示例程序来创建符号表,但它在一个新的输出目标文件中。我想更新现有的目标文件。
任何人都可以告诉我们如何使用BFD接口编辑任何一个简单用例的目标文件。
非常感谢!
答案 0 :(得分:1)
自己想一想。我提到了objcopy实用程序代码。 copy_object()函数完成我想要的任务。它根据命令行选项执行许多额外的操作。我不得不丢弃所有这些代码,只保留核心复制功能,如设置部分,复制符号表,复制重定位,复制部分内容和私有数据。如果有人感兴趣,我可以发布代码。