OpenCores
URL https://opencores.org/ocsvn/open8_urisc/open8_urisc/trunk

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [bfd/] [mach-o-x86-64.c] - Blame information for rev 161

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 14 khays
/* Intel x86-64 Mach-O support for BFD.
2
   Copyright 2010
3
   Free Software Foundation, Inc.
4
 
5
   This file is part of BFD, the Binary File Descriptor library.
6
 
7
   This program is free software; you can redistribute it and/or modify
8
   it under the terms of the GNU General Public License as published by
9
   the Free Software Foundation; either version 3 of the License, or
10
   (at your option) any later version.
11
 
12
   This program is distributed in the hope that it will be useful,
13
   but WITHOUT ANY WARRANTY; without even the implied warranty of
14
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
   GNU General Public License for more details.
16
 
17
   You should have received a copy of the GNU General Public License
18
   along with this program; if not, write to the Free Software
19
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20
   MA 02110-1301, USA.  */
21
 
22
#include "sysdep.h"
23
#include "mach-o.h"
24
#include "bfd.h"
25
#include "libbfd.h"
26
#include "libiberty.h"
27 161 khays
#include "mach-o/x86-64.h"
28 14 khays
 
29
#define bfd_mach_o_object_p bfd_mach_o_x86_64_object_p
30
#define bfd_mach_o_core_p bfd_mach_o_x86_64_core_p
31
#define bfd_mach_o_mkobject bfd_mach_o_x86_64_mkobject
32
 
33
static const bfd_target *
34
bfd_mach_o_x86_64_object_p (bfd *abfd)
35
{
36
  return bfd_mach_o_header_p (abfd, 0, BFD_MACH_O_CPU_TYPE_X86_64);
37
}
38
 
39
static const bfd_target *
40
bfd_mach_o_x86_64_core_p (bfd *abfd)
41
{
42
  return bfd_mach_o_header_p (abfd,
43
                              BFD_MACH_O_MH_CORE, BFD_MACH_O_CPU_TYPE_X86_64);
44
}
45
 
46
static bfd_boolean
47
bfd_mach_o_x86_64_mkobject (bfd *abfd)
48
{
49
  bfd_mach_o_data_struct *mdata;
50
 
51
  if (!bfd_mach_o_mkobject_init (abfd))
52
    return FALSE;
53
 
54
  mdata = bfd_mach_o_get_data (abfd);
55 161 khays
  mdata->header.magic = BFD_MACH_O_MH_MAGIC_64;
56 14 khays
  mdata->header.cputype = BFD_MACH_O_CPU_TYPE_X86_64;
57
  mdata->header.cpusubtype = BFD_MACH_O_CPU_SUBTYPE_X86_ALL;
58
  mdata->header.byteorder = BFD_ENDIAN_LITTLE;
59 161 khays
  mdata->header.version = 2;
60 14 khays
 
61
  return TRUE;
62
}
63
 
64
/* In case we're on a 32-bit machine, construct a 64-bit "-1" value.  */
65
#define MINUS_ONE (~ (bfd_vma) 0)
66
 
