1*7304104dSAndroid Build Coastguard Worker /* Arm-specific ELF flag names.
2*7304104dSAndroid Build Coastguard Worker Copyright (C) 2022 Red Hat, Inc.
3*7304104dSAndroid Build Coastguard Worker This file is part of elfutils.
4*7304104dSAndroid Build Coastguard Worker
5*7304104dSAndroid Build Coastguard Worker This file is free software; you can redistribute it and/or modify
6*7304104dSAndroid Build Coastguard Worker it under the terms of either
7*7304104dSAndroid Build Coastguard Worker
8*7304104dSAndroid Build Coastguard Worker * the GNU Lesser General Public License as published by the Free
9*7304104dSAndroid Build Coastguard Worker Software Foundation; either version 3 of the License, or (at
10*7304104dSAndroid Build Coastguard Worker your option) any later version
11*7304104dSAndroid Build Coastguard Worker
12*7304104dSAndroid Build Coastguard Worker or
13*7304104dSAndroid Build Coastguard Worker
14*7304104dSAndroid Build Coastguard Worker * the GNU General Public License as published by the Free
15*7304104dSAndroid Build Coastguard Worker Software Foundation; either version 2 of the License, or (at
16*7304104dSAndroid Build Coastguard Worker your option) any later version
17*7304104dSAndroid Build Coastguard Worker
18*7304104dSAndroid Build Coastguard Worker or both in parallel, as here.
19*7304104dSAndroid Build Coastguard Worker
20*7304104dSAndroid Build Coastguard Worker elfutils is distributed in the hope that it will be useful, but
21*7304104dSAndroid Build Coastguard Worker WITHOUT ANY WARRANTY; without even the implied warranty of
22*7304104dSAndroid Build Coastguard Worker MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
23*7304104dSAndroid Build Coastguard Worker General Public License for more details.
24*7304104dSAndroid Build Coastguard Worker
25*7304104dSAndroid Build Coastguard Worker You should have received copies of the GNU General Public License and
26*7304104dSAndroid Build Coastguard Worker the GNU Lesser General Public License along with this program. If
27*7304104dSAndroid Build Coastguard Worker not, see <http://www.gnu.org/licenses/>. */
28*7304104dSAndroid Build Coastguard Worker
29*7304104dSAndroid Build Coastguard Worker #ifdef HAVE_CONFIG_H
30*7304104dSAndroid Build Coastguard Worker # include <config.h>
31*7304104dSAndroid Build Coastguard Worker #endif
32*7304104dSAndroid Build Coastguard Worker
33*7304104dSAndroid Build Coastguard Worker #define BACKEND arm_
34*7304104dSAndroid Build Coastguard Worker #include "libebl_CPU.h"
35*7304104dSAndroid Build Coastguard Worker
36*7304104dSAndroid Build Coastguard Worker const char *
arm_machine_flag_name(Elf64_Word orig,Elf64_Word * flagref)37*7304104dSAndroid Build Coastguard Worker arm_machine_flag_name (Elf64_Word orig, Elf64_Word *flagref)
38*7304104dSAndroid Build Coastguard Worker {
39*7304104dSAndroid Build Coastguard Worker unsigned version = EF_ARM_EABI_VERSION (*flagref) >> 24;
40*7304104dSAndroid Build Coastguard Worker if (version != 0)
41*7304104dSAndroid Build Coastguard Worker {
42*7304104dSAndroid Build Coastguard Worker static const char vername[5][14] =
43*7304104dSAndroid Build Coastguard Worker {
44*7304104dSAndroid Build Coastguard Worker "Version1 EABI",
45*7304104dSAndroid Build Coastguard Worker "Version2 EABI",
46*7304104dSAndroid Build Coastguard Worker "Version3 EABI",
47*7304104dSAndroid Build Coastguard Worker "Version4 EABI",
48*7304104dSAndroid Build Coastguard Worker "Version5 EABI",
49*7304104dSAndroid Build Coastguard Worker };
50*7304104dSAndroid Build Coastguard Worker *flagref &= ~((Elf64_Word) EF_ARM_EABIMASK);
51*7304104dSAndroid Build Coastguard Worker return version <= 5 ? vername[version - 1] : NULL;
52*7304104dSAndroid Build Coastguard Worker }
53*7304104dSAndroid Build Coastguard Worker switch (EF_ARM_EABI_VERSION (orig))
54*7304104dSAndroid Build Coastguard Worker {
55*7304104dSAndroid Build Coastguard Worker case EF_ARM_EABI_VER2:
56*7304104dSAndroid Build Coastguard Worker if ((*flagref & EF_ARM_DYNSYMSUSESEGIDX) != 0)
57*7304104dSAndroid Build Coastguard Worker {
58*7304104dSAndroid Build Coastguard Worker *flagref &= ~((Elf64_Word) EF_ARM_DYNSYMSUSESEGIDX);
59*7304104dSAndroid Build Coastguard Worker return "dynamic symbols use segment index";
60*7304104dSAndroid Build Coastguard Worker }
61*7304104dSAndroid Build Coastguard Worker if ((*flagref & EF_ARM_MAPSYMSFIRST) != 0)
62*7304104dSAndroid Build Coastguard Worker {
63*7304104dSAndroid Build Coastguard Worker *flagref &= ~((Elf64_Word) EF_ARM_MAPSYMSFIRST);
64*7304104dSAndroid Build Coastguard Worker return "mapping symbols precede others";
65*7304104dSAndroid Build Coastguard Worker }
66*7304104dSAndroid Build Coastguard Worker FALLTHROUGH;
67*7304104dSAndroid Build Coastguard Worker case EF_ARM_EABI_VER1:
68*7304104dSAndroid Build Coastguard Worker if ((*flagref & EF_ARM_SYMSARESORTED) != 0)
69*7304104dSAndroid Build Coastguard Worker {
70*7304104dSAndroid Build Coastguard Worker *flagref &= ~((Elf64_Word) EF_ARM_SYMSARESORTED);
71*7304104dSAndroid Build Coastguard Worker return "sorted symbol tables";
72*7304104dSAndroid Build Coastguard Worker }
73*7304104dSAndroid Build Coastguard Worker break;
74*7304104dSAndroid Build Coastguard Worker case EF_ARM_EABI_VER3:
75*7304104dSAndroid Build Coastguard Worker break;
76*7304104dSAndroid Build Coastguard Worker case EF_ARM_EABI_VER5:
77*7304104dSAndroid Build Coastguard Worker if ((*flagref & EF_ARM_SOFT_FLOAT) != 0)
78*7304104dSAndroid Build Coastguard Worker {
79*7304104dSAndroid Build Coastguard Worker *flagref &= ~((Elf64_Word) EF_ARM_SOFT_FLOAT);
80*7304104dSAndroid Build Coastguard Worker return "soft-float ABI";
81*7304104dSAndroid Build Coastguard Worker }
82*7304104dSAndroid Build Coastguard Worker if ((*flagref & EF_ARM_VFP_FLOAT) != 0)
83*7304104dSAndroid Build Coastguard Worker {
84*7304104dSAndroid Build Coastguard Worker *flagref &= ~((Elf64_Word) EF_ARM_VFP_FLOAT);
85*7304104dSAndroid Build Coastguard Worker return "hard-float ABI";
86*7304104dSAndroid Build Coastguard Worker }
87*7304104dSAndroid Build Coastguard Worker FALLTHROUGH;
88*7304104dSAndroid Build Coastguard Worker case EF_ARM_EABI_VER4:
89*7304104dSAndroid Build Coastguard Worker if ((*flagref & EF_ARM_BE8) != 0)
90*7304104dSAndroid Build Coastguard Worker {
91*7304104dSAndroid Build Coastguard Worker *flagref &= ~((Elf64_Word) EF_ARM_BE8);
92*7304104dSAndroid Build Coastguard Worker return "BE8";
93*7304104dSAndroid Build Coastguard Worker }
94*7304104dSAndroid Build Coastguard Worker if ((*flagref & EF_ARM_LE8) != 0)
95*7304104dSAndroid Build Coastguard Worker {
96*7304104dSAndroid Build Coastguard Worker *flagref &= ~((Elf64_Word) EF_ARM_LE8);
97*7304104dSAndroid Build Coastguard Worker return "LE8";
98*7304104dSAndroid Build Coastguard Worker }
99*7304104dSAndroid Build Coastguard Worker break;
100*7304104dSAndroid Build Coastguard Worker case EF_ARM_EABI_UNKNOWN:
101*7304104dSAndroid Build Coastguard Worker if ((*flagref & EF_ARM_INTERWORK) != 0)
102*7304104dSAndroid Build Coastguard Worker {
103*7304104dSAndroid Build Coastguard Worker *flagref &= ~((Elf64_Word) EF_ARM_INTERWORK);
104*7304104dSAndroid Build Coastguard Worker return "interworking enabled";
105*7304104dSAndroid Build Coastguard Worker }
106*7304104dSAndroid Build Coastguard Worker if ((*flagref & EF_ARM_APCS_26) != 0)
107*7304104dSAndroid Build Coastguard Worker {
108*7304104dSAndroid Build Coastguard Worker *flagref &= ~((Elf64_Word) EF_ARM_APCS_26);
109*7304104dSAndroid Build Coastguard Worker return "uses APCS/26";
110*7304104dSAndroid Build Coastguard Worker }
111*7304104dSAndroid Build Coastguard Worker if ((*flagref & EF_ARM_APCS_FLOAT) != 0)
112*7304104dSAndroid Build Coastguard Worker {
113*7304104dSAndroid Build Coastguard Worker *flagref &= ~((Elf64_Word) EF_ARM_APCS_FLOAT);
114*7304104dSAndroid Build Coastguard Worker return "uses APCS/float";
115*7304104dSAndroid Build Coastguard Worker }
116*7304104dSAndroid Build Coastguard Worker if ((*flagref & EF_ARM_PIC) != 0)
117*7304104dSAndroid Build Coastguard Worker {
118*7304104dSAndroid Build Coastguard Worker *flagref &= ~((Elf64_Word) EF_ARM_PIC);
119*7304104dSAndroid Build Coastguard Worker return "position independent";
120*7304104dSAndroid Build Coastguard Worker }
121*7304104dSAndroid Build Coastguard Worker if ((*flagref & EF_ARM_ALIGN8) != 0)
122*7304104dSAndroid Build Coastguard Worker {
123*7304104dSAndroid Build Coastguard Worker *flagref &= ~((Elf64_Word) EF_ARM_ALIGN8);
124*7304104dSAndroid Build Coastguard Worker return "8 bit structure alignment";
125*7304104dSAndroid Build Coastguard Worker }
126*7304104dSAndroid Build Coastguard Worker if ((*flagref & EF_ARM_NEW_ABI) != 0)
127*7304104dSAndroid Build Coastguard Worker {
128*7304104dSAndroid Build Coastguard Worker *flagref &= ~((Elf64_Word) EF_ARM_NEW_ABI);
129*7304104dSAndroid Build Coastguard Worker return "uses new ABI";
130*7304104dSAndroid Build Coastguard Worker }
131*7304104dSAndroid Build Coastguard Worker if ((*flagref & EF_ARM_OLD_ABI) != 0)
132*7304104dSAndroid Build Coastguard Worker {
133*7304104dSAndroid Build Coastguard Worker *flagref &= ~((Elf64_Word) EF_ARM_OLD_ABI);
134*7304104dSAndroid Build Coastguard Worker return "uses old ABI";
135*7304104dSAndroid Build Coastguard Worker }
136*7304104dSAndroid Build Coastguard Worker if ((*flagref & EF_ARM_SOFT_FLOAT) != 0)
137*7304104dSAndroid Build Coastguard Worker {
138*7304104dSAndroid Build Coastguard Worker *flagref &= ~((Elf64_Word) EF_ARM_SOFT_FLOAT);
139*7304104dSAndroid Build Coastguard Worker return "software FP";
140*7304104dSAndroid Build Coastguard Worker }
141*7304104dSAndroid Build Coastguard Worker if ((*flagref & EF_ARM_VFP_FLOAT) != 0)
142*7304104dSAndroid Build Coastguard Worker {
143*7304104dSAndroid Build Coastguard Worker *flagref &= ~((Elf64_Word) EF_ARM_VFP_FLOAT);
144*7304104dSAndroid Build Coastguard Worker return "VFP";
145*7304104dSAndroid Build Coastguard Worker }
146*7304104dSAndroid Build Coastguard Worker if ((*flagref & EF_ARM_MAVERICK_FLOAT) != 0)
147*7304104dSAndroid Build Coastguard Worker {
148*7304104dSAndroid Build Coastguard Worker *flagref &= ~((Elf64_Word) EF_ARM_MAVERICK_FLOAT);
149*7304104dSAndroid Build Coastguard Worker return "Maverick FP";
150*7304104dSAndroid Build Coastguard Worker }
151*7304104dSAndroid Build Coastguard Worker break;
152*7304104dSAndroid Build Coastguard Worker default:
153*7304104dSAndroid Build Coastguard Worker break;
154*7304104dSAndroid Build Coastguard Worker }
155*7304104dSAndroid Build Coastguard Worker return NULL;
156*7304104dSAndroid Build Coastguard Worker }
157