bfd的后端数据表示

 

快乐虾

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

bfdelf32格式的支持( 2008-11-7 )

objdumpreadelf的区别( 2008-11-10 )

objdump代码分析( 2008-11-10 )

bfd的文件格式识别 2008-11-10

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌云阁主

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值