Skip to content

Commit e255624

Browse files
authored
Support non-arm bflt executables ##bin
1 parent 9bcf7bb commit e255624

3 files changed

Lines changed: 43 additions & 7 deletions

File tree

libr/bin/format/bflt/bflt.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ static int bflt_init_hdr(struct r_bin_bflt_obj *bin) {
4242
p_hdr->reloc_count = READ (bhdr, i);
4343
p_hdr->flags = READ (bhdr, i);
4444
p_hdr->build_date = READ (bhdr, i);
45+
/* cpu_type may be stored in filler[5] by some toolchains, read it separately */
46+
bin->cpu_type = r_read_be32 (bhdr + 60); /* offset 60 = filler[5] */
47+
if (bin->cpu_type == 0 || bin->cpu_type > 0x100) {
48+
bin->cpu_type = BFLT_CPU_ARM; /* default to ARM if invalid */
49+
}
4550

4651
if (p_hdr->rev != FLAT_VERSION) {
4752
R_LOG_WARN ("only v4 is supported!");

libr/bin/format/bflt/bflt.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,15 @@
1515
#define FLAT_FLAG_GZDATA 0x8 /* only data/relocs are compressed (for XIP) */
1616
#define FLAT_FLAG_KTRACE 0x10 /* output useful kernel trace for debugging */
1717

18+
/* CPU architecture constants */
19+
#define BFLT_CPU_68K 0x0001 /* Motorola 68000 */
20+
#define BFLT_CPU_386 0x0002 /* Intel x86 */
21+
#define BFLT_CPU_ARM 0x0004 /* ARM */
22+
#define BFLT_CPU_MIPS 0x0008 /* MIPS */
23+
#define BFLT_CPU_PPC 0x0010 /* PowerPC */
24+
#define BFLT_CPU_SH 0x0020 /* SuperH */
25+
#define BFLT_CPU_COLDFIRE 0x0040 /* ColdFire */
26+
1827
typedef struct bflt_hdr {
1928
ut8 magic[4];
2029
ut32 rev;
@@ -44,6 +53,7 @@ typedef struct r_bin_bflt_obj {
4453
ut8 endian;
4554
size_t size;
4655
ut32 n_got;
56+
ut32 cpu_type;
4757
} RBinBfltObj;
4858

4959
#define BFLT_HDR_SIZE sizeof (RBinBfltHeader)

libr/bin/p/bin_bflt.c

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -208,12 +208,11 @@ static RList *relocs(RBinFile *bf) {
208208
reloc_table[i].data_offset = reloc_data_offset;
209209

210210
RBinReloc *reloc = R_NEW0 (RBinReloc);
211-
if (reloc) {
212-
reloc->type = R_BIN_RELOC_32;
213-
reloc->paddr = reloc_table[i].addr_to_patch;
214-
reloc->vaddr = reloc->paddr;
215-
r_list_append (list, reloc);
216-
}
211+
reloc->type = R_BIN_RELOC_32;
212+
// reloc->ntype = R_BIN_RELOC_32;
213+
reloc->paddr = reloc_table[i].addr_to_patch;
214+
reloc->vaddr = reloc->paddr;
215+
r_list_append (list, reloc);
217216
}
218217
}
219218
free (reloc_pointer_table);
@@ -226,6 +225,27 @@ static RList *relocs(RBinFile *bf) {
226225
return NULL;
227226
}
228227

228+
static const char *bflt_cpu_to_arch(ut32 cpu_type) {
229+
switch (cpu_type) {
230+
case BFLT_CPU_68K:
231+
return "m68k";
232+
case BFLT_CPU_386:
233+
return "x86";
234+
case BFLT_CPU_ARM:
235+
return "arm";
236+
case BFLT_CPU_MIPS:
237+
return "mips";
238+
case BFLT_CPU_PPC:
239+
return "ppc";
240+
case BFLT_CPU_SH:
241+
return "sh";
242+
case BFLT_CPU_COLDFIRE:
243+
return "m68k"; /* ColdFire is 68k variant */
244+
default:
245+
return "arm"; /* default to ARM */
246+
}
247+
}
248+
229249
static RBinInfo *info(RBinFile *bf) {
230250
RBinInfo *info = R_NEW0 (RBinInfo);
231251
struct r_bin_bflt_obj *obj = R_UNWRAP3 (bf, bo, bin_obj);
@@ -235,7 +255,8 @@ static RBinInfo *info(RBinFile *bf) {
235255
info->type = strdup ("bFLT (Executable file)");
236256
info->os = strdup ("Linux");
237257
info->subsystem = strdup ("Linux");
238-
info->arch = strdup ("arm");
258+
const char *arch = obj? bflt_cpu_to_arch (obj->cpu_type): "arm";
259+
info->arch = strdup (arch);
239260
info->big_endian = obj? obj->endian: R_SYS_ENDIAN_LITTLE;
240261
info->bits = 32;
241262
info->has_va = false;

0 commit comments

Comments
 (0)