67
static reloc_howto_type x86_64_howto_table[]=
68
{
69
  /* 0 */
70
  HOWTO(BFD_RELOC_64, 0, 4, 64, FALSE, 0,
71
        complain_overflow_bitfield,
72
        NULL, "64",
73
        FALSE, MINUS_ONE, MINUS_ONE, FALSE),
74
  HOWTO(BFD_RELOC_32, 0, 2, 32, FALSE, 0,
75
        complain_overflow_bitfield,
76
        NULL, "32",
77
        FALSE, 0xffffffff, 0xffffffff, FALSE),
78
  HOWTO(BFD_RELOC_32_PCREL, 0, 2, 32, TRUE, 0,
79
        complain_overflow_bitfield,
80
        NULL, "DISP32",
81
        FALSE, 0xffffffff, 0xffffffff, TRUE),
82
  HOWTO(BFD_RELOC_MACH_O_X86_64_PCREL32_1, 0, 2, 32, TRUE, 0,
83
        complain_overflow_bitfield,
84
        NULL, "DISP32_1",
85
        FALSE, 0xffffffff, 0xffffffff, TRUE),
86
  /* 4 */
87
  HOWTO(BFD_RELOC_MACH_O_X86_64_PCREL32_2, 0, 2, 32, TRUE, 0,
88
        complain_overflow_bitfield,
89
        NULL, "DISP32_2",
90
        FALSE, 0xffffffff, 0xffffffff, TRUE),
91
  HOWTO(BFD_RELOC_MACH_O_X86_64_PCREL32_4, 0, 2, 32, TRUE, 0,
92
        complain_overflow_bitfield,
93
        NULL, "DISP32_4",
94
        FALSE, 0xffffffff, 0xffffffff, TRUE),
95
  HOWTO(BFD_RELOC_MACH_O_X86_64_BRANCH32, 0, 2, 32, TRUE, 0,
96
        complain_overflow_bitfield,
97
        NULL, "BRANCH32",
98
        FALSE, 0xffffffff, 0xffffffff, TRUE),
99
  HOWTO(BFD_RELOC_MACH_O_X86_64_GOT_LOAD, 0, 2, 32, TRUE, 0,
100
        complain_overflow_bitfield,
101
        NULL, "GOT_LOAD",
102
        FALSE, 0xffffffff, 0xffffffff, TRUE),
103
  /* 8 */
104
  HOWTO(BFD_RELOC_MACH_O_X86_64_SUBTRACTOR32, 0, 2, 32, FALSE, 0,
105
        complain_overflow_bitfield,
106
        NULL, "SUBTRACTOR32",
107
        FALSE, 0xffffffff, 0xffffffff, FALSE),
108
  HOWTO(BFD_RELOC_MACH_O_X86_64_SUBTRACTOR64, 0, 4, 64, FALSE, 0,
109
        complain_overflow_bitfield,
110
        NULL, "SUBTRACTOR64",
111
        FALSE, MINUS_ONE, MINUS_ONE, FALSE),
112
  HOWTO(BFD_RELOC_MACH_O_X86_64_GOT, 0, 2, 32, TRUE, 0,
113
        complain_overflow_bitfield,
114
        NULL, "GOT",
115
        FALSE, 0xffffffff, 0xffffffff, TRUE),
116
  HOWTO(BFD_RELOC_MACH_O_X86_64_BRANCH8, 0, 0, 8, TRUE, 0,
117
        complain_overflow_bitfield,
118
        NULL, "BRANCH8",
119
        FALSE, 0xff, 0xff, TRUE),
120
};
121
 
122
static bfd_boolean
123
bfd_mach_o_x86_64_swap_reloc_in (arelent *res, bfd_mach_o_reloc_info *reloc)
124
{
125
  /* On x86-64, scattered relocs are not used.  */
126
  if (reloc->r_scattered)
127
    return FALSE;
128
 
129
  switch (reloc->r_type)
130
    {
131
    case BFD_MACH_O_X86_64_RELOC_UNSIGNED:
132
      if (reloc->r_pcrel)
133
        return FALSE;
134
      switch (reloc->r_length)
135
        {
136
        case 2:
137
          res->howto = &x86_64_howto_table[1];
138
          return TRUE;
139
        case 3:
140
          res->howto = &x86_64_howto_table[0];
141
          return TRUE;
142
        default:
143
          return FALSE;
144
        }
145
    case BFD_MACH_O_X86_64_RELOC_SIGNED:
146
      if (reloc->r_length == 2 && reloc->r_pcrel)
147
        {
148
          res->howto = &x86_64_howto_table[2];
149
          return TRUE;
150
        }
151
      break;
152
    case BFD_MACH_O_X86_64_RELOC_BRANCH:
153
      if (!reloc->r_pcrel)
154
        return FALSE;
155
      switch (reloc->r_length)
156
        {
157
        case 2:
158
          res->howto = &x86_64_howto_table[6];
159
          return TRUE;
160
        default:
161
          return FALSE;
162
        }
163
      break;
164
    case BFD_MACH_O_X86_64_RELOC_GOT_LOAD:
165
      if (reloc->r_length == 2 && reloc->r_pcrel && reloc->r_extern)
166
        {
167
          res->howto = &x86_64_howto_table[7];
168
          return TRUE;
169
        }
170
      break;
171
    case BFD_MACH_O_X86_64_RELOC_GOT:
172
      if (reloc->r_length == 2 && reloc->r_pcrel && reloc->r_extern)
173
        {
174
          res->howto = &x86_64_howto_table[10];
175
          return TRUE;
176
        }
177
      break;
178
    case BFD_MACH_O_X86_64_RELOC_SUBTRACTOR:
179
      if (reloc->r_pcrel)
180
        return FALSE;
181
      switch (reloc->r_length)
182
        {
183
        case 2:
184
          res->howto = &x86_64_howto_table[8];
185
          return TRUE;
186
        case 3:
187
          res->howto = &x86_64_howto_table[9];
188
          return TRUE;
189
        default:
190
          return FALSE;
191
        }
192
      break;
193
    case BFD_MACH_O_X86_64_RELOC_SIGNED_1:
194
      if (reloc->r_length == 2 && reloc->r_pcrel)
195
        {
196
          res->howto = &x86_64_howto_table[3];
197
          return TRUE;
198
        }
199
      break;
200
    case BFD_MACH_O_X86_64_RELOC_SIGNED_2:
201
      if (reloc->r_length == 2 && reloc->r_pcrel)
202
        {
203
          res->howto = &x86_64_howto_table[4];
204
          return TRUE;
205
        }
206
      break;
207
    case BFD_MACH_O_X86_64_RELOC_SIGNED_4:
208
      if (reloc->r_length == 2 && reloc->r_pcrel)
209
        {
210
          res->howto = &x86_64_howto_table[5];
211
          return TRUE;
212
        }
213
      break;
214
    default:
215
      return FALSE;
216
    }
217
  return FALSE;
218
}
219
 
