![]() |
|
||||||||||||||
| | 首页 | 新闻 | 文库 | 方案 | 技术 | 独家 | 座谈 | 下载 | 图库 | 开发板 | 仿真器 | 邮购 | VIP | 芯片 | 客户评价 | 论坛 | | ||
|
||
|
|||||
| bfd的后端数据表示 | |||||
作者:快乐虾 文章来源:http://blog.csdn.net/lights_joy 点击数: 更新时间:2008-11-17 ![]() |
|||||
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中的定义。 |
|||||
| 文章录入:admin 责任编辑:admin | |||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 本站介绍 | 合作联络 | 欢迎投稿 | 广告业务 | 网站地图 | 设为首页 | 加入收藏 | 友情链接 | 网站公告 | 联系我们 | | |||
|