1*cf5a6c84SAndroid Build Coastguard Worker /* elf.c - Executable Linking Format manipulation functions.
2*cf5a6c84SAndroid Build Coastguard Worker *
3*cf5a6c84SAndroid Build Coastguard Worker * Copyright 2023 Rob Landley <[email protected]>
4*cf5a6c84SAndroid Build Coastguard Worker */
5*cf5a6c84SAndroid Build Coastguard Worker
6*cf5a6c84SAndroid Build Coastguard Worker #include "toys.h"
7*cf5a6c84SAndroid Build Coastguard Worker
elf_arch_name(int type)8*cf5a6c84SAndroid Build Coastguard Worker char *elf_arch_name(int type)
9*cf5a6c84SAndroid Build Coastguard Worker {
10*cf5a6c84SAndroid Build Coastguard Worker int i;
11*cf5a6c84SAndroid Build Coastguard Worker
12*cf5a6c84SAndroid Build Coastguard Worker // Values from include/linux/elf-em.h (plus arch/*/include/asm/elf.h)
13*cf5a6c84SAndroid Build Coastguard Worker // Names are linux/arch/ directory (sometimes before 32/64 bit merges)
14*cf5a6c84SAndroid Build Coastguard Worker struct {int val; char *name;} types[] = {{0x9026, "alpha"}, {93, "arc"},
15*cf5a6c84SAndroid Build Coastguard Worker {195, "arcv2"}, {40, "arm"}, {183, "arm64"}, {0x18ad, "avr32"},
16*cf5a6c84SAndroid Build Coastguard Worker {247, "bpf"}, {106, "blackfin"}, {140, "c6x"}, {23, "cell"}, {76, "cris"},
17*cf5a6c84SAndroid Build Coastguard Worker {252, "csky"}, {0x5441, "frv"}, {46, "h8300"}, {164, "hexagon"},
18*cf5a6c84SAndroid Build Coastguard Worker {50, "ia64"}, {258, "loongarch"}, {88, "m32r"}, {0x9041, "m32r"},
19*cf5a6c84SAndroid Build Coastguard Worker {4, "m68k"}, {174, "metag"}, {189, "microblaze"},
20*cf5a6c84SAndroid Build Coastguard Worker {0xbaab, "microblaze-old"}, {8, "mips"}, {10, "mips-old"}, {89, "mn10300"},
21*cf5a6c84SAndroid Build Coastguard Worker {0xbeef, "mn10300-old"}, {113, "nios2"}, {92, "openrisc"},
22*cf5a6c84SAndroid Build Coastguard Worker {0x8472, "openrisc-old"}, {15, "parisc"}, {20, "ppc"}, {21, "ppc64"},
23*cf5a6c84SAndroid Build Coastguard Worker {243, "riscv"}, {22, "s390"}, {0xa390, "s390-old"}, {135, "score"},
24*cf5a6c84SAndroid Build Coastguard Worker {42, "sh"}, {2, "sparc"}, {18, "sparc8+"}, {43, "sparc9"}, {188, "tile"},
25*cf5a6c84SAndroid Build Coastguard Worker {191, "tilegx"}, {3, "386"}, {6, "486"}, {62, "x86-64"}, {94, "xtensa"},
26*cf5a6c84SAndroid Build Coastguard Worker {0xabc7, "xtensa-old"}
27*cf5a6c84SAndroid Build Coastguard Worker };
28*cf5a6c84SAndroid Build Coastguard Worker
29*cf5a6c84SAndroid Build Coastguard Worker for (i = 0; i<ARRAY_LEN(types); i++)
30*cf5a6c84SAndroid Build Coastguard Worker if (type==types[i].val) return types[i].name;
31*cf5a6c84SAndroid Build Coastguard Worker
32*cf5a6c84SAndroid Build Coastguard Worker sprintf(libbuf, "unknown arch %d", type);
33*cf5a6c84SAndroid Build Coastguard Worker return libbuf;
34*cf5a6c84SAndroid Build Coastguard Worker }
35*cf5a6c84SAndroid Build Coastguard Worker
elf_print_flags(int arch,int flags)36*cf5a6c84SAndroid Build Coastguard Worker void elf_print_flags(int arch, int flags)
37*cf5a6c84SAndroid Build Coastguard Worker {
38*cf5a6c84SAndroid Build Coastguard Worker if (arch == 40) { // arm32
39*cf5a6c84SAndroid Build Coastguard Worker printf(", EABI%u", (flags >> 24) & 0xf);
40*cf5a6c84SAndroid Build Coastguard Worker if (flags & 0x200) printf(", soft float");
41*cf5a6c84SAndroid Build Coastguard Worker else if (flags & 0x400) printf(", hard float");
42*cf5a6c84SAndroid Build Coastguard Worker } else if (arch == 243) { // riscv
43*cf5a6c84SAndroid Build Coastguard Worker if (flags & 1) printf(", C");
44*cf5a6c84SAndroid Build Coastguard Worker if (flags & 8) printf(", E");
45*cf5a6c84SAndroid Build Coastguard Worker if (flags & 0x10) printf(", TSO");
46*cf5a6c84SAndroid Build Coastguard Worker printf(", %s float",
47*cf5a6c84SAndroid Build Coastguard Worker (char *[]){"soft", "single", "double", "quad"}[(flags&0x6)/2]);
48*cf5a6c84SAndroid Build Coastguard Worker }
49*cf5a6c84SAndroid Build Coastguard Worker }
50