220
static bfd_boolean
221
bfd_mach_o_x86_64_swap_reloc_out (arelent *rel, bfd_mach_o_reloc_info *rinfo)
222
{
223
  rinfo->r_address = rel->address;
224 161 khays
  rinfo->r_scattered = 0;
225 14 khays
  switch (rel->howto->type)
226
    {
227
    case BFD_RELOC_64:
228
      rinfo->r_type = BFD_MACH_O_X86_64_RELOC_UNSIGNED;
229
      rinfo->r_pcrel = 0;
230 161 khays
      rinfo->r_length = 3;
231 14 khays
      break;
232 161 khays
    case BFD_RELOC_32_PCREL:
233
      rinfo->r_type = BFD_MACH_O_X86_64_RELOC_BRANCH;
234
      rinfo->r_pcrel = 1;
235
      rinfo->r_length = 2;
236
      break;
237
    case BFD_RELOC_MACH_O_X86_64_SUBTRACTOR64:
238
      rinfo->r_type = BFD_MACH_O_X86_64_RELOC_SUBTRACTOR;
239
      rinfo->r_pcrel = 0;
240
      rinfo->r_length = 3;
241
      break;
242
    case BFD_RELOC_MACH_O_X86_64_GOT_LOAD:
243
      rinfo->r_type = BFD_MACH_O_X86_64_RELOC_GOT_LOAD;
244
      rinfo->r_pcrel = 1;
245
      rinfo->r_length = 2;
246
      break;
247 14 khays
    default:
248
      return FALSE;
249
    }
250 161 khays
  if ((*rel->sym_ptr_ptr)->flags & BSF_SECTION_SYM)
251
    {
252
      rinfo->r_extern = 0;
253
      rinfo->r_value = (*rel->sym_ptr_ptr)->section->target_index;
254
    }
255
  else
256
    {
257
      rinfo->r_extern = 1;
258
      rinfo->r_value = (*rel->sym_ptr_ptr)->udata.i;
259
    }
260 14 khays
  return TRUE;
261
}
262
 
263
static reloc_howto_type *
264
bfd_mach_o_x86_64_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
265
                                         bfd_reloc_code_real_type code)
266
{
267
  unsigned int i;
268
 
269
  for (i = 0;
270
       i < sizeof (x86_64_howto_table) / sizeof (*x86_64_howto_table);
271
       i++)
272
    if (code == x86_64_howto_table[i].type)
273
      return &x86_64_howto_table[i];
274
  return NULL;
275
}
276
 
277
static reloc_howto_type *
278
bfd_mach_o_x86_64_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
279
                                         const char *name ATTRIBUTE_UNUSED)
280
{
281
  return NULL;
282
}
283
 
284
#define bfd_mach_o_swap_reloc_in bfd_mach_o_x86_64_swap_reloc_in
285
#define bfd_mach_o_swap_reloc_out bfd_mach_o_x86_64_swap_reloc_out
286
 
287
#define bfd_mach_o_bfd_reloc_type_lookup bfd_mach_o_x86_64_bfd_reloc_type_lookup
288
#define bfd_mach_o_bfd_reloc_name_lookup bfd_mach_o_x86_64_bfd_reloc_name_lookup
289
#define bfd_mach_o_print_thread NULL
290
 
291
#define TARGET_NAME             mach_o_x86_64_vec
292
#define TARGET_STRING           "mach-o-x86-64"
293
#define TARGET_ARCHITECTURE     bfd_arch_i386
294
#define TARGET_BIG_ENDIAN       0
295
#define TARGET_ARCHIVE          0
296
#include "mach-o-target.c"

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.