1 /* SPARC specific symbolic name handling.
2 Copyright (C) 2002, 2003 Red Hat, Inc.
3 Written by Jakub Jelinek <jakub@redhat.com>, 2002.
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_sparc.h>
23
24
25 /* Return of the backend. */
26 const char *
sparc_backend_name(void)27 sparc_backend_name (void)
28 {
29 return "sparc";
30 }
31
32
33 /* Relocation mapping table. */
34 static const char *reloc_map_table[] =
35 {
36 [R_SPARC_NONE] = "R_SPARC_NONE",
37 [R_SPARC_8] = "R_SPARC_8",
38 [R_SPARC_16] = "R_SPARC_16",
39 [R_SPARC_32] = "R_SPARC_32",
40 [R_SPARC_DISP8] = "R_SPARC_DISP8",
41 [R_SPARC_DISP16] = "R_SPARC_DISP16",
42 [R_SPARC_DISP32] = "R_SPARC_DISP32",
43 [R_SPARC_WDISP30] = "R_SPARC_WDISP30",
44 [R_SPARC_WDISP22] = "R_SPARC_WDISP22",
45 [R_SPARC_HI22] = "R_SPARC_HI22",
46 [R_SPARC_22] = "R_SPARC_22",
47 [R_SPARC_13] = "R_SPARC_13",
48 [R_SPARC_LO10] = "R_SPARC_LO10",
49 [R_SPARC_GOT10] = "R_SPARC_GOT10",
50 [R_SPARC_GOT13] = "R_SPARC_GOT13",
51 [R_SPARC_GOT22] = "R_SPARC_GOT22",
52 [R_SPARC_PC10] = "R_SPARC_PC10",
53 [R_SPARC_PC22] = "R_SPARC_PC22",
54 [R_SPARC_WPLT30] = "R_SPARC_WPLT30",
55 [R_SPARC_COPY] = "R_SPARC_COPY",
56 [R_SPARC_GLOB_DAT] = "R_SPARC_GLOB_DAT",
57 [R_SPARC_JMP_SLOT] = "R_SPARC_JMP_SLOT",
58 [R_SPARC_RELATIVE] = "R_SPARC_RELATIVE",
59 [R_SPARC_UA32] = "R_SPARC_UA32",
60 [R_SPARC_PLT32] = "R_SPARC_PLT32",
61 [R_SPARC_HIPLT22] = "R_SPARC_HIPLT22",
62 [R_SPARC_LOPLT10] = "R_SPARC_LOPLT10",
63 [R_SPARC_PCPLT32] = "R_SPARC_PCPLT32",
64 [R_SPARC_PCPLT22] = "R_SPARC_PCPLT22",
65 [R_SPARC_PCPLT10] = "R_SPARC_PCPLT10",
66 [R_SPARC_10] = "R_SPARC_10",
67 [R_SPARC_11] = "R_SPARC_11",
68 [R_SPARC_64] = "R_SPARC_64",
69 [R_SPARC_OLO10] = "R_SPARC_OLO10",
70 [R_SPARC_HH22] = "R_SPARC_HH22",
71 [R_SPARC_HM10] = "R_SPARC_HM10",
72 [R_SPARC_LM22] = "R_SPARC_LM22",
73 [R_SPARC_PC_HH22] = "R_SPARC_PC_HH22",
74 [R_SPARC_PC_HM10] = "R_SPARC_PC_HM10",
75 [R_SPARC_PC_LM22] = "R_SPARC_PC_LM22",
76 [R_SPARC_WDISP16] = "R_SPARC_WDISP16",
77 [R_SPARC_WDISP19] = "R_SPARC_WDISP19",
78 [R_SPARC_7] = "R_SPARC_7",
79 [R_SPARC_5] = "R_SPARC_5",
80 [R_SPARC_6] = "R_SPARC_6",
81 [R_SPARC_DISP64] = "R_SPARC_DISP64",
82 [R_SPARC_PLT64] = "R_SPARC_PLT64",
83 [R_SPARC_HIX22] = "R_SPARC_HIX22",
84 [R_SPARC_LOX10] = "R_SPARC_LOX10",
85 [R_SPARC_H44] = "R_SPARC_H44",
86 [R_SPARC_M44] = "R_SPARC_M44",
87 [R_SPARC_L44] = "R_SPARC_L44",
88 [R_SPARC_REGISTER] = "R_SPARC_REGISTER",
89 [R_SPARC_UA64] = "R_SPARC_UA64",
90 [R_SPARC_UA16] = "R_SPARC_UA16",
91 [R_SPARC_TLS_GD_HI22] = "R_SPARC_TLS_GD_HI22",
92 [R_SPARC_TLS_GD_LO10] = "R_SPARC_TLS_GD_LO10",
93 [R_SPARC_TLS_GD_ADD] = "R_SPARC_TLS_GD_ADD",
94 [R_SPARC_TLS_GD_CALL] = "R_SPARC_TLS_GD_CALL",
95 [R_SPARC_TLS_LDM_HI22] = "R_SPARC_TLS_LDM_HI22",
96 [R_SPARC_TLS_LDM_LO10] = "R_SPARC_TLS_LDM_LO10",
97 [R_SPARC_TLS_LDM_ADD] = "R_SPARC_TLS_LDM_ADD",
98 [R_SPARC_TLS_LDM_CALL] = "R_SPARC_TLS_LDM_CALL",
99 [R_SPARC_TLS_LDO_HIX22] = "R_SPARC_TLS_LDO_HIX22",
100 [R_SPARC_TLS_LDO_LOX10] = "R_SPARC_TLS_LDO_LOX10",
101 [R_SPARC_TLS_LDO_ADD] = "R_SPARC_TLS_LDO_ADD",
102 [R_SPARC_TLS_IE_HI22] = "R_SPARC_TLS_IE_HI22",
103 [R_SPARC_TLS_IE_LO10] = "R_SPARC_TLS_IE_LO10",
104 [R_SPARC_TLS_IE_LD] = "R_SPARC_TLS_IE_LD",
105 [R_SPARC_TLS_IE_LDX] = "R_SPARC_TLS_IE_LDX",
106 [R_SPARC_TLS_IE_ADD] = "R_SPARC_TLS_IE_ADD",
107 [R_SPARC_TLS_LE_HIX22] = "R_SPARC_TLS_LE_HIX22",
108 [R_SPARC_TLS_LE_LOX10] = "R_SPARC_TLS_LE_LOX10",
109 [R_SPARC_TLS_DTPMOD32] = "R_SPARC_TLS_DTPMOD32",
110 [R_SPARC_TLS_DTPMOD64] = "R_SPARC_TLS_DTPMOD64",
111 [R_SPARC_TLS_DTPOFF32] = "R_SPARC_TLS_DTPOFF32",
112 [R_SPARC_TLS_DTPOFF64] = "R_SPARC_TLS_DTPOFF64",
113 [R_SPARC_TLS_TPOFF32] = "R_SPARC_TLS_TPOFF32",
114 [R_SPARC_TLS_TPOFF64] = "R_SPARC_TLS_TPOFF64"
115 };
116
117
118 /* Determine relocation type string for sparc. */
119 const char *
sparc_reloc_type_name(int type,char * buf,size_t len)120 sparc_reloc_type_name (int type, char *buf, size_t len)
121 {
122 /* High 24 bits of r_type are used for second addend in R_SPARC_OLO10. */
123 if ((type & 0xff) == R_SPARC_OLO10)
124 return reloc_map_table[type & 0xff];
125
126 if (type < 0 || type >= R_SPARC_NUM)
127 return NULL;
128
129 return reloc_map_table[type];
130 }
131
132
133 /* Check for correct relocation type. */
134 bool
sparc_reloc_type_check(int type)135 sparc_reloc_type_check (int type)
136 {
137 if ((type & 0xff) == R_SPARC_OLO10)
138 return true;
139 return (type >= R_SPARC_NONE && type < R_SPARC_NUM
140 && reloc_map_table[type] != NULL) ? true : false;
141 }
142