160484Sobrien/* PPC ELF support for BFD.
2218822Sdim   Copyright 1995, 1996, 1998, 2000, 2001, 2002, 2003, 2005
3130561Sobrien   Free Software Foundation, Inc.
460484Sobrien
560484Sobrien   By Michael Meissner, Cygnus Support, <meissner@cygnus.com>, from information
660484Sobrien   in the System V Application Binary Interface, PowerPC Processor Supplement
760484Sobrien   and the PowerPC Embedded Application Binary Interface (eabi).
860484Sobrien
960484SobrienThis file is part of BFD, the Binary File Descriptor library.
1060484Sobrien
1160484SobrienThis program is free software; you can redistribute it and/or modify
1260484Sobrienit under the terms of the GNU General Public License as published by
1360484Sobrienthe Free Software Foundation; either version 2 of the License, or
1460484Sobrien(at your option) any later version.
1560484Sobrien
1660484SobrienThis program is distributed in the hope that it will be useful,
1760484Sobrienbut WITHOUT ANY WARRANTY; without even the implied warranty of
1860484SobrienMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1960484SobrienGNU General Public License for more details.
2060484Sobrien
2160484SobrienYou should have received a copy of the GNU General Public License
2260484Sobrienalong with this program; if not, write to the Free Software
23218822SdimFoundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
2460484Sobrien
2560484Sobrien/* This file holds definitions specific to the PPC ELF ABI.  Note
2660484Sobrien   that most of this is not actually implemented by BFD.  */
2760484Sobrien
2860484Sobrien#ifndef _ELF_PPC_H
2960484Sobrien#define _ELF_PPC_H
3060484Sobrien
3160484Sobrien#include "elf/reloc-macros.h"
3260484Sobrien
3360484Sobrien/* Relocations.  */
3460484SobrienSTART_RELOC_NUMBERS (elf_ppc_reloc_type)
35130561Sobrien  RELOC_NUMBER (R_PPC_NONE,		  0)
36130561Sobrien  RELOC_NUMBER (R_PPC_ADDR32,		  1)
37130561Sobrien  RELOC_NUMBER (R_PPC_ADDR24,		  2)
38130561Sobrien  RELOC_NUMBER (R_PPC_ADDR16,		  3)
39130561Sobrien  RELOC_NUMBER (R_PPC_ADDR16_LO,	  4)
40130561Sobrien  RELOC_NUMBER (R_PPC_ADDR16_HI,	  5)
41130561Sobrien  RELOC_NUMBER (R_PPC_ADDR16_HA,	  6)
42130561Sobrien  RELOC_NUMBER (R_PPC_ADDR14,		  7)
43130561Sobrien  RELOC_NUMBER (R_PPC_ADDR14_BRTAKEN,	  8)
44130561Sobrien  RELOC_NUMBER (R_PPC_ADDR14_BRNTAKEN,	  9)
45130561Sobrien  RELOC_NUMBER (R_PPC_REL24,		 10)
46130561Sobrien  RELOC_NUMBER (R_PPC_REL14,		 11)
47130561Sobrien  RELOC_NUMBER (R_PPC_REL14_BRTAKEN,	 12)
48130561Sobrien  RELOC_NUMBER (R_PPC_REL14_BRNTAKEN,	 13)
49130561Sobrien  RELOC_NUMBER (R_PPC_GOT16,		 14)
50130561Sobrien  RELOC_NUMBER (R_PPC_GOT16_LO,		 15)
51130561Sobrien  RELOC_NUMBER (R_PPC_GOT16_HI,		 16)
52130561Sobrien  RELOC_NUMBER (R_PPC_GOT16_HA,		 17)
53130561Sobrien  RELOC_NUMBER (R_PPC_PLTREL24,		 18)
54130561Sobrien  RELOC_NUMBER (R_PPC_COPY,		 19)
55130561Sobrien  RELOC_NUMBER (R_PPC_GLOB_DAT,		 20)
56130561Sobrien  RELOC_NUMBER (R_PPC_JMP_SLOT,		 21)
57130561Sobrien  RELOC_NUMBER (R_PPC_RELATIVE,		 22)
58130561Sobrien  RELOC_NUMBER (R_PPC_LOCAL24PC,	 23)
59130561Sobrien  RELOC_NUMBER (R_PPC_UADDR32,		 24)
60130561Sobrien  RELOC_NUMBER (R_PPC_UADDR16,		 25)
61130561Sobrien  RELOC_NUMBER (R_PPC_REL32,		 26)
62130561Sobrien  RELOC_NUMBER (R_PPC_PLT32,		 27)
63130561Sobrien  RELOC_NUMBER (R_PPC_PLTREL32,		 28)
64130561Sobrien  RELOC_NUMBER (R_PPC_PLT16_LO,		 29)
65130561Sobrien  RELOC_NUMBER (R_PPC_PLT16_HI,		 30)
66130561Sobrien  RELOC_NUMBER (R_PPC_PLT16_HA,		 31)
67130561Sobrien  RELOC_NUMBER (R_PPC_SDAREL16,		 32)
68130561Sobrien  RELOC_NUMBER (R_PPC_SECTOFF,		 33)
69130561Sobrien  RELOC_NUMBER (R_PPC_SECTOFF_LO,	 34)
70130561Sobrien  RELOC_NUMBER (R_PPC_SECTOFF_HI,	 35)
71130561Sobrien  RELOC_NUMBER (R_PPC_SECTOFF_HA,	 36)
72130561Sobrien  RELOC_NUMBER (R_PPC_ADDR30,		 37)
7360484Sobrien
74130561Sobrien  /* Relocs added to support TLS.  */
75130561Sobrien  RELOC_NUMBER (R_PPC_TLS,		 67)
76130561Sobrien  RELOC_NUMBER (R_PPC_DTPMOD32,		 68)
77130561Sobrien  RELOC_NUMBER (R_PPC_TPREL16,		 69)
78130561Sobrien  RELOC_NUMBER (R_PPC_TPREL16_LO,	 70)
79130561Sobrien  RELOC_NUMBER (R_PPC_TPREL16_HI,	 71)
80130561Sobrien  RELOC_NUMBER (R_PPC_TPREL16_HA,	 72)
81130561Sobrien  RELOC_NUMBER (R_PPC_TPREL32,		 73)
82130561Sobrien  RELOC_NUMBER (R_PPC_DTPREL16,		 74)
83130561Sobrien  RELOC_NUMBER (R_PPC_DTPREL16_LO,	 75)
84130561Sobrien  RELOC_NUMBER (R_PPC_DTPREL16_HI,	 76)
85130561Sobrien  RELOC_NUMBER (R_PPC_DTPREL16_HA,	 77)
86130561Sobrien  RELOC_NUMBER (R_PPC_DTPREL32,		 78)
87130561Sobrien  RELOC_NUMBER (R_PPC_GOT_TLSGD16,	 79)
88130561Sobrien  RELOC_NUMBER (R_PPC_GOT_TLSGD16_LO,	 80)
89130561Sobrien  RELOC_NUMBER (R_PPC_GOT_TLSGD16_HI,	 81)
90130561Sobrien  RELOC_NUMBER (R_PPC_GOT_TLSGD16_HA,	 82)
91130561Sobrien  RELOC_NUMBER (R_PPC_GOT_TLSLD16,	 83)
92130561Sobrien  RELOC_NUMBER (R_PPC_GOT_TLSLD16_LO,	 84)
93130561Sobrien  RELOC_NUMBER (R_PPC_GOT_TLSLD16_HI,	 85)
94130561Sobrien  RELOC_NUMBER (R_PPC_GOT_TLSLD16_HA,	 86)
95130561Sobrien  RELOC_NUMBER (R_PPC_GOT_TPREL16,	 87)
96130561Sobrien  RELOC_NUMBER (R_PPC_GOT_TPREL16_LO,	 88)
97130561Sobrien  RELOC_NUMBER (R_PPC_GOT_TPREL16_HI,	 89)
98130561Sobrien  RELOC_NUMBER (R_PPC_GOT_TPREL16_HA,	 90)
99130561Sobrien  RELOC_NUMBER (R_PPC_GOT_DTPREL16,	 91)
100130561Sobrien  RELOC_NUMBER (R_PPC_GOT_DTPREL16_LO,	 92)
101130561Sobrien  RELOC_NUMBER (R_PPC_GOT_DTPREL16_HI,	 93)
102130561Sobrien  RELOC_NUMBER (R_PPC_GOT_DTPREL16_HA,	 94)
10389857Sobrien
10460484Sobrien/* The remaining relocs are from the Embedded ELF ABI, and are not
10560484Sobrien   in the SVR4 ELF ABI.  */
106130561Sobrien  RELOC_NUMBER (R_PPC_EMB_NADDR32,	101)
107130561Sobrien  RELOC_NUMBER (R_PPC_EMB_NADDR16,	102)
108130561Sobrien  RELOC_NUMBER (R_PPC_EMB_NADDR16_LO,	103)
109130561Sobrien  RELOC_NUMBER (R_PPC_EMB_NADDR16_HI,	104)
110130561Sobrien  RELOC_NUMBER (R_PPC_EMB_NADDR16_HA,	105)
111130561Sobrien  RELOC_NUMBER (R_PPC_EMB_SDAI16,	106)
112130561Sobrien  RELOC_NUMBER (R_PPC_EMB_SDA2I16,	107)
113130561Sobrien  RELOC_NUMBER (R_PPC_EMB_SDA2REL,	108)
114130561Sobrien  RELOC_NUMBER (R_PPC_EMB_SDA21,	109)
115130561Sobrien  RELOC_NUMBER (R_PPC_EMB_MRKREF,	110)
116130561Sobrien  RELOC_NUMBER (R_PPC_EMB_RELSEC16,	111)
117130561Sobrien  RELOC_NUMBER (R_PPC_EMB_RELST_LO,	112)
118130561Sobrien  RELOC_NUMBER (R_PPC_EMB_RELST_HI,	113)
119130561Sobrien  RELOC_NUMBER (R_PPC_EMB_RELST_HA,	114)
120130561Sobrien  RELOC_NUMBER (R_PPC_EMB_BIT_FLD,	115)
121130561Sobrien  RELOC_NUMBER (R_PPC_EMB_RELSDA,	116)
12260484Sobrien
123218822Sdim/* Fake relocations for branch stubs, only used internally by ld.  */
124218822Sdim#define R_PPC_RELAX32 245
125218822Sdim#define R_PPC_RELAX32PC 246
126218822Sdim#define R_PPC_RELAX32_PLT 247
127218822Sdim#define R_PPC_RELAX32PC_PLT 248
12860484Sobrien
129218822Sdim/* These are GNU extensions used in PIC code sequences.  */
130218822Sdim  RELOC_NUMBER (R_PPC_REL16,		249)
131218822Sdim  RELOC_NUMBER (R_PPC_REL16_LO,		250)
132218822Sdim  RELOC_NUMBER (R_PPC_REL16_HI,		251)
133218822Sdim  RELOC_NUMBER (R_PPC_REL16_HA,		252)
134218822Sdim
135130561Sobrien/* These are GNU extensions to enable C++ vtable garbage collection.  */
136130561Sobrien  RELOC_NUMBER (R_PPC_GNU_VTINHERIT,	253)
137130561Sobrien  RELOC_NUMBER (R_PPC_GNU_VTENTRY,	254)
138130561Sobrien
13960484Sobrien/* This is a phony reloc to handle any old fashioned TOC16 references
14060484Sobrien   that may still be in object files.  */
141130561Sobrien  RELOC_NUMBER (R_PPC_TOC16,		255)
14260484Sobrien
14377298SobrienEND_RELOC_NUMBERS (R_PPC_max)
14460484Sobrien
145130561Sobrien#define IS_PPC_TLS_RELOC(R) \
146130561Sobrien  ((R) >= R_PPC_TLS && (R) <= R_PPC_GOT_DTPREL16_HA)
14760484Sobrien
148218822Sdim/* Specify the value of _GLOBAL_OFFSET_TABLE_.  */
149218822Sdim#define DT_PPC_GOT		DT_LOPROC
150218822Sdim
15160484Sobrien/* Processor specific flags for the ELF header e_flags field.  */
15260484Sobrien
15377298Sobrien#define	EF_PPC_EMB		0x80000000	/* PowerPC embedded flag.  */
15460484Sobrien
15577298Sobrien#define	EF_PPC_RELOCATABLE	0x00010000	/* PowerPC -mrelocatable flag.  */
15677298Sobrien#define	EF_PPC_RELOCATABLE_LIB	0x00008000	/* PowerPC -mrelocatable-lib flag.  */
15760484Sobrien
15877298Sobrien/* Processor specific section headers, sh_type field.  */
15960484Sobrien
16060484Sobrien#define SHT_ORDERED		SHT_HIPROC	/* Link editor is to sort the \
16160484Sobrien						   entries in this section \
16260484Sobrien						   based on the address \
16360484Sobrien						   specified in the associated \
16460484Sobrien						   symbol table entry.  */
16560484Sobrien
16677298Sobrien/* Processor specific section flags, sh_flags field.  */
16760484Sobrien
16860484Sobrien#define SHF_EXCLUDE		0x80000000	/* Link editor is to exclude \
16960484Sobrien						   this section from executable \
17060484Sobrien						   and shared objects that it \
17160484Sobrien						   builds when those objects \
17260484Sobrien						   are not to be furhter \
17360484Sobrien						   relocated.  */
174218822Sdim
175218822Sdim/* Object attribute tags.  */
176218822Sdimenum
177218822Sdim{
178218822Sdim  /* 0-3 are generic.  */
179218822Sdim  Tag_GNU_Power_ABI_FP = 4, /* Value 1 for hard-float, 2 for
180218822Sdim			       soft-float; 0 for not tagged or not
181218822Sdim			       using any ABIs affected by the
182218822Sdim			       differences.  */
183218822Sdim};
184218822Sdim
18560484Sobrien#endif /* _ELF_PPC_H */
186