1 /* MIPS specific symbolic name handling.
2 Copyright (C) 2000, 2001, 2002 Red Hat, Inc.
3 Written by Ulrich Drepper <drepper@redhat.com>, 2000.
4
5 This program is Open Source software; you can redistribute it and/or
6 modify it under the terms of the Open Software License version 1.0 as
7 published by the Open Source Initiative.
8
9 You should have received a copy of the Open Software License along
10 with this program; if not, you may obtain a copy of the Open Software
11 License version 1.0 from http://www.opensource.org/licenses/osl.php or
12 by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
13 3001 King Ranch Road, Ukiah, CA 95482. */
14
15 #ifdef HAVE_CONFIG_H
16 # include <config.h>
17 #endif
18
19 #include <elf.h>
20 #include <stddef.h>
21
22 #include <libebl_mips.h>
23
24
25 /* Return of the backend. */
26 const char *
mips_backend_name(void)27 mips_backend_name (void)
28 {
29 return "mips";
30 }
31
32
33 /* Determine relocation type string for MIPS. */
34 const char *
mips_reloc_type_name(int type,char * buf,size_t len)35 mips_reloc_type_name (int type, char *buf, size_t len)
36 {
37 static const char *map_table[] =
38 {
39 [R_MIPS_NONE] = "MIPS_NONE",
40 [R_MIPS_16] = "MIPS_16",
41 [R_MIPS_32] = "MIPS_32",
42 [R_MIPS_REL32] = "MIPS_REL32",
43 [R_MIPS_26] = "MIPS_26",
44 [R_MIPS_HI16] = "MIPS_HI16",
45 [R_MIPS_LO16] = "MIPS_LO16",
46 [R_MIPS_GPREL16] = "MIPS_GPREL16",
47 [R_MIPS_LITERAL] = "MIPS_LITERAL",
48 [R_MIPS_GOT16] = "MIPS_GOT16",
49 [R_MIPS_PC16] = "MIPS_PC16",
50 [R_MIPS_CALL16] = "MIPS_CALL16",
51 [R_MIPS_GPREL32] = "MIPS_GPREL32",
52 [R_MIPS_SHIFT5] = "MIPS_SHIFT5",
53 [R_MIPS_SHIFT6] = "MIPS_SHIFT6",
54 [R_MIPS_64] = "MIPS_64",
55 [R_MIPS_GOT_DISP] = "MIPS_GOT_DISP",
56 [R_MIPS_GOT_PAGE] = "MIPS_GOT_PAGE",
57 [R_MIPS_GOT_OFST] = "MIPS_GOT_OFST",
58 [R_MIPS_GOT_HI16] = "MIPS_GOT_HI16",
59 [R_MIPS_GOT_LO16] = "MIPS_GOT_LO16",
60 [R_MIPS_SUB] = "MIPS_SUB",
61 [R_MIPS_INSERT_A] = "MIPS_INSERT_A",
62 [R_MIPS_INSERT_B] = "MIPS_INSERT_B",
63 [R_MIPS_DELETE] = "MIPS_DELETE",
64 [R_MIPS_HIGHER] = "MIPS_HIGHER",
65 [R_MIPS_HIGHEST] = "MIPS_HIGHEST",
66 [R_MIPS_CALL_HI16] = "MIPS_CALL_HI16",
67 [R_MIPS_CALL_LO16] = "MIPS_CALL_LO16",
68 [R_MIPS_SCN_DISP] = "MIPS_SCN_DISP",
69 [R_MIPS_REL16] = "MIPS_REL16",
70 [R_MIPS_ADD_IMMEDIATE] = "MIPS_ADD_IMMEDIATE",
71 [R_MIPS_PJUMP] = "MIPS_PJUMP",
72 [R_MIPS_RELGOT] = "MIPS_RELGOT",
73 [R_MIPS_JALR] = "MIPS_JALR"
74 };
75
76 if (type < 0 || type >= R_MIPS_NUM)
77 return NULL;
78
79 return map_table[type];
80 }
81
82
83 const char *
mips_segment_type_name(int type,char * buf,size_t len)84 mips_segment_type_name (int type, char *buf, size_t len)
85 {
86 static const struct
87 {
88 int type;
89 const char *str;
90 } mips_segments[] =
91 {
92 { PT_MIPS_REGINFO, "MIPS_REGINFO" },
93 { PT_MIPS_RTPROC, "MIPS_RTPROC" },
94 { PT_MIPS_OPTIONS, "MIPS_OPTIONS" }
95 };
96 #define nsegments (sizeof (mips_segments) / sizeof (mips_segments[0]))
97 size_t cnt;
98
99 for (cnt = 0; cnt < nsegments; ++cnt)
100 if (type == mips_segments[cnt].type)
101 return mips_segments[cnt].str;
102
103 /* We don't know the segment type. */
104 return NULL;
105 }
106
107
108 const char *
mips_section_type_name(int type,char * buf,size_t len)109 mips_section_type_name (int type, char *buf, size_t len)
110 {
111 static const struct
112 {
113 int type;
114 const char *str;
115 } mips_sections[] =
116 {
117 { SHT_MIPS_LIBLIST, "MIPS_LIBLIST" },
118 { SHT_MIPS_MSYM, "MIPS_MSYM" },
119 { SHT_MIPS_CONFLICT, "MIPS_CONFLICT" },
120 { SHT_MIPS_GPTAB, "MIPS_GPTAB" },
121 { SHT_MIPS_UCODE, "MIPS_UCODE" },
122 { SHT_MIPS_DEBUG, "MIPS_DEBUG" },
123 { SHT_MIPS_REGINFO, "MIPS_REGINFO" },
124 { SHT_MIPS_PACKAGE, "MIPS_PACKAGE" },
125 { SHT_MIPS_PACKSYM, "MIPS_PACKSYM" },
126 { SHT_MIPS_RELD, "MIPS_RELD" },
127 { SHT_MIPS_IFACE, "MIPS_IFACE" },
128 { SHT_MIPS_CONTENT, "MIPS_CONTENT" },
129 { SHT_MIPS_OPTIONS, "MIPS_OPTIONS" },
130 { SHT_MIPS_SHDR, "MIPS_SHDR" },
131 { SHT_MIPS_FDESC, "MIPS_FDESC" },
132 { SHT_MIPS_EXTSYM, "MIPS_EXTSYM" },
133 { SHT_MIPS_DENSE, "MIPS_DENSE" },
134 { SHT_MIPS_PDESC, "MIPS_PDESC" },
135 { SHT_MIPS_LOCSYM, "MIPS_LOCSYM" },
136 { SHT_MIPS_AUXSYM, "MIPS_AUXSYM" },
137 { SHT_MIPS_OPTSYM, "MIPS_OPTSYM" },
138 { SHT_MIPS_LOCSTR, "MIPS_LOCSTR" },
139 { SHT_MIPS_LINE, "MIPS_LINE" },
140 { SHT_MIPS_RFDESC, "MIPS_RFDESC" },
141 { SHT_MIPS_DELTASYM, "MIPS_DELTASYM" },
142 { SHT_MIPS_DELTAINST, "MIPS_DELTAINST" },
143 { SHT_MIPS_DELTACLASS, "MIPS_DELTACLASS" },
144 { SHT_MIPS_DWARF, "MIPS_DWARF" },
145 { SHT_MIPS_DELTADECL, "MIPS_DELTADECL" },
146 { SHT_MIPS_SYMBOL_LIB, "MIPS_SYMBOL_LIB" },
147 { SHT_MIPS_EVENTS, "MIPS_EVENTS" },
148 { SHT_MIPS_TRANSLATE, "MIPS_TRANSLATE" },
149 { SHT_MIPS_PIXIE, "MIPS_PIXIE" },
150 { SHT_MIPS_XLATE, "MIPS_XLATE" },
151 { SHT_MIPS_XLATE_DEBUG, "MIPS_XLATE_DEBUG" },
152 { SHT_MIPS_WHIRL, "MIPS_WHIRL" },
153 { SHT_MIPS_EH_REGION, "MIPS_EH_REGION" },
154 { SHT_MIPS_XLATE_OLD, "MIPS_XLATE_OLD" },
155 { SHT_MIPS_PDR_EXCEPTION, "MIPS_PDR_EXCEPTION" }
156 };
157 #define nsections (sizeof (mips_sections) / sizeof (mips_sections[0]))
158 size_t cnt;
159
160 for (cnt = 0; cnt < nsections; ++cnt)
161 if (type == mips_sections[cnt].type)
162 return mips_sections[cnt].str;
163
164 /* We don't know the section type. */
165 return NULL;
166 }
167
168
169 const char *
mips_machine_flag_name(Elf64_Word * flags)170 mips_machine_flag_name (Elf64_Word *flags)
171 {
172 static const struct
173 {
174 unsigned int mask;
175 unsigned int flag;
176 const char *str;
177 } mips_flags[] =
178 {
179 { EF_MIPS_NOREORDER, EF_MIPS_NOREORDER, "noreorder" },
180 { EF_MIPS_PIC, EF_MIPS_PIC, "pic" },
181 { EF_MIPS_CPIC, EF_MIPS_CPIC, "cpic" },
182 { EF_MIPS_ABI2, EF_MIPS_ABI2, "abi2" },
183 { EF_MIPS_ARCH, E_MIPS_ARCH_1, "mips1" },
184 { EF_MIPS_ARCH, E_MIPS_ARCH_2, "mips2" },
185 { EF_MIPS_ARCH, E_MIPS_ARCH_3, "mips3" },
186 { EF_MIPS_ARCH, E_MIPS_ARCH_4, "mips4" },
187 { EF_MIPS_ARCH, E_MIPS_ARCH_5, "mips5" }
188 };
189 #define nflags (sizeof (mips_flags) / sizeof (mips_flags[0]))
190 size_t cnt;
191
192 for (cnt = 0; cnt < nflags; ++cnt)
193 if ((*flags & mips_flags[cnt].mask) == mips_flags[cnt].flag)
194 {
195 *flags &= ~mips_flags[cnt].mask;
196 return mips_flags[cnt].str;
197 }
198
199 /* We don't know the flag. */
200 return NULL;
201 }
202
203
204 const char *
mips_dynamic_tag_name(int64_t tag,char * buf,size_t len)205 mips_dynamic_tag_name (int64_t tag, char *buf, size_t len)
206 {
207 static const struct
208 {
209 int tag;
210 const char *str;
211 } mips_dtags[] =
212 {
213 { DT_MIPS_RLD_VERSION, "MIPS_RLD_VERSION" },
214 { DT_MIPS_TIME_STAMP, "MIPS_TIME_STAMP" },
215 { DT_MIPS_ICHECKSUM, "MIPS_ICHECKSUM" },
216 { DT_MIPS_IVERSION, "MIPS_IVERSION" },
217 { DT_MIPS_FLAGS, "MIPS_FLAGS" },
218 { DT_MIPS_BASE_ADDRESS, "MIPS_BASE_ADDRESS" },
219 { DT_MIPS_MSYM, "MIPS_MSYM" },
220 { DT_MIPS_CONFLICT, "MIPS_CONFLICT" },
221 { DT_MIPS_LIBLIST, "MIPS_LIBLIST" },
222 { DT_MIPS_LOCAL_GOTNO, "MIPS_LOCAL_GOTNO" },
223 { DT_MIPS_CONFLICTNO, "MIPS_CONFLICTNO" },
224 { DT_MIPS_LIBLISTNO, "MIPS_LIBLISTNO" },
225 { DT_MIPS_SYMTABNO, "MIPS_SYMTABNO" },
226 { DT_MIPS_UNREFEXTNO, "MIPS_UNREFEXTNO" },
227 { DT_MIPS_GOTSYM, "MIPS_GOTSYM" },
228 { DT_MIPS_HIPAGENO, "MIPS_HIPAGENO" },
229 { DT_MIPS_RLD_MAP, "MIPS_RLD_MAP" },
230 { DT_MIPS_DELTA_CLASS, "MIPS_DELTA_CLASS" },
231 { DT_MIPS_DELTA_CLASS_NO, "MIPS_DELTA_CLASS_NO" },
232 { DT_MIPS_DELTA_INSTANCE, "MIPS_DELTA_INSTANCE" },
233 { DT_MIPS_DELTA_INSTANCE_NO, "MIPS_DELTA_INSTANCE_NO" },
234 { DT_MIPS_DELTA_RELOC, "MIPS_DELTA_RELOC" },
235 { DT_MIPS_DELTA_RELOC_NO, "MIPS_DELTA_RELOC_NO" },
236 { DT_MIPS_DELTA_SYM, "MIPS_DELTA_SYM" },
237 { DT_MIPS_DELTA_SYM_NO, "MIPS_DELTA_SYM_NO" },
238 { DT_MIPS_DELTA_CLASSSYM, "MIPS_DELTA_CLASSSYM" },
239 { DT_MIPS_DELTA_CLASSSYM_NO, "MIPS_DELTA_CLASSSYM_NO" },
240 { DT_MIPS_CXX_FLAGS, "MIPS_CXX_FLAGS" },
241 { DT_MIPS_PIXIE_INIT, "MIPS_PIXIE_INIT" },
242 { DT_MIPS_SYMBOL_LIB, "MIPS_SYMBOL_LIB" },
243 { DT_MIPS_LOCALPAGE_GOTIDX, "MIPS_LOCALPAGE_GOTIDX" },
244 { DT_MIPS_LOCAL_GOTIDX, "MIPS_LOCAL_GOTIDX" },
245 { DT_MIPS_HIDDEN_GOTIDX, "MIPS_HIDDEN_GOTIDX" },
246 { DT_MIPS_PROTECTED_GOTIDX, "MIPS_PROTECTED_GOTIDX" },
247 { DT_MIPS_OPTIONS, "MIPS_OPTIONS" },
248 { DT_MIPS_INTERFACE, "MIPS_INTERFACE" },
249 { DT_MIPS_DYNSTR_ALIGN, "MIPS_DYNSTR_ALIGN" },
250 { DT_MIPS_INTERFACE_SIZE, "MIPS_INTERFACE_SIZE" },
251 { DT_MIPS_RLD_TEXT_RESOLVE_ADDR, "MIPS_RLD_TEXT_RESOLVE_ADDR" },
252 { DT_MIPS_PERF_SUFFIX, "MIPS_PERF_SUFFIX" },
253 { DT_MIPS_COMPACT_SIZE, "MIPS_COMPACT_SIZE" },
254 { DT_MIPS_GP_VALUE, "MIPS_GP_VALUE" },
255 { DT_MIPS_AUX_DYNAMIC, "MIPS_AUX_DYNAMIC" },
256 };
257 #define ndtags (sizeof (mips_dtags) / sizeof (mips_dtags[0]))
258 size_t cnt;
259
260 for (cnt = 0; cnt < ndtags; ++cnt)
261 if (tag == mips_dtags[cnt].tag)
262 return mips_dtags[cnt].str;
263
264 /* We don't know this dynamic tag. */
265 return NULL;
266 }
267