xref: /netbsd-src/external/gpl3/binutils.old/dist/bfd/mach-o-x86-64.c (revision e992f068c547fd6e84b3f104dc2340adcc955732)
175fd0b74Schristos /* Intel x86-64 Mach-O support for BFD.
2*e992f068Schristos    Copyright (C) 2010-2022 Free Software Foundation, Inc.
375fd0b74Schristos 
475fd0b74Schristos    This file is part of BFD, the Binary File Descriptor library.
575fd0b74Schristos 
675fd0b74Schristos    This program is free software; you can redistribute it and/or modify
775fd0b74Schristos    it under the terms of the GNU General Public License as published by
875fd0b74Schristos    the Free Software Foundation; either version 3 of the License, or
975fd0b74Schristos    (at your option) any later version.
1075fd0b74Schristos 
1175fd0b74Schristos    This program is distributed in the hope that it will be useful,
1275fd0b74Schristos    but WITHOUT ANY WARRANTY; without even the implied warranty of
1375fd0b74Schristos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1475fd0b74Schristos    GNU General Public License for more details.
1575fd0b74Schristos 
1675fd0b74Schristos    You should have received a copy of the GNU General Public License
1775fd0b74Schristos    along with this program; if not, write to the Free Software
1875fd0b74Schristos    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
1975fd0b74Schristos    MA 02110-1301, USA.  */
2075fd0b74Schristos 
2175fd0b74Schristos #include "sysdep.h"
2275fd0b74Schristos #include "bfd.h"
2375fd0b74Schristos #include "libbfd.h"
2475fd0b74Schristos #include "libiberty.h"
25012573ebSchristos #include "mach-o.h"
2675fd0b74Schristos #include "mach-o/x86-64.h"
2775fd0b74Schristos 
2875fd0b74Schristos #define bfd_mach_o_object_p bfd_mach_o_x86_64_object_p
2975fd0b74Schristos #define bfd_mach_o_core_p bfd_mach_o_x86_64_core_p
3075fd0b74Schristos #define bfd_mach_o_mkobject bfd_mach_o_x86_64_mkobject
3175fd0b74Schristos 
32*e992f068Schristos static bfd_cleanup
bfd_mach_o_x86_64_object_p(bfd * abfd)3375fd0b74Schristos bfd_mach_o_x86_64_object_p (bfd *abfd)
3475fd0b74Schristos {
3575fd0b74Schristos   return bfd_mach_o_header_p (abfd, 0, 0, BFD_MACH_O_CPU_TYPE_X86_64);
3675fd0b74Schristos }
3775fd0b74Schristos 
38*e992f068Schristos static bfd_cleanup
bfd_mach_o_x86_64_core_p(bfd * abfd)3975fd0b74Schristos bfd_mach_o_x86_64_core_p (bfd *abfd)
4075fd0b74Schristos {
4175fd0b74Schristos   return bfd_mach_o_header_p (abfd, 0,
4275fd0b74Schristos 			      BFD_MACH_O_MH_CORE, BFD_MACH_O_CPU_TYPE_X86_64);
4375fd0b74Schristos }
4475fd0b74Schristos 
45*e992f068Schristos static bool
bfd_mach_o_x86_64_mkobject(bfd * abfd)4675fd0b74Schristos bfd_mach_o_x86_64_mkobject (bfd *abfd)
4775fd0b74Schristos {
4875fd0b74Schristos   bfd_mach_o_data_struct *mdata;
4975fd0b74Schristos 
5075fd0b74Schristos   if (!bfd_mach_o_mkobject_init (abfd))
51*e992f068Schristos     return false;
5275fd0b74Schristos 
5375fd0b74Schristos   mdata = bfd_mach_o_get_data (abfd);
5475fd0b74Schristos   mdata->header.magic = BFD_MACH_O_MH_MAGIC_64;
5575fd0b74Schristos   mdata->header.cputype = BFD_MACH_O_CPU_TYPE_X86_64;
5675fd0b74Schristos   mdata->header.cpusubtype =
5775fd0b74Schristos     BFD_MACH_O_CPU_SUBTYPE_X86_ALL | BFD_MACH_O_CPU_SUBTYPE_LIB64;
5875fd0b74Schristos   mdata->header.byteorder = BFD_ENDIAN_LITTLE;
5975fd0b74Schristos   mdata->header.version = 2;
6075fd0b74Schristos 
61*e992f068Schristos   return true;
6275fd0b74Schristos }
6375fd0b74Schristos 
6475fd0b74Schristos /* In case we're on a 32-bit machine, construct a 64-bit "-1" value.  */
6575fd0b74Schristos #define MINUS_ONE (~ (bfd_vma) 0)
6675fd0b74Schristos 
6775fd0b74Schristos static reloc_howto_type x86_64_howto_table[]=
6875fd0b74Schristos {
6975fd0b74Schristos   /* 0 */
70*e992f068Schristos   HOWTO(BFD_RELOC_64, 0, 8, 64, false, 0,
7175fd0b74Schristos 	complain_overflow_bitfield,
7275fd0b74Schristos 	NULL, "64",
73*e992f068Schristos 	false, MINUS_ONE, MINUS_ONE, false),
74*e992f068Schristos   HOWTO(BFD_RELOC_32, 0, 4, 32, false, 0,
7575fd0b74Schristos 	complain_overflow_bitfield,
7675fd0b74Schristos 	NULL, "32",
77*e992f068Schristos 	false, 0xffffffff, 0xffffffff, false),
78*e992f068Schristos   HOWTO(BFD_RELOC_32_PCREL, 0, 4, 32, true, 0,
7975fd0b74Schristos 	complain_overflow_bitfield,
8075fd0b74Schristos 	NULL, "DISP32",
81*e992f068Schristos 	false, 0xffffffff, 0xffffffff, true),
82*e992f068Schristos   HOWTO(BFD_RELOC_MACH_O_X86_64_PCREL32_1, 0, 4, 32, true, 0,
8375fd0b74Schristos 	complain_overflow_bitfield,
8475fd0b74Schristos 	NULL, "DISP32_1",
85*e992f068Schristos 	false, 0xffffffff, 0xffffffff, true),
8675fd0b74Schristos   /* 4 */
87*e992f068Schristos   HOWTO(BFD_RELOC_MACH_O_X86_64_PCREL32_2, 0, 4, 32, true, 0,
8875fd0b74Schristos 	complain_overflow_bitfield,
8975fd0b74Schristos 	NULL, "DISP32_2",
90*e992f068Schristos 	false, 0xffffffff, 0xffffffff, true),
91*e992f068Schristos   HOWTO(BFD_RELOC_MACH_O_X86_64_PCREL32_4, 0, 4, 32, true, 0,
9275fd0b74Schristos 	complain_overflow_bitfield,
9375fd0b74Schristos 	NULL, "DISP32_4",
94*e992f068Schristos 	false, 0xffffffff, 0xffffffff, true),
95*e992f068Schristos   HOWTO(BFD_RELOC_MACH_O_X86_64_BRANCH32, 0, 4, 32, true, 0,
9675fd0b74Schristos 	complain_overflow_bitfield,
9775fd0b74Schristos 	NULL, "BRANCH32",
98*e992f068Schristos 	false, 0xffffffff, 0xffffffff, true),
99*e992f068Schristos   HOWTO(BFD_RELOC_MACH_O_X86_64_GOT_LOAD, 0, 4, 32, true, 0,
10075fd0b74Schristos 	complain_overflow_bitfield,
10175fd0b74Schristos 	NULL, "GOT_LOAD",
102*e992f068Schristos 	false, 0xffffffff, 0xffffffff, true),
10375fd0b74Schristos   /* 8 */
104*e992f068Schristos   HOWTO(BFD_RELOC_MACH_O_SUBTRACTOR32, 0, 4, 32, false, 0,
10575fd0b74Schristos 	complain_overflow_bitfield,
10675fd0b74Schristos 	NULL, "SUBTRACTOR32",
107*e992f068Schristos 	false, 0xffffffff, 0xffffffff, false),
108*e992f068Schristos   HOWTO(BFD_RELOC_MACH_O_SUBTRACTOR64, 0, 8, 64, false, 0,
10975fd0b74Schristos 	complain_overflow_bitfield,
11075fd0b74Schristos 	NULL, "SUBTRACTOR64",
111*e992f068Schristos 	false, MINUS_ONE, MINUS_ONE, false),
112*e992f068Schristos   HOWTO(BFD_RELOC_MACH_O_X86_64_GOT, 0, 4, 32, true, 0,
11375fd0b74Schristos 	complain_overflow_bitfield,
11475fd0b74Schristos 	NULL, "GOT",
115*e992f068Schristos 	false, 0xffffffff, 0xffffffff, true),
116*e992f068Schristos   HOWTO(BFD_RELOC_MACH_O_X86_64_BRANCH8, 0, 1, 8, true, 0,
11775fd0b74Schristos 	complain_overflow_bitfield,
11875fd0b74Schristos 	NULL, "BRANCH8",
119*e992f068Schristos 	false, 0xff, 0xff, true),
120ede78133Schristos   /* 12 */
121*e992f068Schristos   HOWTO(BFD_RELOC_MACH_O_X86_64_TLV, 0, 4, 32, true, 0,
122ede78133Schristos 	complain_overflow_bitfield,
123ede78133Schristos 	NULL, "TLV",
124*e992f068Schristos 	false, 0xffffffff, 0xffffffff, true),
12575fd0b74Schristos };
12675fd0b74Schristos 
127*e992f068Schristos static bool
bfd_mach_o_x86_64_canonicalize_one_reloc(bfd * abfd,struct mach_o_reloc_info_external * raw,arelent * res,asymbol ** syms,arelent * res_base ATTRIBUTE_UNUSED)12875fd0b74Schristos bfd_mach_o_x86_64_canonicalize_one_reloc (bfd *       abfd,
12975fd0b74Schristos 					  struct mach_o_reloc_info_external * raw,
130ede78133Schristos 					  arelent *   res,
131ede78133Schristos 					  asymbol **  syms,
132ede78133Schristos 					  arelent *   res_base ATTRIBUTE_UNUSED)
13375fd0b74Schristos {
13475fd0b74Schristos   bfd_mach_o_reloc_info reloc;
13575fd0b74Schristos 
13675fd0b74Schristos   if (!bfd_mach_o_pre_canonicalize_one_reloc (abfd, raw, &reloc, res, syms))
137*e992f068Schristos     return false;
13875fd0b74Schristos 
13975fd0b74Schristos   /* On x86-64, scattered relocs are not used.  */
14075fd0b74Schristos   if (reloc.r_scattered)
141*e992f068Schristos     return false;
14275fd0b74Schristos 
14375fd0b74Schristos   switch (reloc.r_type)
14475fd0b74Schristos     {
14575fd0b74Schristos     case BFD_MACH_O_X86_64_RELOC_UNSIGNED:
14675fd0b74Schristos       if (reloc.r_pcrel)
147*e992f068Schristos 	return false;
14875fd0b74Schristos       switch (reloc.r_length)
14975fd0b74Schristos 	{
15075fd0b74Schristos 	case 2:
15175fd0b74Schristos 	  res->howto = &x86_64_howto_table[1];
152*e992f068Schristos 	  return true;
15375fd0b74Schristos 	case 3:
15475fd0b74Schristos 	  res->howto = &x86_64_howto_table[0];
155*e992f068Schristos 	  return true;
15675fd0b74Schristos 	default:
157*e992f068Schristos 	  return false;
15875fd0b74Schristos 	}
15975fd0b74Schristos     case BFD_MACH_O_X86_64_RELOC_SIGNED:
16075fd0b74Schristos       if (reloc.r_length == 2 && reloc.r_pcrel)
16175fd0b74Schristos 	{
16275fd0b74Schristos 	  res->howto = &x86_64_howto_table[2];
163*e992f068Schristos 	  return true;
16475fd0b74Schristos 	}
16575fd0b74Schristos       break;
16675fd0b74Schristos     case BFD_MACH_O_X86_64_RELOC_BRANCH:
16775fd0b74Schristos       if (!reloc.r_pcrel)
168*e992f068Schristos 	return false;
16975fd0b74Schristos       switch (reloc.r_length)
17075fd0b74Schristos 	{
17175fd0b74Schristos 	case 2:
17275fd0b74Schristos 	  res->howto = &x86_64_howto_table[6];
173*e992f068Schristos 	  return true;
17475fd0b74Schristos 	default:
175*e992f068Schristos 	  return false;
17675fd0b74Schristos 	}
17775fd0b74Schristos       break;
17875fd0b74Schristos     case BFD_MACH_O_X86_64_RELOC_GOT_LOAD:
17975fd0b74Schristos       if (reloc.r_length == 2 && reloc.r_pcrel && reloc.r_extern)
18075fd0b74Schristos 	{
18175fd0b74Schristos 	  res->howto = &x86_64_howto_table[7];
182*e992f068Schristos 	  return true;
18375fd0b74Schristos 	}
18475fd0b74Schristos       break;
18575fd0b74Schristos     case BFD_MACH_O_X86_64_RELOC_GOT:
18675fd0b74Schristos       if (reloc.r_length == 2 && reloc.r_pcrel && reloc.r_extern)
18775fd0b74Schristos 	{
18875fd0b74Schristos 	  res->howto = &x86_64_howto_table[10];
189*e992f068Schristos 	  return true;
19075fd0b74Schristos 	}
19175fd0b74Schristos       break;
19275fd0b74Schristos     case BFD_MACH_O_X86_64_RELOC_SUBTRACTOR:
19375fd0b74Schristos       if (reloc.r_pcrel)
194*e992f068Schristos 	return false;
19575fd0b74Schristos       switch (reloc.r_length)
19675fd0b74Schristos 	{
19775fd0b74Schristos 	case 2:
19875fd0b74Schristos 	  res->howto = &x86_64_howto_table[8];
199*e992f068Schristos 	  return true;
20075fd0b74Schristos 	case 3:
20175fd0b74Schristos 	  res->howto = &x86_64_howto_table[9];
202*e992f068Schristos 	  return true;
20375fd0b74Schristos 	default:
204*e992f068Schristos 	  return false;
20575fd0b74Schristos 	}
20675fd0b74Schristos       break;
20775fd0b74Schristos     case BFD_MACH_O_X86_64_RELOC_SIGNED_1:
20875fd0b74Schristos       if (reloc.r_length == 2 && reloc.r_pcrel)
20975fd0b74Schristos 	{
21075fd0b74Schristos 	  res->howto = &x86_64_howto_table[3];
211*e992f068Schristos 	  return true;
21275fd0b74Schristos 	}
21375fd0b74Schristos       break;
21475fd0b74Schristos     case BFD_MACH_O_X86_64_RELOC_SIGNED_2:
21575fd0b74Schristos       if (reloc.r_length == 2 && reloc.r_pcrel)
21675fd0b74Schristos 	{
21775fd0b74Schristos 	  res->howto = &x86_64_howto_table[4];
218*e992f068Schristos 	  return true;
21975fd0b74Schristos 	}
22075fd0b74Schristos       break;
22175fd0b74Schristos     case BFD_MACH_O_X86_64_RELOC_SIGNED_4:
22275fd0b74Schristos       if (reloc.r_length == 2 && reloc.r_pcrel)
22375fd0b74Schristos 	{
22475fd0b74Schristos 	  res->howto = &x86_64_howto_table[5];
225*e992f068Schristos 	  return true;
22675fd0b74Schristos 	}
22775fd0b74Schristos       break;
228ede78133Schristos     case BFD_MACH_O_X86_64_RELOC_TLV:
229ede78133Schristos       if (reloc.r_length == 2 && reloc.r_pcrel && reloc.r_extern)
230ede78133Schristos 	{
231ede78133Schristos 	  res->howto = &x86_64_howto_table[12];
232*e992f068Schristos 	  return true;
233ede78133Schristos 	}
234ede78133Schristos       break;
23575fd0b74Schristos     default:
236*e992f068Schristos       return false;
23775fd0b74Schristos     }
238*e992f068Schristos   return false;
23975fd0b74Schristos }
24075fd0b74Schristos 
241*e992f068Schristos static bool
bfd_mach_o_x86_64_swap_reloc_out(arelent * rel,bfd_mach_o_reloc_info * rinfo)24275fd0b74Schristos bfd_mach_o_x86_64_swap_reloc_out (arelent *rel, bfd_mach_o_reloc_info *rinfo)
24375fd0b74Schristos {
24475fd0b74Schristos   rinfo->r_address = rel->address;
24575fd0b74Schristos   rinfo->r_scattered = 0;
24675fd0b74Schristos   switch (rel->howto->type)
24775fd0b74Schristos     {
24875fd0b74Schristos     case BFD_RELOC_32:
24975fd0b74Schristos       rinfo->r_type = BFD_MACH_O_X86_64_RELOC_UNSIGNED;
25075fd0b74Schristos       rinfo->r_pcrel = 0;
25175fd0b74Schristos       rinfo->r_length = 2;
25275fd0b74Schristos       break;
25375fd0b74Schristos     case BFD_RELOC_64:
25475fd0b74Schristos       rinfo->r_type = BFD_MACH_O_X86_64_RELOC_UNSIGNED;
25575fd0b74Schristos       rinfo->r_pcrel = 0;
25675fd0b74Schristos       rinfo->r_length = 3;
25775fd0b74Schristos       break;
25875fd0b74Schristos     case BFD_RELOC_32_PCREL:
25975fd0b74Schristos       rinfo->r_type = BFD_MACH_O_X86_64_RELOC_SIGNED;
26075fd0b74Schristos       rinfo->r_pcrel = 1;
26175fd0b74Schristos       rinfo->r_length = 2;
26275fd0b74Schristos       break;
26375fd0b74Schristos     case BFD_RELOC_MACH_O_X86_64_PCREL32_1:
26475fd0b74Schristos       rinfo->r_type = BFD_MACH_O_X86_64_RELOC_SIGNED_1;
26575fd0b74Schristos       rinfo->r_pcrel = 1;
26675fd0b74Schristos       rinfo->r_length = 2;
26775fd0b74Schristos       break;
26875fd0b74Schristos     case BFD_RELOC_MACH_O_X86_64_PCREL32_2:
26975fd0b74Schristos       rinfo->r_type = BFD_MACH_O_X86_64_RELOC_SIGNED_2;
27075fd0b74Schristos       rinfo->r_pcrel = 1;
27175fd0b74Schristos       rinfo->r_length = 2;
27275fd0b74Schristos       break;
27375fd0b74Schristos     case BFD_RELOC_MACH_O_X86_64_PCREL32_4:
27475fd0b74Schristos       rinfo->r_type = BFD_MACH_O_X86_64_RELOC_SIGNED_4;
27575fd0b74Schristos       rinfo->r_pcrel = 1;
27675fd0b74Schristos       rinfo->r_length = 2;
27775fd0b74Schristos       break;
27875fd0b74Schristos     case BFD_RELOC_MACH_O_X86_64_BRANCH32:
27975fd0b74Schristos       rinfo->r_type = BFD_MACH_O_X86_64_RELOC_BRANCH;
28075fd0b74Schristos       rinfo->r_pcrel = 1;
28175fd0b74Schristos       rinfo->r_length = 2;
28275fd0b74Schristos       break;
28375fd0b74Schristos     case BFD_RELOC_MACH_O_SUBTRACTOR32:
28475fd0b74Schristos       rinfo->r_type = BFD_MACH_O_X86_64_RELOC_SUBTRACTOR;
28575fd0b74Schristos       rinfo->r_pcrel = 0;
28675fd0b74Schristos       rinfo->r_length = 2;
28775fd0b74Schristos       break;
28875fd0b74Schristos     case BFD_RELOC_MACH_O_SUBTRACTOR64:
28975fd0b74Schristos       rinfo->r_type = BFD_MACH_O_X86_64_RELOC_SUBTRACTOR;
29075fd0b74Schristos       rinfo->r_pcrel = 0;
29175fd0b74Schristos       rinfo->r_length = 3;
29275fd0b74Schristos       break;
29375fd0b74Schristos     case BFD_RELOC_MACH_O_X86_64_GOT:
29475fd0b74Schristos       rinfo->r_type = BFD_MACH_O_X86_64_RELOC_GOT;
29575fd0b74Schristos       rinfo->r_pcrel = 1;
29675fd0b74Schristos       rinfo->r_length = 2;
29775fd0b74Schristos       break;
29875fd0b74Schristos     case BFD_RELOC_MACH_O_X86_64_GOT_LOAD:
29975fd0b74Schristos       rinfo->r_type = BFD_MACH_O_X86_64_RELOC_GOT_LOAD;
30075fd0b74Schristos       rinfo->r_pcrel = 1;
30175fd0b74Schristos       rinfo->r_length = 2;
30275fd0b74Schristos       break;
303ede78133Schristos     case BFD_RELOC_MACH_O_X86_64_TLV:
304ede78133Schristos       rinfo->r_type = BFD_MACH_O_X86_64_RELOC_TLV;
305ede78133Schristos       rinfo->r_pcrel = 1;
306ede78133Schristos       rinfo->r_length = 2;
307ede78133Schristos       break;
30875fd0b74Schristos     default:
309*e992f068Schristos       return false;
31075fd0b74Schristos     }
31175fd0b74Schristos   if ((*rel->sym_ptr_ptr)->flags & BSF_SECTION_SYM)
31275fd0b74Schristos     {
31375fd0b74Schristos       rinfo->r_extern = 0;
31475fd0b74Schristos       rinfo->r_value =
31575fd0b74Schristos 	(*rel->sym_ptr_ptr)->section->output_section->target_index;
31675fd0b74Schristos     }
31775fd0b74Schristos   else
31875fd0b74Schristos     {
31975fd0b74Schristos       rinfo->r_extern = 1;
32075fd0b74Schristos       rinfo->r_value = (*rel->sym_ptr_ptr)->udata.i;
32175fd0b74Schristos     }
322*e992f068Schristos   return true;
32375fd0b74Schristos }
32475fd0b74Schristos 
32575fd0b74Schristos static reloc_howto_type *
bfd_mach_o_x86_64_bfd_reloc_type_lookup(bfd * abfd ATTRIBUTE_UNUSED,bfd_reloc_code_real_type code)32675fd0b74Schristos bfd_mach_o_x86_64_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
32775fd0b74Schristos 					 bfd_reloc_code_real_type code)
32875fd0b74Schristos {
32975fd0b74Schristos   unsigned int i;
33075fd0b74Schristos 
33175fd0b74Schristos   for (i = 0;
33275fd0b74Schristos        i < sizeof (x86_64_howto_table) / sizeof (*x86_64_howto_table);
33375fd0b74Schristos        i++)
33475fd0b74Schristos     if (code == x86_64_howto_table[i].type)
33575fd0b74Schristos       return &x86_64_howto_table[i];
33675fd0b74Schristos   return NULL;
33775fd0b74Schristos }
33875fd0b74Schristos 
33975fd0b74Schristos static reloc_howto_type *
bfd_mach_o_x86_64_bfd_reloc_name_lookup(bfd * abfd ATTRIBUTE_UNUSED,const char * name ATTRIBUTE_UNUSED)34075fd0b74Schristos bfd_mach_o_x86_64_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
34175fd0b74Schristos 					 const char *name ATTRIBUTE_UNUSED)
34275fd0b74Schristos {
34375fd0b74Schristos   return NULL;
34475fd0b74Schristos }
34575fd0b74Schristos 
346*e992f068Schristos static bool
bfd_mach_o_section_type_valid_for_x86_64(unsigned long val)34775fd0b74Schristos bfd_mach_o_section_type_valid_for_x86_64 (unsigned long val)
34875fd0b74Schristos {
34975fd0b74Schristos   if (val == BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS
35075fd0b74Schristos       || val == BFD_MACH_O_S_LAZY_SYMBOL_POINTERS
35175fd0b74Schristos       || val == BFD_MACH_O_S_SYMBOL_STUBS)
352*e992f068Schristos     return false;
353*e992f068Schristos   return true;
35475fd0b74Schristos }
35575fd0b74Schristos 
35675fd0b74Schristos /* We want to bump the alignment of some sections.  */
35775fd0b74Schristos static const mach_o_section_name_xlat text_section_names_xlat[] =
35875fd0b74Schristos   {
35975fd0b74Schristos     {	".eh_frame",				"__eh_frame",
36075fd0b74Schristos 	SEC_READONLY | SEC_DATA | SEC_LOAD,	BFD_MACH_O_S_COALESCED,
36175fd0b74Schristos 	BFD_MACH_O_S_ATTR_LIVE_SUPPORT
36275fd0b74Schristos 	| BFD_MACH_O_S_ATTR_STRIP_STATIC_SYMS
36375fd0b74Schristos 	| BFD_MACH_O_S_ATTR_NO_TOC,		3},
36475fd0b74Schristos     { NULL, NULL, 0, 0, 0, 0}
36575fd0b74Schristos   };
36675fd0b74Schristos 
36775fd0b74Schristos const mach_o_segment_name_xlat mach_o_x86_64_segsec_names_xlat[] =
36875fd0b74Schristos   {
36975fd0b74Schristos     { "__TEXT", text_section_names_xlat },
37075fd0b74Schristos     { NULL, NULL }
37175fd0b74Schristos   };
37275fd0b74Schristos 
37375fd0b74Schristos #define bfd_mach_o_canonicalize_one_reloc bfd_mach_o_x86_64_canonicalize_one_reloc
37475fd0b74Schristos #define bfd_mach_o_swap_reloc_out bfd_mach_o_x86_64_swap_reloc_out
37575fd0b74Schristos 
37675fd0b74Schristos #define bfd_mach_o_bfd_reloc_type_lookup bfd_mach_o_x86_64_bfd_reloc_type_lookup
37775fd0b74Schristos #define bfd_mach_o_bfd_reloc_name_lookup bfd_mach_o_x86_64_bfd_reloc_name_lookup
37875fd0b74Schristos #define bfd_mach_o_print_thread NULL
37975fd0b74Schristos #define bfd_mach_o_tgt_seg_table mach_o_x86_64_segsec_names_xlat
38075fd0b74Schristos #define bfd_mach_o_section_type_valid_for_tgt bfd_mach_o_section_type_valid_for_x86_64
38175fd0b74Schristos 
38275fd0b74Schristos #define TARGET_NAME		x86_64_mach_o_vec
38375fd0b74Schristos #define TARGET_STRING		"mach-o-x86-64"
38475fd0b74Schristos #define TARGET_ARCHITECTURE	bfd_arch_i386
38575fd0b74Schristos #define TARGET_PAGESIZE		4096
38675fd0b74Schristos #define TARGET_BIG_ENDIAN	0
38775fd0b74Schristos #define TARGET_ARCHIVE		0
38875fd0b74Schristos #define TARGET_PRIORITY		0
38975fd0b74Schristos #include "mach-o-target.c"
390