快乐虾
http://blog.csdn.net/lights_joy/
lights@hb165.com
本文适用于
bfinutils-2.19
vs2008
欢迎转载,但请保留作者信息
1.1 bfd中的数据表示
Bfd同时支持许多不同格式的文件,这些格式各异的文件自然要用不同的结构来进行表示,bfd采用的做法是在bfd这个结构体中使用一个union来表示:
/* Used by the back end to hold private data. */
union
{
struct aout_data_struct *aout_data;
struct artdata *aout_ar_data;
struct _oasys_data *oasys_obj_data;
struct _oasys_ar_data *oasys_ar_data;
struct coff_tdata *coff_obj_data;
struct pe_tdata *pe_obj_data;
struct xcoff_tdata *xcoff_obj_data;
struct ecoff_tdata *ecoff_obj_data;
struct ieee_data_struct *ieee_data;
struct ieee_ar_data_struct *ieee_ar_data;
struct srec_data_struct *srec_data;
struct ihex_data_struct *ihex_data;
struct tekhex_data_struct *tekhex_data;
struct elf_obj_tdata *elf_obj_data;
struct nlm_obj_tdata *nlm_obj_data;
struct bout_data_struct *bout_data;
struct mmo_data_struct *mmo_data;
struct sun_core_struct *sun_core_data;
struct sco5_core_struct *sco5_core_data;
struct trad_core_struct *trad_core_data;
struct som_data_struct *som_data;
struct hpux_core_struct *hpux_core_data;
struct hppabsd_core_struct *hppabsd_core_data;
struct sgi_core_struct *sgi_core_data;
struct lynx_core_struct *lynx_core_data;
struct osf_core_struct *osf_core_data;
struct cisco_core_struct *cisco_core_data;
struct versados_data_struct *versados_data;
struct netbsd_core_struct *netbsd_core_data;
struct mach_o_data_struct *mach_o_data;
struct mach_o_fat_data_struct *mach_o_fat_data;
struct bfd_pef_data_struct *pef_data;
struct bfd_pef_xlib_data_struct *pef_xlib_data;
struct bfd_sym_data_struct *sym_data;
void *any;
}
tdata;
嗯,不同的target各取所需!
1.2 内存分配
由于这些结构体大小各异,其内存的分配与回收自然也是各个target所负责的事情了。在bfd_target这个结构体中为此设计了一个回调函数数组:
/* Set the format of a file being written. */
bfd_boolean (*_bfd_set_format[bfd_type_end]) (bfd *);
对于不同的文件类型使用不同的回调函数进行处理,比如bfd_elf32_bfin_vec这个target就这样定义回调函数:
#ifndef bfd_elf32_mkobject
#define bfd_elf32_mkobject bfd_elf_make_generic_object
#endif
/* bfd_set_format: set the format of a file being written */
{ bfd_false,
bfd_elf32_mkobject,
bfd_elf32_mkarchive,
bfd_elf32_mkcorefile
},
当某个target检测到所要读取的文件确实是自己所能处理的类型时,它将调用这个回调函数,在此回调函数中为后端数据分配空间(以object文件处理为例):
/* Create a tdata field OBJECT_SIZE bytes in length, zeroed out and with
the object_id field of an elf_obj_tdata field set to OBJECT_ID. */
bfd_boolean
bfd_elf_allocate_object (bfd *abfd,
size_t object_size,
enum elf_object_id object_id)
{
BFD_ASSERT (object_size >= sizeof (struct elf_obj_tdata));
abfd->tdata.any = bfd_zalloc (abfd, object_size);
if (abfd->tdata.any == NULL)
return FALSE;
elf_object_id (abfd) = object_id;
elf_program_header_size (abfd) = (bfd_size_type) -1;
return TRUE;
}
bfd_boolean
bfd_elf_make_generic_object (bfd *abfd)
{
return bfd_elf_allocate_object (abfd, sizeof (struct elf_obj_tdata),
GENERIC_ELF_TDATA);
}
1.3 后端数据访问
虽然可以直接通过相应的结构体来访问后端数据,但是bfd并不鼓励这样做。它定义了一些叫bfd_get_*的宏来做这样的事情。比如:
#define bfd_get_section(x) ((x)->section)
#define bfd_get_section_name(bfd, ptr) ((ptr)->name + 0)
等等。具体可参见bfd.h中的定义。
参考资料
bfd对多目标的支持( 2008-9-25 )
bfd对elf32格式的支持( 2008-11-7 )
objdump与readelf的区别( 2008-11-10 )
objdump代码分析( 2008-11-10 )
bfd的文件格式识别( 2008-11-10 )