coff: Let's support TI coff and tms320 files.

This commit is contained in:
Fedor Sakharov 2014-02-20 13:37:51 +04:00
parent 1dafb6b029
commit d31c3623cc
3 changed files with 47 additions and 1 deletions

View File

@ -11,6 +11,7 @@ int coff_supported_arch(const ut8 *buf)
case IMAGE_FILE_MACHINE_AMD64:
case IMAGE_FILE_MACHINE_I386:
case IMAGE_FILE_MACHINE_H8300:
case IMAGE_FILE_TI_COFF:
ret = R_TRUE;
break;
default:
@ -24,7 +25,6 @@ static int r_bin_coff_init_hdr(struct r_bin_coff_obj *obj)
{
size_t offset = 0;
obj->hdr.machine = *(ut16*)obj->b->buf;
switch(obj->hdr.machine) {
@ -61,6 +61,15 @@ static int r_bin_coff_init_hdr(struct r_bin_coff_obj *obj)
r_mem_copyendian((ut8*)&(obj->hdr.flags), obj->b->buf + offset,
sizeof(ut16), obj->endian);
offset += sizeof(ut16);
if (obj->hdr.machine == IMAGE_FILE_TI_COFF) {
r_mem_copyendian((ut8*)&(obj->hdr.target_id), obj->b->buf + offset,
sizeof(ut16), obj->endian);
printf("%x\n", obj->hdr.target_id);
}
return R_TRUE;
}
@ -118,6 +127,10 @@ static int r_bin_coff_init_scn_hdr(struct r_bin_coff_obj *obj)
{
size_t i, offset = obj->hdr.opt_hdr_size + 20;
if (obj->hdr.machine == IMAGE_FILE_TI_COFF) {
offset += 2;
}
obj->scn_hdrs = calloc(obj->hdr.sections_num,
sizeof(struct coff_scn_hdr));

View File

@ -28,6 +28,22 @@
#define IMAGE_FILE_MACHINE_WCEMIPSV2 0x169
#define IMAGE_FILE_MACHINE_H8300 0x0083
#define IMAGE_FILE_TI_COFF 0xc1
#define IMAGE_FILE_MACHINE_TMS470 0x0097
#define IMAGE_FILE_MACHINE_TMS320C54 0x0098
#define IMAGE_FILE_MACHINE_TMS320C60 0x0099
#define IMAGE_FILE_MACHINE_TMS320C55 0x009C
#define IMAGE_FILE_MACHINE_TMS320C28 0x009D
#define IMAGE_FILE_MACHINE_MSP430 0x00A0
#define IMAGE_FILE_MACHINE_TMS320C55PLUS 0x00A1
#define IMAGE_FLAGS_TI_F_RELFLG 0x0001
#define IMAGE_FLAGS_TI_F_EXEC 0x0002
#define IMAGE_FLAGS_TI_F_LNNO 0x0004
#define IMAGE_FLAGS_TI_F_LSYMS 0x0008
#define IMAGE_FLAGS_TI_F_BIG 0x0200
#define IMAGE_FLAGS_TI_F_LITTLE 0x0100
#define IMAGE_SCN_TYPE_NO_PAD 0x00000008
#define IMAGE_SCN_CNT_CODE 0x00000020
#define IMAGE_SCN_CNT_INIT_DATA 0x00000040
@ -121,6 +137,7 @@ struct coff_hdr {
ut32 symbols_num;
ut16 opt_hdr_size;
ut16 flags;
ut16 target_id; // TI COFF specific
};
struct coff_opt_hdr {

View File

@ -172,6 +172,22 @@ static RBinInfo *info(RBinFile *arch)
strncpy(ret->arch, "h8300", R_BIN_SIZEOF_STRINGS);
ret->bits = 16;
break;
case IMAGE_FILE_TI_COFF:
if (obj->hdr.target_id == IMAGE_FILE_MACHINE_TMS320C54) {
strncpy(ret->machine, "c54x", R_BIN_SIZEOF_STRINGS);
strncpy(ret->arch, "tms320", R_BIN_SIZEOF_STRINGS);
ret->bits = 32;
} else if (obj->hdr.target_id == IMAGE_FILE_MACHINE_TMS320C55) {
strncpy(ret->machine, "c55x", R_BIN_SIZEOF_STRINGS);
strncpy(ret->arch, "tms320", R_BIN_SIZEOF_STRINGS);
ret->bits = 32;
} else if (obj->hdr.target_id == IMAGE_FILE_MACHINE_TMS320C55PLUS) {
strncpy(ret->machine, "c55x+", R_BIN_SIZEOF_STRINGS);
strncpy(ret->arch, "tms320", R_BIN_SIZEOF_STRINGS);
ret->bits = 32;
}
break;
default:
strncpy(ret->machine, "unknown", R_BIN_SIZEOF_STRINGS);
}