diff -Nur binutils-2.24.orig/bfd/archures.c binutils-2.24/bfd/archures.c
--- binutils-2.24.orig/bfd/archures.c 2013-11-08 11:02:26.000000000 +0100
+++ binutils-2.24/bfd/archures.c 2024-05-17 16:15:38.911343345 +0200
@@ -316,6 +316,12 @@
.#define bfd_mach_arm_ep9312 11
.#define bfd_mach_arm_iWMMXt 12
.#define bfd_mach_arm_iWMMXt2 13
+. bfd_arch_nds32, {* Andes NDS32 *}
+.#define bfd_mach_n1 1
+.#define bfd_mach_n1h 2
+.#define bfd_mach_n1h_v2 3
+.#define bfd_mach_n1h_v3 4
+.#define bfd_mach_n1h_v3m 5
. bfd_arch_ns32k, {* National Semiconductors ns32000 *}
. bfd_arch_w65, {* WDC 65816 *}
. bfd_arch_tic30, {* Texas Instruments TMS320C30 *}
@@ -574,6 +580,7 @@
extern const bfd_arch_info_type bfd_moxie_arch;
extern const bfd_arch_info_type bfd_msp430_arch;
extern const bfd_arch_info_type bfd_mt_arch;
+extern const bfd_arch_info_type bfd_nds32_arch;
extern const bfd_arch_info_type bfd_nios2_arch;
extern const bfd_arch_info_type bfd_ns32k_arch;
extern const bfd_arch_info_type bfd_openrisc_arch;
@@ -663,6 +670,7 @@
&bfd_moxie_arch,
&bfd_msp430_arch,
&bfd_mt_arch,
+ &bfd_nds32_arch,
&bfd_nios2_arch,
&bfd_ns32k_arch,
&bfd_openrisc_arch,
diff -Nur binutils-2.24.orig/bfd/bfd.c binutils-2.24/bfd/bfd.c
--- binutils-2.24.orig/bfd/bfd.c 2013-11-04 16:33:37.000000000 +0100
+++ binutils-2.24/bfd/bfd.c 2024-05-17 16:15:38.923343593 +0200
@@ -311,6 +311,14 @@
. unsigned int selective_search : 1;
.};
.
+.{* See note beside bfd_set_section_userdata. *}
+.static inline bfd_boolean
+.bfd_set_cacheable (bfd * abfd, bfd_boolean val)
+.{
+. abfd->cacheable = val;
+. return TRUE;
+.}
+.
*/
#include "sysdep.h"
diff -Nur binutils-2.24.orig/bfd/bfd-in2.h binutils-2.24/bfd/bfd-in2.h
--- binutils-2.24.orig/bfd/bfd-in2.h 2013-11-18 09:40:15.000000000 +0100
+++ binutils-2.24/bfd/bfd-in2.h 2024-05-17 16:15:38.919343510 +0200
@@ -299,9 +299,6 @@
#define bfd_is_com_section(ptr) (((ptr)->flags & SEC_IS_COMMON) != 0)
-#define bfd_set_section_vma(bfd, ptr, val) (((ptr)->vma = (ptr)->lma = (val)), ((ptr)->user_set_vma = TRUE), TRUE)
-#define bfd_set_section_alignment(bfd, ptr, val) (((ptr)->alignment_power = (val)),TRUE)
-#define bfd_set_section_userdata(bfd, ptr, val) (((ptr)->userdata = (val)),TRUE)
/* Find the address one past the end of SEC. */
#define bfd_get_section_limit(bfd, sec) \
(((bfd)->direction != write_direction && (sec)->rawsize != 0 \
@@ -524,8 +521,6 @@
#define bfd_get_symbol_leading_char(abfd) ((abfd)->xvec->symbol_leading_char)
-#define bfd_set_cacheable(abfd,bool) (((abfd)->cacheable = bool), TRUE)
-
extern bfd_boolean bfd_cache_close
(bfd *abfd);
/* NB: This declaration should match the autogenerated one in libbfd.h. */
@@ -1594,6 +1589,32 @@
int size;
};
+/* Note: the following are provided as inline functions rather than macros
+ because not all callers use the return value. A macro implementation
+ would use a comma expression, eg: "((ptr)->foo = val, TRUE)" and some
+ compilers will complain about comma expressions that have no effect. */
+static inline bfd_boolean
+bfd_set_section_userdata (bfd * abfd ATTRIBUTE_UNUSED, asection * ptr, void * val)
+{
+ ptr->userdata = val;
+ return TRUE;
+}
+
+static inline bfd_boolean
+bfd_set_section_vma (bfd * abfd ATTRIBUTE_UNUSED, asection * ptr, bfd_vma val)
+{
+ ptr->vma = ptr->lma = val;
+ ptr->user_set_vma = TRUE;
+ return TRUE;
+}
+
+static inline bfd_boolean
+bfd_set_section_alignment (bfd * abfd ATTRIBUTE_UNUSED, asection * ptr, unsigned int val)
+{
+ ptr->alignment_power = val;
+ return TRUE;
+}
+
/* These sections are global, and are managed by BFD. The application
and target back end are not permitted to change the values in
these sections. */
@@ -2071,6 +2092,12 @@
#define bfd_mach_arm_ep9312 11
#define bfd_mach_arm_iWMMXt 12
#define bfd_mach_arm_iWMMXt2 13
+ bfd_arch_nds32, /* Andes NDS32 */
+#define bfd_mach_n1 1
+#define bfd_mach_n1h 2
+#define bfd_mach_n1h_v2 3
+#define bfd_mach_n1h_v3 4
+#define bfd_mach_n1h_v3m 5
bfd_arch_ns32k, /* National Semiconductors ns32000 */
bfd_arch_w65, /* WDC 65816 */
bfd_arch_tic30, /* Texas Instruments TMS320C30 */
@@ -3794,6 +3821,229 @@
BFD_RELOC_M32R_GOTPC_HI_SLO,
BFD_RELOC_M32R_GOTPC_LO,
+/* NDS32 relocs.
+This is a 20 bit absolute address. */
+ BFD_RELOC_NDS32_20,
+
+/* This is a 9-bit pc-relative reloc with the right 1 bit assumed to be 0. */
+ BFD_RELOC_NDS32_9_PCREL,
+
+/* This is a 9-bit pc-relative reloc with the right 1 bit assumed to be 0. */
+ BFD_RELOC_NDS32_WORD_9_PCREL,
+
+/* This is an 15-bit reloc with the right 1 bit assumed to be 0. */
+ BFD_RELOC_NDS32_15_PCREL,
+
+/* This is an 17-bit reloc with the right 1 bit assumed to be 0. */
+ BFD_RELOC_NDS32_17_PCREL,
+
+/* This is a 25-bit reloc with the right 1 bit assumed to be 0. */
+ BFD_RELOC_NDS32_25_PCREL,
+
+/* This is a 20-bit reloc containing the high 20 bits of an address
+used with the lower 12 bits */
+ BFD_RELOC_NDS32_HI20,
+
+/* This is a 12-bit reloc containing the lower 12 bits of an address
+then shift right by 3. This is used with ldi,sdi... */
+ BFD_RELOC_NDS32_LO12S3,
+
+/* This is a 12-bit reloc containing the lower 12 bits of an address
+then shift left by 2. This is used with lwi,swi... */
+ BFD_RELOC_NDS32_LO12S2,
+
+/* This is a 12-bit reloc containing the lower 12 bits of an address
+then shift left by 1. This is used with lhi,shi... */
+ BFD_RELOC_NDS32_LO12S1,
+
+/* This is a 12-bit reloc containing the lower 12 bits of an address
+then shift left by 0. This is used with lbisbi... */
+ BFD_RELOC_NDS32_LO12S0,
+
+/* This is a 12-bit reloc containing the lower 12 bits of an address
+then shift left by 0. This is only used with branch relaxations */
+ BFD_RELOC_NDS32_LO12S0_ORI,
+
+/* This is a 15-bit reloc containing the small data area 18-bit signed offset
+and shift left by 3 for use in ldi, sdi... */
+ BFD_RELOC_NDS32_SDA15S3,
+
+/* This is a 15-bit reloc containing the small data area 17-bit signed offset
+and shift left by 2 for use in lwi, swi... */
+ BFD_RELOC_NDS32_SDA15S2,
+
+/* This is a 15-bit reloc containing the small data area 16-bit signed offset
+and shift left by 1 for use in lhi, shi... */
+ BFD_RELOC_NDS32_SDA15S1,
+
+/* This is a 15-bit reloc containing the small data area 15-bit signed offset
+and shift left by 0 for use in lbi, sbi... */
+ BFD_RELOC_NDS32_SDA15S0,
+
+/* This is a 16-bit reloc containing the small data area 16-bit signed offset
+and shift left by 3 */
+ BFD_RELOC_NDS32_SDA16S3,
+
+/* This is a 17-bit reloc containing the small data area 17-bit signed offset
+and shift left by 2 for use in lwi.gp, swi.gp... */
+ BFD_RELOC_NDS32_SDA17S2,
+
+/* This is a 18-bit reloc containing the small data area 18-bit signed offset
+and shift left by 1 for use in lhi.gp, shi.gp... */
+ BFD_RELOC_NDS32_SDA18S1,
+
+/* This is a 19-bit reloc containing the small data area 19-bit signed offset
+and shift left by 0 for use in lbi.gp, sbi.gp... */
+ BFD_RELOC_NDS32_SDA19S0,
+
+/* This is a 24-bit reloc for security check sum. */
+ BFD_RELOC_NDS32_SECURITY_16,
+
+/* for PIC */
+ BFD_RELOC_NDS32_GOT20,
+ BFD_RELOC_NDS32_9_PLTREL,
+ BFD_RELOC_NDS32_25_PLTREL,
+ BFD_RELOC_NDS32_COPY,
+ BFD_RELOC_NDS32_GLOB_DAT,
+ BFD_RELOC_NDS32_JMP_SLOT,
+ BFD_RELOC_NDS32_RELATIVE,
+ BFD_RELOC_NDS32_GOTOFF,
+ BFD_RELOC_NDS32_GOTOFF_HI20,
+ BFD_RELOC_NDS32_GOTOFF_LO12,
+ BFD_RELOC_NDS32_GOTPC20,
+ BFD_RELOC_NDS32_GOT_HI20,
+ BFD_RELOC_NDS32_GOT_LO12,
+ BFD_RELOC_NDS32_GOTPC_HI20,
+ BFD_RELOC_NDS32_GOTPC_LO12,
+
+/* for relax */
+ BFD_RELOC_NDS32_INSN16,
+ BFD_RELOC_NDS32_LABEL,
+ BFD_RELOC_NDS32_LONGCALL1,
+ BFD_RELOC_NDS32_LONGCALL2,
+ BFD_RELOC_NDS32_LONGCALL3,
+ BFD_RELOC_NDS32_LONGJUMP1,
+ BFD_RELOC_NDS32_LONGJUMP2,
+ BFD_RELOC_NDS32_LONGJUMP3,
+ BFD_RELOC_NDS32_LOADSTORE,
+ BFD_RELOC_NDS32_9_FIXED,
+ BFD_RELOC_NDS32_15_FIXED,
+ BFD_RELOC_NDS32_17_FIXED,
+ BFD_RELOC_NDS32_25_FIXED,
+ BFD_RELOC_NDS32_LONGCALL4,
+ BFD_RELOC_NDS32_LONGCALL5,
+ BFD_RELOC_NDS32_LONGCALL6,
+ BFD_RELOC_NDS32_LONGJUMP4,
+ BFD_RELOC_NDS32_LONGJUMP5,
+ BFD_RELOC_NDS32_LONGJUMP6,
+ BFD_RELOC_NDS32_LONGJUMP7,
+
+/* for PIC */
+ BFD_RELOC_NDS32_PLTREL_HI20,
+ BFD_RELOC_NDS32_PLTREL_LO12,
+ BFD_RELOC_NDS32_PLT_GOTREL_HI20,
+ BFD_RELOC_NDS32_PLT_GOTREL_LO12,
+
+/* for floating point */
+ BFD_RELOC_NDS32_SDA12S2_DP,
+ BFD_RELOC_NDS32_SDA12S2_SP,
+ BFD_RELOC_NDS32_LO12S2_DP,
+ BFD_RELOC_NDS32_LO12S2_SP,
+
+/* for dwarf2 debug_line. */
+ BFD_RELOC_NDS32_DWARF2_OP1,
+ BFD_RELOC_NDS32_DWARF2_OP2,
+ BFD_RELOC_NDS32_DWARF2_LEB,
+
+/* for eliminate 16-bit instructions */
+ BFD_RELOC_NDS32_UPDATE_TA,
+
+/* for PIC object relaxation */
+ BFD_RELOC_NDS32_PLT_GOTREL_LO20,
+ BFD_RELOC_NDS32_PLT_GOTREL_LO15,
+ BFD_RELOC_NDS32_PLT_GOTREL_LO19,
+ BFD_RELOC_NDS32_GOT_LO15,
+ BFD_RELOC_NDS32_GOT_LO19,
+ BFD_RELOC_NDS32_GOTOFF_LO15,
+ BFD_RELOC_NDS32_GOTOFF_LO19,
+ BFD_RELOC_NDS32_GOT15S2,
+ BFD_RELOC_NDS32_GOT17S2,
+
+/* NDS32 relocs.
+This is a 5 bit absolute address. */
+ BFD_RELOC_NDS32_5,
+
+/* This is a 10-bit unsigned pc-relative reloc with the right 1 bit assumed to be 0. */
+ BFD_RELOC_NDS32_10_UPCREL,
+
+/* If fp were omitted, fp can used as another gp. */
+ BFD_RELOC_NDS32_SDA_FP7U2_RELA,
+
+/* relaxation relative relocation types */
+ BFD_RELOC_NDS32_RELAX_ENTRY,
+ BFD_RELOC_NDS32_GOT_SUFF,
+ BFD_RELOC_NDS32_GOTOFF_SUFF,
+ BFD_RELOC_NDS32_PLT_GOT_SUFF,
+ BFD_RELOC_NDS32_MULCALL_SUFF,
+ BFD_RELOC_NDS32_PTR,
+ BFD_RELOC_NDS32_PTR_COUNT,
+ BFD_RELOC_NDS32_PTR_RESOLVED,
+ BFD_RELOC_NDS32_PLTBLOCK,
+ BFD_RELOC_NDS32_RELAX_REGION_BEGIN,
+ BFD_RELOC_NDS32_RELAX_REGION_END,
+ BFD_RELOC_NDS32_MINUEND,
+ BFD_RELOC_NDS32_SUBTRAHEND,
+ BFD_RELOC_NDS32_DIFF8,
+ BFD_RELOC_NDS32_DIFF16,
+ BFD_RELOC_NDS32_DIFF32,
+ BFD_RELOC_NDS32_DIFF_ULEB128,
+ BFD_RELOC_NDS32_EMPTY,
+
+/* This is a 25 bit absolute address. */
+ BFD_RELOC_NDS32_25_ABS,
+
+/* For ex9 and ifc using. */
+ BFD_RELOC_NDS32_DATA,
+ BFD_RELOC_NDS32_TRAN,
+ BFD_RELOC_NDS32_17IFC_PCREL,
+ BFD_RELOC_NDS32_10IFCU_PCREL,
+
+/* For TLS. */
+ BFD_RELOC_NDS32_TPOFF,
+ BFD_RELOC_NDS32_GOTTPOFF,
+ BFD_RELOC_NDS32_TLS_LE_HI20,
+ BFD_RELOC_NDS32_TLS_LE_LO12,
+ BFD_RELOC_NDS32_TLS_LE_20,
+ BFD_RELOC_NDS32_TLS_LE_15S0,
+ BFD_RELOC_NDS32_TLS_LE_15S1,
+ BFD_RELOC_NDS32_TLS_LE_15S2,
+ BFD_RELOC_NDS32_TLS_LE_ADD,
+ BFD_RELOC_NDS32_TLS_LE_LS,
+ BFD_RELOC_NDS32_TLS_IE_HI20,
+ BFD_RELOC_NDS32_TLS_IE_LO12,
+ BFD_RELOC_NDS32_TLS_IE_LO12S2,
+ BFD_RELOC_NDS32_TLS_IEGP_HI20,
+ BFD_RELOC_NDS32_TLS_IEGP_LO12,
+ BFD_RELOC_NDS32_TLS_IEGP_LO12S2,
+ BFD_RELOC_NDS32_TLS_IEGP_LW,
+ BFD_RELOC_NDS32_TLS_DESC,
+ BFD_RELOC_NDS32_TLS_DESC_HI20,
+ BFD_RELOC_NDS32_TLS_DESC_LO12,
+ BFD_RELOC_NDS32_TLS_DESC_20,
+ BFD_RELOC_NDS32_TLS_DESC_SDA17S2,
+ BFD_RELOC_NDS32_TLS_DESC_ADD,
+ BFD_RELOC_NDS32_TLS_DESC_FUNC,
+ BFD_RELOC_NDS32_TLS_DESC_CALL,
+ BFD_RELOC_NDS32_TLS_DESC_MEM,
+ BFD_RELOC_NDS32_REMOVE,
+ BFD_RELOC_NDS32_GROUP,
+
+/* Jump-patch table relative relocations. */
+ BFD_RELOC_NDS32_ICT,
+ BFD_RELOC_NDS32_ICT_HI20,
+ BFD_RELOC_NDS32_ICT_LO12,
+ BFD_RELOC_NDS32_ICT_25PC,
+
/* This is a 9-bit reloc */
BFD_RELOC_V850_9_PCREL,
@@ -6235,6 +6485,14 @@
unsigned int selective_search : 1;
};
+/* See note beside bfd_set_section_userdata. */
+static inline bfd_boolean
+bfd_set_cacheable (bfd * abfd, bfd_boolean val)
+{
+ abfd->cacheable = val;
+ return TRUE;
+}
+
typedef enum bfd_error
{
bfd_error_no_error = 0,
diff -Nur binutils-2.24.orig/bfd/bfd-in.h binutils-2.24/bfd/bfd-in.h
--- binutils-2.24.orig/bfd/bfd-in.h 2013-11-04 16:33:37.000000000 +0100
+++ binutils-2.24/bfd/bfd-in.h 2024-05-17 16:15:38.915343427 +0200
@@ -292,9 +292,6 @@
#define bfd_is_com_section(ptr) (((ptr)->flags & SEC_IS_COMMON) != 0)
-#define bfd_set_section_vma(bfd, ptr, val) (((ptr)->vma = (ptr)->lma = (val)), ((ptr)->user_set_vma = TRUE), TRUE)
-#define bfd_set_section_alignment(bfd, ptr, val) (((ptr)->alignment_power = (val)),TRUE)
-#define bfd_set_section_userdata(bfd, ptr, val) (((ptr)->userdata = (val)),TRUE)
/* Find the address one past the end of SEC. */
#define bfd_get_section_limit(bfd, sec) \
(((bfd)->direction != write_direction && (sec)->rawsize != 0 \
@@ -517,8 +514,6 @@
#define bfd_get_symbol_leading_char(abfd) ((abfd)->xvec->symbol_leading_char)
-#define bfd_set_cacheable(abfd,bool) (((abfd)->cacheable = bool), TRUE)
-
extern bfd_boolean bfd_cache_close
(bfd *abfd);
/* NB: This declaration should match the autogenerated one in libbfd.h. */
diff -Nur binutils-2.24.orig/bfd/config.bfd binutils-2.24/bfd/config.bfd
--- binutils-2.24.orig/bfd/config.bfd 2013-11-04 16:33:37.000000000 +0100
+++ binutils-2.24/bfd/config.bfd 2024-05-17 16:15:38.923343593 +0200
@@ -6,12 +6,12 @@
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
-#
+#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
-#
+#
# You should have received a copy of the GNU General Public License
# along with this program; see the file COPYING3. If not see
# .
@@ -109,6 +109,7 @@
m88*) targ_archs=bfd_m88k_arch ;;
microblaze*) targ_archs=bfd_microblaze_arch ;;
mips*) targ_archs=bfd_mips_arch ;;
+nds32*) targ_archs=bfd_nds32_arch ;;
nios2*) targ_archs=bfd_nios2_arch ;;
or32*) targ_archs=bfd_or32_arch ;;
pdp11*) targ_archs=bfd_pdp11_arch ;;
@@ -1120,6 +1121,28 @@
targ_selvecs=bfd_elf32_msp430_ti_vec
;;
+ nds32*le-*-linux*)
+ targ_defvec=bfd_elf32_nds32lelin_vec
+ targ_selvecs=bfd_elf32_nds32belin_vec
+ targ_cflags=-DNDS32_LINUX_TOOLCHAIN
+ ;;
+
+ nds32*be-*-linux*)
+ targ_defvec=bfd_elf32_nds32belin_vec
+ targ_selvecs=bfd_elf32_nds32lelin_vec
+ targ_cflags=-DNDS32_LINUX_TOOLCHAIN
+ ;;
+
+ nds32*le-*-*)
+ targ_defvec=bfd_elf32_nds32le_vec
+ targ_selvecs=bfd_elf32_nds32be_vec
+ ;;
+
+ nds32*be-*-*)
+ targ_defvec=bfd_elf32_nds32be_vec
+ targ_selvecs=bfd_elf32_nds32le_vec
+ ;;
+
ns32k-pc532-mach* | ns32k-pc532-ux*)
targ_defvec=pc532machaout_vec
targ_underscore=yes
@@ -1640,12 +1663,12 @@
w65-*-*)
targ_defvec=w65_vec
;;
-
+
xgate-*-*)
targ_defvec=bfd_elf32_xgate_vec
targ_selvecs="bfd_elf32_xgate_vec"
;;
-
+
xstormy16-*-elf)
targ_defvec=bfd_elf32_xstormy16_vec
;;
diff -Nur binutils-2.24.orig/bfd/configure binutils-2.24/bfd/configure
--- binutils-2.24.orig/bfd/configure 2013-12-02 10:30:30.000000000 +0100
+++ binutils-2.24/bfd/configure 2024-05-17 16:15:38.939343923 +0200
@@ -15307,6 +15307,10 @@
tb="$tb elfn32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;;
bfd_elf32_ntradlittlemips_vec | bfd_elf32_ntradlittlemips_freebsd_vec)
tb="$tb elfn32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;;
+ bfd_elf32_nds32le_vec) tb="$tb elf32-nds32.lo elf32.lo $elf" ;;
+ bfd_elf32_nds32be_vec) tb="$tb elf32-nds32.lo elf32.lo $elf" ;;
+ bfd_elf32_nds32lelin_vec) tb="$tb elf32-nds32.lo elf32.lo $elf" ;;
+ bfd_elf32_nds32belin_vec) tb="$tb elf32-nds32.lo elf32.lo $elf" ;;
bfd_elf32_openrisc_vec) tb="$tb elf32-openrisc.lo elf32.lo $elf" ;;
bfd_elf32_or32_big_vec) tb="$tb elf32-or32.lo elf32.lo $elf" ;;
bfd_elf32_pj_vec) tb="$tb elf32-pj.lo elf32.lo $elf";;
diff -Nur binutils-2.24.orig/bfd/configure.in binutils-2.24/bfd/configure.in
--- binutils-2.24.orig/bfd/configure.in 2013-12-02 10:30:28.000000000 +0100
+++ binutils-2.24/bfd/configure.in 2024-05-17 16:15:38.939343923 +0200
@@ -796,6 +796,10 @@
tb="$tb elfn32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;;
bfd_elf32_ntradlittlemips_vec | bfd_elf32_ntradlittlemips_freebsd_vec)
tb="$tb elfn32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;;
+ bfd_elf32_nds32be_vec) tb="$tb elf32-nds32.lo elf32.lo $elf" ;;
+ bfd_elf32_nds32le_vec) tb="$tb elf32-nds32.lo elf32.lo $elf" ;;
+ bfd_elf32_nds32belin_vec) tb="$tb elf32-nds32.lo elf32.lo $elf" ;;
+ bfd_elf32_nds32lelin_vec) tb="$tb elf32-nds32.lo elf32.lo $elf" ;;
bfd_elf32_openrisc_vec) tb="$tb elf32-openrisc.lo elf32.lo $elf" ;;
bfd_elf32_or32_big_vec) tb="$tb elf32-or32.lo elf32.lo $elf" ;;
bfd_elf32_pj_vec) tb="$tb elf32-pj.lo elf32.lo $elf";;
diff -Nur binutils-2.24.orig/bfd/cpu-nds32.c binutils-2.24/bfd/cpu-nds32.c
--- binutils-2.24.orig/bfd/cpu-nds32.c 1970-01-01 01:00:00.000000000 +0100
+++ binutils-2.24/bfd/cpu-nds32.c 2024-05-17 16:15:38.939343923 +0200
@@ -0,0 +1,44 @@
+/* BFD support for the NDS32 processor
+ Copyright (C) 2012-2013 Free Software Foundation, Inc.
+ Contributed by Andes Technology Corporation.
+
+ This file is part of BFD, the Binary File Descriptor library.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+ 02110-1301, USA. */
+
+#include "sysdep.h"
+#include "bfd.h"
+#include "libbfd.h"
+#include "elf-bfd.h"
+
+#define N(number, print, default, next) \
+ {32, 32, 8, bfd_arch_nds32, number, "nds32", print, 4, default, \
+ bfd_default_compatible, bfd_default_scan, bfd_arch_default_fill, next }
+
+#define NEXT &arch_info_struct[0]
+#define NDS32V2_NEXT &arch_info_struct[1]
+#define NDS32V3_NEXT &arch_info_struct[2]
+#define NDS32V3M_NEXT &arch_info_struct[3]
+
+static const bfd_arch_info_type arch_info_struct[] = {
+ N (bfd_mach_n1h, "n1h", FALSE, NDS32V2_NEXT),
+ N (bfd_mach_n1h_v2, "n1h_v2", FALSE, NDS32V3_NEXT),
+ N (bfd_mach_n1h_v3, "n1h_v3", FALSE, NDS32V3M_NEXT),
+ N (bfd_mach_n1h_v3m, "n1h_v3m", FALSE, NULL),
+};
+
+const bfd_arch_info_type bfd_nds32_arch =
+ N (bfd_mach_n1, "n1h", TRUE, NEXT);
diff -Nur binutils-2.24.orig/bfd/doc/aoutx.texi binutils-2.24/bfd/doc/aoutx.texi
--- binutils-2.24.orig/bfd/doc/aoutx.texi 2013-11-18 09:49:27.000000000 +0100
+++ binutils-2.24/bfd/doc/aoutx.texi 1970-01-01 01:00:00.000000000 +0100
@@ -1,213 +0,0 @@
-@section a.out backends
-
-
-@strong{Description}@*
-BFD supports a number of different flavours of a.out format,
-though the major differences are only the sizes of the
-structures on disk, and the shape of the relocation
-information.
-
-The support is split into a basic support file @file{aoutx.h}
-and other files which derive functions from the base. One
-derivation file is @file{aoutf1.h} (for a.out flavour 1), and
-adds to the basic a.out functions support for sun3, sun4, 386
-and 29k a.out files, to create a target jump vector for a
-specific target.
-
-This information is further split out into more specific files
-for each machine, including @file{sunos.c} for sun3 and sun4,
-@file{newsos3.c} for the Sony NEWS, and @file{demo64.c} for a
-demonstration of a 64 bit a.out format.
-
-The base file @file{aoutx.h} defines general mechanisms for
-reading and writing records to and from disk and various
-other methods which BFD requires. It is included by
-@file{aout32.c} and @file{aout64.c} to form the names
-@code{aout_32_swap_exec_header_in}, @code{aout_64_swap_exec_header_in}, etc.
-
-As an example, this is what goes on to make the back end for a
-sun4, from @file{aout32.c}:
-
-@example
- #define ARCH_SIZE 32
- #include "aoutx.h"
-@end example
-
-Which exports names:
-
-@example
- ...
- aout_32_canonicalize_reloc
- aout_32_find_nearest_line
- aout_32_get_lineno
- aout_32_get_reloc_upper_bound
- ...
-@end example
-
-from @file{sunos.c}:
-
-@example
- #define TARGET_NAME "a.out-sunos-big"
- #define VECNAME sunos_big_vec
- #include "aoutf1.h"
-@end example
-
-requires all the names from @file{aout32.c}, and produces the jump vector
-
-@example
- sunos_big_vec
-@end example
-
-The file @file{host-aout.c} is a special case. It is for a large set
-of hosts that use ``more or less standard'' a.out files, and
-for which cross-debugging is not interesting. It uses the
-standard 32-bit a.out support routines, but determines the
-file offsets and addresses of the text, data, and BSS
-sections, the machine architecture and machine type, and the
-entry point address, in a host-dependent manner. Once these
-values have been determined, generic code is used to handle
-the object file.
-
-When porting it to run on a new system, you must supply:
-
-@example
- HOST_PAGE_SIZE
- HOST_SEGMENT_SIZE
- HOST_MACHINE_ARCH (optional)
- HOST_MACHINE_MACHINE (optional)
- HOST_TEXT_START_ADDR
- HOST_STACK_END_ADDR
-@end example
-
-in the file @file{../include/sys/h-@var{XXX}.h} (for your host). These
-values, plus the structures and macros defined in @file{a.out.h} on
-your host system, will produce a BFD target that will access
-ordinary a.out files on your host. To configure a new machine
-to use @file{host-aout.c}, specify:
-
-@example
- TDEFAULTS = -DDEFAULT_VECTOR=host_aout_big_vec
- TDEPFILES= host-aout.o trad-core.o
-@end example
-
-in the @file{config/@var{XXX}.mt} file, and modify @file{configure.in}
-to use the
-@file{@var{XXX}.mt} file (by setting "@code{bfd_target=XXX}") when your
-configuration is selected.
-
-@subsection Relocations
-
-
-@strong{Description}@*
-The file @file{aoutx.h} provides for both the @emph{standard}
-and @emph{extended} forms of a.out relocation records.
-
-The standard records contain only an
-address, a symbol index, and a type field. The extended records
-(used on 29ks and sparcs) also have a full integer for an
-addend.
-
-@subsection Internal entry points
-
-
-@strong{Description}@*
-@file{aoutx.h} exports several routines for accessing the
-contents of an a.out file, which are gathered and exported in
-turn by various format specific files (eg sunos.c).
-
-@findex aout_@var{size}_swap_exec_header_in
-@subsubsection @code{aout_@var{size}_swap_exec_header_in}
-@strong{Synopsis}
-@example
-void aout_@var{size}_swap_exec_header_in,
- (bfd *abfd,
- struct external_exec *bytes,
- struct internal_exec *execp);
-@end example
-@strong{Description}@*
-Swap the information in an executable header @var{raw_bytes} taken
-from a raw byte stream memory image into the internal exec header
-structure @var{execp}.
-
-@findex aout_@var{size}_swap_exec_header_out
-@subsubsection @code{aout_@var{size}_swap_exec_header_out}
-@strong{Synopsis}
-@example
-void aout_@var{size}_swap_exec_header_out
- (bfd *abfd,
- struct internal_exec *execp,
- struct external_exec *raw_bytes);
-@end example
-@strong{Description}@*
-Swap the information in an internal exec header structure
-@var{execp} into the buffer @var{raw_bytes} ready for writing to disk.
-
-@findex aout_@var{size}_some_aout_object_p
-@subsubsection @code{aout_@var{size}_some_aout_object_p}
-@strong{Synopsis}
-@example
-const bfd_target *aout_@var{size}_some_aout_object_p
- (bfd *abfd,
- struct internal_exec *execp,
- const bfd_target *(*callback_to_real_object_p) (bfd *));
-@end example
-@strong{Description}@*
-Some a.out variant thinks that the file open in @var{abfd}
-checking is an a.out file. Do some more checking, and set up
-for access if it really is. Call back to the calling
-environment's "finish up" function just before returning, to
-handle any last-minute setup.
-
-@findex aout_@var{size}_mkobject
-@subsubsection @code{aout_@var{size}_mkobject}
-@strong{Synopsis}
-@example
-bfd_boolean aout_@var{size}_mkobject, (bfd *abfd);
-@end example
-@strong{Description}@*
-Initialize BFD @var{abfd} for use with a.out files.
-
-@findex aout_@var{size}_machine_type
-@subsubsection @code{aout_@var{size}_machine_type}
-@strong{Synopsis}
-@example
-enum machine_type aout_@var{size}_machine_type
- (enum bfd_architecture arch,
- unsigned long machine,
- bfd_boolean *unknown);
-@end example
-@strong{Description}@*
-Keep track of machine architecture and machine type for
-a.out's. Return the @code{machine_type} for a particular
-architecture and machine, or @code{M_UNKNOWN} if that exact architecture
-and machine can't be represented in a.out format.
-
-If the architecture is understood, machine type 0 (default)
-is always understood.
-
-@findex aout_@var{size}_set_arch_mach
-@subsubsection @code{aout_@var{size}_set_arch_mach}
-@strong{Synopsis}
-@example
-bfd_boolean aout_@var{size}_set_arch_mach,
- (bfd *,
- enum bfd_architecture arch,
- unsigned long machine);
-@end example
-@strong{Description}@*
-Set the architecture and the machine of the BFD @var{abfd} to the
-values @var{arch} and @var{machine}. Verify that @var{abfd}'s format
-can support the architecture required.
-
-@findex aout_@var{size}_new_section_hook
-@subsubsection @code{aout_@var{size}_new_section_hook}
-@strong{Synopsis}
-@example
-bfd_boolean aout_@var{size}_new_section_hook,
- (bfd *abfd,
- asection *newsect);
-@end example
-@strong{Description}@*
-Called by the BFD in response to a @code{bfd_make_section}
-request.
-
diff -Nur binutils-2.24.orig/bfd/doc/archive.texi binutils-2.24/bfd/doc/archive.texi
--- binutils-2.24.orig/bfd/doc/archive.texi 2013-11-18 09:49:27.000000000 +0100
+++ binutils-2.24/bfd/doc/archive.texi 1970-01-01 01:00:00.000000000 +0100
@@ -1,105 +0,0 @@
-@section Archives
-
-
-@strong{Description}@*
-An archive (or library) is just another BFD. It has a symbol
-table, although there's not much a user program will do with it.
-
-The big difference between an archive BFD and an ordinary BFD
-is that the archive doesn't have sections. Instead it has a
-chain of BFDs that are considered its contents. These BFDs can
-be manipulated like any other. The BFDs contained in an
-archive opened for reading will all be opened for reading. You
-may put either input or output BFDs into an archive opened for
-output; they will be handled correctly when the archive is closed.
-
-Use @code{bfd_openr_next_archived_file} to step through
-the contents of an archive opened for input. You don't
-have to read the entire archive if you don't want
-to! Read it until you find what you want.
-
-A BFD returned by @code{bfd_openr_next_archived_file} can be
-closed manually with @code{bfd_close}. If you do not close it,
-then a second iteration through the members of an archive may
-return the same BFD. If you close the archive BFD, then all
-the member BFDs will automatically be closed as well.
-
-Archive contents of output BFDs are chained through the
-@code{archive_next} pointer in a BFD. The first one is findable
-through the @code{archive_head} slot of the archive. Set it with
-@code{bfd_set_archive_head} (q.v.). A given BFD may be in only
-one open output archive at a time.
-
-As expected, the BFD archive code is more general than the
-archive code of any given environment. BFD archives may
-contain files of different formats (e.g., a.out and coff) and
-even different architectures. You may even place archives
-recursively into archives!
-
-This can cause unexpected confusion, since some archive
-formats are more expressive than others. For instance, Intel
-COFF archives can preserve long filenames; SunOS a.out archives
-cannot. If you move a file from the first to the second
-format and back again, the filename may be truncated.
-Likewise, different a.out environments have different
-conventions as to how they truncate filenames, whether they
-preserve directory names in filenames, etc. When
-interoperating with native tools, be sure your files are
-homogeneous.
-
-Beware: most of these formats do not react well to the
-presence of spaces in filenames. We do the best we can, but
-can't always handle this case due to restrictions in the format of
-archives. Many Unix utilities are braindead in regards to
-spaces and such in filenames anyway, so this shouldn't be much
-of a restriction.
-
-Archives are supported in BFD in @code{archive.c}.
-
-@subsection Archive functions
-
-
-@findex bfd_get_next_mapent
-@subsubsection @code{bfd_get_next_mapent}
-@strong{Synopsis}
-@example
-symindex bfd_get_next_mapent
- (bfd *abfd, symindex previous, carsym **sym);
-@end example
-@strong{Description}@*
-Step through archive @var{abfd}'s symbol table (if it
-has one). Successively update @var{sym} with the next symbol's
-information, returning that symbol's (internal) index into the
-symbol table.
-
-Supply @code{BFD_NO_MORE_SYMBOLS} as the @var{previous} entry to get
-the first one; returns @code{BFD_NO_MORE_SYMBOLS} when you've already
-got the last one.
-
-A @code{carsym} is a canonical archive symbol. The only
-user-visible element is its name, a null-terminated string.
-
-@findex bfd_set_archive_head
-@subsubsection @code{bfd_set_archive_head}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_set_archive_head (bfd *output, bfd *new_head);
-@end example
-@strong{Description}@*
-Set the head of the chain of
-BFDs contained in the archive @var{output} to @var{new_head}.
-
-@findex bfd_openr_next_archived_file
-@subsubsection @code{bfd_openr_next_archived_file}
-@strong{Synopsis}
-@example
-bfd *bfd_openr_next_archived_file (bfd *archive, bfd *previous);
-@end example
-@strong{Description}@*
-Provided a BFD, @var{archive}, containing an archive and NULL, open
-an input BFD on the first contained element and returns that.
-Subsequent calls should pass
-the archive and the previous return value to return a created
-BFD to the next contained element. NULL is returned when there
-are no more.
-
diff -Nur binutils-2.24.orig/bfd/doc/archures.texi binutils-2.24/bfd/doc/archures.texi
--- binutils-2.24.orig/bfd/doc/archures.texi 2013-11-18 09:49:27.000000000 +0100
+++ binutils-2.24/bfd/doc/archures.texi 1970-01-01 01:00:00.000000000 +0100
@@ -1,706 +0,0 @@
-@section Architectures
-BFD keeps one atom in a BFD describing the
-architecture of the data attached to the BFD: a pointer to a
-@code{bfd_arch_info_type}.
-
-Pointers to structures can be requested independently of a BFD
-so that an architecture's information can be interrogated
-without access to an open BFD.
-
-The architecture information is provided by each architecture package.
-The set of default architectures is selected by the macro
-@code{SELECT_ARCHITECTURES}. This is normally set up in the
-@file{config/@var{target}.mt} file of your choice. If the name is not
-defined, then all the architectures supported are included.
-
-When BFD starts up, all the architectures are called with an
-initialize method. It is up to the architecture back end to
-insert as many items into the list of architectures as it wants to;
-generally this would be one for each machine and one for the
-default case (an item with a machine field of 0).
-
-BFD's idea of an architecture is implemented in @file{archures.c}.
-
-@subsection bfd_architecture
-
-
-@strong{Description}@*
-This enum gives the object file's CPU architecture, in a
-global sense---i.e., what processor family does it belong to?
-Another field indicates which processor within
-the family is in use. The machine gives a number which
-distinguishes different versions of the architecture,
-containing, for example, 2 and 3 for Intel i960 KA and i960 KB,
-and 68020 and 68030 for Motorola 68020 and 68030.
-@example
-enum bfd_architecture
-@{
- bfd_arch_unknown, /* File arch not known. */
- bfd_arch_obscure, /* Arch known, not one of these. */
- bfd_arch_m68k, /* Motorola 68xxx */
-#define bfd_mach_m68000 1
-#define bfd_mach_m68008 2
-#define bfd_mach_m68010 3
-#define bfd_mach_m68020 4
-#define bfd_mach_m68030 5
-#define bfd_mach_m68040 6
-#define bfd_mach_m68060 7
-#define bfd_mach_cpu32 8
-#define bfd_mach_fido 9
-#define bfd_mach_mcf_isa_a_nodiv 10
-#define bfd_mach_mcf_isa_a 11
-#define bfd_mach_mcf_isa_a_mac 12
-#define bfd_mach_mcf_isa_a_emac 13
-#define bfd_mach_mcf_isa_aplus 14
-#define bfd_mach_mcf_isa_aplus_mac 15
-#define bfd_mach_mcf_isa_aplus_emac 16
-#define bfd_mach_mcf_isa_b_nousp 17
-#define bfd_mach_mcf_isa_b_nousp_mac 18
-#define bfd_mach_mcf_isa_b_nousp_emac 19
-#define bfd_mach_mcf_isa_b 20
-#define bfd_mach_mcf_isa_b_mac 21
-#define bfd_mach_mcf_isa_b_emac 22
-#define bfd_mach_mcf_isa_b_float 23
-#define bfd_mach_mcf_isa_b_float_mac 24
-#define bfd_mach_mcf_isa_b_float_emac 25
-#define bfd_mach_mcf_isa_c 26
-#define bfd_mach_mcf_isa_c_mac 27
-#define bfd_mach_mcf_isa_c_emac 28
-#define bfd_mach_mcf_isa_c_nodiv 29
-#define bfd_mach_mcf_isa_c_nodiv_mac 30
-#define bfd_mach_mcf_isa_c_nodiv_emac 31
- bfd_arch_vax, /* DEC Vax */
- bfd_arch_i960, /* Intel 960 */
- /* The order of the following is important.
- lower number indicates a machine type that
- only accepts a subset of the instructions
- available to machines with higher numbers.
- The exception is the "ca", which is
- incompatible with all other machines except
- "core". */
-
-#define bfd_mach_i960_core 1
-#define bfd_mach_i960_ka_sa 2
-#define bfd_mach_i960_kb_sb 3
-#define bfd_mach_i960_mc 4
-#define bfd_mach_i960_xa 5
-#define bfd_mach_i960_ca 6
-#define bfd_mach_i960_jx 7
-#define bfd_mach_i960_hx 8
-
- bfd_arch_or32, /* OpenRISC 32 */
-
- bfd_arch_sparc, /* SPARC */
-#define bfd_mach_sparc 1
-/* The difference between v8plus and v9 is that v9 is a true 64 bit env. */
-#define bfd_mach_sparc_sparclet 2
-#define bfd_mach_sparc_sparclite 3
-#define bfd_mach_sparc_v8plus 4
-#define bfd_mach_sparc_v8plusa 5 /* with ultrasparc add'ns. */
-#define bfd_mach_sparc_sparclite_le 6
-#define bfd_mach_sparc_v9 7
-#define bfd_mach_sparc_v9a 8 /* with ultrasparc add'ns. */
-#define bfd_mach_sparc_v8plusb 9 /* with cheetah add'ns. */
-#define bfd_mach_sparc_v9b 10 /* with cheetah add'ns. */
-/* Nonzero if MACH has the v9 instruction set. */
-#define bfd_mach_sparc_v9_p(mach) \
- ((mach) >= bfd_mach_sparc_v8plus && (mach) <= bfd_mach_sparc_v9b \
- && (mach) != bfd_mach_sparc_sparclite_le)
-/* Nonzero if MACH is a 64 bit sparc architecture. */
-#define bfd_mach_sparc_64bit_p(mach) \
- ((mach) >= bfd_mach_sparc_v9 && (mach) != bfd_mach_sparc_v8plusb)
- bfd_arch_spu, /* PowerPC SPU */
-#define bfd_mach_spu 256
- bfd_arch_mips, /* MIPS Rxxxx */
-#define bfd_mach_mips3000 3000
-#define bfd_mach_mips3900 3900
-#define bfd_mach_mips4000 4000
-#define bfd_mach_mips4010 4010
-#define bfd_mach_mips4100 4100
-#define bfd_mach_mips4111 4111
-#define bfd_mach_mips4120 4120
-#define bfd_mach_mips4300 4300
-#define bfd_mach_mips4400 4400
-#define bfd_mach_mips4600 4600
-#define bfd_mach_mips4650 4650
-#define bfd_mach_mips5000 5000
-#define bfd_mach_mips5400 5400
-#define bfd_mach_mips5500 5500
-#define bfd_mach_mips5900 5900
-#define bfd_mach_mips6000 6000
-#define bfd_mach_mips7000 7000
-#define bfd_mach_mips8000 8000
-#define bfd_mach_mips9000 9000
-#define bfd_mach_mips10000 10000
-#define bfd_mach_mips12000 12000
-#define bfd_mach_mips14000 14000
-#define bfd_mach_mips16000 16000
-#define bfd_mach_mips16 16
-#define bfd_mach_mips5 5
-#define bfd_mach_mips_loongson_2e 3001
-#define bfd_mach_mips_loongson_2f 3002
-#define bfd_mach_mips_loongson_3a 3003
-#define bfd_mach_mips_sb1 12310201 /* octal 'SB', 01 */
-#define bfd_mach_mips_octeon 6501
-#define bfd_mach_mips_octeonp 6601
-#define bfd_mach_mips_octeon2 6502
-#define bfd_mach_mips_xlr 887682 /* decimal 'XLR' */
-#define bfd_mach_mipsisa32 32
-#define bfd_mach_mipsisa32r2 33
-#define bfd_mach_mipsisa64 64
-#define bfd_mach_mipsisa64r2 65
-#define bfd_mach_mips_micromips 96
- bfd_arch_i386, /* Intel 386 */
-#define bfd_mach_i386_intel_syntax (1 << 0)
-#define bfd_mach_i386_i8086 (1 << 1)
-#define bfd_mach_i386_i386 (1 << 2)
-#define bfd_mach_x86_64 (1 << 3)
-#define bfd_mach_x64_32 (1 << 4)
-#define bfd_mach_i386_i386_intel_syntax (bfd_mach_i386_i386 | bfd_mach_i386_intel_syntax)
-#define bfd_mach_x86_64_intel_syntax (bfd_mach_x86_64 | bfd_mach_i386_intel_syntax)
-#define bfd_mach_x64_32_intel_syntax (bfd_mach_x64_32 | bfd_mach_i386_intel_syntax)
- bfd_arch_l1om, /* Intel L1OM */
-#define bfd_mach_l1om (1 << 5)
-#define bfd_mach_l1om_intel_syntax (bfd_mach_l1om | bfd_mach_i386_intel_syntax)
- bfd_arch_k1om, /* Intel K1OM */
-#define bfd_mach_k1om (1 << 6)
-#define bfd_mach_k1om_intel_syntax (bfd_mach_k1om | bfd_mach_i386_intel_syntax)
-#define bfd_mach_i386_nacl (1 << 7)
-#define bfd_mach_i386_i386_nacl (bfd_mach_i386_i386 | bfd_mach_i386_nacl)
-#define bfd_mach_x86_64_nacl (bfd_mach_x86_64 | bfd_mach_i386_nacl)
-#define bfd_mach_x64_32_nacl (bfd_mach_x64_32 | bfd_mach_i386_nacl)
- bfd_arch_we32k, /* AT&T WE32xxx */
- bfd_arch_tahoe, /* CCI/Harris Tahoe */
- bfd_arch_i860, /* Intel 860 */
- bfd_arch_i370, /* IBM 360/370 Mainframes */
- bfd_arch_romp, /* IBM ROMP PC/RT */
- bfd_arch_convex, /* Convex */
- bfd_arch_m88k, /* Motorola 88xxx */
- bfd_arch_m98k, /* Motorola 98xxx */
- bfd_arch_pyramid, /* Pyramid Technology */
- bfd_arch_h8300, /* Renesas H8/300 (formerly Hitachi H8/300) */
-#define bfd_mach_h8300 1
-#define bfd_mach_h8300h 2
-#define bfd_mach_h8300s 3
-#define bfd_mach_h8300hn 4
-#define bfd_mach_h8300sn 5
-#define bfd_mach_h8300sx 6
-#define bfd_mach_h8300sxn 7
- bfd_arch_pdp11, /* DEC PDP-11 */
- bfd_arch_plugin,
- bfd_arch_powerpc, /* PowerPC */
-#define bfd_mach_ppc 32
-#define bfd_mach_ppc64 64
-#define bfd_mach_ppc_403 403
-#define bfd_mach_ppc_403gc 4030
-#define bfd_mach_ppc_405 405
-#define bfd_mach_ppc_505 505
-#define bfd_mach_ppc_601 601
-#define bfd_mach_ppc_602 602
-#define bfd_mach_ppc_603 603
-#define bfd_mach_ppc_ec603e 6031
-#define bfd_mach_ppc_604 604
-#define bfd_mach_ppc_620 620
-#define bfd_mach_ppc_630 630
-#define bfd_mach_ppc_750 750
-#define bfd_mach_ppc_860 860
-#define bfd_mach_ppc_a35 35
-#define bfd_mach_ppc_rs64ii 642
-#define bfd_mach_ppc_rs64iii 643
-#define bfd_mach_ppc_7400 7400
-#define bfd_mach_ppc_e500 500
-#define bfd_mach_ppc_e500mc 5001
-#define bfd_mach_ppc_e500mc64 5005
-#define bfd_mach_ppc_e5500 5006
-#define bfd_mach_ppc_e6500 5007
-#define bfd_mach_ppc_titan 83
-#define bfd_mach_ppc_vle 84
- bfd_arch_rs6000, /* IBM RS/6000 */
-#define bfd_mach_rs6k 6000
-#define bfd_mach_rs6k_rs1 6001
-#define bfd_mach_rs6k_rsc 6003
-#define bfd_mach_rs6k_rs2 6002
- bfd_arch_hppa, /* HP PA RISC */
-#define bfd_mach_hppa10 10
-#define bfd_mach_hppa11 11
-#define bfd_mach_hppa20 20
-#define bfd_mach_hppa20w 25
- bfd_arch_d10v, /* Mitsubishi D10V */
-#define bfd_mach_d10v 1
-#define bfd_mach_d10v_ts2 2
-#define bfd_mach_d10v_ts3 3
- bfd_arch_d30v, /* Mitsubishi D30V */
- bfd_arch_dlx, /* DLX */
- bfd_arch_m68hc11, /* Motorola 68HC11 */
- bfd_arch_m68hc12, /* Motorola 68HC12 */
-#define bfd_mach_m6812_default 0
-#define bfd_mach_m6812 1
-#define bfd_mach_m6812s 2
- bfd_arch_m9s12x, /* Freescale S12X */
- bfd_arch_m9s12xg, /* Freescale XGATE */
- bfd_arch_z8k, /* Zilog Z8000 */
-#define bfd_mach_z8001 1
-#define bfd_mach_z8002 2
- bfd_arch_h8500, /* Renesas H8/500 (formerly Hitachi H8/500) */
- bfd_arch_sh, /* Renesas / SuperH SH (formerly Hitachi SH) */
-#define bfd_mach_sh 1
-#define bfd_mach_sh2 0x20
-#define bfd_mach_sh_dsp 0x2d
-#define bfd_mach_sh2a 0x2a
-#define bfd_mach_sh2a_nofpu 0x2b
-#define bfd_mach_sh2a_nofpu_or_sh4_nommu_nofpu 0x2a1
-#define bfd_mach_sh2a_nofpu_or_sh3_nommu 0x2a2
-#define bfd_mach_sh2a_or_sh4 0x2a3
-#define bfd_mach_sh2a_or_sh3e 0x2a4
-#define bfd_mach_sh2e 0x2e
-#define bfd_mach_sh3 0x30
-#define bfd_mach_sh3_nommu 0x31
-#define bfd_mach_sh3_dsp 0x3d
-#define bfd_mach_sh3e 0x3e
-#define bfd_mach_sh4 0x40
-#define bfd_mach_sh4_nofpu 0x41
-#define bfd_mach_sh4_nommu_nofpu 0x42
-#define bfd_mach_sh4a 0x4a
-#define bfd_mach_sh4a_nofpu 0x4b
-#define bfd_mach_sh4al_dsp 0x4d
-#define bfd_mach_sh5 0x50
- bfd_arch_alpha, /* Dec Alpha */
-#define bfd_mach_alpha_ev4 0x10
-#define bfd_mach_alpha_ev5 0x20
-#define bfd_mach_alpha_ev6 0x30
- bfd_arch_arm, /* Advanced Risc Machines ARM. */
-#define bfd_mach_arm_unknown 0
-#define bfd_mach_arm_2 1
-#define bfd_mach_arm_2a 2
-#define bfd_mach_arm_3 3
-#define bfd_mach_arm_3M 4
-#define bfd_mach_arm_4 5
-#define bfd_mach_arm_4T 6
-#define bfd_mach_arm_5 7
-#define bfd_mach_arm_5T 8
-#define bfd_mach_arm_5TE 9
-#define bfd_mach_arm_XScale 10
-#define bfd_mach_arm_ep9312 11
-#define bfd_mach_arm_iWMMXt 12
-#define bfd_mach_arm_iWMMXt2 13
- bfd_arch_ns32k, /* National Semiconductors ns32000 */
- bfd_arch_w65, /* WDC 65816 */
- bfd_arch_tic30, /* Texas Instruments TMS320C30 */
- bfd_arch_tic4x, /* Texas Instruments TMS320C3X/4X */
-#define bfd_mach_tic3x 30
-#define bfd_mach_tic4x 40
- bfd_arch_tic54x, /* Texas Instruments TMS320C54X */
- bfd_arch_tic6x, /* Texas Instruments TMS320C6X */
- bfd_arch_tic80, /* TI TMS320c80 (MVP) */
- bfd_arch_v850, /* NEC V850 */
- bfd_arch_v850_rh850,/* NEC V850 (using RH850 ABI) */
-#define bfd_mach_v850 1
-#define bfd_mach_v850e 'E'
-#define bfd_mach_v850e1 '1'
-#define bfd_mach_v850e2 0x4532
-#define bfd_mach_v850e2v3 0x45325633
-#define bfd_mach_v850e3v5 0x45335635 /* ('E'|'3'|'V'|'5') */
- bfd_arch_arc, /* ARC Cores */
-#define bfd_mach_arc_5 5
-#define bfd_mach_arc_6 6
-#define bfd_mach_arc_7 7
-#define bfd_mach_arc_8 8
- bfd_arch_m32c, /* Renesas M16C/M32C. */
-#define bfd_mach_m16c 0x75
-#define bfd_mach_m32c 0x78
- bfd_arch_m32r, /* Renesas M32R (formerly Mitsubishi M32R/D) */
-#define bfd_mach_m32r 1 /* For backwards compatibility. */
-#define bfd_mach_m32rx 'x'
-#define bfd_mach_m32r2 '2'
- bfd_arch_mn10200, /* Matsushita MN10200 */
- bfd_arch_mn10300, /* Matsushita MN10300 */
-#define bfd_mach_mn10300 300
-#define bfd_mach_am33 330
-#define bfd_mach_am33_2 332
- bfd_arch_fr30,
-#define bfd_mach_fr30 0x46523330
- bfd_arch_frv,
-#define bfd_mach_frv 1
-#define bfd_mach_frvsimple 2
-#define bfd_mach_fr300 300
-#define bfd_mach_fr400 400
-#define bfd_mach_fr450 450
-#define bfd_mach_frvtomcat 499 /* fr500 prototype */
-#define bfd_mach_fr500 500
-#define bfd_mach_fr550 550
- bfd_arch_moxie, /* The moxie processor */
-#define bfd_mach_moxie 1
- bfd_arch_mcore,
- bfd_arch_mep,
-#define bfd_mach_mep 1
-#define bfd_mach_mep_h1 0x6831
-#define bfd_mach_mep_c5 0x6335
- bfd_arch_metag,
-#define bfd_mach_metag 1
- bfd_arch_ia64, /* HP/Intel ia64 */
-#define bfd_mach_ia64_elf64 64
-#define bfd_mach_ia64_elf32 32
- bfd_arch_ip2k, /* Ubicom IP2K microcontrollers. */
-#define bfd_mach_ip2022 1
-#define bfd_mach_ip2022ext 2
- bfd_arch_iq2000, /* Vitesse IQ2000. */
-#define bfd_mach_iq2000 1
-#define bfd_mach_iq10 2
- bfd_arch_epiphany, /* Adapteva EPIPHANY */
-#define bfd_mach_epiphany16 1
-#define bfd_mach_epiphany32 2
- bfd_arch_mt,
-#define bfd_mach_ms1 1
-#define bfd_mach_mrisc2 2
-#define bfd_mach_ms2 3
- bfd_arch_pj,
- bfd_arch_avr, /* Atmel AVR microcontrollers. */
-#define bfd_mach_avr1 1
-#define bfd_mach_avr2 2
-#define bfd_mach_avr25 25
-#define bfd_mach_avr3 3
-#define bfd_mach_avr31 31
-#define bfd_mach_avr35 35
-#define bfd_mach_avr4 4
-#define bfd_mach_avr5 5
-#define bfd_mach_avr51 51
-#define bfd_mach_avr6 6
-#define bfd_mach_avrxmega1 101
-#define bfd_mach_avrxmega2 102
-#define bfd_mach_avrxmega3 103
-#define bfd_mach_avrxmega4 104
-#define bfd_mach_avrxmega5 105
-#define bfd_mach_avrxmega6 106
-#define bfd_mach_avrxmega7 107
- bfd_arch_bfin, /* ADI Blackfin */
-#define bfd_mach_bfin 1
- bfd_arch_cr16, /* National Semiconductor CompactRISC (ie CR16). */
-#define bfd_mach_cr16 1
- bfd_arch_cr16c, /* National Semiconductor CompactRISC. */
-#define bfd_mach_cr16c 1
- bfd_arch_crx, /* National Semiconductor CRX. */
-#define bfd_mach_crx 1
- bfd_arch_cris, /* Axis CRIS */
-#define bfd_mach_cris_v0_v10 255
-#define bfd_mach_cris_v32 32
-#define bfd_mach_cris_v10_v32 1032
- bfd_arch_rl78,
-#define bfd_mach_rl78 0x75
- bfd_arch_rx, /* Renesas RX. */
-#define bfd_mach_rx 0x75
- bfd_arch_s390, /* IBM s390 */
-#define bfd_mach_s390_31 31
-#define bfd_mach_s390_64 64
- bfd_arch_score, /* Sunplus score */
-#define bfd_mach_score3 3
-#define bfd_mach_score7 7
- bfd_arch_openrisc, /* OpenRISC */
- bfd_arch_mmix, /* Donald Knuth's educational processor. */
- bfd_arch_xstormy16,
-#define bfd_mach_xstormy16 1
- bfd_arch_msp430, /* Texas Instruments MSP430 architecture. */
-#define bfd_mach_msp11 11
-#define bfd_mach_msp110 110
-#define bfd_mach_msp12 12
-#define bfd_mach_msp13 13
-#define bfd_mach_msp14 14
-#define bfd_mach_msp15 15
-#define bfd_mach_msp16 16
-#define bfd_mach_msp20 20
-#define bfd_mach_msp21 21
-#define bfd_mach_msp22 22
-#define bfd_mach_msp23 23
-#define bfd_mach_msp24 24
-#define bfd_mach_msp26 26
-#define bfd_mach_msp31 31
-#define bfd_mach_msp32 32
-#define bfd_mach_msp33 33
-#define bfd_mach_msp41 41
-#define bfd_mach_msp42 42
-#define bfd_mach_msp43 43
-#define bfd_mach_msp44 44
-#define bfd_mach_msp430x 45
-#define bfd_mach_msp46 46
-#define bfd_mach_msp47 47
-#define bfd_mach_msp54 54
- bfd_arch_xc16x, /* Infineon's XC16X Series. */
-#define bfd_mach_xc16x 1
-#define bfd_mach_xc16xl 2
-#define bfd_mach_xc16xs 3
- bfd_arch_xgate, /* Freescale XGATE */
-#define bfd_mach_xgate 1
- bfd_arch_xtensa, /* Tensilica's Xtensa cores. */
-#define bfd_mach_xtensa 1
- bfd_arch_z80,
-#define bfd_mach_z80strict 1 /* No undocumented opcodes. */
-#define bfd_mach_z80 3 /* With ixl, ixh, iyl, and iyh. */
-#define bfd_mach_z80full 7 /* All undocumented instructions. */
-#define bfd_mach_r800 11 /* R800: successor with multiplication. */
- bfd_arch_lm32, /* Lattice Mico32 */
-#define bfd_mach_lm32 1
- bfd_arch_microblaze,/* Xilinx MicroBlaze. */
- bfd_arch_tilepro, /* Tilera TILEPro */
- bfd_arch_tilegx, /* Tilera TILE-Gx */
-#define bfd_mach_tilepro 1
-#define bfd_mach_tilegx 1
-#define bfd_mach_tilegx32 2
- bfd_arch_aarch64, /* AArch64 */
-#define bfd_mach_aarch64 0
-#define bfd_mach_aarch64_ilp32 32
- bfd_arch_nios2,
-#define bfd_mach_nios2 0
- bfd_arch_last
- @};
-@end example
-
-@subsection bfd_arch_info
-
-
-@strong{Description}@*
-This structure contains information on architectures for use
-within BFD.
-@example
-
-typedef struct bfd_arch_info
-@{
- int bits_per_word;
- int bits_per_address;
- int bits_per_byte;
- enum bfd_architecture arch;
- unsigned long mach;
- const char *arch_name;
- const char *printable_name;
- unsigned int section_align_power;
- /* TRUE if this is the default machine for the architecture.
- The default arch should be the first entry for an arch so that
- all the entries for that arch can be accessed via @code{next}. */
- bfd_boolean the_default;
- const struct bfd_arch_info * (*compatible)
- (const struct bfd_arch_info *a, const struct bfd_arch_info *b);
-
- bfd_boolean (*scan) (const struct bfd_arch_info *, const char *);
-
- /* Allocate via bfd_malloc and return a fill buffer of size COUNT. If
- IS_BIGENDIAN is TRUE, the order of bytes is big endian. If CODE is
- TRUE, the buffer contains code. */
- void *(*fill) (bfd_size_type count, bfd_boolean is_bigendian,
- bfd_boolean code);
-
- const struct bfd_arch_info *next;
-@}
-bfd_arch_info_type;
-
-@end example
-
-@findex bfd_printable_name
-@subsubsection @code{bfd_printable_name}
-@strong{Synopsis}
-@example
-const char *bfd_printable_name (bfd *abfd);
-@end example
-@strong{Description}@*
-Return a printable string representing the architecture and machine
-from the pointer to the architecture info structure.
-
-@findex bfd_scan_arch
-@subsubsection @code{bfd_scan_arch}
-@strong{Synopsis}
-@example
-const bfd_arch_info_type *bfd_scan_arch (const char *string);
-@end example
-@strong{Description}@*
-Figure out if BFD supports any cpu which could be described with
-the name @var{string}. Return a pointer to an @code{arch_info}
-structure if a machine is found, otherwise NULL.
-
-@findex bfd_arch_list
-@subsubsection @code{bfd_arch_list}
-@strong{Synopsis}
-@example
-const char **bfd_arch_list (void);
-@end example
-@strong{Description}@*
-Return a freshly malloced NULL-terminated vector of the names
-of all the valid BFD architectures. Do not modify the names.
-
-@findex bfd_arch_get_compatible
-@subsubsection @code{bfd_arch_get_compatible}
-@strong{Synopsis}
-@example
-const bfd_arch_info_type *bfd_arch_get_compatible
- (const bfd *abfd, const bfd *bbfd, bfd_boolean accept_unknowns);
-@end example
-@strong{Description}@*
-Determine whether two BFDs' architectures and machine types
-are compatible. Calculates the lowest common denominator
-between the two architectures and machine types implied by
-the BFDs and returns a pointer to an @code{arch_info} structure
-describing the compatible machine.
-
-@findex bfd_default_arch_struct
-@subsubsection @code{bfd_default_arch_struct}
-@strong{Description}@*
-The @code{bfd_default_arch_struct} is an item of
-@code{bfd_arch_info_type} which has been initialized to a fairly
-generic state. A BFD starts life by pointing to this
-structure, until the correct back end has determined the real
-architecture of the file.
-@example
-extern const bfd_arch_info_type bfd_default_arch_struct;
-@end example
-
-@findex bfd_set_arch_info
-@subsubsection @code{bfd_set_arch_info}
-@strong{Synopsis}
-@example
-void bfd_set_arch_info (bfd *abfd, const bfd_arch_info_type *arg);
-@end example
-@strong{Description}@*
-Set the architecture info of @var{abfd} to @var{arg}.
-
-@findex bfd_default_set_arch_mach
-@subsubsection @code{bfd_default_set_arch_mach}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_default_set_arch_mach
- (bfd *abfd, enum bfd_architecture arch, unsigned long mach);
-@end example
-@strong{Description}@*
-Set the architecture and machine type in BFD @var{abfd}
-to @var{arch} and @var{mach}. Find the correct
-pointer to a structure and insert it into the @code{arch_info}
-pointer.
-
-@findex bfd_get_arch
-@subsubsection @code{bfd_get_arch}
-@strong{Synopsis}
-@example
-enum bfd_architecture bfd_get_arch (bfd *abfd);
-@end example
-@strong{Description}@*
-Return the enumerated type which describes the BFD @var{abfd}'s
-architecture.
-
-@findex bfd_get_mach
-@subsubsection @code{bfd_get_mach}
-@strong{Synopsis}
-@example
-unsigned long bfd_get_mach (bfd *abfd);
-@end example
-@strong{Description}@*
-Return the long type which describes the BFD @var{abfd}'s
-machine.
-
-@findex bfd_arch_bits_per_byte
-@subsubsection @code{bfd_arch_bits_per_byte}
-@strong{Synopsis}
-@example
-unsigned int bfd_arch_bits_per_byte (bfd *abfd);
-@end example
-@strong{Description}@*
-Return the number of bits in one of the BFD @var{abfd}'s
-architecture's bytes.
-
-@findex bfd_arch_bits_per_address
-@subsubsection @code{bfd_arch_bits_per_address}
-@strong{Synopsis}
-@example
-unsigned int bfd_arch_bits_per_address (bfd *abfd);
-@end example
-@strong{Description}@*
-Return the number of bits in one of the BFD @var{abfd}'s
-architecture's addresses.
-
-@findex bfd_default_compatible
-@subsubsection @code{bfd_default_compatible}
-@strong{Synopsis}
-@example
-const bfd_arch_info_type *bfd_default_compatible
- (const bfd_arch_info_type *a, const bfd_arch_info_type *b);
-@end example
-@strong{Description}@*
-The default function for testing for compatibility.
-
-@findex bfd_default_scan
-@subsubsection @code{bfd_default_scan}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_default_scan
- (const struct bfd_arch_info *info, const char *string);
-@end example
-@strong{Description}@*
-The default function for working out whether this is an
-architecture hit and a machine hit.
-
-@findex bfd_get_arch_info
-@subsubsection @code{bfd_get_arch_info}
-@strong{Synopsis}
-@example
-const bfd_arch_info_type *bfd_get_arch_info (bfd *abfd);
-@end example
-@strong{Description}@*
-Return the architecture info struct in @var{abfd}.
-
-@findex bfd_lookup_arch
-@subsubsection @code{bfd_lookup_arch}
-@strong{Synopsis}
-@example
-const bfd_arch_info_type *bfd_lookup_arch
- (enum bfd_architecture arch, unsigned long machine);
-@end example
-@strong{Description}@*
-Look for the architecture info structure which matches the
-arguments @var{arch} and @var{machine}. A machine of 0 matches the
-machine/architecture structure which marks itself as the
-default.
-
-@findex bfd_printable_arch_mach
-@subsubsection @code{bfd_printable_arch_mach}
-@strong{Synopsis}
-@example
-const char *bfd_printable_arch_mach
- (enum bfd_architecture arch, unsigned long machine);
-@end example
-@strong{Description}@*
-Return a printable string representing the architecture and
-machine type.
-
-This routine is depreciated.
-
-@findex bfd_octets_per_byte
-@subsubsection @code{bfd_octets_per_byte}
-@strong{Synopsis}
-@example
-unsigned int bfd_octets_per_byte (bfd *abfd);
-@end example
-@strong{Description}@*
-Return the number of octets (8-bit quantities) per target byte
-(minimum addressable unit). In most cases, this will be one, but some
-DSP targets have 16, 32, or even 48 bits per byte.
-
-@findex bfd_arch_mach_octets_per_byte
-@subsubsection @code{bfd_arch_mach_octets_per_byte}
-@strong{Synopsis}
-@example
-unsigned int bfd_arch_mach_octets_per_byte
- (enum bfd_architecture arch, unsigned long machine);
-@end example
-@strong{Description}@*
-See bfd_octets_per_byte.
-
-This routine is provided for those cases where a bfd * is not
-available
-
-@findex bfd_arch_default_fill
-@subsubsection @code{bfd_arch_default_fill}
-@strong{Synopsis}
-@example
-void *bfd_arch_default_fill (bfd_size_type count,
- bfd_boolean is_bigendian,
- bfd_boolean code);
-@end example
-@strong{Description}@*
-Allocate via bfd_malloc and return a fill buffer of size COUNT.
-If IS_BIGENDIAN is TRUE, the order of bytes is big endian. If
-CODE is TRUE, the buffer contains code.
-
diff -Nur binutils-2.24.orig/bfd/doc/bfd.info binutils-2.24/bfd/doc/bfd.info
--- binutils-2.24.orig/bfd/doc/bfd.info 2013-12-02 10:32:19.000000000 +0100
+++ binutils-2.24/bfd/doc/bfd.info 1970-01-01 01:00:00.000000000 +0100
@@ -1,13242 +0,0 @@
-This is bfd.info, produced by makeinfo version 4.8 from bfd.texinfo.
-
-INFO-DIR-SECTION Software development
-START-INFO-DIR-ENTRY
-* Bfd: (bfd). The Binary File Descriptor library.
-END-INFO-DIR-ENTRY
-
- This file documents the BFD library.
-
- Copyright (C) 1991 - 2013 Free Software Foundation, Inc.
-
- Permission is granted to copy, distribute and/or modify this document
-under the terms of the GNU Free Documentation License, Version 1.3 or
-any later version published by the Free Software Foundation; with the
-Invariant Sections being "GNU General Public License" and "Funding Free
-Software", the Front-Cover texts being (a) (see below), and with the
-Back-Cover Texts being (b) (see below). A copy of the license is
-included in the section entitled "GNU Free Documentation License".
-
- (a) The FSF's Front-Cover Text is:
-
- A GNU Manual
-
- (b) The FSF's Back-Cover Text is:
-
- You have freedom to copy and modify this GNU Manual, like GNU
-software. Copies published by the Free Software Foundation raise
-funds for GNU development.
-
-
-File: bfd.info, Node: Top, Next: Overview, Prev: (dir), Up: (dir)
-
- This file documents the binary file descriptor library libbfd.
-
-* Menu:
-
-* Overview:: Overview of BFD
-* BFD front end:: BFD front end
-* BFD back ends:: BFD back ends
-* GNU Free Documentation License:: GNU Free Documentation License
-* BFD Index:: BFD Index
-
-
-File: bfd.info, Node: Overview, Next: BFD front end, Prev: Top, Up: Top
-
-1 Introduction
-**************
-
-BFD is a package which allows applications to use the same routines to
-operate on object files whatever the object file format. A new object
-file format can be supported simply by creating a new BFD back end and
-adding it to the library.
-
- BFD is split into two parts: the front end, and the back ends (one
-for each object file format).
- * The front end of BFD provides the interface to the user. It manages
- memory and various canonical data structures. The front end also
- decides which back end to use and when to call back end routines.
-
- * The back ends provide BFD its view of the real world. Each back
- end provides a set of calls which the BFD front end can use to
- maintain its canonical form. The back ends also may keep around
- information for their own use, for greater efficiency.
-
-* Menu:
-
-* History:: History
-* How It Works:: How It Works
-* What BFD Version 2 Can Do:: What BFD Version 2 Can Do
-
-
-File: bfd.info, Node: History, Next: How It Works, Prev: Overview, Up: Overview
-
-1.1 History
-===========
-
-One spur behind BFD was the desire, on the part of the GNU 960 team at
-Intel Oregon, for interoperability of applications on their COFF and
-b.out file formats. Cygnus was providing GNU support for the team, and
-was contracted to provide the required functionality.
-
- The name came from a conversation David Wallace was having with
-Richard Stallman about the library: RMS said that it would be quite
-hard--David said "BFD". Stallman was right, but the name stuck.
-
- At the same time, Ready Systems wanted much the same thing, but for
-different object file formats: IEEE-695, Oasys, Srecords, a.out and 68k
-coff.
-
- BFD was first implemented by members of Cygnus Support; Steve
-Chamberlain (`sac@cygnus.com'), John Gilmore (`gnu@cygnus.com'), K.
-Richard Pixley (`rich@cygnus.com') and David Henkel-Wallace
-(`gumby@cygnus.com').
-
-
-File: bfd.info, Node: How It Works, Next: What BFD Version 2 Can Do, Prev: History, Up: Overview
-
-1.2 How To Use BFD
-==================
-
-To use the library, include `bfd.h' and link with `libbfd.a'.
-
- BFD provides a common interface to the parts of an object file for a
-calling application.
-
- When an application successfully opens a target file (object,
-archive, or whatever), a pointer to an internal structure is returned.
-This pointer points to a structure called `bfd', described in `bfd.h'.
-Our convention is to call this pointer a BFD, and instances of it
-within code `abfd'. All operations on the target object file are
-applied as methods to the BFD. The mapping is defined within `bfd.h'
-in a set of macros, all beginning with `bfd_' to reduce namespace
-pollution.
-
- For example, this sequence does what you would probably expect:
-return the number of sections in an object file attached to a BFD
-`abfd'.
-
- #include "bfd.h"
-
- unsigned int number_of_sections (abfd)
- bfd *abfd;
- {
- return bfd_count_sections (abfd);
- }
-
- The abstraction used within BFD is that an object file has:
-
- * a header,
-
- * a number of sections containing raw data (*note Sections::),
-
- * a set of relocations (*note Relocations::), and
-
- * some symbol information (*note Symbols::).
- Also, BFDs opened for archives have the additional attribute of an
-index and contain subordinate BFDs. This approach is fine for a.out and
-coff, but loses efficiency when applied to formats such as S-records and
-IEEE-695.
-
-
-File: bfd.info, Node: What BFD Version 2 Can Do, Prev: How It Works, Up: Overview
-
-1.3 What BFD Version 2 Can Do
-=============================
-
-When an object file is opened, BFD subroutines automatically determine
-the format of the input object file. They then build a descriptor in
-memory with pointers to routines that will be used to access elements of
-the object file's data structures.
-
- As different information from the object files is required, BFD
-reads from different sections of the file and processes them. For
-example, a very common operation for the linker is processing symbol
-tables. Each BFD back end provides a routine for converting between
-the object file's representation of symbols and an internal canonical
-format. When the linker asks for the symbol table of an object file, it
-calls through a memory pointer to the routine from the relevant BFD
-back end which reads and converts the table into a canonical form. The
-linker then operates upon the canonical form. When the link is finished
-and the linker writes the output file's symbol table, another BFD back
-end routine is called to take the newly created symbol table and
-convert it into the chosen output format.
-
-* Menu:
-
-* BFD information loss:: Information Loss
-* Canonical format:: The BFD canonical object-file format
-
-
-File: bfd.info, Node: BFD information loss, Next: Canonical format, Up: What BFD Version 2 Can Do
-
-1.3.1 Information Loss
-----------------------
-
-_Information can be lost during output._ The output formats supported
-by BFD do not provide identical facilities, and information which can
-be described in one form has nowhere to go in another format. One
-example of this is alignment information in `b.out'. There is nowhere
-in an `a.out' format file to store alignment information on the
-contained data, so when a file is linked from `b.out' and an `a.out'
-image is produced, alignment information will not propagate to the
-output file. (The linker will still use the alignment information
-internally, so the link is performed correctly).
-
- Another example is COFF section names. COFF files may contain an
-unlimited number of sections, each one with a textual section name. If
-the target of the link is a format which does not have many sections
-(e.g., `a.out') or has sections without names (e.g., the Oasys format),
-the link cannot be done simply. You can circumvent this problem by
-describing the desired input-to-output section mapping with the linker
-command language.
-
- _Information can be lost during canonicalization._ The BFD internal
-canonical form of the external formats is not exhaustive; there are
-structures in input formats for which there is no direct representation
-internally. This means that the BFD back ends cannot maintain all
-possible data richness through the transformation between external to
-internal and back to external formats.
-
- This limitation is only a problem when an application reads one
-format and writes another. Each BFD back end is responsible for
-maintaining as much data as possible, and the internal BFD canonical
-form has structures which are opaque to the BFD core, and exported only
-to the back ends. When a file is read in one format, the canonical form
-is generated for BFD and the application. At the same time, the back
-end saves away any information which may otherwise be lost. If the data
-is then written back in the same format, the back end routine will be
-able to use the canonical form provided by the BFD core as well as the
-information it prepared earlier. Since there is a great deal of
-commonality between back ends, there is no information lost when
-linking or copying big endian COFF to little endian COFF, or `a.out' to
-`b.out'. When a mixture of formats is linked, the information is only
-lost from the files whose format differs from the destination.
-
-
-File: bfd.info, Node: Canonical format, Prev: BFD information loss, Up: What BFD Version 2 Can Do
-
-1.3.2 The BFD canonical object-file format
-------------------------------------------
-
-The greatest potential for loss of information occurs when there is the
-least overlap between the information provided by the source format,
-that stored by the canonical format, and that needed by the destination
-format. A brief description of the canonical form may help you
-understand which kinds of data you can count on preserving across
-conversions.
-
-_files_
- Information stored on a per-file basis includes target machine
- architecture, particular implementation format type, a demand
- pageable bit, and a write protected bit. Information like Unix
- magic numbers is not stored here--only the magic numbers' meaning,
- so a `ZMAGIC' file would have both the demand pageable bit and the
- write protected text bit set. The byte order of the target is
- stored on a per-file basis, so that big- and little-endian object
- files may be used with one another.
-
-_sections_
- Each section in the input file contains the name of the section,
- the section's original address in the object file, size and
- alignment information, various flags, and pointers into other BFD
- data structures.
-
-_symbols_
- Each symbol contains a pointer to the information for the object
- file which originally defined it, its name, its value, and various
- flag bits. When a BFD back end reads in a symbol table, it
- relocates all symbols to make them relative to the base of the
- section where they were defined. Doing this ensures that each
- symbol points to its containing section. Each symbol also has a
- varying amount of hidden private data for the BFD back end. Since
- the symbol points to the original file, the private data format
- for that symbol is accessible. `ld' can operate on a collection
- of symbols of wildly different formats without problems.
-
- Normal global and simple local symbols are maintained on output,
- so an output file (no matter its format) will retain symbols
- pointing to functions and to global, static, and common variables.
- Some symbol information is not worth retaining; in `a.out', type
- information is stored in the symbol table as long symbol names.
- This information would be useless to most COFF debuggers; the
- linker has command line switches to allow users to throw it away.
-
- There is one word of type information within the symbol, so if the
- format supports symbol type information within symbols (for
- example, COFF, IEEE, Oasys) and the type is simple enough to fit
- within one word (nearly everything but aggregates), the
- information will be preserved.
-
-_relocation level_
- Each canonical BFD relocation record contains a pointer to the
- symbol to relocate to, the offset of the data to relocate, the
- section the data is in, and a pointer to a relocation type
- descriptor. Relocation is performed by passing messages through
- the relocation type descriptor and the symbol pointer. Therefore,
- relocations can be performed on output data using a relocation
- method that is only available in one of the input formats. For
- instance, Oasys provides a byte relocation format. A relocation
- record requesting this relocation type would point indirectly to a
- routine to perform this, so the relocation may be performed on a
- byte being written to a 68k COFF file, even though 68k COFF has no
- such relocation type.
-
-_line numbers_
- Object formats can contain, for debugging purposes, some form of
- mapping between symbols, source line numbers, and addresses in the
- output file. These addresses have to be relocated along with the
- symbol information. Each symbol with an associated list of line
- number records points to the first record of the list. The head
- of a line number list consists of a pointer to the symbol, which
- allows finding out the address of the function whose line number
- is being described. The rest of the list is made up of pairs:
- offsets into the section and line numbers. Any format which can
- simply derive this information can pass it successfully between
- formats (COFF, IEEE and Oasys).
-
-
-File: bfd.info, Node: BFD front end, Next: BFD back ends, Prev: Overview, Up: Top
-
-2 BFD Front End
-***************
-
-* Menu:
-
-* typedef bfd::
-* Error reporting::
-* Miscellaneous::
-* Memory Usage::
-* Initialization::
-* Sections::
-* Symbols::
-* Archives::
-* Formats::
-* Relocations::
-* Core Files::
-* Targets::
-* Architectures::
-* Opening and Closing::
-* Internal::
-* File Caching::
-* Linker Functions::
-* Hash Tables::
-
-
-File: bfd.info, Node: typedef bfd, Next: Error reporting, Prev: BFD front end, Up: BFD front end
-
-2.1 `typedef bfd'
-=================
-
-A BFD has type `bfd'; objects of this type are the cornerstone of any
-application using BFD. Using BFD consists of making references though
-the BFD and to data in the BFD.
-
- Here is the structure that defines the type `bfd'. It contains the
-major data about the file and pointers to the rest of the data.
-
-
- enum bfd_direction
- {
- no_direction = 0,
- read_direction = 1,
- write_direction = 2,
- both_direction = 3
- };
-
- struct bfd
- {
- /* A unique identifier of the BFD */
- unsigned int id;
-
- /* The filename the application opened the BFD with. */
- const char *filename;
-
- /* A pointer to the target jump table. */
- const struct bfd_target *xvec;
-
- /* The IOSTREAM, and corresponding IO vector that provide access
- to the file backing the BFD. */
- void *iostream;
- const struct bfd_iovec *iovec;
-
- /* The caching routines use these to maintain a
- least-recently-used list of BFDs. */
- struct bfd *lru_prev, *lru_next;
-
- /* When a file is closed by the caching routines, BFD retains
- state information on the file here... */
- ufile_ptr where;
-
- /* File modified time, if mtime_set is TRUE. */
- long mtime;
-
- /* Reserved for an unimplemented file locking extension. */
- int ifd;
-
- /* The format which belongs to the BFD. (object, core, etc.) */
- bfd_format format;
-
- /* The direction with which the BFD was opened. */
- enum bfd_direction direction;
-
- /* Format_specific flags. */
- flagword flags;
-
- /* Values that may appear in the flags field of a BFD. These also
- appear in the object_flags field of the bfd_target structure, where
- they indicate the set of flags used by that backend (not all flags
- are meaningful for all object file formats) (FIXME: at the moment,
- the object_flags values have mostly just been copied from backend
- to another, and are not necessarily correct). */
-
- #define BFD_NO_FLAGS 0x00
-
- /* BFD contains relocation entries. */
- #define HAS_RELOC 0x01
-
- /* BFD is directly executable. */
- #define EXEC_P 0x02
-
- /* BFD has line number information (basically used for F_LNNO in a
- COFF header). */
- #define HAS_LINENO 0x04
-
- /* BFD has debugging information. */
- #define HAS_DEBUG 0x08
-
- /* BFD has symbols. */
- #define HAS_SYMS 0x10
-
- /* BFD has local symbols (basically used for F_LSYMS in a COFF
- header). */
- #define HAS_LOCALS 0x20
-
- /* BFD is a dynamic object. */
- #define DYNAMIC 0x40
-
- /* Text section is write protected (if D_PAGED is not set, this is
- like an a.out NMAGIC file) (the linker sets this by default, but
- clears it for -r or -N). */
- #define WP_TEXT 0x80
-
- /* BFD is dynamically paged (this is like an a.out ZMAGIC file) (the
- linker sets this by default, but clears it for -r or -n or -N). */
- #define D_PAGED 0x100
-
- /* BFD is relaxable (this means that bfd_relax_section may be able to
- do something) (sometimes bfd_relax_section can do something even if
- this is not set). */
- #define BFD_IS_RELAXABLE 0x200
-
- /* This may be set before writing out a BFD to request using a
- traditional format. For example, this is used to request that when
- writing out an a.out object the symbols not be hashed to eliminate
- duplicates. */
- #define BFD_TRADITIONAL_FORMAT 0x400
-
- /* This flag indicates that the BFD contents are actually cached
- in memory. If this is set, iostream points to a bfd_in_memory
- struct. */
- #define BFD_IN_MEMORY 0x800
-
- /* The sections in this BFD specify a memory page. */
- #define HAS_LOAD_PAGE 0x1000
-
- /* This BFD has been created by the linker and doesn't correspond
- to any input file. */
- #define BFD_LINKER_CREATED 0x2000
-
- /* This may be set before writing out a BFD to request that it
- be written using values for UIDs, GIDs, timestamps, etc. that
- will be consistent from run to run. */
- #define BFD_DETERMINISTIC_OUTPUT 0x4000
-
- /* Compress sections in this BFD. */
- #define BFD_COMPRESS 0x8000
-
- /* Decompress sections in this BFD. */
- #define BFD_DECOMPRESS 0x10000
-
- /* BFD is a dummy, for plugins. */
- #define BFD_PLUGIN 0x20000
-
- /* Flags bits to be saved in bfd_preserve_save. */
- #define BFD_FLAGS_SAVED \
- (BFD_IN_MEMORY | BFD_COMPRESS | BFD_DECOMPRESS | BFD_PLUGIN)
-
- /* Flags bits which are for BFD use only. */
- #define BFD_FLAGS_FOR_BFD_USE_MASK \
- (BFD_IN_MEMORY | BFD_COMPRESS | BFD_DECOMPRESS | BFD_LINKER_CREATED \
- | BFD_PLUGIN | BFD_TRADITIONAL_FORMAT | BFD_DETERMINISTIC_OUTPUT)
-
- /* Currently my_archive is tested before adding origin to
- anything. I believe that this can become always an add of
- origin, with origin set to 0 for non archive files. */
- ufile_ptr origin;
-
- /* The origin in the archive of the proxy entry. This will
- normally be the same as origin, except for thin archives,
- when it will contain the current offset of the proxy in the
- thin archive rather than the offset of the bfd in its actual
- container. */
- ufile_ptr proxy_origin;
-
- /* A hash table for section names. */
- struct bfd_hash_table section_htab;
-
- /* Pointer to linked list of sections. */
- struct bfd_section *sections;
-
- /* The last section on the section list. */
- struct bfd_section *section_last;
-
- /* The number of sections. */
- unsigned int section_count;
-
- /* Stuff only useful for object files:
- The start address. */
- bfd_vma start_address;
-
- /* Used for input and output. */
- unsigned int symcount;
-
- /* Symbol table for output BFD (with symcount entries).
- Also used by the linker to cache input BFD symbols. */
- struct bfd_symbol **outsymbols;
-
- /* Used for slurped dynamic symbol tables. */
- unsigned int dynsymcount;
-
- /* Pointer to structure which contains architecture information. */
- const struct bfd_arch_info *arch_info;
-
- /* Stuff only useful for archives. */
- void *arelt_data;
- struct bfd *my_archive; /* The containing archive BFD. */
- struct bfd *archive_next; /* The next BFD in the archive. */
- struct bfd *archive_head; /* The first BFD in the archive. */
- struct bfd *nested_archives; /* List of nested archive in a flattened
- thin archive. */
-
- /* A chain of BFD structures involved in a link. */
- struct bfd *link_next;
-
- /* A field used by _bfd_generic_link_add_archive_symbols. This will
- be used only for archive elements. */
- int archive_pass;
-
- /* Used by the back end to hold private data. */
- union
- {
- struct aout_data_struct *aout_data;
- struct artdata *aout_ar_data;
- struct _oasys_data *oasys_obj_data;
- struct _oasys_ar_data *oasys_ar_data;
- struct coff_tdata *coff_obj_data;
- struct pe_tdata *pe_obj_data;
- struct xcoff_tdata *xcoff_obj_data;
- struct ecoff_tdata *ecoff_obj_data;
- struct ieee_data_struct *ieee_data;
- struct ieee_ar_data_struct *ieee_ar_data;
- struct srec_data_struct *srec_data;
- struct verilog_data_struct *verilog_data;
- struct ihex_data_struct *ihex_data;
- struct tekhex_data_struct *tekhex_data;
- struct elf_obj_tdata *elf_obj_data;
- struct nlm_obj_tdata *nlm_obj_data;
- struct bout_data_struct *bout_data;
- struct mmo_data_struct *mmo_data;
- struct sun_core_struct *sun_core_data;
- struct sco5_core_struct *sco5_core_data;
- struct trad_core_struct *trad_core_data;
- struct som_data_struct *som_data;
- struct hpux_core_struct *hpux_core_data;
- struct hppabsd_core_struct *hppabsd_core_data;
- struct sgi_core_struct *sgi_core_data;
- struct lynx_core_struct *lynx_core_data;
- struct osf_core_struct *osf_core_data;
- struct cisco_core_struct *cisco_core_data;
- struct versados_data_struct *versados_data;
- struct netbsd_core_struct *netbsd_core_data;
- struct mach_o_data_struct *mach_o_data;
- struct mach_o_fat_data_struct *mach_o_fat_data;
- struct plugin_data_struct *plugin_data;
- struct bfd_pef_data_struct *pef_data;
- struct bfd_pef_xlib_data_struct *pef_xlib_data;
- struct bfd_sym_data_struct *sym_data;
- void *any;
- }
- tdata;
-
- /* Used by the application to hold private data. */
- void *usrdata;
-
- /* Where all the allocated stuff under this BFD goes. This is a
- struct objalloc *, but we use void * to avoid requiring the inclusion
- of objalloc.h. */
- void *memory;
-
- /* Is the file descriptor being cached? That is, can it be closed as
- needed, and re-opened when accessed later? */
- unsigned int cacheable : 1;
-
- /* Marks whether there was a default target specified when the
- BFD was opened. This is used to select which matching algorithm
- to use to choose the back end. */
- unsigned int target_defaulted : 1;
-
- /* ... and here: (``once'' means at least once). */
- unsigned int opened_once : 1;
-
- /* Set if we have a locally maintained mtime value, rather than
- getting it from the file each time. */
- unsigned int mtime_set : 1;
-
- /* Flag set if symbols from this BFD should not be exported. */
- unsigned int no_export : 1;
-
- /* Remember when output has begun, to stop strange things
- from happening. */
- unsigned int output_has_begun : 1;
-
- /* Have archive map. */
- unsigned int has_armap : 1;
-
- /* Set if this is a thin archive. */
- unsigned int is_thin_archive : 1;
-
- /* Set if only required symbols should be added in the link hash table for
- this object. Used by VMS linkers. */
- unsigned int selective_search : 1;
- };
-
-
-File: bfd.info, Node: Error reporting, Next: Miscellaneous, Prev: typedef bfd, Up: BFD front end
-
-2.2 Error reporting
-===================
-
-Most BFD functions return nonzero on success (check their individual
-documentation for precise semantics). On an error, they call
-`bfd_set_error' to set an error condition that callers can check by
-calling `bfd_get_error'. If that returns `bfd_error_system_call', then
-check `errno'.
-
- The easiest way to report a BFD error to the user is to use
-`bfd_perror'.
-
-2.2.1 Type `bfd_error_type'
----------------------------
-
-The values returned by `bfd_get_error' are defined by the enumerated
-type `bfd_error_type'.
-
-
- typedef enum bfd_error
- {
- bfd_error_no_error = 0,
- bfd_error_system_call,
- bfd_error_invalid_target,
- bfd_error_wrong_format,
- bfd_error_wrong_object_format,
- bfd_error_invalid_operation,
- bfd_error_no_memory,
- bfd_error_no_symbols,
- bfd_error_no_armap,
- bfd_error_no_more_archived_files,
- bfd_error_malformed_archive,
- bfd_error_missing_dso,
- bfd_error_file_not_recognized,
- bfd_error_file_ambiguously_recognized,
- bfd_error_no_contents,
- bfd_error_nonrepresentable_section,
- bfd_error_no_debug_section,
- bfd_error_bad_value,
- bfd_error_file_truncated,
- bfd_error_file_too_big,
- bfd_error_on_input,
- bfd_error_invalid_error_code
- }
- bfd_error_type;
-
-2.2.1.1 `bfd_get_error'
-.......................
-
-*Synopsis*
- bfd_error_type bfd_get_error (void);
- *Description*
-Return the current BFD error condition.
-
-2.2.1.2 `bfd_set_error'
-.......................
-
-*Synopsis*
- void bfd_set_error (bfd_error_type error_tag, ...);
- *Description*
-Set the BFD error condition to be ERROR_TAG. If ERROR_TAG is
-bfd_error_on_input, then this function takes two more parameters, the
-input bfd where the error occurred, and the bfd_error_type error.
-
-2.2.1.3 `bfd_errmsg'
-....................
-
-*Synopsis*
- const char *bfd_errmsg (bfd_error_type error_tag);
- *Description*
-Return a string describing the error ERROR_TAG, or the system error if
-ERROR_TAG is `bfd_error_system_call'.
-
-2.2.1.4 `bfd_perror'
-....................
-
-*Synopsis*
- void bfd_perror (const char *message);
- *Description*
-Print to the standard error stream a string describing the last BFD
-error that occurred, or the last system error if the last BFD error was
-a system call failure. If MESSAGE is non-NULL and non-empty, the error
-string printed is preceded by MESSAGE, a colon, and a space. It is
-followed by a newline.
-
-2.2.2 BFD error handler
------------------------
-
-Some BFD functions want to print messages describing the problem. They
-call a BFD error handler function. This function may be overridden by
-the program.
-
- The BFD error handler acts like printf.
-
-
- typedef void (*bfd_error_handler_type) (const char *, ...);
-
-2.2.2.1 `bfd_set_error_handler'
-...............................
-
-*Synopsis*
- bfd_error_handler_type bfd_set_error_handler (bfd_error_handler_type);
- *Description*
-Set the BFD error handler function. Returns the previous function.
-
-2.2.2.2 `bfd_set_error_program_name'
-....................................
-
-*Synopsis*
- void bfd_set_error_program_name (const char *);
- *Description*
-Set the program name to use when printing a BFD error. This is printed
-before the error message followed by a colon and space. The string
-must not be changed after it is passed to this function.
-
-2.2.2.3 `bfd_get_error_handler'
-...............................
-
-*Synopsis*
- bfd_error_handler_type bfd_get_error_handler (void);
- *Description*
-Return the BFD error handler function.
-
-2.2.3 BFD assert handler
-------------------------
-
-If BFD finds an internal inconsistency, the bfd assert handler is
-called with information on the BFD version, BFD source file and line.
-If this happens, most programs linked against BFD are expected to want
-to exit with an error, or mark the current BFD operation as failed, so
-it is recommended to override the default handler, which just calls
-_bfd_error_handler and continues.
-
-
- typedef void (*bfd_assert_handler_type) (const char *bfd_formatmsg,
- const char *bfd_version,
- const char *bfd_file,
- int bfd_line);
-
-2.2.3.1 `bfd_set_assert_handler'
-................................
-
-*Synopsis*
- bfd_assert_handler_type bfd_set_assert_handler (bfd_assert_handler_type);
- *Description*
-Set the BFD assert handler function. Returns the previous function.
-
-2.2.3.2 `bfd_get_assert_handler'
-................................
-
-*Synopsis*
- bfd_assert_handler_type bfd_get_assert_handler (void);
- *Description*
-Return the BFD assert handler function.
-
-
-File: bfd.info, Node: Miscellaneous, Next: Memory Usage, Prev: Error reporting, Up: BFD front end
-
-2.3 Miscellaneous
-=================
-
-2.3.1 Miscellaneous functions
------------------------------
-
-2.3.1.1 `bfd_get_reloc_upper_bound'
-...................................
-
-*Synopsis*
- long bfd_get_reloc_upper_bound (bfd *abfd, asection *sect);
- *Description*
-Return the number of bytes required to store the relocation information
-associated with section SECT attached to bfd ABFD. If an error occurs,
-return -1.
-
-2.3.1.2 `bfd_canonicalize_reloc'
-................................
-
-*Synopsis*
- long bfd_canonicalize_reloc
- (bfd *abfd, asection *sec, arelent **loc, asymbol **syms);
- *Description*
-Call the back end associated with the open BFD ABFD and translate the
-external form of the relocation information attached to SEC into the
-internal canonical form. Place the table into memory at LOC, which has
-been preallocated, usually by a call to `bfd_get_reloc_upper_bound'.
-Returns the number of relocs, or -1 on error.
-
- The SYMS table is also needed for horrible internal magic reasons.
-
-2.3.1.3 `bfd_set_reloc'
-.......................
-
-*Synopsis*
- void bfd_set_reloc
- (bfd *abfd, asection *sec, arelent **rel, unsigned int count);
- *Description*
-Set the relocation pointer and count within section SEC to the values
-REL and COUNT. The argument ABFD is ignored.
-
-2.3.1.4 `bfd_set_file_flags'
-............................
-
-*Synopsis*
- bfd_boolean bfd_set_file_flags (bfd *abfd, flagword flags);
- *Description*
-Set the flag word in the BFD ABFD to the value FLAGS.
-
- Possible errors are:
- * `bfd_error_wrong_format' - The target bfd was not of object format.
-
- * `bfd_error_invalid_operation' - The target bfd was open for
- reading.
-
- * `bfd_error_invalid_operation' - The flag word contained a bit
- which was not applicable to the type of file. E.g., an attempt
- was made to set the `D_PAGED' bit on a BFD format which does not
- support demand paging.
-
-2.3.1.5 `bfd_get_arch_size'
-...........................
-
-*Synopsis*
- int bfd_get_arch_size (bfd *abfd);
- *Description*
-Returns the architecture address size, in bits, as determined by the
-object file's format. For ELF, this information is included in the
-header.
-
- *Returns*
-Returns the arch size in bits if known, `-1' otherwise.
-
-2.3.1.6 `bfd_get_sign_extend_vma'
-.................................
-
-*Synopsis*
- int bfd_get_sign_extend_vma (bfd *abfd);
- *Description*
-Indicates if the target architecture "naturally" sign extends an
-address. Some architectures implicitly sign extend address values when
-they are converted to types larger than the size of an address. For
-instance, bfd_get_start_address() will return an address sign extended
-to fill a bfd_vma when this is the case.
-
- *Returns*
-Returns `1' if the target architecture is known to sign extend
-addresses, `0' if the target architecture is known to not sign extend
-addresses, and `-1' otherwise.
-
-2.3.1.7 `bfd_set_start_address'
-...............................
-
-*Synopsis*
- bfd_boolean bfd_set_start_address (bfd *abfd, bfd_vma vma);
- *Description*
-Make VMA the entry point of output BFD ABFD.
-
- *Returns*
-Returns `TRUE' on success, `FALSE' otherwise.
-
-2.3.1.8 `bfd_get_gp_size'
-.........................
-
-*Synopsis*
- unsigned int bfd_get_gp_size (bfd *abfd);
- *Description*
-Return the maximum size of objects to be optimized using the GP
-register under MIPS ECOFF. This is typically set by the `-G' argument
-to the compiler, assembler or linker.
-
-2.3.1.9 `bfd_set_gp_size'
-.........................
-
-*Synopsis*
- void bfd_set_gp_size (bfd *abfd, unsigned int i);
- *Description*
-Set the maximum size of objects to be optimized using the GP register
-under ECOFF or MIPS ELF. This is typically set by the `-G' argument to
-the compiler, assembler or linker.
-
-2.3.1.10 `bfd_scan_vma'
-.......................
-
-*Synopsis*
- bfd_vma bfd_scan_vma (const char *string, const char **end, int base);
- *Description*
-Convert, like `strtoul', a numerical expression STRING into a `bfd_vma'
-integer, and return that integer. (Though without as many bells and
-whistles as `strtoul'.) The expression is assumed to be unsigned
-(i.e., positive). If given a BASE, it is used as the base for
-conversion. A base of 0 causes the function to interpret the string in
-hex if a leading "0x" or "0X" is found, otherwise in octal if a leading
-zero is found, otherwise in decimal.
-
- If the value would overflow, the maximum `bfd_vma' value is returned.
-
-2.3.1.11 `bfd_copy_private_header_data'
-.......................................
-
-*Synopsis*
- bfd_boolean bfd_copy_private_header_data (bfd *ibfd, bfd *obfd);
- *Description*
-Copy private BFD header information from the BFD IBFD to the the BFD
-OBFD. This copies information that may require sections to exist, but
-does not require symbol tables. Return `true' on success, `false' on
-error. Possible error returns are:
-
- * `bfd_error_no_memory' - Not enough memory exists to create private
- data for OBFD.
-
- #define bfd_copy_private_header_data(ibfd, obfd) \
- BFD_SEND (obfd, _bfd_copy_private_header_data, \
- (ibfd, obfd))
-
-2.3.1.12 `bfd_copy_private_bfd_data'
-....................................
-
-*Synopsis*
- bfd_boolean bfd_copy_private_bfd_data (bfd *ibfd, bfd *obfd);
- *Description*
-Copy private BFD information from the BFD IBFD to the the BFD OBFD.
-Return `TRUE' on success, `FALSE' on error. Possible error returns are:
-
- * `bfd_error_no_memory' - Not enough memory exists to create private
- data for OBFD.
-
- #define bfd_copy_private_bfd_data(ibfd, obfd) \
- BFD_SEND (obfd, _bfd_copy_private_bfd_data, \
- (ibfd, obfd))
-
-2.3.1.13 `bfd_merge_private_bfd_data'
-.....................................
-
-*Synopsis*
- bfd_boolean bfd_merge_private_bfd_data (bfd *ibfd, bfd *obfd);
- *Description*
-Merge private BFD information from the BFD IBFD to the the output file
-BFD OBFD when linking. Return `TRUE' on success, `FALSE' on error.
-Possible error returns are:
-
- * `bfd_error_no_memory' - Not enough memory exists to create private
- data for OBFD.
-
- #define bfd_merge_private_bfd_data(ibfd, obfd) \
- BFD_SEND (obfd, _bfd_merge_private_bfd_data, \
- (ibfd, obfd))
-
-2.3.1.14 `bfd_set_private_flags'
-................................
-
-*Synopsis*
- bfd_boolean bfd_set_private_flags (bfd *abfd, flagword flags);
- *Description*
-Set private BFD flag information in the BFD ABFD. Return `TRUE' on
-success, `FALSE' on error. Possible error returns are:
-
- * `bfd_error_no_memory' - Not enough memory exists to create private
- data for OBFD.
-
- #define bfd_set_private_flags(abfd, flags) \
- BFD_SEND (abfd, _bfd_set_private_flags, (abfd, flags))
-
-2.3.1.15 `Other functions'
-..........................
-
-*Description*
-The following functions exist but have not yet been documented.
- #define bfd_sizeof_headers(abfd, info) \
- BFD_SEND (abfd, _bfd_sizeof_headers, (abfd, info))
-
- #define bfd_find_nearest_line(abfd, sec, syms, off, file, func, line) \
- BFD_SEND (abfd, _bfd_find_nearest_line, \
- (abfd, sec, syms, off, file, func, line))
-
- #define bfd_find_nearest_line_discriminator(abfd, sec, syms, off, file, func, \
- line, disc) \
- BFD_SEND (abfd, _bfd_find_nearest_line_discriminator, \
- (abfd, sec, syms, off, file, func, line, disc))
-
- #define bfd_find_line(abfd, syms, sym, file, line) \
- BFD_SEND (abfd, _bfd_find_line, \
- (abfd, syms, sym, file, line))
-
- #define bfd_find_inliner_info(abfd, file, func, line) \
- BFD_SEND (abfd, _bfd_find_inliner_info, \
- (abfd, file, func, line))
-
- #define bfd_debug_info_start(abfd) \
- BFD_SEND (abfd, _bfd_debug_info_start, (abfd))
-
- #define bfd_debug_info_end(abfd) \
- BFD_SEND (abfd, _bfd_debug_info_end, (abfd))
-
- #define bfd_debug_info_accumulate(abfd, section) \
- BFD_SEND (abfd, _bfd_debug_info_accumulate, (abfd, section))
-
- #define bfd_stat_arch_elt(abfd, stat) \
- BFD_SEND (abfd, _bfd_stat_arch_elt,(abfd, stat))
-
- #define bfd_update_armap_timestamp(abfd) \
- BFD_SEND (abfd, _bfd_update_armap_timestamp, (abfd))
-
- #define bfd_set_arch_mach(abfd, arch, mach)\
- BFD_SEND ( abfd, _bfd_set_arch_mach, (abfd, arch, mach))
-
- #define bfd_relax_section(abfd, section, link_info, again) \
- BFD_SEND (abfd, _bfd_relax_section, (abfd, section, link_info, again))
-
- #define bfd_gc_sections(abfd, link_info) \
- BFD_SEND (abfd, _bfd_gc_sections, (abfd, link_info))
-
- #define bfd_lookup_section_flags(link_info, flag_info, section) \
- BFD_SEND (abfd, _bfd_lookup_section_flags, (link_info, flag_info, section))
-
- #define bfd_merge_sections(abfd, link_info) \
- BFD_SEND (abfd, _bfd_merge_sections, (abfd, link_info))
-
- #define bfd_is_group_section(abfd, sec) \
- BFD_SEND (abfd, _bfd_is_group_section, (abfd, sec))
-
- #define bfd_discard_group(abfd, sec) \
- BFD_SEND (abfd, _bfd_discard_group, (abfd, sec))
-
- #define bfd_link_hash_table_create(abfd) \
- BFD_SEND (abfd, _bfd_link_hash_table_create, (abfd))
-
- #define bfd_link_hash_table_free(abfd, hash) \
- BFD_SEND (abfd, _bfd_link_hash_table_free, (hash))
-
- #define bfd_link_add_symbols(abfd, info) \
- BFD_SEND (abfd, _bfd_link_add_symbols, (abfd, info))
-
- #define bfd_link_just_syms(abfd, sec, info) \
- BFD_SEND (abfd, _bfd_link_just_syms, (sec, info))
-
- #define bfd_final_link(abfd, info) \
- BFD_SEND (abfd, _bfd_final_link, (abfd, info))
-
- #define bfd_free_cached_info(abfd) \
- BFD_SEND (abfd, _bfd_free_cached_info, (abfd))
-
- #define bfd_get_dynamic_symtab_upper_bound(abfd) \
- BFD_SEND (abfd, _bfd_get_dynamic_symtab_upper_bound, (abfd))
-
- #define bfd_print_private_bfd_data(abfd, file)\
- BFD_SEND (abfd, _bfd_print_private_bfd_data, (abfd, file))
-
- #define bfd_canonicalize_dynamic_symtab(abfd, asymbols) \
- BFD_SEND (abfd, _bfd_canonicalize_dynamic_symtab, (abfd, asymbols))
-
- #define bfd_get_synthetic_symtab(abfd, count, syms, dyncount, dynsyms, ret) \
- BFD_SEND (abfd, _bfd_get_synthetic_symtab, (abfd, count, syms, \
- dyncount, dynsyms, ret))
-
- #define bfd_get_dynamic_reloc_upper_bound(abfd) \
- BFD_SEND (abfd, _bfd_get_dynamic_reloc_upper_bound, (abfd))
-
- #define bfd_canonicalize_dynamic_reloc(abfd, arels, asyms) \
- BFD_SEND (abfd, _bfd_canonicalize_dynamic_reloc, (abfd, arels, asyms))
-
- extern bfd_byte *bfd_get_relocated_section_contents
- (bfd *, struct bfd_link_info *, struct bfd_link_order *, bfd_byte *,
- bfd_boolean, asymbol **);
-
-2.3.1.16 `bfd_alt_mach_code'
-............................
-
-*Synopsis*
- bfd_boolean bfd_alt_mach_code (bfd *abfd, int alternative);
- *Description*
-When more than one machine code number is available for the same
-machine type, this function can be used to switch between the preferred
-one (alternative == 0) and any others. Currently, only ELF supports
-this feature, with up to two alternate machine codes.
-
-2.3.1.17 `bfd_emul_get_maxpagesize'
-...................................
-
-*Synopsis*
- bfd_vma bfd_emul_get_maxpagesize (const char *);
- *Description*
-Returns the maximum page size, in bytes, as determined by emulation.
-
- *Returns*
-Returns the maximum page size in bytes for ELF, 0 otherwise.
-
-2.3.1.18 `bfd_emul_set_maxpagesize'
-...................................
-
-*Synopsis*
- void bfd_emul_set_maxpagesize (const char *, bfd_vma);
- *Description*
-For ELF, set the maximum page size for the emulation. It is a no-op
-for other formats.
-
-2.3.1.19 `bfd_emul_get_commonpagesize'
-......................................
-
-*Synopsis*
- bfd_vma bfd_emul_get_commonpagesize (const char *);
- *Description*
-Returns the common page size, in bytes, as determined by emulation.
-
- *Returns*
-Returns the common page size in bytes for ELF, 0 otherwise.
-
-2.3.1.20 `bfd_emul_set_commonpagesize'
-......................................
-
-*Synopsis*
- void bfd_emul_set_commonpagesize (const char *, bfd_vma);
- *Description*
-For ELF, set the common page size for the emulation. It is a no-op for
-other formats.
-
-2.3.1.21 `bfd_demangle'
-.......................
-
-*Synopsis*
- char *bfd_demangle (bfd *, const char *, int);
- *Description*
-Wrapper around cplus_demangle. Strips leading underscores and other
-such chars that would otherwise confuse the demangler. If passed a g++
-v3 ABI mangled name, returns a buffer allocated with malloc holding the
-demangled name. Returns NULL otherwise and on memory alloc failure.
-
-2.3.1.22 `struct bfd_iovec'
-...........................
-
-*Description*
-The `struct bfd_iovec' contains the internal file I/O class. Each
-`BFD' has an instance of this class and all file I/O is routed through
-it (it is assumed that the instance implements all methods listed
-below).
- struct bfd_iovec
- {
- /* To avoid problems with macros, a "b" rather than "f"
- prefix is prepended to each method name. */
- /* Attempt to read/write NBYTES on ABFD's IOSTREAM storing/fetching
- bytes starting at PTR. Return the number of bytes actually
- transfered (a read past end-of-file returns less than NBYTES),
- or -1 (setting `bfd_error') if an error occurs. */
- file_ptr (*bread) (struct bfd *abfd, void *ptr, file_ptr nbytes);
- file_ptr (*bwrite) (struct bfd *abfd, const void *ptr,
- file_ptr nbytes);
- /* Return the current IOSTREAM file offset, or -1 (setting `bfd_error'
- if an error occurs. */
- file_ptr (*btell) (struct bfd *abfd);
- /* For the following, on successful completion a value of 0 is returned.
- Otherwise, a value of -1 is returned (and `bfd_error' is set). */
- int (*bseek) (struct bfd *abfd, file_ptr offset, int whence);
- int (*bclose) (struct bfd *abfd);
- int (*bflush) (struct bfd *abfd);
- int (*bstat) (struct bfd *abfd, struct stat *sb);
- /* Mmap a part of the files. ADDR, LEN, PROT, FLAGS and OFFSET are the usual
- mmap parameter, except that LEN and OFFSET do not need to be page
- aligned. Returns (void *)-1 on failure, mmapped address on success.
- Also write in MAP_ADDR the address of the page aligned buffer and in
- MAP_LEN the size mapped (a page multiple). Use unmap with MAP_ADDR and
- MAP_LEN to unmap. */
- void *(*bmmap) (struct bfd *abfd, void *addr, bfd_size_type len,
- int prot, int flags, file_ptr offset,
- void **map_addr, bfd_size_type *map_len);
- };
- extern const struct bfd_iovec _bfd_memory_iovec;
-
-2.3.1.23 `bfd_get_mtime'
-........................
-
-*Synopsis*
- long bfd_get_mtime (bfd *abfd);
- *Description*
-Return the file modification time (as read from the file system, or
-from the archive header for archive members).
-
-2.3.1.24 `bfd_get_size'
-.......................
-
-*Synopsis*
- file_ptr bfd_get_size (bfd *abfd);
- *Description*
-Return the file size (as read from file system) for the file associated
-with BFD ABFD.
-
- The initial motivation for, and use of, this routine is not so we
-can get the exact size of the object the BFD applies to, since that
-might not be generally possible (archive members for example). It
-would be ideal if someone could eventually modify it so that such
-results were guaranteed.
-
- Instead, we want to ask questions like "is this NNN byte sized
-object I'm about to try read from file offset YYY reasonable?" As as
-example of where we might do this, some object formats use string
-tables for which the first `sizeof (long)' bytes of the table contain
-the size of the table itself, including the size bytes. If an
-application tries to read what it thinks is one of these string tables,
-without some way to validate the size, and for some reason the size is
-wrong (byte swapping error, wrong location for the string table, etc.),
-the only clue is likely to be a read error when it tries to read the
-table, or a "virtual memory exhausted" error when it tries to allocate
-15 bazillon bytes of space for the 15 bazillon byte table it is about
-to read. This function at least allows us to answer the question, "is
-the size reasonable?".
-
-2.3.1.25 `bfd_mmap'
-...................
-
-*Synopsis*
- void *bfd_mmap (bfd *abfd, void *addr, bfd_size_type len,
- int prot, int flags, file_ptr offset,
- void **map_addr, bfd_size_type *map_len);
- *Description*
-Return mmap()ed region of the file, if possible and implemented. LEN
-and OFFSET do not need to be page aligned. The page aligned address
-and length are written to MAP_ADDR and MAP_LEN.
-
-
-File: bfd.info, Node: Memory Usage, Next: Initialization, Prev: Miscellaneous, Up: BFD front end
-
-2.4 Memory Usage
-================
-
-BFD keeps all of its internal structures in obstacks. There is one
-obstack per open BFD file, into which the current state is stored. When
-a BFD is closed, the obstack is deleted, and so everything which has
-been allocated by BFD for the closing file is thrown away.
-
- BFD does not free anything created by an application, but pointers
-into `bfd' structures become invalid on a `bfd_close'; for example,
-after a `bfd_close' the vector passed to `bfd_canonicalize_symtab' is
-still around, since it has been allocated by the application, but the
-data that it pointed to are lost.
-
- The general rule is to not close a BFD until all operations dependent
-upon data from the BFD have been completed, or all the data from within
-the file has been copied. To help with the management of memory, there
-is a function (`bfd_alloc_size') which returns the number of bytes in
-obstacks associated with the supplied BFD. This could be used to select
-the greediest open BFD, close it to reclaim the memory, perform some
-operation and reopen the BFD again, to get a fresh copy of the data
-structures.
-
-
-File: bfd.info, Node: Initialization, Next: Sections, Prev: Memory Usage, Up: BFD front end
-
-2.5 Initialization
-==================
-
-2.5.1 Initialization functions
-------------------------------
-
-These are the functions that handle initializing a BFD.
-
-2.5.1.1 `bfd_init'
-..................
-
-*Synopsis*
- void bfd_init (void);
- *Description*
-This routine must be called before any other BFD function to initialize
-magical internal data structures.
-
-
-File: bfd.info, Node: Sections, Next: Symbols, Prev: Initialization, Up: BFD front end
-
-2.6 Sections
-============
-
-The raw data contained within a BFD is maintained through the section
-abstraction. A single BFD may have any number of sections. It keeps
-hold of them by pointing to the first; each one points to the next in
-the list.
-
- Sections are supported in BFD in `section.c'.
-
-* Menu:
-
-* Section Input::
-* Section Output::
-* typedef asection::
-* section prototypes::
-
-
-File: bfd.info, Node: Section Input, Next: Section Output, Prev: Sections, Up: Sections
-
-2.6.1 Section input
--------------------
-
-When a BFD is opened for reading, the section structures are created
-and attached to the BFD.
-
- Each section has a name which describes the section in the outside
-world--for example, `a.out' would contain at least three sections,
-called `.text', `.data' and `.bss'.
-
- Names need not be unique; for example a COFF file may have several
-sections named `.data'.
-
- Sometimes a BFD will contain more than the "natural" number of
-sections. A back end may attach other sections containing constructor
-data, or an application may add a section (using `bfd_make_section') to
-the sections attached to an already open BFD. For example, the linker
-creates an extra section `COMMON' for each input file's BFD to hold
-information about common storage.
-
- The raw data is not necessarily read in when the section descriptor
-is created. Some targets may leave the data in place until a
-`bfd_get_section_contents' call is made. Other back ends may read in
-all the data at once. For example, an S-record file has to be read
-once to determine the size of the data. An IEEE-695 file doesn't
-contain raw data in sections, but data and relocation expressions
-intermixed, so the data area has to be parsed to get out the data and
-relocations.
-
-
-File: bfd.info, Node: Section Output, Next: typedef asection, Prev: Section Input, Up: Sections
-
-2.6.2 Section output
---------------------
-
-To write a new object style BFD, the various sections to be written
-have to be created. They are attached to the BFD in the same way as
-input sections; data is written to the sections using
-`bfd_set_section_contents'.
-
- Any program that creates or combines sections (e.g., the assembler
-and linker) must use the `asection' fields `output_section' and
-`output_offset' to indicate the file sections to which each section
-must be written. (If the section is being created from scratch,
-`output_section' should probably point to the section itself and
-`output_offset' should probably be zero.)
-
- The data to be written comes from input sections attached (via
-`output_section' pointers) to the output sections. The output section
-structure can be considered a filter for the input section: the output
-section determines the vma of the output data and the name, but the
-input section determines the offset into the output section of the data
-to be written.
-
- E.g., to create a section "O", starting at 0x100, 0x123 long,
-containing two subsections, "A" at offset 0x0 (i.e., at vma 0x100) and
-"B" at offset 0x20 (i.e., at vma 0x120) the `asection' structures would
-look like:
-
- section name "A"
- output_offset 0x00
- size 0x20
- output_section -----------> section name "O"
- | vma 0x100
- section name "B" | size 0x123
- output_offset 0x20 |
- size 0x103 |
- output_section --------|
-
-2.6.3 Link orders
------------------
-
-The data within a section is stored in a "link_order". These are much
-like the fixups in `gas'. The link_order abstraction allows a section
-to grow and shrink within itself.
-
- A link_order knows how big it is, and which is the next link_order
-and where the raw data for it is; it also points to a list of
-relocations which apply to it.
-
- The link_order is used by the linker to perform relaxing on final
-code. The compiler creates code which is as big as necessary to make
-it work without relaxing, and the user can select whether to relax.
-Sometimes relaxing takes a lot of time. The linker runs around the
-relocations to see if any are attached to data which can be shrunk, if
-so it does it on a link_order by link_order basis.
-
-
-File: bfd.info, Node: typedef asection, Next: section prototypes, Prev: Section Output, Up: Sections
-
-2.6.4 typedef asection
-----------------------
-
-Here is the section structure:
-
-
- typedef struct bfd_section
- {
- /* The name of the section; the name isn't a copy, the pointer is
- the same as that passed to bfd_make_section. */
- const char *name;
-
- /* A unique sequence number. */
- int id;
-
- /* Which section in the bfd; 0..n-1 as sections are created in a bfd. */
- int index;
-
- /* The next section in the list belonging to the BFD, or NULL. */
- struct bfd_section *next;
-
- /* The previous section in the list belonging to the BFD, or NULL. */
- struct bfd_section *prev;
-
- /* The field flags contains attributes of the section. Some
- flags are read in from the object file, and some are
- synthesized from other information. */
- flagword flags;
-
- #define SEC_NO_FLAGS 0x000
-
- /* Tells the OS to allocate space for this section when loading.
- This is clear for a section containing debug information only. */
- #define SEC_ALLOC 0x001
-
- /* Tells the OS to load the section from the file when loading.
- This is clear for a .bss section. */
- #define SEC_LOAD 0x002
-
- /* The section contains data still to be relocated, so there is
- some relocation information too. */
- #define SEC_RELOC 0x004
-
- /* A signal to the OS that the section contains read only data. */
- #define SEC_READONLY 0x008
-
- /* The section contains code only. */
- #define SEC_CODE 0x010
-
- /* The section contains data only. */
- #define SEC_DATA 0x020
-
- /* The section will reside in ROM. */
- #define SEC_ROM 0x040
-
- /* The section contains constructor information. This section
- type is used by the linker to create lists of constructors and
- destructors used by `g++'. When a back end sees a symbol
- which should be used in a constructor list, it creates a new
- section for the type of name (e.g., `__CTOR_LIST__'), attaches
- the symbol to it, and builds a relocation. To build the lists
- of constructors, all the linker has to do is catenate all the
- sections called `__CTOR_LIST__' and relocate the data
- contained within - exactly the operations it would peform on
- standard data. */
- #define SEC_CONSTRUCTOR 0x080
-
- /* The section has contents - a data section could be
- `SEC_ALLOC' | `SEC_HAS_CONTENTS'; a debug section could be
- `SEC_HAS_CONTENTS' */
- #define SEC_HAS_CONTENTS 0x100
-
- /* An instruction to the linker to not output the section
- even if it has information which would normally be written. */
- #define SEC_NEVER_LOAD 0x200
-
- /* The section contains thread local data. */
- #define SEC_THREAD_LOCAL 0x400
-
- /* The section has GOT references. This flag is only for the
- linker, and is currently only used by the elf32-hppa back end.
- It will be set if global offset table references were detected
- in this section, which indicate to the linker that the section
- contains PIC code, and must be handled specially when doing a
- static link. */
- #define SEC_HAS_GOT_REF 0x800
-
- /* The section contains common symbols (symbols may be defined
- multiple times, the value of a symbol is the amount of
- space it requires, and the largest symbol value is the one
- used). Most targets have exactly one of these (which we
- translate to bfd_com_section_ptr), but ECOFF has two. */
- #define SEC_IS_COMMON 0x1000
-
- /* The section contains only debugging information. For
- example, this is set for ELF .debug and .stab sections.
- strip tests this flag to see if a section can be
- discarded. */
- #define SEC_DEBUGGING 0x2000
-
- /* The contents of this section are held in memory pointed to
- by the contents field. This is checked by bfd_get_section_contents,
- and the data is retrieved from memory if appropriate. */
- #define SEC_IN_MEMORY 0x4000
-
- /* The contents of this section are to be excluded by the
- linker for executable and shared objects unless those
- objects are to be further relocated. */
- #define SEC_EXCLUDE 0x8000
-
- /* The contents of this section are to be sorted based on the sum of
- the symbol and addend values specified by the associated relocation
- entries. Entries without associated relocation entries will be
- appended to the end of the section in an unspecified order. */
- #define SEC_SORT_ENTRIES 0x10000
-
- /* When linking, duplicate sections of the same name should be
- discarded, rather than being combined into a single section as
- is usually done. This is similar to how common symbols are
- handled. See SEC_LINK_DUPLICATES below. */
- #define SEC_LINK_ONCE 0x20000
-
- /* If SEC_LINK_ONCE is set, this bitfield describes how the linker
- should handle duplicate sections. */
- #define SEC_LINK_DUPLICATES 0xc0000
-
- /* This value for SEC_LINK_DUPLICATES means that duplicate
- sections with the same name should simply be discarded. */
- #define SEC_LINK_DUPLICATES_DISCARD 0x0
-
- /* This value for SEC_LINK_DUPLICATES means that the linker
- should warn if there are any duplicate sections, although
- it should still only link one copy. */
- #define SEC_LINK_DUPLICATES_ONE_ONLY 0x40000
-
- /* This value for SEC_LINK_DUPLICATES means that the linker
- should warn if any duplicate sections are a different size. */
- #define SEC_LINK_DUPLICATES_SAME_SIZE 0x80000
-
- /* This value for SEC_LINK_DUPLICATES means that the linker
- should warn if any duplicate sections contain different
- contents. */
- #define SEC_LINK_DUPLICATES_SAME_CONTENTS \
- (SEC_LINK_DUPLICATES_ONE_ONLY | SEC_LINK_DUPLICATES_SAME_SIZE)
-
- /* This section was created by the linker as part of dynamic
- relocation or other arcane processing. It is skipped when
- going through the first-pass output, trusting that someone
- else up the line will take care of it later. */
- #define SEC_LINKER_CREATED 0x100000
-
- /* This section should not be subject to garbage collection.
- Also set to inform the linker that this section should not be
- listed in the link map as discarded. */
- #define SEC_KEEP 0x200000
-
- /* This section contains "short" data, and should be placed
- "near" the GP. */
- #define SEC_SMALL_DATA 0x400000
-
- /* Attempt to merge identical entities in the section.
- Entity size is given in the entsize field. */
- #define SEC_MERGE 0x800000
-
- /* If given with SEC_MERGE, entities to merge are zero terminated
- strings where entsize specifies character size instead of fixed
- size entries. */
- #define SEC_STRINGS 0x1000000
-
- /* This section contains data about section groups. */
- #define SEC_GROUP 0x2000000
-
- /* The section is a COFF shared library section. This flag is
- only for the linker. If this type of section appears in
- the input file, the linker must copy it to the output file
- without changing the vma or size. FIXME: Although this
- was originally intended to be general, it really is COFF
- specific (and the flag was renamed to indicate this). It
- might be cleaner to have some more general mechanism to
- allow the back end to control what the linker does with
- sections. */
- #define SEC_COFF_SHARED_LIBRARY 0x4000000
-
- /* This input section should be copied to output in reverse order
- as an array of pointers. This is for ELF linker internal use
- only. */
- #define SEC_ELF_REVERSE_COPY 0x4000000
-
- /* This section contains data which may be shared with other
- executables or shared objects. This is for COFF only. */
- #define SEC_COFF_SHARED 0x8000000
-
- /* When a section with this flag is being linked, then if the size of
- the input section is less than a page, it should not cross a page
- boundary. If the size of the input section is one page or more,
- it should be aligned on a page boundary. This is for TI
- TMS320C54X only. */
- #define SEC_TIC54X_BLOCK 0x10000000
-
- /* Conditionally link this section; do not link if there are no
- references found to any symbol in the section. This is for TI
- TMS320C54X only. */
- #define SEC_TIC54X_CLINK 0x20000000
-
- /* Indicate that section has the no read flag set. This happens
- when memory read flag isn't set. */
- #define SEC_COFF_NOREAD 0x40000000
-
- /* End of section flags. */
-
- /* Some internal packed boolean fields. */
-
- /* See the vma field. */
- unsigned int user_set_vma : 1;
-
- /* A mark flag used by some of the linker backends. */
- unsigned int linker_mark : 1;
-
- /* Another mark flag used by some of the linker backends. Set for
- output sections that have an input section. */
- unsigned int linker_has_input : 1;
-
- /* Mark flag used by some linker backends for garbage collection. */
- unsigned int gc_mark : 1;
-
- /* Section compression status. */
- unsigned int compress_status : 2;
- #define COMPRESS_SECTION_NONE 0
- #define COMPRESS_SECTION_DONE 1
- #define DECOMPRESS_SECTION_SIZED 2
-
- /* The following flags are used by the ELF linker. */
-
- /* Mark sections which have been allocated to segments. */
- unsigned int segment_mark : 1;
-
- /* Type of sec_info information. */
- unsigned int sec_info_type:3;
- #define SEC_INFO_TYPE_NONE 0
- #define SEC_INFO_TYPE_STABS 1
- #define SEC_INFO_TYPE_MERGE 2
- #define SEC_INFO_TYPE_EH_FRAME 3
- #define SEC_INFO_TYPE_JUST_SYMS 4
-
- /* Nonzero if this section uses RELA relocations, rather than REL. */
- unsigned int use_rela_p:1;
-
- /* Bits used by various backends. The generic code doesn't touch
- these fields. */
-
- unsigned int sec_flg0:1;
- unsigned int sec_flg1:1;
- unsigned int sec_flg2:1;
- unsigned int sec_flg3:1;
- unsigned int sec_flg4:1;
- unsigned int sec_flg5:1;
-
- /* End of internal packed boolean fields. */
-
- /* The virtual memory address of the section - where it will be
- at run time. The symbols are relocated against this. The
- user_set_vma flag is maintained by bfd; if it's not set, the
- backend can assign addresses (for example, in `a.out', where
- the default address for `.data' is dependent on the specific
- target and various flags). */
- bfd_vma vma;
-
- /* The load address of the section - where it would be in a
- rom image; really only used for writing section header
- information. */
- bfd_vma lma;
-
- /* The size of the section in octets, as it will be output.
- Contains a value even if the section has no contents (e.g., the
- size of `.bss'). */
- bfd_size_type size;
-
- /* For input sections, the original size on disk of the section, in
- octets. This field should be set for any section whose size is
- changed by linker relaxation. It is required for sections where
- the linker relaxation scheme doesn't cache altered section and
- reloc contents (stabs, eh_frame, SEC_MERGE, some coff relaxing
- targets), and thus the original size needs to be kept to read the
- section multiple times. For output sections, rawsize holds the
- section size calculated on a previous linker relaxation pass. */
- bfd_size_type rawsize;
-
- /* The compressed size of the section in octets. */
- bfd_size_type compressed_size;
-
- /* Relaxation table. */
- struct relax_table *relax;
-
- /* Count of used relaxation table entries. */
- int relax_count;
-
-
- /* If this section is going to be output, then this value is the
- offset in *bytes* into the output section of the first byte in the
- input section (byte ==> smallest addressable unit on the
- target). In most cases, if this was going to start at the
- 100th octet (8-bit quantity) in the output section, this value
- would be 100. However, if the target byte size is 16 bits
- (bfd_octets_per_byte is "2"), this value would be 50. */
- bfd_vma output_offset;
-
- /* The output section through which to map on output. */
- struct bfd_section *output_section;
-
- /* The alignment requirement of the section, as an exponent of 2 -
- e.g., 3 aligns to 2^3 (or 8). */
- unsigned int alignment_power;
-
- /* If an input section, a pointer to a vector of relocation
- records for the data in this section. */
- struct reloc_cache_entry *relocation;
-
- /* If an output section, a pointer to a vector of pointers to
- relocation records for the data in this section. */
- struct reloc_cache_entry **orelocation;
-
- /* The number of relocation records in one of the above. */
- unsigned reloc_count;
-
- /* Information below is back end specific - and not always used
- or updated. */
-
- /* File position of section data. */
- file_ptr filepos;
-
- /* File position of relocation info. */
- file_ptr rel_filepos;
-
- /* File position of line data. */
- file_ptr line_filepos;
-
- /* Pointer to data for applications. */
- void *userdata;
-
- /* If the SEC_IN_MEMORY flag is set, this points to the actual
- contents. */
- unsigned char *contents;
-
- /* Attached line number information. */
- alent *lineno;
-
- /* Number of line number records. */
- unsigned int lineno_count;
-
- /* Entity size for merging purposes. */
- unsigned int entsize;
-
- /* Points to the kept section if this section is a link-once section,
- and is discarded. */
- struct bfd_section *kept_section;
-
- /* When a section is being output, this value changes as more
- linenumbers are written out. */
- file_ptr moving_line_filepos;
-
- /* What the section number is in the target world. */
- int target_index;
-
- void *used_by_bfd;
-
- /* If this is a constructor section then here is a list of the
- relocations created to relocate items within it. */
- struct relent_chain *constructor_chain;
-
- /* The BFD which owns the section. */
- bfd *owner;
-
- /* A symbol which points at this section only. */
- struct bfd_symbol *symbol;
- struct bfd_symbol **symbol_ptr_ptr;
-
- /* Early in the link process, map_head and map_tail are used to build
- a list of input sections attached to an output section. Later,
- output sections use these fields for a list of bfd_link_order
- structs. */
- union {
- struct bfd_link_order *link_order;
- struct bfd_section *s;
- } map_head, map_tail;
- } asection;
-
- /* Relax table contains information about instructions which can
- be removed by relaxation -- replacing a long address with a
- short address. */
- struct relax_table {
- /* Address where bytes may be deleted. */
- bfd_vma addr;
-
- /* Number of bytes to be deleted. */
- int size;
- };
-
- /* These sections are global, and are managed by BFD. The application
- and target back end are not permitted to change the values in
- these sections. */
- extern asection _bfd_std_section[4];
-
- #define BFD_ABS_SECTION_NAME "*ABS*"
- #define BFD_UND_SECTION_NAME "*UND*"
- #define BFD_COM_SECTION_NAME "*COM*"
- #define BFD_IND_SECTION_NAME "*IND*"
-
- /* Pointer to the common section. */
- #define bfd_com_section_ptr (&_bfd_std_section[0])
- /* Pointer to the undefined section. */
- #define bfd_und_section_ptr (&_bfd_std_section[1])
- /* Pointer to the absolute section. */
- #define bfd_abs_section_ptr (&_bfd_std_section[2])
- /* Pointer to the indirect section. */
- #define bfd_ind_section_ptr (&_bfd_std_section[3])
-
- #define bfd_is_und_section(sec) ((sec) == bfd_und_section_ptr)
- #define bfd_is_abs_section(sec) ((sec) == bfd_abs_section_ptr)
- #define bfd_is_ind_section(sec) ((sec) == bfd_ind_section_ptr)
-
- #define bfd_is_const_section(SEC) \
- ( ((SEC) == bfd_abs_section_ptr) \
- || ((SEC) == bfd_und_section_ptr) \
- || ((SEC) == bfd_com_section_ptr) \
- || ((SEC) == bfd_ind_section_ptr))
-
- /* Macros to handle insertion and deletion of a bfd's sections. These
- only handle the list pointers, ie. do not adjust section_count,
- target_index etc. */
- #define bfd_section_list_remove(ABFD, S) \
- do \
- { \
- asection *_s = S; \
- asection *_next = _s->next; \
- asection *_prev = _s->prev; \
- if (_prev) \
- _prev->next = _next; \
- else \
- (ABFD)->sections = _next; \
- if (_next) \
- _next->prev = _prev; \
- else \
- (ABFD)->section_last = _prev; \
- } \
- while (0)
- #define bfd_section_list_append(ABFD, S) \
- do \
- { \
- asection *_s = S; \
- bfd *_abfd = ABFD; \
- _s->next = NULL; \
- if (_abfd->section_last) \
- { \
- _s->prev = _abfd->section_last; \
- _abfd->section_last->next = _s; \
- } \
- else \
- { \
- _s->prev = NULL; \
- _abfd->sections = _s; \
- } \
- _abfd->section_last = _s; \
- } \
- while (0)
- #define bfd_section_list_prepend(ABFD, S) \
- do \
- { \
- asection *_s = S; \
- bfd *_abfd = ABFD; \
- _s->prev = NULL; \
- if (_abfd->sections) \
- { \
- _s->next = _abfd->sections; \
- _abfd->sections->prev = _s; \
- } \
- else \
- { \
- _s->next = NULL; \
- _abfd->section_last = _s; \
- } \
- _abfd->sections = _s; \
- } \
- while (0)
- #define bfd_section_list_insert_after(ABFD, A, S) \
- do \
- { \
- asection *_a = A; \
- asection *_s = S; \
- asection *_next = _a->next; \
- _s->next = _next; \
- _s->prev = _a; \
- _a->next = _s; \
- if (_next) \
- _next->prev = _s; \
- else \
- (ABFD)->section_last = _s; \
- } \
- while (0)
- #define bfd_section_list_insert_before(ABFD, B, S) \
- do \
- { \
- asection *_b = B; \
- asection *_s = S; \
- asection *_prev = _b->prev; \
- _s->prev = _prev; \
- _s->next = _b; \
- _b->prev = _s; \
- if (_prev) \
- _prev->next = _s; \
- else \
- (ABFD)->sections = _s; \
- } \
- while (0)
- #define bfd_section_removed_from_list(ABFD, S) \
- ((S)->next == NULL ? (ABFD)->section_last != (S) : (S)->next->prev != (S))
-
- #define BFD_FAKE_SECTION(SEC, FLAGS, SYM, NAME, IDX) \
- /* name, id, index, next, prev, flags, user_set_vma, */ \
- { NAME, IDX, 0, NULL, NULL, FLAGS, 0, \
- \
- /* linker_mark, linker_has_input, gc_mark, decompress_status, */ \
- 0, 0, 1, 0, \
- \
- /* segment_mark, sec_info_type, use_rela_p, */ \
- 0, 0, 0, \
- \
- /* sec_flg0, sec_flg1, sec_flg2, sec_flg3, sec_flg4, sec_flg5, */ \
- 0, 0, 0, 0, 0, 0, \
- \
- /* vma, lma, size, rawsize, compressed_size, relax, relax_count, */ \
- 0, 0, 0, 0, 0, 0, 0, \
- \
- /* output_offset, output_section, alignment_power, */ \
- 0, &SEC, 0, \
- \
- /* relocation, orelocation, reloc_count, filepos, rel_filepos, */ \
- NULL, NULL, 0, 0, 0, \
- \
- /* line_filepos, userdata, contents, lineno, lineno_count, */ \
- 0, NULL, NULL, NULL, 0, \
- \
- /* entsize, kept_section, moving_line_filepos, */ \
- 0, NULL, 0, \
- \
- /* target_index, used_by_bfd, constructor_chain, owner, */ \
- 0, NULL, NULL, NULL, \
- \
- /* symbol, symbol_ptr_ptr, */ \
- (struct bfd_symbol *) SYM, &SEC.symbol, \
- \
- /* map_head, map_tail */ \
- { NULL }, { NULL } \
- }
-
-
-File: bfd.info, Node: section prototypes, Prev: typedef asection, Up: Sections
-
-2.6.5 Section prototypes
-------------------------
-
-These are the functions exported by the section handling part of BFD.
-
-2.6.5.1 `bfd_section_list_clear'
-................................
-
-*Synopsis*
- void bfd_section_list_clear (bfd *);
- *Description*
-Clears the section list, and also resets the section count and hash
-table entries.
-
-2.6.5.2 `bfd_get_section_by_name'
-.................................
-
-*Synopsis*
- asection *bfd_get_section_by_name (bfd *abfd, const char *name);
- *Description*
-Return the most recently created section attached to ABFD named NAME.
-Return NULL if no such section exists.
-
-2.6.5.3 `bfd_get_next_section_by_name'
-......................................
-
-*Synopsis*
- asection *bfd_get_next_section_by_name (asection *sec);
- *Description*
-Given SEC is a section returned by `bfd_get_section_by_name', return
-the next most recently created section attached to the same BFD with
-the same name. Return NULL if no such section exists.
-
-2.6.5.4 `bfd_get_linker_section'
-................................
-
-*Synopsis*
- asection *bfd_get_linker_section (bfd *abfd, const char *name);
- *Description*
-Return the linker created section attached to ABFD named NAME. Return
-NULL if no such section exists.
-
-2.6.5.5 `bfd_get_section_by_name_if'
-....................................
-
-*Synopsis*
- asection *bfd_get_section_by_name_if
- (bfd *abfd,
- const char *name,
- bfd_boolean (*func) (bfd *abfd, asection *sect, void *obj),
- void *obj);
- *Description*
-Call the provided function FUNC for each section attached to the BFD
-ABFD whose name matches NAME, passing OBJ as an argument. The function
-will be called as if by
-
- func (abfd, the_section, obj);
-
- It returns the first section for which FUNC returns true, otherwise
-`NULL'.
-
-2.6.5.6 `bfd_get_unique_section_name'
-.....................................
-
-*Synopsis*
- char *bfd_get_unique_section_name
- (bfd *abfd, const char *templat, int *count);
- *Description*
-Invent a section name that is unique in ABFD by tacking a dot and a
-digit suffix onto the original TEMPLAT. If COUNT is non-NULL, then it
-specifies the first number tried as a suffix to generate a unique name.
-The value pointed to by COUNT will be incremented in this case.
-
-2.6.5.7 `bfd_make_section_old_way'
-..................................
-
-*Synopsis*
- asection *bfd_make_section_old_way (bfd *abfd, const char *name);
- *Description*
-Create a new empty section called NAME and attach it to the end of the
-chain of sections for the BFD ABFD. An attempt to create a section with
-a name which is already in use returns its pointer without changing the
-section chain.
-
- It has the funny name since this is the way it used to be before it
-was rewritten....
-
- Possible errors are:
- * `bfd_error_invalid_operation' - If output has already started for
- this BFD.
-
- * `bfd_error_no_memory' - If memory allocation fails.
-
-2.6.5.8 `bfd_make_section_anyway_with_flags'
-............................................
-
-*Synopsis*
- asection *bfd_make_section_anyway_with_flags
- (bfd *abfd, const char *name, flagword flags);
- *Description*
-Create a new empty section called NAME and attach it to the end of the
-chain of sections for ABFD. Create a new section even if there is
-already a section with that name. Also set the attributes of the new
-section to the value FLAGS.
-
- Return `NULL' and set `bfd_error' on error; possible errors are:
- * `bfd_error_invalid_operation' - If output has already started for
- ABFD.
-
- * `bfd_error_no_memory' - If memory allocation fails.
-
-2.6.5.9 `bfd_make_section_anyway'
-.................................
-
-*Synopsis*
- asection *bfd_make_section_anyway (bfd *abfd, const char *name);
- *Description*
-Create a new empty section called NAME and attach it to the end of the
-chain of sections for ABFD. Create a new section even if there is
-already a section with that name.
-
- Return `NULL' and set `bfd_error' on error; possible errors are:
- * `bfd_error_invalid_operation' - If output has already started for
- ABFD.
-
- * `bfd_error_no_memory' - If memory allocation fails.
-
-2.6.5.10 `bfd_make_section_with_flags'
-......................................
-
-*Synopsis*
- asection *bfd_make_section_with_flags
- (bfd *, const char *name, flagword flags);
- *Description*
-Like `bfd_make_section_anyway', but return `NULL' (without calling
-bfd_set_error ()) without changing the section chain if there is
-already a section named NAME. Also set the attributes of the new
-section to the value FLAGS. If there is an error, return `NULL' and set
-`bfd_error'.
-
-2.6.5.11 `bfd_make_section'
-...........................
-
-*Synopsis*
- asection *bfd_make_section (bfd *, const char *name);
- *Description*
-Like `bfd_make_section_anyway', but return `NULL' (without calling
-bfd_set_error ()) without changing the section chain if there is
-already a section named NAME. If there is an error, return `NULL' and
-set `bfd_error'.
-
-2.6.5.12 `bfd_set_section_flags'
-................................
-
-*Synopsis*
- bfd_boolean bfd_set_section_flags
- (bfd *abfd, asection *sec, flagword flags);
- *Description*
-Set the attributes of the section SEC in the BFD ABFD to the value
-FLAGS. Return `TRUE' on success, `FALSE' on error. Possible error
-returns are:
-
- * `bfd_error_invalid_operation' - The section cannot have one or
- more of the attributes requested. For example, a .bss section in
- `a.out' may not have the `SEC_HAS_CONTENTS' field set.
-
-2.6.5.13 `bfd_rename_section'
-.............................
-
-*Synopsis*
- void bfd_rename_section
- (bfd *abfd, asection *sec, const char *newname);
- *Description*
-Rename section SEC in ABFD to NEWNAME.
-
-2.6.5.14 `bfd_map_over_sections'
-................................
-
-*Synopsis*
- void bfd_map_over_sections
- (bfd *abfd,
- void (*func) (bfd *abfd, asection *sect, void *obj),
- void *obj);
- *Description*
-Call the provided function FUNC for each section attached to the BFD
-ABFD, passing OBJ as an argument. The function will be called as if by
-
- func (abfd, the_section, obj);
-
- This is the preferred method for iterating over sections; an
-alternative would be to use a loop:
-
- asection *p;
- for (p = abfd->sections; p != NULL; p = p->next)
- func (abfd, p, ...)
-
-2.6.5.15 `bfd_sections_find_if'
-...............................
-
-*Synopsis*
- asection *bfd_sections_find_if
- (bfd *abfd,
- bfd_boolean (*operation) (bfd *abfd, asection *sect, void *obj),
- void *obj);
- *Description*
-Call the provided function OPERATION for each section attached to the
-BFD ABFD, passing OBJ as an argument. The function will be called as if
-by
-
- operation (abfd, the_section, obj);
-
- It returns the first section for which OPERATION returns true.
-
-2.6.5.16 `bfd_set_section_size'
-...............................
-
-*Synopsis*
- bfd_boolean bfd_set_section_size
- (bfd *abfd, asection *sec, bfd_size_type val);
- *Description*
-Set SEC to the size VAL. If the operation is ok, then `TRUE' is
-returned, else `FALSE'.
-
- Possible error returns:
- * `bfd_error_invalid_operation' - Writing has started to the BFD, so
- setting the size is invalid.
-
-2.6.5.17 `bfd_set_section_contents'
-...................................
-
-*Synopsis*
- bfd_boolean bfd_set_section_contents
- (bfd *abfd, asection *section, const void *data,
- file_ptr offset, bfd_size_type count);
- *Description*
-Sets the contents of the section SECTION in BFD ABFD to the data
-starting in memory at DATA. The data is written to the output section
-starting at offset OFFSET for COUNT octets.
-
- Normally `TRUE' is returned, else `FALSE'. Possible error returns
-are:
- * `bfd_error_no_contents' - The output section does not have the
- `SEC_HAS_CONTENTS' attribute, so nothing can be written to it.
-
- * and some more too
- This routine is front end to the back end function
-`_bfd_set_section_contents'.
-
-2.6.5.18 `bfd_get_section_contents'
-...................................
-
-*Synopsis*
- bfd_boolean bfd_get_section_contents
- (bfd *abfd, asection *section, void *location, file_ptr offset,
- bfd_size_type count);
- *Description*
-Read data from SECTION in BFD ABFD into memory starting at LOCATION.
-The data is read at an offset of OFFSET from the start of the input
-section, and is read for COUNT bytes.
-
- If the contents of a constructor with the `SEC_CONSTRUCTOR' flag set
-are requested or if the section does not have the `SEC_HAS_CONTENTS'
-flag set, then the LOCATION is filled with zeroes. If no errors occur,
-`TRUE' is returned, else `FALSE'.
-
-2.6.5.19 `bfd_malloc_and_get_section'
-.....................................
-
-*Synopsis*
- bfd_boolean bfd_malloc_and_get_section
- (bfd *abfd, asection *section, bfd_byte **buf);
- *Description*
-Read all data from SECTION in BFD ABFD into a buffer, *BUF, malloc'd by
-this function.
-
-2.6.5.20 `bfd_copy_private_section_data'
-........................................
-
-*Synopsis*
- bfd_boolean bfd_copy_private_section_data
- (bfd *ibfd, asection *isec, bfd *obfd, asection *osec);
- *Description*
-Copy private section information from ISEC in the BFD IBFD to the
-section OSEC in the BFD OBFD. Return `TRUE' on success, `FALSE' on
-error. Possible error returns are:
-
- * `bfd_error_no_memory' - Not enough memory exists to create private
- data for OSEC.
-
- #define bfd_copy_private_section_data(ibfd, isection, obfd, osection) \
- BFD_SEND (obfd, _bfd_copy_private_section_data, \
- (ibfd, isection, obfd, osection))
-
-2.6.5.21 `bfd_generic_is_group_section'
-.......................................
-
-*Synopsis*
- bfd_boolean bfd_generic_is_group_section (bfd *, const asection *sec);
- *Description*
-Returns TRUE if SEC is a member of a group.
-
-2.6.5.22 `bfd_generic_discard_group'
-....................................
-
-*Synopsis*
- bfd_boolean bfd_generic_discard_group (bfd *abfd, asection *group);
- *Description*
-Remove all members of GROUP from the output.
-
-
-File: bfd.info, Node: Symbols, Next: Archives, Prev: Sections, Up: BFD front end
-
-2.7 Symbols
-===========
-
-BFD tries to maintain as much symbol information as it can when it
-moves information from file to file. BFD passes information to
-applications though the `asymbol' structure. When the application
-requests the symbol table, BFD reads the table in the native form and
-translates parts of it into the internal format. To maintain more than
-the information passed to applications, some targets keep some
-information "behind the scenes" in a structure only the particular back
-end knows about. For example, the coff back end keeps the original
-symbol table structure as well as the canonical structure when a BFD is
-read in. On output, the coff back end can reconstruct the output symbol
-table so that no information is lost, even information unique to coff
-which BFD doesn't know or understand. If a coff symbol table were read,
-but were written through an a.out back end, all the coff specific
-information would be lost. The symbol table of a BFD is not necessarily
-read in until a canonicalize request is made. Then the BFD back end
-fills in a table provided by the application with pointers to the
-canonical information. To output symbols, the application provides BFD
-with a table of pointers to pointers to `asymbol's. This allows
-applications like the linker to output a symbol as it was read, since
-the "behind the scenes" information will be still available.
-
-* Menu:
-
-* Reading Symbols::
-* Writing Symbols::
-* Mini Symbols::
-* typedef asymbol::
-* symbol handling functions::
-
-
-File: bfd.info, Node: Reading Symbols, Next: Writing Symbols, Prev: Symbols, Up: Symbols
-
-2.7.1 Reading symbols
----------------------
-
-There are two stages to reading a symbol table from a BFD: allocating
-storage, and the actual reading process. This is an excerpt from an
-application which reads the symbol table:
-
- long storage_needed;
- asymbol **symbol_table;
- long number_of_symbols;
- long i;
-
- storage_needed = bfd_get_symtab_upper_bound (abfd);
-
- if (storage_needed < 0)
- FAIL
-
- if (storage_needed == 0)
- return;
-
- symbol_table = xmalloc (storage_needed);
- ...
- number_of_symbols =
- bfd_canonicalize_symtab (abfd, symbol_table);
-
- if (number_of_symbols < 0)
- FAIL
-
- for (i = 0; i < number_of_symbols; i++)
- process_symbol (symbol_table[i]);
-
- All storage for the symbols themselves is in an objalloc connected
-to the BFD; it is freed when the BFD is closed.
-
-
-File: bfd.info, Node: Writing Symbols, Next: Mini Symbols, Prev: Reading Symbols, Up: Symbols
-
-2.7.2 Writing symbols
----------------------
-
-Writing of a symbol table is automatic when a BFD open for writing is
-closed. The application attaches a vector of pointers to pointers to
-symbols to the BFD being written, and fills in the symbol count. The
-close and cleanup code reads through the table provided and performs
-all the necessary operations. The BFD output code must always be
-provided with an "owned" symbol: one which has come from another BFD,
-or one which has been created using `bfd_make_empty_symbol'. Here is an
-example showing the creation of a symbol table with only one element:
-
- #include "sysdep.h"
- #include "bfd.h"
- int main (void)
- {
- bfd *abfd;
- asymbol *ptrs[2];
- asymbol *new;
-
- abfd = bfd_openw ("foo","a.out-sunos-big");
- bfd_set_format (abfd, bfd_object);
- new = bfd_make_empty_symbol (abfd);
- new->name = "dummy_symbol";
- new->section = bfd_make_section_old_way (abfd, ".text");
- new->flags = BSF_GLOBAL;
- new->value = 0x12345;
-
- ptrs[0] = new;
- ptrs[1] = 0;
-
- bfd_set_symtab (abfd, ptrs, 1);
- bfd_close (abfd);
- return 0;
- }
-
- ./makesym
- nm foo
- 00012345 A dummy_symbol
-
- Many formats cannot represent arbitrary symbol information; for
-instance, the `a.out' object format does not allow an arbitrary number
-of sections. A symbol pointing to a section which is not one of
-`.text', `.data' or `.bss' cannot be described.
-
-
-File: bfd.info, Node: Mini Symbols, Next: typedef asymbol, Prev: Writing Symbols, Up: Symbols
-
-2.7.3 Mini Symbols
-------------------
-
-Mini symbols provide read-only access to the symbol table. They use
-less memory space, but require more time to access. They can be useful
-for tools like nm or objdump, which may have to handle symbol tables of
-extremely large executables.
-
- The `bfd_read_minisymbols' function will read the symbols into
-memory in an internal form. It will return a `void *' pointer to a
-block of memory, a symbol count, and the size of each symbol. The
-pointer is allocated using `malloc', and should be freed by the caller
-when it is no longer needed.
-
- The function `bfd_minisymbol_to_symbol' will take a pointer to a
-minisymbol, and a pointer to a structure returned by
-`bfd_make_empty_symbol', and return a `asymbol' structure. The return
-value may or may not be the same as the value from
-`bfd_make_empty_symbol' which was passed in.
-
-
-File: bfd.info, Node: typedef asymbol, Next: symbol handling functions, Prev: Mini Symbols, Up: Symbols
-
-2.7.4 typedef asymbol
----------------------
-
-An `asymbol' has the form:
-
-
- typedef struct bfd_symbol
- {
- /* A pointer to the BFD which owns the symbol. This information
- is necessary so that a back end can work out what additional
- information (invisible to the application writer) is carried
- with the symbol.
-
- This field is *almost* redundant, since you can use section->owner
- instead, except that some symbols point to the global sections
- bfd_{abs,com,und}_section. This could be fixed by making
- these globals be per-bfd (or per-target-flavor). FIXME. */
- struct bfd *the_bfd; /* Use bfd_asymbol_bfd(sym) to access this field. */
-
- /* The text of the symbol. The name is left alone, and not copied; the
- application may not alter it. */
- const char *name;
-
- /* The value of the symbol. This really should be a union of a
- numeric value with a pointer, since some flags indicate that
- a pointer to another symbol is stored here. */
- symvalue value;
-
- /* Attributes of a symbol. */
- #define BSF_NO_FLAGS 0x00
-
- /* The symbol has local scope; `static' in `C'. The value
- is the offset into the section of the data. */
- #define BSF_LOCAL (1 << 0)
-
- /* The symbol has global scope; initialized data in `C'. The
- value is the offset into the section of the data. */
- #define BSF_GLOBAL (1 << 1)
-
- /* The symbol has global scope and is exported. The value is
- the offset into the section of the data. */
- #define BSF_EXPORT BSF_GLOBAL /* No real difference. */
-
- /* A normal C symbol would be one of:
- `BSF_LOCAL', `BSF_COMMON', `BSF_UNDEFINED' or
- `BSF_GLOBAL'. */
-
- /* The symbol is a debugging record. The value has an arbitrary
- meaning, unless BSF_DEBUGGING_RELOC is also set. */
- #define BSF_DEBUGGING (1 << 2)
-
- /* The symbol denotes a function entry point. Used in ELF,
- perhaps others someday. */
- #define BSF_FUNCTION (1 << 3)
-
- /* Used by the linker. */
- #define BSF_KEEP (1 << 5)
- #define BSF_KEEP_G (1 << 6)
-
- /* A weak global symbol, overridable without warnings by
- a regular global symbol of the same name. */
- #define BSF_WEAK (1 << 7)
-
- /* This symbol was created to point to a section, e.g. ELF's
- STT_SECTION symbols. */
- #define BSF_SECTION_SYM (1 << 8)
-
- /* The symbol used to be a common symbol, but now it is
- allocated. */
- #define BSF_OLD_COMMON (1 << 9)
-
- /* In some files the type of a symbol sometimes alters its
- location in an output file - ie in coff a `ISFCN' symbol
- which is also `C_EXT' symbol appears where it was
- declared and not at the end of a section. This bit is set
- by the target BFD part to convey this information. */
- #define BSF_NOT_AT_END (1 << 10)
-
- /* Signal that the symbol is the label of constructor section. */
- #define BSF_CONSTRUCTOR (1 << 11)
-
- /* Signal that the symbol is a warning symbol. The name is a
- warning. The name of the next symbol is the one to warn about;
- if a reference is made to a symbol with the same name as the next
- symbol, a warning is issued by the linker. */
- #define BSF_WARNING (1 << 12)
-
- /* Signal that the symbol is indirect. This symbol is an indirect
- pointer to the symbol with the same name as the next symbol. */
- #define BSF_INDIRECT (1 << 13)
-
- /* BSF_FILE marks symbols that contain a file name. This is used
- for ELF STT_FILE symbols. */
- #define BSF_FILE (1 << 14)
-
- /* Symbol is from dynamic linking information. */
- #define BSF_DYNAMIC (1 << 15)
-
- /* The symbol denotes a data object. Used in ELF, and perhaps
- others someday. */
- #define BSF_OBJECT (1 << 16)
-
- /* This symbol is a debugging symbol. The value is the offset
- into the section of the data. BSF_DEBUGGING should be set
- as well. */
- #define BSF_DEBUGGING_RELOC (1 << 17)
-
- /* This symbol is thread local. Used in ELF. */
- #define BSF_THREAD_LOCAL (1 << 18)
-
- /* This symbol represents a complex relocation expression,
- with the expression tree serialized in the symbol name. */
- #define BSF_RELC (1 << 19)
-
- /* This symbol represents a signed complex relocation expression,
- with the expression tree serialized in the symbol name. */
- #define BSF_SRELC (1 << 20)
-
- /* This symbol was created by bfd_get_synthetic_symtab. */
- #define BSF_SYNTHETIC (1 << 21)
-
- /* This symbol is an indirect code object. Unrelated to BSF_INDIRECT.
- The dynamic linker will compute the value of this symbol by
- calling the function that it points to. BSF_FUNCTION must
- also be also set. */
- #define BSF_GNU_INDIRECT_FUNCTION (1 << 22)
- /* This symbol is a globally unique data object. The dynamic linker
- will make sure that in the entire process there is just one symbol
- with this name and type in use. BSF_OBJECT must also be set. */
- #define BSF_GNU_UNIQUE (1 << 23)
-
- flagword flags;
-
- /* A pointer to the section to which this symbol is
- relative. This will always be non NULL, there are special
- sections for undefined and absolute symbols. */
- struct bfd_section *section;
-
- /* Back end special data. */
- union
- {
- void *p;
- bfd_vma i;
- }
- udata;
- }
- asymbol;
-
-
-File: bfd.info, Node: symbol handling functions, Prev: typedef asymbol, Up: Symbols
-
-2.7.5 Symbol handling functions
--------------------------------
-
-2.7.5.1 `bfd_get_symtab_upper_bound'
-....................................
-
-*Description*
-Return the number of bytes required to store a vector of pointers to
-`asymbols' for all the symbols in the BFD ABFD, including a terminal
-NULL pointer. If there are no symbols in the BFD, then return 0. If an
-error occurs, return -1.
- #define bfd_get_symtab_upper_bound(abfd) \
- BFD_SEND (abfd, _bfd_get_symtab_upper_bound, (abfd))
-
-2.7.5.2 `bfd_is_local_label'
-............................
-
-*Synopsis*
- bfd_boolean bfd_is_local_label (bfd *abfd, asymbol *sym);
- *Description*
-Return TRUE if the given symbol SYM in the BFD ABFD is a compiler
-generated local label, else return FALSE.
-
-2.7.5.3 `bfd_is_local_label_name'
-.................................
-
-*Synopsis*
- bfd_boolean bfd_is_local_label_name (bfd *abfd, const char *name);
- *Description*
-Return TRUE if a symbol with the name NAME in the BFD ABFD is a
-compiler generated local label, else return FALSE. This just checks
-whether the name has the form of a local label.
- #define bfd_is_local_label_name(abfd, name) \
- BFD_SEND (abfd, _bfd_is_local_label_name, (abfd, name))
-
-2.7.5.4 `bfd_is_target_special_symbol'
-......................................
-
-*Synopsis*
- bfd_boolean bfd_is_target_special_symbol (bfd *abfd, asymbol *sym);
- *Description*
-Return TRUE iff a symbol SYM in the BFD ABFD is something special to
-the particular target represented by the BFD. Such symbols should
-normally not be mentioned to the user.
- #define bfd_is_target_special_symbol(abfd, sym) \
- BFD_SEND (abfd, _bfd_is_target_special_symbol, (abfd, sym))
-
-2.7.5.5 `bfd_canonicalize_symtab'
-.................................
-
-*Description*
-Read the symbols from the BFD ABFD, and fills in the vector LOCATION
-with pointers to the symbols and a trailing NULL. Return the actual
-number of symbol pointers, not including the NULL.
- #define bfd_canonicalize_symtab(abfd, location) \
- BFD_SEND (abfd, _bfd_canonicalize_symtab, (abfd, location))
-
-2.7.5.6 `bfd_set_symtab'
-........................
-
-*Synopsis*
- bfd_boolean bfd_set_symtab
- (bfd *abfd, asymbol **location, unsigned int count);
- *Description*
-Arrange that when the output BFD ABFD is closed, the table LOCATION of
-COUNT pointers to symbols will be written.
-
-2.7.5.7 `bfd_print_symbol_vandf'
-................................
-
-*Synopsis*
- void bfd_print_symbol_vandf (bfd *abfd, void *file, asymbol *symbol);
- *Description*
-Print the value and flags of the SYMBOL supplied to the stream FILE.
-
-2.7.5.8 `bfd_make_empty_symbol'
-...............................
-
-*Description*
-Create a new `asymbol' structure for the BFD ABFD and return a pointer
-to it.
-
- This routine is necessary because each back end has private
-information surrounding the `asymbol'. Building your own `asymbol' and
-pointing to it will not create the private information, and will cause
-problems later on.
- #define bfd_make_empty_symbol(abfd) \
- BFD_SEND (abfd, _bfd_make_empty_symbol, (abfd))
-
-2.7.5.9 `_bfd_generic_make_empty_symbol'
-........................................
-
-*Synopsis*
- asymbol *_bfd_generic_make_empty_symbol (bfd *);
- *Description*
-Create a new `asymbol' structure for the BFD ABFD and return a pointer
-to it. Used by core file routines, binary back-end and anywhere else
-where no private info is needed.
-
-2.7.5.10 `bfd_make_debug_symbol'
-................................
-
-*Description*
-Create a new `asymbol' structure for the BFD ABFD, to be used as a
-debugging symbol. Further details of its use have yet to be worked out.
- #define bfd_make_debug_symbol(abfd,ptr,size) \
- BFD_SEND (abfd, _bfd_make_debug_symbol, (abfd, ptr, size))
-
-2.7.5.11 `bfd_decode_symclass'
-..............................
-
-*Description*
-Return a character corresponding to the symbol class of SYMBOL, or '?'
-for an unknown class.
-
- *Synopsis*
- int bfd_decode_symclass (asymbol *symbol);
-
-2.7.5.12 `bfd_is_undefined_symclass'
-....................................
-
-*Description*
-Returns non-zero if the class symbol returned by bfd_decode_symclass
-represents an undefined symbol. Returns zero otherwise.
-
- *Synopsis*
- bfd_boolean bfd_is_undefined_symclass (int symclass);
-
-2.7.5.13 `bfd_symbol_info'
-..........................
-
-*Description*
-Fill in the basic info about symbol that nm needs. Additional info may
-be added by the back-ends after calling this function.
-
- *Synopsis*
- void bfd_symbol_info (asymbol *symbol, symbol_info *ret);
-
-2.7.5.14 `bfd_copy_private_symbol_data'
-.......................................
-
-*Synopsis*
- bfd_boolean bfd_copy_private_symbol_data
- (bfd *ibfd, asymbol *isym, bfd *obfd, asymbol *osym);
- *Description*
-Copy private symbol information from ISYM in the BFD IBFD to the symbol
-OSYM in the BFD OBFD. Return `TRUE' on success, `FALSE' on error.
-Possible error returns are:
-
- * `bfd_error_no_memory' - Not enough memory exists to create private
- data for OSEC.
-
- #define bfd_copy_private_symbol_data(ibfd, isymbol, obfd, osymbol) \
- BFD_SEND (obfd, _bfd_copy_private_symbol_data, \
- (ibfd, isymbol, obfd, osymbol))
-
-
-File: bfd.info, Node: Archives, Next: Formats, Prev: Symbols, Up: BFD front end
-
-2.8 Archives
-============
-
-*Description*
-An archive (or library) is just another BFD. It has a symbol table,
-although there's not much a user program will do with it.
-
- The big difference between an archive BFD and an ordinary BFD is
-that the archive doesn't have sections. Instead it has a chain of BFDs
-that are considered its contents. These BFDs can be manipulated like
-any other. The BFDs contained in an archive opened for reading will
-all be opened for reading. You may put either input or output BFDs
-into an archive opened for output; they will be handled correctly when
-the archive is closed.
-
- Use `bfd_openr_next_archived_file' to step through the contents of
-an archive opened for input. You don't have to read the entire archive
-if you don't want to! Read it until you find what you want.
-
- A BFD returned by `bfd_openr_next_archived_file' can be closed
-manually with `bfd_close'. If you do not close it, then a second
-iteration through the members of an archive may return the same BFD.
-If you close the archive BFD, then all the member BFDs will
-automatically be closed as well.
-
- Archive contents of output BFDs are chained through the
-`archive_next' pointer in a BFD. The first one is findable through the
-`archive_head' slot of the archive. Set it with `bfd_set_archive_head'
-(q.v.). A given BFD may be in only one open output archive at a time.
-
- As expected, the BFD archive code is more general than the archive
-code of any given environment. BFD archives may contain files of
-different formats (e.g., a.out and coff) and even different
-architectures. You may even place archives recursively into archives!
-
- This can cause unexpected confusion, since some archive formats are
-more expressive than others. For instance, Intel COFF archives can
-preserve long filenames; SunOS a.out archives cannot. If you move a
-file from the first to the second format and back again, the filename
-may be truncated. Likewise, different a.out environments have different
-conventions as to how they truncate filenames, whether they preserve
-directory names in filenames, etc. When interoperating with native
-tools, be sure your files are homogeneous.
-
- Beware: most of these formats do not react well to the presence of
-spaces in filenames. We do the best we can, but can't always handle
-this case due to restrictions in the format of archives. Many Unix
-utilities are braindead in regards to spaces and such in filenames
-anyway, so this shouldn't be much of a restriction.
-
- Archives are supported in BFD in `archive.c'.
-
-2.8.1 Archive functions
------------------------
-
-2.8.1.1 `bfd_get_next_mapent'
-.............................
-
-*Synopsis*
- symindex bfd_get_next_mapent
- (bfd *abfd, symindex previous, carsym **sym);
- *Description*
-Step through archive ABFD's symbol table (if it has one). Successively
-update SYM with the next symbol's information, returning that symbol's
-(internal) index into the symbol table.
-
- Supply `BFD_NO_MORE_SYMBOLS' as the PREVIOUS entry to get the first
-one; returns `BFD_NO_MORE_SYMBOLS' when you've already got the last one.
-
- A `carsym' is a canonical archive symbol. The only user-visible
-element is its name, a null-terminated string.
-
-2.8.1.2 `bfd_set_archive_head'
-..............................
-
-*Synopsis*
- bfd_boolean bfd_set_archive_head (bfd *output, bfd *new_head);
- *Description*
-Set the head of the chain of BFDs contained in the archive OUTPUT to
-NEW_HEAD.
-
-2.8.1.3 `bfd_openr_next_archived_file'
-......................................
-
-*Synopsis*
- bfd *bfd_openr_next_archived_file (bfd *archive, bfd *previous);
- *Description*
-Provided a BFD, ARCHIVE, containing an archive and NULL, open an input
-BFD on the first contained element and returns that. Subsequent calls
-should pass the archive and the previous return value to return a
-created BFD to the next contained element. NULL is returned when there
-are no more.
-
-
-File: bfd.info, Node: Formats, Next: Relocations, Prev: Archives, Up: BFD front end
-
-2.9 File formats
-================
-
-A format is a BFD concept of high level file contents type. The formats
-supported by BFD are:
-
- * `bfd_object'
- The BFD may contain data, symbols, relocations and debug info.
-
- * `bfd_archive'
- The BFD contains other BFDs and an optional index.
-
- * `bfd_core'
- The BFD contains the result of an executable core dump.
-
-2.9.1 File format functions
----------------------------
-
-2.9.1.1 `bfd_check_format'
-..........................
-
-*Synopsis*
- bfd_boolean bfd_check_format (bfd *abfd, bfd_format format);
- *Description*
-Verify if the file attached to the BFD ABFD is compatible with the
-format FORMAT (i.e., one of `bfd_object', `bfd_archive' or `bfd_core').
-
- If the BFD has been set to a specific target before the call, only
-the named target and format combination is checked. If the target has
-not been set, or has been set to `default', then all the known target
-backends is interrogated to determine a match. If the default target
-matches, it is used. If not, exactly one target must recognize the
-file, or an error results.
-
- The function returns `TRUE' on success, otherwise `FALSE' with one
-of the following error codes:
-
- * `bfd_error_invalid_operation' - if `format' is not one of
- `bfd_object', `bfd_archive' or `bfd_core'.
-
- * `bfd_error_system_call' - if an error occured during a read - even
- some file mismatches can cause bfd_error_system_calls.
-
- * `file_not_recognised' - none of the backends recognised the file
- format.
-
- * `bfd_error_file_ambiguously_recognized' - more than one backend
- recognised the file format.
-
-2.9.1.2 `bfd_check_format_matches'
-..................................
-
-*Synopsis*
- bfd_boolean bfd_check_format_matches
- (bfd *abfd, bfd_format format, char ***matching);
- *Description*
-Like `bfd_check_format', except when it returns FALSE with `bfd_errno'
-set to `bfd_error_file_ambiguously_recognized'. In that case, if
-MATCHING is not NULL, it will be filled in with a NULL-terminated list
-of the names of the formats that matched, allocated with `malloc'.
-Then the user may choose a format and try again.
-
- When done with the list that MATCHING points to, the caller should
-free it.
-
-2.9.1.3 `bfd_set_format'
-........................
-
-*Synopsis*
- bfd_boolean bfd_set_format (bfd *abfd, bfd_format format);
- *Description*
-This function sets the file format of the BFD ABFD to the format
-FORMAT. If the target set in the BFD does not support the format
-requested, the format is invalid, or the BFD is not open for writing,
-then an error occurs.
-
-2.9.1.4 `bfd_format_string'
-...........................
-
-*Synopsis*
- const char *bfd_format_string (bfd_format format);
- *Description*
-Return a pointer to a const string `invalid', `object', `archive',
-`core', or `unknown', depending upon the value of FORMAT.
-
-
-File: bfd.info, Node: Relocations, Next: Core Files, Prev: Formats, Up: BFD front end
-
-2.10 Relocations
-================
-
-BFD maintains relocations in much the same way it maintains symbols:
-they are left alone until required, then read in en-masse and
-translated into an internal form. A common routine
-`bfd_perform_relocation' acts upon the canonical form to do the fixup.
-
- Relocations are maintained on a per section basis, while symbols are
-maintained on a per BFD basis.
-
- All that a back end has to do to fit the BFD interface is to create
-a `struct reloc_cache_entry' for each relocation in a particular
-section, and fill in the right bits of the structures.
-
-* Menu:
-
-* typedef arelent::
-* howto manager::
-
-
-File: bfd.info, Node: typedef arelent, Next: howto manager, Prev: Relocations, Up: Relocations
-
-2.10.1 typedef arelent
-----------------------
-
-This is the structure of a relocation entry:
-
-
- typedef enum bfd_reloc_status
- {
- /* No errors detected. */
- bfd_reloc_ok,
-
- /* The relocation was performed, but there was an overflow. */
- bfd_reloc_overflow,
-
- /* The address to relocate was not within the section supplied. */
- bfd_reloc_outofrange,
-
- /* Used by special functions. */
- bfd_reloc_continue,
-
- /* Unsupported relocation size requested. */
- bfd_reloc_notsupported,
-
- /* Unused. */
- bfd_reloc_other,
-
- /* The symbol to relocate against was undefined. */
- bfd_reloc_undefined,
-
- /* The relocation was performed, but may not be ok - presently
- generated only when linking i960 coff files with i960 b.out
- symbols. If this type is returned, the error_message argument
- to bfd_perform_relocation will be set. */
- bfd_reloc_dangerous
- }
- bfd_reloc_status_type;
-
-
- typedef struct reloc_cache_entry
- {
- /* A pointer into the canonical table of pointers. */
- struct bfd_symbol **sym_ptr_ptr;
-
- /* offset in section. */
- bfd_size_type address;
-
- /* addend for relocation value. */
- bfd_vma addend;
-
- /* Pointer to how to perform the required relocation. */
- reloc_howto_type *howto;
-
- }
- arelent;
- *Description*
-Here is a description of each of the fields within an `arelent':
-
- * `sym_ptr_ptr'
- The symbol table pointer points to a pointer to the symbol
-associated with the relocation request. It is the pointer into the
-table returned by the back end's `canonicalize_symtab' action. *Note
-Symbols::. The symbol is referenced through a pointer to a pointer so
-that tools like the linker can fix up all the symbols of the same name
-by modifying only one pointer. The relocation routine looks in the
-symbol and uses the base of the section the symbol is attached to and
-the value of the symbol as the initial relocation offset. If the symbol
-pointer is zero, then the section provided is looked up.
-
- * `address'
- The `address' field gives the offset in bytes from the base of the
-section data which owns the relocation record to the first byte of
-relocatable information. The actual data relocated will be relative to
-this point; for example, a relocation type which modifies the bottom
-two bytes of a four byte word would not touch the first byte pointed to
-in a big endian world.
-
- * `addend'
- The `addend' is a value provided by the back end to be added (!) to
-the relocation offset. Its interpretation is dependent upon the howto.
-For example, on the 68k the code:
-
- char foo[];
- main()
- {
- return foo[0x12345678];
- }
-
- Could be compiled into:
-
- linkw fp,#-4
- moveb @#12345678,d0
- extbl d0
- unlk fp
- rts
-
- This could create a reloc pointing to `foo', but leave the offset in
-the data, something like:
-
- RELOCATION RECORDS FOR [.text]:
- offset type value
- 00000006 32 _foo
-
- 00000000 4e56 fffc ; linkw fp,#-4
- 00000004 1039 1234 5678 ; moveb @#12345678,d0
- 0000000a 49c0 ; extbl d0
- 0000000c 4e5e ; unlk fp
- 0000000e 4e75 ; rts
-
- Using coff and an 88k, some instructions don't have enough space in
-them to represent the full address range, and pointers have to be
-loaded in two parts. So you'd get something like:
-
- or.u r13,r0,hi16(_foo+0x12345678)
- ld.b r2,r13,lo16(_foo+0x12345678)
- jmp r1
-
- This should create two relocs, both pointing to `_foo', and with
-0x12340000 in their addend field. The data would consist of:
-
- RELOCATION RECORDS FOR [.text]:
- offset type value
- 00000002 HVRT16 _foo+0x12340000
- 00000006 LVRT16 _foo+0x12340000
-
- 00000000 5da05678 ; or.u r13,r0,0x5678
- 00000004 1c4d5678 ; ld.b r2,r13,0x5678
- 00000008 f400c001 ; jmp r1
-
- The relocation routine digs out the value from the data, adds it to
-the addend to get the original offset, and then adds the value of
-`_foo'. Note that all 32 bits have to be kept around somewhere, to cope
-with carry from bit 15 to bit 16.
-
- One further example is the sparc and the a.out format. The sparc has
-a similar problem to the 88k, in that some instructions don't have room
-for an entire offset, but on the sparc the parts are created in odd
-sized lumps. The designers of the a.out format chose to not use the
-data within the section for storing part of the offset; all the offset
-is kept within the reloc. Anything in the data should be ignored.
-
- save %sp,-112,%sp
- sethi %hi(_foo+0x12345678),%g2
- ldsb [%g2+%lo(_foo+0x12345678)],%i0
- ret
- restore
-
- Both relocs contain a pointer to `foo', and the offsets contain junk.
-
- RELOCATION RECORDS FOR [.text]:
- offset type value
- 00000004 HI22 _foo+0x12345678
- 00000008 LO10 _foo+0x12345678
-
- 00000000 9de3bf90 ; save %sp,-112,%sp
- 00000004 05000000 ; sethi %hi(_foo+0),%g2
- 00000008 f048a000 ; ldsb [%g2+%lo(_foo+0)],%i0
- 0000000c 81c7e008 ; ret
- 00000010 81e80000 ; restore
-
- * `howto'
- The `howto' field can be imagined as a relocation instruction. It is
-a pointer to a structure which contains information on what to do with
-all of the other information in the reloc record and data section. A
-back end would normally have a relocation instruction set and turn
-relocations into pointers to the correct structure on input - but it
-would be possible to create each howto field on demand.
-
-2.10.1.1 `enum complain_overflow'
-.................................
-
-Indicates what sort of overflow checking should be done when performing
-a relocation.
-
-
- enum complain_overflow
- {
- /* Do not complain on overflow. */
- complain_overflow_dont,
-
- /* Complain if the value overflows when considered as a signed
- number one bit larger than the field. ie. A bitfield of N bits
- is allowed to represent -2**n to 2**n-1. */
- complain_overflow_bitfield,
-
- /* Complain if the value overflows when considered as a signed
- number. */
- complain_overflow_signed,
-
- /* Complain if the value overflows when considered as an
- unsigned number. */
- complain_overflow_unsigned
- };
-
-2.10.1.2 `reloc_howto_type'
-...........................
-
-The `reloc_howto_type' is a structure which contains all the
-information that libbfd needs to know to tie up a back end's data.
-
- struct bfd_symbol; /* Forward declaration. */
-
- struct reloc_howto_struct
- {
- /* The type field has mainly a documentary use - the back end can
- do what it wants with it, though normally the back end's
- external idea of what a reloc number is stored
- in this field. For example, a PC relative word relocation
- in a coff environment has the type 023 - because that's
- what the outside world calls a R_PCRWORD reloc. */
- unsigned int type;
-
- /* The value the final relocation is shifted right by. This drops
- unwanted data from the relocation. */
- unsigned int rightshift;
-
- /* The size of the item to be relocated. This is *not* a
- power-of-two measure. To get the number of bytes operated
- on by a type of relocation, use bfd_get_reloc_size. */
- int size;
-
- /* The number of bits in the item to be relocated. This is used
- when doing overflow checking. */
- unsigned int bitsize;
-
- /* The relocation is relative to the field being relocated. */
- bfd_boolean pc_relative;
-
- /* The bit position of the reloc value in the destination.
- The relocated value is left shifted by this amount. */
- unsigned int bitpos;
-
- /* What type of overflow error should be checked for when
- relocating. */
- enum complain_overflow complain_on_overflow;
-
- /* If this field is non null, then the supplied function is
- called rather than the normal function. This allows really
- strange relocation methods to be accommodated (e.g., i960 callj
- instructions). */
- bfd_reloc_status_type (*special_function)
- (bfd *, arelent *, struct bfd_symbol *, void *, asection *,
- bfd *, char **);
-
- /* The textual name of the relocation type. */
- char *name;
-
- /* Some formats record a relocation addend in the section contents
- rather than with the relocation. For ELF formats this is the
- distinction between USE_REL and USE_RELA (though the code checks
- for USE_REL == 1/0). The value of this field is TRUE if the
- addend is recorded with the section contents; when performing a
- partial link (ld -r) the section contents (the data) will be
- modified. The value of this field is FALSE if addends are
- recorded with the relocation (in arelent.addend); when performing
- a partial link the relocation will be modified.
- All relocations for all ELF USE_RELA targets should set this field
- to FALSE (values of TRUE should be looked on with suspicion).
- However, the converse is not true: not all relocations of all ELF
- USE_REL targets set this field to TRUE. Why this is so is peculiar
- to each particular target. For relocs that aren't used in partial
- links (e.g. GOT stuff) it doesn't matter what this is set to. */
- bfd_boolean partial_inplace;
-
- /* src_mask selects the part of the instruction (or data) to be used
- in the relocation sum. If the target relocations don't have an
- addend in the reloc, eg. ELF USE_REL, src_mask will normally equal
- dst_mask to extract the addend from the section contents. If
- relocations do have an addend in the reloc, eg. ELF USE_RELA, this
- field should be zero. Non-zero values for ELF USE_RELA targets are
- bogus as in those cases the value in the dst_mask part of the
- section contents should be treated as garbage. */
- bfd_vma src_mask;
-
- /* dst_mask selects which parts of the instruction (or data) are
- replaced with a relocated value. */
- bfd_vma dst_mask;
-
- /* When some formats create PC relative instructions, they leave
- the value of the pc of the place being relocated in the offset
- slot of the instruction, so that a PC relative relocation can
- be made just by adding in an ordinary offset (e.g., sun3 a.out).
- Some formats leave the displacement part of an instruction
- empty (e.g., m88k bcs); this flag signals the fact. */
- bfd_boolean pcrel_offset;
- };
-
-2.10.1.3 `The HOWTO Macro'
-..........................
-
-*Description*
-The HOWTO define is horrible and will go away.
- #define HOWTO(C, R, S, B, P, BI, O, SF, NAME, INPLACE, MASKSRC, MASKDST, PC) \
- { (unsigned) C, R, S, B, P, BI, O, SF, NAME, INPLACE, MASKSRC, MASKDST, PC }
-
- *Description*
-And will be replaced with the totally magic way. But for the moment, we
-are compatible, so do it this way.
- #define NEWHOWTO(FUNCTION, NAME, SIZE, REL, IN) \
- HOWTO (0, 0, SIZE, 0, REL, 0, complain_overflow_dont, FUNCTION, \
- NAME, FALSE, 0, 0, IN)
-
- *Description*
-This is used to fill in an empty howto entry in an array.
- #define EMPTY_HOWTO(C) \
- HOWTO ((C), 0, 0, 0, FALSE, 0, complain_overflow_dont, NULL, \
- NULL, FALSE, 0, 0, FALSE)
-
- *Description*
-Helper routine to turn a symbol into a relocation value.
- #define HOWTO_PREPARE(relocation, symbol) \
- { \
- if (symbol != NULL) \
- { \
- if (bfd_is_com_section (symbol->section)) \
- { \
- relocation = 0; \
- } \
- else \
- { \
- relocation = symbol->value; \
- } \
- } \
- }
-
-2.10.1.4 `bfd_get_reloc_size'
-.............................
-
-*Synopsis*
- unsigned int bfd_get_reloc_size (reloc_howto_type *);
- *Description*
-For a reloc_howto_type that operates on a fixed number of bytes, this
-returns the number of bytes operated on.
-
-2.10.1.5 `arelent_chain'
-........................
-
-*Description*
-How relocs are tied together in an `asection':
- typedef struct relent_chain
- {
- arelent relent;
- struct relent_chain *next;
- }
- arelent_chain;
-
-2.10.1.6 `bfd_check_overflow'
-.............................
-
-*Synopsis*
- bfd_reloc_status_type bfd_check_overflow
- (enum complain_overflow how,
- unsigned int bitsize,
- unsigned int rightshift,
- unsigned int addrsize,
- bfd_vma relocation);
- *Description*
-Perform overflow checking on RELOCATION which has BITSIZE significant
-bits and will be shifted right by RIGHTSHIFT bits, on a machine with
-addresses containing ADDRSIZE significant bits. The result is either of
-`bfd_reloc_ok' or `bfd_reloc_overflow'.
-
-2.10.1.7 `bfd_perform_relocation'
-.................................
-
-*Synopsis*
- bfd_reloc_status_type bfd_perform_relocation
- (bfd *abfd,
- arelent *reloc_entry,
- void *data,
- asection *input_section,
- bfd *output_bfd,
- char **error_message);
- *Description*
-If OUTPUT_BFD is supplied to this function, the generated image will be
-relocatable; the relocations are copied to the output file after they
-have been changed to reflect the new state of the world. There are two
-ways of reflecting the results of partial linkage in an output file: by
-modifying the output data in place, and by modifying the relocation
-record. Some native formats (e.g., basic a.out and basic coff) have no
-way of specifying an addend in the relocation type, so the addend has
-to go in the output data. This is no big deal since in these formats
-the output data slot will always be big enough for the addend. Complex
-reloc types with addends were invented to solve just this problem. The
-ERROR_MESSAGE argument is set to an error message if this return
-`bfd_reloc_dangerous'.
-
-2.10.1.8 `bfd_install_relocation'
-.................................
-
-*Synopsis*
- bfd_reloc_status_type bfd_install_relocation
- (bfd *abfd,
- arelent *reloc_entry,
- void *data, bfd_vma data_start,
- asection *input_section,
- char **error_message);
- *Description*
-This looks remarkably like `bfd_perform_relocation', except it does not
-expect that the section contents have been filled in. I.e., it's
-suitable for use when creating, rather than applying a relocation.
-
- For now, this function should be considered reserved for the
-assembler.
-
-
-File: bfd.info, Node: howto manager, Prev: typedef arelent, Up: Relocations
-
-2.10.2 The howto manager
-------------------------
-
-When an application wants to create a relocation, but doesn't know what
-the target machine might call it, it can find out by using this bit of
-code.
-
-2.10.2.1 `bfd_reloc_code_type'
-..............................
-
-*Description*
-The insides of a reloc code. The idea is that, eventually, there will
-be one enumerator for every type of relocation we ever do. Pass one of
-these values to `bfd_reloc_type_lookup', and it'll return a howto
-pointer.
-
- This does mean that the application must determine the correct
-enumerator value; you can't get a howto pointer from a random set of
-attributes.
-
- Here are the possible values for `enum bfd_reloc_code_real':
-
- -- : BFD_RELOC_64
- -- : BFD_RELOC_32
- -- : BFD_RELOC_26
- -- : BFD_RELOC_24
- -- : BFD_RELOC_16
- -- : BFD_RELOC_14
- -- : BFD_RELOC_8
- Basic absolute relocations of N bits.
-
- -- : BFD_RELOC_64_PCREL
- -- : BFD_RELOC_32_PCREL
- -- : BFD_RELOC_24_PCREL
- -- : BFD_RELOC_16_PCREL
- -- : BFD_RELOC_12_PCREL
- -- : BFD_RELOC_8_PCREL
- PC-relative relocations. Sometimes these are relative to the
- address of the relocation itself; sometimes they are relative to
- the start of the section containing the relocation. It depends on
- the specific target.
-
- The 24-bit relocation is used in some Intel 960 configurations.
-
- -- : BFD_RELOC_32_SECREL
- Section relative relocations. Some targets need this for DWARF2.
-
- -- : BFD_RELOC_32_GOT_PCREL
- -- : BFD_RELOC_16_GOT_PCREL
- -- : BFD_RELOC_8_GOT_PCREL
- -- : BFD_RELOC_32_GOTOFF
- -- : BFD_RELOC_16_GOTOFF
- -- : BFD_RELOC_LO16_GOTOFF
- -- : BFD_RELOC_HI16_GOTOFF
- -- : BFD_RELOC_HI16_S_GOTOFF
- -- : BFD_RELOC_8_GOTOFF
- -- : BFD_RELOC_64_PLT_PCREL
- -- : BFD_RELOC_32_PLT_PCREL
- -- : BFD_RELOC_24_PLT_PCREL
- -- : BFD_RELOC_16_PLT_PCREL
- -- : BFD_RELOC_8_PLT_PCREL
- -- : BFD_RELOC_64_PLTOFF
- -- : BFD_RELOC_32_PLTOFF
- -- : BFD_RELOC_16_PLTOFF
- -- : BFD_RELOC_LO16_PLTOFF
- -- : BFD_RELOC_HI16_PLTOFF
- -- : BFD_RELOC_HI16_S_PLTOFF
- -- : BFD_RELOC_8_PLTOFF
- For ELF.
-
- -- : BFD_RELOC_SIZE32
- -- : BFD_RELOC_SIZE64
- Size relocations.
-
- -- : BFD_RELOC_68K_GLOB_DAT
- -- : BFD_RELOC_68K_JMP_SLOT
- -- : BFD_RELOC_68K_RELATIVE
- -- : BFD_RELOC_68K_TLS_GD32
- -- : BFD_RELOC_68K_TLS_GD16
- -- : BFD_RELOC_68K_TLS_GD8
- -- : BFD_RELOC_68K_TLS_LDM32
- -- : BFD_RELOC_68K_TLS_LDM16
- -- : BFD_RELOC_68K_TLS_LDM8
- -- : BFD_RELOC_68K_TLS_LDO32
- -- : BFD_RELOC_68K_TLS_LDO16
- -- : BFD_RELOC_68K_TLS_LDO8
- -- : BFD_RELOC_68K_TLS_IE32
- -- : BFD_RELOC_68K_TLS_IE16
- -- : BFD_RELOC_68K_TLS_IE8
- -- : BFD_RELOC_68K_TLS_LE32
- -- : BFD_RELOC_68K_TLS_LE16
- -- : BFD_RELOC_68K_TLS_LE8
- Relocations used by 68K ELF.
-
- -- : BFD_RELOC_32_BASEREL
- -- : BFD_RELOC_16_BASEREL
- -- : BFD_RELOC_LO16_BASEREL
- -- : BFD_RELOC_HI16_BASEREL
- -- : BFD_RELOC_HI16_S_BASEREL
- -- : BFD_RELOC_8_BASEREL
- -- : BFD_RELOC_RVA
- Linkage-table relative.
-
- -- : BFD_RELOC_8_FFnn
- Absolute 8-bit relocation, but used to form an address like 0xFFnn.
-
- -- : BFD_RELOC_32_PCREL_S2
- -- : BFD_RELOC_16_PCREL_S2
- -- : BFD_RELOC_23_PCREL_S2
- These PC-relative relocations are stored as word displacements -
- i.e., byte displacements shifted right two bits. The 30-bit word
- displacement (<<32_PCREL_S2>> - 32 bits, shifted 2) is used on the
- SPARC. (SPARC tools generally refer to this as <>.) The
- signed 16-bit displacement is used on the MIPS, and the 23-bit
- displacement is used on the Alpha.
-
- -- : BFD_RELOC_HI22
- -- : BFD_RELOC_LO10
- High 22 bits and low 10 bits of 32-bit value, placed into lower
- bits of the target word. These are used on the SPARC.
-
- -- : BFD_RELOC_GPREL16
- -- : BFD_RELOC_GPREL32
- For systems that allocate a Global Pointer register, these are
- displacements off that register. These relocation types are
- handled specially, because the value the register will have is
- decided relatively late.
-
- -- : BFD_RELOC_I960_CALLJ
- Reloc types used for i960/b.out.
-
- -- : BFD_RELOC_NONE
- -- : BFD_RELOC_SPARC_WDISP22
- -- : BFD_RELOC_SPARC22
- -- : BFD_RELOC_SPARC13
- -- : BFD_RELOC_SPARC_GOT10
- -- : BFD_RELOC_SPARC_GOT13
- -- : BFD_RELOC_SPARC_GOT22
- -- : BFD_RELOC_SPARC_PC10
- -- : BFD_RELOC_SPARC_PC22
- -- : BFD_RELOC_SPARC_WPLT30
- -- : BFD_RELOC_SPARC_COPY
- -- : BFD_RELOC_SPARC_GLOB_DAT
- -- : BFD_RELOC_SPARC_JMP_SLOT
- -- : BFD_RELOC_SPARC_RELATIVE
- -- : BFD_RELOC_SPARC_UA16
- -- : BFD_RELOC_SPARC_UA32
- -- : BFD_RELOC_SPARC_UA64
- -- : BFD_RELOC_SPARC_GOTDATA_HIX22
- -- : BFD_RELOC_SPARC_GOTDATA_LOX10
- -- : BFD_RELOC_SPARC_GOTDATA_OP_HIX22
- -- : BFD_RELOC_SPARC_GOTDATA_OP_LOX10
- -- : BFD_RELOC_SPARC_GOTDATA_OP
- -- : BFD_RELOC_SPARC_JMP_IREL
- -- : BFD_RELOC_SPARC_IRELATIVE
- SPARC ELF relocations. There is probably some overlap with other
- relocation types already defined.
-
- -- : BFD_RELOC_SPARC_BASE13
- -- : BFD_RELOC_SPARC_BASE22
- I think these are specific to SPARC a.out (e.g., Sun 4).
-
- -- : BFD_RELOC_SPARC_64
- -- : BFD_RELOC_SPARC_10
- -- : BFD_RELOC_SPARC_11
- -- : BFD_RELOC_SPARC_OLO10
- -- : BFD_RELOC_SPARC_HH22
- -- : BFD_RELOC_SPARC_HM10
- -- : BFD_RELOC_SPARC_LM22
- -- : BFD_RELOC_SPARC_PC_HH22
- -- : BFD_RELOC_SPARC_PC_HM10
- -- : BFD_RELOC_SPARC_PC_LM22
- -- : BFD_RELOC_SPARC_WDISP16
- -- : BFD_RELOC_SPARC_WDISP19
- -- : BFD_RELOC_SPARC_7
- -- : BFD_RELOC_SPARC_6
- -- : BFD_RELOC_SPARC_5
- -- : BFD_RELOC_SPARC_DISP64
- -- : BFD_RELOC_SPARC_PLT32
- -- : BFD_RELOC_SPARC_PLT64
- -- : BFD_RELOC_SPARC_HIX22
- -- : BFD_RELOC_SPARC_LOX10
- -- : BFD_RELOC_SPARC_H44
- -- : BFD_RELOC_SPARC_M44
- -- : BFD_RELOC_SPARC_L44
- -- : BFD_RELOC_SPARC_REGISTER
- -- : BFD_RELOC_SPARC_H34
- -- : BFD_RELOC_SPARC_SIZE32
- -- : BFD_RELOC_SPARC_SIZE64
- -- : BFD_RELOC_SPARC_WDISP10
- SPARC64 relocations
-
- -- : BFD_RELOC_SPARC_REV32
- SPARC little endian relocation
-
- -- : BFD_RELOC_SPARC_TLS_GD_HI22
- -- : BFD_RELOC_SPARC_TLS_GD_LO10
- -- : BFD_RELOC_SPARC_TLS_GD_ADD
- -- : BFD_RELOC_SPARC_TLS_GD_CALL
- -- : BFD_RELOC_SPARC_TLS_LDM_HI22
- -- : BFD_RELOC_SPARC_TLS_LDM_LO10
- -- : BFD_RELOC_SPARC_TLS_LDM_ADD
- -- : BFD_RELOC_SPARC_TLS_LDM_CALL
- -- : BFD_RELOC_SPARC_TLS_LDO_HIX22
- -- : BFD_RELOC_SPARC_TLS_LDO_LOX10
- -- : BFD_RELOC_SPARC_TLS_LDO_ADD
- -- : BFD_RELOC_SPARC_TLS_IE_HI22
- -- : BFD_RELOC_SPARC_TLS_IE_LO10
- -- : BFD_RELOC_SPARC_TLS_IE_LD
- -- : BFD_RELOC_SPARC_TLS_IE_LDX
- -- : BFD_RELOC_SPARC_TLS_IE_ADD
- -- : BFD_RELOC_SPARC_TLS_LE_HIX22
- -- : BFD_RELOC_SPARC_TLS_LE_LOX10
- -- : BFD_RELOC_SPARC_TLS_DTPMOD32
- -- : BFD_RELOC_SPARC_TLS_DTPMOD64
- -- : BFD_RELOC_SPARC_TLS_DTPOFF32
- -- : BFD_RELOC_SPARC_TLS_DTPOFF64
- -- : BFD_RELOC_SPARC_TLS_TPOFF32
- -- : BFD_RELOC_SPARC_TLS_TPOFF64
- SPARC TLS relocations
-
- -- : BFD_RELOC_SPU_IMM7
- -- : BFD_RELOC_SPU_IMM8
- -- : BFD_RELOC_SPU_IMM10
- -- : BFD_RELOC_SPU_IMM10W
- -- : BFD_RELOC_SPU_IMM16
- -- : BFD_RELOC_SPU_IMM16W
- -- : BFD_RELOC_SPU_IMM18
- -- : BFD_RELOC_SPU_PCREL9a
- -- : BFD_RELOC_SPU_PCREL9b
- -- : BFD_RELOC_SPU_PCREL16
- -- : BFD_RELOC_SPU_LO16
- -- : BFD_RELOC_SPU_HI16
- -- : BFD_RELOC_SPU_PPU32
- -- : BFD_RELOC_SPU_PPU64
- -- : BFD_RELOC_SPU_ADD_PIC
- SPU Relocations.
-
- -- : BFD_RELOC_ALPHA_GPDISP_HI16
- Alpha ECOFF and ELF relocations. Some of these treat the symbol or
- "addend" in some special way. For GPDISP_HI16 ("gpdisp")
- relocations, the symbol is ignored when writing; when reading, it
- will be the absolute section symbol. The addend is the
- displacement in bytes of the "lda" instruction from the "ldah"
- instruction (which is at the address of this reloc).
-
- -- : BFD_RELOC_ALPHA_GPDISP_LO16
- For GPDISP_LO16 ("ignore") relocations, the symbol is handled as
- with GPDISP_HI16 relocs. The addend is ignored when writing the
- relocations out, and is filled in with the file's GP value on
- reading, for convenience.
-
- -- : BFD_RELOC_ALPHA_GPDISP
- The ELF GPDISP relocation is exactly the same as the GPDISP_HI16
- relocation except that there is no accompanying GPDISP_LO16
- relocation.
-
- -- : BFD_RELOC_ALPHA_LITERAL
- -- : BFD_RELOC_ALPHA_ELF_LITERAL
- -- : BFD_RELOC_ALPHA_LITUSE
- The Alpha LITERAL/LITUSE relocs are produced by a symbol reference;
- the assembler turns it into a LDQ instruction to load the address
- of the symbol, and then fills in a register in the real
- instruction.
-
- The LITERAL reloc, at the LDQ instruction, refers to the .lita
- section symbol. The addend is ignored when writing, but is filled
- in with the file's GP value on reading, for convenience, as with
- the GPDISP_LO16 reloc.
-
- The ELF_LITERAL reloc is somewhere between 16_GOTOFF and
- GPDISP_LO16. It should refer to the symbol to be referenced, as
- with 16_GOTOFF, but it generates output not based on the position
- within the .got section, but relative to the GP value chosen for
- the file during the final link stage.
-
- The LITUSE reloc, on the instruction using the loaded address,
- gives information to the linker that it might be able to use to
- optimize away some literal section references. The symbol is
- ignored (read as the absolute section symbol), and the "addend"
- indicates the type of instruction using the register: 1 - "memory"
- fmt insn 2 - byte-manipulation (byte offset reg) 3 - jsr (target
- of branch)
-
- -- : BFD_RELOC_ALPHA_HINT
- The HINT relocation indicates a value that should be filled into
- the "hint" field of a jmp/jsr/ret instruction, for possible branch-
- prediction logic which may be provided on some processors.
-
- -- : BFD_RELOC_ALPHA_LINKAGE
- The LINKAGE relocation outputs a linkage pair in the object file,
- which is filled by the linker.
-
- -- : BFD_RELOC_ALPHA_CODEADDR
- The CODEADDR relocation outputs a STO_CA in the object file, which
- is filled by the linker.
-
- -- : BFD_RELOC_ALPHA_GPREL_HI16
- -- : BFD_RELOC_ALPHA_GPREL_LO16
- The GPREL_HI/LO relocations together form a 32-bit offset from the
- GP register.
-
- -- : BFD_RELOC_ALPHA_BRSGP
- Like BFD_RELOC_23_PCREL_S2, except that the source and target must
- share a common GP, and the target address is adjusted for
- STO_ALPHA_STD_GPLOAD.
-
- -- : BFD_RELOC_ALPHA_NOP
- The NOP relocation outputs a NOP if the longword displacement
- between two procedure entry points is < 2^21.
-
- -- : BFD_RELOC_ALPHA_BSR
- The BSR relocation outputs a BSR if the longword displacement
- between two procedure entry points is < 2^21.
-
- -- : BFD_RELOC_ALPHA_LDA
- The LDA relocation outputs a LDA if the longword displacement
- between two procedure entry points is < 2^16.
-
- -- : BFD_RELOC_ALPHA_BOH
- The BOH relocation outputs a BSR if the longword displacement
- between two procedure entry points is < 2^21, or else a hint.
-
- -- : BFD_RELOC_ALPHA_TLSGD
- -- : BFD_RELOC_ALPHA_TLSLDM
- -- : BFD_RELOC_ALPHA_DTPMOD64
- -- : BFD_RELOC_ALPHA_GOTDTPREL16
- -- : BFD_RELOC_ALPHA_DTPREL64
- -- : BFD_RELOC_ALPHA_DTPREL_HI16
- -- : BFD_RELOC_ALPHA_DTPREL_LO16
- -- : BFD_RELOC_ALPHA_DTPREL16
- -- : BFD_RELOC_ALPHA_GOTTPREL16
- -- : BFD_RELOC_ALPHA_TPREL64
- -- : BFD_RELOC_ALPHA_TPREL_HI16
- -- : BFD_RELOC_ALPHA_TPREL_LO16
- -- : BFD_RELOC_ALPHA_TPREL16
- Alpha thread-local storage relocations.
-
- -- : BFD_RELOC_MIPS_JMP
- -- : BFD_RELOC_MICROMIPS_JMP
- The MIPS jump instruction.
-
- -- : BFD_RELOC_MIPS16_JMP
- The MIPS16 jump instruction.
-
- -- : BFD_RELOC_MIPS16_GPREL
- MIPS16 GP relative reloc.
-
- -- : BFD_RELOC_HI16
- High 16 bits of 32-bit value; simple reloc.
-
- -- : BFD_RELOC_HI16_S
- High 16 bits of 32-bit value but the low 16 bits will be sign
- extended and added to form the final result. If the low 16 bits
- form a negative number, we need to add one to the high value to
- compensate for the borrow when the low bits are added.
-
- -- : BFD_RELOC_LO16
- Low 16 bits.
-
- -- : BFD_RELOC_HI16_PCREL
- High 16 bits of 32-bit pc-relative value
-
- -- : BFD_RELOC_HI16_S_PCREL
- High 16 bits of 32-bit pc-relative value, adjusted
-
- -- : BFD_RELOC_LO16_PCREL
- Low 16 bits of pc-relative value
-
- -- : BFD_RELOC_MIPS16_GOT16
- -- : BFD_RELOC_MIPS16_CALL16
- Equivalent of BFD_RELOC_MIPS_*, but with the MIPS16 layout of
- 16-bit immediate fields
-
- -- : BFD_RELOC_MIPS16_HI16
- MIPS16 high 16 bits of 32-bit value.
-
- -- : BFD_RELOC_MIPS16_HI16_S
- MIPS16 high 16 bits of 32-bit value but the low 16 bits will be
- sign extended and added to form the final result. If the low 16
- bits form a negative number, we need to add one to the high value
- to compensate for the borrow when the low bits are added.
-
- -- : BFD_RELOC_MIPS16_LO16
- MIPS16 low 16 bits.
-
- -- : BFD_RELOC_MIPS16_TLS_GD
- -- : BFD_RELOC_MIPS16_TLS_LDM
- -- : BFD_RELOC_MIPS16_TLS_DTPREL_HI16
- -- : BFD_RELOC_MIPS16_TLS_DTPREL_LO16
- -- : BFD_RELOC_MIPS16_TLS_GOTTPREL
- -- : BFD_RELOC_MIPS16_TLS_TPREL_HI16
- -- : BFD_RELOC_MIPS16_TLS_TPREL_LO16
- MIPS16 TLS relocations
-
- -- : BFD_RELOC_MIPS_LITERAL
- -- : BFD_RELOC_MICROMIPS_LITERAL
- Relocation against a MIPS literal section.
-
- -- : BFD_RELOC_MICROMIPS_7_PCREL_S1
- -- : BFD_RELOC_MICROMIPS_10_PCREL_S1
- -- : BFD_RELOC_MICROMIPS_16_PCREL_S1
- microMIPS PC-relative relocations.
-
- -- : BFD_RELOC_MICROMIPS_GPREL16
- -- : BFD_RELOC_MICROMIPS_HI16
- -- : BFD_RELOC_MICROMIPS_HI16_S
- -- : BFD_RELOC_MICROMIPS_LO16
- microMIPS versions of generic BFD relocs.
-
- -- : BFD_RELOC_MIPS_GOT16
- -- : BFD_RELOC_MICROMIPS_GOT16
- -- : BFD_RELOC_MIPS_CALL16
- -- : BFD_RELOC_MICROMIPS_CALL16
- -- : BFD_RELOC_MIPS_GOT_HI16
- -- : BFD_RELOC_MICROMIPS_GOT_HI16
- -- : BFD_RELOC_MIPS_GOT_LO16
- -- : BFD_RELOC_MICROMIPS_GOT_LO16
- -- : BFD_RELOC_MIPS_CALL_HI16
- -- : BFD_RELOC_MICROMIPS_CALL_HI16
- -- : BFD_RELOC_MIPS_CALL_LO16
- -- : BFD_RELOC_MICROMIPS_CALL_LO16
- -- : BFD_RELOC_MIPS_SUB
- -- : BFD_RELOC_MICROMIPS_SUB
- -- : BFD_RELOC_MIPS_GOT_PAGE
- -- : BFD_RELOC_MICROMIPS_GOT_PAGE
- -- : BFD_RELOC_MIPS_GOT_OFST
- -- : BFD_RELOC_MICROMIPS_GOT_OFST
- -- : BFD_RELOC_MIPS_GOT_DISP
- -- : BFD_RELOC_MICROMIPS_GOT_DISP
- -- : BFD_RELOC_MIPS_SHIFT5
- -- : BFD_RELOC_MIPS_SHIFT6
- -- : BFD_RELOC_MIPS_INSERT_A
- -- : BFD_RELOC_MIPS_INSERT_B
- -- : BFD_RELOC_MIPS_DELETE
- -- : BFD_RELOC_MIPS_HIGHEST
- -- : BFD_RELOC_MICROMIPS_HIGHEST
- -- : BFD_RELOC_MIPS_HIGHER
- -- : BFD_RELOC_MICROMIPS_HIGHER
- -- : BFD_RELOC_MIPS_SCN_DISP
- -- : BFD_RELOC_MICROMIPS_SCN_DISP
- -- : BFD_RELOC_MIPS_REL16
- -- : BFD_RELOC_MIPS_RELGOT
- -- : BFD_RELOC_MIPS_JALR
- -- : BFD_RELOC_MICROMIPS_JALR
- -- : BFD_RELOC_MIPS_TLS_DTPMOD32
- -- : BFD_RELOC_MIPS_TLS_DTPREL32
- -- : BFD_RELOC_MIPS_TLS_DTPMOD64
- -- : BFD_RELOC_MIPS_TLS_DTPREL64
- -- : BFD_RELOC_MIPS_TLS_GD
- -- : BFD_RELOC_MICROMIPS_TLS_GD
- -- : BFD_RELOC_MIPS_TLS_LDM
- -- : BFD_RELOC_MICROMIPS_TLS_LDM
- -- : BFD_RELOC_MIPS_TLS_DTPREL_HI16
- -- : BFD_RELOC_MICROMIPS_TLS_DTPREL_HI16
- -- : BFD_RELOC_MIPS_TLS_DTPREL_LO16
- -- : BFD_RELOC_MICROMIPS_TLS_DTPREL_LO16
- -- : BFD_RELOC_MIPS_TLS_GOTTPREL
- -- : BFD_RELOC_MICROMIPS_TLS_GOTTPREL
- -- : BFD_RELOC_MIPS_TLS_TPREL32
- -- : BFD_RELOC_MIPS_TLS_TPREL64
- -- : BFD_RELOC_MIPS_TLS_TPREL_HI16
- -- : BFD_RELOC_MICROMIPS_TLS_TPREL_HI16
- -- : BFD_RELOC_MIPS_TLS_TPREL_LO16
- -- : BFD_RELOC_MICROMIPS_TLS_TPREL_LO16
- -- : BFD_RELOC_MIPS_EH
- MIPS ELF relocations.
-
- -- : BFD_RELOC_MIPS_COPY
- -- : BFD_RELOC_MIPS_JUMP_SLOT
- MIPS ELF relocations (VxWorks and PLT extensions).
-
- -- : BFD_RELOC_MOXIE_10_PCREL
- Moxie ELF relocations.
-
- -- : BFD_RELOC_FRV_LABEL16
- -- : BFD_RELOC_FRV_LABEL24
- -- : BFD_RELOC_FRV_LO16
- -- : BFD_RELOC_FRV_HI16
- -- : BFD_RELOC_FRV_GPREL12
- -- : BFD_RELOC_FRV_GPRELU12
- -- : BFD_RELOC_FRV_GPREL32
- -- : BFD_RELOC_FRV_GPRELHI
- -- : BFD_RELOC_FRV_GPRELLO
- -- : BFD_RELOC_FRV_GOT12
- -- : BFD_RELOC_FRV_GOTHI
- -- : BFD_RELOC_FRV_GOTLO
- -- : BFD_RELOC_FRV_FUNCDESC
- -- : BFD_RELOC_FRV_FUNCDESC_GOT12
- -- : BFD_RELOC_FRV_FUNCDESC_GOTHI
- -- : BFD_RELOC_FRV_FUNCDESC_GOTLO
- -- : BFD_RELOC_FRV_FUNCDESC_VALUE
- -- : BFD_RELOC_FRV_FUNCDESC_GOTOFF12
- -- : BFD_RELOC_FRV_FUNCDESC_GOTOFFHI
- -- : BFD_RELOC_FRV_FUNCDESC_GOTOFFLO
- -- : BFD_RELOC_FRV_GOTOFF12
- -- : BFD_RELOC_FRV_GOTOFFHI
- -- : BFD_RELOC_FRV_GOTOFFLO
- -- : BFD_RELOC_FRV_GETTLSOFF
- -- : BFD_RELOC_FRV_TLSDESC_VALUE
- -- : BFD_RELOC_FRV_GOTTLSDESC12
- -- : BFD_RELOC_FRV_GOTTLSDESCHI
- -- : BFD_RELOC_FRV_GOTTLSDESCLO
- -- : BFD_RELOC_FRV_TLSMOFF12
- -- : BFD_RELOC_FRV_TLSMOFFHI
- -- : BFD_RELOC_FRV_TLSMOFFLO
- -- : BFD_RELOC_FRV_GOTTLSOFF12
- -- : BFD_RELOC_FRV_GOTTLSOFFHI
- -- : BFD_RELOC_FRV_GOTTLSOFFLO
- -- : BFD_RELOC_FRV_TLSOFF
- -- : BFD_RELOC_FRV_TLSDESC_RELAX
- -- : BFD_RELOC_FRV_GETTLSOFF_RELAX
- -- : BFD_RELOC_FRV_TLSOFF_RELAX
- -- : BFD_RELOC_FRV_TLSMOFF
- Fujitsu Frv Relocations.
-
- -- : BFD_RELOC_MN10300_GOTOFF24
- This is a 24bit GOT-relative reloc for the mn10300.
-
- -- : BFD_RELOC_MN10300_GOT32
- This is a 32bit GOT-relative reloc for the mn10300, offset by two
- bytes in the instruction.
-
- -- : BFD_RELOC_MN10300_GOT24
- This is a 24bit GOT-relative reloc for the mn10300, offset by two
- bytes in the instruction.
-
- -- : BFD_RELOC_MN10300_GOT16
- This is a 16bit GOT-relative reloc for the mn10300, offset by two
- bytes in the instruction.
-
- -- : BFD_RELOC_MN10300_COPY
- Copy symbol at runtime.
-
- -- : BFD_RELOC_MN10300_GLOB_DAT
- Create GOT entry.
-
- -- : BFD_RELOC_MN10300_JMP_SLOT
- Create PLT entry.
-
- -- : BFD_RELOC_MN10300_RELATIVE
- Adjust by program base.
-
- -- : BFD_RELOC_MN10300_SYM_DIFF
- Together with another reloc targeted at the same location, allows
- for a value that is the difference of two symbols in the same
- section.
-
- -- : BFD_RELOC_MN10300_ALIGN
- The addend of this reloc is an alignment power that must be
- honoured at the offset's location, regardless of linker relaxation.
-
- -- : BFD_RELOC_MN10300_TLS_GD
- -- : BFD_RELOC_MN10300_TLS_LD
- -- : BFD_RELOC_MN10300_TLS_LDO
- -- : BFD_RELOC_MN10300_TLS_GOTIE
- -- : BFD_RELOC_MN10300_TLS_IE
- -- : BFD_RELOC_MN10300_TLS_LE
- -- : BFD_RELOC_MN10300_TLS_DTPMOD
- -- : BFD_RELOC_MN10300_TLS_DTPOFF
- -- : BFD_RELOC_MN10300_TLS_TPOFF
- Various TLS-related relocations.
-
- -- : BFD_RELOC_MN10300_32_PCREL
- This is a 32bit pcrel reloc for the mn10300, offset by two bytes
- in the instruction.
-
- -- : BFD_RELOC_MN10300_16_PCREL
- This is a 16bit pcrel reloc for the mn10300, offset by two bytes
- in the instruction.
-
- -- : BFD_RELOC_386_GOT32
- -- : BFD_RELOC_386_PLT32
- -- : BFD_RELOC_386_COPY
- -- : BFD_RELOC_386_GLOB_DAT
- -- : BFD_RELOC_386_JUMP_SLOT
- -- : BFD_RELOC_386_RELATIVE
- -- : BFD_RELOC_386_GOTOFF
- -- : BFD_RELOC_386_GOTPC
- -- : BFD_RELOC_386_TLS_TPOFF
- -- : BFD_RELOC_386_TLS_IE
- -- : BFD_RELOC_386_TLS_GOTIE
- -- : BFD_RELOC_386_TLS_LE
- -- : BFD_RELOC_386_TLS_GD
- -- : BFD_RELOC_386_TLS_LDM
- -- : BFD_RELOC_386_TLS_LDO_32
- -- : BFD_RELOC_386_TLS_IE_32
- -- : BFD_RELOC_386_TLS_LE_32
- -- : BFD_RELOC_386_TLS_DTPMOD32
- -- : BFD_RELOC_386_TLS_DTPOFF32
- -- : BFD_RELOC_386_TLS_TPOFF32
- -- : BFD_RELOC_386_TLS_GOTDESC
- -- : BFD_RELOC_386_TLS_DESC_CALL
- -- : BFD_RELOC_386_TLS_DESC
- -- : BFD_RELOC_386_IRELATIVE
- i386/elf relocations
-
- -- : BFD_RELOC_X86_64_GOT32
- -- : BFD_RELOC_X86_64_PLT32
- -- : BFD_RELOC_X86_64_COPY
- -- : BFD_RELOC_X86_64_GLOB_DAT
- -- : BFD_RELOC_X86_64_JUMP_SLOT
- -- : BFD_RELOC_X86_64_RELATIVE
- -- : BFD_RELOC_X86_64_GOTPCREL
- -- : BFD_RELOC_X86_64_32S
- -- : BFD_RELOC_X86_64_DTPMOD64
- -- : BFD_RELOC_X86_64_DTPOFF64
- -- : BFD_RELOC_X86_64_TPOFF64
- -- : BFD_RELOC_X86_64_TLSGD
- -- : BFD_RELOC_X86_64_TLSLD
- -- : BFD_RELOC_X86_64_DTPOFF32
- -- : BFD_RELOC_X86_64_GOTTPOFF
- -- : BFD_RELOC_X86_64_TPOFF32
- -- : BFD_RELOC_X86_64_GOTOFF64
- -- : BFD_RELOC_X86_64_GOTPC32
- -- : BFD_RELOC_X86_64_GOT64
- -- : BFD_RELOC_X86_64_GOTPCREL64
- -- : BFD_RELOC_X86_64_GOTPC64
- -- : BFD_RELOC_X86_64_GOTPLT64
- -- : BFD_RELOC_X86_64_PLTOFF64
- -- : BFD_RELOC_X86_64_GOTPC32_TLSDESC
- -- : BFD_RELOC_X86_64_TLSDESC_CALL
- -- : BFD_RELOC_X86_64_TLSDESC
- -- : BFD_RELOC_X86_64_IRELATIVE
- -- : BFD_RELOC_X86_64_PC32_BND
- -- : BFD_RELOC_X86_64_PLT32_BND
- x86-64/elf relocations
-
- -- : BFD_RELOC_NS32K_IMM_8
- -- : BFD_RELOC_NS32K_IMM_16
- -- : BFD_RELOC_NS32K_IMM_32
- -- : BFD_RELOC_NS32K_IMM_8_PCREL
- -- : BFD_RELOC_NS32K_IMM_16_PCREL
- -- : BFD_RELOC_NS32K_IMM_32_PCREL
- -- : BFD_RELOC_NS32K_DISP_8
- -- : BFD_RELOC_NS32K_DISP_16
- -- : BFD_RELOC_NS32K_DISP_32
- -- : BFD_RELOC_NS32K_DISP_8_PCREL
- -- : BFD_RELOC_NS32K_DISP_16_PCREL
- -- : BFD_RELOC_NS32K_DISP_32_PCREL
- ns32k relocations
-
- -- : BFD_RELOC_PDP11_DISP_8_PCREL
- -- : BFD_RELOC_PDP11_DISP_6_PCREL
- PDP11 relocations
-
- -- : BFD_RELOC_PJ_CODE_HI16
- -- : BFD_RELOC_PJ_CODE_LO16
- -- : BFD_RELOC_PJ_CODE_DIR16
- -- : BFD_RELOC_PJ_CODE_DIR32
- -- : BFD_RELOC_PJ_CODE_REL16
- -- : BFD_RELOC_PJ_CODE_REL32
- Picojava relocs. Not all of these appear in object files.
-
- -- : BFD_RELOC_PPC_B26
- -- : BFD_RELOC_PPC_BA26
- -- : BFD_RELOC_PPC_TOC16
- -- : BFD_RELOC_PPC_B16
- -- : BFD_RELOC_PPC_B16_BRTAKEN
- -- : BFD_RELOC_PPC_B16_BRNTAKEN
- -- : BFD_RELOC_PPC_BA16
- -- : BFD_RELOC_PPC_BA16_BRTAKEN
- -- : BFD_RELOC_PPC_BA16_BRNTAKEN
- -- : BFD_RELOC_PPC_COPY
- -- : BFD_RELOC_PPC_GLOB_DAT
- -- : BFD_RELOC_PPC_JMP_SLOT
- -- : BFD_RELOC_PPC_RELATIVE
- -- : BFD_RELOC_PPC_LOCAL24PC
- -- : BFD_RELOC_PPC_EMB_NADDR32
- -- : BFD_RELOC_PPC_EMB_NADDR16
- -- : BFD_RELOC_PPC_EMB_NADDR16_LO
- -- : BFD_RELOC_PPC_EMB_NADDR16_HI
- -- : BFD_RELOC_PPC_EMB_NADDR16_HA
- -- : BFD_RELOC_PPC_EMB_SDAI16
- -- : BFD_RELOC_PPC_EMB_SDA2I16
- -- : BFD_RELOC_PPC_EMB_SDA2REL
- -- : BFD_RELOC_PPC_EMB_SDA21
- -- : BFD_RELOC_PPC_EMB_MRKREF
- -- : BFD_RELOC_PPC_EMB_RELSEC16
- -- : BFD_RELOC_PPC_EMB_RELST_LO
- -- : BFD_RELOC_PPC_EMB_RELST_HI
- -- : BFD_RELOC_PPC_EMB_RELST_HA
- -- : BFD_RELOC_PPC_EMB_BIT_FLD
- -- : BFD_RELOC_PPC_EMB_RELSDA
- -- : BFD_RELOC_PPC_VLE_REL8
- -- : BFD_RELOC_PPC_VLE_REL15
- -- : BFD_RELOC_PPC_VLE_REL24
- -- : BFD_RELOC_PPC_VLE_LO16A
- -- : BFD_RELOC_PPC_VLE_LO16D
- -- : BFD_RELOC_PPC_VLE_HI16A
- -- : BFD_RELOC_PPC_VLE_HI16D
- -- : BFD_RELOC_PPC_VLE_HA16A
- -- : BFD_RELOC_PPC_VLE_HA16D
- -- : BFD_RELOC_PPC_VLE_SDA21
- -- : BFD_RELOC_PPC_VLE_SDA21_LO
- -- : BFD_RELOC_PPC_VLE_SDAREL_LO16A
- -- : BFD_RELOC_PPC_VLE_SDAREL_LO16D
- -- : BFD_RELOC_PPC_VLE_SDAREL_HI16A
- -- : BFD_RELOC_PPC_VLE_SDAREL_HI16D
- -- : BFD_RELOC_PPC_VLE_SDAREL_HA16A
- -- : BFD_RELOC_PPC_VLE_SDAREL_HA16D
- -- : BFD_RELOC_PPC64_HIGHER
- -- : BFD_RELOC_PPC64_HIGHER_S
- -- : BFD_RELOC_PPC64_HIGHEST
- -- : BFD_RELOC_PPC64_HIGHEST_S
- -- : BFD_RELOC_PPC64_TOC16_LO
- -- : BFD_RELOC_PPC64_TOC16_HI
- -- : BFD_RELOC_PPC64_TOC16_HA
- -- : BFD_RELOC_PPC64_TOC
- -- : BFD_RELOC_PPC64_PLTGOT16
- -- : BFD_RELOC_PPC64_PLTGOT16_LO
- -- : BFD_RELOC_PPC64_PLTGOT16_HI
- -- : BFD_RELOC_PPC64_PLTGOT16_HA
- -- : BFD_RELOC_PPC64_ADDR16_DS
- -- : BFD_RELOC_PPC64_ADDR16_LO_DS
- -- : BFD_RELOC_PPC64_GOT16_DS
- -- : BFD_RELOC_PPC64_GOT16_LO_DS
- -- : BFD_RELOC_PPC64_PLT16_LO_DS
- -- : BFD_RELOC_PPC64_SECTOFF_DS
- -- : BFD_RELOC_PPC64_SECTOFF_LO_DS
- -- : BFD_RELOC_PPC64_TOC16_DS
- -- : BFD_RELOC_PPC64_TOC16_LO_DS
- -- : BFD_RELOC_PPC64_PLTGOT16_DS
- -- : BFD_RELOC_PPC64_PLTGOT16_LO_DS
- -- : BFD_RELOC_PPC64_ADDR16_HIGH
- -- : BFD_RELOC_PPC64_ADDR16_HIGHA
- Power(rs6000) and PowerPC relocations.
-
- -- : BFD_RELOC_PPC_TLS
- -- : BFD_RELOC_PPC_TLSGD
- -- : BFD_RELOC_PPC_TLSLD
- -- : BFD_RELOC_PPC_DTPMOD
- -- : BFD_RELOC_PPC_TPREL16
- -- : BFD_RELOC_PPC_TPREL16_LO
- -- : BFD_RELOC_PPC_TPREL16_HI
- -- : BFD_RELOC_PPC_TPREL16_HA
- -- : BFD_RELOC_PPC_TPREL
- -- : BFD_RELOC_PPC_DTPREL16
- -- : BFD_RELOC_PPC_DTPREL16_LO
- -- : BFD_RELOC_PPC_DTPREL16_HI
- -- : BFD_RELOC_PPC_DTPREL16_HA
- -- : BFD_RELOC_PPC_DTPREL
- -- : BFD_RELOC_PPC_GOT_TLSGD16
- -- : BFD_RELOC_PPC_GOT_TLSGD16_LO
- -- : BFD_RELOC_PPC_GOT_TLSGD16_HI
- -- : BFD_RELOC_PPC_GOT_TLSGD16_HA
- -- : BFD_RELOC_PPC_GOT_TLSLD16
- -- : BFD_RELOC_PPC_GOT_TLSLD16_LO
- -- : BFD_RELOC_PPC_GOT_TLSLD16_HI
- -- : BFD_RELOC_PPC_GOT_TLSLD16_HA
- -- : BFD_RELOC_PPC_GOT_TPREL16
- -- : BFD_RELOC_PPC_GOT_TPREL16_LO
- -- : BFD_RELOC_PPC_GOT_TPREL16_HI
- -- : BFD_RELOC_PPC_GOT_TPREL16_HA
- -- : BFD_RELOC_PPC_GOT_DTPREL16
- -- : BFD_RELOC_PPC_GOT_DTPREL16_LO
- -- : BFD_RELOC_PPC_GOT_DTPREL16_HI
- -- : BFD_RELOC_PPC_GOT_DTPREL16_HA
- -- : BFD_RELOC_PPC64_TPREL16_DS
- -- : BFD_RELOC_PPC64_TPREL16_LO_DS
- -- : BFD_RELOC_PPC64_TPREL16_HIGHER
- -- : BFD_RELOC_PPC64_TPREL16_HIGHERA
- -- : BFD_RELOC_PPC64_TPREL16_HIGHEST
- -- : BFD_RELOC_PPC64_TPREL16_HIGHESTA
- -- : BFD_RELOC_PPC64_DTPREL16_DS
- -- : BFD_RELOC_PPC64_DTPREL16_LO_DS
- -- : BFD_RELOC_PPC64_DTPREL16_HIGHER
- -- : BFD_RELOC_PPC64_DTPREL16_HIGHERA
- -- : BFD_RELOC_PPC64_DTPREL16_HIGHEST
- -- : BFD_RELOC_PPC64_DTPREL16_HIGHESTA
- -- : BFD_RELOC_PPC64_TPREL16_HIGH
- -- : BFD_RELOC_PPC64_TPREL16_HIGHA
- -- : BFD_RELOC_PPC64_DTPREL16_HIGH
- -- : BFD_RELOC_PPC64_DTPREL16_HIGHA
- PowerPC and PowerPC64 thread-local storage relocations.
-
- -- : BFD_RELOC_I370_D12
- IBM 370/390 relocations
-
- -- : BFD_RELOC_CTOR
- The type of reloc used to build a constructor table - at the moment
- probably a 32 bit wide absolute relocation, but the target can
- choose. It generally does map to one of the other relocation
- types.
-
- -- : BFD_RELOC_ARM_PCREL_BRANCH
- ARM 26 bit pc-relative branch. The lowest two bits must be zero
- and are not stored in the instruction.
-
- -- : BFD_RELOC_ARM_PCREL_BLX
- ARM 26 bit pc-relative branch. The lowest bit must be zero and is
- not stored in the instruction. The 2nd lowest bit comes from a 1
- bit field in the instruction.
-
- -- : BFD_RELOC_THUMB_PCREL_BLX
- Thumb 22 bit pc-relative branch. The lowest bit must be zero and
- is not stored in the instruction. The 2nd lowest bit comes from a
- 1 bit field in the instruction.
-
- -- : BFD_RELOC_ARM_PCREL_CALL
- ARM 26-bit pc-relative branch for an unconditional BL or BLX
- instruction.
-
- -- : BFD_RELOC_ARM_PCREL_JUMP
- ARM 26-bit pc-relative branch for B or conditional BL instruction.
-
- -- : BFD_RELOC_THUMB_PCREL_BRANCH7
- -- : BFD_RELOC_THUMB_PCREL_BRANCH9
- -- : BFD_RELOC_THUMB_PCREL_BRANCH12
- -- : BFD_RELOC_THUMB_PCREL_BRANCH20
- -- : BFD_RELOC_THUMB_PCREL_BRANCH23
- -- : BFD_RELOC_THUMB_PCREL_BRANCH25
- Thumb 7-, 9-, 12-, 20-, 23-, and 25-bit pc-relative branches. The
- lowest bit must be zero and is not stored in the instruction.
- Note that the corresponding ELF R_ARM_THM_JUMPnn constant has an
- "nn" one smaller in all cases. Note further that BRANCH23
- corresponds to R_ARM_THM_CALL.
-
- -- : BFD_RELOC_ARM_OFFSET_IMM
- 12-bit immediate offset, used in ARM-format ldr and str
- instructions.
-
- -- : BFD_RELOC_ARM_THUMB_OFFSET
- 5-bit immediate offset, used in Thumb-format ldr and str
- instructions.
-
- -- : BFD_RELOC_ARM_TARGET1
- Pc-relative or absolute relocation depending on target. Used for
- entries in .init_array sections.
-
- -- : BFD_RELOC_ARM_ROSEGREL32
- Read-only segment base relative address.
-
- -- : BFD_RELOC_ARM_SBREL32
- Data segment base relative address.
-
- -- : BFD_RELOC_ARM_TARGET2
- This reloc is used for references to RTTI data from exception
- handling tables. The actual definition depends on the target. It
- may be a pc-relative or some form of GOT-indirect relocation.
-
- -- : BFD_RELOC_ARM_PREL31
- 31-bit PC relative address.
-
- -- : BFD_RELOC_ARM_MOVW
- -- : BFD_RELOC_ARM_MOVT
- -- : BFD_RELOC_ARM_MOVW_PCREL
- -- : BFD_RELOC_ARM_MOVT_PCREL
- -- : BFD_RELOC_ARM_THUMB_MOVW
- -- : BFD_RELOC_ARM_THUMB_MOVT
- -- : BFD_RELOC_ARM_THUMB_MOVW_PCREL
- -- : BFD_RELOC_ARM_THUMB_MOVT_PCREL
- Low and High halfword relocations for MOVW and MOVT instructions.
-
- -- : BFD_RELOC_ARM_JUMP_SLOT
- -- : BFD_RELOC_ARM_GLOB_DAT
- -- : BFD_RELOC_ARM_GOT32
- -- : BFD_RELOC_ARM_PLT32
- -- : BFD_RELOC_ARM_RELATIVE
- -- : BFD_RELOC_ARM_GOTOFF
- -- : BFD_RELOC_ARM_GOTPC
- -- : BFD_RELOC_ARM_GOT_PREL
- Relocations for setting up GOTs and PLTs for shared libraries.
-
- -- : BFD_RELOC_ARM_TLS_GD32
- -- : BFD_RELOC_ARM_TLS_LDO32
- -- : BFD_RELOC_ARM_TLS_LDM32
- -- : BFD_RELOC_ARM_TLS_DTPOFF32
- -- : BFD_RELOC_ARM_TLS_DTPMOD32
- -- : BFD_RELOC_ARM_TLS_TPOFF32
- -- : BFD_RELOC_ARM_TLS_IE32
- -- : BFD_RELOC_ARM_TLS_LE32
- -- : BFD_RELOC_ARM_TLS_GOTDESC
- -- : BFD_RELOC_ARM_TLS_CALL
- -- : BFD_RELOC_ARM_THM_TLS_CALL
- -- : BFD_RELOC_ARM_TLS_DESCSEQ
- -- : BFD_RELOC_ARM_THM_TLS_DESCSEQ
- -- : BFD_RELOC_ARM_TLS_DESC
- ARM thread-local storage relocations.
-
- -- : BFD_RELOC_ARM_ALU_PC_G0_NC
- -- : BFD_RELOC_ARM_ALU_PC_G0
- -- : BFD_RELOC_ARM_ALU_PC_G1_NC
- -- : BFD_RELOC_ARM_ALU_PC_G1
- -- : BFD_RELOC_ARM_ALU_PC_G2
- -- : BFD_RELOC_ARM_LDR_PC_G0
- -- : BFD_RELOC_ARM_LDR_PC_G1
- -- : BFD_RELOC_ARM_LDR_PC_G2
- -- : BFD_RELOC_ARM_LDRS_PC_G0
- -- : BFD_RELOC_ARM_LDRS_PC_G1
- -- : BFD_RELOC_ARM_LDRS_PC_G2
- -- : BFD_RELOC_ARM_LDC_PC_G0
- -- : BFD_RELOC_ARM_LDC_PC_G1
- -- : BFD_RELOC_ARM_LDC_PC_G2
- -- : BFD_RELOC_ARM_ALU_SB_G0_NC
- -- : BFD_RELOC_ARM_ALU_SB_G0
- -- : BFD_RELOC_ARM_ALU_SB_G1_NC
- -- : BFD_RELOC_ARM_ALU_SB_G1
- -- : BFD_RELOC_ARM_ALU_SB_G2
- -- : BFD_RELOC_ARM_LDR_SB_G0
- -- : BFD_RELOC_ARM_LDR_SB_G1
- -- : BFD_RELOC_ARM_LDR_SB_G2
- -- : BFD_RELOC_ARM_LDRS_SB_G0
- -- : BFD_RELOC_ARM_LDRS_SB_G1
- -- : BFD_RELOC_ARM_LDRS_SB_G2
- -- : BFD_RELOC_ARM_LDC_SB_G0
- -- : BFD_RELOC_ARM_LDC_SB_G1
- -- : BFD_RELOC_ARM_LDC_SB_G2
- ARM group relocations.
-
- -- : BFD_RELOC_ARM_V4BX
- Annotation of BX instructions.
-
- -- : BFD_RELOC_ARM_IRELATIVE
- ARM support for STT_GNU_IFUNC.
-
- -- : BFD_RELOC_ARM_IMMEDIATE
- -- : BFD_RELOC_ARM_ADRL_IMMEDIATE
- -- : BFD_RELOC_ARM_T32_IMMEDIATE
- -- : BFD_RELOC_ARM_T32_ADD_IMM
- -- : BFD_RELOC_ARM_T32_IMM12
- -- : BFD_RELOC_ARM_T32_ADD_PC12
- -- : BFD_RELOC_ARM_SHIFT_IMM
- -- : BFD_RELOC_ARM_SMC
- -- : BFD_RELOC_ARM_HVC
- -- : BFD_RELOC_ARM_SWI
- -- : BFD_RELOC_ARM_MULTI
- -- : BFD_RELOC_ARM_CP_OFF_IMM
- -- : BFD_RELOC_ARM_CP_OFF_IMM_S2
- -- : BFD_RELOC_ARM_T32_CP_OFF_IMM
- -- : BFD_RELOC_ARM_T32_CP_OFF_IMM_S2
- -- : BFD_RELOC_ARM_ADR_IMM
- -- : BFD_RELOC_ARM_LDR_IMM
- -- : BFD_RELOC_ARM_LITERAL
- -- : BFD_RELOC_ARM_IN_POOL
- -- : BFD_RELOC_ARM_OFFSET_IMM8
- -- : BFD_RELOC_ARM_T32_OFFSET_U8
- -- : BFD_RELOC_ARM_T32_OFFSET_IMM
- -- : BFD_RELOC_ARM_HWLITERAL
- -- : BFD_RELOC_ARM_THUMB_ADD
- -- : BFD_RELOC_ARM_THUMB_IMM
- -- : BFD_RELOC_ARM_THUMB_SHIFT
- These relocs are only used within the ARM assembler. They are not
- (at present) written to any object files.
-
- -- : BFD_RELOC_SH_PCDISP8BY2
- -- : BFD_RELOC_SH_PCDISP12BY2
- -- : BFD_RELOC_SH_IMM3
- -- : BFD_RELOC_SH_IMM3U
- -- : BFD_RELOC_SH_DISP12
- -- : BFD_RELOC_SH_DISP12BY2
- -- : BFD_RELOC_SH_DISP12BY4
- -- : BFD_RELOC_SH_DISP12BY8
- -- : BFD_RELOC_SH_DISP20
- -- : BFD_RELOC_SH_DISP20BY8
- -- : BFD_RELOC_SH_IMM4
- -- : BFD_RELOC_SH_IMM4BY2
- -- : BFD_RELOC_SH_IMM4BY4
- -- : BFD_RELOC_SH_IMM8
- -- : BFD_RELOC_SH_IMM8BY2
- -- : BFD_RELOC_SH_IMM8BY4
- -- : BFD_RELOC_SH_PCRELIMM8BY2
- -- : BFD_RELOC_SH_PCRELIMM8BY4
- -- : BFD_RELOC_SH_SWITCH16
- -- : BFD_RELOC_SH_SWITCH32
- -- : BFD_RELOC_SH_USES
- -- : BFD_RELOC_SH_COUNT
- -- : BFD_RELOC_SH_ALIGN
- -- : BFD_RELOC_SH_CODE
- -- : BFD_RELOC_SH_DATA
- -- : BFD_RELOC_SH_LABEL
- -- : BFD_RELOC_SH_LOOP_START
- -- : BFD_RELOC_SH_LOOP_END
- -- : BFD_RELOC_SH_COPY
- -- : BFD_RELOC_SH_GLOB_DAT
- -- : BFD_RELOC_SH_JMP_SLOT
- -- : BFD_RELOC_SH_RELATIVE
- -- : BFD_RELOC_SH_GOTPC
- -- : BFD_RELOC_SH_GOT_LOW16
- -- : BFD_RELOC_SH_GOT_MEDLOW16
- -- : BFD_RELOC_SH_GOT_MEDHI16
- -- : BFD_RELOC_SH_GOT_HI16
- -- : BFD_RELOC_SH_GOTPLT_LOW16
- -- : BFD_RELOC_SH_GOTPLT_MEDLOW16
- -- : BFD_RELOC_SH_GOTPLT_MEDHI16
- -- : BFD_RELOC_SH_GOTPLT_HI16
- -- : BFD_RELOC_SH_PLT_LOW16
- -- : BFD_RELOC_SH_PLT_MEDLOW16
- -- : BFD_RELOC_SH_PLT_MEDHI16
- -- : BFD_RELOC_SH_PLT_HI16
- -- : BFD_RELOC_SH_GOTOFF_LOW16
- -- : BFD_RELOC_SH_GOTOFF_MEDLOW16
- -- : BFD_RELOC_SH_GOTOFF_MEDHI16
- -- : BFD_RELOC_SH_GOTOFF_HI16
- -- : BFD_RELOC_SH_GOTPC_LOW16
- -- : BFD_RELOC_SH_GOTPC_MEDLOW16
- -- : BFD_RELOC_SH_GOTPC_MEDHI16
- -- : BFD_RELOC_SH_GOTPC_HI16
- -- : BFD_RELOC_SH_COPY64
- -- : BFD_RELOC_SH_GLOB_DAT64
- -- : BFD_RELOC_SH_JMP_SLOT64
- -- : BFD_RELOC_SH_RELATIVE64
- -- : BFD_RELOC_SH_GOT10BY4
- -- : BFD_RELOC_SH_GOT10BY8
- -- : BFD_RELOC_SH_GOTPLT10BY4
- -- : BFD_RELOC_SH_GOTPLT10BY8
- -- : BFD_RELOC_SH_GOTPLT32
- -- : BFD_RELOC_SH_SHMEDIA_CODE
- -- : BFD_RELOC_SH_IMMU5
- -- : BFD_RELOC_SH_IMMS6
- -- : BFD_RELOC_SH_IMMS6BY32
- -- : BFD_RELOC_SH_IMMU6
- -- : BFD_RELOC_SH_IMMS10
- -- : BFD_RELOC_SH_IMMS10BY2
- -- : BFD_RELOC_SH_IMMS10BY4
- -- : BFD_RELOC_SH_IMMS10BY8
- -- : BFD_RELOC_SH_IMMS16
- -- : BFD_RELOC_SH_IMMU16
- -- : BFD_RELOC_SH_IMM_LOW16
- -- : BFD_RELOC_SH_IMM_LOW16_PCREL
- -- : BFD_RELOC_SH_IMM_MEDLOW16
- -- : BFD_RELOC_SH_IMM_MEDLOW16_PCREL
- -- : BFD_RELOC_SH_IMM_MEDHI16
- -- : BFD_RELOC_SH_IMM_MEDHI16_PCREL
- -- : BFD_RELOC_SH_IMM_HI16
- -- : BFD_RELOC_SH_IMM_HI16_PCREL
- -- : BFD_RELOC_SH_PT_16
- -- : BFD_RELOC_SH_TLS_GD_32
- -- : BFD_RELOC_SH_TLS_LD_32
- -- : BFD_RELOC_SH_TLS_LDO_32
- -- : BFD_RELOC_SH_TLS_IE_32
- -- : BFD_RELOC_SH_TLS_LE_32
- -- : BFD_RELOC_SH_TLS_DTPMOD32
- -- : BFD_RELOC_SH_TLS_DTPOFF32
- -- : BFD_RELOC_SH_TLS_TPOFF32
- -- : BFD_RELOC_SH_GOT20
- -- : BFD_RELOC_SH_GOTOFF20
- -- : BFD_RELOC_SH_GOTFUNCDESC
- -- : BFD_RELOC_SH_GOTFUNCDESC20
- -- : BFD_RELOC_SH_GOTOFFFUNCDESC
- -- : BFD_RELOC_SH_GOTOFFFUNCDESC20
- -- : BFD_RELOC_SH_FUNCDESC
- Renesas / SuperH SH relocs. Not all of these appear in object
- files.
-
- -- : BFD_RELOC_ARC_B22_PCREL
- ARC Cores relocs. ARC 22 bit pc-relative branch. The lowest two
- bits must be zero and are not stored in the instruction. The high
- 20 bits are installed in bits 26 through 7 of the instruction.
-
- -- : BFD_RELOC_ARC_B26
- ARC 26 bit absolute branch. The lowest two bits must be zero and
- are not stored in the instruction. The high 24 bits are installed
- in bits 23 through 0.
-
- -- : BFD_RELOC_BFIN_16_IMM
- ADI Blackfin 16 bit immediate absolute reloc.
-
- -- : BFD_RELOC_BFIN_16_HIGH
- ADI Blackfin 16 bit immediate absolute reloc higher 16 bits.
-
- -- : BFD_RELOC_BFIN_4_PCREL
- ADI Blackfin 'a' part of LSETUP.
-
- -- : BFD_RELOC_BFIN_5_PCREL
- ADI Blackfin.
-
- -- : BFD_RELOC_BFIN_16_LOW
- ADI Blackfin 16 bit immediate absolute reloc lower 16 bits.
-
- -- : BFD_RELOC_BFIN_10_PCREL
- ADI Blackfin.
-
- -- : BFD_RELOC_BFIN_11_PCREL
- ADI Blackfin 'b' part of LSETUP.
-
- -- : BFD_RELOC_BFIN_12_PCREL_JUMP
- ADI Blackfin.
-
- -- : BFD_RELOC_BFIN_12_PCREL_JUMP_S
- ADI Blackfin Short jump, pcrel.
-
- -- : BFD_RELOC_BFIN_24_PCREL_CALL_X
- ADI Blackfin Call.x not implemented.
-
- -- : BFD_RELOC_BFIN_24_PCREL_JUMP_L
- ADI Blackfin Long Jump pcrel.
-
- -- : BFD_RELOC_BFIN_GOT17M4
- -- : BFD_RELOC_BFIN_GOTHI
- -- : BFD_RELOC_BFIN_GOTLO
- -- : BFD_RELOC_BFIN_FUNCDESC
- -- : BFD_RELOC_BFIN_FUNCDESC_GOT17M4
- -- : BFD_RELOC_BFIN_FUNCDESC_GOTHI
- -- : BFD_RELOC_BFIN_FUNCDESC_GOTLO
- -- : BFD_RELOC_BFIN_FUNCDESC_VALUE
- -- : BFD_RELOC_BFIN_FUNCDESC_GOTOFF17M4
- -- : BFD_RELOC_BFIN_FUNCDESC_GOTOFFHI
- -- : BFD_RELOC_BFIN_FUNCDESC_GOTOFFLO
- -- : BFD_RELOC_BFIN_GOTOFF17M4
- -- : BFD_RELOC_BFIN_GOTOFFHI
- -- : BFD_RELOC_BFIN_GOTOFFLO
- ADI Blackfin FD-PIC relocations.
-
- -- : BFD_RELOC_BFIN_GOT
- ADI Blackfin GOT relocation.
-
- -- : BFD_RELOC_BFIN_PLTPC
- ADI Blackfin PLTPC relocation.
-
- -- : BFD_ARELOC_BFIN_PUSH
- ADI Blackfin arithmetic relocation.
-
- -- : BFD_ARELOC_BFIN_CONST
- ADI Blackfin arithmetic relocation.
-
- -- : BFD_ARELOC_BFIN_ADD
- ADI Blackfin arithmetic relocation.
-
- -- : BFD_ARELOC_BFIN_SUB
- ADI Blackfin arithmetic relocation.
-
- -- : BFD_ARELOC_BFIN_MULT
- ADI Blackfin arithmetic relocation.
-
- -- : BFD_ARELOC_BFIN_DIV
- ADI Blackfin arithmetic relocation.
-
- -- : BFD_ARELOC_BFIN_MOD
- ADI Blackfin arithmetic relocation.
-
- -- : BFD_ARELOC_BFIN_LSHIFT
- ADI Blackfin arithmetic relocation.
-
- -- : BFD_ARELOC_BFIN_RSHIFT
- ADI Blackfin arithmetic relocation.
-
- -- : BFD_ARELOC_BFIN_AND
- ADI Blackfin arithmetic relocation.
-
- -- : BFD_ARELOC_BFIN_OR
- ADI Blackfin arithmetic relocation.
-
- -- : BFD_ARELOC_BFIN_XOR
- ADI Blackfin arithmetic relocation.
-
- -- : BFD_ARELOC_BFIN_LAND
- ADI Blackfin arithmetic relocation.
-
- -- : BFD_ARELOC_BFIN_LOR
- ADI Blackfin arithmetic relocation.
-
- -- : BFD_ARELOC_BFIN_LEN
- ADI Blackfin arithmetic relocation.
-
- -- : BFD_ARELOC_BFIN_NEG
- ADI Blackfin arithmetic relocation.
-
- -- : BFD_ARELOC_BFIN_COMP
- ADI Blackfin arithmetic relocation.
-
- -- : BFD_ARELOC_BFIN_PAGE
- ADI Blackfin arithmetic relocation.
-
- -- : BFD_ARELOC_BFIN_HWPAGE
- ADI Blackfin arithmetic relocation.
-
- -- : BFD_ARELOC_BFIN_ADDR
- ADI Blackfin arithmetic relocation.
-
- -- : BFD_RELOC_D10V_10_PCREL_R
- Mitsubishi D10V relocs. This is a 10-bit reloc with the right 2
- bits assumed to be 0.
-
- -- : BFD_RELOC_D10V_10_PCREL_L
- Mitsubishi D10V relocs. This is a 10-bit reloc with the right 2
- bits assumed to be 0. This is the same as the previous reloc
- except it is in the left container, i.e., shifted left 15 bits.
-
- -- : BFD_RELOC_D10V_18
- This is an 18-bit reloc with the right 2 bits assumed to be 0.
-
- -- : BFD_RELOC_D10V_18_PCREL
- This is an 18-bit reloc with the right 2 bits assumed to be 0.
-
- -- : BFD_RELOC_D30V_6
- Mitsubishi D30V relocs. This is a 6-bit absolute reloc.
-
- -- : BFD_RELOC_D30V_9_PCREL
- This is a 6-bit pc-relative reloc with the right 3 bits assumed to
- be 0.
-
- -- : BFD_RELOC_D30V_9_PCREL_R
- This is a 6-bit pc-relative reloc with the right 3 bits assumed to
- be 0. Same as the previous reloc but on the right side of the
- container.
-
- -- : BFD_RELOC_D30V_15
- This is a 12-bit absolute reloc with the right 3 bitsassumed to be
- 0.
-
- -- : BFD_RELOC_D30V_15_PCREL
- This is a 12-bit pc-relative reloc with the right 3 bits assumed
- to be 0.
-
- -- : BFD_RELOC_D30V_15_PCREL_R
- This is a 12-bit pc-relative reloc with the right 3 bits assumed
- to be 0. Same as the previous reloc but on the right side of the
- container.
-
- -- : BFD_RELOC_D30V_21
- This is an 18-bit absolute reloc with the right 3 bits assumed to
- be 0.
-
- -- : BFD_RELOC_D30V_21_PCREL
- This is an 18-bit pc-relative reloc with the right 3 bits assumed
- to be 0.
-
- -- : BFD_RELOC_D30V_21_PCREL_R
- This is an 18-bit pc-relative reloc with the right 3 bits assumed
- to be 0. Same as the previous reloc but on the right side of the
- container.
-
- -- : BFD_RELOC_D30V_32
- This is a 32-bit absolute reloc.
-
- -- : BFD_RELOC_D30V_32_PCREL
- This is a 32-bit pc-relative reloc.
-
- -- : BFD_RELOC_DLX_HI16_S
- DLX relocs
-
- -- : BFD_RELOC_DLX_LO16
- DLX relocs
-
- -- : BFD_RELOC_DLX_JMP26
- DLX relocs
-
- -- : BFD_RELOC_M32C_HI8
- -- : BFD_RELOC_M32C_RL_JUMP
- -- : BFD_RELOC_M32C_RL_1ADDR
- -- : BFD_RELOC_M32C_RL_2ADDR
- Renesas M16C/M32C Relocations.
-
- -- : BFD_RELOC_M32R_24
- Renesas M32R (formerly Mitsubishi M32R) relocs. This is a 24 bit
- absolute address.
-
- -- : BFD_RELOC_M32R_10_PCREL
- This is a 10-bit pc-relative reloc with the right 2 bits assumed
- to be 0.
-
- -- : BFD_RELOC_M32R_18_PCREL
- This is an 18-bit reloc with the right 2 bits assumed to be 0.
-
- -- : BFD_RELOC_M32R_26_PCREL
- This is a 26-bit reloc with the right 2 bits assumed to be 0.
-
- -- : BFD_RELOC_M32R_HI16_ULO
- This is a 16-bit reloc containing the high 16 bits of an address
- used when the lower 16 bits are treated as unsigned.
-
- -- : BFD_RELOC_M32R_HI16_SLO
- This is a 16-bit reloc containing the high 16 bits of an address
- used when the lower 16 bits are treated as signed.
-
- -- : BFD_RELOC_M32R_LO16
- This is a 16-bit reloc containing the lower 16 bits of an address.
-
- -- : BFD_RELOC_M32R_SDA16
- This is a 16-bit reloc containing the small data area offset for
- use in add3, load, and store instructions.
-
- -- : BFD_RELOC_M32R_GOT24
- -- : BFD_RELOC_M32R_26_PLTREL
- -- : BFD_RELOC_M32R_COPY
- -- : BFD_RELOC_M32R_GLOB_DAT
- -- : BFD_RELOC_M32R_JMP_SLOT
- -- : BFD_RELOC_M32R_RELATIVE
- -- : BFD_RELOC_M32R_GOTOFF
- -- : BFD_RELOC_M32R_GOTOFF_HI_ULO
- -- : BFD_RELOC_M32R_GOTOFF_HI_SLO
- -- : BFD_RELOC_M32R_GOTOFF_LO
- -- : BFD_RELOC_M32R_GOTPC24
- -- : BFD_RELOC_M32R_GOT16_HI_ULO
- -- : BFD_RELOC_M32R_GOT16_HI_SLO
- -- : BFD_RELOC_M32R_GOT16_LO
- -- : BFD_RELOC_M32R_GOTPC_HI_ULO
- -- : BFD_RELOC_M32R_GOTPC_HI_SLO
- -- : BFD_RELOC_M32R_GOTPC_LO
- For PIC.
-
- -- : BFD_RELOC_V850_9_PCREL
- This is a 9-bit reloc
-
- -- : BFD_RELOC_V850_22_PCREL
- This is a 22-bit reloc
-
- -- : BFD_RELOC_V850_SDA_16_16_OFFSET
- This is a 16 bit offset from the short data area pointer.
-
- -- : BFD_RELOC_V850_SDA_15_16_OFFSET
- This is a 16 bit offset (of which only 15 bits are used) from the
- short data area pointer.
-
- -- : BFD_RELOC_V850_ZDA_16_16_OFFSET
- This is a 16 bit offset from the zero data area pointer.
-
- -- : BFD_RELOC_V850_ZDA_15_16_OFFSET
- This is a 16 bit offset (of which only 15 bits are used) from the
- zero data area pointer.
-
- -- : BFD_RELOC_V850_TDA_6_8_OFFSET
- This is an 8 bit offset (of which only 6 bits are used) from the
- tiny data area pointer.
-
- -- : BFD_RELOC_V850_TDA_7_8_OFFSET
- This is an 8bit offset (of which only 7 bits are used) from the
- tiny data area pointer.
-
- -- : BFD_RELOC_V850_TDA_7_7_OFFSET
- This is a 7 bit offset from the tiny data area pointer.
-
- -- : BFD_RELOC_V850_TDA_16_16_OFFSET
- This is a 16 bit offset from the tiny data area pointer.
-
- -- : BFD_RELOC_V850_TDA_4_5_OFFSET
- This is a 5 bit offset (of which only 4 bits are used) from the
- tiny data area pointer.
-
- -- : BFD_RELOC_V850_TDA_4_4_OFFSET
- This is a 4 bit offset from the tiny data area pointer.
-
- -- : BFD_RELOC_V850_SDA_16_16_SPLIT_OFFSET
- This is a 16 bit offset from the short data area pointer, with the
- bits placed non-contiguously in the instruction.
-
- -- : BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET
- This is a 16 bit offset from the zero data area pointer, with the
- bits placed non-contiguously in the instruction.
-
- -- : BFD_RELOC_V850_CALLT_6_7_OFFSET
- This is a 6 bit offset from the call table base pointer.
-
- -- : BFD_RELOC_V850_CALLT_16_16_OFFSET
- This is a 16 bit offset from the call table base pointer.
-
- -- : BFD_RELOC_V850_LONGCALL
- Used for relaxing indirect function calls.
-
- -- : BFD_RELOC_V850_LONGJUMP
- Used for relaxing indirect jumps.
-
- -- : BFD_RELOC_V850_ALIGN
- Used to maintain alignment whilst relaxing.
-
- -- : BFD_RELOC_V850_LO16_SPLIT_OFFSET
- This is a variation of BFD_RELOC_LO16 that can be used in v850e
- ld.bu instructions.
-
- -- : BFD_RELOC_V850_16_PCREL
- This is a 16-bit reloc.
-
- -- : BFD_RELOC_V850_17_PCREL
- This is a 17-bit reloc.
-
- -- : BFD_RELOC_V850_23
- This is a 23-bit reloc.
-
- -- : BFD_RELOC_V850_32_PCREL
- This is a 32-bit reloc.
-
- -- : BFD_RELOC_V850_32_ABS
- This is a 32-bit reloc.
-
- -- : BFD_RELOC_V850_16_SPLIT_OFFSET
- This is a 16-bit reloc.
-
- -- : BFD_RELOC_V850_16_S1
- This is a 16-bit reloc.
-
- -- : BFD_RELOC_V850_LO16_S1
- Low 16 bits. 16 bit shifted by 1.
-
- -- : BFD_RELOC_V850_CALLT_15_16_OFFSET
- This is a 16 bit offset from the call table base pointer.
-
- -- : BFD_RELOC_V850_32_GOTPCREL
- DSO relocations.
-
- -- : BFD_RELOC_V850_16_GOT
- DSO relocations.
-
- -- : BFD_RELOC_V850_32_GOT
- DSO relocations.
-
- -- : BFD_RELOC_V850_22_PLT_PCREL
- DSO relocations.
-
- -- : BFD_RELOC_V850_32_PLT_PCREL
- DSO relocations.
-
- -- : BFD_RELOC_V850_COPY
- DSO relocations.
-
- -- : BFD_RELOC_V850_GLOB_DAT
- DSO relocations.
-
- -- : BFD_RELOC_V850_JMP_SLOT
- DSO relocations.
-
- -- : BFD_RELOC_V850_RELATIVE
- DSO relocations.
-
- -- : BFD_RELOC_V850_16_GOTOFF
- DSO relocations.
-
- -- : BFD_RELOC_V850_32_GOTOFF
- DSO relocations.
-
- -- : BFD_RELOC_V850_CODE
- start code.
-
- -- : BFD_RELOC_V850_DATA
- start data in text.
-
- -- : BFD_RELOC_TIC30_LDP
- This is a 8bit DP reloc for the tms320c30, where the most
- significant 8 bits of a 24 bit word are placed into the least
- significant 8 bits of the opcode.
-
- -- : BFD_RELOC_TIC54X_PARTLS7
- This is a 7bit reloc for the tms320c54x, where the least
- significant 7 bits of a 16 bit word are placed into the least
- significant 7 bits of the opcode.
-
- -- : BFD_RELOC_TIC54X_PARTMS9
- This is a 9bit DP reloc for the tms320c54x, where the most
- significant 9 bits of a 16 bit word are placed into the least
- significant 9 bits of the opcode.
-
- -- : BFD_RELOC_TIC54X_23
- This is an extended address 23-bit reloc for the tms320c54x.
-
- -- : BFD_RELOC_TIC54X_16_OF_23
- This is a 16-bit reloc for the tms320c54x, where the least
- significant 16 bits of a 23-bit extended address are placed into
- the opcode.
-
- -- : BFD_RELOC_TIC54X_MS7_OF_23
- This is a reloc for the tms320c54x, where the most significant 7
- bits of a 23-bit extended address are placed into the opcode.
-
- -- : BFD_RELOC_C6000_PCR_S21
- -- : BFD_RELOC_C6000_PCR_S12
- -- : BFD_RELOC_C6000_PCR_S10
- -- : BFD_RELOC_C6000_PCR_S7
- -- : BFD_RELOC_C6000_ABS_S16
- -- : BFD_RELOC_C6000_ABS_L16
- -- : BFD_RELOC_C6000_ABS_H16
- -- : BFD_RELOC_C6000_SBR_U15_B
- -- : BFD_RELOC_C6000_SBR_U15_H
- -- : BFD_RELOC_C6000_SBR_U15_W
- -- : BFD_RELOC_C6000_SBR_S16
- -- : BFD_RELOC_C6000_SBR_L16_B
- -- : BFD_RELOC_C6000_SBR_L16_H
- -- : BFD_RELOC_C6000_SBR_L16_W
- -- : BFD_RELOC_C6000_SBR_H16_B
- -- : BFD_RELOC_C6000_SBR_H16_H
- -- : BFD_RELOC_C6000_SBR_H16_W
- -- : BFD_RELOC_C6000_SBR_GOT_U15_W
- -- : BFD_RELOC_C6000_SBR_GOT_L16_W
- -- : BFD_RELOC_C6000_SBR_GOT_H16_W
- -- : BFD_RELOC_C6000_DSBT_INDEX
- -- : BFD_RELOC_C6000_PREL31
- -- : BFD_RELOC_C6000_COPY
- -- : BFD_RELOC_C6000_JUMP_SLOT
- -- : BFD_RELOC_C6000_EHTYPE
- -- : BFD_RELOC_C6000_PCR_H16
- -- : BFD_RELOC_C6000_PCR_L16
- -- : BFD_RELOC_C6000_ALIGN
- -- : BFD_RELOC_C6000_FPHEAD
- -- : BFD_RELOC_C6000_NOCMP
- TMS320C6000 relocations.
-
- -- : BFD_RELOC_FR30_48
- This is a 48 bit reloc for the FR30 that stores 32 bits.
-
- -- : BFD_RELOC_FR30_20
- This is a 32 bit reloc for the FR30 that stores 20 bits split up
- into two sections.
-
- -- : BFD_RELOC_FR30_6_IN_4
- This is a 16 bit reloc for the FR30 that stores a 6 bit word
- offset in 4 bits.
-
- -- : BFD_RELOC_FR30_8_IN_8
- This is a 16 bit reloc for the FR30 that stores an 8 bit byte
- offset into 8 bits.
-
- -- : BFD_RELOC_FR30_9_IN_8
- This is a 16 bit reloc for the FR30 that stores a 9 bit short
- offset into 8 bits.
-
- -- : BFD_RELOC_FR30_10_IN_8
- This is a 16 bit reloc for the FR30 that stores a 10 bit word
- offset into 8 bits.
-
- -- : BFD_RELOC_FR30_9_PCREL
- This is a 16 bit reloc for the FR30 that stores a 9 bit pc relative
- short offset into 8 bits.
-
- -- : BFD_RELOC_FR30_12_PCREL
- This is a 16 bit reloc for the FR30 that stores a 12 bit pc
- relative short offset into 11 bits.
-
- -- : BFD_RELOC_MCORE_PCREL_IMM8BY4
- -- : BFD_RELOC_MCORE_PCREL_IMM11BY2
- -- : BFD_RELOC_MCORE_PCREL_IMM4BY2
- -- : BFD_RELOC_MCORE_PCREL_32
- -- : BFD_RELOC_MCORE_PCREL_JSR_IMM11BY2
- -- : BFD_RELOC_MCORE_RVA
- Motorola Mcore relocations.
-
- -- : BFD_RELOC_MEP_8
- -- : BFD_RELOC_MEP_16
- -- : BFD_RELOC_MEP_32
- -- : BFD_RELOC_MEP_PCREL8A2
- -- : BFD_RELOC_MEP_PCREL12A2
- -- : BFD_RELOC_MEP_PCREL17A2
- -- : BFD_RELOC_MEP_PCREL24A2
- -- : BFD_RELOC_MEP_PCABS24A2
- -- : BFD_RELOC_MEP_LOW16
- -- : BFD_RELOC_MEP_HI16U
- -- : BFD_RELOC_MEP_HI16S
- -- : BFD_RELOC_MEP_GPREL
- -- : BFD_RELOC_MEP_TPREL
- -- : BFD_RELOC_MEP_TPREL7
- -- : BFD_RELOC_MEP_TPREL7A2
- -- : BFD_RELOC_MEP_TPREL7A4
- -- : BFD_RELOC_MEP_UIMM24
- -- : BFD_RELOC_MEP_ADDR24A4
- -- : BFD_RELOC_MEP_GNU_VTINHERIT
- -- : BFD_RELOC_MEP_GNU_VTENTRY
- Toshiba Media Processor Relocations.
-
- -- : BFD_RELOC_METAG_HIADDR16
- -- : BFD_RELOC_METAG_LOADDR16
- -- : BFD_RELOC_METAG_RELBRANCH
- -- : BFD_RELOC_METAG_GETSETOFF
- -- : BFD_RELOC_METAG_HIOG
- -- : BFD_RELOC_METAG_LOOG
- -- : BFD_RELOC_METAG_REL8
- -- : BFD_RELOC_METAG_REL16
- -- : BFD_RELOC_METAG_HI16_GOTOFF
- -- : BFD_RELOC_METAG_LO16_GOTOFF
- -- : BFD_RELOC_METAG_GETSET_GOTOFF
- -- : BFD_RELOC_METAG_GETSET_GOT
- -- : BFD_RELOC_METAG_HI16_GOTPC
- -- : BFD_RELOC_METAG_LO16_GOTPC
- -- : BFD_RELOC_METAG_HI16_PLT
- -- : BFD_RELOC_METAG_LO16_PLT
- -- : BFD_RELOC_METAG_RELBRANCH_PLT
- -- : BFD_RELOC_METAG_GOTOFF
- -- : BFD_RELOC_METAG_PLT
- -- : BFD_RELOC_METAG_COPY
- -- : BFD_RELOC_METAG_JMP_SLOT
- -- : BFD_RELOC_METAG_RELATIVE
- -- : BFD_RELOC_METAG_GLOB_DAT
- -- : BFD_RELOC_METAG_TLS_GD
- -- : BFD_RELOC_METAG_TLS_LDM
- -- : BFD_RELOC_METAG_TLS_LDO_HI16
- -- : BFD_RELOC_METAG_TLS_LDO_LO16
- -- : BFD_RELOC_METAG_TLS_LDO
- -- : BFD_RELOC_METAG_TLS_IE
- -- : BFD_RELOC_METAG_TLS_IENONPIC
- -- : BFD_RELOC_METAG_TLS_IENONPIC_HI16
- -- : BFD_RELOC_METAG_TLS_IENONPIC_LO16
- -- : BFD_RELOC_METAG_TLS_TPOFF
- -- : BFD_RELOC_METAG_TLS_DTPMOD
- -- : BFD_RELOC_METAG_TLS_DTPOFF
- -- : BFD_RELOC_METAG_TLS_LE
- -- : BFD_RELOC_METAG_TLS_LE_HI16
- -- : BFD_RELOC_METAG_TLS_LE_LO16
- Imagination Technologies Meta relocations.
-
- -- : BFD_RELOC_MMIX_GETA
- -- : BFD_RELOC_MMIX_GETA_1
- -- : BFD_RELOC_MMIX_GETA_2
- -- : BFD_RELOC_MMIX_GETA_3
- These are relocations for the GETA instruction.
-
- -- : BFD_RELOC_MMIX_CBRANCH
- -- : BFD_RELOC_MMIX_CBRANCH_J
- -- : BFD_RELOC_MMIX_CBRANCH_1
- -- : BFD_RELOC_MMIX_CBRANCH_2
- -- : BFD_RELOC_MMIX_CBRANCH_3
- These are relocations for a conditional branch instruction.
-
- -- : BFD_RELOC_MMIX_PUSHJ
- -- : BFD_RELOC_MMIX_PUSHJ_1
- -- : BFD_RELOC_MMIX_PUSHJ_2
- -- : BFD_RELOC_MMIX_PUSHJ_3
- -- : BFD_RELOC_MMIX_PUSHJ_STUBBABLE
- These are relocations for the PUSHJ instruction.
-
- -- : BFD_RELOC_MMIX_JMP
- -- : BFD_RELOC_MMIX_JMP_1
- -- : BFD_RELOC_MMIX_JMP_2
- -- : BFD_RELOC_MMIX_JMP_3
- These are relocations for the JMP instruction.
-
- -- : BFD_RELOC_MMIX_ADDR19
- This is a relocation for a relative address as in a GETA
- instruction or a branch.
-
- -- : BFD_RELOC_MMIX_ADDR27
- This is a relocation for a relative address as in a JMP
- instruction.
-
- -- : BFD_RELOC_MMIX_REG_OR_BYTE
- This is a relocation for an instruction field that may be a general
- register or a value 0..255.
-
- -- : BFD_RELOC_MMIX_REG
- This is a relocation for an instruction field that may be a general
- register.
-
- -- : BFD_RELOC_MMIX_BASE_PLUS_OFFSET
- This is a relocation for two instruction fields holding a register
- and an offset, the equivalent of the relocation.
-
- -- : BFD_RELOC_MMIX_LOCAL
- This relocation is an assertion that the expression is not
- allocated as a global register. It does not modify contents.
-
- -- : BFD_RELOC_AVR_7_PCREL
- This is a 16 bit reloc for the AVR that stores 8 bit pc relative
- short offset into 7 bits.
-
- -- : BFD_RELOC_AVR_13_PCREL
- This is a 16 bit reloc for the AVR that stores 13 bit pc relative
- short offset into 12 bits.
-
- -- : BFD_RELOC_AVR_16_PM
- This is a 16 bit reloc for the AVR that stores 17 bit value
- (usually program memory address) into 16 bits.
-
- -- : BFD_RELOC_AVR_LO8_LDI
- This is a 16 bit reloc for the AVR that stores 8 bit value (usually
- data memory address) into 8 bit immediate value of LDI insn.
-
- -- : BFD_RELOC_AVR_HI8_LDI
- This is a 16 bit reloc for the AVR that stores 8 bit value (high 8
- bit of data memory address) into 8 bit immediate value of LDI insn.
-
- -- : BFD_RELOC_AVR_HH8_LDI
- This is a 16 bit reloc for the AVR that stores 8 bit value (most
- high 8 bit of program memory address) into 8 bit immediate value
- of LDI insn.
-
- -- : BFD_RELOC_AVR_MS8_LDI
- This is a 16 bit reloc for the AVR that stores 8 bit value (most
- high 8 bit of 32 bit value) into 8 bit immediate value of LDI insn.
-
- -- : BFD_RELOC_AVR_LO8_LDI_NEG
- This is a 16 bit reloc for the AVR that stores negated 8 bit value
- (usually data memory address) into 8 bit immediate value of SUBI
- insn.
-
- -- : BFD_RELOC_AVR_HI8_LDI_NEG
- This is a 16 bit reloc for the AVR that stores negated 8 bit value
- (high 8 bit of data memory address) into 8 bit immediate value of
- SUBI insn.
-
- -- : BFD_RELOC_AVR_HH8_LDI_NEG
- This is a 16 bit reloc for the AVR that stores negated 8 bit value
- (most high 8 bit of program memory address) into 8 bit immediate
- value of LDI or SUBI insn.
-
- -- : BFD_RELOC_AVR_MS8_LDI_NEG
- This is a 16 bit reloc for the AVR that stores negated 8 bit value
- (msb of 32 bit value) into 8 bit immediate value of LDI insn.
-
- -- : BFD_RELOC_AVR_LO8_LDI_PM
- This is a 16 bit reloc for the AVR that stores 8 bit value (usually
- command address) into 8 bit immediate value of LDI insn.
-
- -- : BFD_RELOC_AVR_LO8_LDI_GS
- This is a 16 bit reloc for the AVR that stores 8 bit value
- (command address) into 8 bit immediate value of LDI insn. If the
- address is beyond the 128k boundary, the linker inserts a jump
- stub for this reloc in the lower 128k.
-
- -- : BFD_RELOC_AVR_HI8_LDI_PM
- This is a 16 bit reloc for the AVR that stores 8 bit value (high 8
- bit of command address) into 8 bit immediate value of LDI insn.
-
- -- : BFD_RELOC_AVR_HI8_LDI_GS
- This is a 16 bit reloc for the AVR that stores 8 bit value (high 8
- bit of command address) into 8 bit immediate value of LDI insn.
- If the address is beyond the 128k boundary, the linker inserts a
- jump stub for this reloc below 128k.
-
- -- : BFD_RELOC_AVR_HH8_LDI_PM
- This is a 16 bit reloc for the AVR that stores 8 bit value (most
- high 8 bit of command address) into 8 bit immediate value of LDI
- insn.
-
- -- : BFD_RELOC_AVR_LO8_LDI_PM_NEG
- This is a 16 bit reloc for the AVR that stores negated 8 bit value
- (usually command address) into 8 bit immediate value of SUBI insn.
-
- -- : BFD_RELOC_AVR_HI8_LDI_PM_NEG
- This is a 16 bit reloc for the AVR that stores negated 8 bit value
- (high 8 bit of 16 bit command address) into 8 bit immediate value
- of SUBI insn.
-
- -- : BFD_RELOC_AVR_HH8_LDI_PM_NEG
- This is a 16 bit reloc for the AVR that stores negated 8 bit value
- (high 6 bit of 22 bit command address) into 8 bit immediate value
- of SUBI insn.
-
- -- : BFD_RELOC_AVR_CALL
- This is a 32 bit reloc for the AVR that stores 23 bit value into
- 22 bits.
-
- -- : BFD_RELOC_AVR_LDI
- This is a 16 bit reloc for the AVR that stores all needed bits for
- absolute addressing with ldi with overflow check to linktime
-
- -- : BFD_RELOC_AVR_6
- This is a 6 bit reloc for the AVR that stores offset for ldd/std
- instructions
-
- -- : BFD_RELOC_AVR_6_ADIW
- This is a 6 bit reloc for the AVR that stores offset for adiw/sbiw
- instructions
-
- -- : BFD_RELOC_AVR_8_LO
- This is a 8 bit reloc for the AVR that stores bits 0..7 of a symbol
- in .byte lo8(symbol)
-
- -- : BFD_RELOC_AVR_8_HI
- This is a 8 bit reloc for the AVR that stores bits 8..15 of a
- symbol in .byte hi8(symbol)
-
- -- : BFD_RELOC_AVR_8_HLO
- This is a 8 bit reloc for the AVR that stores bits 16..23 of a
- symbol in .byte hlo8(symbol)
-
- -- : BFD_RELOC_RL78_NEG8
- -- : BFD_RELOC_RL78_NEG16
- -- : BFD_RELOC_RL78_NEG24
- -- : BFD_RELOC_RL78_NEG32
- -- : BFD_RELOC_RL78_16_OP
- -- : BFD_RELOC_RL78_24_OP
- -- : BFD_RELOC_RL78_32_OP
- -- : BFD_RELOC_RL78_8U
- -- : BFD_RELOC_RL78_16U
- -- : BFD_RELOC_RL78_24U
- -- : BFD_RELOC_RL78_DIR3U_PCREL
- -- : BFD_RELOC_RL78_DIFF
- -- : BFD_RELOC_RL78_GPRELB
- -- : BFD_RELOC_RL78_GPRELW
- -- : BFD_RELOC_RL78_GPRELL
- -- : BFD_RELOC_RL78_SYM
- -- : BFD_RELOC_RL78_OP_SUBTRACT
- -- : BFD_RELOC_RL78_OP_NEG
- -- : BFD_RELOC_RL78_OP_AND
- -- : BFD_RELOC_RL78_OP_SHRA
- -- : BFD_RELOC_RL78_ABS8
- -- : BFD_RELOC_RL78_ABS16
- -- : BFD_RELOC_RL78_ABS16_REV
- -- : BFD_RELOC_RL78_ABS32
- -- : BFD_RELOC_RL78_ABS32_REV
- -- : BFD_RELOC_RL78_ABS16U
- -- : BFD_RELOC_RL78_ABS16UW
- -- : BFD_RELOC_RL78_ABS16UL
- -- : BFD_RELOC_RL78_RELAX
- -- : BFD_RELOC_RL78_HI16
- -- : BFD_RELOC_RL78_HI8
- -- : BFD_RELOC_RL78_LO16
- -- : BFD_RELOC_RL78_CODE
- Renesas RL78 Relocations.
-
- -- : BFD_RELOC_RX_NEG8
- -- : BFD_RELOC_RX_NEG16
- -- : BFD_RELOC_RX_NEG24
- -- : BFD_RELOC_RX_NEG32
- -- : BFD_RELOC_RX_16_OP
- -- : BFD_RELOC_RX_24_OP
- -- : BFD_RELOC_RX_32_OP
- -- : BFD_RELOC_RX_8U
- -- : BFD_RELOC_RX_16U
- -- : BFD_RELOC_RX_24U
- -- : BFD_RELOC_RX_DIR3U_PCREL
- -- : BFD_RELOC_RX_DIFF
- -- : BFD_RELOC_RX_GPRELB
- -- : BFD_RELOC_RX_GPRELW
- -- : BFD_RELOC_RX_GPRELL
- -- : BFD_RELOC_RX_SYM
- -- : BFD_RELOC_RX_OP_SUBTRACT
- -- : BFD_RELOC_RX_OP_NEG
- -- : BFD_RELOC_RX_ABS8
- -- : BFD_RELOC_RX_ABS16
- -- : BFD_RELOC_RX_ABS16_REV
- -- : BFD_RELOC_RX_ABS32
- -- : BFD_RELOC_RX_ABS32_REV
- -- : BFD_RELOC_RX_ABS16U
- -- : BFD_RELOC_RX_ABS16UW
- -- : BFD_RELOC_RX_ABS16UL
- -- : BFD_RELOC_RX_RELAX
- Renesas RX Relocations.
-
- -- : BFD_RELOC_390_12
- Direct 12 bit.
-
- -- : BFD_RELOC_390_GOT12
- 12 bit GOT offset.
-
- -- : BFD_RELOC_390_PLT32
- 32 bit PC relative PLT address.
-
- -- : BFD_RELOC_390_COPY
- Copy symbol at runtime.
-
- -- : BFD_RELOC_390_GLOB_DAT
- Create GOT entry.
-
- -- : BFD_RELOC_390_JMP_SLOT
- Create PLT entry.
-
- -- : BFD_RELOC_390_RELATIVE
- Adjust by program base.
-
- -- : BFD_RELOC_390_GOTPC
- 32 bit PC relative offset to GOT.
-
- -- : BFD_RELOC_390_GOT16
- 16 bit GOT offset.
-
- -- : BFD_RELOC_390_PC12DBL
- PC relative 12 bit shifted by 1.
-
- -- : BFD_RELOC_390_PLT12DBL
- 12 bit PC rel. PLT shifted by 1.
-
- -- : BFD_RELOC_390_PC16DBL
- PC relative 16 bit shifted by 1.
-
- -- : BFD_RELOC_390_PLT16DBL
- 16 bit PC rel. PLT shifted by 1.
-
- -- : BFD_RELOC_390_PC24DBL
- PC relative 24 bit shifted by 1.
-
- -- : BFD_RELOC_390_PLT24DBL
- 24 bit PC rel. PLT shifted by 1.
-
- -- : BFD_RELOC_390_PC32DBL
- PC relative 32 bit shifted by 1.
-
- -- : BFD_RELOC_390_PLT32DBL
- 32 bit PC rel. PLT shifted by 1.
-
- -- : BFD_RELOC_390_GOTPCDBL
- 32 bit PC rel. GOT shifted by 1.
-
- -- : BFD_RELOC_390_GOT64
- 64 bit GOT offset.
-
- -- : BFD_RELOC_390_PLT64
- 64 bit PC relative PLT address.
-
- -- : BFD_RELOC_390_GOTENT
- 32 bit rel. offset to GOT entry.
-
- -- : BFD_RELOC_390_GOTOFF64
- 64 bit offset to GOT.
-
- -- : BFD_RELOC_390_GOTPLT12
- 12-bit offset to symbol-entry within GOT, with PLT handling.
-
- -- : BFD_RELOC_390_GOTPLT16
- 16-bit offset to symbol-entry within GOT, with PLT handling.
-
- -- : BFD_RELOC_390_GOTPLT32
- 32-bit offset to symbol-entry within GOT, with PLT handling.
-
- -- : BFD_RELOC_390_GOTPLT64
- 64-bit offset to symbol-entry within GOT, with PLT handling.
-
- -- : BFD_RELOC_390_GOTPLTENT
- 32-bit rel. offset to symbol-entry within GOT, with PLT handling.
-
- -- : BFD_RELOC_390_PLTOFF16
- 16-bit rel. offset from the GOT to a PLT entry.
-
- -- : BFD_RELOC_390_PLTOFF32
- 32-bit rel. offset from the GOT to a PLT entry.
-
- -- : BFD_RELOC_390_PLTOFF64
- 64-bit rel. offset from the GOT to a PLT entry.
-
- -- : BFD_RELOC_390_TLS_LOAD
- -- : BFD_RELOC_390_TLS_GDCALL
- -- : BFD_RELOC_390_TLS_LDCALL
- -- : BFD_RELOC_390_TLS_GD32
- -- : BFD_RELOC_390_TLS_GD64
- -- : BFD_RELOC_390_TLS_GOTIE12
- -- : BFD_RELOC_390_TLS_GOTIE32
- -- : BFD_RELOC_390_TLS_GOTIE64
- -- : BFD_RELOC_390_TLS_LDM32
- -- : BFD_RELOC_390_TLS_LDM64
- -- : BFD_RELOC_390_TLS_IE32
- -- : BFD_RELOC_390_TLS_IE64
- -- : BFD_RELOC_390_TLS_IEENT
- -- : BFD_RELOC_390_TLS_LE32
- -- : BFD_RELOC_390_TLS_LE64
- -- : BFD_RELOC_390_TLS_LDO32
- -- : BFD_RELOC_390_TLS_LDO64
- -- : BFD_RELOC_390_TLS_DTPMOD
- -- : BFD_RELOC_390_TLS_DTPOFF
- -- : BFD_RELOC_390_TLS_TPOFF
- s390 tls relocations.
-
- -- : BFD_RELOC_390_20
- -- : BFD_RELOC_390_GOT20
- -- : BFD_RELOC_390_GOTPLT20
- -- : BFD_RELOC_390_TLS_GOTIE20
- Long displacement extension.
-
- -- : BFD_RELOC_390_IRELATIVE
- STT_GNU_IFUNC relocation.
-
- -- : BFD_RELOC_SCORE_GPREL15
- Score relocations Low 16 bit for load/store
-
- -- : BFD_RELOC_SCORE_DUMMY2
- -- : BFD_RELOC_SCORE_JMP
- This is a 24-bit reloc with the right 1 bit assumed to be 0
-
- -- : BFD_RELOC_SCORE_BRANCH
- This is a 19-bit reloc with the right 1 bit assumed to be 0
-
- -- : BFD_RELOC_SCORE_IMM30
- This is a 32-bit reloc for 48-bit instructions.
-
- -- : BFD_RELOC_SCORE_IMM32
- This is a 32-bit reloc for 48-bit instructions.
-
- -- : BFD_RELOC_SCORE16_JMP
- This is a 11-bit reloc with the right 1 bit assumed to be 0
-
- -- : BFD_RELOC_SCORE16_BRANCH
- This is a 8-bit reloc with the right 1 bit assumed to be 0
-
- -- : BFD_RELOC_SCORE_BCMP
- This is a 9-bit reloc with the right 1 bit assumed to be 0
-
- -- : BFD_RELOC_SCORE_GOT15
- -- : BFD_RELOC_SCORE_GOT_LO16
- -- : BFD_RELOC_SCORE_CALL15
- -- : BFD_RELOC_SCORE_DUMMY_HI16
- Undocumented Score relocs
-
- -- : BFD_RELOC_IP2K_FR9
- Scenix IP2K - 9-bit register number / data address
-
- -- : BFD_RELOC_IP2K_BANK
- Scenix IP2K - 4-bit register/data bank number
-
- -- : BFD_RELOC_IP2K_ADDR16CJP
- Scenix IP2K - low 13 bits of instruction word address
-
- -- : BFD_RELOC_IP2K_PAGE3
- Scenix IP2K - high 3 bits of instruction word address
-
- -- : BFD_RELOC_IP2K_LO8DATA
- -- : BFD_RELOC_IP2K_HI8DATA
- -- : BFD_RELOC_IP2K_EX8DATA
- Scenix IP2K - ext/low/high 8 bits of data address
-
- -- : BFD_RELOC_IP2K_LO8INSN
- -- : BFD_RELOC_IP2K_HI8INSN
- Scenix IP2K - low/high 8 bits of instruction word address
-
- -- : BFD_RELOC_IP2K_PC_SKIP
- Scenix IP2K - even/odd PC modifier to modify snb pcl.0
-
- -- : BFD_RELOC_IP2K_TEXT
- Scenix IP2K - 16 bit word address in text section.
-
- -- : BFD_RELOC_IP2K_FR_OFFSET
- Scenix IP2K - 7-bit sp or dp offset
-
- -- : BFD_RELOC_VPE4KMATH_DATA
- -- : BFD_RELOC_VPE4KMATH_INSN
- Scenix VPE4K coprocessor - data/insn-space addressing
-
- -- : BFD_RELOC_VTABLE_INHERIT
- -- : BFD_RELOC_VTABLE_ENTRY
- These two relocations are used by the linker to determine which of
- the entries in a C++ virtual function table are actually used.
- When the -gc-sections option is given, the linker will zero out
- the entries that are not used, so that the code for those
- functions need not be included in the output.
-
- VTABLE_INHERIT is a zero-space relocation used to describe to the
- linker the inheritance tree of a C++ virtual function table. The
- relocation's symbol should be the parent class' vtable, and the
- relocation should be located at the child vtable.
-
- VTABLE_ENTRY is a zero-space relocation that describes the use of a
- virtual function table entry. The reloc's symbol should refer to
- the table of the class mentioned in the code. Off of that base,
- an offset describes the entry that is being used. For Rela hosts,
- this offset is stored in the reloc's addend. For Rel hosts, we
- are forced to put this offset in the reloc's section offset.
-
- -- : BFD_RELOC_IA64_IMM14
- -- : BFD_RELOC_IA64_IMM22
- -- : BFD_RELOC_IA64_IMM64
- -- : BFD_RELOC_IA64_DIR32MSB
- -- : BFD_RELOC_IA64_DIR32LSB
- -- : BFD_RELOC_IA64_DIR64MSB
- -- : BFD_RELOC_IA64_DIR64LSB
- -- : BFD_RELOC_IA64_GPREL22
- -- : BFD_RELOC_IA64_GPREL64I
- -- : BFD_RELOC_IA64_GPREL32MSB
- -- : BFD_RELOC_IA64_GPREL32LSB
- -- : BFD_RELOC_IA64_GPREL64MSB
- -- : BFD_RELOC_IA64_GPREL64LSB
- -- : BFD_RELOC_IA64_LTOFF22
- -- : BFD_RELOC_IA64_LTOFF64I
- -- : BFD_RELOC_IA64_PLTOFF22
- -- : BFD_RELOC_IA64_PLTOFF64I
- -- : BFD_RELOC_IA64_PLTOFF64MSB
- -- : BFD_RELOC_IA64_PLTOFF64LSB
- -- : BFD_RELOC_IA64_FPTR64I
- -- : BFD_RELOC_IA64_FPTR32MSB
- -- : BFD_RELOC_IA64_FPTR32LSB
- -- : BFD_RELOC_IA64_FPTR64MSB
- -- : BFD_RELOC_IA64_FPTR64LSB
- -- : BFD_RELOC_IA64_PCREL21B
- -- : BFD_RELOC_IA64_PCREL21BI
- -- : BFD_RELOC_IA64_PCREL21M
- -- : BFD_RELOC_IA64_PCREL21F
- -- : BFD_RELOC_IA64_PCREL22
- -- : BFD_RELOC_IA64_PCREL60B
- -- : BFD_RELOC_IA64_PCREL64I
- -- : BFD_RELOC_IA64_PCREL32MSB
- -- : BFD_RELOC_IA64_PCREL32LSB
- -- : BFD_RELOC_IA64_PCREL64MSB
- -- : BFD_RELOC_IA64_PCREL64LSB
- -- : BFD_RELOC_IA64_LTOFF_FPTR22
- -- : BFD_RELOC_IA64_LTOFF_FPTR64I
- -- : BFD_RELOC_IA64_LTOFF_FPTR32MSB
- -- : BFD_RELOC_IA64_LTOFF_FPTR32LSB
- -- : BFD_RELOC_IA64_LTOFF_FPTR64MSB
- -- : BFD_RELOC_IA64_LTOFF_FPTR64LSB
- -- : BFD_RELOC_IA64_SEGREL32MSB
- -- : BFD_RELOC_IA64_SEGREL32LSB
- -- : BFD_RELOC_IA64_SEGREL64MSB
- -- : BFD_RELOC_IA64_SEGREL64LSB
- -- : BFD_RELOC_IA64_SECREL32MSB
- -- : BFD_RELOC_IA64_SECREL32LSB
- -- : BFD_RELOC_IA64_SECREL64MSB
- -- : BFD_RELOC_IA64_SECREL64LSB
- -- : BFD_RELOC_IA64_REL32MSB
- -- : BFD_RELOC_IA64_REL32LSB
- -- : BFD_RELOC_IA64_REL64MSB
- -- : BFD_RELOC_IA64_REL64LSB
- -- : BFD_RELOC_IA64_LTV32MSB
- -- : BFD_RELOC_IA64_LTV32LSB
- -- : BFD_RELOC_IA64_LTV64MSB
- -- : BFD_RELOC_IA64_LTV64LSB
- -- : BFD_RELOC_IA64_IPLTMSB
- -- : BFD_RELOC_IA64_IPLTLSB
- -- : BFD_RELOC_IA64_COPY
- -- : BFD_RELOC_IA64_LTOFF22X
- -- : BFD_RELOC_IA64_LDXMOV
- -- : BFD_RELOC_IA64_TPREL14
- -- : BFD_RELOC_IA64_TPREL22
- -- : BFD_RELOC_IA64_TPREL64I
- -- : BFD_RELOC_IA64_TPREL64MSB
- -- : BFD_RELOC_IA64_TPREL64LSB
- -- : BFD_RELOC_IA64_LTOFF_TPREL22
- -- : BFD_RELOC_IA64_DTPMOD64MSB
- -- : BFD_RELOC_IA64_DTPMOD64LSB
- -- : BFD_RELOC_IA64_LTOFF_DTPMOD22
- -- : BFD_RELOC_IA64_DTPREL14
- -- : BFD_RELOC_IA64_DTPREL22
- -- : BFD_RELOC_IA64_DTPREL64I
- -- : BFD_RELOC_IA64_DTPREL32MSB
- -- : BFD_RELOC_IA64_DTPREL32LSB
- -- : BFD_RELOC_IA64_DTPREL64MSB
- -- : BFD_RELOC_IA64_DTPREL64LSB
- -- : BFD_RELOC_IA64_LTOFF_DTPREL22
- Intel IA64 Relocations.
-
- -- : BFD_RELOC_M68HC11_HI8
- Motorola 68HC11 reloc. This is the 8 bit high part of an absolute
- address.
-
- -- : BFD_RELOC_M68HC11_LO8
- Motorola 68HC11 reloc. This is the 8 bit low part of an absolute
- address.
-
- -- : BFD_RELOC_M68HC11_3B
- Motorola 68HC11 reloc. This is the 3 bit of a value.
-
- -- : BFD_RELOC_M68HC11_RL_JUMP
- Motorola 68HC11 reloc. This reloc marks the beginning of a
- jump/call instruction. It is used for linker relaxation to
- correctly identify beginning of instruction and change some
- branches to use PC-relative addressing mode.
-
- -- : BFD_RELOC_M68HC11_RL_GROUP
- Motorola 68HC11 reloc. This reloc marks a group of several
- instructions that gcc generates and for which the linker
- relaxation pass can modify and/or remove some of them.
-
- -- : BFD_RELOC_M68HC11_LO16
- Motorola 68HC11 reloc. This is the 16-bit lower part of an
- address. It is used for 'call' instruction to specify the symbol
- address without any special transformation (due to memory bank
- window).
-
- -- : BFD_RELOC_M68HC11_PAGE
- Motorola 68HC11 reloc. This is a 8-bit reloc that specifies the
- page number of an address. It is used by 'call' instruction to
- specify the page number of the symbol.
-
- -- : BFD_RELOC_M68HC11_24
- Motorola 68HC11 reloc. This is a 24-bit reloc that represents the
- address with a 16-bit value and a 8-bit page number. The symbol
- address is transformed to follow the 16K memory bank of 68HC12
- (seen as mapped in the window).
-
- -- : BFD_RELOC_M68HC12_5B
- Motorola 68HC12 reloc. This is the 5 bits of a value.
-
- -- : BFD_RELOC_XGATE_RL_JUMP
- Freescale XGATE reloc. This reloc marks the beginning of a
- bra/jal instruction.
-
- -- : BFD_RELOC_XGATE_RL_GROUP
- Freescale XGATE reloc. This reloc marks a group of several
- instructions that gcc generates and for which the linker
- relaxation pass can modify and/or remove some of them.
-
- -- : BFD_RELOC_XGATE_LO16
- Freescale XGATE reloc. This is the 16-bit lower part of an
- address. It is used for the '16-bit' instructions.
-
- -- : BFD_RELOC_XGATE_GPAGE
- Freescale XGATE reloc.
-
- -- : BFD_RELOC_XGATE_24
- Freescale XGATE reloc.
-
- -- : BFD_RELOC_XGATE_PCREL_9
- Freescale XGATE reloc. This is a 9-bit pc-relative reloc.
-
- -- : BFD_RELOC_XGATE_PCREL_10
- Freescale XGATE reloc. This is a 10-bit pc-relative reloc.
-
- -- : BFD_RELOC_XGATE_IMM8_LO
- Freescale XGATE reloc. This is the 16-bit lower part of an
- address. It is used for the '16-bit' instructions.
-
- -- : BFD_RELOC_XGATE_IMM8_HI
- Freescale XGATE reloc. This is the 16-bit higher part of an
- address. It is used for the '16-bit' instructions.
-
- -- : BFD_RELOC_XGATE_IMM3
- Freescale XGATE reloc. This is a 3-bit pc-relative reloc.
-
- -- : BFD_RELOC_XGATE_IMM4
- Freescale XGATE reloc. This is a 4-bit pc-relative reloc.
-
- -- : BFD_RELOC_XGATE_IMM5
- Freescale XGATE reloc. This is a 5-bit pc-relative reloc.
-
- -- : BFD_RELOC_M68HC12_9B
- Motorola 68HC12 reloc. This is the 9 bits of a value.
-
- -- : BFD_RELOC_M68HC12_16B
- Motorola 68HC12 reloc. This is the 16 bits of a value.
-
- -- : BFD_RELOC_M68HC12_9_PCREL
- Motorola 68HC12/XGATE reloc. This is a PCREL9 branch.
-
- -- : BFD_RELOC_M68HC12_10_PCREL
- Motorola 68HC12/XGATE reloc. This is a PCREL10 branch.
-
- -- : BFD_RELOC_M68HC12_LO8XG
- Motorola 68HC12/XGATE reloc. This is the 8 bit low part of an
- absolute address and immediately precedes a matching HI8XG part.
-
- -- : BFD_RELOC_M68HC12_HI8XG
- Motorola 68HC12/XGATE reloc. This is the 8 bit high part of an
- absolute address and immediately follows a matching LO8XG part.
-
- -- : BFD_RELOC_16C_NUM08
- -- : BFD_RELOC_16C_NUM08_C
- -- : BFD_RELOC_16C_NUM16
- -- : BFD_RELOC_16C_NUM16_C
- -- : BFD_RELOC_16C_NUM32
- -- : BFD_RELOC_16C_NUM32_C
- -- : BFD_RELOC_16C_DISP04
- -- : BFD_RELOC_16C_DISP04_C
- -- : BFD_RELOC_16C_DISP08
- -- : BFD_RELOC_16C_DISP08_C
- -- : BFD_RELOC_16C_DISP16
- -- : BFD_RELOC_16C_DISP16_C
- -- : BFD_RELOC_16C_DISP24
- -- : BFD_RELOC_16C_DISP24_C
- -- : BFD_RELOC_16C_DISP24a
- -- : BFD_RELOC_16C_DISP24a_C
- -- : BFD_RELOC_16C_REG04
- -- : BFD_RELOC_16C_REG04_C
- -- : BFD_RELOC_16C_REG04a
- -- : BFD_RELOC_16C_REG04a_C
- -- : BFD_RELOC_16C_REG14
- -- : BFD_RELOC_16C_REG14_C
- -- : BFD_RELOC_16C_REG16
- -- : BFD_RELOC_16C_REG16_C
- -- : BFD_RELOC_16C_REG20
- -- : BFD_RELOC_16C_REG20_C
- -- : BFD_RELOC_16C_ABS20
- -- : BFD_RELOC_16C_ABS20_C
- -- : BFD_RELOC_16C_ABS24
- -- : BFD_RELOC_16C_ABS24_C
- -- : BFD_RELOC_16C_IMM04
- -- : BFD_RELOC_16C_IMM04_C
- -- : BFD_RELOC_16C_IMM16
- -- : BFD_RELOC_16C_IMM16_C
- -- : BFD_RELOC_16C_IMM20
- -- : BFD_RELOC_16C_IMM20_C
- -- : BFD_RELOC_16C_IMM24
- -- : BFD_RELOC_16C_IMM24_C
- -- : BFD_RELOC_16C_IMM32
- -- : BFD_RELOC_16C_IMM32_C
- NS CR16C Relocations.
-
- -- : BFD_RELOC_CR16_NUM8
- -- : BFD_RELOC_CR16_NUM16
- -- : BFD_RELOC_CR16_NUM32
- -- : BFD_RELOC_CR16_NUM32a
- -- : BFD_RELOC_CR16_REGREL0
- -- : BFD_RELOC_CR16_REGREL4
- -- : BFD_RELOC_CR16_REGREL4a
- -- : BFD_RELOC_CR16_REGREL14
- -- : BFD_RELOC_CR16_REGREL14a
- -- : BFD_RELOC_CR16_REGREL16
- -- : BFD_RELOC_CR16_REGREL20
- -- : BFD_RELOC_CR16_REGREL20a
- -- : BFD_RELOC_CR16_ABS20
- -- : BFD_RELOC_CR16_ABS24
- -- : BFD_RELOC_CR16_IMM4
- -- : BFD_RELOC_CR16_IMM8
- -- : BFD_RELOC_CR16_IMM16
- -- : BFD_RELOC_CR16_IMM20
- -- : BFD_RELOC_CR16_IMM24
- -- : BFD_RELOC_CR16_IMM32
- -- : BFD_RELOC_CR16_IMM32a
- -- : BFD_RELOC_CR16_DISP4
- -- : BFD_RELOC_CR16_DISP8
- -- : BFD_RELOC_CR16_DISP16
- -- : BFD_RELOC_CR16_DISP20
- -- : BFD_RELOC_CR16_DISP24
- -- : BFD_RELOC_CR16_DISP24a
- -- : BFD_RELOC_CR16_SWITCH8
- -- : BFD_RELOC_CR16_SWITCH16
- -- : BFD_RELOC_CR16_SWITCH32
- -- : BFD_RELOC_CR16_GOT_REGREL20
- -- : BFD_RELOC_CR16_GOTC_REGREL20
- -- : BFD_RELOC_CR16_GLOB_DAT
- NS CR16 Relocations.
-
- -- : BFD_RELOC_CRX_REL4
- -- : BFD_RELOC_CRX_REL8
- -- : BFD_RELOC_CRX_REL8_CMP
- -- : BFD_RELOC_CRX_REL16
- -- : BFD_RELOC_CRX_REL24
- -- : BFD_RELOC_CRX_REL32
- -- : BFD_RELOC_CRX_REGREL12
- -- : BFD_RELOC_CRX_REGREL22
- -- : BFD_RELOC_CRX_REGREL28
- -- : BFD_RELOC_CRX_REGREL32
- -- : BFD_RELOC_CRX_ABS16
- -- : BFD_RELOC_CRX_ABS32
- -- : BFD_RELOC_CRX_NUM8
- -- : BFD_RELOC_CRX_NUM16
- -- : BFD_RELOC_CRX_NUM32
- -- : BFD_RELOC_CRX_IMM16
- -- : BFD_RELOC_CRX_IMM32
- -- : BFD_RELOC_CRX_SWITCH8
- -- : BFD_RELOC_CRX_SWITCH16
- -- : BFD_RELOC_CRX_SWITCH32
- NS CRX Relocations.
-
- -- : BFD_RELOC_CRIS_BDISP8
- -- : BFD_RELOC_CRIS_UNSIGNED_5
- -- : BFD_RELOC_CRIS_SIGNED_6
- -- : BFD_RELOC_CRIS_UNSIGNED_6
- -- : BFD_RELOC_CRIS_SIGNED_8
- -- : BFD_RELOC_CRIS_UNSIGNED_8
- -- : BFD_RELOC_CRIS_SIGNED_16
- -- : BFD_RELOC_CRIS_UNSIGNED_16
- -- : BFD_RELOC_CRIS_LAPCQ_OFFSET
- -- : BFD_RELOC_CRIS_UNSIGNED_4
- These relocs are only used within the CRIS assembler. They are not
- (at present) written to any object files.
-
- -- : BFD_RELOC_CRIS_COPY
- -- : BFD_RELOC_CRIS_GLOB_DAT
- -- : BFD_RELOC_CRIS_JUMP_SLOT
- -- : BFD_RELOC_CRIS_RELATIVE
- Relocs used in ELF shared libraries for CRIS.
-
- -- : BFD_RELOC_CRIS_32_GOT
- 32-bit offset to symbol-entry within GOT.
-
- -- : BFD_RELOC_CRIS_16_GOT
- 16-bit offset to symbol-entry within GOT.
-
- -- : BFD_RELOC_CRIS_32_GOTPLT
- 32-bit offset to symbol-entry within GOT, with PLT handling.
-
- -- : BFD_RELOC_CRIS_16_GOTPLT
- 16-bit offset to symbol-entry within GOT, with PLT handling.
-
- -- : BFD_RELOC_CRIS_32_GOTREL
- 32-bit offset to symbol, relative to GOT.
-
- -- : BFD_RELOC_CRIS_32_PLT_GOTREL
- 32-bit offset to symbol with PLT entry, relative to GOT.
-
- -- : BFD_RELOC_CRIS_32_PLT_PCREL
- 32-bit offset to symbol with PLT entry, relative to this
- relocation.
-
- -- : BFD_RELOC_CRIS_32_GOT_GD
- -- : BFD_RELOC_CRIS_16_GOT_GD
- -- : BFD_RELOC_CRIS_32_GD
- -- : BFD_RELOC_CRIS_DTP
- -- : BFD_RELOC_CRIS_32_DTPREL
- -- : BFD_RELOC_CRIS_16_DTPREL
- -- : BFD_RELOC_CRIS_32_GOT_TPREL
- -- : BFD_RELOC_CRIS_16_GOT_TPREL
- -- : BFD_RELOC_CRIS_32_TPREL
- -- : BFD_RELOC_CRIS_16_TPREL
- -- : BFD_RELOC_CRIS_DTPMOD
- -- : BFD_RELOC_CRIS_32_IE
- Relocs used in TLS code for CRIS.
-
- -- : BFD_RELOC_860_COPY
- -- : BFD_RELOC_860_GLOB_DAT
- -- : BFD_RELOC_860_JUMP_SLOT
- -- : BFD_RELOC_860_RELATIVE
- -- : BFD_RELOC_860_PC26
- -- : BFD_RELOC_860_PLT26
- -- : BFD_RELOC_860_PC16
- -- : BFD_RELOC_860_LOW0
- -- : BFD_RELOC_860_SPLIT0
- -- : BFD_RELOC_860_LOW1
- -- : BFD_RELOC_860_SPLIT1
- -- : BFD_RELOC_860_LOW2
- -- : BFD_RELOC_860_SPLIT2
- -- : BFD_RELOC_860_LOW3
- -- : BFD_RELOC_860_LOGOT0
- -- : BFD_RELOC_860_SPGOT0
- -- : BFD_RELOC_860_LOGOT1
- -- : BFD_RELOC_860_SPGOT1
- -- : BFD_RELOC_860_LOGOTOFF0
- -- : BFD_RELOC_860_SPGOTOFF0
- -- : BFD_RELOC_860_LOGOTOFF1
- -- : BFD_RELOC_860_SPGOTOFF1
- -- : BFD_RELOC_860_LOGOTOFF2
- -- : BFD_RELOC_860_LOGOTOFF3
- -- : BFD_RELOC_860_LOPC
- -- : BFD_RELOC_860_HIGHADJ
- -- : BFD_RELOC_860_HAGOT
- -- : BFD_RELOC_860_HAGOTOFF
- -- : BFD_RELOC_860_HAPC
- -- : BFD_RELOC_860_HIGH
- -- : BFD_RELOC_860_HIGOT
- -- : BFD_RELOC_860_HIGOTOFF
- Intel i860 Relocations.
-
- -- : BFD_RELOC_OPENRISC_ABS_26
- -- : BFD_RELOC_OPENRISC_REL_26
- OpenRISC Relocations.
-
- -- : BFD_RELOC_H8_DIR16A8
- -- : BFD_RELOC_H8_DIR16R8
- -- : BFD_RELOC_H8_DIR24A8
- -- : BFD_RELOC_H8_DIR24R8
- -- : BFD_RELOC_H8_DIR32A16
- -- : BFD_RELOC_H8_DISP32A16
- H8 elf Relocations.
-
- -- : BFD_RELOC_XSTORMY16_REL_12
- -- : BFD_RELOC_XSTORMY16_12
- -- : BFD_RELOC_XSTORMY16_24
- -- : BFD_RELOC_XSTORMY16_FPTR16
- Sony Xstormy16 Relocations.
-
- -- : BFD_RELOC_RELC
- Self-describing complex relocations.
-
- -- : BFD_RELOC_XC16X_PAG
- -- : BFD_RELOC_XC16X_POF
- -- : BFD_RELOC_XC16X_SEG
- -- : BFD_RELOC_XC16X_SOF
- Infineon Relocations.
-
- -- : BFD_RELOC_VAX_GLOB_DAT
- -- : BFD_RELOC_VAX_JMP_SLOT
- -- : BFD_RELOC_VAX_RELATIVE
- Relocations used by VAX ELF.
-
- -- : BFD_RELOC_MT_PC16
- Morpho MT - 16 bit immediate relocation.
-
- -- : BFD_RELOC_MT_HI16
- Morpho MT - Hi 16 bits of an address.
-
- -- : BFD_RELOC_MT_LO16
- Morpho MT - Low 16 bits of an address.
-
- -- : BFD_RELOC_MT_GNU_VTINHERIT
- Morpho MT - Used to tell the linker which vtable entries are used.
-
- -- : BFD_RELOC_MT_GNU_VTENTRY
- Morpho MT - Used to tell the linker which vtable entries are used.
-
- -- : BFD_RELOC_MT_PCINSN8
- Morpho MT - 8 bit immediate relocation.
-
- -- : BFD_RELOC_MSP430_10_PCREL
- -- : BFD_RELOC_MSP430_16_PCREL
- -- : BFD_RELOC_MSP430_16
- -- : BFD_RELOC_MSP430_16_PCREL_BYTE
- -- : BFD_RELOC_MSP430_16_BYTE
- -- : BFD_RELOC_MSP430_2X_PCREL
- -- : BFD_RELOC_MSP430_RL_PCREL
- -- : BFD_RELOC_MSP430_ABS8
- -- : BFD_RELOC_MSP430X_PCR20_EXT_SRC
- -- : BFD_RELOC_MSP430X_PCR20_EXT_DST
- -- : BFD_RELOC_MSP430X_PCR20_EXT_ODST
- -- : BFD_RELOC_MSP430X_ABS20_EXT_SRC
- -- : BFD_RELOC_MSP430X_ABS20_EXT_DST
- -- : BFD_RELOC_MSP430X_ABS20_EXT_ODST
- -- : BFD_RELOC_MSP430X_ABS20_ADR_SRC
- -- : BFD_RELOC_MSP430X_ABS20_ADR_DST
- -- : BFD_RELOC_MSP430X_PCR16
- -- : BFD_RELOC_MSP430X_PCR20_CALL
- -- : BFD_RELOC_MSP430X_ABS16
- -- : BFD_RELOC_MSP430_ABS_HI16
- -- : BFD_RELOC_MSP430_PREL31
- -- : BFD_RELOC_MSP430_SYM_DIFF
- msp430 specific relocation codes
-
- -- : BFD_RELOC_NIOS2_S16
- -- : BFD_RELOC_NIOS2_U16
- -- : BFD_RELOC_NIOS2_CALL26
- -- : BFD_RELOC_NIOS2_IMM5
- -- : BFD_RELOC_NIOS2_CACHE_OPX
- -- : BFD_RELOC_NIOS2_IMM6
- -- : BFD_RELOC_NIOS2_IMM8
- -- : BFD_RELOC_NIOS2_HI16
- -- : BFD_RELOC_NIOS2_LO16
- -- : BFD_RELOC_NIOS2_HIADJ16
- -- : BFD_RELOC_NIOS2_GPREL
- -- : BFD_RELOC_NIOS2_UJMP
- -- : BFD_RELOC_NIOS2_CJMP
- -- : BFD_RELOC_NIOS2_CALLR
- -- : BFD_RELOC_NIOS2_ALIGN
- -- : BFD_RELOC_NIOS2_GOT16
- -- : BFD_RELOC_NIOS2_CALL16
- -- : BFD_RELOC_NIOS2_GOTOFF_LO
- -- : BFD_RELOC_NIOS2_GOTOFF_HA
- -- : BFD_RELOC_NIOS2_PCREL_LO
- -- : BFD_RELOC_NIOS2_PCREL_HA
- -- : BFD_RELOC_NIOS2_TLS_GD16
- -- : BFD_RELOC_NIOS2_TLS_LDM16
- -- : BFD_RELOC_NIOS2_TLS_LDO16
- -- : BFD_RELOC_NIOS2_TLS_IE16
- -- : BFD_RELOC_NIOS2_TLS_LE16
- -- : BFD_RELOC_NIOS2_TLS_DTPMOD
- -- : BFD_RELOC_NIOS2_TLS_DTPREL
- -- : BFD_RELOC_NIOS2_TLS_TPREL
- -- : BFD_RELOC_NIOS2_COPY
- -- : BFD_RELOC_NIOS2_GLOB_DAT
- -- : BFD_RELOC_NIOS2_JUMP_SLOT
- -- : BFD_RELOC_NIOS2_RELATIVE
- -- : BFD_RELOC_NIOS2_GOTOFF
- Relocations used by the Altera Nios II core.
-
- -- : BFD_RELOC_IQ2000_OFFSET_16
- -- : BFD_RELOC_IQ2000_OFFSET_21
- -- : BFD_RELOC_IQ2000_UHI16
- IQ2000 Relocations.
-
- -- : BFD_RELOC_XTENSA_RTLD
- Special Xtensa relocation used only by PLT entries in ELF shared
- objects to indicate that the runtime linker should set the value
- to one of its own internal functions or data structures.
-
- -- : BFD_RELOC_XTENSA_GLOB_DAT
- -- : BFD_RELOC_XTENSA_JMP_SLOT
- -- : BFD_RELOC_XTENSA_RELATIVE
- Xtensa relocations for ELF shared objects.
-
- -- : BFD_RELOC_XTENSA_PLT
- Xtensa relocation used in ELF object files for symbols that may
- require PLT entries. Otherwise, this is just a generic 32-bit
- relocation.
-
- -- : BFD_RELOC_XTENSA_DIFF8
- -- : BFD_RELOC_XTENSA_DIFF16
- -- : BFD_RELOC_XTENSA_DIFF32
- Xtensa relocations to mark the difference of two local symbols.
- These are only needed to support linker relaxation and can be
- ignored when not relaxing. The field is set to the value of the
- difference assuming no relaxation. The relocation encodes the
- position of the first symbol so the linker can determine whether
- to adjust the field value.
-
- -- : BFD_RELOC_XTENSA_SLOT0_OP
- -- : BFD_RELOC_XTENSA_SLOT1_OP
- -- : BFD_RELOC_XTENSA_SLOT2_OP
- -- : BFD_RELOC_XTENSA_SLOT3_OP
- -- : BFD_RELOC_XTENSA_SLOT4_OP
- -- : BFD_RELOC_XTENSA_SLOT5_OP
- -- : BFD_RELOC_XTENSA_SLOT6_OP
- -- : BFD_RELOC_XTENSA_SLOT7_OP
- -- : BFD_RELOC_XTENSA_SLOT8_OP
- -- : BFD_RELOC_XTENSA_SLOT9_OP
- -- : BFD_RELOC_XTENSA_SLOT10_OP
- -- : BFD_RELOC_XTENSA_SLOT11_OP
- -- : BFD_RELOC_XTENSA_SLOT12_OP
- -- : BFD_RELOC_XTENSA_SLOT13_OP
- -- : BFD_RELOC_XTENSA_SLOT14_OP
- Generic Xtensa relocations for instruction operands. Only the slot
- number is encoded in the relocation. The relocation applies to the
- last PC-relative immediate operand, or if there are no PC-relative
- immediates, to the last immediate operand.
-
- -- : BFD_RELOC_XTENSA_SLOT0_ALT
- -- : BFD_RELOC_XTENSA_SLOT1_ALT
- -- : BFD_RELOC_XTENSA_SLOT2_ALT
- -- : BFD_RELOC_XTENSA_SLOT3_ALT
- -- : BFD_RELOC_XTENSA_SLOT4_ALT
- -- : BFD_RELOC_XTENSA_SLOT5_ALT
- -- : BFD_RELOC_XTENSA_SLOT6_ALT
- -- : BFD_RELOC_XTENSA_SLOT7_ALT
- -- : BFD_RELOC_XTENSA_SLOT8_ALT
- -- : BFD_RELOC_XTENSA_SLOT9_ALT
- -- : BFD_RELOC_XTENSA_SLOT10_ALT
- -- : BFD_RELOC_XTENSA_SLOT11_ALT
- -- : BFD_RELOC_XTENSA_SLOT12_ALT
- -- : BFD_RELOC_XTENSA_SLOT13_ALT
- -- : BFD_RELOC_XTENSA_SLOT14_ALT
- Alternate Xtensa relocations. Only the slot is encoded in the
- relocation. The meaning of these relocations is opcode-specific.
-
- -- : BFD_RELOC_XTENSA_OP0
- -- : BFD_RELOC_XTENSA_OP1
- -- : BFD_RELOC_XTENSA_OP2
- Xtensa relocations for backward compatibility. These have all been
- replaced by BFD_RELOC_XTENSA_SLOT0_OP.
-
- -- : BFD_RELOC_XTENSA_ASM_EXPAND
- Xtensa relocation to mark that the assembler expanded the
- instructions from an original target. The expansion size is
- encoded in the reloc size.
-
- -- : BFD_RELOC_XTENSA_ASM_SIMPLIFY
- Xtensa relocation to mark that the linker should simplify
- assembler-expanded instructions. This is commonly used internally
- by the linker after analysis of a BFD_RELOC_XTENSA_ASM_EXPAND.
-
- -- : BFD_RELOC_XTENSA_TLSDESC_FN
- -- : BFD_RELOC_XTENSA_TLSDESC_ARG
- -- : BFD_RELOC_XTENSA_TLS_DTPOFF
- -- : BFD_RELOC_XTENSA_TLS_TPOFF
- -- : BFD_RELOC_XTENSA_TLS_FUNC
- -- : BFD_RELOC_XTENSA_TLS_ARG
- -- : BFD_RELOC_XTENSA_TLS_CALL
- Xtensa TLS relocations.
-
- -- : BFD_RELOC_Z80_DISP8
- 8 bit signed offset in (ix+d) or (iy+d).
-
- -- : BFD_RELOC_Z8K_DISP7
- DJNZ offset.
-
- -- : BFD_RELOC_Z8K_CALLR
- CALR offset.
-
- -- : BFD_RELOC_Z8K_IMM4L
- 4 bit value.
-
- -- : BFD_RELOC_LM32_CALL
- -- : BFD_RELOC_LM32_BRANCH
- -- : BFD_RELOC_LM32_16_GOT
- -- : BFD_RELOC_LM32_GOTOFF_HI16
- -- : BFD_RELOC_LM32_GOTOFF_LO16
- -- : BFD_RELOC_LM32_COPY
- -- : BFD_RELOC_LM32_GLOB_DAT
- -- : BFD_RELOC_LM32_JMP_SLOT
- -- : BFD_RELOC_LM32_RELATIVE
- Lattice Mico32 relocations.
-
- -- : BFD_RELOC_MACH_O_SECTDIFF
- Difference between two section addreses. Must be followed by a
- BFD_RELOC_MACH_O_PAIR.
-
- -- : BFD_RELOC_MACH_O_LOCAL_SECTDIFF
- Like BFD_RELOC_MACH_O_SECTDIFF but with a local symbol.
-
- -- : BFD_RELOC_MACH_O_PAIR
- Pair of relocation. Contains the first symbol.
-
- -- : BFD_RELOC_MACH_O_X86_64_BRANCH32
- -- : BFD_RELOC_MACH_O_X86_64_BRANCH8
- PCREL relocations. They are marked as branch to create PLT entry
- if required.
-
- -- : BFD_RELOC_MACH_O_X86_64_GOT
- Used when referencing a GOT entry.
-
- -- : BFD_RELOC_MACH_O_X86_64_GOT_LOAD
- Used when loading a GOT entry with movq. It is specially marked
- so that the linker could optimize the movq to a leaq if possible.
-
- -- : BFD_RELOC_MACH_O_X86_64_SUBTRACTOR32
- Symbol will be substracted. Must be followed by a BFD_RELOC_64.
-
- -- : BFD_RELOC_MACH_O_X86_64_SUBTRACTOR64
- Symbol will be substracted. Must be followed by a BFD_RELOC_64.
-
- -- : BFD_RELOC_MACH_O_X86_64_PCREL32_1
- Same as BFD_RELOC_32_PCREL but with an implicit -1 addend.
-
- -- : BFD_RELOC_MACH_O_X86_64_PCREL32_2
- Same as BFD_RELOC_32_PCREL but with an implicit -2 addend.
-
- -- : BFD_RELOC_MACH_O_X86_64_PCREL32_4
- Same as BFD_RELOC_32_PCREL but with an implicit -4 addend.
-
- -- : BFD_RELOC_MICROBLAZE_32_LO
- This is a 32 bit reloc for the microblaze that stores the low 16
- bits of a value
-
- -- : BFD_RELOC_MICROBLAZE_32_LO_PCREL
- This is a 32 bit pc-relative reloc for the microblaze that stores
- the low 16 bits of a value
-
- -- : BFD_RELOC_MICROBLAZE_32_ROSDA
- This is a 32 bit reloc for the microblaze that stores a value
- relative to the read-only small data area anchor
-
- -- : BFD_RELOC_MICROBLAZE_32_RWSDA
- This is a 32 bit reloc for the microblaze that stores a value
- relative to the read-write small data area anchor
-
- -- : BFD_RELOC_MICROBLAZE_32_SYM_OP_SYM
- This is a 32 bit reloc for the microblaze to handle expressions of
- the form "Symbol Op Symbol"
-
- -- : BFD_RELOC_MICROBLAZE_64_NONE
- This is a 64 bit reloc that stores the 32 bit pc relative value in
- two words (with an imm instruction). No relocation is done here -
- only used for relaxing
-
- -- : BFD_RELOC_MICROBLAZE_64_GOTPC
- This is a 64 bit reloc that stores the 32 bit pc relative value in
- two words (with an imm instruction). The relocation is
- PC-relative GOT offset
-
- -- : BFD_RELOC_MICROBLAZE_64_GOT
- This is a 64 bit reloc that stores the 32 bit pc relative value in
- two words (with an imm instruction). The relocation is GOT offset
-
- -- : BFD_RELOC_MICROBLAZE_64_PLT
- This is a 64 bit reloc that stores the 32 bit pc relative value in
- two words (with an imm instruction). The relocation is
- PC-relative offset into PLT
-
- -- : BFD_RELOC_MICROBLAZE_64_GOTOFF
- This is a 64 bit reloc that stores the 32 bit GOT relative value
- in two words (with an imm instruction). The relocation is
- relative offset from _GLOBAL_OFFSET_TABLE_
-
- -- : BFD_RELOC_MICROBLAZE_32_GOTOFF
- This is a 32 bit reloc that stores the 32 bit GOT relative value
- in a word. The relocation is relative offset from
-
- -- : BFD_RELOC_MICROBLAZE_COPY
- This is used to tell the dynamic linker to copy the value out of
- the dynamic object into the runtime process image.
-
- -- : BFD_RELOC_MICROBLAZE_64_TLS
- Unused Reloc
-
- -- : BFD_RELOC_MICROBLAZE_64_TLSGD
- This is a 64 bit reloc that stores the 32 bit GOT relative value
- of the GOT TLS GD info entry in two words (with an imm
- instruction). The relocation is GOT offset.
-
- -- : BFD_RELOC_MICROBLAZE_64_TLSLD
- This is a 64 bit reloc that stores the 32 bit GOT relative value
- of the GOT TLS LD info entry in two words (with an imm
- instruction). The relocation is GOT offset.
-
- -- : BFD_RELOC_MICROBLAZE_32_TLSDTPMOD
- This is a 32 bit reloc that stores the Module ID to GOT(n).
-
- -- : BFD_RELOC_MICROBLAZE_32_TLSDTPREL
- This is a 32 bit reloc that stores TLS offset to GOT(n+1).
-
- -- : BFD_RELOC_MICROBLAZE_64_TLSDTPREL
- This is a 32 bit reloc for storing TLS offset to two words (uses
- imm instruction)
-
- -- : BFD_RELOC_MICROBLAZE_64_TLSGOTTPREL
- This is a 64 bit reloc that stores 32-bit thread pointer relative
- offset to two words (uses imm instruction).
-
- -- : BFD_RELOC_MICROBLAZE_64_TLSTPREL
- This is a 64 bit reloc that stores 32-bit thread pointer relative
- offset to two words (uses imm instruction).
-
- -- : BFD_RELOC_AARCH64_RELOC_START
- AArch64 pseudo relocation code to mark the start of the AArch64
- relocation enumerators. N.B. the order of the enumerators is
- important as several tables in the AArch64 bfd backend are indexed
- by these enumerators; make sure they are all synced.
-
- -- : BFD_RELOC_AARCH64_NONE
- AArch64 null relocation code.
-
- -- : BFD_RELOC_AARCH64_64
- -- : BFD_RELOC_AARCH64_32
- -- : BFD_RELOC_AARCH64_16
- Basic absolute relocations of N bits. These are equivalent to
- BFD_RELOC_N and they were added to assist the indexing of the howto
- table.
-
- -- : BFD_RELOC_AARCH64_64_PCREL
- -- : BFD_RELOC_AARCH64_32_PCREL
- -- : BFD_RELOC_AARCH64_16_PCREL
- PC-relative relocations. These are equivalent to BFD_RELOC_N_PCREL
- and they were added to assist the indexing of the howto table.
-
- -- : BFD_RELOC_AARCH64_MOVW_G0
- AArch64 MOV[NZK] instruction with most significant bits 0 to 15 of
- an unsigned address/value.
-
- -- : BFD_RELOC_AARCH64_MOVW_G0_NC
- AArch64 MOV[NZK] instruction with less significant bits 0 to 15 of
- an address/value. No overflow checking.
-
- -- : BFD_RELOC_AARCH64_MOVW_G1
- AArch64 MOV[NZK] instruction with most significant bits 16 to 31
- of an unsigned address/value.
-
- -- : BFD_RELOC_AARCH64_MOVW_G1_NC
- AArch64 MOV[NZK] instruction with less significant bits 16 to 31
- of an address/value. No overflow checking.
-
- -- : BFD_RELOC_AARCH64_MOVW_G2
- AArch64 MOV[NZK] instruction with most significant bits 32 to 47
- of an unsigned address/value.
-
- -- : BFD_RELOC_AARCH64_MOVW_G2_NC
- AArch64 MOV[NZK] instruction with less significant bits 32 to 47
- of an address/value. No overflow checking.
-
- -- : BFD_RELOC_AARCH64_MOVW_G3
- AArch64 MOV[NZK] instruction with most signficant bits 48 to 64 of
- a signed or unsigned address/value.
-
- -- : BFD_RELOC_AARCH64_MOVW_G0_S
- AArch64 MOV[NZ] instruction with most significant bits 0 to 15 of
- a signed value. Changes instruction to MOVZ or MOVN depending on
- the value's sign.
-
- -- : BFD_RELOC_AARCH64_MOVW_G1_S
- AArch64 MOV[NZ] instruction with most significant bits 16 to 31 of
- a signed value. Changes instruction to MOVZ or MOVN depending on
- the value's sign.
-
- -- : BFD_RELOC_AARCH64_MOVW_G2_S
- AArch64 MOV[NZ] instruction with most significant bits 32 to 47 of
- a signed value. Changes instruction to MOVZ or MOVN depending on
- the value's sign.
-
- -- : BFD_RELOC_AARCH64_LD_LO19_PCREL
- AArch64 Load Literal instruction, holding a 19 bit pc-relative word
- offset. The lowest two bits must be zero and are not stored in the
- instruction, giving a 21 bit signed byte offset.
-
- -- : BFD_RELOC_AARCH64_ADR_LO21_PCREL
- AArch64 ADR instruction, holding a simple 21 bit pc-relative byte
- offset.
-
- -- : BFD_RELOC_AARCH64_ADR_HI21_PCREL
- AArch64 ADRP instruction, with bits 12 to 32 of a pc-relative page
- offset, giving a 4KB aligned page base address.
-
- -- : BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL
- AArch64 ADRP instruction, with bits 12 to 32 of a pc-relative page
- offset, giving a 4KB aligned page base address, but with no
- overflow checking.
-
- -- : BFD_RELOC_AARCH64_ADD_LO12
- AArch64 ADD immediate instruction, holding bits 0 to 11 of the
- address. Used in conjunction with
- BFD_RELOC_AARCH64_ADR_HI21_PCREL.
-
- -- : BFD_RELOC_AARCH64_LDST8_LO12
- AArch64 8-bit load/store instruction, holding bits 0 to 11 of the
- address. Used in conjunction with
- BFD_RELOC_AARCH64_ADR_HI21_PCREL.
-
- -- : BFD_RELOC_AARCH64_TSTBR14
- AArch64 14 bit pc-relative test bit and branch. The lowest two
- bits must be zero and are not stored in the instruction, giving a
- 16 bit signed byte offset.
-
- -- : BFD_RELOC_AARCH64_BRANCH19
- AArch64 19 bit pc-relative conditional branch and compare & branch.
- The lowest two bits must be zero and are not stored in the
- instruction, giving a 21 bit signed byte offset.
-
- -- : BFD_RELOC_AARCH64_JUMP26
- AArch64 26 bit pc-relative unconditional branch. The lowest two
- bits must be zero and are not stored in the instruction, giving a
- 28 bit signed byte offset.
-
- -- : BFD_RELOC_AARCH64_CALL26
- AArch64 26 bit pc-relative unconditional branch and link. The
- lowest two bits must be zero and are not stored in the instruction,
- giving a 28 bit signed byte offset.
-
- -- : BFD_RELOC_AARCH64_LDST16_LO12
- AArch64 16-bit load/store instruction, holding bits 0 to 11 of the
- address. Used in conjunction with
- BFD_RELOC_AARCH64_ADR_HI21_PCREL.
-
- -- : BFD_RELOC_AARCH64_LDST32_LO12
- AArch64 32-bit load/store instruction, holding bits 0 to 11 of the
- address. Used in conjunction with
- BFD_RELOC_AARCH64_ADR_HI21_PCREL.
-
- -- : BFD_RELOC_AARCH64_LDST64_LO12
- AArch64 64-bit load/store instruction, holding bits 0 to 11 of the
- address. Used in conjunction with
- BFD_RELOC_AARCH64_ADR_HI21_PCREL.
-
- -- : BFD_RELOC_AARCH64_LDST128_LO12
- AArch64 128-bit load/store instruction, holding bits 0 to 11 of the
- address. Used in conjunction with
- BFD_RELOC_AARCH64_ADR_HI21_PCREL.
-
- -- : BFD_RELOC_AARCH64_GOT_LD_PREL19
- AArch64 Load Literal instruction, holding a 19 bit PC relative word
- offset of the global offset table entry for a symbol. The lowest
- two bits must be zero and are not stored in the instruction,
- giving a 21 bit signed byte offset. This relocation type requires
- signed overflow checking.
-
- -- : BFD_RELOC_AARCH64_ADR_GOT_PAGE
- Get to the page base of the global offset table entry for a symbol
- as part of an ADRP instruction using a 21 bit PC relative
- value.Used in conjunction with BFD_RELOC_AARCH64_LD64_GOT_LO12_NC.
-
- -- : BFD_RELOC_AARCH64_LD64_GOT_LO12_NC
- Unsigned 12 bit byte offset for 64 bit load/store from the page of
- the GOT entry for this symbol. Used in conjunction with
- BFD_RELOC_AARCH64_ADR_GOTPAGE. Valid in LP64 ABI only.
-
- -- : BFD_RELOC_AARCH64_LD32_GOT_LO12_NC
- Unsigned 12 bit byte offset for 32 bit load/store from the page of
- the GOT entry for this symbol. Used in conjunction with
- BFD_RELOC_AARCH64_ADR_GOTPAGE. Valid in ILP32 ABI only.
-
- -- : BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21
- Get to the page base of the global offset table entry for a symbols
- tls_index structure as part of an adrp instruction using a 21 bit
- PC relative value. Used in conjunction with
- BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC.
-
- -- : BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC
- Unsigned 12 bit byte offset to global offset table entry for a
- symbols tls_index structure. Used in conjunction with
- BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21.
-
- -- : BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G1
- AArch64 TLS INITIAL EXEC relocation.
-
- -- : BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC
- AArch64 TLS INITIAL EXEC relocation.
-
- -- : BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21
- AArch64 TLS INITIAL EXEC relocation.
-
- -- : BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC
- AArch64 TLS INITIAL EXEC relocation.
-
- -- : BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC
- AArch64 TLS INITIAL EXEC relocation.
-
- -- : BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19
- AArch64 TLS INITIAL EXEC relocation.
-
- -- : BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2
- AArch64 TLS LOCAL EXEC relocation.
-
- -- : BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1
- AArch64 TLS LOCAL EXEC relocation.
-
- -- : BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC
- AArch64 TLS LOCAL EXEC relocation.
-
- -- : BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0
- AArch64 TLS LOCAL EXEC relocation.
-
- -- : BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC
- AArch64 TLS LOCAL EXEC relocation.
-
- -- : BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12
- AArch64 TLS LOCAL EXEC relocation.
-
- -- : BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12
- AArch64 TLS LOCAL EXEC relocation.
-
- -- : BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC
- AArch64 TLS LOCAL EXEC relocation.
-
- -- : BFD_RELOC_AARCH64_TLSDESC_LD_PREL19
- AArch64 TLS DESC relocation.
-
- -- : BFD_RELOC_AARCH64_TLSDESC_ADR_PREL21
- AArch64 TLS DESC relocation.
-
- -- : BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21
- AArch64 TLS DESC relocation.
-
- -- : BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC
- AArch64 TLS DESC relocation.
-
- -- : BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC
- AArch64 TLS DESC relocation.
-
- -- : BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC
- AArch64 TLS DESC relocation.
-
- -- : BFD_RELOC_AARCH64_TLSDESC_OFF_G1
- AArch64 TLS DESC relocation.
-
- -- : BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC
- AArch64 TLS DESC relocation.
-
- -- : BFD_RELOC_AARCH64_TLSDESC_LDR
- AArch64 TLS DESC relocation.
-
- -- : BFD_RELOC_AARCH64_TLSDESC_ADD
- AArch64 TLS DESC relocation.
-
- -- : BFD_RELOC_AARCH64_TLSDESC_CALL
- AArch64 TLS DESC relocation.
-
- -- : BFD_RELOC_AARCH64_COPY
- AArch64 TLS relocation.
-
- -- : BFD_RELOC_AARCH64_GLOB_DAT
- AArch64 TLS relocation.
-
- -- : BFD_RELOC_AARCH64_JUMP_SLOT
- AArch64 TLS relocation.
-
- -- : BFD_RELOC_AARCH64_RELATIVE
- AArch64 TLS relocation.
-
- -- : BFD_RELOC_AARCH64_TLS_DTPMOD
- AArch64 TLS relocation.
-
- -- : BFD_RELOC_AARCH64_TLS_DTPREL
- AArch64 TLS relocation.
-
- -- : BFD_RELOC_AARCH64_TLS_TPREL
- AArch64 TLS relocation.
-
- -- : BFD_RELOC_AARCH64_TLSDESC
- AArch64 TLS relocation.
-
- -- : BFD_RELOC_AARCH64_IRELATIVE
- AArch64 support for STT_GNU_IFUNC.
-
- -- : BFD_RELOC_AARCH64_RELOC_END
- AArch64 pseudo relocation code to mark the end of the AArch64
- relocation enumerators that have direct mapping to ELF reloc codes.
- There are a few more enumerators after this one; those are mainly
- used by the AArch64 assembler for the internal fixup or to select
- one of the above enumerators.
-
- -- : BFD_RELOC_AARCH64_GAS_INTERNAL_FIXUP
- AArch64 pseudo relocation code to be used internally by the AArch64
- assembler and not (currently) written to any object files.
-
- -- : BFD_RELOC_AARCH64_LDST_LO12
- AArch64 unspecified load/store instruction, holding bits 0 to 11
- of the address. Used in conjunction with
- BFD_RELOC_AARCH64_ADR_HI21_PCREL.
-
- -- : BFD_RELOC_AARCH64_LD_GOT_LO12_NC
- AArch64 pseudo relocation code to be used internally by the AArch64
- assembler and not (currently) written to any object files.
-
- -- : BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_LO12_NC
- AArch64 pseudo relocation code to be used internally by the AArch64
- assembler and not (currently) written to any object files.
-
- -- : BFD_RELOC_AARCH64_TLSDESC_LD_LO12_NC
- AArch64 pseudo relocation code to be used internally by the AArch64
- assembler and not (currently) written to any object files.
-
- -- : BFD_RELOC_TILEPRO_COPY
- -- : BFD_RELOC_TILEPRO_GLOB_DAT
- -- : BFD_RELOC_TILEPRO_JMP_SLOT
- -- : BFD_RELOC_TILEPRO_RELATIVE
- -- : BFD_RELOC_TILEPRO_BROFF_X1
- -- : BFD_RELOC_TILEPRO_JOFFLONG_X1
- -- : BFD_RELOC_TILEPRO_JOFFLONG_X1_PLT
- -- : BFD_RELOC_TILEPRO_IMM8_X0
- -- : BFD_RELOC_TILEPRO_IMM8_Y0
- -- : BFD_RELOC_TILEPRO_IMM8_X1
- -- : BFD_RELOC_TILEPRO_IMM8_Y1
- -- : BFD_RELOC_TILEPRO_DEST_IMM8_X1
- -- : BFD_RELOC_TILEPRO_MT_IMM15_X1
- -- : BFD_RELOC_TILEPRO_MF_IMM15_X1
- -- : BFD_RELOC_TILEPRO_IMM16_X0
- -- : BFD_RELOC_TILEPRO_IMM16_X1
- -- : BFD_RELOC_TILEPRO_IMM16_X0_LO
- -- : BFD_RELOC_TILEPRO_IMM16_X1_LO
- -- : BFD_RELOC_TILEPRO_IMM16_X0_HI
- -- : BFD_RELOC_TILEPRO_IMM16_X1_HI
- -- : BFD_RELOC_TILEPRO_IMM16_X0_HA
- -- : BFD_RELOC_TILEPRO_IMM16_X1_HA
- -- : BFD_RELOC_TILEPRO_IMM16_X0_PCREL
- -- : BFD_RELOC_TILEPRO_IMM16_X1_PCREL
- -- : BFD_RELOC_TILEPRO_IMM16_X0_LO_PCREL
- -- : BFD_RELOC_TILEPRO_IMM16_X1_LO_PCREL
- -- : BFD_RELOC_TILEPRO_IMM16_X0_HI_PCREL
- -- : BFD_RELOC_TILEPRO_IMM16_X1_HI_PCREL
- -- : BFD_RELOC_TILEPRO_IMM16_X0_HA_PCREL
- -- : BFD_RELOC_TILEPRO_IMM16_X1_HA_PCREL
- -- : BFD_RELOC_TILEPRO_IMM16_X0_GOT
- -- : BFD_RELOC_TILEPRO_IMM16_X1_GOT
- -- : BFD_RELOC_TILEPRO_IMM16_X0_GOT_LO
- -- : BFD_RELOC_TILEPRO_IMM16_X1_GOT_LO
- -- : BFD_RELOC_TILEPRO_IMM16_X0_GOT_HI
- -- : BFD_RELOC_TILEPRO_IMM16_X1_GOT_HI
- -- : BFD_RELOC_TILEPRO_IMM16_X0_GOT_HA
- -- : BFD_RELOC_TILEPRO_IMM16_X1_GOT_HA
- -- : BFD_RELOC_TILEPRO_MMSTART_X0
- -- : BFD_RELOC_TILEPRO_MMEND_X0
- -- : BFD_RELOC_TILEPRO_MMSTART_X1
- -- : BFD_RELOC_TILEPRO_MMEND_X1
- -- : BFD_RELOC_TILEPRO_SHAMT_X0
- -- : BFD_RELOC_TILEPRO_SHAMT_X1
- -- : BFD_RELOC_TILEPRO_SHAMT_Y0
- -- : BFD_RELOC_TILEPRO_SHAMT_Y1
- -- : BFD_RELOC_TILEPRO_TLS_GD_CALL
- -- : BFD_RELOC_TILEPRO_IMM8_X0_TLS_GD_ADD
- -- : BFD_RELOC_TILEPRO_IMM8_X1_TLS_GD_ADD
- -- : BFD_RELOC_TILEPRO_IMM8_Y0_TLS_GD_ADD
- -- : BFD_RELOC_TILEPRO_IMM8_Y1_TLS_GD_ADD
- -- : BFD_RELOC_TILEPRO_TLS_IE_LOAD
- -- : BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD
- -- : BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD
- -- : BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_LO
- -- : BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_LO
- -- : BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_HI
- -- : BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_HI
- -- : BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_HA
- -- : BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_HA
- -- : BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE
- -- : BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE
- -- : BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_LO
- -- : BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_LO
- -- : BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_HI
- -- : BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_HI
- -- : BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_HA
- -- : BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_HA
- -- : BFD_RELOC_TILEPRO_TLS_DTPMOD32
- -- : BFD_RELOC_TILEPRO_TLS_DTPOFF32
- -- : BFD_RELOC_TILEPRO_TLS_TPOFF32
- -- : BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE
- -- : BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE
- -- : BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_LO
- -- : BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_LO
- -- : BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_HI
- -- : BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_HI
- -- : BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_HA
- -- : BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_HA
- Tilera TILEPro Relocations.
-
- -- : BFD_RELOC_TILEGX_HW0
- -- : BFD_RELOC_TILEGX_HW1
- -- : BFD_RELOC_TILEGX_HW2
- -- : BFD_RELOC_TILEGX_HW3
- -- : BFD_RELOC_TILEGX_HW0_LAST
- -- : BFD_RELOC_TILEGX_HW1_LAST
- -- : BFD_RELOC_TILEGX_HW2_LAST
- -- : BFD_RELOC_TILEGX_COPY
- -- : BFD_RELOC_TILEGX_GLOB_DAT
- -- : BFD_RELOC_TILEGX_JMP_SLOT
- -- : BFD_RELOC_TILEGX_RELATIVE
- -- : BFD_RELOC_TILEGX_BROFF_X1
- -- : BFD_RELOC_TILEGX_JUMPOFF_X1
- -- : BFD_RELOC_TILEGX_JUMPOFF_X1_PLT
- -- : BFD_RELOC_TILEGX_IMM8_X0
- -- : BFD_RELOC_TILEGX_IMM8_Y0
- -- : BFD_RELOC_TILEGX_IMM8_X1
- -- : BFD_RELOC_TILEGX_IMM8_Y1
- -- : BFD_RELOC_TILEGX_DEST_IMM8_X1
- -- : BFD_RELOC_TILEGX_MT_IMM14_X1
- -- : BFD_RELOC_TILEGX_MF_IMM14_X1
- -- : BFD_RELOC_TILEGX_MMSTART_X0
- -- : BFD_RELOC_TILEGX_MMEND_X0
- -- : BFD_RELOC_TILEGX_SHAMT_X0
- -- : BFD_RELOC_TILEGX_SHAMT_X1
- -- : BFD_RELOC_TILEGX_SHAMT_Y0
- -- : BFD_RELOC_TILEGX_SHAMT_Y1
- -- : BFD_RELOC_TILEGX_IMM16_X0_HW0
- -- : BFD_RELOC_TILEGX_IMM16_X1_HW0
- -- : BFD_RELOC_TILEGX_IMM16_X0_HW1
- -- : BFD_RELOC_TILEGX_IMM16_X1_HW1
- -- : BFD_RELOC_TILEGX_IMM16_X0_HW2
- -- : BFD_RELOC_TILEGX_IMM16_X1_HW2
- -- : BFD_RELOC_TILEGX_IMM16_X0_HW3
- -- : BFD_RELOC_TILEGX_IMM16_X1_HW3
- -- : BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST
- -- : BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST
- -- : BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST
- -- : BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST
- -- : BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST
- -- : BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST
- -- : BFD_RELOC_TILEGX_IMM16_X0_HW0_PCREL
- -- : BFD_RELOC_TILEGX_IMM16_X1_HW0_PCREL
- -- : BFD_RELOC_TILEGX_IMM16_X0_HW1_PCREL
- -- : BFD_RELOC_TILEGX_IMM16_X1_HW1_PCREL
- -- : BFD_RELOC_TILEGX_IMM16_X0_HW2_PCREL
- -- : BFD_RELOC_TILEGX_IMM16_X1_HW2_PCREL
- -- : BFD_RELOC_TILEGX_IMM16_X0_HW3_PCREL
- -- : BFD_RELOC_TILEGX_IMM16_X1_HW3_PCREL
- -- : BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_PCREL
- -- : BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_PCREL
- -- : BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_PCREL
- -- : BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_PCREL
- -- : BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST_PCREL
- -- : BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST_PCREL
- -- : BFD_RELOC_TILEGX_IMM16_X0_HW0_GOT
- -- : BFD_RELOC_TILEGX_IMM16_X1_HW0_GOT
- -- : BFD_RELOC_TILEGX_IMM16_X0_HW0_PLT_PCREL
- -- : BFD_RELOC_TILEGX_IMM16_X1_HW0_PLT_PCREL
- -- : BFD_RELOC_TILEGX_IMM16_X0_HW1_PLT_PCREL
- -- : BFD_RELOC_TILEGX_IMM16_X1_HW1_PLT_PCREL
- -- : BFD_RELOC_TILEGX_IMM16_X0_HW2_PLT_PCREL
- -- : BFD_RELOC_TILEGX_IMM16_X1_HW2_PLT_PCREL
- -- : BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_GOT
- -- : BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_GOT
- -- : BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_GOT
- -- : BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_GOT
- -- : BFD_RELOC_TILEGX_IMM16_X0_HW3_PLT_PCREL
- -- : BFD_RELOC_TILEGX_IMM16_X1_HW3_PLT_PCREL
- -- : BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_GD
- -- : BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_GD
- -- : BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_LE
- -- : BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_LE
- -- : BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_LE
- -- : BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_LE
- -- : BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_LE
- -- : BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_LE
- -- : BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_GD
- -- : BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_GD
- -- : BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_GD
- -- : BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_GD
- -- : BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_IE
- -- : BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_IE
- -- : BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL
- -- : BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL
- -- : BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL
- -- : BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL
- -- : BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL
- -- : BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL
- -- : BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_IE
- -- : BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_IE
- -- : BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_IE
- -- : BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_IE
- -- : BFD_RELOC_TILEGX_TLS_DTPMOD64
- -- : BFD_RELOC_TILEGX_TLS_DTPOFF64
- -- : BFD_RELOC_TILEGX_TLS_TPOFF64
- -- : BFD_RELOC_TILEGX_TLS_DTPMOD32
- -- : BFD_RELOC_TILEGX_TLS_DTPOFF32
- -- : BFD_RELOC_TILEGX_TLS_TPOFF32
- -- : BFD_RELOC_TILEGX_TLS_GD_CALL
- -- : BFD_RELOC_TILEGX_IMM8_X0_TLS_GD_ADD
- -- : BFD_RELOC_TILEGX_IMM8_X1_TLS_GD_ADD
- -- : BFD_RELOC_TILEGX_IMM8_Y0_TLS_GD_ADD
- -- : BFD_RELOC_TILEGX_IMM8_Y1_TLS_GD_ADD
- -- : BFD_RELOC_TILEGX_TLS_IE_LOAD
- -- : BFD_RELOC_TILEGX_IMM8_X0_TLS_ADD
- -- : BFD_RELOC_TILEGX_IMM8_X1_TLS_ADD
- -- : BFD_RELOC_TILEGX_IMM8_Y0_TLS_ADD
- -- : BFD_RELOC_TILEGX_IMM8_Y1_TLS_ADD
- Tilera TILE-Gx Relocations.
-
- -- : BFD_RELOC_EPIPHANY_SIMM8
- Adapteva EPIPHANY - 8 bit signed pc-relative displacement
-
- -- : BFD_RELOC_EPIPHANY_SIMM24
- Adapteva EPIPHANY - 24 bit signed pc-relative displacement
-
- -- : BFD_RELOC_EPIPHANY_HIGH
- Adapteva EPIPHANY - 16 most-significant bits of absolute address
-
- -- : BFD_RELOC_EPIPHANY_LOW
- Adapteva EPIPHANY - 16 least-significant bits of absolute address
-
- -- : BFD_RELOC_EPIPHANY_SIMM11
- Adapteva EPIPHANY - 11 bit signed number - add/sub immediate
-
- -- : BFD_RELOC_EPIPHANY_IMM11
- Adapteva EPIPHANY - 11 bit sign-magnitude number (ld/st
- displacement)
-
- -- : BFD_RELOC_EPIPHANY_IMM8
- Adapteva EPIPHANY - 8 bit immediate for 16 bit mov instruction.
-
-
- typedef enum bfd_reloc_code_real bfd_reloc_code_real_type;
-
-2.10.2.2 `bfd_reloc_type_lookup'
-................................
-
-*Synopsis*
- reloc_howto_type *bfd_reloc_type_lookup
- (bfd *abfd, bfd_reloc_code_real_type code);
- reloc_howto_type *bfd_reloc_name_lookup
- (bfd *abfd, const char *reloc_name);
- *Description*
-Return a pointer to a howto structure which, when invoked, will perform
-the relocation CODE on data from the architecture noted.
-
-2.10.2.3 `bfd_default_reloc_type_lookup'
-........................................
-
-*Synopsis*
- reloc_howto_type *bfd_default_reloc_type_lookup
- (bfd *abfd, bfd_reloc_code_real_type code);
- *Description*
-Provides a default relocation lookup routine for any architecture.
-
-2.10.2.4 `bfd_get_reloc_code_name'
-..................................
-
-*Synopsis*
- const char *bfd_get_reloc_code_name (bfd_reloc_code_real_type code);
- *Description*
-Provides a printable name for the supplied relocation code. Useful
-mainly for printing error messages.
-
-2.10.2.5 `bfd_generic_relax_section'
-....................................
-
-*Synopsis*
- bfd_boolean bfd_generic_relax_section
- (bfd *abfd,
- asection *section,
- struct bfd_link_info *,
- bfd_boolean *);
- *Description*
-Provides default handling for relaxing for back ends which don't do
-relaxing.
-
-2.10.2.6 `bfd_generic_gc_sections'
-..................................
-
-*Synopsis*
- bfd_boolean bfd_generic_gc_sections
- (bfd *, struct bfd_link_info *);
- *Description*
-Provides default handling for relaxing for back ends which don't do
-section gc - i.e., does nothing.
-
-2.10.2.7 `bfd_generic_lookup_section_flags'
-...........................................
-
-*Synopsis*
- bfd_boolean bfd_generic_lookup_section_flags
- (struct bfd_link_info *, struct flag_info *, asection *);
- *Description*
-Provides default handling for section flags lookup - i.e., does nothing.
-Returns FALSE if the section should be omitted, otherwise TRUE.
-
-2.10.2.8 `bfd_generic_merge_sections'
-.....................................
-
-*Synopsis*
- bfd_boolean bfd_generic_merge_sections
- (bfd *, struct bfd_link_info *);
- *Description*
-Provides default handling for SEC_MERGE section merging for back ends
-which don't have SEC_MERGE support - i.e., does nothing.
-
-2.10.2.9 `bfd_generic_get_relocated_section_contents'
-.....................................................
-
-*Synopsis*
- bfd_byte *bfd_generic_get_relocated_section_contents
- (bfd *abfd,
- struct bfd_link_info *link_info,
- struct bfd_link_order *link_order,
- bfd_byte *data,
- bfd_boolean relocatable,
- asymbol **symbols);
- *Description*
-Provides default handling of relocation effort for back ends which
-can't be bothered to do it efficiently.
-
-
-File: bfd.info, Node: Core Files, Next: Targets, Prev: Relocations, Up: BFD front end
-
-2.11 Core files
-===============
-
-2.11.1 Core file functions
---------------------------
-
-*Description*
-These are functions pertaining to core files.
-
-2.11.1.1 `bfd_core_file_failing_command'
-........................................
-
-*Synopsis*
- const char *bfd_core_file_failing_command (bfd *abfd);
- *Description*
-Return a read-only string explaining which program was running when it
-failed and produced the core file ABFD.
-
-2.11.1.2 `bfd_core_file_failing_signal'
-.......................................
-
-*Synopsis*
- int bfd_core_file_failing_signal (bfd *abfd);
- *Description*
-Returns the signal number which caused the core dump which generated
-the file the BFD ABFD is attached to.
-
-2.11.1.3 `bfd_core_file_pid'
-............................
-
-*Synopsis*
- int bfd_core_file_pid (bfd *abfd);
- *Description*
-Returns the PID of the process the core dump the BFD ABFD is attached
-to was generated from.
-
-2.11.1.4 `core_file_matches_executable_p'
-.........................................
-
-*Synopsis*
- bfd_boolean core_file_matches_executable_p
- (bfd *core_bfd, bfd *exec_bfd);
- *Description*
-Return `TRUE' if the core file attached to CORE_BFD was generated by a
-run of the executable file attached to EXEC_BFD, `FALSE' otherwise.
-
-2.11.1.5 `generic_core_file_matches_executable_p'
-.................................................
-
-*Synopsis*
- bfd_boolean generic_core_file_matches_executable_p
- (bfd *core_bfd, bfd *exec_bfd);
- *Description*
-Return TRUE if the core file attached to CORE_BFD was generated by a
-run of the executable file attached to EXEC_BFD. The match is based on
-executable basenames only.
-
- Note: When not able to determine the core file failing command or
-the executable name, we still return TRUE even though we're not sure
-that core file and executable match. This is to avoid generating a
-false warning in situations where we really don't know whether they
-match or not.
-
-
-File: bfd.info, Node: Targets, Next: Architectures, Prev: Core Files, Up: BFD front end
-
-2.12 Targets
-============
-
-*Description*
-Each port of BFD to a different machine requires the creation of a
-target back end. All the back end provides to the root part of BFD is a
-structure containing pointers to functions which perform certain low
-level operations on files. BFD translates the applications's requests
-through a pointer into calls to the back end routines.
-
- When a file is opened with `bfd_openr', its format and target are
-unknown. BFD uses various mechanisms to determine how to interpret the
-file. The operations performed are:
-
- * Create a BFD by calling the internal routine `_bfd_new_bfd', then
- call `bfd_find_target' with the target string supplied to
- `bfd_openr' and the new BFD pointer.
-
- * If a null target string was provided to `bfd_find_target', look up
- the environment variable `GNUTARGET' and use that as the target
- string.
-
- * If the target string is still `NULL', or the target string is
- `default', then use the first item in the target vector as the
- target type, and set `target_defaulted' in the BFD to cause
- `bfd_check_format' to loop through all the targets. *Note
- bfd_target::. *Note Formats::.
-
- * Otherwise, inspect the elements in the target vector one by one,
- until a match on target name is found. When found, use it.
-
- * Otherwise return the error `bfd_error_invalid_target' to
- `bfd_openr'.
-
- * `bfd_openr' attempts to open the file using `bfd_open_file', and
- returns the BFD.
- Once the BFD has been opened and the target selected, the file
-format may be determined. This is done by calling `bfd_check_format' on
-the BFD with a suggested format. If `target_defaulted' has been set,
-each possible target type is tried to see if it recognizes the
-specified format. `bfd_check_format' returns `TRUE' when the caller
-guesses right.
-
-* Menu:
-
-* bfd_target::
-
-
-File: bfd.info, Node: bfd_target, Prev: Targets, Up: Targets
-
-2.12.1 bfd_target
------------------
-
-*Description*
-This structure contains everything that BFD knows about a target. It
-includes things like its byte order, name, and which routines to call
-to do various operations.
-
- Every BFD points to a target structure with its `xvec' member.
-
- The macros below are used to dispatch to functions through the
-`bfd_target' vector. They are used in a number of macros further down
-in `bfd.h', and are also used when calling various routines by hand
-inside the BFD implementation. The ARGLIST argument must be
-parenthesized; it contains all the arguments to the called function.
-
- They make the documentation (more) unpleasant to read, so if someone
-wants to fix this and not break the above, please do.
- #define BFD_SEND(bfd, message, arglist) \
- ((*((bfd)->xvec->message)) arglist)
-
- #ifdef DEBUG_BFD_SEND
- #undef BFD_SEND
- #define BFD_SEND(bfd, message, arglist) \
- (((bfd) && (bfd)->xvec && (bfd)->xvec->message) ? \
- ((*((bfd)->xvec->message)) arglist) : \
- (bfd_assert (__FILE__,__LINE__), NULL))
- #endif
- For operations which index on the BFD format:
- #define BFD_SEND_FMT(bfd, message, arglist) \
- (((bfd)->xvec->message[(int) ((bfd)->format)]) arglist)
-
- #ifdef DEBUG_BFD_SEND
- #undef BFD_SEND_FMT
- #define BFD_SEND_FMT(bfd, message, arglist) \
- (((bfd) && (bfd)->xvec && (bfd)->xvec->message) ? \
- (((bfd)->xvec->message[(int) ((bfd)->format)]) arglist) : \
- (bfd_assert (__FILE__,__LINE__), NULL))
- #endif
- This is the structure which defines the type of BFD this is. The
-`xvec' member of the struct `bfd' itself points here. Each module that
-implements access to a different target under BFD, defines one of these.
-
- FIXME, these names should be rationalised with the names of the
-entry points which call them. Too bad we can't have one macro to define
-them both!
- enum bfd_flavour
- {
- bfd_target_unknown_flavour,
- bfd_target_aout_flavour,
- bfd_target_coff_flavour,
- bfd_target_ecoff_flavour,
- bfd_target_xcoff_flavour,
- bfd_target_elf_flavour,
- bfd_target_ieee_flavour,
- bfd_target_nlm_flavour,
- bfd_target_oasys_flavour,
- bfd_target_tekhex_flavour,
- bfd_target_srec_flavour,
- bfd_target_verilog_flavour,
- bfd_target_ihex_flavour,
- bfd_target_som_flavour,
- bfd_target_os9k_flavour,
- bfd_target_versados_flavour,
- bfd_target_msdos_flavour,
- bfd_target_ovax_flavour,
- bfd_target_evax_flavour,
- bfd_target_mmo_flavour,
- bfd_target_mach_o_flavour,
- bfd_target_pef_flavour,
- bfd_target_pef_xlib_flavour,
- bfd_target_sym_flavour
- };
-
- enum bfd_endian { BFD_ENDIAN_BIG, BFD_ENDIAN_LITTLE, BFD_ENDIAN_UNKNOWN };
-
- /* Forward declaration. */
- typedef struct bfd_link_info _bfd_link_info;
-
- /* Forward declaration. */
- typedef struct flag_info flag_info;
-
- typedef struct bfd_target
- {
- /* Identifies the kind of target, e.g., SunOS4, Ultrix, etc. */
- char *name;
-
- /* The "flavour" of a back end is a general indication about
- the contents of a file. */
- enum bfd_flavour flavour;
-
- /* The order of bytes within the data area of a file. */
- enum bfd_endian byteorder;
-
- /* The order of bytes within the header parts of a file. */
- enum bfd_endian header_byteorder;
-
- /* A mask of all the flags which an executable may have set -
- from the set `BFD_NO_FLAGS', `HAS_RELOC', ...`D_PAGED'. */
- flagword object_flags;
-
- /* A mask of all the flags which a section may have set - from
- the set `SEC_NO_FLAGS', `SEC_ALLOC', ...`SET_NEVER_LOAD'. */
- flagword section_flags;
-
- /* The character normally found at the front of a symbol.
- (if any), perhaps `_'. */
- char symbol_leading_char;
-
- /* The pad character for file names within an archive header. */
- char ar_pad_char;
-
- /* The maximum number of characters in an archive header. */
- unsigned char ar_max_namelen;
-
- /* How well this target matches, used to select between various
- possible targets when more than one target matches. */
- unsigned char match_priority;
-
- /* Entries for byte swapping for data. These are different from the
- other entry points, since they don't take a BFD as the first argument.
- Certain other handlers could do the same. */
- bfd_uint64_t (*bfd_getx64) (const void *);
- bfd_int64_t (*bfd_getx_signed_64) (const void *);
- void (*bfd_putx64) (bfd_uint64_t, void *);
- bfd_vma (*bfd_getx32) (const void *);
- bfd_signed_vma (*bfd_getx_signed_32) (const void *);
- void (*bfd_putx32) (bfd_vma, void *);
- bfd_vma (*bfd_getx16) (const void *);
- bfd_signed_vma (*bfd_getx_signed_16) (const void *);
- void (*bfd_putx16) (bfd_vma, void *);
-
- /* Byte swapping for the headers. */
- bfd_uint64_t (*bfd_h_getx64) (const void *);
- bfd_int64_t (*bfd_h_getx_signed_64) (const void *);
- void (*bfd_h_putx64) (bfd_uint64_t, void *);
- bfd_vma (*bfd_h_getx32) (const void *);
- bfd_signed_vma (*bfd_h_getx_signed_32) (const void *);
- void (*bfd_h_putx32) (bfd_vma, void *);
- bfd_vma (*bfd_h_getx16) (const void *);
- bfd_signed_vma (*bfd_h_getx_signed_16) (const void *);
- void (*bfd_h_putx16) (bfd_vma, void *);
-
- /* Format dependent routines: these are vectors of entry points
- within the target vector structure, one for each format to check. */
-
- /* Check the format of a file being read. Return a `bfd_target *' or zero. */
- const struct bfd_target *(*_bfd_check_format[bfd_type_end]) (bfd *);
-
- /* Set the format of a file being written. */
- bfd_boolean (*_bfd_set_format[bfd_type_end]) (bfd *);
-
- /* Write cached information into a file being written, at `bfd_close'. */
- bfd_boolean (*_bfd_write_contents[bfd_type_end]) (bfd *);
- The general target vector. These vectors are initialized using the
-BFD_JUMP_TABLE macros.
-
- /* Generic entry points. */
- #define BFD_JUMP_TABLE_GENERIC(NAME) \
- NAME##_close_and_cleanup, \
- NAME##_bfd_free_cached_info, \
- NAME##_new_section_hook, \
- NAME##_get_section_contents, \
- NAME##_get_section_contents_in_window
-
- /* Called when the BFD is being closed to do any necessary cleanup. */
- bfd_boolean (*_close_and_cleanup) (bfd *);
- /* Ask the BFD to free all cached information. */
- bfd_boolean (*_bfd_free_cached_info) (bfd *);
- /* Called when a new section is created. */
- bfd_boolean (*_new_section_hook) (bfd *, sec_ptr);
- /* Read the contents of a section. */
- bfd_boolean (*_bfd_get_section_contents)
- (bfd *, sec_ptr, void *, file_ptr, bfd_size_type);
- bfd_boolean (*_bfd_get_section_contents_in_window)
- (bfd *, sec_ptr, bfd_window *, file_ptr, bfd_size_type);
-
- /* Entry points to copy private data. */
- #define BFD_JUMP_TABLE_COPY(NAME) \
- NAME##_bfd_copy_private_bfd_data, \
- NAME##_bfd_merge_private_bfd_data, \
- _bfd_generic_init_private_section_data, \
- NAME##_bfd_copy_private_section_data, \
- NAME##_bfd_copy_private_symbol_data, \
- NAME##_bfd_copy_private_header_data, \
- NAME##_bfd_set_private_flags, \
- NAME##_bfd_print_private_bfd_data
-
- /* Called to copy BFD general private data from one object file
- to another. */
- bfd_boolean (*_bfd_copy_private_bfd_data) (bfd *, bfd *);
- /* Called to merge BFD general private data from one object file
- to a common output file when linking. */
- bfd_boolean (*_bfd_merge_private_bfd_data) (bfd *, bfd *);
- /* Called to initialize BFD private section data from one object file
- to another. */
- #define bfd_init_private_section_data(ibfd, isec, obfd, osec, link_info) \
- BFD_SEND (obfd, _bfd_init_private_section_data, (ibfd, isec, obfd, osec, link_info))
- bfd_boolean (*_bfd_init_private_section_data)
- (bfd *, sec_ptr, bfd *, sec_ptr, struct bfd_link_info *);
- /* Called to copy BFD private section data from one object file
- to another. */
- bfd_boolean (*_bfd_copy_private_section_data)
- (bfd *, sec_ptr, bfd *, sec_ptr);
- /* Called to copy BFD private symbol data from one symbol
- to another. */
- bfd_boolean (*_bfd_copy_private_symbol_data)
- (bfd *, asymbol *, bfd *, asymbol *);
- /* Called to copy BFD private header data from one object file
- to another. */
- bfd_boolean (*_bfd_copy_private_header_data)
- (bfd *, bfd *);
- /* Called to set private backend flags. */
- bfd_boolean (*_bfd_set_private_flags) (bfd *, flagword);
-
- /* Called to print private BFD data. */
- bfd_boolean (*_bfd_print_private_bfd_data) (bfd *, void *);
-
- /* Core file entry points. */
- #define BFD_JUMP_TABLE_CORE(NAME) \
- NAME##_core_file_failing_command, \
- NAME##_core_file_failing_signal, \
- NAME##_core_file_matches_executable_p, \
- NAME##_core_file_pid
-
- char * (*_core_file_failing_command) (bfd *);
- int (*_core_file_failing_signal) (bfd *);
- bfd_boolean (*_core_file_matches_executable_p) (bfd *, bfd *);
- int (*_core_file_pid) (bfd *);
-
- /* Archive entry points. */
- #define BFD_JUMP_TABLE_ARCHIVE(NAME) \
- NAME##_slurp_armap, \
- NAME##_slurp_extended_name_table, \
- NAME##_construct_extended_name_table, \
- NAME##_truncate_arname, \
- NAME##_write_armap, \
- NAME##_read_ar_hdr, \
- NAME##_write_ar_hdr, \
- NAME##_openr_next_archived_file, \
- NAME##_get_elt_at_index, \
- NAME##_generic_stat_arch_elt, \
- NAME##_update_armap_timestamp
-
- bfd_boolean (*_bfd_slurp_armap) (bfd *);
- bfd_boolean (*_bfd_slurp_extended_name_table) (bfd *);
- bfd_boolean (*_bfd_construct_extended_name_table)
- (bfd *, char **, bfd_size_type *, const char **);
- void (*_bfd_truncate_arname) (bfd *, const char *, char *);
- bfd_boolean (*write_armap)
- (bfd *, unsigned int, struct orl *, unsigned int, int);
- void * (*_bfd_read_ar_hdr_fn) (bfd *);
- bfd_boolean (*_bfd_write_ar_hdr_fn) (bfd *, bfd *);
- bfd * (*openr_next_archived_file) (bfd *, bfd *);
- #define bfd_get_elt_at_index(b,i) BFD_SEND (b, _bfd_get_elt_at_index, (b,i))
- bfd * (*_bfd_get_elt_at_index) (bfd *, symindex);
- int (*_bfd_stat_arch_elt) (bfd *, struct stat *);
- bfd_boolean (*_bfd_update_armap_timestamp) (bfd *);
-
- /* Entry points used for symbols. */
- #define BFD_JUMP_TABLE_SYMBOLS(NAME) \
- NAME##_get_symtab_upper_bound, \
- NAME##_canonicalize_symtab, \
- NAME##_make_empty_symbol, \
- NAME##_print_symbol, \
- NAME##_get_symbol_info, \
- NAME##_bfd_is_local_label_name, \
- NAME##_bfd_is_target_special_symbol, \
- NAME##_get_lineno, \
- NAME##_find_nearest_line, \
- _bfd_generic_find_nearest_line_discriminator, \
- _bfd_generic_find_line, \
- NAME##_find_inliner_info, \
- NAME##_bfd_make_debug_symbol, \
- NAME##_read_minisymbols, \
- NAME##_minisymbol_to_symbol
-
- long (*_bfd_get_symtab_upper_bound) (bfd *);
- long (*_bfd_canonicalize_symtab)
- (bfd *, struct bfd_symbol **);
- struct bfd_symbol *
- (*_bfd_make_empty_symbol) (bfd *);
- void (*_bfd_print_symbol)
- (bfd *, void *, struct bfd_symbol *, bfd_print_symbol_type);
- #define bfd_print_symbol(b,p,s,e) BFD_SEND (b, _bfd_print_symbol, (b,p,s,e))
- void (*_bfd_get_symbol_info)
- (bfd *, struct bfd_symbol *, symbol_info *);
- #define bfd_get_symbol_info(b,p,e) BFD_SEND (b, _bfd_get_symbol_info, (b,p,e))
- bfd_boolean (*_bfd_is_local_label_name) (bfd *, const char *);
- bfd_boolean (*_bfd_is_target_special_symbol) (bfd *, asymbol *);
- alent * (*_get_lineno) (bfd *, struct bfd_symbol *);
- bfd_boolean (*_bfd_find_nearest_line)
- (bfd *, struct bfd_section *, struct bfd_symbol **, bfd_vma,
- const char **, const char **, unsigned int *);
- bfd_boolean (*_bfd_find_nearest_line_discriminator)
- (bfd *, struct bfd_section *, struct bfd_symbol **, bfd_vma,
- const char **, const char **, unsigned int *, unsigned int *);
- bfd_boolean (*_bfd_find_line)
- (bfd *, struct bfd_symbol **, struct bfd_symbol *,
- const char **, unsigned int *);
- bfd_boolean (*_bfd_find_inliner_info)
- (bfd *, const char **, const char **, unsigned int *);
- /* Back-door to allow format-aware applications to create debug symbols
- while using BFD for everything else. Currently used by the assembler
- when creating COFF files. */
- asymbol * (*_bfd_make_debug_symbol)
- (bfd *, void *, unsigned long size);
- #define bfd_read_minisymbols(b, d, m, s) \
- BFD_SEND (b, _read_minisymbols, (b, d, m, s))
- long (*_read_minisymbols)
- (bfd *, bfd_boolean, void **, unsigned int *);
- #define bfd_minisymbol_to_symbol(b, d, m, f) \
- BFD_SEND (b, _minisymbol_to_symbol, (b, d, m, f))
- asymbol * (*_minisymbol_to_symbol)
- (bfd *, bfd_boolean, const void *, asymbol *);
-
- /* Routines for relocs. */
- #define BFD_JUMP_TABLE_RELOCS(NAME) \
- NAME##_get_reloc_upper_bound, \
- NAME##_canonicalize_reloc, \
- NAME##_bfd_reloc_type_lookup, \
- NAME##_bfd_reloc_name_lookup
-
- long (*_get_reloc_upper_bound) (bfd *, sec_ptr);
- long (*_bfd_canonicalize_reloc)
- (bfd *, sec_ptr, arelent **, struct bfd_symbol **);
- /* See documentation on reloc types. */
- reloc_howto_type *
- (*reloc_type_lookup) (bfd *, bfd_reloc_code_real_type);
- reloc_howto_type *
- (*reloc_name_lookup) (bfd *, const char *);
-
-
- /* Routines used when writing an object file. */
- #define BFD_JUMP_TABLE_WRITE(NAME) \
- NAME##_set_arch_mach, \
- NAME##_set_section_contents
-
- bfd_boolean (*_bfd_set_arch_mach)
- (bfd *, enum bfd_architecture, unsigned long);
- bfd_boolean (*_bfd_set_section_contents)
- (bfd *, sec_ptr, const void *, file_ptr, bfd_size_type);
-
- /* Routines used by the linker. */
- #define BFD_JUMP_TABLE_LINK(NAME) \
- NAME##_sizeof_headers, \
- NAME##_bfd_get_relocated_section_contents, \
- NAME##_bfd_relax_section, \
- NAME##_bfd_link_hash_table_create, \
- NAME##_bfd_link_hash_table_free, \
- NAME##_bfd_link_add_symbols, \
- NAME##_bfd_link_just_syms, \
- NAME##_bfd_copy_link_hash_symbol_type, \
- NAME##_bfd_final_link, \
- NAME##_bfd_link_split_section, \
- NAME##_bfd_gc_sections, \
- NAME##_bfd_lookup_section_flags, \
- NAME##_bfd_merge_sections, \
- NAME##_bfd_is_group_section, \
- NAME##_bfd_discard_group, \
- NAME##_section_already_linked, \
- NAME##_bfd_define_common_symbol
-
- int (*_bfd_sizeof_headers) (bfd *, struct bfd_link_info *);
- bfd_byte * (*_bfd_get_relocated_section_contents)
- (bfd *, struct bfd_link_info *, struct bfd_link_order *,
- bfd_byte *, bfd_boolean, struct bfd_symbol **);
-
- bfd_boolean (*_bfd_relax_section)
- (bfd *, struct bfd_section *, struct bfd_link_info *, bfd_boolean *);
-
- /* Create a hash table for the linker. Different backends store
- different information in this table. */
- struct bfd_link_hash_table *
- (*_bfd_link_hash_table_create) (bfd *);
-
- /* Release the memory associated with the linker hash table. */
- void (*_bfd_link_hash_table_free) (struct bfd_link_hash_table *);
-
- /* Add symbols from this object file into the hash table. */
- bfd_boolean (*_bfd_link_add_symbols) (bfd *, struct bfd_link_info *);
-
- /* Indicate that we are only retrieving symbol values from this section. */
- void (*_bfd_link_just_syms) (asection *, struct bfd_link_info *);
-
- /* Copy the symbol type of a linker hash table entry. */
- #define bfd_copy_link_hash_symbol_type(b, t, f) \
- BFD_SEND (b, _bfd_copy_link_hash_symbol_type, (b, t, f))
- void (*_bfd_copy_link_hash_symbol_type)
- (bfd *, struct bfd_link_hash_entry *, struct bfd_link_hash_entry *);
-
- /* Do a link based on the link_order structures attached to each
- section of the BFD. */
- bfd_boolean (*_bfd_final_link) (bfd *, struct bfd_link_info *);
-
- /* Should this section be split up into smaller pieces during linking. */
- bfd_boolean (*_bfd_link_split_section) (bfd *, struct bfd_section *);
-
- /* Remove sections that are not referenced from the output. */
- bfd_boolean (*_bfd_gc_sections) (bfd *, struct bfd_link_info *);
-
- /* Sets the bitmask of allowed and disallowed section flags. */
- bfd_boolean (*_bfd_lookup_section_flags) (struct bfd_link_info *,
- struct flag_info *,
- asection *);
-
- /* Attempt to merge SEC_MERGE sections. */
- bfd_boolean (*_bfd_merge_sections) (bfd *, struct bfd_link_info *);
-
- /* Is this section a member of a group? */
- bfd_boolean (*_bfd_is_group_section) (bfd *, const struct bfd_section *);
-
- /* Discard members of a group. */
- bfd_boolean (*_bfd_discard_group) (bfd *, struct bfd_section *);
-
- /* Check if SEC has been already linked during a reloceatable or
- final link. */
- bfd_boolean (*_section_already_linked) (bfd *, asection *,
- struct bfd_link_info *);
-
- /* Define a common symbol. */
- bfd_boolean (*_bfd_define_common_symbol) (bfd *, struct bfd_link_info *,
- struct bfd_link_hash_entry *);
-
- /* Routines to handle dynamic symbols and relocs. */
- #define BFD_JUMP_TABLE_DYNAMIC(NAME) \
- NAME##_get_dynamic_symtab_upper_bound, \
- NAME##_canonicalize_dynamic_symtab, \
- NAME##_get_synthetic_symtab, \
- NAME##_get_dynamic_reloc_upper_bound, \
- NAME##_canonicalize_dynamic_reloc
-
- /* Get the amount of memory required to hold the dynamic symbols. */
- long (*_bfd_get_dynamic_symtab_upper_bound) (bfd *);
- /* Read in the dynamic symbols. */
- long (*_bfd_canonicalize_dynamic_symtab)
- (bfd *, struct bfd_symbol **);
- /* Create synthetized symbols. */
- long (*_bfd_get_synthetic_symtab)
- (bfd *, long, struct bfd_symbol **, long, struct bfd_symbol **,
- struct bfd_symbol **);
- /* Get the amount of memory required to hold the dynamic relocs. */
- long (*_bfd_get_dynamic_reloc_upper_bound) (bfd *);
- /* Read in the dynamic relocs. */
- long (*_bfd_canonicalize_dynamic_reloc)
- (bfd *, arelent **, struct bfd_symbol **);
- A pointer to an alternative bfd_target in case the current one is not
-satisfactory. This can happen when the target cpu supports both big
-and little endian code, and target chosen by the linker has the wrong
-endianness. The function open_output() in ld/ldlang.c uses this field
-to find an alternative output format that is suitable.
- /* Opposite endian version of this target. */
- const struct bfd_target * alternative_target;
-
- /* Data for use by back-end routines, which isn't
- generic enough to belong in this structure. */
- const void *backend_data;
-
- } bfd_target;
-
-2.12.1.1 `bfd_set_default_target'
-.................................
-
-*Synopsis*
- bfd_boolean bfd_set_default_target (const char *name);
- *Description*
-Set the default target vector to use when recognizing a BFD. This
-takes the name of the target, which may be a BFD target name or a
-configuration triplet.
-
-2.12.1.2 `bfd_find_target'
-..........................
-
-*Synopsis*
- const bfd_target *bfd_find_target (const char *target_name, bfd *abfd);
- *Description*
-Return a pointer to the transfer vector for the object target named
-TARGET_NAME. If TARGET_NAME is `NULL', choose the one in the
-environment variable `GNUTARGET'; if that is null or not defined, then
-choose the first entry in the target list. Passing in the string
-"default" or setting the environment variable to "default" will cause
-the first entry in the target list to be returned, and
-"target_defaulted" will be set in the BFD if ABFD isn't `NULL'. This
-causes `bfd_check_format' to loop over all the targets to find the one
-that matches the file being read.
-
-2.12.1.3 `bfd_get_target_info'
-..............................
-
-*Synopsis*
- const bfd_target *bfd_get_target_info (const char *target_name,
- bfd *abfd,
- bfd_boolean *is_bigendian,
- int *underscoring,
- const char **def_target_arch);
- *Description*
-Return a pointer to the transfer vector for the object target named
-TARGET_NAME. If TARGET_NAME is `NULL', choose the one in the
-environment variable `GNUTARGET'; if that is null or not defined, then
-choose the first entry in the target list. Passing in the string
-"default" or setting the environment variable to "default" will cause
-the first entry in the target list to be returned, and
-"target_defaulted" will be set in the BFD if ABFD isn't `NULL'. This
-causes `bfd_check_format' to loop over all the targets to find the one
-that matches the file being read. If IS_BIGENDIAN is not `NULL', then
-set this value to target's endian mode. True for big-endian, FALSE for
-little-endian or for invalid target. If UNDERSCORING is not `NULL',
-then set this value to target's underscoring mode. Zero for
-none-underscoring, -1 for invalid target, else the value of target
-vector's symbol underscoring. If DEF_TARGET_ARCH is not `NULL', then
-set it to the architecture string specified by the target_name.
-
-2.12.1.4 `bfd_target_list'
-..........................
-
-*Synopsis*
- const char ** bfd_target_list (void);
- *Description*
-Return a freshly malloced NULL-terminated vector of the names of all
-the valid BFD targets. Do not modify the names.
-
-2.12.1.5 `bfd_seach_for_target'
-...............................
-
-*Synopsis*
- const bfd_target *bfd_search_for_target
- (int (*search_func) (const bfd_target *, void *),
- void *);
- *Description*
-Return a pointer to the first transfer vector in the list of transfer
-vectors maintained by BFD that produces a non-zero result when passed
-to the function SEARCH_FUNC. The parameter DATA is passed, unexamined,
-to the search function.
-
-
-File: bfd.info, Node: Architectures, Next: Opening and Closing, Prev: Targets, Up: BFD front end
-
-2.13 Architectures
-==================
-
-BFD keeps one atom in a BFD describing the architecture of the data
-attached to the BFD: a pointer to a `bfd_arch_info_type'.
-
- Pointers to structures can be requested independently of a BFD so
-that an architecture's information can be interrogated without access
-to an open BFD.
-
- The architecture information is provided by each architecture
-package. The set of default architectures is selected by the macro
-`SELECT_ARCHITECTURES'. This is normally set up in the
-`config/TARGET.mt' file of your choice. If the name is not defined,
-then all the architectures supported are included.
-
- When BFD starts up, all the architectures are called with an
-initialize method. It is up to the architecture back end to insert as
-many items into the list of architectures as it wants to; generally
-this would be one for each machine and one for the default case (an
-item with a machine field of 0).
-
- BFD's idea of an architecture is implemented in `archures.c'.
-
-2.13.1 bfd_architecture
------------------------
-
-*Description*
-This enum gives the object file's CPU architecture, in a global
-sense--i.e., what processor family does it belong to? Another field
-indicates which processor within the family is in use. The machine
-gives a number which distinguishes different versions of the
-architecture, containing, for example, 2 and 3 for Intel i960 KA and
-i960 KB, and 68020 and 68030 for Motorola 68020 and 68030.
- enum bfd_architecture
- {
- bfd_arch_unknown, /* File arch not known. */
- bfd_arch_obscure, /* Arch known, not one of these. */
- bfd_arch_m68k, /* Motorola 68xxx */
- #define bfd_mach_m68000 1
- #define bfd_mach_m68008 2
- #define bfd_mach_m68010 3
- #define bfd_mach_m68020 4
- #define bfd_mach_m68030 5
- #define bfd_mach_m68040 6
- #define bfd_mach_m68060 7
- #define bfd_mach_cpu32 8
- #define bfd_mach_fido 9
- #define bfd_mach_mcf_isa_a_nodiv 10
- #define bfd_mach_mcf_isa_a 11
- #define bfd_mach_mcf_isa_a_mac 12
- #define bfd_mach_mcf_isa_a_emac 13
- #define bfd_mach_mcf_isa_aplus 14
- #define bfd_mach_mcf_isa_aplus_mac 15
- #define bfd_mach_mcf_isa_aplus_emac 16
- #define bfd_mach_mcf_isa_b_nousp 17
- #define bfd_mach_mcf_isa_b_nousp_mac 18
- #define bfd_mach_mcf_isa_b_nousp_emac 19
- #define bfd_mach_mcf_isa_b 20
- #define bfd_mach_mcf_isa_b_mac 21
- #define bfd_mach_mcf_isa_b_emac 22
- #define bfd_mach_mcf_isa_b_float 23
- #define bfd_mach_mcf_isa_b_float_mac 24
- #define bfd_mach_mcf_isa_b_float_emac 25
- #define bfd_mach_mcf_isa_c 26
- #define bfd_mach_mcf_isa_c_mac 27
- #define bfd_mach_mcf_isa_c_emac 28
- #define bfd_mach_mcf_isa_c_nodiv 29
- #define bfd_mach_mcf_isa_c_nodiv_mac 30
- #define bfd_mach_mcf_isa_c_nodiv_emac 31
- bfd_arch_vax, /* DEC Vax */
- bfd_arch_i960, /* Intel 960 */
- /* The order of the following is important.
- lower number indicates a machine type that
- only accepts a subset of the instructions
- available to machines with higher numbers.
- The exception is the "ca", which is
- incompatible with all other machines except
- "core". */
-
- #define bfd_mach_i960_core 1
- #define bfd_mach_i960_ka_sa 2
- #define bfd_mach_i960_kb_sb 3
- #define bfd_mach_i960_mc 4
- #define bfd_mach_i960_xa 5
- #define bfd_mach_i960_ca 6
- #define bfd_mach_i960_jx 7
- #define bfd_mach_i960_hx 8
-
- bfd_arch_or32, /* OpenRISC 32 */
-
- bfd_arch_sparc, /* SPARC */
- #define bfd_mach_sparc 1
- /* The difference between v8plus and v9 is that v9 is a true 64 bit env. */
- #define bfd_mach_sparc_sparclet 2
- #define bfd_mach_sparc_sparclite 3
- #define bfd_mach_sparc_v8plus 4
- #define bfd_mach_sparc_v8plusa 5 /* with ultrasparc add'ns. */
- #define bfd_mach_sparc_sparclite_le 6
- #define bfd_mach_sparc_v9 7
- #define bfd_mach_sparc_v9a 8 /* with ultrasparc add'ns. */
- #define bfd_mach_sparc_v8plusb 9 /* with cheetah add'ns. */
- #define bfd_mach_sparc_v9b 10 /* with cheetah add'ns. */
- /* Nonzero if MACH has the v9 instruction set. */
- #define bfd_mach_sparc_v9_p(mach) \
- ((mach) >= bfd_mach_sparc_v8plus && (mach) <= bfd_mach_sparc_v9b \
- && (mach) != bfd_mach_sparc_sparclite_le)
- /* Nonzero if MACH is a 64 bit sparc architecture. */
- #define bfd_mach_sparc_64bit_p(mach) \
- ((mach) >= bfd_mach_sparc_v9 && (mach) != bfd_mach_sparc_v8plusb)
- bfd_arch_spu, /* PowerPC SPU */
- #define bfd_mach_spu 256
- bfd_arch_mips, /* MIPS Rxxxx */
- #define bfd_mach_mips3000 3000
- #define bfd_mach_mips3900 3900
- #define bfd_mach_mips4000 4000
- #define bfd_mach_mips4010 4010
- #define bfd_mach_mips4100 4100
- #define bfd_mach_mips4111 4111
- #define bfd_mach_mips4120 4120
- #define bfd_mach_mips4300 4300
- #define bfd_mach_mips4400 4400
- #define bfd_mach_mips4600 4600
- #define bfd_mach_mips4650 4650
- #define bfd_mach_mips5000 5000
- #define bfd_mach_mips5400 5400
- #define bfd_mach_mips5500 5500
- #define bfd_mach_mips5900 5900
- #define bfd_mach_mips6000 6000
- #define bfd_mach_mips7000 7000
- #define bfd_mach_mips8000 8000
- #define bfd_mach_mips9000 9000
- #define bfd_mach_mips10000 10000
- #define bfd_mach_mips12000 12000
- #define bfd_mach_mips14000 14000
- #define bfd_mach_mips16000 16000
- #define bfd_mach_mips16 16
- #define bfd_mach_mips5 5
- #define bfd_mach_mips_loongson_2e 3001
- #define bfd_mach_mips_loongson_2f 3002
- #define bfd_mach_mips_loongson_3a 3003
- #define bfd_mach_mips_sb1 12310201 /* octal 'SB', 01 */
- #define bfd_mach_mips_octeon 6501
- #define bfd_mach_mips_octeonp 6601
- #define bfd_mach_mips_octeon2 6502
- #define bfd_mach_mips_xlr 887682 /* decimal 'XLR' */
- #define bfd_mach_mipsisa32 32
- #define bfd_mach_mipsisa32r2 33
- #define bfd_mach_mipsisa64 64
- #define bfd_mach_mipsisa64r2 65
- #define bfd_mach_mips_micromips 96
- bfd_arch_i386, /* Intel 386 */
- #define bfd_mach_i386_intel_syntax (1 << 0)
- #define bfd_mach_i386_i8086 (1 << 1)
- #define bfd_mach_i386_i386 (1 << 2)
- #define bfd_mach_x86_64 (1 << 3)
- #define bfd_mach_x64_32 (1 << 4)
- #define bfd_mach_i386_i386_intel_syntax (bfd_mach_i386_i386 | bfd_mach_i386_intel_syntax)
- #define bfd_mach_x86_64_intel_syntax (bfd_mach_x86_64 | bfd_mach_i386_intel_syntax)
- #define bfd_mach_x64_32_intel_syntax (bfd_mach_x64_32 | bfd_mach_i386_intel_syntax)
- bfd_arch_l1om, /* Intel L1OM */
- #define bfd_mach_l1om (1 << 5)
- #define bfd_mach_l1om_intel_syntax (bfd_mach_l1om | bfd_mach_i386_intel_syntax)
- bfd_arch_k1om, /* Intel K1OM */
- #define bfd_mach_k1om (1 << 6)
- #define bfd_mach_k1om_intel_syntax (bfd_mach_k1om | bfd_mach_i386_intel_syntax)
- #define bfd_mach_i386_nacl (1 << 7)
- #define bfd_mach_i386_i386_nacl (bfd_mach_i386_i386 | bfd_mach_i386_nacl)
- #define bfd_mach_x86_64_nacl (bfd_mach_x86_64 | bfd_mach_i386_nacl)
- #define bfd_mach_x64_32_nacl (bfd_mach_x64_32 | bfd_mach_i386_nacl)
- bfd_arch_we32k, /* AT&T WE32xxx */
- bfd_arch_tahoe, /* CCI/Harris Tahoe */
- bfd_arch_i860, /* Intel 860 */
- bfd_arch_i370, /* IBM 360/370 Mainframes */
- bfd_arch_romp, /* IBM ROMP PC/RT */
- bfd_arch_convex, /* Convex */
- bfd_arch_m88k, /* Motorola 88xxx */
- bfd_arch_m98k, /* Motorola 98xxx */
- bfd_arch_pyramid, /* Pyramid Technology */
- bfd_arch_h8300, /* Renesas H8/300 (formerly Hitachi H8/300) */
- #define bfd_mach_h8300 1
- #define bfd_mach_h8300h 2
- #define bfd_mach_h8300s 3
- #define bfd_mach_h8300hn 4
- #define bfd_mach_h8300sn 5
- #define bfd_mach_h8300sx 6
- #define bfd_mach_h8300sxn 7
- bfd_arch_pdp11, /* DEC PDP-11 */
- bfd_arch_plugin,
- bfd_arch_powerpc, /* PowerPC */
- #define bfd_mach_ppc 32
- #define bfd_mach_ppc64 64
- #define bfd_mach_ppc_403 403
- #define bfd_mach_ppc_403gc 4030
- #define bfd_mach_ppc_405 405
- #define bfd_mach_ppc_505 505
- #define bfd_mach_ppc_601 601
- #define bfd_mach_ppc_602 602
- #define bfd_mach_ppc_603 603
- #define bfd_mach_ppc_ec603e 6031
- #define bfd_mach_ppc_604 604
- #define bfd_mach_ppc_620 620
- #define bfd_mach_ppc_630 630
- #define bfd_mach_ppc_750 750
- #define bfd_mach_ppc_860 860
- #define bfd_mach_ppc_a35 35
- #define bfd_mach_ppc_rs64ii 642
- #define bfd_mach_ppc_rs64iii 643
- #define bfd_mach_ppc_7400 7400
- #define bfd_mach_ppc_e500 500
- #define bfd_mach_ppc_e500mc 5001
- #define bfd_mach_ppc_e500mc64 5005
- #define bfd_mach_ppc_e5500 5006
- #define bfd_mach_ppc_e6500 5007
- #define bfd_mach_ppc_titan 83
- #define bfd_mach_ppc_vle 84
- bfd_arch_rs6000, /* IBM RS/6000 */
- #define bfd_mach_rs6k 6000
- #define bfd_mach_rs6k_rs1 6001
- #define bfd_mach_rs6k_rsc 6003
- #define bfd_mach_rs6k_rs2 6002
- bfd_arch_hppa, /* HP PA RISC */
- #define bfd_mach_hppa10 10
- #define bfd_mach_hppa11 11
- #define bfd_mach_hppa20 20
- #define bfd_mach_hppa20w 25
- bfd_arch_d10v, /* Mitsubishi D10V */
- #define bfd_mach_d10v 1
- #define bfd_mach_d10v_ts2 2
- #define bfd_mach_d10v_ts3 3
- bfd_arch_d30v, /* Mitsubishi D30V */
- bfd_arch_dlx, /* DLX */
- bfd_arch_m68hc11, /* Motorola 68HC11 */
- bfd_arch_m68hc12, /* Motorola 68HC12 */
- #define bfd_mach_m6812_default 0
- #define bfd_mach_m6812 1
- #define bfd_mach_m6812s 2
- bfd_arch_m9s12x, /* Freescale S12X */
- bfd_arch_m9s12xg, /* Freescale XGATE */
- bfd_arch_z8k, /* Zilog Z8000 */
- #define bfd_mach_z8001 1
- #define bfd_mach_z8002 2
- bfd_arch_h8500, /* Renesas H8/500 (formerly Hitachi H8/500) */
- bfd_arch_sh, /* Renesas / SuperH SH (formerly Hitachi SH) */
- #define bfd_mach_sh 1
- #define bfd_mach_sh2 0x20
- #define bfd_mach_sh_dsp 0x2d
- #define bfd_mach_sh2a 0x2a
- #define bfd_mach_sh2a_nofpu 0x2b
- #define bfd_mach_sh2a_nofpu_or_sh4_nommu_nofpu 0x2a1
- #define bfd_mach_sh2a_nofpu_or_sh3_nommu 0x2a2
- #define bfd_mach_sh2a_or_sh4 0x2a3
- #define bfd_mach_sh2a_or_sh3e 0x2a4
- #define bfd_mach_sh2e 0x2e
- #define bfd_mach_sh3 0x30
- #define bfd_mach_sh3_nommu 0x31
- #define bfd_mach_sh3_dsp 0x3d
- #define bfd_mach_sh3e 0x3e
- #define bfd_mach_sh4 0x40
- #define bfd_mach_sh4_nofpu 0x41
- #define bfd_mach_sh4_nommu_nofpu 0x42
- #define bfd_mach_sh4a 0x4a
- #define bfd_mach_sh4a_nofpu 0x4b
- #define bfd_mach_sh4al_dsp 0x4d
- #define bfd_mach_sh5 0x50
- bfd_arch_alpha, /* Dec Alpha */
- #define bfd_mach_alpha_ev4 0x10
- #define bfd_mach_alpha_ev5 0x20
- #define bfd_mach_alpha_ev6 0x30
- bfd_arch_arm, /* Advanced Risc Machines ARM. */
- #define bfd_mach_arm_unknown 0
- #define bfd_mach_arm_2 1
- #define bfd_mach_arm_2a 2
- #define bfd_mach_arm_3 3
- #define bfd_mach_arm_3M 4
- #define bfd_mach_arm_4 5
- #define bfd_mach_arm_4T 6
- #define bfd_mach_arm_5 7
- #define bfd_mach_arm_5T 8
- #define bfd_mach_arm_5TE 9
- #define bfd_mach_arm_XScale 10
- #define bfd_mach_arm_ep9312 11
- #define bfd_mach_arm_iWMMXt 12
- #define bfd_mach_arm_iWMMXt2 13
- bfd_arch_ns32k, /* National Semiconductors ns32000 */
- bfd_arch_w65, /* WDC 65816 */
- bfd_arch_tic30, /* Texas Instruments TMS320C30 */
- bfd_arch_tic4x, /* Texas Instruments TMS320C3X/4X */
- #define bfd_mach_tic3x 30
- #define bfd_mach_tic4x 40
- bfd_arch_tic54x, /* Texas Instruments TMS320C54X */
- bfd_arch_tic6x, /* Texas Instruments TMS320C6X */
- bfd_arch_tic80, /* TI TMS320c80 (MVP) */
- bfd_arch_v850, /* NEC V850 */
- bfd_arch_v850_rh850,/* NEC V850 (using RH850 ABI) */
- #define bfd_mach_v850 1
- #define bfd_mach_v850e 'E'
- #define bfd_mach_v850e1 '1'
- #define bfd_mach_v850e2 0x4532
- #define bfd_mach_v850e2v3 0x45325633
- #define bfd_mach_v850e3v5 0x45335635 /* ('E'|'3'|'V'|'5') */
- bfd_arch_arc, /* ARC Cores */
- #define bfd_mach_arc_5 5
- #define bfd_mach_arc_6 6
- #define bfd_mach_arc_7 7
- #define bfd_mach_arc_8 8
- bfd_arch_m32c, /* Renesas M16C/M32C. */
- #define bfd_mach_m16c 0x75
- #define bfd_mach_m32c 0x78
- bfd_arch_m32r, /* Renesas M32R (formerly Mitsubishi M32R/D) */
- #define bfd_mach_m32r 1 /* For backwards compatibility. */
- #define bfd_mach_m32rx 'x'
- #define bfd_mach_m32r2 '2'
- bfd_arch_mn10200, /* Matsushita MN10200 */
- bfd_arch_mn10300, /* Matsushita MN10300 */
- #define bfd_mach_mn10300 300
- #define bfd_mach_am33 330
- #define bfd_mach_am33_2 332
- bfd_arch_fr30,
- #define bfd_mach_fr30 0x46523330
- bfd_arch_frv,
- #define bfd_mach_frv 1
- #define bfd_mach_frvsimple 2
- #define bfd_mach_fr300 300
- #define bfd_mach_fr400 400
- #define bfd_mach_fr450 450
- #define bfd_mach_frvtomcat 499 /* fr500 prototype */
- #define bfd_mach_fr500 500
- #define bfd_mach_fr550 550
- bfd_arch_moxie, /* The moxie processor */
- #define bfd_mach_moxie 1
- bfd_arch_mcore,
- bfd_arch_mep,
- #define bfd_mach_mep 1
- #define bfd_mach_mep_h1 0x6831
- #define bfd_mach_mep_c5 0x6335
- bfd_arch_metag,
- #define bfd_mach_metag 1
- bfd_arch_ia64, /* HP/Intel ia64 */
- #define bfd_mach_ia64_elf64 64
- #define bfd_mach_ia64_elf32 32
- bfd_arch_ip2k, /* Ubicom IP2K microcontrollers. */
- #define bfd_mach_ip2022 1
- #define bfd_mach_ip2022ext 2
- bfd_arch_iq2000, /* Vitesse IQ2000. */
- #define bfd_mach_iq2000 1
- #define bfd_mach_iq10 2
- bfd_arch_epiphany, /* Adapteva EPIPHANY */
- #define bfd_mach_epiphany16 1
- #define bfd_mach_epiphany32 2
- bfd_arch_mt,
- #define bfd_mach_ms1 1
- #define bfd_mach_mrisc2 2
- #define bfd_mach_ms2 3
- bfd_arch_pj,
- bfd_arch_avr, /* Atmel AVR microcontrollers. */
- #define bfd_mach_avr1 1
- #define bfd_mach_avr2 2
- #define bfd_mach_avr25 25
- #define bfd_mach_avr3 3
- #define bfd_mach_avr31 31
- #define bfd_mach_avr35 35
- #define bfd_mach_avr4 4
- #define bfd_mach_avr5 5
- #define bfd_mach_avr51 51
- #define bfd_mach_avr6 6
- #define bfd_mach_avrxmega1 101
- #define bfd_mach_avrxmega2 102
- #define bfd_mach_avrxmega3 103
- #define bfd_mach_avrxmega4 104
- #define bfd_mach_avrxmega5 105
- #define bfd_mach_avrxmega6 106
- #define bfd_mach_avrxmega7 107
- bfd_arch_bfin, /* ADI Blackfin */
- #define bfd_mach_bfin 1
- bfd_arch_cr16, /* National Semiconductor CompactRISC (ie CR16). */
- #define bfd_mach_cr16 1
- bfd_arch_cr16c, /* National Semiconductor CompactRISC. */
- #define bfd_mach_cr16c 1
- bfd_arch_crx, /* National Semiconductor CRX. */
- #define bfd_mach_crx 1
- bfd_arch_cris, /* Axis CRIS */
- #define bfd_mach_cris_v0_v10 255
- #define bfd_mach_cris_v32 32
- #define bfd_mach_cris_v10_v32 1032
- bfd_arch_rl78,
- #define bfd_mach_rl78 0x75
- bfd_arch_rx, /* Renesas RX. */
- #define bfd_mach_rx 0x75
- bfd_arch_s390, /* IBM s390 */
- #define bfd_mach_s390_31 31
- #define bfd_mach_s390_64 64
- bfd_arch_score, /* Sunplus score */
- #define bfd_mach_score3 3
- #define bfd_mach_score7 7
- bfd_arch_openrisc, /* OpenRISC */
- bfd_arch_mmix, /* Donald Knuth's educational processor. */
- bfd_arch_xstormy16,
- #define bfd_mach_xstormy16 1
- bfd_arch_msp430, /* Texas Instruments MSP430 architecture. */
- #define bfd_mach_msp11 11
- #define bfd_mach_msp110 110
- #define bfd_mach_msp12 12
- #define bfd_mach_msp13 13
- #define bfd_mach_msp14 14
- #define bfd_mach_msp15 15
- #define bfd_mach_msp16 16
- #define bfd_mach_msp20 20
- #define bfd_mach_msp21 21
- #define bfd_mach_msp22 22
- #define bfd_mach_msp23 23
- #define bfd_mach_msp24 24
- #define bfd_mach_msp26 26
- #define bfd_mach_msp31 31
- #define bfd_mach_msp32 32
- #define bfd_mach_msp33 33
- #define bfd_mach_msp41 41
- #define bfd_mach_msp42 42
- #define bfd_mach_msp43 43
- #define bfd_mach_msp44 44
- #define bfd_mach_msp430x 45
- #define bfd_mach_msp46 46
- #define bfd_mach_msp47 47
- #define bfd_mach_msp54 54
- bfd_arch_xc16x, /* Infineon's XC16X Series. */
- #define bfd_mach_xc16x 1
- #define bfd_mach_xc16xl 2
- #define bfd_mach_xc16xs 3
- bfd_arch_xgate, /* Freescale XGATE */
- #define bfd_mach_xgate 1
- bfd_arch_xtensa, /* Tensilica's Xtensa cores. */
- #define bfd_mach_xtensa 1
- bfd_arch_z80,
- #define bfd_mach_z80strict 1 /* No undocumented opcodes. */
- #define bfd_mach_z80 3 /* With ixl, ixh, iyl, and iyh. */
- #define bfd_mach_z80full 7 /* All undocumented instructions. */
- #define bfd_mach_r800 11 /* R800: successor with multiplication. */
- bfd_arch_lm32, /* Lattice Mico32 */
- #define bfd_mach_lm32 1
- bfd_arch_microblaze,/* Xilinx MicroBlaze. */
- bfd_arch_tilepro, /* Tilera TILEPro */
- bfd_arch_tilegx, /* Tilera TILE-Gx */
- #define bfd_mach_tilepro 1
- #define bfd_mach_tilegx 1
- #define bfd_mach_tilegx32 2
- bfd_arch_aarch64, /* AArch64 */
- #define bfd_mach_aarch64 0
- #define bfd_mach_aarch64_ilp32 32
- bfd_arch_nios2,
- #define bfd_mach_nios2 0
- bfd_arch_last
- };
-
-2.13.2 bfd_arch_info
---------------------
-
-*Description*
-This structure contains information on architectures for use within BFD.
-
- typedef struct bfd_arch_info
- {
- int bits_per_word;
- int bits_per_address;
- int bits_per_byte;
- enum bfd_architecture arch;
- unsigned long mach;
- const char *arch_name;
- const char *printable_name;
- unsigned int section_align_power;
- /* TRUE if this is the default machine for the architecture.
- The default arch should be the first entry for an arch so that
- all the entries for that arch can be accessed via `next'. */
- bfd_boolean the_default;
- const struct bfd_arch_info * (*compatible)
- (const struct bfd_arch_info *a, const struct bfd_arch_info *b);
-
- bfd_boolean (*scan) (const struct bfd_arch_info *, const char *);
-
- /* Allocate via bfd_malloc and return a fill buffer of size COUNT. If
- IS_BIGENDIAN is TRUE, the order of bytes is big endian. If CODE is
- TRUE, the buffer contains code. */
- void *(*fill) (bfd_size_type count, bfd_boolean is_bigendian,
- bfd_boolean code);
-
- const struct bfd_arch_info *next;
- }
- bfd_arch_info_type;
-
-2.13.2.1 `bfd_printable_name'
-.............................
-
-*Synopsis*
- const char *bfd_printable_name (bfd *abfd);
- *Description*
-Return a printable string representing the architecture and machine
-from the pointer to the architecture info structure.
-
-2.13.2.2 `bfd_scan_arch'
-........................
-
-*Synopsis*
- const bfd_arch_info_type *bfd_scan_arch (const char *string);
- *Description*
-Figure out if BFD supports any cpu which could be described with the
-name STRING. Return a pointer to an `arch_info' structure if a machine
-is found, otherwise NULL.
-
-2.13.2.3 `bfd_arch_list'
-........................
-
-*Synopsis*
- const char **bfd_arch_list (void);
- *Description*
-Return a freshly malloced NULL-terminated vector of the names of all
-the valid BFD architectures. Do not modify the names.
-
-2.13.2.4 `bfd_arch_get_compatible'
-..................................
-
-*Synopsis*
- const bfd_arch_info_type *bfd_arch_get_compatible
- (const bfd *abfd, const bfd *bbfd, bfd_boolean accept_unknowns);
- *Description*
-Determine whether two BFDs' architectures and machine types are
-compatible. Calculates the lowest common denominator between the two
-architectures and machine types implied by the BFDs and returns a
-pointer to an `arch_info' structure describing the compatible machine.
-
-2.13.2.5 `bfd_default_arch_struct'
-..................................
-
-*Description*
-The `bfd_default_arch_struct' is an item of `bfd_arch_info_type' which
-has been initialized to a fairly generic state. A BFD starts life by
-pointing to this structure, until the correct back end has determined
-the real architecture of the file.
- extern const bfd_arch_info_type bfd_default_arch_struct;
-
-2.13.2.6 `bfd_set_arch_info'
-............................
-
-*Synopsis*
- void bfd_set_arch_info (bfd *abfd, const bfd_arch_info_type *arg);
- *Description*
-Set the architecture info of ABFD to ARG.
-
-2.13.2.7 `bfd_default_set_arch_mach'
-....................................
-
-*Synopsis*
- bfd_boolean bfd_default_set_arch_mach
- (bfd *abfd, enum bfd_architecture arch, unsigned long mach);
- *Description*
-Set the architecture and machine type in BFD ABFD to ARCH and MACH.
-Find the correct pointer to a structure and insert it into the
-`arch_info' pointer.
-
-2.13.2.8 `bfd_get_arch'
-.......................
-
-*Synopsis*
- enum bfd_architecture bfd_get_arch (bfd *abfd);
- *Description*
-Return the enumerated type which describes the BFD ABFD's architecture.
-
-2.13.2.9 `bfd_get_mach'
-.......................
-
-*Synopsis*
- unsigned long bfd_get_mach (bfd *abfd);
- *Description*
-Return the long type which describes the BFD ABFD's machine.
-
-2.13.2.10 `bfd_arch_bits_per_byte'
-..................................
-
-*Synopsis*
- unsigned int bfd_arch_bits_per_byte (bfd *abfd);
- *Description*
-Return the number of bits in one of the BFD ABFD's architecture's bytes.
-
-2.13.2.11 `bfd_arch_bits_per_address'
-.....................................
-
-*Synopsis*
- unsigned int bfd_arch_bits_per_address (bfd *abfd);
- *Description*
-Return the number of bits in one of the BFD ABFD's architecture's
-addresses.
-
-2.13.2.12 `bfd_default_compatible'
-..................................
-
-*Synopsis*
- const bfd_arch_info_type *bfd_default_compatible
- (const bfd_arch_info_type *a, const bfd_arch_info_type *b);
- *Description*
-The default function for testing for compatibility.
-
-2.13.2.13 `bfd_default_scan'
-............................
-
-*Synopsis*
- bfd_boolean bfd_default_scan
- (const struct bfd_arch_info *info, const char *string);
- *Description*
-The default function for working out whether this is an architecture
-hit and a machine hit.
-
-2.13.2.14 `bfd_get_arch_info'
-.............................
-
-*Synopsis*
- const bfd_arch_info_type *bfd_get_arch_info (bfd *abfd);
- *Description*
-Return the architecture info struct in ABFD.
-
-2.13.2.15 `bfd_lookup_arch'
-...........................
-
-*Synopsis*
- const bfd_arch_info_type *bfd_lookup_arch
- (enum bfd_architecture arch, unsigned long machine);
- *Description*
-Look for the architecture info structure which matches the arguments
-ARCH and MACHINE. A machine of 0 matches the machine/architecture
-structure which marks itself as the default.
-
-2.13.2.16 `bfd_printable_arch_mach'
-...................................
-
-*Synopsis*
- const char *bfd_printable_arch_mach
- (enum bfd_architecture arch, unsigned long machine);
- *Description*
-Return a printable string representing the architecture and machine
-type.
-
- This routine is depreciated.
-
-2.13.2.17 `bfd_octets_per_byte'
-...............................
-
-*Synopsis*
- unsigned int bfd_octets_per_byte (bfd *abfd);
- *Description*
-Return the number of octets (8-bit quantities) per target byte (minimum
-addressable unit). In most cases, this will be one, but some DSP
-targets have 16, 32, or even 48 bits per byte.
-
-2.13.2.18 `bfd_arch_mach_octets_per_byte'
-.........................................
-
-*Synopsis*
- unsigned int bfd_arch_mach_octets_per_byte
- (enum bfd_architecture arch, unsigned long machine);
- *Description*
-See bfd_octets_per_byte.
-
- This routine is provided for those cases where a bfd * is not
-available
-
-2.13.2.19 `bfd_arch_default_fill'
-.................................
-
-*Synopsis*
- void *bfd_arch_default_fill (bfd_size_type count,
- bfd_boolean is_bigendian,
- bfd_boolean code);
- *Description*
-Allocate via bfd_malloc and return a fill buffer of size COUNT. If
-IS_BIGENDIAN is TRUE, the order of bytes is big endian. If CODE is
-TRUE, the buffer contains code.
-
-
-File: bfd.info, Node: Opening and Closing, Next: Internal, Prev: Architectures, Up: BFD front end
-
- /* Set to N to open the next N BFDs using an alternate id space. */
- extern unsigned int bfd_use_reserved_id;
-
-2.14 Opening and closing BFDs
-=============================
-
-2.14.1 Functions for opening and closing
-----------------------------------------
-
-2.14.1.1 `bfd_fopen'
-....................
-
-*Synopsis*
- bfd *bfd_fopen (const char *filename, const char *target,
- const char *mode, int fd);
- *Description*
-Open the file FILENAME with the target TARGET. Return a pointer to the
-created BFD. If FD is not -1, then `fdopen' is used to open the file;
-otherwise, `fopen' is used. MODE is passed directly to `fopen' or
-`fdopen'.
-
- Calls `bfd_find_target', so TARGET is interpreted as by that
-function.
-
- The new BFD is marked as cacheable iff FD is -1.
-
- If `NULL' is returned then an error has occured. Possible errors
-are `bfd_error_no_memory', `bfd_error_invalid_target' or `system_call'
-error.
-
- On error, FD is always closed.
-
-2.14.1.2 `bfd_openr'
-....................
-
-*Synopsis*
- bfd *bfd_openr (const char *filename, const char *target);
- *Description*
-Open the file FILENAME (using `fopen') with the target TARGET. Return
-a pointer to the created BFD.
-
- Calls `bfd_find_target', so TARGET is interpreted as by that
-function.
-
- If `NULL' is returned then an error has occured. Possible errors
-are `bfd_error_no_memory', `bfd_error_invalid_target' or `system_call'
-error.
-
-2.14.1.3 `bfd_fdopenr'
-......................
-
-*Synopsis*
- bfd *bfd_fdopenr (const char *filename, const char *target, int fd);
- *Description*
-`bfd_fdopenr' is to `bfd_fopenr' much like `fdopen' is to `fopen'. It
-opens a BFD on a file already described by the FD supplied.
-
- When the file is later `bfd_close'd, the file descriptor will be
-closed. If the caller desires that this file descriptor be cached by
-BFD (opened as needed, closed as needed to free descriptors for other
-opens), with the supplied FD used as an initial file descriptor (but
-subject to closure at any time), call bfd_set_cacheable(bfd, 1) on the
-returned BFD. The default is to assume no caching; the file descriptor
-will remain open until `bfd_close', and will not be affected by BFD
-operations on other files.
-
- Possible errors are `bfd_error_no_memory',
-`bfd_error_invalid_target' and `bfd_error_system_call'.
-
- On error, FD is closed.
-
-2.14.1.4 `bfd_openstreamr'
-..........................
-
-*Synopsis*
- bfd *bfd_openstreamr (const char *, const char *, void *);
- *Description*
-Open a BFD for read access on an existing stdio stream. When the BFD
-is passed to `bfd_close', the stream will be closed.
-
-2.14.1.5 `bfd_openr_iovec'
-..........................
-
-*Synopsis*
- bfd *bfd_openr_iovec (const char *filename, const char *target,
- void *(*open_func) (struct bfd *nbfd,
- void *open_closure),
- void *open_closure,
- file_ptr (*pread_func) (struct bfd *nbfd,
- void *stream,
- void *buf,
- file_ptr nbytes,
- file_ptr offset),
- int (*close_func) (struct bfd *nbfd,
- void *stream),
- int (*stat_func) (struct bfd *abfd,
- void *stream,
- struct stat *sb));
- *Description*
-Create and return a BFD backed by a read-only STREAM. The STREAM is
-created using OPEN_FUNC, accessed using PREAD_FUNC and destroyed using
-CLOSE_FUNC.
-
- Calls `bfd_find_target', so TARGET is interpreted as by that
-function.
-
- Calls OPEN_FUNC (which can call `bfd_zalloc' and `bfd_get_filename')
-to obtain the read-only stream backing the BFD. OPEN_FUNC either
-succeeds returning the non-`NULL' STREAM, or fails returning `NULL'
-(setting `bfd_error').
-
- Calls PREAD_FUNC to request NBYTES of data from STREAM starting at
-OFFSET (e.g., via a call to `bfd_read'). PREAD_FUNC either succeeds
-returning the number of bytes read (which can be less than NBYTES when
-end-of-file), or fails returning -1 (setting `bfd_error').
-
- Calls CLOSE_FUNC when the BFD is later closed using `bfd_close'.
-CLOSE_FUNC either succeeds returning 0, or fails returning -1 (setting
-`bfd_error').
-
- Calls STAT_FUNC to fill in a stat structure for bfd_stat,
-bfd_get_size, and bfd_get_mtime calls. STAT_FUNC returns 0 on success,
-or returns -1 on failure (setting `bfd_error').
-
- If `bfd_openr_iovec' returns `NULL' then an error has occurred.
-Possible errors are `bfd_error_no_memory', `bfd_error_invalid_target'
-and `bfd_error_system_call'.
-
-2.14.1.6 `bfd_openw'
-....................
-
-*Synopsis*
- bfd *bfd_openw (const char *filename, const char *target);
- *Description*
-Create a BFD, associated with file FILENAME, using the file format
-TARGET, and return a pointer to it.
-
- Possible errors are `bfd_error_system_call', `bfd_error_no_memory',
-`bfd_error_invalid_target'.
-
-2.14.1.7 `bfd_close'
-....................
-
-*Synopsis*
- bfd_boolean bfd_close (bfd *abfd);
- *Description*
-Close a BFD. If the BFD was open for writing, then pending operations
-are completed and the file written out and closed. If the created file
-is executable, then `chmod' is called to mark it as such.
-
- All memory attached to the BFD is released.
-
- The file descriptor associated with the BFD is closed (even if it
-was passed in to BFD by `bfd_fdopenr').
-
- *Returns*
-`TRUE' is returned if all is ok, otherwise `FALSE'.
-
-2.14.1.8 `bfd_close_all_done'
-.............................
-
-*Synopsis*
- bfd_boolean bfd_close_all_done (bfd *);
- *Description*
-Close a BFD. Differs from `bfd_close' since it does not complete any
-pending operations. This routine would be used if the application had
-just used BFD for swapping and didn't want to use any of the writing
-code.
-
- If the created file is executable, then `chmod' is called to mark it
-as such.
-
- All memory attached to the BFD is released.
-
- *Returns*
-`TRUE' is returned if all is ok, otherwise `FALSE'.
-
-2.14.1.9 `bfd_create'
-.....................
-
-*Synopsis*
- bfd *bfd_create (const char *filename, bfd *templ);
- *Description*
-Create a new BFD in the manner of `bfd_openw', but without opening a
-file. The new BFD takes the target from the target used by TEMPL. The
-format is always set to `bfd_object'.
-
-2.14.1.10 `bfd_make_writable'
-.............................
-
-*Synopsis*
- bfd_boolean bfd_make_writable (bfd *abfd);
- *Description*
-Takes a BFD as created by `bfd_create' and converts it into one like as
-returned by `bfd_openw'. It does this by converting the BFD to
-BFD_IN_MEMORY. It's assumed that you will call `bfd_make_readable' on
-this bfd later.
-
- *Returns*
-`TRUE' is returned if all is ok, otherwise `FALSE'.
-
-2.14.1.11 `bfd_make_readable'
-.............................
-
-*Synopsis*
- bfd_boolean bfd_make_readable (bfd *abfd);
- *Description*
-Takes a BFD as created by `bfd_create' and `bfd_make_writable' and
-converts it into one like as returned by `bfd_openr'. It does this by
-writing the contents out to the memory buffer, then reversing the
-direction.
-
- *Returns*
-`TRUE' is returned if all is ok, otherwise `FALSE'.
-
-2.14.1.12 `bfd_alloc'
-.....................
-
-*Synopsis*
- void *bfd_alloc (bfd *abfd, bfd_size_type wanted);
- *Description*
-Allocate a block of WANTED bytes of memory attached to `abfd' and
-return a pointer to it.
-
-2.14.1.13 `bfd_alloc2'
-......................
-
-*Synopsis*
- void *bfd_alloc2 (bfd *abfd, bfd_size_type nmemb, bfd_size_type size);
- *Description*
-Allocate a block of NMEMB elements of SIZE bytes each of memory
-attached to `abfd' and return a pointer to it.
-
-2.14.1.14 `bfd_zalloc'
-......................
-
-*Synopsis*
- void *bfd_zalloc (bfd *abfd, bfd_size_type wanted);
- *Description*
-Allocate a block of WANTED bytes of zeroed memory attached to `abfd'
-and return a pointer to it.
-
-2.14.1.15 `bfd_zalloc2'
-.......................
-
-*Synopsis*
- void *bfd_zalloc2 (bfd *abfd, bfd_size_type nmemb, bfd_size_type size);
- *Description*
-Allocate a block of NMEMB elements of SIZE bytes each of zeroed memory
-attached to `abfd' and return a pointer to it.
-
-2.14.1.16 `bfd_calc_gnu_debuglink_crc32'
-........................................
-
-*Synopsis*
- unsigned long bfd_calc_gnu_debuglink_crc32
- (unsigned long crc, const unsigned char *buf, bfd_size_type len);
- *Description*
-Computes a CRC value as used in the .gnu_debuglink section. Advances
-the previously computed CRC value by computing and adding in the crc32
-for LEN bytes of BUF.
-
- *Returns*
-Return the updated CRC32 value.
-
-2.14.1.17 `bfd_get_debug_link_info'
-...................................
-
-*Synopsis*
- char *bfd_get_debug_link_info (bfd *abfd, unsigned long *crc32_out);
- *Description*
-fetch the filename and CRC32 value for any separate debuginfo
-associated with ABFD. Return NULL if no such info found, otherwise
-return filename and update CRC32_OUT. The returned filename is
-allocated with `malloc'; freeing it is the responsibility of the caller.
-
-2.14.1.18 `bfd_get_alt_debug_link_info'
-.......................................
-
-*Synopsis*
- char *bfd_get_alt_debug_link_info (bfd *abfd, unsigned long *crc32_out);
- *Description*
-Fetch the filename and BuildID value for any alternate debuginfo
-associated with ABFD. Return NULL if no such info found, otherwise
-return filename and update BUILDID_OUT. The returned filename is
-allocated with `malloc'; freeing it is the responsibility of the caller.
-
-2.14.1.19 `separate_debug_file_exists'
-......................................
-
-*Synopsis*
- bfd_boolean separate_debug_file_exists
- (char *name, unsigned long crc32);
- *Description*
-Checks to see if NAME is a file and if its contents match CRC32.
-
-2.14.1.20 `separate_alt_debug_file_exists'
-..........................................
-
-*Synopsis*
- bfd_boolean separate_alt_debug_file_exists
- (char *name, unsigned long crc32);
- *Description*
-Checks to see if NAME is a file and if its BuildID matches BUILDID.
-
-2.14.1.21 `find_separate_debug_file'
-....................................
-
-*Synopsis*
- char *find_separate_debug_file (bfd *abfd);
- *Description*
-Searches ABFD for a section called SECTION_NAME which is expected to
-contain a reference to a file containing separate debugging
-information. The function scans various locations in the filesystem,
-including the file tree rooted at DEBUG_FILE_DIRECTORY, and returns the
-first matching filename that it finds. If CHECK_CRC is TRUE then the
-contents of the file must also match the CRC value contained in
-SECTION_NAME. Returns NULL if no valid file could be found.
-
-2.14.1.22 `bfd_follow_gnu_debuglink'
-....................................
-
-*Synopsis*
- char *bfd_follow_gnu_debuglink (bfd *abfd, const char *dir);
- *Description*
-Takes a BFD and searches it for a .gnu_debuglink section. If this
-section is found, it examines the section for the name and checksum of
-a '.debug' file containing auxiliary debugging information. It then
-searches the filesystem for this .debug file in some standard
-locations, including the directory tree rooted at DIR, and if found
-returns the full filename.
-
- If DIR is NULL, it will search a default path configured into libbfd
-at build time. [XXX this feature is not currently implemented].
-
- *Returns*
-`NULL' on any errors or failure to locate the .debug file, otherwise a
-pointer to a heap-allocated string containing the filename. The caller
-is responsible for freeing this string.
-
-2.14.1.23 `bfd_follow_gnu_debugaltlink'
-.......................................
-
-*Synopsis*
- char *bfd_follow_gnu_debugaltlink (bfd *abfd, const char *dir);
- *Description*
-Takes a BFD and searches it for a .gnu_debugaltlink section. If this
-section is found, it examines the section for the name of a file
-containing auxiliary debugging information. It then searches the
-filesystem for this file in a set of standard locations, including the
-directory tree rooted at DIR, and if found returns the full filename.
-
- If DIR is NULL, it will search a default path configured into libbfd
-at build time. [FIXME: This feature is not currently implemented].
-
- *Returns*
-`NULL' on any errors or failure to locate the debug file, otherwise a
-pointer to a heap-allocated string containing the filename. The caller
-is responsible for freeing this string.
-
-2.14.1.24 `bfd_create_gnu_debuglink_section'
-............................................
-
-*Synopsis*
- struct bfd_section *bfd_create_gnu_debuglink_section
- (bfd *abfd, const char *filename);
- *Description*
-Takes a BFD and adds a .gnu_debuglink section to it. The section is
-sized to be big enough to contain a link to the specified FILENAME.
-
- *Returns*
-A pointer to the new section is returned if all is ok. Otherwise
-`NULL' is returned and bfd_error is set.
-
-2.14.1.25 `bfd_fill_in_gnu_debuglink_section'
-.............................................
-
-*Synopsis*
- bfd_boolean bfd_fill_in_gnu_debuglink_section
- (bfd *abfd, struct bfd_section *sect, const char *filename);
- *Description*
-Takes a BFD and containing a .gnu_debuglink section SECT and fills in
-the contents of the section to contain a link to the specified
-FILENAME. The filename should be relative to the current directory.
-
- *Returns*
-`TRUE' is returned if all is ok. Otherwise `FALSE' is returned and
-bfd_error is set.
-
-
-File: bfd.info, Node: Internal, Next: File Caching, Prev: Opening and Closing, Up: BFD front end
-
-2.15 Implementation details
-===========================
-
-2.15.1 Internal functions
--------------------------
-
-*Description*
-These routines are used within BFD. They are not intended for export,
-but are documented here for completeness.
-
-2.15.1.1 `bfd_write_bigendian_4byte_int'
-........................................
-
-*Synopsis*
- bfd_boolean bfd_write_bigendian_4byte_int (bfd *, unsigned int);
- *Description*
-Write a 4 byte integer I to the output BFD ABFD, in big endian order
-regardless of what else is going on. This is useful in archives.
-
-2.15.1.2 `bfd_put_size'
-.......................
-
-2.15.1.3 `bfd_get_size'
-.......................
-
-*Description*
-These macros as used for reading and writing raw data in sections; each
-access (except for bytes) is vectored through the target format of the
-BFD and mangled accordingly. The mangling performs any necessary endian
-translations and removes alignment restrictions. Note that types
-accepted and returned by these macros are identical so they can be
-swapped around in macros--for example, `libaout.h' defines `GET_WORD'
-to either `bfd_get_32' or `bfd_get_64'.
-
- In the put routines, VAL must be a `bfd_vma'. If we are on a system
-without prototypes, the caller is responsible for making sure that is
-true, with a cast if necessary. We don't cast them in the macro
-definitions because that would prevent `lint' or `gcc -Wall' from
-detecting sins such as passing a pointer. To detect calling these with
-less than a `bfd_vma', use `gcc -Wconversion' on a host with 64 bit
-`bfd_vma''s.
-
- /* Byte swapping macros for user section data. */
-
- #define bfd_put_8(abfd, val, ptr) \
- ((void) (*((unsigned char *) (ptr)) = (val) & 0xff))
- #define bfd_put_signed_8 \
- bfd_put_8
- #define bfd_get_8(abfd, ptr) \
- (*(const unsigned char *) (ptr) & 0xff)
- #define bfd_get_signed_8(abfd, ptr) \
- (((*(const unsigned char *) (ptr) & 0xff) ^ 0x80) - 0x80)
-
- #define bfd_put_16(abfd, val, ptr) \
- BFD_SEND (abfd, bfd_putx16, ((val),(ptr)))
- #define bfd_put_signed_16 \
- bfd_put_16
- #define bfd_get_16(abfd, ptr) \
- BFD_SEND (abfd, bfd_getx16, (ptr))
- #define bfd_get_signed_16(abfd, ptr) \
- BFD_SEND (abfd, bfd_getx_signed_16, (ptr))
-
- #define bfd_put_32(abfd, val, ptr) \
- BFD_SEND (abfd, bfd_putx32, ((val),(ptr)))
- #define bfd_put_signed_32 \
- bfd_put_32
- #define bfd_get_32(abfd, ptr) \
- BFD_SEND (abfd, bfd_getx32, (ptr))
- #define bfd_get_signed_32(abfd, ptr) \
- BFD_SEND (abfd, bfd_getx_signed_32, (ptr))
-
- #define bfd_put_64(abfd, val, ptr) \
- BFD_SEND (abfd, bfd_putx64, ((val), (ptr)))
- #define bfd_put_signed_64 \
- bfd_put_64
- #define bfd_get_64(abfd, ptr) \
- BFD_SEND (abfd, bfd_getx64, (ptr))
- #define bfd_get_signed_64(abfd, ptr) \
- BFD_SEND (abfd, bfd_getx_signed_64, (ptr))
-
- #define bfd_get(bits, abfd, ptr) \
- ((bits) == 8 ? (bfd_vma) bfd_get_8 (abfd, ptr) \
- : (bits) == 16 ? bfd_get_16 (abfd, ptr) \
- : (bits) == 32 ? bfd_get_32 (abfd, ptr) \
- : (bits) == 64 ? bfd_get_64 (abfd, ptr) \
- : (abort (), (bfd_vma) - 1))
-
- #define bfd_put(bits, abfd, val, ptr) \
- ((bits) == 8 ? bfd_put_8 (abfd, val, ptr) \
- : (bits) == 16 ? bfd_put_16 (abfd, val, ptr) \
- : (bits) == 32 ? bfd_put_32 (abfd, val, ptr) \
- : (bits) == 64 ? bfd_put_64 (abfd, val, ptr) \
- : (abort (), (void) 0))
-
-2.15.1.4 `bfd_h_put_size'
-.........................
-
-*Description*
-These macros have the same function as their `bfd_get_x' brethren,
-except that they are used for removing information for the header
-records of object files. Believe it or not, some object files keep
-their header records in big endian order and their data in little
-endian order.
-
- /* Byte swapping macros for file header data. */
-
- #define bfd_h_put_8(abfd, val, ptr) \
- bfd_put_8 (abfd, val, ptr)
- #define bfd_h_put_signed_8(abfd, val, ptr) \
- bfd_put_8 (abfd, val, ptr)
- #define bfd_h_get_8(abfd, ptr) \
- bfd_get_8 (abfd, ptr)
- #define bfd_h_get_signed_8(abfd, ptr) \
- bfd_get_signed_8 (abfd, ptr)
-
- #define bfd_h_put_16(abfd, val, ptr) \
- BFD_SEND (abfd, bfd_h_putx16, (val, ptr))
- #define bfd_h_put_signed_16 \
- bfd_h_put_16
- #define bfd_h_get_16(abfd, ptr) \
- BFD_SEND (abfd, bfd_h_getx16, (ptr))
- #define bfd_h_get_signed_16(abfd, ptr) \
- BFD_SEND (abfd, bfd_h_getx_signed_16, (ptr))
-
- #define bfd_h_put_32(abfd, val, ptr) \
- BFD_SEND (abfd, bfd_h_putx32, (val, ptr))
- #define bfd_h_put_signed_32 \
- bfd_h_put_32
- #define bfd_h_get_32(abfd, ptr) \
- BFD_SEND (abfd, bfd_h_getx32, (ptr))
- #define bfd_h_get_signed_32(abfd, ptr) \
- BFD_SEND (abfd, bfd_h_getx_signed_32, (ptr))
-
- #define bfd_h_put_64(abfd, val, ptr) \
- BFD_SEND (abfd, bfd_h_putx64, (val, ptr))
- #define bfd_h_put_signed_64 \
- bfd_h_put_64
- #define bfd_h_get_64(abfd, ptr) \
- BFD_SEND (abfd, bfd_h_getx64, (ptr))
- #define bfd_h_get_signed_64(abfd, ptr) \
- BFD_SEND (abfd, bfd_h_getx_signed_64, (ptr))
-
- /* Aliases for the above, which should eventually go away. */
-
- #define H_PUT_64 bfd_h_put_64
- #define H_PUT_32 bfd_h_put_32
- #define H_PUT_16 bfd_h_put_16
- #define H_PUT_8 bfd_h_put_8
- #define H_PUT_S64 bfd_h_put_signed_64
- #define H_PUT_S32 bfd_h_put_signed_32
- #define H_PUT_S16 bfd_h_put_signed_16
- #define H_PUT_S8 bfd_h_put_signed_8
- #define H_GET_64 bfd_h_get_64
- #define H_GET_32 bfd_h_get_32
- #define H_GET_16 bfd_h_get_16
- #define H_GET_8 bfd_h_get_8
- #define H_GET_S64 bfd_h_get_signed_64
- #define H_GET_S32 bfd_h_get_signed_32
- #define H_GET_S16 bfd_h_get_signed_16
- #define H_GET_S8 bfd_h_get_signed_8
-
-2.15.1.5 `bfd_log2'
-...................
-
-*Synopsis*
- unsigned int bfd_log2 (bfd_vma x);
- *Description*
-Return the log base 2 of the value supplied, rounded up. E.g., an X of
-1025 returns 11. A X of 0 returns 0.
-
-
-File: bfd.info, Node: File Caching, Next: Linker Functions, Prev: Internal, Up: BFD front end
-
-2.16 File caching
-=================
-
-The file caching mechanism is embedded within BFD and allows the
-application to open as many BFDs as it wants without regard to the
-underlying operating system's file descriptor limit (often as low as 20
-open files). The module in `cache.c' maintains a least recently used
-list of `bfd_cache_max_open' files, and exports the name
-`bfd_cache_lookup', which runs around and makes sure that the required
-BFD is open. If not, then it chooses a file to close, closes it and
-opens the one wanted, returning its file handle.
-
-2.16.1 Caching functions
-------------------------
-
-2.16.1.1 `bfd_cache_init'
-.........................
-
-*Synopsis*
- bfd_boolean bfd_cache_init (bfd *abfd);
- *Description*
-Add a newly opened BFD to the cache.
-
-2.16.1.2 `bfd_cache_close'
-..........................
-
-*Synopsis*
- bfd_boolean bfd_cache_close (bfd *abfd);
- *Description*
-Remove the BFD ABFD from the cache. If the attached file is open, then
-close it too.
-
- *Returns*
-`FALSE' is returned if closing the file fails, `TRUE' is returned if
-all is well.
-
-2.16.1.3 `bfd_cache_close_all'
-..............................
-
-*Synopsis*
- bfd_boolean bfd_cache_close_all (void);
- *Description*
-Remove all BFDs from the cache. If the attached file is open, then
-close it too.
-
- *Returns*
-`FALSE' is returned if closing one of the file fails, `TRUE' is
-returned if all is well.
-
-2.16.1.4 `bfd_open_file'
-........................
-
-*Synopsis*
- FILE* bfd_open_file (bfd *abfd);
- *Description*
-Call the OS to open a file for ABFD. Return the `FILE *' (possibly
-`NULL') that results from this operation. Set up the BFD so that
-future accesses know the file is open. If the `FILE *' returned is
-`NULL', then it won't have been put in the cache, so it won't have to
-be removed from it.
-
-
-File: bfd.info, Node: Linker Functions, Next: Hash Tables, Prev: File Caching, Up: BFD front end
-
-2.17 Linker Functions
-=====================
-
-The linker uses three special entry points in the BFD target vector.
-It is not necessary to write special routines for these entry points
-when creating a new BFD back end, since generic versions are provided.
-However, writing them can speed up linking and make it use
-significantly less runtime memory.
-
- The first routine creates a hash table used by the other routines.
-The second routine adds the symbols from an object file to the hash
-table. The third routine takes all the object files and links them
-together to create the output file. These routines are designed so
-that the linker proper does not need to know anything about the symbols
-in the object files that it is linking. The linker merely arranges the
-sections as directed by the linker script and lets BFD handle the
-details of symbols and relocs.
-
- The second routine and third routines are passed a pointer to a
-`struct bfd_link_info' structure (defined in `bfdlink.h') which holds
-information relevant to the link, including the linker hash table
-(which was created by the first routine) and a set of callback
-functions to the linker proper.
-
- The generic linker routines are in `linker.c', and use the header
-file `genlink.h'. As of this writing, the only back ends which have
-implemented versions of these routines are a.out (in `aoutx.h') and
-ECOFF (in `ecoff.c'). The a.out routines are used as examples
-throughout this section.
-
-* Menu:
-
-* Creating a Linker Hash Table::
-* Adding Symbols to the Hash Table::
-* Performing the Final Link::
-
-
-File: bfd.info, Node: Creating a Linker Hash Table, Next: Adding Symbols to the Hash Table, Prev: Linker Functions, Up: Linker Functions
-
-2.17.1 Creating a linker hash table
------------------------------------
-
-The linker routines must create a hash table, which must be derived
-from `struct bfd_link_hash_table' described in `bfdlink.c'. *Note Hash
-Tables::, for information on how to create a derived hash table. This
-entry point is called using the target vector of the linker output file.
-
- The `_bfd_link_hash_table_create' entry point must allocate and
-initialize an instance of the desired hash table. If the back end does
-not require any additional information to be stored with the entries in
-the hash table, the entry point may simply create a `struct
-bfd_link_hash_table'. Most likely, however, some additional
-information will be needed.
-
- For example, with each entry in the hash table the a.out linker
-keeps the index the symbol has in the final output file (this index
-number is used so that when doing a relocatable link the symbol index
-used in the output file can be quickly filled in when copying over a
-reloc). The a.out linker code defines the required structures and
-functions for a hash table derived from `struct bfd_link_hash_table'.
-The a.out linker hash table is created by the function
-`NAME(aout,link_hash_table_create)'; it simply allocates space for the
-hash table, initializes it, and returns a pointer to it.
-
- When writing the linker routines for a new back end, you will
-generally not know exactly which fields will be required until you have
-finished. You should simply create a new hash table which defines no
-additional fields, and then simply add fields as they become necessary.
-
-
-File: bfd.info, Node: Adding Symbols to the Hash Table, Next: Performing the Final Link, Prev: Creating a Linker Hash Table, Up: Linker Functions
-
-2.17.2 Adding symbols to the hash table
----------------------------------------
-
-The linker proper will call the `_bfd_link_add_symbols' entry point for
-each object file or archive which is to be linked (typically these are
-the files named on the command line, but some may also come from the
-linker script). The entry point is responsible for examining the file.
-For an object file, BFD must add any relevant symbol information to
-the hash table. For an archive, BFD must determine which elements of
-the archive should be used and adding them to the link.
-
- The a.out version of this entry point is
-`NAME(aout,link_add_symbols)'.
-
-* Menu:
-
-* Differing file formats::
-* Adding symbols from an object file::
-* Adding symbols from an archive::
-
-
-File: bfd.info, Node: Differing file formats, Next: Adding symbols from an object file, Prev: Adding Symbols to the Hash Table, Up: Adding Symbols to the Hash Table
-
-2.17.2.1 Differing file formats
-...............................
-
-Normally all the files involved in a link will be of the same format,
-but it is also possible to link together different format object files,
-and the back end must support that. The `_bfd_link_add_symbols' entry
-point is called via the target vector of the file to be added. This
-has an important consequence: the function may not assume that the hash
-table is the type created by the corresponding
-`_bfd_link_hash_table_create' vector. All the `_bfd_link_add_symbols'
-function can assume about the hash table is that it is derived from
-`struct bfd_link_hash_table'.
-
- Sometimes the `_bfd_link_add_symbols' function must store some
-information in the hash table entry to be used by the `_bfd_final_link'
-function. In such a case the output bfd xvec must be checked to make
-sure that the hash table was created by an object file of the same
-format.
-
- The `_bfd_final_link' routine must be prepared to handle a hash
-entry without any extra information added by the
-`_bfd_link_add_symbols' function. A hash entry without extra
-information will also occur when the linker script directs the linker
-to create a symbol. Note that, regardless of how a hash table entry is
-added, all the fields will be initialized to some sort of null value by
-the hash table entry initialization function.
-
- See `ecoff_link_add_externals' for an example of how to check the
-output bfd before saving information (in this case, the ECOFF external
-symbol debugging information) in a hash table entry.
-
-
-File: bfd.info, Node: Adding symbols from an object file, Next: Adding symbols from an archive, Prev: Differing file formats, Up: Adding Symbols to the Hash Table
-
-2.17.2.2 Adding symbols from an object file
-...........................................
-
-When the `_bfd_link_add_symbols' routine is passed an object file, it
-must add all externally visible symbols in that object file to the hash
-table. The actual work of adding the symbol to the hash table is
-normally handled by the function `_bfd_generic_link_add_one_symbol'.
-The `_bfd_link_add_symbols' routine is responsible for reading all the
-symbols from the object file and passing the correct information to
-`_bfd_generic_link_add_one_symbol'.
-
- The `_bfd_link_add_symbols' routine should not use
-`bfd_canonicalize_symtab' to read the symbols. The point of providing
-this routine is to avoid the overhead of converting the symbols into
-generic `asymbol' structures.
-
- `_bfd_generic_link_add_one_symbol' handles the details of combining
-common symbols, warning about multiple definitions, and so forth. It
-takes arguments which describe the symbol to add, notably symbol flags,
-a section, and an offset. The symbol flags include such things as
-`BSF_WEAK' or `BSF_INDIRECT'. The section is a section in the object
-file, or something like `bfd_und_section_ptr' for an undefined symbol
-or `bfd_com_section_ptr' for a common symbol.
-
- If the `_bfd_final_link' routine is also going to need to read the
-symbol information, the `_bfd_link_add_symbols' routine should save it
-somewhere attached to the object file BFD. However, the information
-should only be saved if the `keep_memory' field of the `info' argument
-is TRUE, so that the `-no-keep-memory' linker switch is effective.
-
- The a.out function which adds symbols from an object file is
-`aout_link_add_object_symbols', and most of the interesting work is in
-`aout_link_add_symbols'. The latter saves pointers to the hash tables
-entries created by `_bfd_generic_link_add_one_symbol' indexed by symbol
-number, so that the `_bfd_final_link' routine does not have to call the
-hash table lookup routine to locate the entry.
-
-
-File: bfd.info, Node: Adding symbols from an archive, Prev: Adding symbols from an object file, Up: Adding Symbols to the Hash Table
-
-2.17.2.3 Adding symbols from an archive
-.......................................
-
-When the `_bfd_link_add_symbols' routine is passed an archive, it must
-look through the symbols defined by the archive and decide which
-elements of the archive should be included in the link. For each such
-element it must call the `add_archive_element' linker callback, and it
-must add the symbols from the object file to the linker hash table.
-(The callback may in fact indicate that a replacement BFD should be
-used, in which case the symbols from that BFD should be added to the
-linker hash table instead.)
-
- In most cases the work of looking through the symbols in the archive
-should be done by the `_bfd_generic_link_add_archive_symbols' function.
-This function builds a hash table from the archive symbol table and
-looks through the list of undefined symbols to see which elements
-should be included. `_bfd_generic_link_add_archive_symbols' is passed
-a function to call to make the final decision about adding an archive
-element to the link and to do the actual work of adding the symbols to
-the linker hash table.
-
- The function passed to `_bfd_generic_link_add_archive_symbols' must
-read the symbols of the archive element and decide whether the archive
-element should be included in the link. If the element is to be
-included, the `add_archive_element' linker callback routine must be
-called with the element as an argument, and the element's symbols must
-be added to the linker hash table just as though the element had itself
-been passed to the `_bfd_link_add_symbols' function. The
-`add_archive_element' callback has the option to indicate that it would
-like to replace the element archive with a substitute BFD, in which
-case it is the symbols of that substitute BFD that must be added to the
-linker hash table instead.
-
- When the a.out `_bfd_link_add_symbols' function receives an archive,
-it calls `_bfd_generic_link_add_archive_symbols' passing
-`aout_link_check_archive_element' as the function argument.
-`aout_link_check_archive_element' calls `aout_link_check_ar_symbols'.
-If the latter decides to add the element (an element is only added if
-it provides a real, non-common, definition for a previously undefined
-or common symbol) it calls the `add_archive_element' callback and then
-`aout_link_check_archive_element' calls `aout_link_add_symbols' to
-actually add the symbols to the linker hash table - possibly those of a
-substitute BFD, if the `add_archive_element' callback avails itself of
-that option.
-
- The ECOFF back end is unusual in that it does not normally call
-`_bfd_generic_link_add_archive_symbols', because ECOFF archives already
-contain a hash table of symbols. The ECOFF back end searches the
-archive itself to avoid the overhead of creating a new hash table.
-
-
-File: bfd.info, Node: Performing the Final Link, Prev: Adding Symbols to the Hash Table, Up: Linker Functions
-
-2.17.3 Performing the final link
---------------------------------
-
-When all the input files have been processed, the linker calls the
-`_bfd_final_link' entry point of the output BFD. This routine is
-responsible for producing the final output file, which has several
-aspects. It must relocate the contents of the input sections and copy
-the data into the output sections. It must build an output symbol
-table including any local symbols from the input files and the global
-symbols from the hash table. When producing relocatable output, it must
-modify the input relocs and write them into the output file. There may
-also be object format dependent work to be done.
-
- The linker will also call the `write_object_contents' entry point
-when the BFD is closed. The two entry points must work together in
-order to produce the correct output file.
-
- The details of how this works are inevitably dependent upon the
-specific object file format. The a.out `_bfd_final_link' routine is
-`NAME(aout,final_link)'.
-
-* Menu:
-
-* Information provided by the linker::
-* Relocating the section contents::
-* Writing the symbol table::
-
-
-File: bfd.info, Node: Information provided by the linker, Next: Relocating the section contents, Prev: Performing the Final Link, Up: Performing the Final Link
-
-2.17.3.1 Information provided by the linker
-...........................................
-
-Before the linker calls the `_bfd_final_link' entry point, it sets up
-some data structures for the function to use.
-
- The `input_bfds' field of the `bfd_link_info' structure will point
-to a list of all the input files included in the link. These files are
-linked through the `link_next' field of the `bfd' structure.
-
- Each section in the output file will have a list of `link_order'
-structures attached to the `map_head.link_order' field (the
-`link_order' structure is defined in `bfdlink.h'). These structures
-describe how to create the contents of the output section in terms of
-the contents of various input sections, fill constants, and,
-eventually, other types of information. They also describe relocs that
-must be created by the BFD backend, but do not correspond to any input
-file; this is used to support -Ur, which builds constructors while
-generating a relocatable object file.
-
-
-File: bfd.info, Node: Relocating the section contents, Next: Writing the symbol table, Prev: Information provided by the linker, Up: Performing the Final Link
-
-2.17.3.2 Relocating the section contents
-........................................
-
-The `_bfd_final_link' function should look through the `link_order'
-structures attached to each section of the output file. Each
-`link_order' structure should either be handled specially, or it should
-be passed to the function `_bfd_default_link_order' which will do the
-right thing (`_bfd_default_link_order' is defined in `linker.c').
-
- For efficiency, a `link_order' of type `bfd_indirect_link_order'
-whose associated section belongs to a BFD of the same format as the
-output BFD must be handled specially. This type of `link_order'
-describes part of an output section in terms of a section belonging to
-one of the input files. The `_bfd_final_link' function should read the
-contents of the section and any associated relocs, apply the relocs to
-the section contents, and write out the modified section contents. If
-performing a relocatable link, the relocs themselves must also be
-modified and written out.
-
- The functions `_bfd_relocate_contents' and
-`_bfd_final_link_relocate' provide some general support for performing
-the actual relocations, notably overflow checking. Their arguments
-include information about the symbol the relocation is against and a
-`reloc_howto_type' argument which describes the relocation to perform.
-These functions are defined in `reloc.c'.
-
- The a.out function which handles reading, relocating, and writing
-section contents is `aout_link_input_section'. The actual relocation
-is done in `aout_link_input_section_std' and
-`aout_link_input_section_ext'.
-
-
-File: bfd.info, Node: Writing the symbol table, Prev: Relocating the section contents, Up: Performing the Final Link
-
-2.17.3.3 Writing the symbol table
-.................................
-
-The `_bfd_final_link' function must gather all the symbols in the input
-files and write them out. It must also write out all the symbols in
-the global hash table. This must be controlled by the `strip' and
-`discard' fields of the `bfd_link_info' structure.
-
- The local symbols of the input files will not have been entered into
-the linker hash table. The `_bfd_final_link' routine must consider
-each input file and include the symbols in the output file. It may be
-convenient to do this when looking through the `link_order' structures,
-or it may be done by stepping through the `input_bfds' list.
-
- The `_bfd_final_link' routine must also traverse the global hash
-table to gather all the externally visible symbols. It is possible
-that most of the externally visible symbols may be written out when
-considering the symbols of each input file, but it is still necessary
-to traverse the hash table since the linker script may have defined
-some symbols that are not in any of the input files.
-
- The `strip' field of the `bfd_link_info' structure controls which
-symbols are written out. The possible values are listed in
-`bfdlink.h'. If the value is `strip_some', then the `keep_hash' field
-of the `bfd_link_info' structure is a hash table of symbols to keep;
-each symbol should be looked up in this hash table, and only symbols
-which are present should be included in the output file.
-
- If the `strip' field of the `bfd_link_info' structure permits local
-symbols to be written out, the `discard' field is used to further
-controls which local symbols are included in the output file. If the
-value is `discard_l', then all local symbols which begin with a certain
-prefix are discarded; this is controlled by the
-`bfd_is_local_label_name' entry point.
-
- The a.out backend handles symbols by calling
-`aout_link_write_symbols' on each input BFD and then traversing the
-global hash table with the function `aout_link_write_other_symbol'. It
-builds a string table while writing out the symbols, which is written
-to the output file at the end of `NAME(aout,final_link)'.
-
-2.17.3.4 `bfd_link_split_section'
-.................................
-
-*Synopsis*
- bfd_boolean bfd_link_split_section (bfd *abfd, asection *sec);
- *Description*
-Return nonzero if SEC should be split during a reloceatable or final
-link.
- #define bfd_link_split_section(abfd, sec) \
- BFD_SEND (abfd, _bfd_link_split_section, (abfd, sec))
-
-2.17.3.5 `bfd_section_already_linked'
-.....................................
-
-*Synopsis*
- bfd_boolean bfd_section_already_linked (bfd *abfd,
- asection *sec,
- struct bfd_link_info *info);
- *Description*
-Check if DATA has been already linked during a reloceatable or final
-link. Return TRUE if it has.
- #define bfd_section_already_linked(abfd, sec, info) \
- BFD_SEND (abfd, _section_already_linked, (abfd, sec, info))
-
-2.17.3.6 `bfd_generic_define_common_symbol'
-...........................................
-
-*Synopsis*
- bfd_boolean bfd_generic_define_common_symbol
- (bfd *output_bfd, struct bfd_link_info *info,
- struct bfd_link_hash_entry *h);
- *Description*
-Convert common symbol H into a defined symbol. Return TRUE on success
-and FALSE on failure.
- #define bfd_define_common_symbol(output_bfd, info, h) \
- BFD_SEND (output_bfd, _bfd_define_common_symbol, (output_bfd, info, h))
-
-2.17.3.7 `bfd_find_version_for_sym'
-...................................
-
-*Synopsis*
- struct bfd_elf_version_tree * bfd_find_version_for_sym
- (struct bfd_elf_version_tree *verdefs,
- const char *sym_name, bfd_boolean *hide);
- *Description*
-Search an elf version script tree for symbol versioning info and export
-/ don't-export status for a given symbol. Return non-NULL on success
-and NULL on failure; also sets the output `hide' boolean parameter.
-
-2.17.3.8 `bfd_hide_sym_by_version'
-..................................
-
-*Synopsis*
- bfd_boolean bfd_hide_sym_by_version
- (struct bfd_elf_version_tree *verdefs, const char *sym_name);
- *Description*
-Search an elf version script tree for symbol versioning info for a
-given symbol. Return TRUE if the symbol is hidden.
-
-
-File: bfd.info, Node: Hash Tables, Prev: Linker Functions, Up: BFD front end
-
-2.18 Hash Tables
-================
-
-BFD provides a simple set of hash table functions. Routines are
-provided to initialize a hash table, to free a hash table, to look up a
-string in a hash table and optionally create an entry for it, and to
-traverse a hash table. There is currently no routine to delete an
-string from a hash table.
-
- The basic hash table does not permit any data to be stored with a
-string. However, a hash table is designed to present a base class from
-which other types of hash tables may be derived. These derived types
-may store additional information with the string. Hash tables were
-implemented in this way, rather than simply providing a data pointer in
-a hash table entry, because they were designed for use by the linker
-back ends. The linker may create thousands of hash table entries, and
-the overhead of allocating private data and storing and following
-pointers becomes noticeable.
-
- The basic hash table code is in `hash.c'.
-
-* Menu:
-
-* Creating and Freeing a Hash Table::
-* Looking Up or Entering a String::
-* Traversing a Hash Table::
-* Deriving a New Hash Table Type::
-
-
-File: bfd.info, Node: Creating and Freeing a Hash Table, Next: Looking Up or Entering a String, Prev: Hash Tables, Up: Hash Tables
-
-2.18.1 Creating and freeing a hash table
-----------------------------------------
-
-To create a hash table, create an instance of a `struct bfd_hash_table'
-(defined in `bfd.h') and call `bfd_hash_table_init' (if you know
-approximately how many entries you will need, the function
-`bfd_hash_table_init_n', which takes a SIZE argument, may be used).
-`bfd_hash_table_init' returns `FALSE' if some sort of error occurs.
-
- The function `bfd_hash_table_init' take as an argument a function to
-use to create new entries. For a basic hash table, use the function
-`bfd_hash_newfunc'. *Note Deriving a New Hash Table Type::, for why
-you would want to use a different value for this argument.
-
- `bfd_hash_table_init' will create an objalloc which will be used to
-allocate new entries. You may allocate memory on this objalloc using
-`bfd_hash_allocate'.
-
- Use `bfd_hash_table_free' to free up all the memory that has been
-allocated for a hash table. This will not free up the `struct
-bfd_hash_table' itself, which you must provide.
-
- Use `bfd_hash_set_default_size' to set the default size of hash
-table to use.
-
-
-File: bfd.info, Node: Looking Up or Entering a String, Next: Traversing a Hash Table, Prev: Creating and Freeing a Hash Table, Up: Hash Tables
-
-2.18.2 Looking up or entering a string
---------------------------------------
-
-The function `bfd_hash_lookup' is used both to look up a string in the
-hash table and to create a new entry.
-
- If the CREATE argument is `FALSE', `bfd_hash_lookup' will look up a
-string. If the string is found, it will returns a pointer to a `struct
-bfd_hash_entry'. If the string is not found in the table
-`bfd_hash_lookup' will return `NULL'. You should not modify any of the
-fields in the returns `struct bfd_hash_entry'.
-
- If the CREATE argument is `TRUE', the string will be entered into
-the hash table if it is not already there. Either way a pointer to a
-`struct bfd_hash_entry' will be returned, either to the existing
-structure or to a newly created one. In this case, a `NULL' return
-means that an error occurred.
-
- If the CREATE argument is `TRUE', and a new entry is created, the
-COPY argument is used to decide whether to copy the string onto the
-hash table objalloc or not. If COPY is passed as `FALSE', you must be
-careful not to deallocate or modify the string as long as the hash table
-exists.
-
-
-File: bfd.info, Node: Traversing a Hash Table, Next: Deriving a New Hash Table Type, Prev: Looking Up or Entering a String, Up: Hash Tables
-
-2.18.3 Traversing a hash table
-------------------------------
-
-The function `bfd_hash_traverse' may be used to traverse a hash table,
-calling a function on each element. The traversal is done in a random
-order.
-
- `bfd_hash_traverse' takes as arguments a function and a generic
-`void *' pointer. The function is called with a hash table entry (a
-`struct bfd_hash_entry *') and the generic pointer passed to
-`bfd_hash_traverse'. The function must return a `boolean' value, which
-indicates whether to continue traversing the hash table. If the
-function returns `FALSE', `bfd_hash_traverse' will stop the traversal
-and return immediately.
-
-
-File: bfd.info, Node: Deriving a New Hash Table Type, Prev: Traversing a Hash Table, Up: Hash Tables
-
-2.18.4 Deriving a new hash table type
--------------------------------------
-
-Many uses of hash tables want to store additional information which
-each entry in the hash table. Some also find it convenient to store
-additional information with the hash table itself. This may be done
-using a derived hash table.
-
- Since C is not an object oriented language, creating a derived hash
-table requires sticking together some boilerplate routines with a few
-differences specific to the type of hash table you want to create.
-
- An example of a derived hash table is the linker hash table. The
-structures for this are defined in `bfdlink.h'. The functions are in
-`linker.c'.
-
- You may also derive a hash table from an already derived hash table.
-For example, the a.out linker backend code uses a hash table derived
-from the linker hash table.
-
-* Menu:
-
-* Define the Derived Structures::
-* Write the Derived Creation Routine::
-* Write Other Derived Routines::
-
-
-File: bfd.info, Node: Define the Derived Structures, Next: Write the Derived Creation Routine, Prev: Deriving a New Hash Table Type, Up: Deriving a New Hash Table Type
-
-2.18.4.1 Define the derived structures
-......................................
-
-You must define a structure for an entry in the hash table, and a
-structure for the hash table itself.
-
- The first field in the structure for an entry in the hash table must
-be of the type used for an entry in the hash table you are deriving
-from. If you are deriving from a basic hash table this is `struct
-bfd_hash_entry', which is defined in `bfd.h'. The first field in the
-structure for the hash table itself must be of the type of the hash
-table you are deriving from itself. If you are deriving from a basic
-hash table, this is `struct bfd_hash_table'.
-
- For example, the linker hash table defines `struct
-bfd_link_hash_entry' (in `bfdlink.h'). The first field, `root', is of
-type `struct bfd_hash_entry'. Similarly, the first field in `struct
-bfd_link_hash_table', `table', is of type `struct bfd_hash_table'.
-
-
-File: bfd.info, Node: Write the Derived Creation Routine, Next: Write Other Derived Routines, Prev: Define the Derived Structures, Up: Deriving a New Hash Table Type
-
-2.18.4.2 Write the derived creation routine
-...........................................
-
-You must write a routine which will create and initialize an entry in
-the hash table. This routine is passed as the function argument to
-`bfd_hash_table_init'.
-
- In order to permit other hash tables to be derived from the hash
-table you are creating, this routine must be written in a standard way.
-
- The first argument to the creation routine is a pointer to a hash
-table entry. This may be `NULL', in which case the routine should
-allocate the right amount of space. Otherwise the space has already
-been allocated by a hash table type derived from this one.
-
- After allocating space, the creation routine must call the creation
-routine of the hash table type it is derived from, passing in a pointer
-to the space it just allocated. This will initialize any fields used
-by the base hash table.
-
- Finally the creation routine must initialize any local fields for
-the new hash table type.
-
- Here is a boilerplate example of a creation routine. FUNCTION_NAME
-is the name of the routine. ENTRY_TYPE is the type of an entry in the
-hash table you are creating. BASE_NEWFUNC is the name of the creation
-routine of the hash table type your hash table is derived from.
-
- struct bfd_hash_entry *
- FUNCTION_NAME (struct bfd_hash_entry *entry,
- struct bfd_hash_table *table,
- const char *string)
- {
- struct ENTRY_TYPE *ret = (ENTRY_TYPE *) entry;
-
- /* Allocate the structure if it has not already been allocated by a
- derived class. */
- if (ret == NULL)
- {
- ret = bfd_hash_allocate (table, sizeof (* ret));
- if (ret == NULL)
- return NULL;
- }
-
- /* Call the allocation method of the base class. */
- ret = ((ENTRY_TYPE *)
- BASE_NEWFUNC ((struct bfd_hash_entry *) ret, table, string));
-
- /* Initialize the local fields here. */
-
- return (struct bfd_hash_entry *) ret;
- }
- *Description*
-The creation routine for the linker hash table, which is in `linker.c',
-looks just like this example. FUNCTION_NAME is
-`_bfd_link_hash_newfunc'. ENTRY_TYPE is `struct bfd_link_hash_entry'.
-BASE_NEWFUNC is `bfd_hash_newfunc', the creation routine for a basic
-hash table.
-
- `_bfd_link_hash_newfunc' also initializes the local fields in a
-linker hash table entry: `type', `written' and `next'.
-
-
-File: bfd.info, Node: Write Other Derived Routines, Prev: Write the Derived Creation Routine, Up: Deriving a New Hash Table Type
-
-2.18.4.3 Write other derived routines
-.....................................
-
-You will want to write other routines for your new hash table, as well.
-
- You will want an initialization routine which calls the
-initialization routine of the hash table you are deriving from and
-initializes any other local fields. For the linker hash table, this is
-`_bfd_link_hash_table_init' in `linker.c'.
-
- You will want a lookup routine which calls the lookup routine of the
-hash table you are deriving from and casts the result. The linker hash
-table uses `bfd_link_hash_lookup' in `linker.c' (this actually takes an
-additional argument which it uses to decide how to return the looked up
-value).
-
- You may want a traversal routine. This should just call the
-traversal routine of the hash table you are deriving from with
-appropriate casts. The linker hash table uses `bfd_link_hash_traverse'
-in `linker.c'.
-
- These routines may simply be defined as macros. For example, the
-a.out backend linker hash table, which is derived from the linker hash
-table, uses macros for the lookup and traversal routines. These are
-`aout_link_hash_lookup' and `aout_link_hash_traverse' in aoutx.h.
-
-
-File: bfd.info, Node: BFD back ends, Next: GNU Free Documentation License, Prev: BFD front end, Up: Top
-
-3 BFD back ends
-***************
-
-* Menu:
-
-* What to Put Where::
-* aout :: a.out backends
-* coff :: coff backends
-* elf :: elf backends
-* mmo :: mmo backend
-
-
-File: bfd.info, Node: What to Put Where, Next: aout, Prev: BFD back ends, Up: BFD back ends
-
-3.1 What to Put Where
-=====================
-
-All of BFD lives in one directory.
-
-
-File: bfd.info, Node: aout, Next: coff, Prev: What to Put Where, Up: BFD back ends
-
-3.2 a.out backends
-==================
-
-*Description*
-BFD supports a number of different flavours of a.out format, though the
-major differences are only the sizes of the structures on disk, and the
-shape of the relocation information.
-
- The support is split into a basic support file `aoutx.h' and other
-files which derive functions from the base. One derivation file is
-`aoutf1.h' (for a.out flavour 1), and adds to the basic a.out functions
-support for sun3, sun4, 386 and 29k a.out files, to create a target
-jump vector for a specific target.
-
- This information is further split out into more specific files for
-each machine, including `sunos.c' for sun3 and sun4, `newsos3.c' for
-the Sony NEWS, and `demo64.c' for a demonstration of a 64 bit a.out
-format.
-
- The base file `aoutx.h' defines general mechanisms for reading and
-writing records to and from disk and various other methods which BFD
-requires. It is included by `aout32.c' and `aout64.c' to form the names
-`aout_32_swap_exec_header_in', `aout_64_swap_exec_header_in', etc.
-
- As an example, this is what goes on to make the back end for a sun4,
-from `aout32.c':
-
- #define ARCH_SIZE 32
- #include "aoutx.h"
-
- Which exports names:
-
- ...
- aout_32_canonicalize_reloc
- aout_32_find_nearest_line
- aout_32_get_lineno
- aout_32_get_reloc_upper_bound
- ...
-
- from `sunos.c':
-
- #define TARGET_NAME "a.out-sunos-big"
- #define VECNAME sunos_big_vec
- #include "aoutf1.h"
-
- requires all the names from `aout32.c', and produces the jump vector
-
- sunos_big_vec
-
- The file `host-aout.c' is a special case. It is for a large set of
-hosts that use "more or less standard" a.out files, and for which
-cross-debugging is not interesting. It uses the standard 32-bit a.out
-support routines, but determines the file offsets and addresses of the
-text, data, and BSS sections, the machine architecture and machine
-type, and the entry point address, in a host-dependent manner. Once
-these values have been determined, generic code is used to handle the
-object file.
-
- When porting it to run on a new system, you must supply:
-
- HOST_PAGE_SIZE
- HOST_SEGMENT_SIZE
- HOST_MACHINE_ARCH (optional)
- HOST_MACHINE_MACHINE (optional)
- HOST_TEXT_START_ADDR
- HOST_STACK_END_ADDR
-
- in the file `../include/sys/h-XXX.h' (for your host). These values,
-plus the structures and macros defined in `a.out.h' on your host
-system, will produce a BFD target that will access ordinary a.out files
-on your host. To configure a new machine to use `host-aout.c', specify:
-
- TDEFAULTS = -DDEFAULT_VECTOR=host_aout_big_vec
- TDEPFILES= host-aout.o trad-core.o
-
- in the `config/XXX.mt' file, and modify `configure.in' to use the
-`XXX.mt' file (by setting "`bfd_target=XXX'") when your configuration
-is selected.
-
-3.2.1 Relocations
------------------
-
-*Description*
-The file `aoutx.h' provides for both the _standard_ and _extended_
-forms of a.out relocation records.
-
- The standard records contain only an address, a symbol index, and a
-type field. The extended records (used on 29ks and sparcs) also have a
-full integer for an addend.
-
-3.2.2 Internal entry points
----------------------------
-
-*Description*
-`aoutx.h' exports several routines for accessing the contents of an
-a.out file, which are gathered and exported in turn by various format
-specific files (eg sunos.c).
-
-3.2.2.1 `aout_SIZE_swap_exec_header_in'
-.......................................
-
-*Synopsis*
- void aout_SIZE_swap_exec_header_in,
- (bfd *abfd,
- struct external_exec *bytes,
- struct internal_exec *execp);
- *Description*
-Swap the information in an executable header RAW_BYTES taken from a raw
-byte stream memory image into the internal exec header structure EXECP.
-
-3.2.2.2 `aout_SIZE_swap_exec_header_out'
-........................................
-
-*Synopsis*
- void aout_SIZE_swap_exec_header_out
- (bfd *abfd,
- struct internal_exec *execp,
- struct external_exec *raw_bytes);
- *Description*
-Swap the information in an internal exec header structure EXECP into
-the buffer RAW_BYTES ready for writing to disk.
-
-3.2.2.3 `aout_SIZE_some_aout_object_p'
-......................................
-
-*Synopsis*
- const bfd_target *aout_SIZE_some_aout_object_p
- (bfd *abfd,
- struct internal_exec *execp,
- const bfd_target *(*callback_to_real_object_p) (bfd *));
- *Description*
-Some a.out variant thinks that the file open in ABFD checking is an
-a.out file. Do some more checking, and set up for access if it really
-is. Call back to the calling environment's "finish up" function just
-before returning, to handle any last-minute setup.
-
-3.2.2.4 `aout_SIZE_mkobject'
-............................
-
-*Synopsis*
- bfd_boolean aout_SIZE_mkobject, (bfd *abfd);
- *Description*
-Initialize BFD ABFD for use with a.out files.
-
-3.2.2.5 `aout_SIZE_machine_type'
-................................
-
-*Synopsis*
- enum machine_type aout_SIZE_machine_type
- (enum bfd_architecture arch,
- unsigned long machine,
- bfd_boolean *unknown);
- *Description*
-Keep track of machine architecture and machine type for a.out's. Return
-the `machine_type' for a particular architecture and machine, or
-`M_UNKNOWN' if that exact architecture and machine can't be represented
-in a.out format.
-
- If the architecture is understood, machine type 0 (default) is
-always understood.
-
-3.2.2.6 `aout_SIZE_set_arch_mach'
-.................................
-
-*Synopsis*
- bfd_boolean aout_SIZE_set_arch_mach,
- (bfd *,
- enum bfd_architecture arch,
- unsigned long machine);
- *Description*
-Set the architecture and the machine of the BFD ABFD to the values ARCH
-and MACHINE. Verify that ABFD's format can support the architecture
-required.
-
-3.2.2.7 `aout_SIZE_new_section_hook'
-....................................
-
-*Synopsis*
- bfd_boolean aout_SIZE_new_section_hook,
- (bfd *abfd,
- asection *newsect);
- *Description*
-Called by the BFD in response to a `bfd_make_section' request.
-
-
-File: bfd.info, Node: coff, Next: elf, Prev: aout, Up: BFD back ends
-
-3.3 coff backends
-=================
-
-BFD supports a number of different flavours of coff format. The major
-differences between formats are the sizes and alignments of fields in
-structures on disk, and the occasional extra field.
-
- Coff in all its varieties is implemented with a few common files and
-a number of implementation specific files. For example, The 88k bcs
-coff format is implemented in the file `coff-m88k.c'. This file
-`#include's `coff/m88k.h' which defines the external structure of the
-coff format for the 88k, and `coff/internal.h' which defines the
-internal structure. `coff-m88k.c' also defines the relocations used by
-the 88k format *Note Relocations::.
-
- The Intel i960 processor version of coff is implemented in
-`coff-i960.c'. This file has the same structure as `coff-m88k.c',
-except that it includes `coff/i960.h' rather than `coff-m88k.h'.
-
-3.3.1 Porting to a new version of coff
---------------------------------------
-
-The recommended method is to select from the existing implementations
-the version of coff which is most like the one you want to use. For
-example, we'll say that i386 coff is the one you select, and that your
-coff flavour is called foo. Copy `i386coff.c' to `foocoff.c', copy
-`../include/coff/i386.h' to `../include/coff/foo.h', and add the lines
-to `targets.c' and `Makefile.in' so that your new back end is used.
-Alter the shapes of the structures in `../include/coff/foo.h' so that
-they match what you need. You will probably also have to add `#ifdef's
-to the code in `coff/internal.h' and `coffcode.h' if your version of
-coff is too wild.
-
- You can verify that your new BFD backend works quite simply by
-building `objdump' from the `binutils' directory, and making sure that
-its version of what's going on and your host system's idea (assuming it
-has the pretty standard coff dump utility, usually called `att-dump' or
-just `dump') are the same. Then clean up your code, and send what
-you've done to Cygnus. Then your stuff will be in the next release, and
-you won't have to keep integrating it.
-
-3.3.2 How the coff backend works
---------------------------------
-
-3.3.2.1 File layout
-...................
-
-The Coff backend is split into generic routines that are applicable to
-any Coff target and routines that are specific to a particular target.
-The target-specific routines are further split into ones which are
-basically the same for all Coff targets except that they use the
-external symbol format or use different values for certain constants.
-
- The generic routines are in `coffgen.c'. These routines work for
-any Coff target. They use some hooks into the target specific code;
-the hooks are in a `bfd_coff_backend_data' structure, one of which
-exists for each target.
-
- The essentially similar target-specific routines are in
-`coffcode.h'. This header file includes executable C code. The
-various Coff targets first include the appropriate Coff header file,
-make any special defines that are needed, and then include `coffcode.h'.
-
- Some of the Coff targets then also have additional routines in the
-target source file itself.
-
- For example, `coff-i960.c' includes `coff/internal.h' and
-`coff/i960.h'. It then defines a few constants, such as `I960', and
-includes `coffcode.h'. Since the i960 has complex relocation types,
-`coff-i960.c' also includes some code to manipulate the i960 relocs.
-This code is not in `coffcode.h' because it would not be used by any
-other target.
-
-3.3.2.2 Coff long section names
-...............................
-
-In the standard Coff object format, section names are limited to the
-eight bytes available in the `s_name' field of the `SCNHDR' section
-header structure. The format requires the field to be NUL-padded, but
-not necessarily NUL-terminated, so the longest section names permitted
-are a full eight characters.
-
- The Microsoft PE variants of the Coff object file format add an
-extension to support the use of long section names. This extension is
-defined in section 4 of the Microsoft PE/COFF specification (rev 8.1).
-If a section name is too long to fit into the section header's `s_name'
-field, it is instead placed into the string table, and the `s_name'
-field is filled with a slash ("/") followed by the ASCII decimal
-representation of the offset of the full name relative to the string
-table base.
-
- Note that this implies that the extension can only be used in object
-files, as executables do not contain a string table. The standard
-specifies that long section names from objects emitted into executable
-images are to be truncated.
-
- However, as a GNU extension, BFD can generate executable images that
-contain a string table and long section names. This would appear to be
-technically valid, as the standard only says that Coff debugging
-information is deprecated, not forbidden, and in practice it works,
-although some tools that parse PE files expecting the MS standard
-format may become confused; `PEview' is one known example.
-
- The functionality is supported in BFD by code implemented under the
-control of the macro `COFF_LONG_SECTION_NAMES'. If not defined, the
-format does not support long section names in any way. If defined, it
-is used to initialise a flag, `_bfd_coff_long_section_names', and a
-hook function pointer, `_bfd_coff_set_long_section_names', in the Coff
-backend data structure. The flag controls the generation of long
-section names in output BFDs at runtime; if it is false, as it will be
-by default when generating an executable image, long section names are
-truncated; if true, the long section names extension is employed. The
-hook points to a function that allows the value of the flag to be
-altered at runtime, on formats that support long section names at all;
-on other formats it points to a stub that returns an error indication.
-
- With input BFDs, the flag is set according to whether any long
-section names are detected while reading the section headers. For a
-completely new BFD, the flag is set to the default for the target
-format. This information can be used by a client of the BFD library
-when deciding what output format to generate, and means that a BFD that
-is opened for read and subsequently converted to a writeable BFD and
-modified in-place will retain whatever format it had on input.
-
- If `COFF_LONG_SECTION_NAMES' is simply defined (blank), or is
-defined to the value "1", then long section names are enabled by
-default; if it is defined to the value zero, they are disabled by
-default (but still accepted in input BFDs). The header `coffcode.h'
-defines a macro, `COFF_DEFAULT_LONG_SECTION_NAMES', which is used in
-the backends to initialise the backend data structure fields
-appropriately; see the comments for further detail.
-
-3.3.2.3 Bit twiddling
-.....................
-
-Each flavour of coff supported in BFD has its own header file
-describing the external layout of the structures. There is also an
-internal description of the coff layout, in `coff/internal.h'. A major
-function of the coff backend is swapping the bytes and twiddling the
-bits to translate the external form of the structures into the normal
-internal form. This is all performed in the `bfd_swap'_thing_direction
-routines. Some elements are different sizes between different versions
-of coff; it is the duty of the coff version specific include file to
-override the definitions of various packing routines in `coffcode.h'.
-E.g., the size of line number entry in coff is sometimes 16 bits, and
-sometimes 32 bits. `#define'ing `PUT_LNSZ_LNNO' and `GET_LNSZ_LNNO'
-will select the correct one. No doubt, some day someone will find a
-version of coff which has a varying field size not catered to at the
-moment. To port BFD, that person will have to add more `#defines'.
-Three of the bit twiddling routines are exported to `gdb';
-`coff_swap_aux_in', `coff_swap_sym_in' and `coff_swap_lineno_in'. `GDB'
-reads the symbol table on its own, but uses BFD to fix things up. More
-of the bit twiddlers are exported for `gas'; `coff_swap_aux_out',
-`coff_swap_sym_out', `coff_swap_lineno_out', `coff_swap_reloc_out',
-`coff_swap_filehdr_out', `coff_swap_aouthdr_out',
-`coff_swap_scnhdr_out'. `Gas' currently keeps track of all the symbol
-table and reloc drudgery itself, thereby saving the internal BFD
-overhead, but uses BFD to swap things on the way out, making cross
-ports much safer. Doing so also allows BFD (and thus the linker) to
-use the same header files as `gas', which makes one avenue to disaster
-disappear.
-
-3.3.2.4 Symbol reading
-......................
-
-The simple canonical form for symbols used by BFD is not rich enough to
-keep all the information available in a coff symbol table. The back end
-gets around this problem by keeping the original symbol table around,
-"behind the scenes".
-
- When a symbol table is requested (through a call to
-`bfd_canonicalize_symtab'), a request gets through to
-`coff_get_normalized_symtab'. This reads the symbol table from the coff
-file and swaps all the structures inside into the internal form. It
-also fixes up all the pointers in the table (represented in the file by
-offsets from the first symbol in the table) into physical pointers to
-elements in the new internal table. This involves some work since the
-meanings of fields change depending upon context: a field that is a
-pointer to another structure in the symbol table at one moment may be
-the size in bytes of a structure at the next. Another pass is made
-over the table. All symbols which mark file names (`C_FILE' symbols)
-are modified so that the internal string points to the value in the
-auxent (the real filename) rather than the normal text associated with
-the symbol (`".file"').
-
- At this time the symbol names are moved around. Coff stores all
-symbols less than nine characters long physically within the symbol
-table; longer strings are kept at the end of the file in the string
-table. This pass moves all strings into memory and replaces them with
-pointers to the strings.
-
- The symbol table is massaged once again, this time to create the
-canonical table used by the BFD application. Each symbol is inspected
-in turn, and a decision made (using the `sclass' field) about the
-various flags to set in the `asymbol'. *Note Symbols::. The generated
-canonical table shares strings with the hidden internal symbol table.
-
- Any linenumbers are read from the coff file too, and attached to the
-symbols which own the functions the linenumbers belong to.
-
-3.3.2.5 Symbol writing
-......................
-
-Writing a symbol to a coff file which didn't come from a coff file will
-lose any debugging information. The `asymbol' structure remembers the
-BFD from which the symbol was taken, and on output the back end makes
-sure that the same destination target as source target is present.
-
- When the symbols have come from a coff file then all the debugging
-information is preserved.
-
- Symbol tables are provided for writing to the back end in a vector
-of pointers to pointers. This allows applications like the linker to
-accumulate and output large symbol tables without having to do too much
-byte copying.
-
- This function runs through the provided symbol table and patches
-each symbol marked as a file place holder (`C_FILE') to point to the
-next file place holder in the list. It also marks each `offset' field
-in the list with the offset from the first symbol of the current symbol.
-
- Another function of this procedure is to turn the canonical value
-form of BFD into the form used by coff. Internally, BFD expects symbol
-values to be offsets from a section base; so a symbol physically at
-0x120, but in a section starting at 0x100, would have the value 0x20.
-Coff expects symbols to contain their final value, so symbols have
-their values changed at this point to reflect their sum with their
-owning section. This transformation uses the `output_section' field of
-the `asymbol''s `asection' *Note Sections::.
-
- * `coff_mangle_symbols'
- This routine runs though the provided symbol table and uses the
-offsets generated by the previous pass and the pointers generated when
-the symbol table was read in to create the structured hierarchy
-required by coff. It changes each pointer to a symbol into the index
-into the symbol table of the asymbol.
-
- * `coff_write_symbols'
- This routine runs through the symbol table and patches up the
-symbols from their internal form into the coff way, calls the bit
-twiddlers, and writes out the table to the file.
-
-3.3.2.6 `coff_symbol_type'
-..........................
-
-*Description*
-The hidden information for an `asymbol' is described in a
-`combined_entry_type':
-
-
- typedef struct coff_ptr_struct
- {
- /* Remembers the offset from the first symbol in the file for
- this symbol. Generated by coff_renumber_symbols. */
- unsigned int offset;
-
- /* Should the value of this symbol be renumbered. Used for
- XCOFF C_BSTAT symbols. Set by coff_slurp_symbol_table. */
- unsigned int fix_value : 1;
-
- /* Should the tag field of this symbol be renumbered.
- Created by coff_pointerize_aux. */
- unsigned int fix_tag : 1;
-
- /* Should the endidx field of this symbol be renumbered.
- Created by coff_pointerize_aux. */
- unsigned int fix_end : 1;
-
- /* Should the x_csect.x_scnlen field be renumbered.
- Created by coff_pointerize_aux. */
- unsigned int fix_scnlen : 1;
-
- /* Fix up an XCOFF C_BINCL/C_EINCL symbol. The value is the
- index into the line number entries. Set by coff_slurp_symbol_table. */
- unsigned int fix_line : 1;
-
- /* The container for the symbol structure as read and translated
- from the file. */
- union
- {
- union internal_auxent auxent;
- struct internal_syment syment;
- } u;
- } combined_entry_type;
-
-
- /* Each canonical asymbol really looks like this: */
-
- typedef struct coff_symbol_struct
- {
- /* The actual symbol which the rest of BFD works with */
- asymbol symbol;
-
- /* A pointer to the hidden information for this symbol */
- combined_entry_type *native;
-
- /* A pointer to the linenumber information for this symbol */
- struct lineno_cache_entry *lineno;
-
- /* Have the line numbers been relocated yet ? */
- bfd_boolean done_lineno;
- } coff_symbol_type;
-
-3.3.2.7 `bfd_coff_backend_data'
-...............................
-
- /* COFF symbol classifications. */
-
- enum coff_symbol_classification
- {
- /* Global symbol. */
- COFF_SYMBOL_GLOBAL,
- /* Common symbol. */
- COFF_SYMBOL_COMMON,
- /* Undefined symbol. */
- COFF_SYMBOL_UNDEFINED,
- /* Local symbol. */
- COFF_SYMBOL_LOCAL,
- /* PE section symbol. */
- COFF_SYMBOL_PE_SECTION
- };
-Special entry points for gdb to swap in coff symbol table parts:
- typedef struct
- {
- void (*_bfd_coff_swap_aux_in)
- (bfd *, void *, int, int, int, int, void *);
-
- void (*_bfd_coff_swap_sym_in)
- (bfd *, void *, void *);
-
- void (*_bfd_coff_swap_lineno_in)
- (bfd *, void *, void *);
-
- unsigned int (*_bfd_coff_swap_aux_out)
- (bfd *, void *, int, int, int, int, void *);
-
- unsigned int (*_bfd_coff_swap_sym_out)
- (bfd *, void *, void *);
-
- unsigned int (*_bfd_coff_swap_lineno_out)
- (bfd *, void *, void *);
-
- unsigned int (*_bfd_coff_swap_reloc_out)
- (bfd *, void *, void *);
-
- unsigned int (*_bfd_coff_swap_filehdr_out)
- (bfd *, void *, void *);
-
- unsigned int (*_bfd_coff_swap_aouthdr_out)
- (bfd *, void *, void *);
-
- unsigned int (*_bfd_coff_swap_scnhdr_out)
- (bfd *, void *, void *);
-
- unsigned int _bfd_filhsz;
- unsigned int _bfd_aoutsz;
- unsigned int _bfd_scnhsz;
- unsigned int _bfd_symesz;
- unsigned int _bfd_auxesz;
- unsigned int _bfd_relsz;
- unsigned int _bfd_linesz;
- unsigned int _bfd_filnmlen;
- bfd_boolean _bfd_coff_long_filenames;
-
- bfd_boolean _bfd_coff_long_section_names;
- bfd_boolean (*_bfd_coff_set_long_section_names)
- (bfd *, int);
-
- unsigned int _bfd_coff_default_section_alignment_power;
- bfd_boolean _bfd_coff_force_symnames_in_strings;
- unsigned int _bfd_coff_debug_string_prefix_length;
-
- void (*_bfd_coff_swap_filehdr_in)
- (bfd *, void *, void *);
-
- void (*_bfd_coff_swap_aouthdr_in)
- (bfd *, void *, void *);
-
- void (*_bfd_coff_swap_scnhdr_in)
- (bfd *, void *, void *);
-
- void (*_bfd_coff_swap_reloc_in)
- (bfd *abfd, void *, void *);
-
- bfd_boolean (*_bfd_coff_bad_format_hook)
- (bfd *, void *);
-
- bfd_boolean (*_bfd_coff_set_arch_mach_hook)
- (bfd *, void *);
-
- void * (*_bfd_coff_mkobject_hook)
- (bfd *, void *, void *);
-
- bfd_boolean (*_bfd_styp_to_sec_flags_hook)
- (bfd *, void *, const char *, asection *, flagword *);
-
- void (*_bfd_set_alignment_hook)
- (bfd *, asection *, void *);
-
- bfd_boolean (*_bfd_coff_slurp_symbol_table)
- (bfd *);
-
- bfd_boolean (*_bfd_coff_symname_in_debug)
- (bfd *, struct internal_syment *);
-
- bfd_boolean (*_bfd_coff_pointerize_aux_hook)
- (bfd *, combined_entry_type *, combined_entry_type *,
- unsigned int, combined_entry_type *);
-
- bfd_boolean (*_bfd_coff_print_aux)
- (bfd *, FILE *, combined_entry_type *, combined_entry_type *,
- combined_entry_type *, unsigned int);
-
- void (*_bfd_coff_reloc16_extra_cases)
- (bfd *, struct bfd_link_info *, struct bfd_link_order *, arelent *,
- bfd_byte *, unsigned int *, unsigned int *);
-
- int (*_bfd_coff_reloc16_estimate)
- (bfd *, asection *, arelent *, unsigned int,
- struct bfd_link_info *);
-
- enum coff_symbol_classification (*_bfd_coff_classify_symbol)
- (bfd *, struct internal_syment *);
-
- bfd_boolean (*_bfd_coff_compute_section_file_positions)
- (bfd *);
-
- bfd_boolean (*_bfd_coff_start_final_link)
- (bfd *, struct bfd_link_info *);
-
- bfd_boolean (*_bfd_coff_relocate_section)
- (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
- struct internal_reloc *, struct internal_syment *, asection **);
-
- reloc_howto_type *(*_bfd_coff_rtype_to_howto)
- (bfd *, asection *, struct internal_reloc *,
- struct coff_link_hash_entry *, struct internal_syment *,
- bfd_vma *);
-
- bfd_boolean (*_bfd_coff_adjust_symndx)
- (bfd *, struct bfd_link_info *, bfd *, asection *,
- struct internal_reloc *, bfd_boolean *);
-
- bfd_boolean (*_bfd_coff_link_add_one_symbol)
- (struct bfd_link_info *, bfd *, const char *, flagword,
- asection *, bfd_vma, const char *, bfd_boolean, bfd_boolean,
- struct bfd_link_hash_entry **);
-
- bfd_boolean (*_bfd_coff_link_output_has_begun)
- (bfd *, struct coff_final_link_info *);
-
- bfd_boolean (*_bfd_coff_final_link_postscript)
- (bfd *, struct coff_final_link_info *);
-
- bfd_boolean (*_bfd_coff_print_pdata)
- (bfd *, void *);
-
- } bfd_coff_backend_data;
-
- #define coff_backend_info(abfd) \
- ((bfd_coff_backend_data *) (abfd)->xvec->backend_data)
-
- #define bfd_coff_swap_aux_in(a,e,t,c,ind,num,i) \
- ((coff_backend_info (a)->_bfd_coff_swap_aux_in) (a,e,t,c,ind,num,i))
-
- #define bfd_coff_swap_sym_in(a,e,i) \
- ((coff_backend_info (a)->_bfd_coff_swap_sym_in) (a,e,i))
-
- #define bfd_coff_swap_lineno_in(a,e,i) \
- ((coff_backend_info ( a)->_bfd_coff_swap_lineno_in) (a,e,i))
-
- #define bfd_coff_swap_reloc_out(abfd, i, o) \
- ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_out) (abfd, i, o))
-
- #define bfd_coff_swap_lineno_out(abfd, i, o) \
- ((coff_backend_info (abfd)->_bfd_coff_swap_lineno_out) (abfd, i, o))
-
- #define bfd_coff_swap_aux_out(a,i,t,c,ind,num,o) \
- ((coff_backend_info (a)->_bfd_coff_swap_aux_out) (a,i,t,c,ind,num,o))
-
- #define bfd_coff_swap_sym_out(abfd, i,o) \
- ((coff_backend_info (abfd)->_bfd_coff_swap_sym_out) (abfd, i, o))
-
- #define bfd_coff_swap_scnhdr_out(abfd, i,o) \
- ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_out) (abfd, i, o))
-
- #define bfd_coff_swap_filehdr_out(abfd, i,o) \
- ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_out) (abfd, i, o))
-
- #define bfd_coff_swap_aouthdr_out(abfd, i,o) \
- ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_out) (abfd, i, o))
-
- #define bfd_coff_filhsz(abfd) (coff_backend_info (abfd)->_bfd_filhsz)
- #define bfd_coff_aoutsz(abfd) (coff_backend_info (abfd)->_bfd_aoutsz)
- #define bfd_coff_scnhsz(abfd) (coff_backend_info (abfd)->_bfd_scnhsz)
- #define bfd_coff_symesz(abfd) (coff_backend_info (abfd)->_bfd_symesz)
- #define bfd_coff_auxesz(abfd) (coff_backend_info (abfd)->_bfd_auxesz)
- #define bfd_coff_relsz(abfd) (coff_backend_info (abfd)->_bfd_relsz)
- #define bfd_coff_linesz(abfd) (coff_backend_info (abfd)->_bfd_linesz)
- #define bfd_coff_filnmlen(abfd) (coff_backend_info (abfd)->_bfd_filnmlen)
- #define bfd_coff_long_filenames(abfd) \
- (coff_backend_info (abfd)->_bfd_coff_long_filenames)
- #define bfd_coff_long_section_names(abfd) \
- (coff_backend_info (abfd)->_bfd_coff_long_section_names)
- #define bfd_coff_set_long_section_names(abfd, enable) \
- ((coff_backend_info (abfd)->_bfd_coff_set_long_section_names) (abfd, enable))
- #define bfd_coff_default_section_alignment_power(abfd) \
- (coff_backend_info (abfd)->_bfd_coff_default_section_alignment_power)
- #define bfd_coff_swap_filehdr_in(abfd, i,o) \
- ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_in) (abfd, i, o))
-
- #define bfd_coff_swap_aouthdr_in(abfd, i,o) \
- ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_in) (abfd, i, o))
-
- #define bfd_coff_swap_scnhdr_in(abfd, i,o) \
- ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_in) (abfd, i, o))
-
- #define bfd_coff_swap_reloc_in(abfd, i, o) \
- ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_in) (abfd, i, o))
-
- #define bfd_coff_bad_format_hook(abfd, filehdr) \
- ((coff_backend_info (abfd)->_bfd_coff_bad_format_hook) (abfd, filehdr))
-
- #define bfd_coff_set_arch_mach_hook(abfd, filehdr)\
- ((coff_backend_info (abfd)->_bfd_coff_set_arch_mach_hook) (abfd, filehdr))
- #define bfd_coff_mkobject_hook(abfd, filehdr, aouthdr)\
- ((coff_backend_info (abfd)->_bfd_coff_mkobject_hook)\
- (abfd, filehdr, aouthdr))
-
- #define bfd_coff_styp_to_sec_flags_hook(abfd, scnhdr, name, section, flags_ptr)\
- ((coff_backend_info (abfd)->_bfd_styp_to_sec_flags_hook)\
- (abfd, scnhdr, name, section, flags_ptr))
-
- #define bfd_coff_set_alignment_hook(abfd, sec, scnhdr)\
- ((coff_backend_info (abfd)->_bfd_set_alignment_hook) (abfd, sec, scnhdr))
-
- #define bfd_coff_slurp_symbol_table(abfd)\
- ((coff_backend_info (abfd)->_bfd_coff_slurp_symbol_table) (abfd))
-
- #define bfd_coff_symname_in_debug(abfd, sym)\
- ((coff_backend_info (abfd)->_bfd_coff_symname_in_debug) (abfd, sym))
-
- #define bfd_coff_force_symnames_in_strings(abfd)\
- (coff_backend_info (abfd)->_bfd_coff_force_symnames_in_strings)
-
- #define bfd_coff_debug_string_prefix_length(abfd)\
- (coff_backend_info (abfd)->_bfd_coff_debug_string_prefix_length)
-
- #define bfd_coff_print_aux(abfd, file, base, symbol, aux, indaux)\
- ((coff_backend_info (abfd)->_bfd_coff_print_aux)\
- (abfd, file, base, symbol, aux, indaux))
-
- #define bfd_coff_reloc16_extra_cases(abfd, link_info, link_order,\
- reloc, data, src_ptr, dst_ptr)\
- ((coff_backend_info (abfd)->_bfd_coff_reloc16_extra_cases)\
- (abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr))
-
- #define bfd_coff_reloc16_estimate(abfd, section, reloc, shrink, link_info)\
- ((coff_backend_info (abfd)->_bfd_coff_reloc16_estimate)\
- (abfd, section, reloc, shrink, link_info))
-
- #define bfd_coff_classify_symbol(abfd, sym)\
- ((coff_backend_info (abfd)->_bfd_coff_classify_symbol)\
- (abfd, sym))
-
- #define bfd_coff_compute_section_file_positions(abfd)\
- ((coff_backend_info (abfd)->_bfd_coff_compute_section_file_positions)\
- (abfd))
-
- #define bfd_coff_start_final_link(obfd, info)\
- ((coff_backend_info (obfd)->_bfd_coff_start_final_link)\
- (obfd, info))
- #define bfd_coff_relocate_section(obfd,info,ibfd,o,con,rel,isyms,secs)\
- ((coff_backend_info (ibfd)->_bfd_coff_relocate_section)\
- (obfd, info, ibfd, o, con, rel, isyms, secs))
- #define bfd_coff_rtype_to_howto(abfd, sec, rel, h, sym, addendp)\
- ((coff_backend_info (abfd)->_bfd_coff_rtype_to_howto)\
- (abfd, sec, rel, h, sym, addendp))
- #define bfd_coff_adjust_symndx(obfd, info, ibfd, sec, rel, adjustedp)\
- ((coff_backend_info (abfd)->_bfd_coff_adjust_symndx)\
- (obfd, info, ibfd, sec, rel, adjustedp))
- #define bfd_coff_link_add_one_symbol(info, abfd, name, flags, section,\
- value, string, cp, coll, hashp)\
- ((coff_backend_info (abfd)->_bfd_coff_link_add_one_symbol)\
- (info, abfd, name, flags, section, value, string, cp, coll, hashp))
-
- #define bfd_coff_link_output_has_begun(a,p) \
- ((coff_backend_info (a)->_bfd_coff_link_output_has_begun) (a, p))
- #define bfd_coff_final_link_postscript(a,p) \
- ((coff_backend_info (a)->_bfd_coff_final_link_postscript) (a, p))
-
- #define bfd_coff_have_print_pdata(a) \
- (coff_backend_info (a)->_bfd_coff_print_pdata)
- #define bfd_coff_print_pdata(a,p) \
- ((coff_backend_info (a)->_bfd_coff_print_pdata) (a, p))
-
- /* Macro: Returns true if the bfd is a PE executable as opposed to a
- PE object file. */
- #define bfd_pei_p(abfd) \
- (CONST_STRNEQ ((abfd)->xvec->name, "pei-"))
-
-3.3.2.8 Writing relocations
-...........................
-
-To write relocations, the back end steps though the canonical
-relocation table and create an `internal_reloc'. The symbol index to
-use is removed from the `offset' field in the symbol table supplied.
-The address comes directly from the sum of the section base address and
-the relocation offset; the type is dug directly from the howto field.
-Then the `internal_reloc' is swapped into the shape of an
-`external_reloc' and written out to disk.
-
-3.3.2.9 Reading linenumbers
-...........................
-
-Creating the linenumber table is done by reading in the entire coff
-linenumber table, and creating another table for internal use.
-
- A coff linenumber table is structured so that each function is
-marked as having a line number of 0. Each line within the function is
-an offset from the first line in the function. The base of the line
-number information for the table is stored in the symbol associated
-with the function.
-
- Note: The PE format uses line number 0 for a flag indicating a new
-source file.
-
- The information is copied from the external to the internal table,
-and each symbol which marks a function is marked by pointing its...
-
- How does this work ?
-
-3.3.2.10 Reading relocations
-............................
-
-Coff relocations are easily transformed into the internal BFD form
-(`arelent').
-
- Reading a coff relocation table is done in the following stages:
-
- * Read the entire coff relocation table into memory.
-
- * Process each relocation in turn; first swap it from the external
- to the internal form.
-
- * Turn the symbol referenced in the relocation's symbol index into a
- pointer into the canonical symbol table. This table is the same
- as the one returned by a call to `bfd_canonicalize_symtab'. The
- back end will call that routine and save the result if a
- canonicalization hasn't been done.
-
- * The reloc index is turned into a pointer to a howto structure, in
- a back end specific way. For instance, the 386 and 960 use the
- `r_type' to directly produce an index into a howto table vector;
- the 88k subtracts a number from the `r_type' field and creates an
- addend field.
-
-
-File: bfd.info, Node: elf, Next: mmo, Prev: coff, Up: BFD back ends
-
-3.4 ELF backends
-================
-
-BFD support for ELF formats is being worked on. Currently, the best
-supported back ends are for sparc and i386 (running svr4 or Solaris 2).
-
- Documentation of the internals of the support code still needs to be
-written. The code is changing quickly enough that we haven't bothered
-yet.
-
-
-File: bfd.info, Node: mmo, Prev: elf, Up: BFD back ends
-
-3.5 mmo backend
-===============
-
-The mmo object format is used exclusively together with Professor
-Donald E. Knuth's educational 64-bit processor MMIX. The simulator
-`mmix' which is available at
-`http://www-cs-faculty.stanford.edu/~knuth/programs/mmix.tar.gz'
-understands this format. That package also includes a combined
-assembler and linker called `mmixal'. The mmo format has no advantages
-feature-wise compared to e.g. ELF. It is a simple non-relocatable
-object format with no support for archives or debugging information,
-except for symbol value information and line numbers (which is not yet
-implemented in BFD). See
-`http://www-cs-faculty.stanford.edu/~knuth/mmix.html' for more
-information about MMIX. The ELF format is used for intermediate object
-files in the BFD implementation.
-
-* Menu:
-
-* File layout::
-* Symbol-table::
-* mmo section mapping::
-
-
-File: bfd.info, Node: File layout, Next: Symbol-table, Prev: mmo, Up: mmo
-
-3.5.1 File layout
------------------
-
-The mmo file contents is not partitioned into named sections as with
-e.g. ELF. Memory areas is formed by specifying the location of the
-data that follows. Only the memory area `0x0000...00' to `0x01ff...ff'
-is executable, so it is used for code (and constants) and the area
-`0x2000...00' to `0x20ff...ff' is used for writable data. *Note mmo
-section mapping::.
-
- There is provision for specifying "special data" of 65536 different
-types. We use type 80 (decimal), arbitrarily chosen the same as the
-ELF `e_machine' number for MMIX, filling it with section information
-normally found in ELF objects. *Note mmo section mapping::.
-
- Contents is entered as 32-bit words, xor:ed over previous contents,
-always zero-initialized. A word that starts with the byte `0x98' forms
-a command called a `lopcode', where the next byte distinguished between
-the thirteen lopcodes. The two remaining bytes, called the `Y' and `Z'
-fields, or the `YZ' field (a 16-bit big-endian number), are used for
-various purposes different for each lopcode. As documented in
-`http://www-cs-faculty.stanford.edu/~knuth/mmixal-intro.ps.gz', the
-lopcodes are:
-
-`lop_quote'
- 0x98000001. The next word is contents, regardless of whether it
- starts with 0x98 or not.
-
-`lop_loc'
- 0x9801YYZZ, where `Z' is 1 or 2. This is a location directive,
- setting the location for the next data to the next 32-bit word
- (for Z = 1) or 64-bit word (for Z = 2), plus Y * 2^56. Normally
- `Y' is 0 for the text segment and 2 for the data segment.
-
-`lop_skip'
- 0x9802YYZZ. Increase the current location by `YZ' bytes.
-
-`lop_fixo'
- 0x9803YYZZ, where `Z' is 1 or 2. Store the current location as 64
- bits into the location pointed to by the next 32-bit (Z = 1) or
- 64-bit (Z = 2) word, plus Y * 2^56.
-
-`lop_fixr'
- 0x9804YYZZ. `YZ' is stored into the current location plus 2 - 4 *
- YZ.
-
-`lop_fixrx'
- 0x980500ZZ. `Z' is 16 or 24. A value `L' derived from the
- following 32-bit word are used in a manner similar to `YZ' in
- lop_fixr: it is xor:ed into the current location minus 4 * L. The
- first byte of the word is 0 or 1. If it is 1, then L = (LOWEST 24
- BITS OF WORD) - 2^Z, if 0, then L = (LOWEST 24 BITS OF WORD).
-
-`lop_file'
- 0x9806YYZZ. `Y' is the file number, `Z' is count of 32-bit words.
- Set the file number to `Y' and the line counter to 0. The next Z
- * 4 bytes contain the file name, padded with zeros if the count is
- not a multiple of four. The same `Y' may occur multiple times,
- but `Z' must be 0 for all but the first occurrence.
-
-`lop_line'
- 0x9807YYZZ. `YZ' is the line number. Together with lop_file, it
- forms the source location for the next 32-bit word. Note that for
- each non-lopcode 32-bit word, line numbers are assumed incremented
- by one.
-
-`lop_spec'
- 0x9808YYZZ. `YZ' is the type number. Data until the next lopcode
- other than lop_quote forms special data of type `YZ'. *Note mmo
- section mapping::.
-
- Other types than 80, (or type 80 with a content that does not
- parse) is stored in sections named `.MMIX.spec_data.N' where N is
- the `YZ'-type. The flags for such a sections say not to allocate
- or load the data. The vma is 0. Contents of multiple occurrences
- of special data N is concatenated to the data of the previous
- lop_spec Ns. The location in data or code at which the lop_spec
- occurred is lost.
-
-`lop_pre'
- 0x980901ZZ. The first lopcode in a file. The `Z' field forms the
- length of header information in 32-bit words, where the first word
- tells the time in seconds since `00:00:00 GMT Jan 1 1970'.
-
-`lop_post'
- 0x980a00ZZ. Z > 32. This lopcode follows after all
- content-generating lopcodes in a program. The `Z' field denotes
- the value of `rG' at the beginning of the program. The following
- 256 - Z big-endian 64-bit words are loaded into global registers
- `$G' ... `$255'.
-
-`lop_stab'
- 0x980b0000. The next-to-last lopcode in a program. Must follow
- immediately after the lop_post lopcode and its data. After this
- lopcode follows all symbols in a compressed format (*note
- Symbol-table::).
-
-`lop_end'
- 0x980cYYZZ. The last lopcode in a program. It must follow the
- lop_stab lopcode and its data. The `YZ' field contains the number
- of 32-bit words of symbol table information after the preceding
- lop_stab lopcode.
-
- Note that the lopcode "fixups"; `lop_fixr', `lop_fixrx' and
-`lop_fixo' are not generated by BFD, but are handled. They are
-generated by `mmixal'.
-
- This trivial one-label, one-instruction file:
-
- :Main TRAP 1,2,3
-
- can be represented this way in mmo:
-
- 0x98090101 - lop_pre, one 32-bit word with timestamp.
-
- 0x98010002 - lop_loc, text segment, using a 64-bit address.
- Note that mmixal does not emit this for the file above.
- 0x00000000 - Address, high 32 bits.
- 0x00000000 - Address, low 32 bits.
- 0x98060002 - lop_file, 2 32-bit words for file-name.
- 0x74657374 - "test"
- 0x2e730000 - ".s\0\0"
- 0x98070001 - lop_line, line 1.
- 0x00010203 - TRAP 1,2,3
- 0x980a00ff - lop_post, setting $255 to 0.
- 0x00000000
- 0x00000000
- 0x980b0000 - lop_stab for ":Main" = 0, serial 1.
- 0x203a4040 *Note Symbol-table::.
- 0x10404020
- 0x4d206120
- 0x69016e00
- 0x81000000
- 0x980c0005 - lop_end; symbol table contained five 32-bit words.
-
-
-File: bfd.info, Node: Symbol-table, Next: mmo section mapping, Prev: File layout, Up: mmo
-
-3.5.2 Symbol table format
--------------------------
-
-From mmixal.w (or really, the generated mmixal.tex) in
-`http://www-cs-faculty.stanford.edu/~knuth/programs/mmix.tar.gz'):
-"Symbols are stored and retrieved by means of a `ternary search trie',
-following ideas of Bentley and Sedgewick. (See ACM-SIAM Symp. on
-Discrete Algorithms `8' (1997), 360-369; R.Sedgewick, `Algorithms in C'
-(Reading, Mass. Addison-Wesley, 1998), `15.4'.) Each trie node stores
-a character, and there are branches to subtries for the cases where a
-given character is less than, equal to, or greater than the character
-in the trie. There also is a pointer to a symbol table entry if a
-symbol ends at the current node."
-
- So it's a tree encoded as a stream of bytes. The stream of bytes
-acts on a single virtual global symbol, adding and removing characters
-and signalling complete symbol points. Here, we read the stream and
-create symbols at the completion points.
-
- First, there's a control byte `m'. If any of the listed bits in `m'
-is nonzero, we execute what stands at the right, in the listed order:
-
- (MMO3_LEFT)
- 0x40 - Traverse left trie.
- (Read a new command byte and recurse.)
-
- (MMO3_SYMBITS)
- 0x2f - Read the next byte as a character and store it in the
- current character position; increment character position.
- Test the bits of `m':
-
- (MMO3_WCHAR)
- 0x80 - The character is 16-bit (so read another byte,
- merge into current character.
-
- (MMO3_TYPEBITS)
- 0xf - We have a complete symbol; parse the type, value
- and serial number and do what should be done
- with a symbol. The type and length information
- is in j = (m & 0xf).
-
- (MMO3_REGQUAL_BITS)
- j == 0xf: A register variable. The following
- byte tells which register.
- j <= 8: An absolute symbol. Read j bytes as the
- big-endian number the symbol equals.
- A j = 2 with two zero bytes denotes an
- unknown symbol.
- j > 8: As with j <= 8, but add (0x20 << 56)
- to the value in the following j - 8
- bytes.
-
- Then comes the serial number, as a variant of
- uleb128, but better named ubeb128:
- Read bytes and shift the previous value left 7
- (multiply by 128). Add in the new byte, repeat
- until a byte has bit 7 set. The serial number
- is the computed value minus 128.
-
- (MMO3_MIDDLE)
- 0x20 - Traverse middle trie. (Read a new command byte
- and recurse.) Decrement character position.
-
- (MMO3_RIGHT)
- 0x10 - Traverse right trie. (Read a new command byte and
- recurse.)
-
- Let's look again at the `lop_stab' for the trivial file (*note File
-layout::).
-
- 0x980b0000 - lop_stab for ":Main" = 0, serial 1.
- 0x203a4040
- 0x10404020
- 0x4d206120
- 0x69016e00
- 0x81000000
-
- This forms the trivial trie (note that the path between ":" and "M"
-is redundant):
-
- 203a ":"
- 40 /
- 40 /
- 10 \
- 40 /
- 40 /
- 204d "M"
- 2061 "a"
- 2069 "i"
- 016e "n" is the last character in a full symbol, and
- with a value represented in one byte.
- 00 The value is 0.
- 81 The serial number is 1.
-
-
-File: bfd.info, Node: mmo section mapping, Prev: Symbol-table, Up: mmo
-
-3.5.3 mmo section mapping
--------------------------
-
-The implementation in BFD uses special data type 80 (decimal) to
-encapsulate and describe named sections, containing e.g. debug
-information. If needed, any datum in the encapsulation will be quoted
-using lop_quote. First comes a 32-bit word holding the number of
-32-bit words containing the zero-terminated zero-padded segment name.
-After the name there's a 32-bit word holding flags describing the
-section type. Then comes a 64-bit big-endian word with the section
-length (in bytes), then another with the section start address.
-Depending on the type of section, the contents might follow,
-zero-padded to 32-bit boundary. For a loadable section (such as data
-or code), the contents might follow at some later point, not
-necessarily immediately, as a lop_loc with the same start address as in
-the section description, followed by the contents. This in effect
-forms a descriptor that must be emitted before the actual contents.
-Sections described this way must not overlap.
-
- For areas that don't have such descriptors, synthetic sections are
-formed by BFD. Consecutive contents in the two memory areas
-`0x0000...00' to `0x01ff...ff' and `0x2000...00' to `0x20ff...ff' are
-entered in sections named `.text' and `.data' respectively. If an area
-is not otherwise described, but would together with a neighboring lower
-area be less than `0x40000000' bytes long, it is joined with the lower
-area and the gap is zero-filled. For other cases, a new section is
-formed, named `.MMIX.sec.N'. Here, N is a number, a running count
-through the mmo file, starting at 0.
-
- A loadable section specified as:
-
- .section secname,"ax"
- TETRA 1,2,3,4,-1,-2009
- BYTE 80
-
- and linked to address `0x4', is represented by the sequence:
-
- 0x98080050 - lop_spec 80
- 0x00000002 - two 32-bit words for the section name
- 0x7365636e - "secn"
- 0x616d6500 - "ame\0"
- 0x00000033 - flags CODE, READONLY, LOAD, ALLOC
- 0x00000000 - high 32 bits of section length
- 0x0000001c - section length is 28 bytes; 6 * 4 + 1 + alignment to 32 bits
- 0x00000000 - high 32 bits of section address
- 0x00000004 - section address is 4
- 0x98010002 - 64 bits with address of following data
- 0x00000000 - high 32 bits of address
- 0x00000004 - low 32 bits: data starts at address 4
- 0x00000001 - 1
- 0x00000002 - 2
- 0x00000003 - 3
- 0x00000004 - 4
- 0xffffffff - -1
- 0xfffff827 - -2009
- 0x50000000 - 80 as a byte, padded with zeros.
-
- Note that the lop_spec wrapping does not include the section
-contents. Compare this to a non-loaded section specified as:
-
- .section thirdsec
- TETRA 200001,100002
- BYTE 38,40
-
- This, when linked to address `0x200000000000001c', is represented by:
-
- 0x98080050 - lop_spec 80
- 0x00000002 - two 32-bit words for the section name
- 0x7365636e - "thir"
- 0x616d6500 - "dsec"
- 0x00000010 - flag READONLY
- 0x00000000 - high 32 bits of section length
- 0x0000000c - section length is 12 bytes; 2 * 4 + 2 + alignment to 32 bits
- 0x20000000 - high 32 bits of address
- 0x0000001c - low 32 bits of address 0x200000000000001c
- 0x00030d41 - 200001
- 0x000186a2 - 100002
- 0x26280000 - 38, 40 as bytes, padded with zeros
-
- For the latter example, the section contents must not be loaded in
-memory, and is therefore specified as part of the special data. The
-address is usually unimportant but might provide information for e.g.
-the DWARF 2 debugging format.
-
-
-File: bfd.info, Node: GNU Free Documentation License, Next: BFD Index, Prev: BFD back ends, Up: Top
-
- Version 1.3, 3 November 2008
-
- Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
- `http://fsf.org/'
-
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- 0. PREAMBLE
-
- The purpose of this License is to make a manual, textbook, or other
- functional and useful document "free" in the sense of freedom: to
- assure everyone the effective freedom to copy and redistribute it,
- with or without modifying it, either commercially or
- noncommercially. Secondarily, this License preserves for the
- author and publisher a way to get credit for their work, while not
- being considered responsible for modifications made by others.
-
- This License is a kind of "copyleft", which means that derivative
- works of the document must themselves be free in the same sense.
- It complements the GNU General Public License, which is a copyleft
- license designed for free software.
-
- We have designed this License in order to use it for manuals for
- free software, because free software needs free documentation: a
- free program should come with manuals providing the same freedoms
- that the software does. But this License is not limited to
- software manuals; it can be used for any textual work, regardless
- of subject matter or whether it is published as a printed book.
- We recommend this License principally for works whose purpose is
- instruction or reference.
-
- 1. APPLICABILITY AND DEFINITIONS
-
- This License applies to any manual or other work, in any medium,
- that contains a notice placed by the copyright holder saying it
- can be distributed under the terms of this License. Such a notice
- grants a world-wide, royalty-free license, unlimited in duration,
- to use that work under the conditions stated herein. The
- "Document", below, refers to any such manual or work. Any member
- of the public is a licensee, and is addressed as "you". You
- accept the license if you copy, modify or distribute the work in a
- way requiring permission under copyright law.
-
- A "Modified Version" of the Document means any work containing the
- Document or a portion of it, either copied verbatim, or with
- modifications and/or translated into another language.
-
- A "Secondary Section" is a named appendix or a front-matter section
- of the Document that deals exclusively with the relationship of the
- publishers or authors of the Document to the Document's overall
- subject (or to related matters) and contains nothing that could
- fall directly within that overall subject. (Thus, if the Document
- is in part a textbook of mathematics, a Secondary Section may not
- explain any mathematics.) The relationship could be a matter of
- historical connection with the subject or with related matters, or
- of legal, commercial, philosophical, ethical or political position
- regarding them.
-
- The "Invariant Sections" are certain Secondary Sections whose
- titles are designated, as being those of Invariant Sections, in
- the notice that says that the Document is released under this
- License. If a section does not fit the above definition of
- Secondary then it is not allowed to be designated as Invariant.
- The Document may contain zero Invariant Sections. If the Document
- does not identify any Invariant Sections then there are none.
-
- The "Cover Texts" are certain short passages of text that are
- listed, as Front-Cover Texts or Back-Cover Texts, in the notice
- that says that the Document is released under this License. A
- Front-Cover Text may be at most 5 words, and a Back-Cover Text may
- be at most 25 words.
-
- A "Transparent" copy of the Document means a machine-readable copy,
- represented in a format whose specification is available to the
- general public, that is suitable for revising the document
- straightforwardly with generic text editors or (for images
- composed of pixels) generic paint programs or (for drawings) some
- widely available drawing editor, and that is suitable for input to
- text formatters or for automatic translation to a variety of
- formats suitable for input to text formatters. A copy made in an
- otherwise Transparent file format whose markup, or absence of
- markup, has been arranged to thwart or discourage subsequent
- modification by readers is not Transparent. An image format is
- not Transparent if used for any substantial amount of text. A
- copy that is not "Transparent" is called "Opaque".
-
- Examples of suitable formats for Transparent copies include plain
- ASCII without markup, Texinfo input format, LaTeX input format,
- SGML or XML using a publicly available DTD, and
- standard-conforming simple HTML, PostScript or PDF designed for
- human modification. Examples of transparent image formats include
- PNG, XCF and JPG. Opaque formats include proprietary formats that
- can be read and edited only by proprietary word processors, SGML or
- XML for which the DTD and/or processing tools are not generally
- available, and the machine-generated HTML, PostScript or PDF
- produced by some word processors for output purposes only.
-
- The "Title Page" means, for a printed book, the title page itself,
- plus such following pages as are needed to hold, legibly, the
- material this License requires to appear in the title page. For
- works in formats which do not have any title page as such, "Title
- Page" means the text near the most prominent appearance of the
- work's title, preceding the beginning of the body of the text.
-
- The "publisher" means any person or entity that distributes copies
- of the Document to the public.
-
- A section "Entitled XYZ" means a named subunit of the Document
- whose title either is precisely XYZ or contains XYZ in parentheses
- following text that translates XYZ in another language. (Here XYZ
- stands for a specific section name mentioned below, such as
- "Acknowledgements", "Dedications", "Endorsements", or "History".)
- To "Preserve the Title" of such a section when you modify the
- Document means that it remains a section "Entitled XYZ" according
- to this definition.
-
- The Document may include Warranty Disclaimers next to the notice
- which states that this License applies to the Document. These
- Warranty Disclaimers are considered to be included by reference in
- this License, but only as regards disclaiming warranties: any other
- implication that these Warranty Disclaimers may have is void and
- has no effect on the meaning of this License.
-
- 2. VERBATIM COPYING
-
- You may copy and distribute the Document in any medium, either
- commercially or noncommercially, provided that this License, the
- copyright notices, and the license notice saying this License
- applies to the Document are reproduced in all copies, and that you
- add no other conditions whatsoever to those of this License. You
- may not use technical measures to obstruct or control the reading
- or further copying of the copies you make or distribute. However,
- you may accept compensation in exchange for copies. If you
- distribute a large enough number of copies you must also follow
- the conditions in section 3.
-
- You may also lend copies, under the same conditions stated above,
- and you may publicly display copies.
-
- 3. COPYING IN QUANTITY
-
- If you publish printed copies (or copies in media that commonly
- have printed covers) of the Document, numbering more than 100, and
- the Document's license notice requires Cover Texts, you must
- enclose the copies in covers that carry, clearly and legibly, all
- these Cover Texts: Front-Cover Texts on the front cover, and
- Back-Cover Texts on the back cover. Both covers must also clearly
- and legibly identify you as the publisher of these copies. The
- front cover must present the full title with all words of the
- title equally prominent and visible. You may add other material
- on the covers in addition. Copying with changes limited to the
- covers, as long as they preserve the title of the Document and
- satisfy these conditions, can be treated as verbatim copying in
- other respects.
-
- If the required texts for either cover are too voluminous to fit
- legibly, you should put the first ones listed (as many as fit
- reasonably) on the actual cover, and continue the rest onto
- adjacent pages.
-
- If you publish or distribute Opaque copies of the Document
- numbering more than 100, you must either include a
- machine-readable Transparent copy along with each Opaque copy, or
- state in or with each Opaque copy a computer-network location from
- which the general network-using public has access to download
- using public-standard network protocols a complete Transparent
- copy of the Document, free of added material. If you use the
- latter option, you must take reasonably prudent steps, when you
- begin distribution of Opaque copies in quantity, to ensure that
- this Transparent copy will remain thus accessible at the stated
- location until at least one year after the last time you
- distribute an Opaque copy (directly or through your agents or
- retailers) of that edition to the public.
-
- It is requested, but not required, that you contact the authors of
- the Document well before redistributing any large number of
- copies, to give them a chance to provide you with an updated
- version of the Document.
-
- 4. MODIFICATIONS
-
- You may copy and distribute a Modified Version of the Document
- under the conditions of sections 2 and 3 above, provided that you
- release the Modified Version under precisely this License, with
- the Modified Version filling the role of the Document, thus
- licensing distribution and modification of the Modified Version to
- whoever possesses a copy of it. In addition, you must do these
- things in the Modified Version:
-
- A. Use in the Title Page (and on the covers, if any) a title
- distinct from that of the Document, and from those of
- previous versions (which should, if there were any, be listed
- in the History section of the Document). You may use the
- same title as a previous version if the original publisher of
- that version gives permission.
-
- B. List on the Title Page, as authors, one or more persons or
- entities responsible for authorship of the modifications in
- the Modified Version, together with at least five of the
- principal authors of the Document (all of its principal
- authors, if it has fewer than five), unless they release you
- from this requirement.
-
- C. State on the Title page the name of the publisher of the
- Modified Version, as the publisher.
-
- D. Preserve all the copyright notices of the Document.
-
- E. Add an appropriate copyright notice for your modifications
- adjacent to the other copyright notices.
-
- F. Include, immediately after the copyright notices, a license
- notice giving the public permission to use the Modified
- Version under the terms of this License, in the form shown in
- the Addendum below.
-
- G. Preserve in that license notice the full lists of Invariant
- Sections and required Cover Texts given in the Document's
- license notice.
-
- H. Include an unaltered copy of this License.
-
- I. Preserve the section Entitled "History", Preserve its Title,
- and add to it an item stating at least the title, year, new
- authors, and publisher of the Modified Version as given on
- the Title Page. If there is no section Entitled "History" in
- the Document, create one stating the title, year, authors,
- and publisher of the Document as given on its Title Page,
- then add an item describing the Modified Version as stated in
- the previous sentence.
-
- J. Preserve the network location, if any, given in the Document
- for public access to a Transparent copy of the Document, and
- likewise the network locations given in the Document for
- previous versions it was based on. These may be placed in
- the "History" section. You may omit a network location for a
- work that was published at least four years before the
- Document itself, or if the original publisher of the version
- it refers to gives permission.
-
- K. For any section Entitled "Acknowledgements" or "Dedications",
- Preserve the Title of the section, and preserve in the
- section all the substance and tone of each of the contributor
- acknowledgements and/or dedications given therein.
-
- L. Preserve all the Invariant Sections of the Document,
- unaltered in their text and in their titles. Section numbers
- or the equivalent are not considered part of the section
- titles.
-
- M. Delete any section Entitled "Endorsements". Such a section
- may not be included in the Modified Version.
-
- N. Do not retitle any existing section to be Entitled
- "Endorsements" or to conflict in title with any Invariant
- Section.
-
- O. Preserve any Warranty Disclaimers.
-
- If the Modified Version includes new front-matter sections or
- appendices that qualify as Secondary Sections and contain no
- material copied from the Document, you may at your option
- designate some or all of these sections as invariant. To do this,
- add their titles to the list of Invariant Sections in the Modified
- Version's license notice. These titles must be distinct from any
- other section titles.
-
- You may add a section Entitled "Endorsements", provided it contains
- nothing but endorsements of your Modified Version by various
- parties--for example, statements of peer review or that the text
- has been approved by an organization as the authoritative
- definition of a standard.
-
- You may add a passage of up to five words as a Front-Cover Text,
- and a passage of up to 25 words as a Back-Cover Text, to the end
- of the list of Cover Texts in the Modified Version. Only one
- passage of Front-Cover Text and one of Back-Cover Text may be
- added by (or through arrangements made by) any one entity. If the
- Document already includes a cover text for the same cover,
- previously added by you or by arrangement made by the same entity
- you are acting on behalf of, you may not add another; but you may
- replace the old one, on explicit permission from the previous
- publisher that added the old one.
-
- The author(s) and publisher(s) of the Document do not by this
- License give permission to use their names for publicity for or to
- assert or imply endorsement of any Modified Version.
-
- 5. COMBINING DOCUMENTS
-
- You may combine the Document with other documents released under
- this License, under the terms defined in section 4 above for
- modified versions, provided that you include in the combination
- all of the Invariant Sections of all of the original documents,
- unmodified, and list them all as Invariant Sections of your
- combined work in its license notice, and that you preserve all
- their Warranty Disclaimers.
-
- The combined work need only contain one copy of this License, and
- multiple identical Invariant Sections may be replaced with a single
- copy. If there are multiple Invariant Sections with the same name
- but different contents, make the title of each such section unique
- by adding at the end of it, in parentheses, the name of the
- original author or publisher of that section if known, or else a
- unique number. Make the same adjustment to the section titles in
- the list of Invariant Sections in the license notice of the
- combined work.
-
- In the combination, you must combine any sections Entitled
- "History" in the various original documents, forming one section
- Entitled "History"; likewise combine any sections Entitled
- "Acknowledgements", and any sections Entitled "Dedications". You
- must delete all sections Entitled "Endorsements."
-
- 6. COLLECTIONS OF DOCUMENTS
-
- You may make a collection consisting of the Document and other
- documents released under this License, and replace the individual
- copies of this License in the various documents with a single copy
- that is included in the collection, provided that you follow the
- rules of this License for verbatim copying of each of the
- documents in all other respects.
-
- You may extract a single document from such a collection, and
- distribute it individually under this License, provided you insert
- a copy of this License into the extracted document, and follow
- this License in all other respects regarding verbatim copying of
- that document.
-
- 7. AGGREGATION WITH INDEPENDENT WORKS
-
- A compilation of the Document or its derivatives with other
- separate and independent documents or works, in or on a volume of
- a storage or distribution medium, is called an "aggregate" if the
- copyright resulting from the compilation is not used to limit the
- legal rights of the compilation's users beyond what the individual
- works permit. When the Document is included in an aggregate, this
- License does not apply to the other works in the aggregate which
- are not themselves derivative works of the Document.
-
- If the Cover Text requirement of section 3 is applicable to these
- copies of the Document, then if the Document is less than one half
- of the entire aggregate, the Document's Cover Texts may be placed
- on covers that bracket the Document within the aggregate, or the
- electronic equivalent of covers if the Document is in electronic
- form. Otherwise they must appear on printed covers that bracket
- the whole aggregate.
-
- 8. TRANSLATION
-
- Translation is considered a kind of modification, so you may
- distribute translations of the Document under the terms of section
- 4. Replacing Invariant Sections with translations requires special
- permission from their copyright holders, but you may include
- translations of some or all Invariant Sections in addition to the
- original versions of these Invariant Sections. You may include a
- translation of this License, and all the license notices in the
- Document, and any Warranty Disclaimers, provided that you also
- include the original English version of this License and the
- original versions of those notices and disclaimers. In case of a
- disagreement between the translation and the original version of
- this License or a notice or disclaimer, the original version will
- prevail.
-
- If a section in the Document is Entitled "Acknowledgements",
- "Dedications", or "History", the requirement (section 4) to
- Preserve its Title (section 1) will typically require changing the
- actual title.
-
- 9. TERMINATION
-
- You may not copy, modify, sublicense, or distribute the Document
- except as expressly provided under this License. Any attempt
- otherwise to copy, modify, sublicense, or distribute it is void,
- and will automatically terminate your rights under this License.
-
- However, if you cease all violation of this License, then your
- license from a particular copyright holder is reinstated (a)
- provisionally, unless and until the copyright holder explicitly
- and finally terminates your license, and (b) permanently, if the
- copyright holder fails to notify you of the violation by some
- reasonable means prior to 60 days after the cessation.
-
- Moreover, your license from a particular copyright holder is
- reinstated permanently if the copyright holder notifies you of the
- violation by some reasonable means, this is the first time you have
- received notice of violation of this License (for any work) from
- that copyright holder, and you cure the violation prior to 30 days
- after your receipt of the notice.
-
- Termination of your rights under this section does not terminate
- the licenses of parties who have received copies or rights from
- you under this License. If your rights have been terminated and
- not permanently reinstated, receipt of a copy of some or all of
- the same material does not give you any rights to use it.
-
- 10. FUTURE REVISIONS OF THIS LICENSE
-
- The Free Software Foundation may publish new, revised versions of
- the GNU Free Documentation License from time to time. Such new
- versions will be similar in spirit to the present version, but may
- differ in detail to address new problems or concerns. See
- `http://www.gnu.org/copyleft/'.
-
- Each version of the License is given a distinguishing version
- number. If the Document specifies that a particular numbered
- version of this License "or any later version" applies to it, you
- have the option of following the terms and conditions either of
- that specified version or of any later version that has been
- published (not as a draft) by the Free Software Foundation. If
- the Document does not specify a version number of this License,
- you may choose any version ever published (not as a draft) by the
- Free Software Foundation. If the Document specifies that a proxy
- can decide which future versions of this License can be used, that
- proxy's public statement of acceptance of a version permanently
- authorizes you to choose that version for the Document.
-
- 11. RELICENSING
-
- "Massive Multiauthor Collaboration Site" (or "MMC Site") means any
- World Wide Web server that publishes copyrightable works and also
- provides prominent facilities for anybody to edit those works. A
- public wiki that anybody can edit is an example of such a server.
- A "Massive Multiauthor Collaboration" (or "MMC") contained in the
- site means any set of copyrightable works thus published on the MMC
- site.
-
- "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
- license published by Creative Commons Corporation, a not-for-profit
- corporation with a principal place of business in San Francisco,
- California, as well as future copyleft versions of that license
- published by that same organization.
-
- "Incorporate" means to publish or republish a Document, in whole or
- in part, as part of another Document.
-
- An MMC is "eligible for relicensing" if it is licensed under this
- License, and if all works that were first published under this
- License somewhere other than this MMC, and subsequently
- incorporated in whole or in part into the MMC, (1) had no cover
- texts or invariant sections, and (2) were thus incorporated prior
- to November 1, 2008.
-
- The operator of an MMC Site may republish an MMC contained in the
- site under CC-BY-SA on the same site at any time before August 1,
- 2009, provided the MMC is eligible for relicensing.
-
-
-ADDENDUM: How to use this License for your documents
-====================================================
-
-To use this License in a document you have written, include a copy of
-the License in the document and put the following copyright and license
-notices just after the title page:
-
- Copyright (C) YEAR YOUR NAME.
- Permission is granted to copy, distribute and/or modify this document
- under the terms of the GNU Free Documentation License, Version 1.3
- or any later version published by the Free Software Foundation;
- with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
- Texts. A copy of the license is included in the section entitled ``GNU
- Free Documentation License''.
-
- If you have Invariant Sections, Front-Cover Texts and Back-Cover
-Texts, replace the "with...Texts." line with this:
-
- with the Invariant Sections being LIST THEIR TITLES, with
- the Front-Cover Texts being LIST, and with the Back-Cover Texts
- being LIST.
-
- If you have Invariant Sections without Cover Texts, or some other
-combination of the three, merge those two alternatives to suit the
-situation.
-
- If your document contains nontrivial examples of program code, we
-recommend releasing these examples in parallel under your choice of
-free software license, such as the GNU General Public License, to
-permit their use in free software.
-
-
-File: bfd.info, Node: BFD Index, Prev: GNU Free Documentation License, Up: Top
-
-BFD Index
-*********
-
- [index ]
-* Menu:
-
-* _bfd_final_link_relocate: Relocating the section contents.
- (line 22)
-* _bfd_generic_link_add_archive_symbols: Adding symbols from an archive.
- (line 15)
-* _bfd_generic_link_add_one_symbol: Adding symbols from an object file.
- (line 19)
-* _bfd_generic_make_empty_symbol: symbol handling functions.
- (line 92)
-* _bfd_link_add_symbols in target vector: Adding Symbols to the Hash Table.
- (line 6)
-* _bfd_link_final_link in target vector: Performing the Final Link.
- (line 6)
-* _bfd_link_hash_table_create in target vector: Creating a Linker Hash Table.
- (line 6)
-* _bfd_relocate_contents: Relocating the section contents.
- (line 22)
-* aout_SIZE_machine_type: aout. (line 147)
-* aout_SIZE_mkobject: aout. (line 139)
-* aout_SIZE_new_section_hook: aout. (line 177)
-* aout_SIZE_set_arch_mach: aout. (line 164)
-* aout_SIZE_some_aout_object_p: aout. (line 125)
-* aout_SIZE_swap_exec_header_in: aout. (line 101)
-* aout_SIZE_swap_exec_header_out: aout. (line 113)
-* arelent_chain: typedef arelent. (line 336)
-* BFD: Overview. (line 6)
-* BFD canonical format: Canonical format. (line 11)
-* bfd_alloc: Opening and Closing.
- (line 218)
-* bfd_alloc2: Opening and Closing.
- (line 227)
-* bfd_alt_mach_code: Miscellaneous. (line 308)
-* bfd_arch_bits_per_address: Architectures. (line 584)
-* bfd_arch_bits_per_byte: Architectures. (line 576)
-* bfd_arch_default_fill: Architectures. (line 665)
-* bfd_arch_get_compatible: Architectures. (line 519)
-* bfd_arch_list: Architectures. (line 510)
-* bfd_arch_mach_octets_per_byte: Architectures. (line 653)
-* BFD_ARELOC_BFIN_ADD: howto manager. (line 1120)
-* BFD_ARELOC_BFIN_ADDR: howto manager. (line 1171)
-* BFD_ARELOC_BFIN_AND: howto manager. (line 1141)
-* BFD_ARELOC_BFIN_COMP: howto manager. (line 1162)
-* BFD_ARELOC_BFIN_CONST: howto manager. (line 1117)
-* BFD_ARELOC_BFIN_DIV: howto manager. (line 1129)
-* BFD_ARELOC_BFIN_HWPAGE: howto manager. (line 1168)
-* BFD_ARELOC_BFIN_LAND: howto manager. (line 1150)
-* BFD_ARELOC_BFIN_LEN: howto manager. (line 1156)
-* BFD_ARELOC_BFIN_LOR: howto manager. (line 1153)
-* BFD_ARELOC_BFIN_LSHIFT: howto manager. (line 1135)
-* BFD_ARELOC_BFIN_MOD: howto manager. (line 1132)
-* BFD_ARELOC_BFIN_MULT: howto manager. (line 1126)
-* BFD_ARELOC_BFIN_NEG: howto manager. (line 1159)
-* BFD_ARELOC_BFIN_OR: howto manager. (line 1144)
-* BFD_ARELOC_BFIN_PAGE: howto manager. (line 1165)
-* BFD_ARELOC_BFIN_PUSH: howto manager. (line 1114)
-* BFD_ARELOC_BFIN_RSHIFT: howto manager. (line 1138)
-* BFD_ARELOC_BFIN_SUB: howto manager. (line 1123)
-* BFD_ARELOC_BFIN_XOR: howto manager. (line 1147)
-* bfd_cache_close: File Caching. (line 26)
-* bfd_cache_close_all: File Caching. (line 39)
-* bfd_cache_init: File Caching. (line 18)
-* bfd_calc_gnu_debuglink_crc32: Opening and Closing.
- (line 254)
-* bfd_canonicalize_reloc: Miscellaneous. (line 19)
-* bfd_canonicalize_symtab: symbol handling functions.
- (line 50)
-* bfd_check_format: Formats. (line 21)
-* bfd_check_format_matches: Formats. (line 52)
-* bfd_check_overflow: typedef arelent. (line 348)
-* bfd_close: Opening and Closing.
- (line 143)
-* bfd_close_all_done: Opening and Closing.
- (line 161)
-* bfd_coff_backend_data: coff. (line 305)
-* bfd_copy_private_bfd_data: Miscellaneous. (line 158)
-* bfd_copy_private_header_data: Miscellaneous. (line 140)
-* bfd_copy_private_section_data: section prototypes. (line 278)
-* bfd_copy_private_symbol_data: symbol handling functions.
- (line 140)
-* bfd_core_file_failing_command: Core Files. (line 12)
-* bfd_core_file_failing_signal: Core Files. (line 21)
-* bfd_core_file_pid: Core Files. (line 30)
-* bfd_create: Opening and Closing.
- (line 180)
-* bfd_create_gnu_debuglink_section: Opening and Closing.
- (line 363)
-* bfd_decode_symclass: symbol handling functions.
- (line 111)
-* bfd_default_arch_struct: Architectures. (line 531)
-* bfd_default_compatible: Architectures. (line 593)
-* bfd_default_reloc_type_lookup: howto manager. (line 3268)
-* bfd_default_scan: Architectures. (line 602)
-* bfd_default_set_arch_mach: Architectures. (line 549)
-* bfd_demangle: Miscellaneous. (line 359)
-* bfd_emul_get_commonpagesize: Miscellaneous. (line 339)
-* bfd_emul_get_maxpagesize: Miscellaneous. (line 319)
-* bfd_emul_set_commonpagesize: Miscellaneous. (line 350)
-* bfd_emul_set_maxpagesize: Miscellaneous. (line 330)
-* bfd_errmsg: Error reporting. (line 67)
-* bfd_fdopenr: Opening and Closing.
- (line 51)
-* bfd_fill_in_gnu_debuglink_section: Opening and Closing.
- (line 377)
-* bfd_find_target: bfd_target. (line 473)
-* bfd_find_version_for_sym: Writing the symbol table.
- (line 81)
-* bfd_follow_gnu_debugaltlink: Opening and Closing.
- (line 343)
-* bfd_follow_gnu_debuglink: Opening and Closing.
- (line 322)
-* bfd_fopen: Opening and Closing.
- (line 12)
-* bfd_format_string: Formats. (line 79)
-* bfd_generic_define_common_symbol: Writing the symbol table.
- (line 68)
-* bfd_generic_discard_group: section prototypes. (line 304)
-* bfd_generic_gc_sections: howto manager. (line 3299)
-* bfd_generic_get_relocated_section_contents: howto manager. (line 3329)
-* bfd_generic_is_group_section: section prototypes. (line 296)
-* bfd_generic_lookup_section_flags: howto manager. (line 3309)
-* bfd_generic_merge_sections: howto manager. (line 3319)
-* bfd_generic_relax_section: howto manager. (line 3286)
-* bfd_get_alt_debug_link_info: Opening and Closing.
- (line 279)
-* bfd_get_arch: Architectures. (line 560)
-* bfd_get_arch_info: Architectures. (line 612)
-* bfd_get_arch_size: Miscellaneous. (line 63)
-* bfd_get_assert_handler: Error reporting. (line 150)
-* bfd_get_debug_link_info: Opening and Closing.
- (line 268)
-* bfd_get_error: Error reporting. (line 48)
-* bfd_get_error_handler: Error reporting. (line 118)
-* bfd_get_gp_size: Miscellaneous. (line 104)
-* bfd_get_linker_section: section prototypes. (line 36)
-* bfd_get_mach: Architectures. (line 568)
-* bfd_get_mtime: Miscellaneous. (line 410)
-* bfd_get_next_mapent: Archives. (line 58)
-* bfd_get_next_section_by_name: section prototypes. (line 26)
-* bfd_get_reloc_code_name: howto manager. (line 3277)
-* bfd_get_reloc_size: typedef arelent. (line 327)
-* bfd_get_reloc_upper_bound: Miscellaneous. (line 9)
-* bfd_get_section_by_name: section prototypes. (line 17)
-* bfd_get_section_by_name_if: section prototypes. (line 45)
-* bfd_get_section_contents: section prototypes. (line 251)
-* bfd_get_sign_extend_vma: Miscellaneous. (line 76)
-* bfd_get_size <1>: Miscellaneous. (line 419)
-* bfd_get_size: Internal. (line 25)
-* bfd_get_symtab_upper_bound: symbol handling functions.
- (line 6)
-* bfd_get_target_info: bfd_target. (line 489)
-* bfd_get_unique_section_name: section prototypes. (line 64)
-* bfd_h_put_size: Internal. (line 97)
-* bfd_hash_allocate: Creating and Freeing a Hash Table.
- (line 17)
-* bfd_hash_lookup: Looking Up or Entering a String.
- (line 6)
-* bfd_hash_newfunc: Creating and Freeing a Hash Table.
- (line 12)
-* bfd_hash_set_default_size: Creating and Freeing a Hash Table.
- (line 25)
-* bfd_hash_table_free: Creating and Freeing a Hash Table.
- (line 21)
-* bfd_hash_table_init: Creating and Freeing a Hash Table.
- (line 6)
-* bfd_hash_table_init_n: Creating and Freeing a Hash Table.
- (line 6)
-* bfd_hash_traverse: Traversing a Hash Table.
- (line 6)
-* bfd_hide_sym_by_version: Writing the symbol table.
- (line 93)
-* bfd_init: Initialization. (line 11)
-* bfd_install_relocation: typedef arelent. (line 389)
-* bfd_is_local_label: symbol handling functions.
- (line 17)
-* bfd_is_local_label_name: symbol handling functions.
- (line 26)
-* bfd_is_target_special_symbol: symbol handling functions.
- (line 38)
-* bfd_is_undefined_symclass: symbol handling functions.
- (line 120)
-* bfd_link_split_section: Writing the symbol table.
- (line 44)
-* bfd_log2: Internal. (line 164)
-* bfd_lookup_arch: Architectures. (line 620)
-* bfd_make_debug_symbol: symbol handling functions.
- (line 102)
-* bfd_make_empty_symbol: symbol handling functions.
- (line 78)
-* bfd_make_readable: Opening and Closing.
- (line 204)
-* bfd_make_section: section prototypes. (line 143)
-* bfd_make_section_anyway: section prototypes. (line 114)
-* bfd_make_section_anyway_with_flags: section prototypes. (line 96)
-* bfd_make_section_old_way: section prototypes. (line 76)
-* bfd_make_section_with_flags: section prototypes. (line 130)
-* bfd_make_writable: Opening and Closing.
- (line 190)
-* bfd_malloc_and_get_section: section prototypes. (line 268)
-* bfd_map_over_sections: section prototypes. (line 178)
-* bfd_merge_private_bfd_data: Miscellaneous. (line 174)
-* bfd_mmap: Miscellaneous. (line 448)
-* bfd_octets_per_byte: Architectures. (line 643)
-* bfd_open_file: File Caching. (line 52)
-* bfd_openr: Opening and Closing.
- (line 35)
-* bfd_openr_iovec: Opening and Closing.
- (line 83)
-* bfd_openr_next_archived_file: Archives. (line 84)
-* bfd_openstreamr: Opening and Closing.
- (line 74)
-* bfd_openw: Opening and Closing.
- (line 131)
-* bfd_perform_relocation: typedef arelent. (line 364)
-* bfd_perror: Error reporting. (line 76)
-* bfd_print_symbol_vandf: symbol handling functions.
- (line 70)
-* bfd_printable_arch_mach: Architectures. (line 631)
-* bfd_printable_name: Architectures. (line 491)
-* bfd_put_size: Internal. (line 22)
-* BFD_RELOC_12_PCREL: howto manager. (line 39)
-* BFD_RELOC_14: howto manager. (line 31)
-* BFD_RELOC_16: howto manager. (line 30)
-* BFD_RELOC_16_BASEREL: howto manager. (line 99)
-* BFD_RELOC_16_GOT_PCREL: howto manager. (line 52)
-* BFD_RELOC_16_GOTOFF: howto manager. (line 55)
-* BFD_RELOC_16_PCREL: howto manager. (line 38)
-* BFD_RELOC_16_PCREL_S2: howto manager. (line 111)
-* BFD_RELOC_16_PLT_PCREL: howto manager. (line 63)
-* BFD_RELOC_16_PLTOFF: howto manager. (line 67)
-* BFD_RELOC_16C_ABS20: howto manager. (line 2236)
-* BFD_RELOC_16C_ABS20_C: howto manager. (line 2237)
-* BFD_RELOC_16C_ABS24: howto manager. (line 2238)
-* BFD_RELOC_16C_ABS24_C: howto manager. (line 2239)
-* BFD_RELOC_16C_DISP04: howto manager. (line 2216)
-* BFD_RELOC_16C_DISP04_C: howto manager. (line 2217)
-* BFD_RELOC_16C_DISP08: howto manager. (line 2218)
-* BFD_RELOC_16C_DISP08_C: howto manager. (line 2219)
-* BFD_RELOC_16C_DISP16: howto manager. (line 2220)
-* BFD_RELOC_16C_DISP16_C: howto manager. (line 2221)
-* BFD_RELOC_16C_DISP24: howto manager. (line 2222)
-* BFD_RELOC_16C_DISP24_C: howto manager. (line 2223)
-* BFD_RELOC_16C_DISP24a: howto manager. (line 2224)
-* BFD_RELOC_16C_DISP24a_C: howto manager. (line 2225)
-* BFD_RELOC_16C_IMM04: howto manager. (line 2240)
-* BFD_RELOC_16C_IMM04_C: howto manager. (line 2241)
-* BFD_RELOC_16C_IMM16: howto manager. (line 2242)
-* BFD_RELOC_16C_IMM16_C: howto manager. (line 2243)
-* BFD_RELOC_16C_IMM20: howto manager. (line 2244)
-* BFD_RELOC_16C_IMM20_C: howto manager. (line 2245)
-* BFD_RELOC_16C_IMM24: howto manager. (line 2246)
-* BFD_RELOC_16C_IMM24_C: howto manager. (line 2247)
-* BFD_RELOC_16C_IMM32: howto manager. (line 2248)
-* BFD_RELOC_16C_IMM32_C: howto manager. (line 2249)
-* BFD_RELOC_16C_NUM08: howto manager. (line 2210)
-* BFD_RELOC_16C_NUM08_C: howto manager. (line 2211)
-* BFD_RELOC_16C_NUM16: howto manager. (line 2212)
-* BFD_RELOC_16C_NUM16_C: howto manager. (line 2213)
-* BFD_RELOC_16C_NUM32: howto manager. (line 2214)
-* BFD_RELOC_16C_NUM32_C: howto manager. (line 2215)
-* BFD_RELOC_16C_REG04: howto manager. (line 2226)
-* BFD_RELOC_16C_REG04_C: howto manager. (line 2227)
-* BFD_RELOC_16C_REG04a: howto manager. (line 2228)
-* BFD_RELOC_16C_REG04a_C: howto manager. (line 2229)
-* BFD_RELOC_16C_REG14: howto manager. (line 2230)
-* BFD_RELOC_16C_REG14_C: howto manager. (line 2231)
-* BFD_RELOC_16C_REG16: howto manager. (line 2232)
-* BFD_RELOC_16C_REG16_C: howto manager. (line 2233)
-* BFD_RELOC_16C_REG20: howto manager. (line 2234)
-* BFD_RELOC_16C_REG20_C: howto manager. (line 2235)
-* BFD_RELOC_23_PCREL_S2: howto manager. (line 112)
-* BFD_RELOC_24: howto manager. (line 29)
-* BFD_RELOC_24_PCREL: howto manager. (line 37)
-* BFD_RELOC_24_PLT_PCREL: howto manager. (line 62)
-* BFD_RELOC_26: howto manager. (line 28)
-* BFD_RELOC_32: howto manager. (line 27)
-* BFD_RELOC_32_BASEREL: howto manager. (line 98)
-* BFD_RELOC_32_GOT_PCREL: howto manager. (line 51)
-* BFD_RELOC_32_GOTOFF: howto manager. (line 54)
-* BFD_RELOC_32_PCREL: howto manager. (line 36)
-* BFD_RELOC_32_PCREL_S2: howto manager. (line 110)
-* BFD_RELOC_32_PLT_PCREL: howto manager. (line 61)
-* BFD_RELOC_32_PLTOFF: howto manager. (line 66)
-* BFD_RELOC_32_SECREL: howto manager. (line 48)
-* BFD_RELOC_386_COPY: howto manager. (line 577)
-* BFD_RELOC_386_GLOB_DAT: howto manager. (line 578)
-* BFD_RELOC_386_GOT32: howto manager. (line 575)
-* BFD_RELOC_386_GOTOFF: howto manager. (line 581)
-* BFD_RELOC_386_GOTPC: howto manager. (line 582)
-* BFD_RELOC_386_IRELATIVE: howto manager. (line 598)
-* BFD_RELOC_386_JUMP_SLOT: howto manager. (line 579)
-* BFD_RELOC_386_PLT32: howto manager. (line 576)
-* BFD_RELOC_386_RELATIVE: howto manager. (line 580)
-* BFD_RELOC_386_TLS_DESC: howto manager. (line 597)
-* BFD_RELOC_386_TLS_DESC_CALL: howto manager. (line 596)
-* BFD_RELOC_386_TLS_DTPMOD32: howto manager. (line 592)
-* BFD_RELOC_386_TLS_DTPOFF32: howto manager. (line 593)
-* BFD_RELOC_386_TLS_GD: howto manager. (line 587)
-* BFD_RELOC_386_TLS_GOTDESC: howto manager. (line 595)
-* BFD_RELOC_386_TLS_GOTIE: howto manager. (line 585)
-* BFD_RELOC_386_TLS_IE: howto manager. (line 584)
-* BFD_RELOC_386_TLS_IE_32: howto manager. (line 590)
-* BFD_RELOC_386_TLS_LDM: howto manager. (line 588)
-* BFD_RELOC_386_TLS_LDO_32: howto manager. (line 589)
-* BFD_RELOC_386_TLS_LE: howto manager. (line 586)
-* BFD_RELOC_386_TLS_LE_32: howto manager. (line 591)
-* BFD_RELOC_386_TLS_TPOFF: howto manager. (line 583)
-* BFD_RELOC_386_TLS_TPOFF32: howto manager. (line 594)
-* BFD_RELOC_390_12: howto manager. (line 1819)
-* BFD_RELOC_390_20: howto manager. (line 1931)
-* BFD_RELOC_390_COPY: howto manager. (line 1828)
-* BFD_RELOC_390_GLOB_DAT: howto manager. (line 1831)
-* BFD_RELOC_390_GOT12: howto manager. (line 1822)
-* BFD_RELOC_390_GOT16: howto manager. (line 1843)
-* BFD_RELOC_390_GOT20: howto manager. (line 1932)
-* BFD_RELOC_390_GOT64: howto manager. (line 1873)
-* BFD_RELOC_390_GOTENT: howto manager. (line 1879)
-* BFD_RELOC_390_GOTOFF64: howto manager. (line 1882)
-* BFD_RELOC_390_GOTPC: howto manager. (line 1840)
-* BFD_RELOC_390_GOTPCDBL: howto manager. (line 1870)
-* BFD_RELOC_390_GOTPLT12: howto manager. (line 1885)
-* BFD_RELOC_390_GOTPLT16: howto manager. (line 1888)
-* BFD_RELOC_390_GOTPLT20: howto manager. (line 1933)
-* BFD_RELOC_390_GOTPLT32: howto manager. (line 1891)
-* BFD_RELOC_390_GOTPLT64: howto manager. (line 1894)
-* BFD_RELOC_390_GOTPLTENT: howto manager. (line 1897)
-* BFD_RELOC_390_IRELATIVE: howto manager. (line 1937)
-* BFD_RELOC_390_JMP_SLOT: howto manager. (line 1834)
-* BFD_RELOC_390_PC12DBL: howto manager. (line 1846)
-* BFD_RELOC_390_PC16DBL: howto manager. (line 1852)
-* BFD_RELOC_390_PC24DBL: howto manager. (line 1858)
-* BFD_RELOC_390_PC32DBL: howto manager. (line 1864)
-* BFD_RELOC_390_PLT12DBL: howto manager. (line 1849)
-* BFD_RELOC_390_PLT16DBL: howto manager. (line 1855)
-* BFD_RELOC_390_PLT24DBL: howto manager. (line 1861)
-* BFD_RELOC_390_PLT32: howto manager. (line 1825)
-* BFD_RELOC_390_PLT32DBL: howto manager. (line 1867)
-* BFD_RELOC_390_PLT64: howto manager. (line 1876)
-* BFD_RELOC_390_PLTOFF16: howto manager. (line 1900)
-* BFD_RELOC_390_PLTOFF32: howto manager. (line 1903)
-* BFD_RELOC_390_PLTOFF64: howto manager. (line 1906)
-* BFD_RELOC_390_RELATIVE: howto manager. (line 1837)
-* BFD_RELOC_390_TLS_DTPMOD: howto manager. (line 1926)
-* BFD_RELOC_390_TLS_DTPOFF: howto manager. (line 1927)
-* BFD_RELOC_390_TLS_GD32: howto manager. (line 1912)
-* BFD_RELOC_390_TLS_GD64: howto manager. (line 1913)
-* BFD_RELOC_390_TLS_GDCALL: howto manager. (line 1910)
-* BFD_RELOC_390_TLS_GOTIE12: howto manager. (line 1914)
-* BFD_RELOC_390_TLS_GOTIE20: howto manager. (line 1934)
-* BFD_RELOC_390_TLS_GOTIE32: howto manager. (line 1915)
-* BFD_RELOC_390_TLS_GOTIE64: howto manager. (line 1916)
-* BFD_RELOC_390_TLS_IE32: howto manager. (line 1919)
-* BFD_RELOC_390_TLS_IE64: howto manager. (line 1920)
-* BFD_RELOC_390_TLS_IEENT: howto manager. (line 1921)
-* BFD_RELOC_390_TLS_LDCALL: howto manager. (line 1911)
-* BFD_RELOC_390_TLS_LDM32: howto manager. (line 1917)
-* BFD_RELOC_390_TLS_LDM64: howto manager. (line 1918)
-* BFD_RELOC_390_TLS_LDO32: howto manager. (line 1924)
-* BFD_RELOC_390_TLS_LDO64: howto manager. (line 1925)
-* BFD_RELOC_390_TLS_LE32: howto manager. (line 1922)
-* BFD_RELOC_390_TLS_LE64: howto manager. (line 1923)
-* BFD_RELOC_390_TLS_LOAD: howto manager. (line 1909)
-* BFD_RELOC_390_TLS_TPOFF: howto manager. (line 1928)
-* BFD_RELOC_64: howto manager. (line 26)
-* BFD_RELOC_64_PCREL: howto manager. (line 35)
-* BFD_RELOC_64_PLT_PCREL: howto manager. (line 60)
-* BFD_RELOC_64_PLTOFF: howto manager. (line 65)
-* BFD_RELOC_68K_GLOB_DAT: howto manager. (line 78)
-* BFD_RELOC_68K_JMP_SLOT: howto manager. (line 79)
-* BFD_RELOC_68K_RELATIVE: howto manager. (line 80)
-* BFD_RELOC_68K_TLS_GD16: howto manager. (line 82)
-* BFD_RELOC_68K_TLS_GD32: howto manager. (line 81)
-* BFD_RELOC_68K_TLS_GD8: howto manager. (line 83)
-* BFD_RELOC_68K_TLS_IE16: howto manager. (line 91)
-* BFD_RELOC_68K_TLS_IE32: howto manager. (line 90)
-* BFD_RELOC_68K_TLS_IE8: howto manager. (line 92)
-* BFD_RELOC_68K_TLS_LDM16: howto manager. (line 85)
-* BFD_RELOC_68K_TLS_LDM32: howto manager. (line 84)
-* BFD_RELOC_68K_TLS_LDM8: howto manager. (line 86)
-* BFD_RELOC_68K_TLS_LDO16: howto manager. (line 88)
-* BFD_RELOC_68K_TLS_LDO32: howto manager. (line 87)
-* BFD_RELOC_68K_TLS_LDO8: howto manager. (line 89)
-* BFD_RELOC_68K_TLS_LE16: howto manager. (line 94)
-* BFD_RELOC_68K_TLS_LE32: howto manager. (line 93)
-* BFD_RELOC_68K_TLS_LE8: howto manager. (line 95)
-* BFD_RELOC_8: howto manager. (line 32)
-* BFD_RELOC_860_COPY: howto manager. (line 2364)
-* BFD_RELOC_860_GLOB_DAT: howto manager. (line 2365)
-* BFD_RELOC_860_HAGOT: howto manager. (line 2390)
-* BFD_RELOC_860_HAGOTOFF: howto manager. (line 2391)
-* BFD_RELOC_860_HAPC: howto manager. (line 2392)
-* BFD_RELOC_860_HIGH: howto manager. (line 2393)
-* BFD_RELOC_860_HIGHADJ: howto manager. (line 2389)
-* BFD_RELOC_860_HIGOT: howto manager. (line 2394)
-* BFD_RELOC_860_HIGOTOFF: howto manager. (line 2395)
-* BFD_RELOC_860_JUMP_SLOT: howto manager. (line 2366)
-* BFD_RELOC_860_LOGOT0: howto manager. (line 2378)
-* BFD_RELOC_860_LOGOT1: howto manager. (line 2380)
-* BFD_RELOC_860_LOGOTOFF0: howto manager. (line 2382)
-* BFD_RELOC_860_LOGOTOFF1: howto manager. (line 2384)
-* BFD_RELOC_860_LOGOTOFF2: howto manager. (line 2386)
-* BFD_RELOC_860_LOGOTOFF3: howto manager. (line 2387)
-* BFD_RELOC_860_LOPC: howto manager. (line 2388)
-* BFD_RELOC_860_LOW0: howto manager. (line 2371)
-* BFD_RELOC_860_LOW1: howto manager. (line 2373)
-* BFD_RELOC_860_LOW2: howto manager. (line 2375)
-* BFD_RELOC_860_LOW3: howto manager. (line 2377)
-* BFD_RELOC_860_PC16: howto manager. (line 2370)
-* BFD_RELOC_860_PC26: howto manager. (line 2368)
-* BFD_RELOC_860_PLT26: howto manager. (line 2369)
-* BFD_RELOC_860_RELATIVE: howto manager. (line 2367)
-* BFD_RELOC_860_SPGOT0: howto manager. (line 2379)
-* BFD_RELOC_860_SPGOT1: howto manager. (line 2381)
-* BFD_RELOC_860_SPGOTOFF0: howto manager. (line 2383)
-* BFD_RELOC_860_SPGOTOFF1: howto manager. (line 2385)
-* BFD_RELOC_860_SPLIT0: howto manager. (line 2372)
-* BFD_RELOC_860_SPLIT1: howto manager. (line 2374)
-* BFD_RELOC_860_SPLIT2: howto manager. (line 2376)
-* BFD_RELOC_8_BASEREL: howto manager. (line 103)
-* BFD_RELOC_8_FFnn: howto manager. (line 107)
-* BFD_RELOC_8_GOT_PCREL: howto manager. (line 53)
-* BFD_RELOC_8_GOTOFF: howto manager. (line 59)
-* BFD_RELOC_8_PCREL: howto manager. (line 40)
-* BFD_RELOC_8_PLT_PCREL: howto manager. (line 64)
-* BFD_RELOC_8_PLTOFF: howto manager. (line 71)
-* BFD_RELOC_AARCH64_16: howto manager. (line 2755)
-* BFD_RELOC_AARCH64_16_PCREL: howto manager. (line 2762)
-* BFD_RELOC_AARCH64_32: howto manager. (line 2754)
-* BFD_RELOC_AARCH64_32_PCREL: howto manager. (line 2761)
-* BFD_RELOC_AARCH64_64: howto manager. (line 2753)
-* BFD_RELOC_AARCH64_64_PCREL: howto manager. (line 2760)
-* BFD_RELOC_AARCH64_ADD_LO12: howto manager. (line 2827)
-* BFD_RELOC_AARCH64_ADR_GOT_PAGE: howto manager. (line 2884)
-* BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL: howto manager. (line 2822)
-* BFD_RELOC_AARCH64_ADR_HI21_PCREL: howto manager. (line 2818)
-* BFD_RELOC_AARCH64_ADR_LO21_PCREL: howto manager. (line 2814)
-* BFD_RELOC_AARCH64_BRANCH19: howto manager. (line 2842)
-* BFD_RELOC_AARCH64_CALL26: howto manager. (line 2852)
-* BFD_RELOC_AARCH64_COPY: howto manager. (line 2985)
-* BFD_RELOC_AARCH64_GAS_INTERNAL_FIXUP: howto manager. (line 3019)
-* BFD_RELOC_AARCH64_GLOB_DAT: howto manager. (line 2988)
-* BFD_RELOC_AARCH64_GOT_LD_PREL19: howto manager. (line 2877)
-* BFD_RELOC_AARCH64_IRELATIVE: howto manager. (line 3009)
-* BFD_RELOC_AARCH64_JUMP26: howto manager. (line 2847)
-* BFD_RELOC_AARCH64_JUMP_SLOT: howto manager. (line 2991)
-* BFD_RELOC_AARCH64_LD32_GOT_LO12_NC: howto manager. (line 2894)
-* BFD_RELOC_AARCH64_LD64_GOT_LO12_NC: howto manager. (line 2889)
-* BFD_RELOC_AARCH64_LD_GOT_LO12_NC: howto manager. (line 3028)
-* BFD_RELOC_AARCH64_LD_LO19_PCREL: howto manager. (line 2809)
-* BFD_RELOC_AARCH64_LDST128_LO12: howto manager. (line 2872)
-* BFD_RELOC_AARCH64_LDST16_LO12: howto manager. (line 2857)
-* BFD_RELOC_AARCH64_LDST32_LO12: howto manager. (line 2862)
-* BFD_RELOC_AARCH64_LDST64_LO12: howto manager. (line 2867)
-* BFD_RELOC_AARCH64_LDST8_LO12: howto manager. (line 2832)
-* BFD_RELOC_AARCH64_LDST_LO12: howto manager. (line 3023)
-* BFD_RELOC_AARCH64_MOVW_G0: howto manager. (line 2766)
-* BFD_RELOC_AARCH64_MOVW_G0_NC: howto manager. (line 2770)
-* BFD_RELOC_AARCH64_MOVW_G0_S: howto manager. (line 2794)
-* BFD_RELOC_AARCH64_MOVW_G1: howto manager. (line 2774)
-* BFD_RELOC_AARCH64_MOVW_G1_NC: howto manager. (line 2778)
-* BFD_RELOC_AARCH64_MOVW_G1_S: howto manager. (line 2799)
-* BFD_RELOC_AARCH64_MOVW_G2: howto manager. (line 2782)
-* BFD_RELOC_AARCH64_MOVW_G2_NC: howto manager. (line 2786)
-* BFD_RELOC_AARCH64_MOVW_G2_S: howto manager. (line 2804)
-* BFD_RELOC_AARCH64_MOVW_G3: howto manager. (line 2790)
-* BFD_RELOC_AARCH64_NONE: howto manager. (line 2750)
-* BFD_RELOC_AARCH64_RELATIVE: howto manager. (line 2994)
-* BFD_RELOC_AARCH64_RELOC_END: howto manager. (line 3012)
-* BFD_RELOC_AARCH64_RELOC_START: howto manager. (line 2744)
-* BFD_RELOC_AARCH64_TLS_DTPMOD: howto manager. (line 2997)
-* BFD_RELOC_AARCH64_TLS_DTPREL: howto manager. (line 3000)
-* BFD_RELOC_AARCH64_TLS_TPREL: howto manager. (line 3003)
-* BFD_RELOC_AARCH64_TLSDESC: howto manager. (line 3006)
-* BFD_RELOC_AARCH64_TLSDESC_ADD: howto manager. (line 2979)
-* BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC: howto manager. (line 2967)
-* BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21: howto manager. (line 2958)
-* BFD_RELOC_AARCH64_TLSDESC_ADR_PREL21: howto manager. (line 2955)
-* BFD_RELOC_AARCH64_TLSDESC_CALL: howto manager. (line 2982)
-* BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC: howto manager. (line 2964)
-* BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC: howto manager. (line 2961)
-* BFD_RELOC_AARCH64_TLSDESC_LD_LO12_NC: howto manager. (line 3036)
-* BFD_RELOC_AARCH64_TLSDESC_LD_PREL19: howto manager. (line 2952)
-* BFD_RELOC_AARCH64_TLSDESC_LDR: howto manager. (line 2976)
-* BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC: howto manager. (line 2973)
-* BFD_RELOC_AARCH64_TLSDESC_OFF_G1: howto manager. (line 2970)
-* BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC: howto manager. (line 2905)
-* BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21: howto manager. (line 2899)
-* BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21: howto manager.
- (line 2916)
-* BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC: howto manager.
- (line 2922)
-* BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC: howto manager.
- (line 2919)
-* BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_LO12_NC: howto manager.
- (line 3032)
-* BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19: howto manager. (line 2925)
-* BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC: howto manager.
- (line 2913)
-* BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G1: howto manager. (line 2910)
-* BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12: howto manager. (line 2943)
-* BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12: howto manager. (line 2946)
-* BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC: howto manager. (line 2949)
-* BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0: howto manager. (line 2937)
-* BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC: howto manager. (line 2940)
-* BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1: howto manager. (line 2931)
-* BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC: howto manager. (line 2934)
-* BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2: howto manager. (line 2928)
-* BFD_RELOC_AARCH64_TSTBR14: howto manager. (line 2837)
-* BFD_RELOC_ALPHA_BOH: howto manager. (line 323)
-* BFD_RELOC_ALPHA_BRSGP: howto manager. (line 306)
-* BFD_RELOC_ALPHA_BSR: howto manager. (line 315)
-* BFD_RELOC_ALPHA_CODEADDR: howto manager. (line 297)
-* BFD_RELOC_ALPHA_DTPMOD64: howto manager. (line 329)
-* BFD_RELOC_ALPHA_DTPREL16: howto manager. (line 334)
-* BFD_RELOC_ALPHA_DTPREL64: howto manager. (line 331)
-* BFD_RELOC_ALPHA_DTPREL_HI16: howto manager. (line 332)
-* BFD_RELOC_ALPHA_DTPREL_LO16: howto manager. (line 333)
-* BFD_RELOC_ALPHA_ELF_LITERAL: howto manager. (line 262)
-* BFD_RELOC_ALPHA_GOTDTPREL16: howto manager. (line 330)
-* BFD_RELOC_ALPHA_GOTTPREL16: howto manager. (line 335)
-* BFD_RELOC_ALPHA_GPDISP: howto manager. (line 256)
-* BFD_RELOC_ALPHA_GPDISP_HI16: howto manager. (line 242)
-* BFD_RELOC_ALPHA_GPDISP_LO16: howto manager. (line 250)
-* BFD_RELOC_ALPHA_GPREL_HI16: howto manager. (line 301)
-* BFD_RELOC_ALPHA_GPREL_LO16: howto manager. (line 302)
-* BFD_RELOC_ALPHA_HINT: howto manager. (line 288)
-* BFD_RELOC_ALPHA_LDA: howto manager. (line 319)
-* BFD_RELOC_ALPHA_LINKAGE: howto manager. (line 293)
-* BFD_RELOC_ALPHA_LITERAL: howto manager. (line 261)
-* BFD_RELOC_ALPHA_LITUSE: howto manager. (line 263)
-* BFD_RELOC_ALPHA_NOP: howto manager. (line 311)
-* BFD_RELOC_ALPHA_TLSGD: howto manager. (line 327)
-* BFD_RELOC_ALPHA_TLSLDM: howto manager. (line 328)
-* BFD_RELOC_ALPHA_TPREL16: howto manager. (line 339)
-* BFD_RELOC_ALPHA_TPREL64: howto manager. (line 336)
-* BFD_RELOC_ALPHA_TPREL_HI16: howto manager. (line 337)
-* BFD_RELOC_ALPHA_TPREL_LO16: howto manager. (line 338)
-* BFD_RELOC_ARC_B22_PCREL: howto manager. (line 1049)
-* BFD_RELOC_ARC_B26: howto manager. (line 1054)
-* BFD_RELOC_ARM_ADR_IMM: howto manager. (line 935)
-* BFD_RELOC_ARM_ADRL_IMMEDIATE: howto manager. (line 921)
-* BFD_RELOC_ARM_ALU_PC_G0: howto manager. (line 885)
-* BFD_RELOC_ARM_ALU_PC_G0_NC: howto manager. (line 884)
-* BFD_RELOC_ARM_ALU_PC_G1: howto manager. (line 887)
-* BFD_RELOC_ARM_ALU_PC_G1_NC: howto manager. (line 886)
-* BFD_RELOC_ARM_ALU_PC_G2: howto manager. (line 888)
-* BFD_RELOC_ARM_ALU_SB_G0: howto manager. (line 899)
-* BFD_RELOC_ARM_ALU_SB_G0_NC: howto manager. (line 898)
-* BFD_RELOC_ARM_ALU_SB_G1: howto manager. (line 901)
-* BFD_RELOC_ARM_ALU_SB_G1_NC: howto manager. (line 900)
-* BFD_RELOC_ARM_ALU_SB_G2: howto manager. (line 902)
-* BFD_RELOC_ARM_CP_OFF_IMM: howto manager. (line 931)
-* BFD_RELOC_ARM_CP_OFF_IMM_S2: howto manager. (line 932)
-* BFD_RELOC_ARM_GLOB_DAT: howto manager. (line 859)
-* BFD_RELOC_ARM_GOT32: howto manager. (line 860)
-* BFD_RELOC_ARM_GOT_PREL: howto manager. (line 865)
-* BFD_RELOC_ARM_GOTOFF: howto manager. (line 863)
-* BFD_RELOC_ARM_GOTPC: howto manager. (line 864)
-* BFD_RELOC_ARM_HVC: howto manager. (line 928)
-* BFD_RELOC_ARM_HWLITERAL: howto manager. (line 942)
-* BFD_RELOC_ARM_IMMEDIATE: howto manager. (line 920)
-* BFD_RELOC_ARM_IN_POOL: howto manager. (line 938)
-* BFD_RELOC_ARM_IRELATIVE: howto manager. (line 917)
-* BFD_RELOC_ARM_JUMP_SLOT: howto manager. (line 858)
-* BFD_RELOC_ARM_LDC_PC_G0: howto manager. (line 895)
-* BFD_RELOC_ARM_LDC_PC_G1: howto manager. (line 896)
-* BFD_RELOC_ARM_LDC_PC_G2: howto manager. (line 897)
-* BFD_RELOC_ARM_LDC_SB_G0: howto manager. (line 909)
-* BFD_RELOC_ARM_LDC_SB_G1: howto manager. (line 910)
-* BFD_RELOC_ARM_LDC_SB_G2: howto manager. (line 911)
-* BFD_RELOC_ARM_LDR_IMM: howto manager. (line 936)
-* BFD_RELOC_ARM_LDR_PC_G0: howto manager. (line 889)
-* BFD_RELOC_ARM_LDR_PC_G1: howto manager. (line 890)
-* BFD_RELOC_ARM_LDR_PC_G2: howto manager. (line 891)
-* BFD_RELOC_ARM_LDR_SB_G0: howto manager. (line 903)
-* BFD_RELOC_ARM_LDR_SB_G1: howto manager. (line 904)
-* BFD_RELOC_ARM_LDR_SB_G2: howto manager. (line 905)
-* BFD_RELOC_ARM_LDRS_PC_G0: howto manager. (line 892)
-* BFD_RELOC_ARM_LDRS_PC_G1: howto manager. (line 893)
-* BFD_RELOC_ARM_LDRS_PC_G2: howto manager. (line 894)
-* BFD_RELOC_ARM_LDRS_SB_G0: howto manager. (line 906)
-* BFD_RELOC_ARM_LDRS_SB_G1: howto manager. (line 907)
-* BFD_RELOC_ARM_LDRS_SB_G2: howto manager. (line 908)
-* BFD_RELOC_ARM_LITERAL: howto manager. (line 937)
-* BFD_RELOC_ARM_MOVT: howto manager. (line 849)
-* BFD_RELOC_ARM_MOVT_PCREL: howto manager. (line 851)
-* BFD_RELOC_ARM_MOVW: howto manager. (line 848)
-* BFD_RELOC_ARM_MOVW_PCREL: howto manager. (line 850)
-* BFD_RELOC_ARM_MULTI: howto manager. (line 930)
-* BFD_RELOC_ARM_OFFSET_IMM: howto manager. (line 822)
-* BFD_RELOC_ARM_OFFSET_IMM8: howto manager. (line 939)
-* BFD_RELOC_ARM_PCREL_BLX: howto manager. (line 793)
-* BFD_RELOC_ARM_PCREL_BRANCH: howto manager. (line 789)
-* BFD_RELOC_ARM_PCREL_CALL: howto manager. (line 803)
-* BFD_RELOC_ARM_PCREL_JUMP: howto manager. (line 807)
-* BFD_RELOC_ARM_PLT32: howto manager. (line 861)
-* BFD_RELOC_ARM_PREL31: howto manager. (line 845)
-* BFD_RELOC_ARM_RELATIVE: howto manager. (line 862)
-* BFD_RELOC_ARM_ROSEGREL32: howto manager. (line 834)
-* BFD_RELOC_ARM_SBREL32: howto manager. (line 837)
-* BFD_RELOC_ARM_SHIFT_IMM: howto manager. (line 926)
-* BFD_RELOC_ARM_SMC: howto manager. (line 927)
-* BFD_RELOC_ARM_SWI: howto manager. (line 929)
-* BFD_RELOC_ARM_T32_ADD_IMM: howto manager. (line 923)
-* BFD_RELOC_ARM_T32_ADD_PC12: howto manager. (line 925)
-* BFD_RELOC_ARM_T32_CP_OFF_IMM: howto manager. (line 933)
-* BFD_RELOC_ARM_T32_CP_OFF_IMM_S2: howto manager. (line 934)
-* BFD_RELOC_ARM_T32_IMM12: howto manager. (line 924)
-* BFD_RELOC_ARM_T32_IMMEDIATE: howto manager. (line 922)
-* BFD_RELOC_ARM_T32_OFFSET_IMM: howto manager. (line 941)
-* BFD_RELOC_ARM_T32_OFFSET_U8: howto manager. (line 940)
-* BFD_RELOC_ARM_TARGET1: howto manager. (line 830)
-* BFD_RELOC_ARM_TARGET2: howto manager. (line 840)
-* BFD_RELOC_ARM_THM_TLS_CALL: howto manager. (line 878)
-* BFD_RELOC_ARM_THM_TLS_DESCSEQ: howto manager. (line 880)
-* BFD_RELOC_ARM_THUMB_ADD: howto manager. (line 943)
-* BFD_RELOC_ARM_THUMB_IMM: howto manager. (line 944)
-* BFD_RELOC_ARM_THUMB_MOVT: howto manager. (line 853)
-* BFD_RELOC_ARM_THUMB_MOVT_PCREL: howto manager. (line 855)
-* BFD_RELOC_ARM_THUMB_MOVW: howto manager. (line 852)
-* BFD_RELOC_ARM_THUMB_MOVW_PCREL: howto manager. (line 854)
-* BFD_RELOC_ARM_THUMB_OFFSET: howto manager. (line 826)
-* BFD_RELOC_ARM_THUMB_SHIFT: howto manager. (line 945)
-* BFD_RELOC_ARM_TLS_CALL: howto manager. (line 877)
-* BFD_RELOC_ARM_TLS_DESC: howto manager. (line 881)
-* BFD_RELOC_ARM_TLS_DESCSEQ: howto manager. (line 879)
-* BFD_RELOC_ARM_TLS_DTPMOD32: howto manager. (line 872)
-* BFD_RELOC_ARM_TLS_DTPOFF32: howto manager. (line 871)
-* BFD_RELOC_ARM_TLS_GD32: howto manager. (line 868)
-* BFD_RELOC_ARM_TLS_GOTDESC: howto manager. (line 876)
-* BFD_RELOC_ARM_TLS_IE32: howto manager. (line 874)
-* BFD_RELOC_ARM_TLS_LDM32: howto manager. (line 870)
-* BFD_RELOC_ARM_TLS_LDO32: howto manager. (line 869)
-* BFD_RELOC_ARM_TLS_LE32: howto manager. (line 875)
-* BFD_RELOC_ARM_TLS_TPOFF32: howto manager. (line 873)
-* BFD_RELOC_ARM_V4BX: howto manager. (line 914)
-* BFD_RELOC_AVR_13_PCREL: howto manager. (line 1644)
-* BFD_RELOC_AVR_16_PM: howto manager. (line 1648)
-* BFD_RELOC_AVR_6: howto manager. (line 1735)
-* BFD_RELOC_AVR_6_ADIW: howto manager. (line 1739)
-* BFD_RELOC_AVR_7_PCREL: howto manager. (line 1640)
-* BFD_RELOC_AVR_8_HI: howto manager. (line 1747)
-* BFD_RELOC_AVR_8_HLO: howto manager. (line 1751)
-* BFD_RELOC_AVR_8_LO: howto manager. (line 1743)
-* BFD_RELOC_AVR_CALL: howto manager. (line 1727)
-* BFD_RELOC_AVR_HH8_LDI: howto manager. (line 1660)
-* BFD_RELOC_AVR_HH8_LDI_NEG: howto manager. (line 1679)
-* BFD_RELOC_AVR_HH8_LDI_PM: howto manager. (line 1708)
-* BFD_RELOC_AVR_HH8_LDI_PM_NEG: howto manager. (line 1722)
-* BFD_RELOC_AVR_HI8_LDI: howto manager. (line 1656)
-* BFD_RELOC_AVR_HI8_LDI_GS: howto manager. (line 1702)
-* BFD_RELOC_AVR_HI8_LDI_NEG: howto manager. (line 1674)
-* BFD_RELOC_AVR_HI8_LDI_PM: howto manager. (line 1698)
-* BFD_RELOC_AVR_HI8_LDI_PM_NEG: howto manager. (line 1717)
-* BFD_RELOC_AVR_LDI: howto manager. (line 1731)
-* BFD_RELOC_AVR_LO8_LDI: howto manager. (line 1652)
-* BFD_RELOC_AVR_LO8_LDI_GS: howto manager. (line 1692)
-* BFD_RELOC_AVR_LO8_LDI_NEG: howto manager. (line 1669)
-* BFD_RELOC_AVR_LO8_LDI_PM: howto manager. (line 1688)
-* BFD_RELOC_AVR_LO8_LDI_PM_NEG: howto manager. (line 1713)
-* BFD_RELOC_AVR_MS8_LDI: howto manager. (line 1665)
-* BFD_RELOC_AVR_MS8_LDI_NEG: howto manager. (line 1684)
-* BFD_RELOC_BFIN_10_PCREL: howto manager. (line 1074)
-* BFD_RELOC_BFIN_11_PCREL: howto manager. (line 1077)
-* BFD_RELOC_BFIN_12_PCREL_JUMP: howto manager. (line 1080)
-* BFD_RELOC_BFIN_12_PCREL_JUMP_S: howto manager. (line 1083)
-* BFD_RELOC_BFIN_16_HIGH: howto manager. (line 1062)
-* BFD_RELOC_BFIN_16_IMM: howto manager. (line 1059)
-* BFD_RELOC_BFIN_16_LOW: howto manager. (line 1071)
-* BFD_RELOC_BFIN_24_PCREL_CALL_X: howto manager. (line 1086)
-* BFD_RELOC_BFIN_24_PCREL_JUMP_L: howto manager. (line 1089)
-* BFD_RELOC_BFIN_4_PCREL: howto manager. (line 1065)
-* BFD_RELOC_BFIN_5_PCREL: howto manager. (line 1068)
-* BFD_RELOC_BFIN_FUNCDESC: howto manager. (line 1095)
-* BFD_RELOC_BFIN_FUNCDESC_GOT17M4: howto manager. (line 1096)
-* BFD_RELOC_BFIN_FUNCDESC_GOTHI: howto manager. (line 1097)
-* BFD_RELOC_BFIN_FUNCDESC_GOTLO: howto manager. (line 1098)
-* BFD_RELOC_BFIN_FUNCDESC_GOTOFF17M4: howto manager. (line 1100)
-* BFD_RELOC_BFIN_FUNCDESC_GOTOFFHI: howto manager. (line 1101)
-* BFD_RELOC_BFIN_FUNCDESC_GOTOFFLO: howto manager. (line 1102)
-* BFD_RELOC_BFIN_FUNCDESC_VALUE: howto manager. (line 1099)
-* BFD_RELOC_BFIN_GOT: howto manager. (line 1108)
-* BFD_RELOC_BFIN_GOT17M4: howto manager. (line 1092)
-* BFD_RELOC_BFIN_GOTHI: howto manager. (line 1093)
-* BFD_RELOC_BFIN_GOTLO: howto manager. (line 1094)
-* BFD_RELOC_BFIN_GOTOFF17M4: howto manager. (line 1103)
-* BFD_RELOC_BFIN_GOTOFFHI: howto manager. (line 1104)
-* BFD_RELOC_BFIN_GOTOFFLO: howto manager. (line 1105)
-* BFD_RELOC_BFIN_PLTPC: howto manager. (line 1111)
-* BFD_RELOC_C6000_ABS_H16: howto manager. (line 1463)
-* BFD_RELOC_C6000_ABS_L16: howto manager. (line 1462)
-* BFD_RELOC_C6000_ABS_S16: howto manager. (line 1461)
-* BFD_RELOC_C6000_ALIGN: howto manager. (line 1484)
-* BFD_RELOC_C6000_COPY: howto manager. (line 1479)
-* BFD_RELOC_C6000_DSBT_INDEX: howto manager. (line 1477)
-* BFD_RELOC_C6000_EHTYPE: howto manager. (line 1481)
-* BFD_RELOC_C6000_FPHEAD: howto manager. (line 1485)
-* BFD_RELOC_C6000_JUMP_SLOT: howto manager. (line 1480)
-* BFD_RELOC_C6000_NOCMP: howto manager. (line 1486)
-* BFD_RELOC_C6000_PCR_H16: howto manager. (line 1482)
-* BFD_RELOC_C6000_PCR_L16: howto manager. (line 1483)
-* BFD_RELOC_C6000_PCR_S10: howto manager. (line 1459)
-* BFD_RELOC_C6000_PCR_S12: howto manager. (line 1458)
-* BFD_RELOC_C6000_PCR_S21: howto manager. (line 1457)
-* BFD_RELOC_C6000_PCR_S7: howto manager. (line 1460)
-* BFD_RELOC_C6000_PREL31: howto manager. (line 1478)
-* BFD_RELOC_C6000_SBR_GOT_H16_W: howto manager. (line 1476)
-* BFD_RELOC_C6000_SBR_GOT_L16_W: howto manager. (line 1475)
-* BFD_RELOC_C6000_SBR_GOT_U15_W: howto manager. (line 1474)
-* BFD_RELOC_C6000_SBR_H16_B: howto manager. (line 1471)
-* BFD_RELOC_C6000_SBR_H16_H: howto manager. (line 1472)
-* BFD_RELOC_C6000_SBR_H16_W: howto manager. (line 1473)
-* BFD_RELOC_C6000_SBR_L16_B: howto manager. (line 1468)
-* BFD_RELOC_C6000_SBR_L16_H: howto manager. (line 1469)
-* BFD_RELOC_C6000_SBR_L16_W: howto manager. (line 1470)
-* BFD_RELOC_C6000_SBR_S16: howto manager. (line 1467)
-* BFD_RELOC_C6000_SBR_U15_B: howto manager. (line 1464)
-* BFD_RELOC_C6000_SBR_U15_H: howto manager. (line 1465)
-* BFD_RELOC_C6000_SBR_U15_W: howto manager. (line 1466)
-* bfd_reloc_code_type: howto manager. (line 10)
-* BFD_RELOC_CR16_ABS20: howto manager. (line 2264)
-* BFD_RELOC_CR16_ABS24: howto manager. (line 2265)
-* BFD_RELOC_CR16_DISP16: howto manager. (line 2275)
-* BFD_RELOC_CR16_DISP20: howto manager. (line 2276)
-* BFD_RELOC_CR16_DISP24: howto manager. (line 2277)
-* BFD_RELOC_CR16_DISP24a: howto manager. (line 2278)
-* BFD_RELOC_CR16_DISP4: howto manager. (line 2273)
-* BFD_RELOC_CR16_DISP8: howto manager. (line 2274)
-* BFD_RELOC_CR16_GLOB_DAT: howto manager. (line 2284)
-* BFD_RELOC_CR16_GOT_REGREL20: howto manager. (line 2282)
-* BFD_RELOC_CR16_GOTC_REGREL20: howto manager. (line 2283)
-* BFD_RELOC_CR16_IMM16: howto manager. (line 2268)
-* BFD_RELOC_CR16_IMM20: howto manager. (line 2269)
-* BFD_RELOC_CR16_IMM24: howto manager. (line 2270)
-* BFD_RELOC_CR16_IMM32: howto manager. (line 2271)
-* BFD_RELOC_CR16_IMM32a: howto manager. (line 2272)
-* BFD_RELOC_CR16_IMM4: howto manager. (line 2266)
-* BFD_RELOC_CR16_IMM8: howto manager. (line 2267)
-* BFD_RELOC_CR16_NUM16: howto manager. (line 2253)
-* BFD_RELOC_CR16_NUM32: howto manager. (line 2254)
-* BFD_RELOC_CR16_NUM32a: howto manager. (line 2255)
-* BFD_RELOC_CR16_NUM8: howto manager. (line 2252)
-* BFD_RELOC_CR16_REGREL0: howto manager. (line 2256)
-* BFD_RELOC_CR16_REGREL14: howto manager. (line 2259)
-* BFD_RELOC_CR16_REGREL14a: howto manager. (line 2260)
-* BFD_RELOC_CR16_REGREL16: howto manager. (line 2261)
-* BFD_RELOC_CR16_REGREL20: howto manager. (line 2262)
-* BFD_RELOC_CR16_REGREL20a: howto manager. (line 2263)
-* BFD_RELOC_CR16_REGREL4: howto manager. (line 2257)
-* BFD_RELOC_CR16_REGREL4a: howto manager. (line 2258)
-* BFD_RELOC_CR16_SWITCH16: howto manager. (line 2280)
-* BFD_RELOC_CR16_SWITCH32: howto manager. (line 2281)
-* BFD_RELOC_CR16_SWITCH8: howto manager. (line 2279)
-* BFD_RELOC_CRIS_16_DTPREL: howto manager. (line 2355)
-* BFD_RELOC_CRIS_16_GOT: howto manager. (line 2331)
-* BFD_RELOC_CRIS_16_GOT_GD: howto manager. (line 2351)
-* BFD_RELOC_CRIS_16_GOT_TPREL: howto manager. (line 2357)
-* BFD_RELOC_CRIS_16_GOTPLT: howto manager. (line 2337)
-* BFD_RELOC_CRIS_16_TPREL: howto manager. (line 2359)
-* BFD_RELOC_CRIS_32_DTPREL: howto manager. (line 2354)
-* BFD_RELOC_CRIS_32_GD: howto manager. (line 2352)
-* BFD_RELOC_CRIS_32_GOT: howto manager. (line 2328)
-* BFD_RELOC_CRIS_32_GOT_GD: howto manager. (line 2350)
-* BFD_RELOC_CRIS_32_GOT_TPREL: howto manager. (line 2356)
-* BFD_RELOC_CRIS_32_GOTPLT: howto manager. (line 2334)
-* BFD_RELOC_CRIS_32_GOTREL: howto manager. (line 2340)
-* BFD_RELOC_CRIS_32_IE: howto manager. (line 2361)
-* BFD_RELOC_CRIS_32_PLT_GOTREL: howto manager. (line 2343)
-* BFD_RELOC_CRIS_32_PLT_PCREL: howto manager. (line 2346)
-* BFD_RELOC_CRIS_32_TPREL: howto manager. (line 2358)
-* BFD_RELOC_CRIS_BDISP8: howto manager. (line 2309)
-* BFD_RELOC_CRIS_COPY: howto manager. (line 2322)
-* BFD_RELOC_CRIS_DTP: howto manager. (line 2353)
-* BFD_RELOC_CRIS_DTPMOD: howto manager. (line 2360)
-* BFD_RELOC_CRIS_GLOB_DAT: howto manager. (line 2323)
-* BFD_RELOC_CRIS_JUMP_SLOT: howto manager. (line 2324)
-* BFD_RELOC_CRIS_LAPCQ_OFFSET: howto manager. (line 2317)
-* BFD_RELOC_CRIS_RELATIVE: howto manager. (line 2325)
-* BFD_RELOC_CRIS_SIGNED_16: howto manager. (line 2315)
-* BFD_RELOC_CRIS_SIGNED_6: howto manager. (line 2311)
-* BFD_RELOC_CRIS_SIGNED_8: howto manager. (line 2313)
-* BFD_RELOC_CRIS_UNSIGNED_16: howto manager. (line 2316)
-* BFD_RELOC_CRIS_UNSIGNED_4: howto manager. (line 2318)
-* BFD_RELOC_CRIS_UNSIGNED_5: howto manager. (line 2310)
-* BFD_RELOC_CRIS_UNSIGNED_6: howto manager. (line 2312)
-* BFD_RELOC_CRIS_UNSIGNED_8: howto manager. (line 2314)
-* BFD_RELOC_CRX_ABS16: howto manager. (line 2297)
-* BFD_RELOC_CRX_ABS32: howto manager. (line 2298)
-* BFD_RELOC_CRX_IMM16: howto manager. (line 2302)
-* BFD_RELOC_CRX_IMM32: howto manager. (line 2303)
-* BFD_RELOC_CRX_NUM16: howto manager. (line 2300)
-* BFD_RELOC_CRX_NUM32: howto manager. (line 2301)
-* BFD_RELOC_CRX_NUM8: howto manager. (line 2299)
-* BFD_RELOC_CRX_REGREL12: howto manager. (line 2293)
-* BFD_RELOC_CRX_REGREL22: howto manager. (line 2294)
-* BFD_RELOC_CRX_REGREL28: howto manager. (line 2295)
-* BFD_RELOC_CRX_REGREL32: howto manager. (line 2296)
-* BFD_RELOC_CRX_REL16: howto manager. (line 2290)
-* BFD_RELOC_CRX_REL24: howto manager. (line 2291)
-* BFD_RELOC_CRX_REL32: howto manager. (line 2292)
-* BFD_RELOC_CRX_REL4: howto manager. (line 2287)
-* BFD_RELOC_CRX_REL8: howto manager. (line 2288)
-* BFD_RELOC_CRX_REL8_CMP: howto manager. (line 2289)
-* BFD_RELOC_CRX_SWITCH16: howto manager. (line 2305)
-* BFD_RELOC_CRX_SWITCH32: howto manager. (line 2306)
-* BFD_RELOC_CRX_SWITCH8: howto manager. (line 2304)
-* BFD_RELOC_CTOR: howto manager. (line 783)
-* BFD_RELOC_D10V_10_PCREL_L: howto manager. (line 1178)
-* BFD_RELOC_D10V_10_PCREL_R: howto manager. (line 1174)
-* BFD_RELOC_D10V_18: howto manager. (line 1183)
-* BFD_RELOC_D10V_18_PCREL: howto manager. (line 1186)
-* BFD_RELOC_D30V_15: howto manager. (line 1201)
-* BFD_RELOC_D30V_15_PCREL: howto manager. (line 1205)
-* BFD_RELOC_D30V_15_PCREL_R: howto manager. (line 1209)
-* BFD_RELOC_D30V_21: howto manager. (line 1214)
-* BFD_RELOC_D30V_21_PCREL: howto manager. (line 1218)
-* BFD_RELOC_D30V_21_PCREL_R: howto manager. (line 1222)
-* BFD_RELOC_D30V_32: howto manager. (line 1227)
-* BFD_RELOC_D30V_32_PCREL: howto manager. (line 1230)
-* BFD_RELOC_D30V_6: howto manager. (line 1189)
-* BFD_RELOC_D30V_9_PCREL: howto manager. (line 1192)
-* BFD_RELOC_D30V_9_PCREL_R: howto manager. (line 1196)
-* BFD_RELOC_DLX_HI16_S: howto manager. (line 1233)
-* BFD_RELOC_DLX_JMP26: howto manager. (line 1239)
-* BFD_RELOC_DLX_LO16: howto manager. (line 1236)
-* BFD_RELOC_EPIPHANY_HIGH: howto manager. (line 3238)
-* BFD_RELOC_EPIPHANY_IMM11: howto manager. (line 3247)
-* BFD_RELOC_EPIPHANY_IMM8: howto manager. (line 3251)
-* BFD_RELOC_EPIPHANY_LOW: howto manager. (line 3241)
-* BFD_RELOC_EPIPHANY_SIMM11: howto manager. (line 3244)
-* BFD_RELOC_EPIPHANY_SIMM24: howto manager. (line 3235)
-* BFD_RELOC_EPIPHANY_SIMM8: howto manager. (line 3232)
-* BFD_RELOC_FR30_10_IN_8: howto manager. (line 1508)
-* BFD_RELOC_FR30_12_PCREL: howto manager. (line 1516)
-* BFD_RELOC_FR30_20: howto manager. (line 1492)
-* BFD_RELOC_FR30_48: howto manager. (line 1489)
-* BFD_RELOC_FR30_6_IN_4: howto manager. (line 1496)
-* BFD_RELOC_FR30_8_IN_8: howto manager. (line 1500)
-* BFD_RELOC_FR30_9_IN_8: howto manager. (line 1504)
-* BFD_RELOC_FR30_9_PCREL: howto manager. (line 1512)
-* BFD_RELOC_FRV_FUNCDESC: howto manager. (line 491)
-* BFD_RELOC_FRV_FUNCDESC_GOT12: howto manager. (line 492)
-* BFD_RELOC_FRV_FUNCDESC_GOTHI: howto manager. (line 493)
-* BFD_RELOC_FRV_FUNCDESC_GOTLO: howto manager. (line 494)
-* BFD_RELOC_FRV_FUNCDESC_GOTOFF12: howto manager. (line 496)
-* BFD_RELOC_FRV_FUNCDESC_GOTOFFHI: howto manager. (line 497)
-* BFD_RELOC_FRV_FUNCDESC_GOTOFFLO: howto manager. (line 498)
-* BFD_RELOC_FRV_FUNCDESC_VALUE: howto manager. (line 495)
-* BFD_RELOC_FRV_GETTLSOFF: howto manager. (line 502)
-* BFD_RELOC_FRV_GETTLSOFF_RELAX: howto manager. (line 515)
-* BFD_RELOC_FRV_GOT12: howto manager. (line 488)
-* BFD_RELOC_FRV_GOTHI: howto manager. (line 489)
-* BFD_RELOC_FRV_GOTLO: howto manager. (line 490)
-* BFD_RELOC_FRV_GOTOFF12: howto manager. (line 499)
-* BFD_RELOC_FRV_GOTOFFHI: howto manager. (line 500)
-* BFD_RELOC_FRV_GOTOFFLO: howto manager. (line 501)
-* BFD_RELOC_FRV_GOTTLSDESC12: howto manager. (line 504)
-* BFD_RELOC_FRV_GOTTLSDESCHI: howto manager. (line 505)
-* BFD_RELOC_FRV_GOTTLSDESCLO: howto manager. (line 506)
-* BFD_RELOC_FRV_GOTTLSOFF12: howto manager. (line 510)
-* BFD_RELOC_FRV_GOTTLSOFFHI: howto manager. (line 511)
-* BFD_RELOC_FRV_GOTTLSOFFLO: howto manager. (line 512)
-* BFD_RELOC_FRV_GPREL12: howto manager. (line 483)
-* BFD_RELOC_FRV_GPREL32: howto manager. (line 485)
-* BFD_RELOC_FRV_GPRELHI: howto manager. (line 486)
-* BFD_RELOC_FRV_GPRELLO: howto manager. (line 487)
-* BFD_RELOC_FRV_GPRELU12: howto manager. (line 484)
-* BFD_RELOC_FRV_HI16: howto manager. (line 482)
-* BFD_RELOC_FRV_LABEL16: howto manager. (line 479)
-* BFD_RELOC_FRV_LABEL24: howto manager. (line 480)
-* BFD_RELOC_FRV_LO16: howto manager. (line 481)
-* BFD_RELOC_FRV_TLSDESC_RELAX: howto manager. (line 514)
-* BFD_RELOC_FRV_TLSDESC_VALUE: howto manager. (line 503)
-* BFD_RELOC_FRV_TLSMOFF: howto manager. (line 517)
-* BFD_RELOC_FRV_TLSMOFF12: howto manager. (line 507)
-* BFD_RELOC_FRV_TLSMOFFHI: howto manager. (line 508)
-* BFD_RELOC_FRV_TLSMOFFLO: howto manager. (line 509)
-* BFD_RELOC_FRV_TLSOFF: howto manager. (line 513)
-* BFD_RELOC_FRV_TLSOFF_RELAX: howto manager. (line 516)
-* BFD_RELOC_GPREL16: howto manager. (line 125)
-* BFD_RELOC_GPREL32: howto manager. (line 126)
-* BFD_RELOC_H8_DIR16A8: howto manager. (line 2402)
-* BFD_RELOC_H8_DIR16R8: howto manager. (line 2403)
-* BFD_RELOC_H8_DIR24A8: howto manager. (line 2404)
-* BFD_RELOC_H8_DIR24R8: howto manager. (line 2405)
-* BFD_RELOC_H8_DIR32A16: howto manager. (line 2406)
-* BFD_RELOC_H8_DISP32A16: howto manager. (line 2407)
-* BFD_RELOC_HI16: howto manager. (line 352)
-* BFD_RELOC_HI16_BASEREL: howto manager. (line 101)
-* BFD_RELOC_HI16_GOTOFF: howto manager. (line 57)
-* BFD_RELOC_HI16_PCREL: howto manager. (line 364)
-* BFD_RELOC_HI16_PLTOFF: howto manager. (line 69)
-* BFD_RELOC_HI16_S: howto manager. (line 355)
-* BFD_RELOC_HI16_S_BASEREL: howto manager. (line 102)
-* BFD_RELOC_HI16_S_GOTOFF: howto manager. (line 58)
-* BFD_RELOC_HI16_S_PCREL: howto manager. (line 367)
-* BFD_RELOC_HI16_S_PLTOFF: howto manager. (line 70)
-* BFD_RELOC_HI22: howto manager. (line 120)
-* BFD_RELOC_I370_D12: howto manager. (line 780)
-* BFD_RELOC_I960_CALLJ: howto manager. (line 132)
-* BFD_RELOC_IA64_COPY: howto manager. (line 2084)
-* BFD_RELOC_IA64_DIR32LSB: howto manager. (line 2029)
-* BFD_RELOC_IA64_DIR32MSB: howto manager. (line 2028)
-* BFD_RELOC_IA64_DIR64LSB: howto manager. (line 2031)
-* BFD_RELOC_IA64_DIR64MSB: howto manager. (line 2030)
-* BFD_RELOC_IA64_DTPMOD64LSB: howto manager. (line 2094)
-* BFD_RELOC_IA64_DTPMOD64MSB: howto manager. (line 2093)
-* BFD_RELOC_IA64_DTPREL14: howto manager. (line 2096)
-* BFD_RELOC_IA64_DTPREL22: howto manager. (line 2097)
-* BFD_RELOC_IA64_DTPREL32LSB: howto manager. (line 2100)
-* BFD_RELOC_IA64_DTPREL32MSB: howto manager. (line 2099)
-* BFD_RELOC_IA64_DTPREL64I: howto manager. (line 2098)
-* BFD_RELOC_IA64_DTPREL64LSB: howto manager. (line 2102)
-* BFD_RELOC_IA64_DTPREL64MSB: howto manager. (line 2101)
-* BFD_RELOC_IA64_FPTR32LSB: howto manager. (line 2046)
-* BFD_RELOC_IA64_FPTR32MSB: howto manager. (line 2045)
-* BFD_RELOC_IA64_FPTR64I: howto manager. (line 2044)
-* BFD_RELOC_IA64_FPTR64LSB: howto manager. (line 2048)
-* BFD_RELOC_IA64_FPTR64MSB: howto manager. (line 2047)
-* BFD_RELOC_IA64_GPREL22: howto manager. (line 2032)
-* BFD_RELOC_IA64_GPREL32LSB: howto manager. (line 2035)
-* BFD_RELOC_IA64_GPREL32MSB: howto manager. (line 2034)
-* BFD_RELOC_IA64_GPREL64I: howto manager. (line 2033)
-* BFD_RELOC_IA64_GPREL64LSB: howto manager. (line 2037)
-* BFD_RELOC_IA64_GPREL64MSB: howto manager. (line 2036)
-* BFD_RELOC_IA64_IMM14: howto manager. (line 2025)
-* BFD_RELOC_IA64_IMM22: howto manager. (line 2026)
-* BFD_RELOC_IA64_IMM64: howto manager. (line 2027)
-* BFD_RELOC_IA64_IPLTLSB: howto manager. (line 2083)
-* BFD_RELOC_IA64_IPLTMSB: howto manager. (line 2082)
-* BFD_RELOC_IA64_LDXMOV: howto manager. (line 2086)
-* BFD_RELOC_IA64_LTOFF22: howto manager. (line 2038)
-* BFD_RELOC_IA64_LTOFF22X: howto manager. (line 2085)
-* BFD_RELOC_IA64_LTOFF64I: howto manager. (line 2039)
-* BFD_RELOC_IA64_LTOFF_DTPMOD22: howto manager. (line 2095)
-* BFD_RELOC_IA64_LTOFF_DTPREL22: howto manager. (line 2103)
-* BFD_RELOC_IA64_LTOFF_FPTR22: howto manager. (line 2060)
-* BFD_RELOC_IA64_LTOFF_FPTR32LSB: howto manager. (line 2063)
-* BFD_RELOC_IA64_LTOFF_FPTR32MSB: howto manager. (line 2062)
-* BFD_RELOC_IA64_LTOFF_FPTR64I: howto manager. (line 2061)
-* BFD_RELOC_IA64_LTOFF_FPTR64LSB: howto manager. (line 2065)
-* BFD_RELOC_IA64_LTOFF_FPTR64MSB: howto manager. (line 2064)
-* BFD_RELOC_IA64_LTOFF_TPREL22: howto manager. (line 2092)
-* BFD_RELOC_IA64_LTV32LSB: howto manager. (line 2079)
-* BFD_RELOC_IA64_LTV32MSB: howto manager. (line 2078)
-* BFD_RELOC_IA64_LTV64LSB: howto manager. (line 2081)
-* BFD_RELOC_IA64_LTV64MSB: howto manager. (line 2080)
-* BFD_RELOC_IA64_PCREL21B: howto manager. (line 2049)
-* BFD_RELOC_IA64_PCREL21BI: howto manager. (line 2050)
-* BFD_RELOC_IA64_PCREL21F: howto manager. (line 2052)
-* BFD_RELOC_IA64_PCREL21M: howto manager. (line 2051)
-* BFD_RELOC_IA64_PCREL22: howto manager. (line 2053)
-* BFD_RELOC_IA64_PCREL32LSB: howto manager. (line 2057)
-* BFD_RELOC_IA64_PCREL32MSB: howto manager. (line 2056)
-* BFD_RELOC_IA64_PCREL60B: howto manager. (line 2054)
-* BFD_RELOC_IA64_PCREL64I: howto manager. (line 2055)
-* BFD_RELOC_IA64_PCREL64LSB: howto manager. (line 2059)
-* BFD_RELOC_IA64_PCREL64MSB: howto manager. (line 2058)
-* BFD_RELOC_IA64_PLTOFF22: howto manager. (line 2040)
-* BFD_RELOC_IA64_PLTOFF64I: howto manager. (line 2041)
-* BFD_RELOC_IA64_PLTOFF64LSB: howto manager. (line 2043)
-* BFD_RELOC_IA64_PLTOFF64MSB: howto manager. (line 2042)
-* BFD_RELOC_IA64_REL32LSB: howto manager. (line 2075)
-* BFD_RELOC_IA64_REL32MSB: howto manager. (line 2074)
-* BFD_RELOC_IA64_REL64LSB: howto manager. (line 2077)
-* BFD_RELOC_IA64_REL64MSB: howto manager. (line 2076)
-* BFD_RELOC_IA64_SECREL32LSB: howto manager. (line 2071)
-* BFD_RELOC_IA64_SECREL32MSB: howto manager. (line 2070)
-* BFD_RELOC_IA64_SECREL64LSB: howto manager. (line 2073)
-* BFD_RELOC_IA64_SECREL64MSB: howto manager. (line 2072)
-* BFD_RELOC_IA64_SEGREL32LSB: howto manager. (line 2067)
-* BFD_RELOC_IA64_SEGREL32MSB: howto manager. (line 2066)
-* BFD_RELOC_IA64_SEGREL64LSB: howto manager. (line 2069)
-* BFD_RELOC_IA64_SEGREL64MSB: howto manager. (line 2068)
-* BFD_RELOC_IA64_TPREL14: howto manager. (line 2087)
-* BFD_RELOC_IA64_TPREL22: howto manager. (line 2088)
-* BFD_RELOC_IA64_TPREL64I: howto manager. (line 2089)
-* BFD_RELOC_IA64_TPREL64LSB: howto manager. (line 2091)
-* BFD_RELOC_IA64_TPREL64MSB: howto manager. (line 2090)
-* BFD_RELOC_IP2K_ADDR16CJP: howto manager. (line 1977)
-* BFD_RELOC_IP2K_BANK: howto manager. (line 1974)
-* BFD_RELOC_IP2K_EX8DATA: howto manager. (line 1985)
-* BFD_RELOC_IP2K_FR9: howto manager. (line 1971)
-* BFD_RELOC_IP2K_FR_OFFSET: howto manager. (line 1998)
-* BFD_RELOC_IP2K_HI8DATA: howto manager. (line 1984)
-* BFD_RELOC_IP2K_HI8INSN: howto manager. (line 1989)
-* BFD_RELOC_IP2K_LO8DATA: howto manager. (line 1983)
-* BFD_RELOC_IP2K_LO8INSN: howto manager. (line 1988)
-* BFD_RELOC_IP2K_PAGE3: howto manager. (line 1980)
-* BFD_RELOC_IP2K_PC_SKIP: howto manager. (line 1992)
-* BFD_RELOC_IP2K_TEXT: howto manager. (line 1995)
-* BFD_RELOC_IQ2000_OFFSET_16: howto manager. (line 2508)
-* BFD_RELOC_IQ2000_OFFSET_21: howto manager. (line 2509)
-* BFD_RELOC_IQ2000_UHI16: howto manager. (line 2510)
-* BFD_RELOC_LM32_16_GOT: howto manager. (line 2615)
-* BFD_RELOC_LM32_BRANCH: howto manager. (line 2614)
-* BFD_RELOC_LM32_CALL: howto manager. (line 2613)
-* BFD_RELOC_LM32_COPY: howto manager. (line 2618)
-* BFD_RELOC_LM32_GLOB_DAT: howto manager. (line 2619)
-* BFD_RELOC_LM32_GOTOFF_HI16: howto manager. (line 2616)
-* BFD_RELOC_LM32_GOTOFF_LO16: howto manager. (line 2617)
-* BFD_RELOC_LM32_JMP_SLOT: howto manager. (line 2620)
-* BFD_RELOC_LM32_RELATIVE: howto manager. (line 2621)
-* BFD_RELOC_LO10: howto manager. (line 121)
-* BFD_RELOC_LO16: howto manager. (line 361)
-* BFD_RELOC_LO16_BASEREL: howto manager. (line 100)
-* BFD_RELOC_LO16_GOTOFF: howto manager. (line 56)
-* BFD_RELOC_LO16_PCREL: howto manager. (line 370)
-* BFD_RELOC_LO16_PLTOFF: howto manager. (line 68)
-* BFD_RELOC_M32C_HI8: howto manager. (line 1242)
-* BFD_RELOC_M32C_RL_1ADDR: howto manager. (line 1244)
-* BFD_RELOC_M32C_RL_2ADDR: howto manager. (line 1245)
-* BFD_RELOC_M32C_RL_JUMP: howto manager. (line 1243)
-* BFD_RELOC_M32R_10_PCREL: howto manager. (line 1252)
-* BFD_RELOC_M32R_18_PCREL: howto manager. (line 1256)
-* BFD_RELOC_M32R_24: howto manager. (line 1248)
-* BFD_RELOC_M32R_26_PCREL: howto manager. (line 1259)
-* BFD_RELOC_M32R_26_PLTREL: howto manager. (line 1278)
-* BFD_RELOC_M32R_COPY: howto manager. (line 1279)
-* BFD_RELOC_M32R_GLOB_DAT: howto manager. (line 1280)
-* BFD_RELOC_M32R_GOT16_HI_SLO: howto manager. (line 1289)
-* BFD_RELOC_M32R_GOT16_HI_ULO: howto manager. (line 1288)
-* BFD_RELOC_M32R_GOT16_LO: howto manager. (line 1290)
-* BFD_RELOC_M32R_GOT24: howto manager. (line 1277)
-* BFD_RELOC_M32R_GOTOFF: howto manager. (line 1283)
-* BFD_RELOC_M32R_GOTOFF_HI_SLO: howto manager. (line 1285)
-* BFD_RELOC_M32R_GOTOFF_HI_ULO: howto manager. (line 1284)
-* BFD_RELOC_M32R_GOTOFF_LO: howto manager. (line 1286)
-* BFD_RELOC_M32R_GOTPC24: howto manager. (line 1287)
-* BFD_RELOC_M32R_GOTPC_HI_SLO: howto manager. (line 1292)
-* BFD_RELOC_M32R_GOTPC_HI_ULO: howto manager. (line 1291)
-* BFD_RELOC_M32R_GOTPC_LO: howto manager. (line 1293)
-* BFD_RELOC_M32R_HI16_SLO: howto manager. (line 1266)
-* BFD_RELOC_M32R_HI16_ULO: howto manager. (line 1262)
-* BFD_RELOC_M32R_JMP_SLOT: howto manager. (line 1281)
-* BFD_RELOC_M32R_LO16: howto manager. (line 1270)
-* BFD_RELOC_M32R_RELATIVE: howto manager. (line 1282)
-* BFD_RELOC_M32R_SDA16: howto manager. (line 1273)
-* BFD_RELOC_M68HC11_24: howto manager. (line 2139)
-* BFD_RELOC_M68HC11_3B: howto manager. (line 2114)
-* BFD_RELOC_M68HC11_HI8: howto manager. (line 2106)
-* BFD_RELOC_M68HC11_LO16: howto manager. (line 2128)
-* BFD_RELOC_M68HC11_LO8: howto manager. (line 2110)
-* BFD_RELOC_M68HC11_PAGE: howto manager. (line 2134)
-* BFD_RELOC_M68HC11_RL_GROUP: howto manager. (line 2123)
-* BFD_RELOC_M68HC11_RL_JUMP: howto manager. (line 2117)
-* BFD_RELOC_M68HC12_10_PCREL: howto manager. (line 2199)
-* BFD_RELOC_M68HC12_16B: howto manager. (line 2193)
-* BFD_RELOC_M68HC12_5B: howto manager. (line 2145)
-* BFD_RELOC_M68HC12_9_PCREL: howto manager. (line 2196)
-* BFD_RELOC_M68HC12_9B: howto manager. (line 2190)
-* BFD_RELOC_M68HC12_HI8XG: howto manager. (line 2206)
-* BFD_RELOC_M68HC12_LO8XG: howto manager. (line 2202)
-* BFD_RELOC_MACH_O_LOCAL_SECTDIFF: howto manager. (line 2628)
-* BFD_RELOC_MACH_O_PAIR: howto manager. (line 2631)
-* BFD_RELOC_MACH_O_SECTDIFF: howto manager. (line 2624)
-* BFD_RELOC_MACH_O_X86_64_BRANCH32: howto manager. (line 2634)
-* BFD_RELOC_MACH_O_X86_64_BRANCH8: howto manager. (line 2635)
-* BFD_RELOC_MACH_O_X86_64_GOT: howto manager. (line 2639)
-* BFD_RELOC_MACH_O_X86_64_GOT_LOAD: howto manager. (line 2642)
-* BFD_RELOC_MACH_O_X86_64_PCREL32_1: howto manager. (line 2652)
-* BFD_RELOC_MACH_O_X86_64_PCREL32_2: howto manager. (line 2655)
-* BFD_RELOC_MACH_O_X86_64_PCREL32_4: howto manager. (line 2658)
-* BFD_RELOC_MACH_O_X86_64_SUBTRACTOR32: howto manager. (line 2646)
-* BFD_RELOC_MACH_O_X86_64_SUBTRACTOR64: howto manager. (line 2649)
-* BFD_RELOC_MCORE_PCREL_32: howto manager. (line 1523)
-* BFD_RELOC_MCORE_PCREL_IMM11BY2: howto manager. (line 1521)
-* BFD_RELOC_MCORE_PCREL_IMM4BY2: howto manager. (line 1522)
-* BFD_RELOC_MCORE_PCREL_IMM8BY4: howto manager. (line 1520)
-* BFD_RELOC_MCORE_PCREL_JSR_IMM11BY2: howto manager. (line 1524)
-* BFD_RELOC_MCORE_RVA: howto manager. (line 1525)
-* BFD_RELOC_MEP_16: howto manager. (line 1529)
-* BFD_RELOC_MEP_32: howto manager. (line 1530)
-* BFD_RELOC_MEP_8: howto manager. (line 1528)
-* BFD_RELOC_MEP_ADDR24A4: howto manager. (line 1545)
-* BFD_RELOC_MEP_GNU_VTENTRY: howto manager. (line 1547)
-* BFD_RELOC_MEP_GNU_VTINHERIT: howto manager. (line 1546)
-* BFD_RELOC_MEP_GPREL: howto manager. (line 1539)
-* BFD_RELOC_MEP_HI16S: howto manager. (line 1538)
-* BFD_RELOC_MEP_HI16U: howto manager. (line 1537)
-* BFD_RELOC_MEP_LOW16: howto manager. (line 1536)
-* BFD_RELOC_MEP_PCABS24A2: howto manager. (line 1535)
-* BFD_RELOC_MEP_PCREL12A2: howto manager. (line 1532)
-* BFD_RELOC_MEP_PCREL17A2: howto manager. (line 1533)
-* BFD_RELOC_MEP_PCREL24A2: howto manager. (line 1534)
-* BFD_RELOC_MEP_PCREL8A2: howto manager. (line 1531)
-* BFD_RELOC_MEP_TPREL: howto manager. (line 1540)
-* BFD_RELOC_MEP_TPREL7: howto manager. (line 1541)
-* BFD_RELOC_MEP_TPREL7A2: howto manager. (line 1542)
-* BFD_RELOC_MEP_TPREL7A4: howto manager. (line 1543)
-* BFD_RELOC_MEP_UIMM24: howto manager. (line 1544)
-* BFD_RELOC_METAG_COPY: howto manager. (line 1569)
-* BFD_RELOC_METAG_GETSET_GOT: howto manager. (line 1561)
-* BFD_RELOC_METAG_GETSET_GOTOFF: howto manager. (line 1560)
-* BFD_RELOC_METAG_GETSETOFF: howto manager. (line 1553)
-* BFD_RELOC_METAG_GLOB_DAT: howto manager. (line 1572)
-* BFD_RELOC_METAG_GOTOFF: howto manager. (line 1567)
-* BFD_RELOC_METAG_HI16_GOTOFF: howto manager. (line 1558)
-* BFD_RELOC_METAG_HI16_GOTPC: howto manager. (line 1562)
-* BFD_RELOC_METAG_HI16_PLT: howto manager. (line 1564)
-* BFD_RELOC_METAG_HIADDR16: howto manager. (line 1550)
-* BFD_RELOC_METAG_HIOG: howto manager. (line 1554)
-* BFD_RELOC_METAG_JMP_SLOT: howto manager. (line 1570)
-* BFD_RELOC_METAG_LO16_GOTOFF: howto manager. (line 1559)
-* BFD_RELOC_METAG_LO16_GOTPC: howto manager. (line 1563)
-* BFD_RELOC_METAG_LO16_PLT: howto manager. (line 1565)
-* BFD_RELOC_METAG_LOADDR16: howto manager. (line 1551)
-* BFD_RELOC_METAG_LOOG: howto manager. (line 1555)
-* BFD_RELOC_METAG_PLT: howto manager. (line 1568)
-* BFD_RELOC_METAG_REL16: howto manager. (line 1557)
-* BFD_RELOC_METAG_REL8: howto manager. (line 1556)
-* BFD_RELOC_METAG_RELATIVE: howto manager. (line 1571)
-* BFD_RELOC_METAG_RELBRANCH: howto manager. (line 1552)
-* BFD_RELOC_METAG_RELBRANCH_PLT: howto manager. (line 1566)
-* BFD_RELOC_METAG_TLS_DTPMOD: howto manager. (line 1583)
-* BFD_RELOC_METAG_TLS_DTPOFF: howto manager. (line 1584)
-* BFD_RELOC_METAG_TLS_GD: howto manager. (line 1573)
-* BFD_RELOC_METAG_TLS_IE: howto manager. (line 1578)
-* BFD_RELOC_METAG_TLS_IENONPIC: howto manager. (line 1579)
-* BFD_RELOC_METAG_TLS_IENONPIC_HI16: howto manager. (line 1580)
-* BFD_RELOC_METAG_TLS_IENONPIC_LO16: howto manager. (line 1581)
-* BFD_RELOC_METAG_TLS_LDM: howto manager. (line 1574)
-* BFD_RELOC_METAG_TLS_LDO: howto manager. (line 1577)
-* BFD_RELOC_METAG_TLS_LDO_HI16: howto manager. (line 1575)
-* BFD_RELOC_METAG_TLS_LDO_LO16: howto manager. (line 1576)
-* BFD_RELOC_METAG_TLS_LE: howto manager. (line 1585)
-* BFD_RELOC_METAG_TLS_LE_HI16: howto manager. (line 1586)
-* BFD_RELOC_METAG_TLS_LE_LO16: howto manager. (line 1587)
-* BFD_RELOC_METAG_TLS_TPOFF: howto manager. (line 1582)
-* BFD_RELOC_MICROBLAZE_32_GOTOFF: howto manager. (line 2705)
-* BFD_RELOC_MICROBLAZE_32_LO: howto manager. (line 2661)
-* BFD_RELOC_MICROBLAZE_32_LO_PCREL: howto manager. (line 2665)
-* BFD_RELOC_MICROBLAZE_32_ROSDA: howto manager. (line 2669)
-* BFD_RELOC_MICROBLAZE_32_RWSDA: howto manager. (line 2673)
-* BFD_RELOC_MICROBLAZE_32_SYM_OP_SYM: howto manager. (line 2677)
-* BFD_RELOC_MICROBLAZE_32_TLSDTPMOD: howto manager. (line 2726)
-* BFD_RELOC_MICROBLAZE_32_TLSDTPREL: howto manager. (line 2729)
-* BFD_RELOC_MICROBLAZE_64_GOT: howto manager. (line 2691)
-* BFD_RELOC_MICROBLAZE_64_GOTOFF: howto manager. (line 2700)
-* BFD_RELOC_MICROBLAZE_64_GOTPC: howto manager. (line 2686)
-* BFD_RELOC_MICROBLAZE_64_NONE: howto manager. (line 2681)
-* BFD_RELOC_MICROBLAZE_64_PLT: howto manager. (line 2695)
-* BFD_RELOC_MICROBLAZE_64_TLS: howto manager. (line 2713)
-* BFD_RELOC_MICROBLAZE_64_TLSDTPREL: howto manager. (line 2732)
-* BFD_RELOC_MICROBLAZE_64_TLSGD: howto manager. (line 2716)
-* BFD_RELOC_MICROBLAZE_64_TLSGOTTPREL: howto manager. (line 2736)
-* BFD_RELOC_MICROBLAZE_64_TLSLD: howto manager. (line 2721)
-* BFD_RELOC_MICROBLAZE_64_TLSTPREL: howto manager. (line 2740)
-* BFD_RELOC_MICROBLAZE_COPY: howto manager. (line 2709)
-* BFD_RELOC_MICROMIPS_10_PCREL_S1: howto manager. (line 404)
-* BFD_RELOC_MICROMIPS_16_PCREL_S1: howto manager. (line 405)
-* BFD_RELOC_MICROMIPS_7_PCREL_S1: howto manager. (line 403)
-* BFD_RELOC_MICROMIPS_CALL16: howto manager. (line 417)
-* BFD_RELOC_MICROMIPS_CALL_HI16: howto manager. (line 423)
-* BFD_RELOC_MICROMIPS_CALL_LO16: howto manager. (line 425)
-* BFD_RELOC_MICROMIPS_GOT16: howto manager. (line 415)
-* BFD_RELOC_MICROMIPS_GOT_DISP: howto manager. (line 433)
-* BFD_RELOC_MICROMIPS_GOT_HI16: howto manager. (line 419)
-* BFD_RELOC_MICROMIPS_GOT_LO16: howto manager. (line 421)
-* BFD_RELOC_MICROMIPS_GOT_OFST: howto manager. (line 431)
-* BFD_RELOC_MICROMIPS_GOT_PAGE: howto manager. (line 429)
-* BFD_RELOC_MICROMIPS_GPREL16: howto manager. (line 408)
-* BFD_RELOC_MICROMIPS_HI16: howto manager. (line 409)
-* BFD_RELOC_MICROMIPS_HI16_S: howto manager. (line 410)
-* BFD_RELOC_MICROMIPS_HIGHER: howto manager. (line 442)
-* BFD_RELOC_MICROMIPS_HIGHEST: howto manager. (line 440)
-* BFD_RELOC_MICROMIPS_JALR: howto manager. (line 448)
-* BFD_RELOC_MICROMIPS_JMP: howto manager. (line 343)
-* BFD_RELOC_MICROMIPS_LITERAL: howto manager. (line 400)
-* BFD_RELOC_MICROMIPS_LO16: howto manager. (line 411)
-* BFD_RELOC_MICROMIPS_SCN_DISP: howto manager. (line 444)
-* BFD_RELOC_MICROMIPS_SUB: howto manager. (line 427)
-* BFD_RELOC_MICROMIPS_TLS_DTPREL_HI16: howto manager. (line 458)
-* BFD_RELOC_MICROMIPS_TLS_DTPREL_LO16: howto manager. (line 460)
-* BFD_RELOC_MICROMIPS_TLS_GD: howto manager. (line 454)
-* BFD_RELOC_MICROMIPS_TLS_GOTTPREL: howto manager. (line 462)
-* BFD_RELOC_MICROMIPS_TLS_LDM: howto manager. (line 456)
-* BFD_RELOC_MICROMIPS_TLS_TPREL_HI16: howto manager. (line 466)
-* BFD_RELOC_MICROMIPS_TLS_TPREL_LO16: howto manager. (line 468)
-* BFD_RELOC_MIPS16_CALL16: howto manager. (line 374)
-* BFD_RELOC_MIPS16_GOT16: howto manager. (line 373)
-* BFD_RELOC_MIPS16_GPREL: howto manager. (line 349)
-* BFD_RELOC_MIPS16_HI16: howto manager. (line 378)
-* BFD_RELOC_MIPS16_HI16_S: howto manager. (line 381)
-* BFD_RELOC_MIPS16_JMP: howto manager. (line 346)
-* BFD_RELOC_MIPS16_LO16: howto manager. (line 387)
-* BFD_RELOC_MIPS16_TLS_DTPREL_HI16: howto manager. (line 392)
-* BFD_RELOC_MIPS16_TLS_DTPREL_LO16: howto manager. (line 393)
-* BFD_RELOC_MIPS16_TLS_GD: howto manager. (line 390)
-* BFD_RELOC_MIPS16_TLS_GOTTPREL: howto manager. (line 394)
-* BFD_RELOC_MIPS16_TLS_LDM: howto manager. (line 391)
-* BFD_RELOC_MIPS16_TLS_TPREL_HI16: howto manager. (line 395)
-* BFD_RELOC_MIPS16_TLS_TPREL_LO16: howto manager. (line 396)
-* BFD_RELOC_MIPS_CALL16: howto manager. (line 416)
-* BFD_RELOC_MIPS_CALL_HI16: howto manager. (line 422)
-* BFD_RELOC_MIPS_CALL_LO16: howto manager. (line 424)
-* BFD_RELOC_MIPS_COPY: howto manager. (line 472)
-* BFD_RELOC_MIPS_DELETE: howto manager. (line 438)
-* BFD_RELOC_MIPS_EH: howto manager. (line 469)
-* BFD_RELOC_MIPS_GOT16: howto manager. (line 414)
-* BFD_RELOC_MIPS_GOT_DISP: howto manager. (line 432)
-* BFD_RELOC_MIPS_GOT_HI16: howto manager. (line 418)
-* BFD_RELOC_MIPS_GOT_LO16: howto manager. (line 420)
-* BFD_RELOC_MIPS_GOT_OFST: howto manager. (line 430)
-* BFD_RELOC_MIPS_GOT_PAGE: howto manager. (line 428)
-* BFD_RELOC_MIPS_HIGHER: howto manager. (line 441)
-* BFD_RELOC_MIPS_HIGHEST: howto manager. (line 439)
-* BFD_RELOC_MIPS_INSERT_A: howto manager. (line 436)
-* BFD_RELOC_MIPS_INSERT_B: howto manager. (line 437)
-* BFD_RELOC_MIPS_JALR: howto manager. (line 447)
-* BFD_RELOC_MIPS_JMP: howto manager. (line 342)
-* BFD_RELOC_MIPS_JUMP_SLOT: howto manager. (line 473)
-* BFD_RELOC_MIPS_LITERAL: howto manager. (line 399)
-* BFD_RELOC_MIPS_REL16: howto manager. (line 445)
-* BFD_RELOC_MIPS_RELGOT: howto manager. (line 446)
-* BFD_RELOC_MIPS_SCN_DISP: howto manager. (line 443)
-* BFD_RELOC_MIPS_SHIFT5: howto manager. (line 434)
-* BFD_RELOC_MIPS_SHIFT6: howto manager. (line 435)
-* BFD_RELOC_MIPS_SUB: howto manager. (line 426)
-* BFD_RELOC_MIPS_TLS_DTPMOD32: howto manager. (line 449)
-* BFD_RELOC_MIPS_TLS_DTPMOD64: howto manager. (line 451)
-* BFD_RELOC_MIPS_TLS_DTPREL32: howto manager. (line 450)
-* BFD_RELOC_MIPS_TLS_DTPREL64: howto manager. (line 452)
-* BFD_RELOC_MIPS_TLS_DTPREL_HI16: howto manager. (line 457)
-* BFD_RELOC_MIPS_TLS_DTPREL_LO16: howto manager. (line 459)
-* BFD_RELOC_MIPS_TLS_GD: howto manager. (line 453)
-* BFD_RELOC_MIPS_TLS_GOTTPREL: howto manager. (line 461)
-* BFD_RELOC_MIPS_TLS_LDM: howto manager. (line 455)
-* BFD_RELOC_MIPS_TLS_TPREL32: howto manager. (line 463)
-* BFD_RELOC_MIPS_TLS_TPREL64: howto manager. (line 464)
-* BFD_RELOC_MIPS_TLS_TPREL_HI16: howto manager. (line 465)
-* BFD_RELOC_MIPS_TLS_TPREL_LO16: howto manager. (line 467)
-* BFD_RELOC_MMIX_ADDR19: howto manager. (line 1616)
-* BFD_RELOC_MMIX_ADDR27: howto manager. (line 1620)
-* BFD_RELOC_MMIX_BASE_PLUS_OFFSET: howto manager. (line 1632)
-* BFD_RELOC_MMIX_CBRANCH: howto manager. (line 1596)
-* BFD_RELOC_MMIX_CBRANCH_1: howto manager. (line 1598)
-* BFD_RELOC_MMIX_CBRANCH_2: howto manager. (line 1599)
-* BFD_RELOC_MMIX_CBRANCH_3: howto manager. (line 1600)
-* BFD_RELOC_MMIX_CBRANCH_J: howto manager. (line 1597)
-* BFD_RELOC_MMIX_GETA: howto manager. (line 1590)
-* BFD_RELOC_MMIX_GETA_1: howto manager. (line 1591)
-* BFD_RELOC_MMIX_GETA_2: howto manager. (line 1592)
-* BFD_RELOC_MMIX_GETA_3: howto manager. (line 1593)
-* BFD_RELOC_MMIX_JMP: howto manager. (line 1610)
-* BFD_RELOC_MMIX_JMP_1: howto manager. (line 1611)
-* BFD_RELOC_MMIX_JMP_2: howto manager. (line 1612)
-* BFD_RELOC_MMIX_JMP_3: howto manager. (line 1613)
-* BFD_RELOC_MMIX_LOCAL: howto manager. (line 1636)
-* BFD_RELOC_MMIX_PUSHJ: howto manager. (line 1603)
-* BFD_RELOC_MMIX_PUSHJ_1: howto manager. (line 1604)
-* BFD_RELOC_MMIX_PUSHJ_2: howto manager. (line 1605)
-* BFD_RELOC_MMIX_PUSHJ_3: howto manager. (line 1606)
-* BFD_RELOC_MMIX_PUSHJ_STUBBABLE: howto manager. (line 1607)
-* BFD_RELOC_MMIX_REG: howto manager. (line 1628)
-* BFD_RELOC_MMIX_REG_OR_BYTE: howto manager. (line 1624)
-* BFD_RELOC_MN10300_16_PCREL: howto manager. (line 571)
-* BFD_RELOC_MN10300_32_PCREL: howto manager. (line 567)
-* BFD_RELOC_MN10300_ALIGN: howto manager. (line 552)
-* BFD_RELOC_MN10300_COPY: howto manager. (line 535)
-* BFD_RELOC_MN10300_GLOB_DAT: howto manager. (line 538)
-* BFD_RELOC_MN10300_GOT16: howto manager. (line 531)
-* BFD_RELOC_MN10300_GOT24: howto manager. (line 527)
-* BFD_RELOC_MN10300_GOT32: howto manager. (line 523)
-* BFD_RELOC_MN10300_GOTOFF24: howto manager. (line 520)
-* BFD_RELOC_MN10300_JMP_SLOT: howto manager. (line 541)
-* BFD_RELOC_MN10300_RELATIVE: howto manager. (line 544)
-* BFD_RELOC_MN10300_SYM_DIFF: howto manager. (line 547)
-* BFD_RELOC_MN10300_TLS_DTPMOD: howto manager. (line 562)
-* BFD_RELOC_MN10300_TLS_DTPOFF: howto manager. (line 563)
-* BFD_RELOC_MN10300_TLS_GD: howto manager. (line 556)
-* BFD_RELOC_MN10300_TLS_GOTIE: howto manager. (line 559)
-* BFD_RELOC_MN10300_TLS_IE: howto manager. (line 560)
-* BFD_RELOC_MN10300_TLS_LD: howto manager. (line 557)
-* BFD_RELOC_MN10300_TLS_LDO: howto manager. (line 558)
-* BFD_RELOC_MN10300_TLS_LE: howto manager. (line 561)
-* BFD_RELOC_MN10300_TLS_TPOFF: howto manager. (line 564)
-* BFD_RELOC_MOXIE_10_PCREL: howto manager. (line 476)
-* BFD_RELOC_MSP430_10_PCREL: howto manager. (line 2448)
-* BFD_RELOC_MSP430_16: howto manager. (line 2450)
-* BFD_RELOC_MSP430_16_BYTE: howto manager. (line 2452)
-* BFD_RELOC_MSP430_16_PCREL: howto manager. (line 2449)
-* BFD_RELOC_MSP430_16_PCREL_BYTE: howto manager. (line 2451)
-* BFD_RELOC_MSP430_2X_PCREL: howto manager. (line 2453)
-* BFD_RELOC_MSP430_ABS8: howto manager. (line 2455)
-* BFD_RELOC_MSP430_ABS_HI16: howto manager. (line 2467)
-* BFD_RELOC_MSP430_PREL31: howto manager. (line 2468)
-* BFD_RELOC_MSP430_RL_PCREL: howto manager. (line 2454)
-* BFD_RELOC_MSP430_SYM_DIFF: howto manager. (line 2469)
-* BFD_RELOC_MSP430X_ABS16: howto manager. (line 2466)
-* BFD_RELOC_MSP430X_ABS20_ADR_DST: howto manager. (line 2463)
-* BFD_RELOC_MSP430X_ABS20_ADR_SRC: howto manager. (line 2462)
-* BFD_RELOC_MSP430X_ABS20_EXT_DST: howto manager. (line 2460)
-* BFD_RELOC_MSP430X_ABS20_EXT_ODST: howto manager. (line 2461)
-* BFD_RELOC_MSP430X_ABS20_EXT_SRC: howto manager. (line 2459)
-* BFD_RELOC_MSP430X_PCR16: howto manager. (line 2464)
-* BFD_RELOC_MSP430X_PCR20_CALL: howto manager. (line 2465)
-* BFD_RELOC_MSP430X_PCR20_EXT_DST: howto manager. (line 2457)
-* BFD_RELOC_MSP430X_PCR20_EXT_ODST: howto manager. (line 2458)
-* BFD_RELOC_MSP430X_PCR20_EXT_SRC: howto manager. (line 2456)
-* BFD_RELOC_MT_GNU_VTENTRY: howto manager. (line 2442)
-* BFD_RELOC_MT_GNU_VTINHERIT: howto manager. (line 2439)
-* BFD_RELOC_MT_HI16: howto manager. (line 2433)
-* BFD_RELOC_MT_LO16: howto manager. (line 2436)
-* BFD_RELOC_MT_PC16: howto manager. (line 2430)
-* BFD_RELOC_MT_PCINSN8: howto manager. (line 2445)
-* BFD_RELOC_NIOS2_ALIGN: howto manager. (line 2486)
-* BFD_RELOC_NIOS2_CACHE_OPX: howto manager. (line 2476)
-* BFD_RELOC_NIOS2_CALL16: howto manager. (line 2488)
-* BFD_RELOC_NIOS2_CALL26: howto manager. (line 2474)
-* BFD_RELOC_NIOS2_CALLR: howto manager. (line 2485)
-* BFD_RELOC_NIOS2_CJMP: howto manager. (line 2484)
-* BFD_RELOC_NIOS2_COPY: howto manager. (line 2501)
-* BFD_RELOC_NIOS2_GLOB_DAT: howto manager. (line 2502)
-* BFD_RELOC_NIOS2_GOT16: howto manager. (line 2487)
-* BFD_RELOC_NIOS2_GOTOFF: howto manager. (line 2505)
-* BFD_RELOC_NIOS2_GOTOFF_HA: howto manager. (line 2490)
-* BFD_RELOC_NIOS2_GOTOFF_LO: howto manager. (line 2489)
-* BFD_RELOC_NIOS2_GPREL: howto manager. (line 2482)
-* BFD_RELOC_NIOS2_HI16: howto manager. (line 2479)
-* BFD_RELOC_NIOS2_HIADJ16: howto manager. (line 2481)
-* BFD_RELOC_NIOS2_IMM5: howto manager. (line 2475)
-* BFD_RELOC_NIOS2_IMM6: howto manager. (line 2477)
-* BFD_RELOC_NIOS2_IMM8: howto manager. (line 2478)
-* BFD_RELOC_NIOS2_JUMP_SLOT: howto manager. (line 2503)
-* BFD_RELOC_NIOS2_LO16: howto manager. (line 2480)
-* BFD_RELOC_NIOS2_PCREL_HA: howto manager. (line 2492)
-* BFD_RELOC_NIOS2_PCREL_LO: howto manager. (line 2491)
-* BFD_RELOC_NIOS2_RELATIVE: howto manager. (line 2504)
-* BFD_RELOC_NIOS2_S16: howto manager. (line 2472)
-* BFD_RELOC_NIOS2_TLS_DTPMOD: howto manager. (line 2498)
-* BFD_RELOC_NIOS2_TLS_DTPREL: howto manager. (line 2499)
-* BFD_RELOC_NIOS2_TLS_GD16: howto manager. (line 2493)
-* BFD_RELOC_NIOS2_TLS_IE16: howto manager. (line 2496)
-* BFD_RELOC_NIOS2_TLS_LDM16: howto manager. (line 2494)
-* BFD_RELOC_NIOS2_TLS_LDO16: howto manager. (line 2495)
-* BFD_RELOC_NIOS2_TLS_LE16: howto manager. (line 2497)
-* BFD_RELOC_NIOS2_TLS_TPREL: howto manager. (line 2500)
-* BFD_RELOC_NIOS2_U16: howto manager. (line 2473)
-* BFD_RELOC_NIOS2_UJMP: howto manager. (line 2483)
-* BFD_RELOC_NONE: howto manager. (line 135)
-* BFD_RELOC_NS32K_DISP_16: howto manager. (line 639)
-* BFD_RELOC_NS32K_DISP_16_PCREL: howto manager. (line 642)
-* BFD_RELOC_NS32K_DISP_32: howto manager. (line 640)
-* BFD_RELOC_NS32K_DISP_32_PCREL: howto manager. (line 643)
-* BFD_RELOC_NS32K_DISP_8: howto manager. (line 638)
-* BFD_RELOC_NS32K_DISP_8_PCREL: howto manager. (line 641)
-* BFD_RELOC_NS32K_IMM_16: howto manager. (line 633)
-* BFD_RELOC_NS32K_IMM_16_PCREL: howto manager. (line 636)
-* BFD_RELOC_NS32K_IMM_32: howto manager. (line 634)
-* BFD_RELOC_NS32K_IMM_32_PCREL: howto manager. (line 637)
-* BFD_RELOC_NS32K_IMM_8: howto manager. (line 632)
-* BFD_RELOC_NS32K_IMM_8_PCREL: howto manager. (line 635)
-* BFD_RELOC_OPENRISC_ABS_26: howto manager. (line 2398)
-* BFD_RELOC_OPENRISC_REL_26: howto manager. (line 2399)
-* BFD_RELOC_PDP11_DISP_6_PCREL: howto manager. (line 647)
-* BFD_RELOC_PDP11_DISP_8_PCREL: howto manager. (line 646)
-* BFD_RELOC_PJ_CODE_DIR16: howto manager. (line 652)
-* BFD_RELOC_PJ_CODE_DIR32: howto manager. (line 653)
-* BFD_RELOC_PJ_CODE_HI16: howto manager. (line 650)
-* BFD_RELOC_PJ_CODE_LO16: howto manager. (line 651)
-* BFD_RELOC_PJ_CODE_REL16: howto manager. (line 654)
-* BFD_RELOC_PJ_CODE_REL32: howto manager. (line 655)
-* BFD_RELOC_PPC64_ADDR16_DS: howto manager. (line 717)
-* BFD_RELOC_PPC64_ADDR16_HIGH: howto manager. (line 728)
-* BFD_RELOC_PPC64_ADDR16_HIGHA: howto manager. (line 729)
-* BFD_RELOC_PPC64_ADDR16_LO_DS: howto manager. (line 718)
-* BFD_RELOC_PPC64_DTPREL16_DS: howto manager. (line 768)
-* BFD_RELOC_PPC64_DTPREL16_HIGH: howto manager. (line 776)
-* BFD_RELOC_PPC64_DTPREL16_HIGHA: howto manager. (line 777)
-* BFD_RELOC_PPC64_DTPREL16_HIGHER: howto manager. (line 770)
-* BFD_RELOC_PPC64_DTPREL16_HIGHERA: howto manager. (line 771)
-* BFD_RELOC_PPC64_DTPREL16_HIGHEST: howto manager. (line 772)
-* BFD_RELOC_PPC64_DTPREL16_HIGHESTA: howto manager. (line 773)
-* BFD_RELOC_PPC64_DTPREL16_LO_DS: howto manager. (line 769)
-* BFD_RELOC_PPC64_GOT16_DS: howto manager. (line 719)
-* BFD_RELOC_PPC64_GOT16_LO_DS: howto manager. (line 720)
-* BFD_RELOC_PPC64_HIGHER: howto manager. (line 705)
-* BFD_RELOC_PPC64_HIGHER_S: howto manager. (line 706)
-* BFD_RELOC_PPC64_HIGHEST: howto manager. (line 707)
-* BFD_RELOC_PPC64_HIGHEST_S: howto manager. (line 708)
-* BFD_RELOC_PPC64_PLT16_LO_DS: howto manager. (line 721)
-* BFD_RELOC_PPC64_PLTGOT16: howto manager. (line 713)
-* BFD_RELOC_PPC64_PLTGOT16_DS: howto manager. (line 726)
-* BFD_RELOC_PPC64_PLTGOT16_HA: howto manager. (line 716)
-* BFD_RELOC_PPC64_PLTGOT16_HI: howto manager. (line 715)
-* BFD_RELOC_PPC64_PLTGOT16_LO: howto manager. (line 714)
-* BFD_RELOC_PPC64_PLTGOT16_LO_DS: howto manager. (line 727)
-* BFD_RELOC_PPC64_SECTOFF_DS: howto manager. (line 722)
-* BFD_RELOC_PPC64_SECTOFF_LO_DS: howto manager. (line 723)
-* BFD_RELOC_PPC64_TOC: howto manager. (line 712)
-* BFD_RELOC_PPC64_TOC16_DS: howto manager. (line 724)
-* BFD_RELOC_PPC64_TOC16_HA: howto manager. (line 711)
-* BFD_RELOC_PPC64_TOC16_HI: howto manager. (line 710)
-* BFD_RELOC_PPC64_TOC16_LO: howto manager. (line 709)
-* BFD_RELOC_PPC64_TOC16_LO_DS: howto manager. (line 725)
-* BFD_RELOC_PPC64_TPREL16_DS: howto manager. (line 762)
-* BFD_RELOC_PPC64_TPREL16_HIGH: howto manager. (line 774)
-* BFD_RELOC_PPC64_TPREL16_HIGHA: howto manager. (line 775)
-* BFD_RELOC_PPC64_TPREL16_HIGHER: howto manager. (line 764)
-* BFD_RELOC_PPC64_TPREL16_HIGHERA: howto manager. (line 765)
-* BFD_RELOC_PPC64_TPREL16_HIGHEST: howto manager. (line 766)
-* BFD_RELOC_PPC64_TPREL16_HIGHESTA: howto manager. (line 767)
-* BFD_RELOC_PPC64_TPREL16_LO_DS: howto manager. (line 763)
-* BFD_RELOC_PPC_B16: howto manager. (line 661)
-* BFD_RELOC_PPC_B16_BRNTAKEN: howto manager. (line 663)
-* BFD_RELOC_PPC_B16_BRTAKEN: howto manager. (line 662)
-* BFD_RELOC_PPC_B26: howto manager. (line 658)
-* BFD_RELOC_PPC_BA16: howto manager. (line 664)
-* BFD_RELOC_PPC_BA16_BRNTAKEN: howto manager. (line 666)
-* BFD_RELOC_PPC_BA16_BRTAKEN: howto manager. (line 665)
-* BFD_RELOC_PPC_BA26: howto manager. (line 659)
-* BFD_RELOC_PPC_COPY: howto manager. (line 667)
-* BFD_RELOC_PPC_DTPMOD: howto manager. (line 735)
-* BFD_RELOC_PPC_DTPREL: howto manager. (line 745)
-* BFD_RELOC_PPC_DTPREL16: howto manager. (line 741)
-* BFD_RELOC_PPC_DTPREL16_HA: howto manager. (line 744)
-* BFD_RELOC_PPC_DTPREL16_HI: howto manager. (line 743)
-* BFD_RELOC_PPC_DTPREL16_LO: howto manager. (line 742)
-* BFD_RELOC_PPC_EMB_BIT_FLD: howto manager. (line 686)
-* BFD_RELOC_PPC_EMB_MRKREF: howto manager. (line 681)
-* BFD_RELOC_PPC_EMB_NADDR16: howto manager. (line 673)
-* BFD_RELOC_PPC_EMB_NADDR16_HA: howto manager. (line 676)
-* BFD_RELOC_PPC_EMB_NADDR16_HI: howto manager. (line 675)
-* BFD_RELOC_PPC_EMB_NADDR16_LO: howto manager. (line 674)
-* BFD_RELOC_PPC_EMB_NADDR32: howto manager. (line 672)
-* BFD_RELOC_PPC_EMB_RELSDA: howto manager. (line 687)
-* BFD_RELOC_PPC_EMB_RELSEC16: howto manager. (line 682)
-* BFD_RELOC_PPC_EMB_RELST_HA: howto manager. (line 685)
-* BFD_RELOC_PPC_EMB_RELST_HI: howto manager. (line 684)
-* BFD_RELOC_PPC_EMB_RELST_LO: howto manager. (line 683)
-* BFD_RELOC_PPC_EMB_SDA21: howto manager. (line 680)
-* BFD_RELOC_PPC_EMB_SDA2I16: howto manager. (line 678)
-* BFD_RELOC_PPC_EMB_SDA2REL: howto manager. (line 679)
-* BFD_RELOC_PPC_EMB_SDAI16: howto manager. (line 677)
-* BFD_RELOC_PPC_GLOB_DAT: howto manager. (line 668)
-* BFD_RELOC_PPC_GOT_DTPREL16: howto manager. (line 758)
-* BFD_RELOC_PPC_GOT_DTPREL16_HA: howto manager. (line 761)
-* BFD_RELOC_PPC_GOT_DTPREL16_HI: howto manager. (line 760)
-* BFD_RELOC_PPC_GOT_DTPREL16_LO: howto manager. (line 759)
-* BFD_RELOC_PPC_GOT_TLSGD16: howto manager. (line 746)
-* BFD_RELOC_PPC_GOT_TLSGD16_HA: howto manager. (line 749)
-* BFD_RELOC_PPC_GOT_TLSGD16_HI: howto manager. (line 748)
-* BFD_RELOC_PPC_GOT_TLSGD16_LO: howto manager. (line 747)
-* BFD_RELOC_PPC_GOT_TLSLD16: howto manager. (line 750)
-* BFD_RELOC_PPC_GOT_TLSLD16_HA: howto manager. (line 753)
-* BFD_RELOC_PPC_GOT_TLSLD16_HI: howto manager. (line 752)
-* BFD_RELOC_PPC_GOT_TLSLD16_LO: howto manager. (line 751)
-* BFD_RELOC_PPC_GOT_TPREL16: howto manager. (line 754)
-* BFD_RELOC_PPC_GOT_TPREL16_HA: howto manager. (line 757)
-* BFD_RELOC_PPC_GOT_TPREL16_HI: howto manager. (line 756)
-* BFD_RELOC_PPC_GOT_TPREL16_LO: howto manager. (line 755)
-* BFD_RELOC_PPC_JMP_SLOT: howto manager. (line 669)
-* BFD_RELOC_PPC_LOCAL24PC: howto manager. (line 671)
-* BFD_RELOC_PPC_RELATIVE: howto manager. (line 670)
-* BFD_RELOC_PPC_TLS: howto manager. (line 732)
-* BFD_RELOC_PPC_TLSGD: howto manager. (line 733)
-* BFD_RELOC_PPC_TLSLD: howto manager. (line 734)
-* BFD_RELOC_PPC_TOC16: howto manager. (line 660)
-* BFD_RELOC_PPC_TPREL: howto manager. (line 740)
-* BFD_RELOC_PPC_TPREL16: howto manager. (line 736)
-* BFD_RELOC_PPC_TPREL16_HA: howto manager. (line 739)
-* BFD_RELOC_PPC_TPREL16_HI: howto manager. (line 738)
-* BFD_RELOC_PPC_TPREL16_LO: howto manager. (line 737)
-* BFD_RELOC_PPC_VLE_HA16A: howto manager. (line 695)
-* BFD_RELOC_PPC_VLE_HA16D: howto manager. (line 696)
-* BFD_RELOC_PPC_VLE_HI16A: howto manager. (line 693)
-* BFD_RELOC_PPC_VLE_HI16D: howto manager. (line 694)
-* BFD_RELOC_PPC_VLE_LO16A: howto manager. (line 691)
-* BFD_RELOC_PPC_VLE_LO16D: howto manager. (line 692)
-* BFD_RELOC_PPC_VLE_REL15: howto manager. (line 689)
-* BFD_RELOC_PPC_VLE_REL24: howto manager. (line 690)
-* BFD_RELOC_PPC_VLE_REL8: howto manager. (line 688)
-* BFD_RELOC_PPC_VLE_SDA21: howto manager. (line 697)
-* BFD_RELOC_PPC_VLE_SDA21_LO: howto manager. (line 698)
-* BFD_RELOC_PPC_VLE_SDAREL_HA16A: howto manager. (line 703)
-* BFD_RELOC_PPC_VLE_SDAREL_HA16D: howto manager. (line 704)
-* BFD_RELOC_PPC_VLE_SDAREL_HI16A: howto manager. (line 701)
-* BFD_RELOC_PPC_VLE_SDAREL_HI16D: howto manager. (line 702)
-* BFD_RELOC_PPC_VLE_SDAREL_LO16A: howto manager. (line 699)
-* BFD_RELOC_PPC_VLE_SDAREL_LO16D: howto manager. (line 700)
-* BFD_RELOC_RELC: howto manager. (line 2416)
-* BFD_RELOC_RL78_16_OP: howto manager. (line 1759)
-* BFD_RELOC_RL78_16U: howto manager. (line 1763)
-* BFD_RELOC_RL78_24_OP: howto manager. (line 1760)
-* BFD_RELOC_RL78_24U: howto manager. (line 1764)
-* BFD_RELOC_RL78_32_OP: howto manager. (line 1761)
-* BFD_RELOC_RL78_8U: howto manager. (line 1762)
-* BFD_RELOC_RL78_ABS16: howto manager. (line 1776)
-* BFD_RELOC_RL78_ABS16_REV: howto manager. (line 1777)
-* BFD_RELOC_RL78_ABS16U: howto manager. (line 1780)
-* BFD_RELOC_RL78_ABS16UL: howto manager. (line 1782)
-* BFD_RELOC_RL78_ABS16UW: howto manager. (line 1781)
-* BFD_RELOC_RL78_ABS32: howto manager. (line 1778)
-* BFD_RELOC_RL78_ABS32_REV: howto manager. (line 1779)
-* BFD_RELOC_RL78_ABS8: howto manager. (line 1775)
-* BFD_RELOC_RL78_CODE: howto manager. (line 1787)
-* BFD_RELOC_RL78_DIFF: howto manager. (line 1766)
-* BFD_RELOC_RL78_DIR3U_PCREL: howto manager. (line 1765)
-* BFD_RELOC_RL78_GPRELB: howto manager. (line 1767)
-* BFD_RELOC_RL78_GPRELL: howto manager. (line 1769)
-* BFD_RELOC_RL78_GPRELW: howto manager. (line 1768)
-* BFD_RELOC_RL78_HI16: howto manager. (line 1784)
-* BFD_RELOC_RL78_HI8: howto manager. (line 1785)
-* BFD_RELOC_RL78_LO16: howto manager. (line 1786)
-* BFD_RELOC_RL78_NEG16: howto manager. (line 1756)
-* BFD_RELOC_RL78_NEG24: howto manager. (line 1757)
-* BFD_RELOC_RL78_NEG32: howto manager. (line 1758)
-* BFD_RELOC_RL78_NEG8: howto manager. (line 1755)
-* BFD_RELOC_RL78_OP_AND: howto manager. (line 1773)
-* BFD_RELOC_RL78_OP_NEG: howto manager. (line 1772)
-* BFD_RELOC_RL78_OP_SHRA: howto manager. (line 1774)
-* BFD_RELOC_RL78_OP_SUBTRACT: howto manager. (line 1771)
-* BFD_RELOC_RL78_RELAX: howto manager. (line 1783)
-* BFD_RELOC_RL78_SYM: howto manager. (line 1770)
-* BFD_RELOC_RVA: howto manager. (line 104)
-* BFD_RELOC_RX_16_OP: howto manager. (line 1794)
-* BFD_RELOC_RX_16U: howto manager. (line 1798)
-* BFD_RELOC_RX_24_OP: howto manager. (line 1795)
-* BFD_RELOC_RX_24U: howto manager. (line 1799)
-* BFD_RELOC_RX_32_OP: howto manager. (line 1796)
-* BFD_RELOC_RX_8U: howto manager. (line 1797)
-* BFD_RELOC_RX_ABS16: howto manager. (line 1809)
-* BFD_RELOC_RX_ABS16_REV: howto manager. (line 1810)
-* BFD_RELOC_RX_ABS16U: howto manager. (line 1813)
-* BFD_RELOC_RX_ABS16UL: howto manager. (line 1815)
-* BFD_RELOC_RX_ABS16UW: howto manager. (line 1814)
-* BFD_RELOC_RX_ABS32: howto manager. (line 1811)
-* BFD_RELOC_RX_ABS32_REV: howto manager. (line 1812)
-* BFD_RELOC_RX_ABS8: howto manager. (line 1808)
-* BFD_RELOC_RX_DIFF: howto manager. (line 1801)
-* BFD_RELOC_RX_DIR3U_PCREL: howto manager. (line 1800)
-* BFD_RELOC_RX_GPRELB: howto manager. (line 1802)
-* BFD_RELOC_RX_GPRELL: howto manager. (line 1804)
-* BFD_RELOC_RX_GPRELW: howto manager. (line 1803)
-* BFD_RELOC_RX_NEG16: howto manager. (line 1791)
-* BFD_RELOC_RX_NEG24: howto manager. (line 1792)
-* BFD_RELOC_RX_NEG32: howto manager. (line 1793)
-* BFD_RELOC_RX_NEG8: howto manager. (line 1790)
-* BFD_RELOC_RX_OP_NEG: howto manager. (line 1807)
-* BFD_RELOC_RX_OP_SUBTRACT: howto manager. (line 1806)
-* BFD_RELOC_RX_RELAX: howto manager. (line 1816)
-* BFD_RELOC_RX_SYM: howto manager. (line 1805)
-* BFD_RELOC_SCORE16_BRANCH: howto manager. (line 1959)
-* BFD_RELOC_SCORE16_JMP: howto manager. (line 1956)
-* BFD_RELOC_SCORE_BCMP: howto manager. (line 1962)
-* BFD_RELOC_SCORE_BRANCH: howto manager. (line 1947)
-* BFD_RELOC_SCORE_CALL15: howto manager. (line 1967)
-* BFD_RELOC_SCORE_DUMMY2: howto manager. (line 1943)
-* BFD_RELOC_SCORE_DUMMY_HI16: howto manager. (line 1968)
-* BFD_RELOC_SCORE_GOT15: howto manager. (line 1965)
-* BFD_RELOC_SCORE_GOT_LO16: howto manager. (line 1966)
-* BFD_RELOC_SCORE_GPREL15: howto manager. (line 1940)
-* BFD_RELOC_SCORE_IMM30: howto manager. (line 1950)
-* BFD_RELOC_SCORE_IMM32: howto manager. (line 1953)
-* BFD_RELOC_SCORE_JMP: howto manager. (line 1944)
-* BFD_RELOC_SH_ALIGN: howto manager. (line 971)
-* BFD_RELOC_SH_CODE: howto manager. (line 972)
-* BFD_RELOC_SH_COPY: howto manager. (line 977)
-* BFD_RELOC_SH_COPY64: howto manager. (line 1002)
-* BFD_RELOC_SH_COUNT: howto manager. (line 970)
-* BFD_RELOC_SH_DATA: howto manager. (line 973)
-* BFD_RELOC_SH_DISP12: howto manager. (line 953)
-* BFD_RELOC_SH_DISP12BY2: howto manager. (line 954)
-* BFD_RELOC_SH_DISP12BY4: howto manager. (line 955)
-* BFD_RELOC_SH_DISP12BY8: howto manager. (line 956)
-* BFD_RELOC_SH_DISP20: howto manager. (line 957)
-* BFD_RELOC_SH_DISP20BY8: howto manager. (line 958)
-* BFD_RELOC_SH_FUNCDESC: howto manager. (line 1045)
-* BFD_RELOC_SH_GLOB_DAT: howto manager. (line 978)
-* BFD_RELOC_SH_GLOB_DAT64: howto manager. (line 1003)
-* BFD_RELOC_SH_GOT10BY4: howto manager. (line 1006)
-* BFD_RELOC_SH_GOT10BY8: howto manager. (line 1007)
-* BFD_RELOC_SH_GOT20: howto manager. (line 1039)
-* BFD_RELOC_SH_GOT_HI16: howto manager. (line 985)
-* BFD_RELOC_SH_GOT_LOW16: howto manager. (line 982)
-* BFD_RELOC_SH_GOT_MEDHI16: howto manager. (line 984)
-* BFD_RELOC_SH_GOT_MEDLOW16: howto manager. (line 983)
-* BFD_RELOC_SH_GOTFUNCDESC: howto manager. (line 1041)
-* BFD_RELOC_SH_GOTFUNCDESC20: howto manager. (line 1042)
-* BFD_RELOC_SH_GOTOFF20: howto manager. (line 1040)
-* BFD_RELOC_SH_GOTOFF_HI16: howto manager. (line 997)
-* BFD_RELOC_SH_GOTOFF_LOW16: howto manager. (line 994)
-* BFD_RELOC_SH_GOTOFF_MEDHI16: howto manager. (line 996)
-* BFD_RELOC_SH_GOTOFF_MEDLOW16: howto manager. (line 995)
-* BFD_RELOC_SH_GOTOFFFUNCDESC: howto manager. (line 1043)
-* BFD_RELOC_SH_GOTOFFFUNCDESC20: howto manager. (line 1044)
-* BFD_RELOC_SH_GOTPC: howto manager. (line 981)
-* BFD_RELOC_SH_GOTPC_HI16: howto manager. (line 1001)
-* BFD_RELOC_SH_GOTPC_LOW16: howto manager. (line 998)
-* BFD_RELOC_SH_GOTPC_MEDHI16: howto manager. (line 1000)
-* BFD_RELOC_SH_GOTPC_MEDLOW16: howto manager. (line 999)
-* BFD_RELOC_SH_GOTPLT10BY4: howto manager. (line 1008)
-* BFD_RELOC_SH_GOTPLT10BY8: howto manager. (line 1009)
-* BFD_RELOC_SH_GOTPLT32: howto manager. (line 1010)
-* BFD_RELOC_SH_GOTPLT_HI16: howto manager. (line 989)
-* BFD_RELOC_SH_GOTPLT_LOW16: howto manager. (line 986)
-* BFD_RELOC_SH_GOTPLT_MEDHI16: howto manager. (line 988)
-* BFD_RELOC_SH_GOTPLT_MEDLOW16: howto manager. (line 987)
-* BFD_RELOC_SH_IMM3: howto manager. (line 951)
-* BFD_RELOC_SH_IMM3U: howto manager. (line 952)
-* BFD_RELOC_SH_IMM4: howto manager. (line 959)
-* BFD_RELOC_SH_IMM4BY2: howto manager. (line 960)
-* BFD_RELOC_SH_IMM4BY4: howto manager. (line 961)
-* BFD_RELOC_SH_IMM8: howto manager. (line 962)
-* BFD_RELOC_SH_IMM8BY2: howto manager. (line 963)
-* BFD_RELOC_SH_IMM8BY4: howto manager. (line 964)
-* BFD_RELOC_SH_IMM_HI16: howto manager. (line 1028)
-* BFD_RELOC_SH_IMM_HI16_PCREL: howto manager. (line 1029)
-* BFD_RELOC_SH_IMM_LOW16: howto manager. (line 1022)
-* BFD_RELOC_SH_IMM_LOW16_PCREL: howto manager. (line 1023)
-* BFD_RELOC_SH_IMM_MEDHI16: howto manager. (line 1026)
-* BFD_RELOC_SH_IMM_MEDHI16_PCREL: howto manager. (line 1027)
-* BFD_RELOC_SH_IMM_MEDLOW16: howto manager. (line 1024)
-* BFD_RELOC_SH_IMM_MEDLOW16_PCREL: howto manager. (line 1025)
-* BFD_RELOC_SH_IMMS10: howto manager. (line 1016)
-* BFD_RELOC_SH_IMMS10BY2: howto manager. (line 1017)
-* BFD_RELOC_SH_IMMS10BY4: howto manager. (line 1018)
-* BFD_RELOC_SH_IMMS10BY8: howto manager. (line 1019)
-* BFD_RELOC_SH_IMMS16: howto manager. (line 1020)
-* BFD_RELOC_SH_IMMS6: howto manager. (line 1013)
-* BFD_RELOC_SH_IMMS6BY32: howto manager. (line 1014)
-* BFD_RELOC_SH_IMMU16: howto manager. (line 1021)
-* BFD_RELOC_SH_IMMU5: howto manager. (line 1012)
-* BFD_RELOC_SH_IMMU6: howto manager. (line 1015)
-* BFD_RELOC_SH_JMP_SLOT: howto manager. (line 979)
-* BFD_RELOC_SH_JMP_SLOT64: howto manager. (line 1004)
-* BFD_RELOC_SH_LABEL: howto manager. (line 974)
-* BFD_RELOC_SH_LOOP_END: howto manager. (line 976)
-* BFD_RELOC_SH_LOOP_START: howto manager. (line 975)
-* BFD_RELOC_SH_PCDISP12BY2: howto manager. (line 950)
-* BFD_RELOC_SH_PCDISP8BY2: howto manager. (line 949)
-* BFD_RELOC_SH_PCRELIMM8BY2: howto manager. (line 965)
-* BFD_RELOC_SH_PCRELIMM8BY4: howto manager. (line 966)
-* BFD_RELOC_SH_PLT_HI16: howto manager. (line 993)
-* BFD_RELOC_SH_PLT_LOW16: howto manager. (line 990)
-* BFD_RELOC_SH_PLT_MEDHI16: howto manager. (line 992)
-* BFD_RELOC_SH_PLT_MEDLOW16: howto manager. (line 991)
-* BFD_RELOC_SH_PT_16: howto manager. (line 1030)
-* BFD_RELOC_SH_RELATIVE: howto manager. (line 980)
-* BFD_RELOC_SH_RELATIVE64: howto manager. (line 1005)
-* BFD_RELOC_SH_SHMEDIA_CODE: howto manager. (line 1011)
-* BFD_RELOC_SH_SWITCH16: howto manager. (line 967)
-* BFD_RELOC_SH_SWITCH32: howto manager. (line 968)
-* BFD_RELOC_SH_TLS_DTPMOD32: howto manager. (line 1036)
-* BFD_RELOC_SH_TLS_DTPOFF32: howto manager. (line 1037)
-* BFD_RELOC_SH_TLS_GD_32: howto manager. (line 1031)
-* BFD_RELOC_SH_TLS_IE_32: howto manager. (line 1034)
-* BFD_RELOC_SH_TLS_LD_32: howto manager. (line 1032)
-* BFD_RELOC_SH_TLS_LDO_32: howto manager. (line 1033)
-* BFD_RELOC_SH_TLS_LE_32: howto manager. (line 1035)
-* BFD_RELOC_SH_TLS_TPOFF32: howto manager. (line 1038)
-* BFD_RELOC_SH_USES: howto manager. (line 969)
-* BFD_RELOC_SIZE32: howto manager. (line 74)
-* BFD_RELOC_SIZE64: howto manager. (line 75)
-* BFD_RELOC_SPARC13: howto manager. (line 138)
-* BFD_RELOC_SPARC22: howto manager. (line 137)
-* BFD_RELOC_SPARC_10: howto manager. (line 167)
-* BFD_RELOC_SPARC_11: howto manager. (line 168)
-* BFD_RELOC_SPARC_5: howto manager. (line 180)
-* BFD_RELOC_SPARC_6: howto manager. (line 179)
-* BFD_RELOC_SPARC_64: howto manager. (line 166)
-* BFD_RELOC_SPARC_7: howto manager. (line 178)
-* BFD_RELOC_SPARC_BASE13: howto manager. (line 162)
-* BFD_RELOC_SPARC_BASE22: howto manager. (line 163)
-* BFD_RELOC_SPARC_COPY: howto manager. (line 145)
-* BFD_RELOC_SPARC_DISP64: howto manager. (line 181)
-* BFD_RELOC_SPARC_GLOB_DAT: howto manager. (line 146)
-* BFD_RELOC_SPARC_GOT10: howto manager. (line 139)
-* BFD_RELOC_SPARC_GOT13: howto manager. (line 140)
-* BFD_RELOC_SPARC_GOT22: howto manager. (line 141)
-* BFD_RELOC_SPARC_GOTDATA_HIX22: howto manager. (line 152)
-* BFD_RELOC_SPARC_GOTDATA_LOX10: howto manager. (line 153)
-* BFD_RELOC_SPARC_GOTDATA_OP: howto manager. (line 156)
-* BFD_RELOC_SPARC_GOTDATA_OP_HIX22: howto manager. (line 154)
-* BFD_RELOC_SPARC_GOTDATA_OP_LOX10: howto manager. (line 155)
-* BFD_RELOC_SPARC_H34: howto manager. (line 190)
-* BFD_RELOC_SPARC_H44: howto manager. (line 186)
-* BFD_RELOC_SPARC_HH22: howto manager. (line 170)
-* BFD_RELOC_SPARC_HIX22: howto manager. (line 184)
-* BFD_RELOC_SPARC_HM10: howto manager. (line 171)
-* BFD_RELOC_SPARC_IRELATIVE: howto manager. (line 158)
-* BFD_RELOC_SPARC_JMP_IREL: howto manager. (line 157)
-* BFD_RELOC_SPARC_JMP_SLOT: howto manager. (line 147)
-* BFD_RELOC_SPARC_L44: howto manager. (line 188)
-* BFD_RELOC_SPARC_LM22: howto manager. (line 172)
-* BFD_RELOC_SPARC_LOX10: howto manager. (line 185)
-* BFD_RELOC_SPARC_M44: howto manager. (line 187)
-* BFD_RELOC_SPARC_OLO10: howto manager. (line 169)
-* BFD_RELOC_SPARC_PC10: howto manager. (line 142)
-* BFD_RELOC_SPARC_PC22: howto manager. (line 143)
-* BFD_RELOC_SPARC_PC_HH22: howto manager. (line 173)
-* BFD_RELOC_SPARC_PC_HM10: howto manager. (line 174)
-* BFD_RELOC_SPARC_PC_LM22: howto manager. (line 175)
-* BFD_RELOC_SPARC_PLT32: howto manager. (line 182)
-* BFD_RELOC_SPARC_PLT64: howto manager. (line 183)
-* BFD_RELOC_SPARC_REGISTER: howto manager. (line 189)
-* BFD_RELOC_SPARC_RELATIVE: howto manager. (line 148)
-* BFD_RELOC_SPARC_REV32: howto manager. (line 196)
-* BFD_RELOC_SPARC_SIZE32: howto manager. (line 191)
-* BFD_RELOC_SPARC_SIZE64: howto manager. (line 192)
-* BFD_RELOC_SPARC_TLS_DTPMOD32: howto manager. (line 217)
-* BFD_RELOC_SPARC_TLS_DTPMOD64: howto manager. (line 218)
-* BFD_RELOC_SPARC_TLS_DTPOFF32: howto manager. (line 219)
-* BFD_RELOC_SPARC_TLS_DTPOFF64: howto manager. (line 220)
-* BFD_RELOC_SPARC_TLS_GD_ADD: howto manager. (line 201)
-* BFD_RELOC_SPARC_TLS_GD_CALL: howto manager. (line 202)
-* BFD_RELOC_SPARC_TLS_GD_HI22: howto manager. (line 199)
-* BFD_RELOC_SPARC_TLS_GD_LO10: howto manager. (line 200)
-* BFD_RELOC_SPARC_TLS_IE_ADD: howto manager. (line 214)
-* BFD_RELOC_SPARC_TLS_IE_HI22: howto manager. (line 210)
-* BFD_RELOC_SPARC_TLS_IE_LD: howto manager. (line 212)
-* BFD_RELOC_SPARC_TLS_IE_LDX: howto manager. (line 213)
-* BFD_RELOC_SPARC_TLS_IE_LO10: howto manager. (line 211)
-* BFD_RELOC_SPARC_TLS_LDM_ADD: howto manager. (line 205)
-* BFD_RELOC_SPARC_TLS_LDM_CALL: howto manager. (line 206)
-* BFD_RELOC_SPARC_TLS_LDM_HI22: howto manager. (line 203)
-* BFD_RELOC_SPARC_TLS_LDM_LO10: howto manager. (line 204)
-* BFD_RELOC_SPARC_TLS_LDO_ADD: howto manager. (line 209)
-* BFD_RELOC_SPARC_TLS_LDO_HIX22: howto manager. (line 207)
-* BFD_RELOC_SPARC_TLS_LDO_LOX10: howto manager. (line 208)
-* BFD_RELOC_SPARC_TLS_LE_HIX22: howto manager. (line 215)
-* BFD_RELOC_SPARC_TLS_LE_LOX10: howto manager. (line 216)
-* BFD_RELOC_SPARC_TLS_TPOFF32: howto manager. (line 221)
-* BFD_RELOC_SPARC_TLS_TPOFF64: howto manager. (line 222)
-* BFD_RELOC_SPARC_UA16: howto manager. (line 149)
-* BFD_RELOC_SPARC_UA32: howto manager. (line 150)
-* BFD_RELOC_SPARC_UA64: howto manager. (line 151)
-* BFD_RELOC_SPARC_WDISP10: howto manager. (line 193)
-* BFD_RELOC_SPARC_WDISP16: howto manager. (line 176)
-* BFD_RELOC_SPARC_WDISP19: howto manager. (line 177)
-* BFD_RELOC_SPARC_WDISP22: howto manager. (line 136)
-* BFD_RELOC_SPARC_WPLT30: howto manager. (line 144)
-* BFD_RELOC_SPU_ADD_PIC: howto manager. (line 239)
-* BFD_RELOC_SPU_HI16: howto manager. (line 236)
-* BFD_RELOC_SPU_IMM10: howto manager. (line 227)
-* BFD_RELOC_SPU_IMM10W: howto manager. (line 228)
-* BFD_RELOC_SPU_IMM16: howto manager. (line 229)
-* BFD_RELOC_SPU_IMM16W: howto manager. (line 230)
-* BFD_RELOC_SPU_IMM18: howto manager. (line 231)
-* BFD_RELOC_SPU_IMM7: howto manager. (line 225)
-* BFD_RELOC_SPU_IMM8: howto manager. (line 226)
-* BFD_RELOC_SPU_LO16: howto manager. (line 235)
-* BFD_RELOC_SPU_PCREL16: howto manager. (line 234)
-* BFD_RELOC_SPU_PCREL9a: howto manager. (line 232)
-* BFD_RELOC_SPU_PCREL9b: howto manager. (line 233)
-* BFD_RELOC_SPU_PPU32: howto manager. (line 237)
-* BFD_RELOC_SPU_PPU64: howto manager. (line 238)
-* BFD_RELOC_THUMB_PCREL_BLX: howto manager. (line 798)
-* BFD_RELOC_THUMB_PCREL_BRANCH12: howto manager. (line 812)
-* BFD_RELOC_THUMB_PCREL_BRANCH20: howto manager. (line 813)
-* BFD_RELOC_THUMB_PCREL_BRANCH23: howto manager. (line 814)
-* BFD_RELOC_THUMB_PCREL_BRANCH25: howto manager. (line 815)
-* BFD_RELOC_THUMB_PCREL_BRANCH7: howto manager. (line 810)
-* BFD_RELOC_THUMB_PCREL_BRANCH9: howto manager. (line 811)
-* BFD_RELOC_TIC30_LDP: howto manager. (line 1430)
-* BFD_RELOC_TIC54X_16_OF_23: howto manager. (line 1448)
-* BFD_RELOC_TIC54X_23: howto manager. (line 1445)
-* BFD_RELOC_TIC54X_MS7_OF_23: howto manager. (line 1453)
-* BFD_RELOC_TIC54X_PARTLS7: howto manager. (line 1435)
-* BFD_RELOC_TIC54X_PARTMS9: howto manager. (line 1440)
-* BFD_RELOC_TILEGX_BROFF_X1: howto manager. (line 3132)
-* BFD_RELOC_TILEGX_COPY: howto manager. (line 3128)
-* BFD_RELOC_TILEGX_DEST_IMM8_X1: howto manager. (line 3139)
-* BFD_RELOC_TILEGX_GLOB_DAT: howto manager. (line 3129)
-* BFD_RELOC_TILEGX_HW0: howto manager. (line 3121)
-* BFD_RELOC_TILEGX_HW0_LAST: howto manager. (line 3125)
-* BFD_RELOC_TILEGX_HW1: howto manager. (line 3122)
-* BFD_RELOC_TILEGX_HW1_LAST: howto manager. (line 3126)
-* BFD_RELOC_TILEGX_HW2: howto manager. (line 3123)
-* BFD_RELOC_TILEGX_HW2_LAST: howto manager. (line 3127)
-* BFD_RELOC_TILEGX_HW3: howto manager. (line 3124)
-* BFD_RELOC_TILEGX_IMM16_X0_HW0: howto manager. (line 3148)
-* BFD_RELOC_TILEGX_IMM16_X0_HW0_GOT: howto manager. (line 3176)
-* BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST: howto manager. (line 3156)
-* BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_GOT: howto manager. (line 3184)
-* BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_PCREL: howto manager. (line 3170)
-* BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL: howto manager.
- (line 3204)
-* BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_GD: howto manager. (line 3198)
-* BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_IE: howto manager. (line 3210)
-* BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_LE: howto manager. (line 3194)
-* BFD_RELOC_TILEGX_IMM16_X0_HW0_PCREL: howto manager. (line 3162)
-* BFD_RELOC_TILEGX_IMM16_X0_HW0_PLT_PCREL: howto manager. (line 3178)
-* BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_GD: howto manager. (line 3190)
-* BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_IE: howto manager. (line 3202)
-* BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_LE: howto manager. (line 3192)
-* BFD_RELOC_TILEGX_IMM16_X0_HW1: howto manager. (line 3150)
-* BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST: howto manager. (line 3158)
-* BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_GOT: howto manager. (line 3186)
-* BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_PCREL: howto manager. (line 3172)
-* BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL: howto manager.
- (line 3206)
-* BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_GD: howto manager. (line 3200)
-* BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_IE: howto manager. (line 3212)
-* BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_LE: howto manager. (line 3196)
-* BFD_RELOC_TILEGX_IMM16_X0_HW1_PCREL: howto manager. (line 3164)
-* BFD_RELOC_TILEGX_IMM16_X0_HW1_PLT_PCREL: howto manager. (line 3180)
-* BFD_RELOC_TILEGX_IMM16_X0_HW2: howto manager. (line 3152)
-* BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST: howto manager. (line 3160)
-* BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST_PCREL: howto manager. (line 3174)
-* BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL: howto manager.
- (line 3208)
-* BFD_RELOC_TILEGX_IMM16_X0_HW2_PCREL: howto manager. (line 3166)
-* BFD_RELOC_TILEGX_IMM16_X0_HW2_PLT_PCREL: howto manager. (line 3182)
-* BFD_RELOC_TILEGX_IMM16_X0_HW3: howto manager. (line 3154)
-* BFD_RELOC_TILEGX_IMM16_X0_HW3_PCREL: howto manager. (line 3168)
-* BFD_RELOC_TILEGX_IMM16_X0_HW3_PLT_PCREL: howto manager. (line 3188)
-* BFD_RELOC_TILEGX_IMM16_X1_HW0: howto manager. (line 3149)
-* BFD_RELOC_TILEGX_IMM16_X1_HW0_GOT: howto manager. (line 3177)
-* BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST: howto manager. (line 3157)
-* BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_GOT: howto manager. (line 3185)
-* BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_PCREL: howto manager. (line 3171)
-* BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL: howto manager.
- (line 3205)
-* BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_GD: howto manager. (line 3199)
-* BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_IE: howto manager. (line 3211)
-* BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_LE: howto manager. (line 3195)
-* BFD_RELOC_TILEGX_IMM16_X1_HW0_PCREL: howto manager. (line 3163)
-* BFD_RELOC_TILEGX_IMM16_X1_HW0_PLT_PCREL: howto manager. (line 3179)
-* BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_GD: howto manager. (line 3191)
-* BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_IE: howto manager. (line 3203)
-* BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_LE: howto manager. (line 3193)
-* BFD_RELOC_TILEGX_IMM16_X1_HW1: howto manager. (line 3151)
-* BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST: howto manager. (line 3159)
-* BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_GOT: howto manager. (line 3187)
-* BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_PCREL: howto manager. (line 3173)
-* BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL: howto manager.
- (line 3207)
-* BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_GD: howto manager. (line 3201)
-* BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_IE: howto manager. (line 3213)
-* BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_LE: howto manager. (line 3197)
-* BFD_RELOC_TILEGX_IMM16_X1_HW1_PCREL: howto manager. (line 3165)
-* BFD_RELOC_TILEGX_IMM16_X1_HW1_PLT_PCREL: howto manager. (line 3181)
-* BFD_RELOC_TILEGX_IMM16_X1_HW2: howto manager. (line 3153)
-* BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST: howto manager. (line 3161)
-* BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST_PCREL: howto manager. (line 3175)
-* BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL: howto manager.
- (line 3209)
-* BFD_RELOC_TILEGX_IMM16_X1_HW2_PCREL: howto manager. (line 3167)
-* BFD_RELOC_TILEGX_IMM16_X1_HW2_PLT_PCREL: howto manager. (line 3183)
-* BFD_RELOC_TILEGX_IMM16_X1_HW3: howto manager. (line 3155)
-* BFD_RELOC_TILEGX_IMM16_X1_HW3_PCREL: howto manager. (line 3169)
-* BFD_RELOC_TILEGX_IMM16_X1_HW3_PLT_PCREL: howto manager. (line 3189)
-* BFD_RELOC_TILEGX_IMM8_X0: howto manager. (line 3135)
-* BFD_RELOC_TILEGX_IMM8_X0_TLS_ADD: howto manager. (line 3226)
-* BFD_RELOC_TILEGX_IMM8_X0_TLS_GD_ADD: howto manager. (line 3221)
-* BFD_RELOC_TILEGX_IMM8_X1: howto manager. (line 3137)
-* BFD_RELOC_TILEGX_IMM8_X1_TLS_ADD: howto manager. (line 3227)
-* BFD_RELOC_TILEGX_IMM8_X1_TLS_GD_ADD: howto manager. (line 3222)
-* BFD_RELOC_TILEGX_IMM8_Y0: howto manager. (line 3136)
-* BFD_RELOC_TILEGX_IMM8_Y0_TLS_ADD: howto manager. (line 3228)
-* BFD_RELOC_TILEGX_IMM8_Y0_TLS_GD_ADD: howto manager. (line 3223)
-* BFD_RELOC_TILEGX_IMM8_Y1: howto manager. (line 3138)
-* BFD_RELOC_TILEGX_IMM8_Y1_TLS_ADD: howto manager. (line 3229)
-* BFD_RELOC_TILEGX_IMM8_Y1_TLS_GD_ADD: howto manager. (line 3224)
-* BFD_RELOC_TILEGX_JMP_SLOT: howto manager. (line 3130)
-* BFD_RELOC_TILEGX_JUMPOFF_X1: howto manager. (line 3133)
-* BFD_RELOC_TILEGX_JUMPOFF_X1_PLT: howto manager. (line 3134)
-* BFD_RELOC_TILEGX_MF_IMM14_X1: howto manager. (line 3141)
-* BFD_RELOC_TILEGX_MMEND_X0: howto manager. (line 3143)
-* BFD_RELOC_TILEGX_MMSTART_X0: howto manager. (line 3142)
-* BFD_RELOC_TILEGX_MT_IMM14_X1: howto manager. (line 3140)
-* BFD_RELOC_TILEGX_RELATIVE: howto manager. (line 3131)
-* BFD_RELOC_TILEGX_SHAMT_X0: howto manager. (line 3144)
-* BFD_RELOC_TILEGX_SHAMT_X1: howto manager. (line 3145)
-* BFD_RELOC_TILEGX_SHAMT_Y0: howto manager. (line 3146)
-* BFD_RELOC_TILEGX_SHAMT_Y1: howto manager. (line 3147)
-* BFD_RELOC_TILEGX_TLS_DTPMOD32: howto manager. (line 3217)
-* BFD_RELOC_TILEGX_TLS_DTPMOD64: howto manager. (line 3214)
-* BFD_RELOC_TILEGX_TLS_DTPOFF32: howto manager. (line 3218)
-* BFD_RELOC_TILEGX_TLS_DTPOFF64: howto manager. (line 3215)
-* BFD_RELOC_TILEGX_TLS_GD_CALL: howto manager. (line 3220)
-* BFD_RELOC_TILEGX_TLS_IE_LOAD: howto manager. (line 3225)
-* BFD_RELOC_TILEGX_TLS_TPOFF32: howto manager. (line 3219)
-* BFD_RELOC_TILEGX_TLS_TPOFF64: howto manager. (line 3216)
-* BFD_RELOC_TILEPRO_BROFF_X1: howto manager. (line 3044)
-* BFD_RELOC_TILEPRO_COPY: howto manager. (line 3040)
-* BFD_RELOC_TILEPRO_DEST_IMM8_X1: howto manager. (line 3051)
-* BFD_RELOC_TILEPRO_GLOB_DAT: howto manager. (line 3041)
-* BFD_RELOC_TILEPRO_IMM16_X0: howto manager. (line 3054)
-* BFD_RELOC_TILEPRO_IMM16_X0_GOT: howto manager. (line 3070)
-* BFD_RELOC_TILEPRO_IMM16_X0_GOT_HA: howto manager. (line 3076)
-* BFD_RELOC_TILEPRO_IMM16_X0_GOT_HI: howto manager. (line 3074)
-* BFD_RELOC_TILEPRO_IMM16_X0_GOT_LO: howto manager. (line 3072)
-* BFD_RELOC_TILEPRO_IMM16_X0_HA: howto manager. (line 3060)
-* BFD_RELOC_TILEPRO_IMM16_X0_HA_PCREL: howto manager. (line 3068)
-* BFD_RELOC_TILEPRO_IMM16_X0_HI: howto manager. (line 3058)
-* BFD_RELOC_TILEPRO_IMM16_X0_HI_PCREL: howto manager. (line 3066)
-* BFD_RELOC_TILEPRO_IMM16_X0_LO: howto manager. (line 3056)
-* BFD_RELOC_TILEPRO_IMM16_X0_LO_PCREL: howto manager. (line 3064)
-* BFD_RELOC_TILEPRO_IMM16_X0_PCREL: howto manager. (line 3062)
-* BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD: howto manager. (line 3092)
-* BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_HA: howto manager. (line 3098)
-* BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_HI: howto manager. (line 3096)
-* BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_LO: howto manager. (line 3094)
-* BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE: howto manager. (line 3100)
-* BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_HA: howto manager. (line 3106)
-* BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_HI: howto manager. (line 3104)
-* BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_LO: howto manager. (line 3102)
-* BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE: howto manager. (line 3111)
-* BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_HA: howto manager. (line 3117)
-* BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_HI: howto manager. (line 3115)
-* BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_LO: howto manager. (line 3113)
-* BFD_RELOC_TILEPRO_IMM16_X1: howto manager. (line 3055)
-* BFD_RELOC_TILEPRO_IMM16_X1_GOT: howto manager. (line 3071)
-* BFD_RELOC_TILEPRO_IMM16_X1_GOT_HA: howto manager. (line 3077)
-* BFD_RELOC_TILEPRO_IMM16_X1_GOT_HI: howto manager. (line 3075)
-* BFD_RELOC_TILEPRO_IMM16_X1_GOT_LO: howto manager. (line 3073)
-* BFD_RELOC_TILEPRO_IMM16_X1_HA: howto manager. (line 3061)
-* BFD_RELOC_TILEPRO_IMM16_X1_HA_PCREL: howto manager. (line 3069)
-* BFD_RELOC_TILEPRO_IMM16_X1_HI: howto manager. (line 3059)
-* BFD_RELOC_TILEPRO_IMM16_X1_HI_PCREL: howto manager. (line 3067)
-* BFD_RELOC_TILEPRO_IMM16_X1_LO: howto manager. (line 3057)
-* BFD_RELOC_TILEPRO_IMM16_X1_LO_PCREL: howto manager. (line 3065)
-* BFD_RELOC_TILEPRO_IMM16_X1_PCREL: howto manager. (line 3063)
-* BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD: howto manager. (line 3093)
-* BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_HA: howto manager. (line 3099)
-* BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_HI: howto manager. (line 3097)
-* BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_LO: howto manager. (line 3095)
-* BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE: howto manager. (line 3101)
-* BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_HA: howto manager. (line 3107)
-* BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_HI: howto manager. (line 3105)
-* BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_LO: howto manager. (line 3103)
-* BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE: howto manager. (line 3112)
-* BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_HA: howto manager. (line 3118)
-* BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_HI: howto manager. (line 3116)
-* BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_LO: howto manager. (line 3114)
-* BFD_RELOC_TILEPRO_IMM8_X0: howto manager. (line 3047)
-* BFD_RELOC_TILEPRO_IMM8_X0_TLS_GD_ADD: howto manager. (line 3087)
-* BFD_RELOC_TILEPRO_IMM8_X1: howto manager. (line 3049)
-* BFD_RELOC_TILEPRO_IMM8_X1_TLS_GD_ADD: howto manager. (line 3088)
-* BFD_RELOC_TILEPRO_IMM8_Y0: howto manager. (line 3048)
-* BFD_RELOC_TILEPRO_IMM8_Y0_TLS_GD_ADD: howto manager. (line 3089)
-* BFD_RELOC_TILEPRO_IMM8_Y1: howto manager. (line 3050)
-* BFD_RELOC_TILEPRO_IMM8_Y1_TLS_GD_ADD: howto manager. (line 3090)
-* BFD_RELOC_TILEPRO_JMP_SLOT: howto manager. (line 3042)
-* BFD_RELOC_TILEPRO_JOFFLONG_X1: howto manager. (line 3045)
-* BFD_RELOC_TILEPRO_JOFFLONG_X1_PLT: howto manager. (line 3046)
-* BFD_RELOC_TILEPRO_MF_IMM15_X1: howto manager. (line 3053)
-* BFD_RELOC_TILEPRO_MMEND_X0: howto manager. (line 3079)
-* BFD_RELOC_TILEPRO_MMEND_X1: howto manager. (line 3081)
-* BFD_RELOC_TILEPRO_MMSTART_X0: howto manager. (line 3078)
-* BFD_RELOC_TILEPRO_MMSTART_X1: howto manager. (line 3080)
-* BFD_RELOC_TILEPRO_MT_IMM15_X1: howto manager. (line 3052)
-* BFD_RELOC_TILEPRO_RELATIVE: howto manager. (line 3043)
-* BFD_RELOC_TILEPRO_SHAMT_X0: howto manager. (line 3082)
-* BFD_RELOC_TILEPRO_SHAMT_X1: howto manager. (line 3083)
-* BFD_RELOC_TILEPRO_SHAMT_Y0: howto manager. (line 3084)
-* BFD_RELOC_TILEPRO_SHAMT_Y1: howto manager. (line 3085)
-* BFD_RELOC_TILEPRO_TLS_DTPMOD32: howto manager. (line 3108)
-* BFD_RELOC_TILEPRO_TLS_DTPOFF32: howto manager. (line 3109)
-* BFD_RELOC_TILEPRO_TLS_GD_CALL: howto manager. (line 3086)
-* BFD_RELOC_TILEPRO_TLS_IE_LOAD: howto manager. (line 3091)
-* BFD_RELOC_TILEPRO_TLS_TPOFF32: howto manager. (line 3110)
-* bfd_reloc_type_lookup: howto manager. (line 3255)
-* BFD_RELOC_V850_16_GOT: howto manager. (line 1394)
-* BFD_RELOC_V850_16_GOTOFF: howto manager. (line 1418)
-* BFD_RELOC_V850_16_PCREL: howto manager. (line 1364)
-* BFD_RELOC_V850_16_S1: howto manager. (line 1382)
-* BFD_RELOC_V850_16_SPLIT_OFFSET: howto manager. (line 1379)
-* BFD_RELOC_V850_17_PCREL: howto manager. (line 1367)
-* BFD_RELOC_V850_22_PCREL: howto manager. (line 1299)
-* BFD_RELOC_V850_22_PLT_PCREL: howto manager. (line 1400)
-* BFD_RELOC_V850_23: howto manager. (line 1370)
-* BFD_RELOC_V850_32_ABS: howto manager. (line 1376)
-* BFD_RELOC_V850_32_GOT: howto manager. (line 1397)
-* BFD_RELOC_V850_32_GOTOFF: howto manager. (line 1421)
-* BFD_RELOC_V850_32_GOTPCREL: howto manager. (line 1391)
-* BFD_RELOC_V850_32_PCREL: howto manager. (line 1373)
-* BFD_RELOC_V850_32_PLT_PCREL: howto manager. (line 1403)
-* BFD_RELOC_V850_9_PCREL: howto manager. (line 1296)
-* BFD_RELOC_V850_ALIGN: howto manager. (line 1357)
-* BFD_RELOC_V850_CALLT_15_16_OFFSET: howto manager. (line 1388)
-* BFD_RELOC_V850_CALLT_16_16_OFFSET: howto manager. (line 1348)
-* BFD_RELOC_V850_CALLT_6_7_OFFSET: howto manager. (line 1345)
-* BFD_RELOC_V850_CODE: howto manager. (line 1424)
-* BFD_RELOC_V850_COPY: howto manager. (line 1406)
-* BFD_RELOC_V850_DATA: howto manager. (line 1427)
-* BFD_RELOC_V850_GLOB_DAT: howto manager. (line 1409)
-* BFD_RELOC_V850_JMP_SLOT: howto manager. (line 1412)
-* BFD_RELOC_V850_LO16_S1: howto manager. (line 1385)
-* BFD_RELOC_V850_LO16_SPLIT_OFFSET: howto manager. (line 1360)
-* BFD_RELOC_V850_LONGCALL: howto manager. (line 1351)
-* BFD_RELOC_V850_LONGJUMP: howto manager. (line 1354)
-* BFD_RELOC_V850_RELATIVE: howto manager. (line 1415)
-* BFD_RELOC_V850_SDA_15_16_OFFSET: howto manager. (line 1305)
-* BFD_RELOC_V850_SDA_16_16_OFFSET: howto manager. (line 1302)
-* BFD_RELOC_V850_SDA_16_16_SPLIT_OFFSET: howto manager. (line 1337)
-* BFD_RELOC_V850_TDA_16_16_OFFSET: howto manager. (line 1327)
-* BFD_RELOC_V850_TDA_4_4_OFFSET: howto manager. (line 1334)
-* BFD_RELOC_V850_TDA_4_5_OFFSET: howto manager. (line 1330)
-* BFD_RELOC_V850_TDA_6_8_OFFSET: howto manager. (line 1316)
-* BFD_RELOC_V850_TDA_7_7_OFFSET: howto manager. (line 1324)
-* BFD_RELOC_V850_TDA_7_8_OFFSET: howto manager. (line 1320)
-* BFD_RELOC_V850_ZDA_15_16_OFFSET: howto manager. (line 1312)
-* BFD_RELOC_V850_ZDA_16_16_OFFSET: howto manager. (line 1309)
-* BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET: howto manager. (line 1341)
-* BFD_RELOC_VAX_GLOB_DAT: howto manager. (line 2425)
-* BFD_RELOC_VAX_JMP_SLOT: howto manager. (line 2426)
-* BFD_RELOC_VAX_RELATIVE: howto manager. (line 2427)
-* BFD_RELOC_VPE4KMATH_DATA: howto manager. (line 2001)
-* BFD_RELOC_VPE4KMATH_INSN: howto manager. (line 2002)
-* BFD_RELOC_VTABLE_ENTRY: howto manager. (line 2006)
-* BFD_RELOC_VTABLE_INHERIT: howto manager. (line 2005)
-* BFD_RELOC_X86_64_32S: howto manager. (line 608)
-* BFD_RELOC_X86_64_COPY: howto manager. (line 603)
-* BFD_RELOC_X86_64_DTPMOD64: howto manager. (line 609)
-* BFD_RELOC_X86_64_DTPOFF32: howto manager. (line 614)
-* BFD_RELOC_X86_64_DTPOFF64: howto manager. (line 610)
-* BFD_RELOC_X86_64_GLOB_DAT: howto manager. (line 604)
-* BFD_RELOC_X86_64_GOT32: howto manager. (line 601)
-* BFD_RELOC_X86_64_GOT64: howto manager. (line 619)
-* BFD_RELOC_X86_64_GOTOFF64: howto manager. (line 617)
-* BFD_RELOC_X86_64_GOTPC32: howto manager. (line 618)
-* BFD_RELOC_X86_64_GOTPC32_TLSDESC: howto manager. (line 624)
-* BFD_RELOC_X86_64_GOTPC64: howto manager. (line 621)
-* BFD_RELOC_X86_64_GOTPCREL: howto manager. (line 607)
-* BFD_RELOC_X86_64_GOTPCREL64: howto manager. (line 620)
-* BFD_RELOC_X86_64_GOTPLT64: howto manager. (line 622)
-* BFD_RELOC_X86_64_GOTTPOFF: howto manager. (line 615)
-* BFD_RELOC_X86_64_IRELATIVE: howto manager. (line 627)
-* BFD_RELOC_X86_64_JUMP_SLOT: howto manager. (line 605)
-* BFD_RELOC_X86_64_PC32_BND: howto manager. (line 628)
-* BFD_RELOC_X86_64_PLT32: howto manager. (line 602)
-* BFD_RELOC_X86_64_PLT32_BND: howto manager. (line 629)
-* BFD_RELOC_X86_64_PLTOFF64: howto manager. (line 623)
-* BFD_RELOC_X86_64_RELATIVE: howto manager. (line 606)
-* BFD_RELOC_X86_64_TLSDESC: howto manager. (line 626)
-* BFD_RELOC_X86_64_TLSDESC_CALL: howto manager. (line 625)
-* BFD_RELOC_X86_64_TLSGD: howto manager. (line 612)
-* BFD_RELOC_X86_64_TLSLD: howto manager. (line 613)
-* BFD_RELOC_X86_64_TPOFF32: howto manager. (line 616)
-* BFD_RELOC_X86_64_TPOFF64: howto manager. (line 611)
-* BFD_RELOC_XC16X_PAG: howto manager. (line 2419)
-* BFD_RELOC_XC16X_POF: howto manager. (line 2420)
-* BFD_RELOC_XC16X_SEG: howto manager. (line 2421)
-* BFD_RELOC_XC16X_SOF: howto manager. (line 2422)
-* BFD_RELOC_XGATE_24: howto manager. (line 2164)
-* BFD_RELOC_XGATE_GPAGE: howto manager. (line 2161)
-* BFD_RELOC_XGATE_IMM3: howto manager. (line 2181)
-* BFD_RELOC_XGATE_IMM4: howto manager. (line 2184)
-* BFD_RELOC_XGATE_IMM5: howto manager. (line 2187)
-* BFD_RELOC_XGATE_IMM8_HI: howto manager. (line 2177)
-* BFD_RELOC_XGATE_IMM8_LO: howto manager. (line 2173)
-* BFD_RELOC_XGATE_LO16: howto manager. (line 2157)
-* BFD_RELOC_XGATE_PCREL_10: howto manager. (line 2170)
-* BFD_RELOC_XGATE_PCREL_9: howto manager. (line 2167)
-* BFD_RELOC_XGATE_RL_GROUP: howto manager. (line 2152)
-* BFD_RELOC_XGATE_RL_JUMP: howto manager. (line 2148)
-* BFD_RELOC_XSTORMY16_12: howto manager. (line 2411)
-* BFD_RELOC_XSTORMY16_24: howto manager. (line 2412)
-* BFD_RELOC_XSTORMY16_FPTR16: howto manager. (line 2413)
-* BFD_RELOC_XSTORMY16_REL_12: howto manager. (line 2410)
-* BFD_RELOC_XTENSA_ASM_EXPAND: howto manager. (line 2582)
-* BFD_RELOC_XTENSA_ASM_SIMPLIFY: howto manager. (line 2587)
-* BFD_RELOC_XTENSA_DIFF16: howto manager. (line 2529)
-* BFD_RELOC_XTENSA_DIFF32: howto manager. (line 2530)
-* BFD_RELOC_XTENSA_DIFF8: howto manager. (line 2528)
-* BFD_RELOC_XTENSA_GLOB_DAT: howto manager. (line 2518)
-* BFD_RELOC_XTENSA_JMP_SLOT: howto manager. (line 2519)
-* BFD_RELOC_XTENSA_OP0: howto manager. (line 2576)
-* BFD_RELOC_XTENSA_OP1: howto manager. (line 2577)
-* BFD_RELOC_XTENSA_OP2: howto manager. (line 2578)
-* BFD_RELOC_XTENSA_PLT: howto manager. (line 2523)
-* BFD_RELOC_XTENSA_RELATIVE: howto manager. (line 2520)
-* BFD_RELOC_XTENSA_RTLD: howto manager. (line 2513)
-* BFD_RELOC_XTENSA_SLOT0_ALT: howto manager. (line 2558)
-* BFD_RELOC_XTENSA_SLOT0_OP: howto manager. (line 2538)
-* BFD_RELOC_XTENSA_SLOT10_ALT: howto manager. (line 2568)
-* BFD_RELOC_XTENSA_SLOT10_OP: howto manager. (line 2548)
-* BFD_RELOC_XTENSA_SLOT11_ALT: howto manager. (line 2569)
-* BFD_RELOC_XTENSA_SLOT11_OP: howto manager. (line 2549)
-* BFD_RELOC_XTENSA_SLOT12_ALT: howto manager. (line 2570)
-* BFD_RELOC_XTENSA_SLOT12_OP: howto manager. (line 2550)
-* BFD_RELOC_XTENSA_SLOT13_ALT: howto manager. (line 2571)
-* BFD_RELOC_XTENSA_SLOT13_OP: howto manager. (line 2551)
-* BFD_RELOC_XTENSA_SLOT14_ALT: howto manager. (line 2572)
-* BFD_RELOC_XTENSA_SLOT14_OP: howto manager. (line 2552)
-* BFD_RELOC_XTENSA_SLOT1_ALT: howto manager. (line 2559)
-* BFD_RELOC_XTENSA_SLOT1_OP: howto manager. (line 2539)
-* BFD_RELOC_XTENSA_SLOT2_ALT: howto manager. (line 2560)
-* BFD_RELOC_XTENSA_SLOT2_OP: howto manager. (line 2540)
-* BFD_RELOC_XTENSA_SLOT3_ALT: howto manager. (line 2561)
-* BFD_RELOC_XTENSA_SLOT3_OP: howto manager. (line 2541)
-* BFD_RELOC_XTENSA_SLOT4_ALT: howto manager. (line 2562)
-* BFD_RELOC_XTENSA_SLOT4_OP: howto manager. (line 2542)
-* BFD_RELOC_XTENSA_SLOT5_ALT: howto manager. (line 2563)
-* BFD_RELOC_XTENSA_SLOT5_OP: howto manager. (line 2543)
-* BFD_RELOC_XTENSA_SLOT6_ALT: howto manager. (line 2564)
-* BFD_RELOC_XTENSA_SLOT6_OP: howto manager. (line 2544)
-* BFD_RELOC_XTENSA_SLOT7_ALT: howto manager. (line 2565)
-* BFD_RELOC_XTENSA_SLOT7_OP: howto manager. (line 2545)
-* BFD_RELOC_XTENSA_SLOT8_ALT: howto manager. (line 2566)
-* BFD_RELOC_XTENSA_SLOT8_OP: howto manager. (line 2546)
-* BFD_RELOC_XTENSA_SLOT9_ALT: howto manager. (line 2567)
-* BFD_RELOC_XTENSA_SLOT9_OP: howto manager. (line 2547)
-* BFD_RELOC_XTENSA_TLS_ARG: howto manager. (line 2597)
-* BFD_RELOC_XTENSA_TLS_CALL: howto manager. (line 2598)
-* BFD_RELOC_XTENSA_TLS_DTPOFF: howto manager. (line 2594)
-* BFD_RELOC_XTENSA_TLS_FUNC: howto manager. (line 2596)
-* BFD_RELOC_XTENSA_TLS_TPOFF: howto manager. (line 2595)
-* BFD_RELOC_XTENSA_TLSDESC_ARG: howto manager. (line 2593)
-* BFD_RELOC_XTENSA_TLSDESC_FN: howto manager. (line 2592)
-* BFD_RELOC_Z80_DISP8: howto manager. (line 2601)
-* BFD_RELOC_Z8K_CALLR: howto manager. (line 2607)
-* BFD_RELOC_Z8K_DISP7: howto manager. (line 2604)
-* BFD_RELOC_Z8K_IMM4L: howto manager. (line 2610)
-* bfd_rename_section: section prototypes. (line 169)
-* bfd_scan_arch: Architectures. (line 500)
-* bfd_scan_vma: Miscellaneous. (line 124)
-* bfd_seach_for_target: bfd_target. (line 524)
-* bfd_section_already_linked: Writing the symbol table.
- (line 55)
-* bfd_section_list_clear: section prototypes. (line 8)
-* bfd_sections_find_if: section prototypes. (line 199)
-* bfd_set_arch_info: Architectures. (line 541)
-* bfd_set_archive_head: Archives. (line 75)
-* bfd_set_assert_handler: Error reporting. (line 141)
-* bfd_set_default_target: bfd_target. (line 463)
-* bfd_set_error: Error reporting. (line 57)
-* bfd_set_error_handler: Error reporting. (line 99)
-* bfd_set_error_program_name: Error reporting. (line 108)
-* bfd_set_file_flags: Miscellaneous. (line 44)
-* bfd_set_format: Formats. (line 68)
-* bfd_set_gp_size: Miscellaneous. (line 114)
-* bfd_set_private_flags: Miscellaneous. (line 191)
-* bfd_set_reloc: Miscellaneous. (line 34)
-* bfd_set_section_contents: section prototypes. (line 230)
-* bfd_set_section_flags: section prototypes. (line 154)
-* bfd_set_section_size: section prototypes. (line 216)
-* bfd_set_start_address: Miscellaneous. (line 93)
-* bfd_set_symtab: symbol handling functions.
- (line 60)
-* bfd_symbol_info: symbol handling functions.
- (line 130)
-* bfd_target_list: bfd_target. (line 515)
-* bfd_write_bigendian_4byte_int: Internal. (line 13)
-* bfd_zalloc: Opening and Closing.
- (line 236)
-* bfd_zalloc2: Opening and Closing.
- (line 245)
-* coff_symbol_type: coff. (line 245)
-* core_file_matches_executable_p: Core Files. (line 39)
-* find_separate_debug_file: Opening and Closing.
- (line 308)
-* generic_core_file_matches_executable_p: Core Files. (line 49)
-* Hash tables: Hash Tables. (line 6)
-* internal object-file format: Canonical format. (line 11)
-* Linker: Linker Functions. (line 6)
-* Other functions: Miscellaneous. (line 206)
-* separate_alt_debug_file_exists: Opening and Closing.
- (line 299)
-* separate_debug_file_exists: Opening and Closing.
- (line 290)
-* struct bfd_iovec: Miscellaneous. (line 370)
-* target vector (_bfd_final_link): Performing the Final Link.
- (line 6)
-* target vector (_bfd_link_add_symbols): Adding Symbols to the Hash Table.
- (line 6)
-* target vector (_bfd_link_hash_table_create): Creating a Linker Hash Table.
- (line 6)
-* The HOWTO Macro: typedef arelent. (line 288)
-* what is it?: Overview. (line 6)
-
-
-
-Tag Table:
-Node: Top1060
-Node: Overview1399
-Node: History2450
-Node: How It Works3396
-Node: What BFD Version 2 Can Do4939
-Node: BFD information loss6254
-Node: Canonical format8786
-Node: BFD front end13158
-Node: typedef bfd13582
-Node: Error reporting24300
-Node: Miscellaneous29167
-Node: Memory Usage46310
-Node: Initialization47538
-Node: Sections47997
-Node: Section Input48480
-Node: Section Output49845
-Node: typedef asection52331
-Node: section prototypes77563
-Node: Symbols87820
-Node: Reading Symbols89415
-Node: Writing Symbols90522
-Node: Mini Symbols92263
-Node: typedef asymbol93237
-Node: symbol handling functions99296
-Node: Archives104638
-Node: Formats108667
-Node: Relocations111615
-Node: typedef arelent112342
-Node: howto manager127978
-Node: Core Files234626
-Node: Targets236664
-Node: bfd_target238634
-Node: Architectures261856
-Node: Opening and Closing288730
-Node: Internal302076
-Node: File Caching308421
-Node: Linker Functions310335
-Node: Creating a Linker Hash Table312008
-Node: Adding Symbols to the Hash Table313746
-Node: Differing file formats314646
-Node: Adding symbols from an object file316371
-Node: Adding symbols from an archive318522
-Node: Performing the Final Link321451
-Node: Information provided by the linker322693
-Node: Relocating the section contents323847
-Node: Writing the symbol table325598
-Node: Hash Tables329982
-Node: Creating and Freeing a Hash Table331180
-Node: Looking Up or Entering a String332430
-Node: Traversing a Hash Table333683
-Node: Deriving a New Hash Table Type334472
-Node: Define the Derived Structures335538
-Node: Write the Derived Creation Routine336619
-Node: Write Other Derived Routines339243
-Node: BFD back ends340558
-Node: What to Put Where340828
-Node: aout341008
-Node: coff347326
-Node: elf375763
-Node: mmo376164
-Node: File layout377092
-Node: Symbol-table382739
-Node: mmo section mapping386508
-Node: GNU Free Documentation License390160
-Node: BFD Index415243
-
-End Tag Table
diff -Nur binutils-2.24.orig/bfd/doc/bfdio.texi binutils-2.24/bfd/doc/bfdio.texi
--- binutils-2.24.orig/bfd/doc/bfdio.texi 2013-11-18 09:49:27.000000000 +0100
+++ binutils-2.24/bfd/doc/bfdio.texi 1970-01-01 01:00:00.000000000 +0100
@@ -1,95 +0,0 @@
-@findex struct bfd_iovec
-@subsubsection @code{struct bfd_iovec}
-@strong{Description}@*
-The @code{struct bfd_iovec} contains the internal file I/O class.
-Each @code{BFD} has an instance of this class and all file I/O is
-routed through it (it is assumed that the instance implements
-all methods listed below).
-@example
-struct bfd_iovec
-@{
- /* To avoid problems with macros, a "b" rather than "f"
- prefix is prepended to each method name. */
- /* Attempt to read/write NBYTES on ABFD's IOSTREAM storing/fetching
- bytes starting at PTR. Return the number of bytes actually
- transfered (a read past end-of-file returns less than NBYTES),
- or -1 (setting @code{bfd_error}) if an error occurs. */
- file_ptr (*bread) (struct bfd *abfd, void *ptr, file_ptr nbytes);
- file_ptr (*bwrite) (struct bfd *abfd, const void *ptr,
- file_ptr nbytes);
- /* Return the current IOSTREAM file offset, or -1 (setting @code{bfd_error}
- if an error occurs. */
- file_ptr (*btell) (struct bfd *abfd);
- /* For the following, on successful completion a value of 0 is returned.
- Otherwise, a value of -1 is returned (and @code{bfd_error} is set). */
- int (*bseek) (struct bfd *abfd, file_ptr offset, int whence);
- int (*bclose) (struct bfd *abfd);
- int (*bflush) (struct bfd *abfd);
- int (*bstat) (struct bfd *abfd, struct stat *sb);
- /* Mmap a part of the files. ADDR, LEN, PROT, FLAGS and OFFSET are the usual
- mmap parameter, except that LEN and OFFSET do not need to be page
- aligned. Returns (void *)-1 on failure, mmapped address on success.
- Also write in MAP_ADDR the address of the page aligned buffer and in
- MAP_LEN the size mapped (a page multiple). Use unmap with MAP_ADDR and
- MAP_LEN to unmap. */
- void *(*bmmap) (struct bfd *abfd, void *addr, bfd_size_type len,
- int prot, int flags, file_ptr offset,
- void **map_addr, bfd_size_type *map_len);
-@};
-extern const struct bfd_iovec _bfd_memory_iovec;
-@end example
-
-@findex bfd_get_mtime
-@subsubsection @code{bfd_get_mtime}
-@strong{Synopsis}
-@example
-long bfd_get_mtime (bfd *abfd);
-@end example
-@strong{Description}@*
-Return the file modification time (as read from the file system, or
-from the archive header for archive members).
-
-@findex bfd_get_size
-@subsubsection @code{bfd_get_size}
-@strong{Synopsis}
-@example
-file_ptr bfd_get_size (bfd *abfd);
-@end example
-@strong{Description}@*
-Return the file size (as read from file system) for the file
-associated with BFD @var{abfd}.
-
-The initial motivation for, and use of, this routine is not
-so we can get the exact size of the object the BFD applies to, since
-that might not be generally possible (archive members for example).
-It would be ideal if someone could eventually modify
-it so that such results were guaranteed.
-
-Instead, we want to ask questions like "is this NNN byte sized
-object I'm about to try read from file offset YYY reasonable?"
-As as example of where we might do this, some object formats
-use string tables for which the first @code{sizeof (long)} bytes of the
-table contain the size of the table itself, including the size bytes.
-If an application tries to read what it thinks is one of these
-string tables, without some way to validate the size, and for
-some reason the size is wrong (byte swapping error, wrong location
-for the string table, etc.), the only clue is likely to be a read
-error when it tries to read the table, or a "virtual memory
-exhausted" error when it tries to allocate 15 bazillon bytes
-of space for the 15 bazillon byte table it is about to read.
-This function at least allows us to answer the question, "is the
-size reasonable?".
-
-@findex bfd_mmap
-@subsubsection @code{bfd_mmap}
-@strong{Synopsis}
-@example
-void *bfd_mmap (bfd *abfd, void *addr, bfd_size_type len,
- int prot, int flags, file_ptr offset,
- void **map_addr, bfd_size_type *map_len);
-@end example
-@strong{Description}@*
-Return mmap()ed region of the file, if possible and implemented.
-LEN and OFFSET do not need to be page aligned. The page aligned
-address and length are written to MAP_ADDR and MAP_LEN.
-
diff -Nur binutils-2.24.orig/bfd/doc/bfdt.texi binutils-2.24/bfd/doc/bfdt.texi
--- binutils-2.24.orig/bfd/doc/bfdt.texi 2013-11-18 09:49:27.000000000 +0100
+++ binutils-2.24/bfd/doc/bfdt.texi 1970-01-01 01:00:00.000000000 +0100
@@ -1,888 +0,0 @@
-@node typedef bfd, Error reporting, BFD front end, BFD front end
-@section @code{typedef bfd}
-A BFD has type @code{bfd}; objects of this type are the
-cornerstone of any application using BFD. Using BFD
-consists of making references though the BFD and to data in the BFD.
-
-Here is the structure that defines the type @code{bfd}. It
-contains the major data about the file and pointers
-to the rest of the data.
-
-
-@example
-
-enum bfd_direction
- @{
- no_direction = 0,
- read_direction = 1,
- write_direction = 2,
- both_direction = 3
- @};
-
-struct bfd
-@{
- /* A unique identifier of the BFD */
- unsigned int id;
-
- /* The filename the application opened the BFD with. */
- const char *filename;
-
- /* A pointer to the target jump table. */
- const struct bfd_target *xvec;
-
- /* The IOSTREAM, and corresponding IO vector that provide access
- to the file backing the BFD. */
- void *iostream;
- const struct bfd_iovec *iovec;
-
- /* The caching routines use these to maintain a
- least-recently-used list of BFDs. */
- struct bfd *lru_prev, *lru_next;
-
- /* When a file is closed by the caching routines, BFD retains
- state information on the file here... */
- ufile_ptr where;
-
- /* File modified time, if mtime_set is TRUE. */
- long mtime;
-
- /* Reserved for an unimplemented file locking extension. */
- int ifd;
-
- /* The format which belongs to the BFD. (object, core, etc.) */
- bfd_format format;
-
- /* The direction with which the BFD was opened. */
- enum bfd_direction direction;
-
- /* Format_specific flags. */
- flagword flags;
-
- /* Values that may appear in the flags field of a BFD. These also
- appear in the object_flags field of the bfd_target structure, where
- they indicate the set of flags used by that backend (not all flags
- are meaningful for all object file formats) (FIXME: at the moment,
- the object_flags values have mostly just been copied from backend
- to another, and are not necessarily correct). */
-
-#define BFD_NO_FLAGS 0x00
-
- /* BFD contains relocation entries. */
-#define HAS_RELOC 0x01
-
- /* BFD is directly executable. */
-#define EXEC_P 0x02
-
- /* BFD has line number information (basically used for F_LNNO in a
- COFF header). */
-#define HAS_LINENO 0x04
-
- /* BFD has debugging information. */
-#define HAS_DEBUG 0x08
-
- /* BFD has symbols. */
-#define HAS_SYMS 0x10
-
- /* BFD has local symbols (basically used for F_LSYMS in a COFF
- header). */
-#define HAS_LOCALS 0x20
-
- /* BFD is a dynamic object. */
-#define DYNAMIC 0x40
-
- /* Text section is write protected (if D_PAGED is not set, this is
- like an a.out NMAGIC file) (the linker sets this by default, but
- clears it for -r or -N). */
-#define WP_TEXT 0x80
-
- /* BFD is dynamically paged (this is like an a.out ZMAGIC file) (the
- linker sets this by default, but clears it for -r or -n or -N). */
-#define D_PAGED 0x100
-
- /* BFD is relaxable (this means that bfd_relax_section may be able to
- do something) (sometimes bfd_relax_section can do something even if
- this is not set). */
-#define BFD_IS_RELAXABLE 0x200
-
- /* This may be set before writing out a BFD to request using a
- traditional format. For example, this is used to request that when
- writing out an a.out object the symbols not be hashed to eliminate
- duplicates. */
-#define BFD_TRADITIONAL_FORMAT 0x400
-
- /* This flag indicates that the BFD contents are actually cached
- in memory. If this is set, iostream points to a bfd_in_memory
- struct. */
-#define BFD_IN_MEMORY 0x800
-
- /* The sections in this BFD specify a memory page. */
-#define HAS_LOAD_PAGE 0x1000
-
- /* This BFD has been created by the linker and doesn't correspond
- to any input file. */
-#define BFD_LINKER_CREATED 0x2000
-
- /* This may be set before writing out a BFD to request that it
- be written using values for UIDs, GIDs, timestamps, etc. that
- will be consistent from run to run. */
-#define BFD_DETERMINISTIC_OUTPUT 0x4000
-
- /* Compress sections in this BFD. */
-#define BFD_COMPRESS 0x8000
-
- /* Decompress sections in this BFD. */
-#define BFD_DECOMPRESS 0x10000
-
- /* BFD is a dummy, for plugins. */
-#define BFD_PLUGIN 0x20000
-
- /* Flags bits to be saved in bfd_preserve_save. */
-#define BFD_FLAGS_SAVED \
- (BFD_IN_MEMORY | BFD_COMPRESS | BFD_DECOMPRESS | BFD_PLUGIN)
-
- /* Flags bits which are for BFD use only. */
-#define BFD_FLAGS_FOR_BFD_USE_MASK \
- (BFD_IN_MEMORY | BFD_COMPRESS | BFD_DECOMPRESS | BFD_LINKER_CREATED \
- | BFD_PLUGIN | BFD_TRADITIONAL_FORMAT | BFD_DETERMINISTIC_OUTPUT)
-
- /* Currently my_archive is tested before adding origin to
- anything. I believe that this can become always an add of
- origin, with origin set to 0 for non archive files. */
- ufile_ptr origin;
-
- /* The origin in the archive of the proxy entry. This will
- normally be the same as origin, except for thin archives,
- when it will contain the current offset of the proxy in the
- thin archive rather than the offset of the bfd in its actual
- container. */
- ufile_ptr proxy_origin;
-
- /* A hash table for section names. */
- struct bfd_hash_table section_htab;
-
- /* Pointer to linked list of sections. */
- struct bfd_section *sections;
-
- /* The last section on the section list. */
- struct bfd_section *section_last;
-
- /* The number of sections. */
- unsigned int section_count;
-
- /* Stuff only useful for object files:
- The start address. */
- bfd_vma start_address;
-
- /* Used for input and output. */
- unsigned int symcount;
-
- /* Symbol table for output BFD (with symcount entries).
- Also used by the linker to cache input BFD symbols. */
- struct bfd_symbol **outsymbols;
-
- /* Used for slurped dynamic symbol tables. */
- unsigned int dynsymcount;
-
- /* Pointer to structure which contains architecture information. */
- const struct bfd_arch_info *arch_info;
-
- /* Stuff only useful for archives. */
- void *arelt_data;
- struct bfd *my_archive; /* The containing archive BFD. */
- struct bfd *archive_next; /* The next BFD in the archive. */
- struct bfd *archive_head; /* The first BFD in the archive. */
- struct bfd *nested_archives; /* List of nested archive in a flattened
- thin archive. */
-
- /* A chain of BFD structures involved in a link. */
- struct bfd *link_next;
-
- /* A field used by _bfd_generic_link_add_archive_symbols. This will
- be used only for archive elements. */
- int archive_pass;
-
- /* Used by the back end to hold private data. */
- union
- @{
- struct aout_data_struct *aout_data;
- struct artdata *aout_ar_data;
- struct _oasys_data *oasys_obj_data;
- struct _oasys_ar_data *oasys_ar_data;
- struct coff_tdata *coff_obj_data;
- struct pe_tdata *pe_obj_data;
- struct xcoff_tdata *xcoff_obj_data;
- struct ecoff_tdata *ecoff_obj_data;
- struct ieee_data_struct *ieee_data;
- struct ieee_ar_data_struct *ieee_ar_data;
- struct srec_data_struct *srec_data;
- struct verilog_data_struct *verilog_data;
- struct ihex_data_struct *ihex_data;
- struct tekhex_data_struct *tekhex_data;
- struct elf_obj_tdata *elf_obj_data;
- struct nlm_obj_tdata *nlm_obj_data;
- struct bout_data_struct *bout_data;
- struct mmo_data_struct *mmo_data;
- struct sun_core_struct *sun_core_data;
- struct sco5_core_struct *sco5_core_data;
- struct trad_core_struct *trad_core_data;
- struct som_data_struct *som_data;
- struct hpux_core_struct *hpux_core_data;
- struct hppabsd_core_struct *hppabsd_core_data;
- struct sgi_core_struct *sgi_core_data;
- struct lynx_core_struct *lynx_core_data;
- struct osf_core_struct *osf_core_data;
- struct cisco_core_struct *cisco_core_data;
- struct versados_data_struct *versados_data;
- struct netbsd_core_struct *netbsd_core_data;
- struct mach_o_data_struct *mach_o_data;
- struct mach_o_fat_data_struct *mach_o_fat_data;
- struct plugin_data_struct *plugin_data;
- struct bfd_pef_data_struct *pef_data;
- struct bfd_pef_xlib_data_struct *pef_xlib_data;
- struct bfd_sym_data_struct *sym_data;
- void *any;
- @}
- tdata;
-
- /* Used by the application to hold private data. */
- void *usrdata;
-
- /* Where all the allocated stuff under this BFD goes. This is a
- struct objalloc *, but we use void * to avoid requiring the inclusion
- of objalloc.h. */
- void *memory;
-
- /* Is the file descriptor being cached? That is, can it be closed as
- needed, and re-opened when accessed later? */
- unsigned int cacheable : 1;
-
- /* Marks whether there was a default target specified when the
- BFD was opened. This is used to select which matching algorithm
- to use to choose the back end. */
- unsigned int target_defaulted : 1;
-
- /* ... and here: (``once'' means at least once). */
- unsigned int opened_once : 1;
-
- /* Set if we have a locally maintained mtime value, rather than
- getting it from the file each time. */
- unsigned int mtime_set : 1;
-
- /* Flag set if symbols from this BFD should not be exported. */
- unsigned int no_export : 1;
-
- /* Remember when output has begun, to stop strange things
- from happening. */
- unsigned int output_has_begun : 1;
-
- /* Have archive map. */
- unsigned int has_armap : 1;
-
- /* Set if this is a thin archive. */
- unsigned int is_thin_archive : 1;
-
- /* Set if only required symbols should be added in the link hash table for
- this object. Used by VMS linkers. */
- unsigned int selective_search : 1;
-@};
-
-@end example
-@node Error reporting, Miscellaneous, typedef bfd, BFD front end
-@section Error reporting
-Most BFD functions return nonzero on success (check their
-individual documentation for precise semantics). On an error,
-they call @code{bfd_set_error} to set an error condition that callers
-can check by calling @code{bfd_get_error}.
-If that returns @code{bfd_error_system_call}, then check
-@code{errno}.
-
-The easiest way to report a BFD error to the user is to
-use @code{bfd_perror}.
-
-@subsection Type @code{bfd_error_type}
-The values returned by @code{bfd_get_error} are defined by the
-enumerated type @code{bfd_error_type}.
-
-
-@example
-
-typedef enum bfd_error
-@{
- bfd_error_no_error = 0,
- bfd_error_system_call,
- bfd_error_invalid_target,
- bfd_error_wrong_format,
- bfd_error_wrong_object_format,
- bfd_error_invalid_operation,
- bfd_error_no_memory,
- bfd_error_no_symbols,
- bfd_error_no_armap,
- bfd_error_no_more_archived_files,
- bfd_error_malformed_archive,
- bfd_error_missing_dso,
- bfd_error_file_not_recognized,
- bfd_error_file_ambiguously_recognized,
- bfd_error_no_contents,
- bfd_error_nonrepresentable_section,
- bfd_error_no_debug_section,
- bfd_error_bad_value,
- bfd_error_file_truncated,
- bfd_error_file_too_big,
- bfd_error_on_input,
- bfd_error_invalid_error_code
-@}
-bfd_error_type;
-
-@end example
-@findex bfd_get_error
-@subsubsection @code{bfd_get_error}
-@strong{Synopsis}
-@example
-bfd_error_type bfd_get_error (void);
-@end example
-@strong{Description}@*
-Return the current BFD error condition.
-
-@findex bfd_set_error
-@subsubsection @code{bfd_set_error}
-@strong{Synopsis}
-@example
-void bfd_set_error (bfd_error_type error_tag, ...);
-@end example
-@strong{Description}@*
-Set the BFD error condition to be @var{error_tag}.
-If @var{error_tag} is bfd_error_on_input, then this function
-takes two more parameters, the input bfd where the error
-occurred, and the bfd_error_type error.
-
-@findex bfd_errmsg
-@subsubsection @code{bfd_errmsg}
-@strong{Synopsis}
-@example
-const char *bfd_errmsg (bfd_error_type error_tag);
-@end example
-@strong{Description}@*
-Return a string describing the error @var{error_tag}, or
-the system error if @var{error_tag} is @code{bfd_error_system_call}.
-
-@findex bfd_perror
-@subsubsection @code{bfd_perror}
-@strong{Synopsis}
-@example
-void bfd_perror (const char *message);
-@end example
-@strong{Description}@*
-Print to the standard error stream a string describing the
-last BFD error that occurred, or the last system error if
-the last BFD error was a system call failure. If @var{message}
-is non-NULL and non-empty, the error string printed is preceded
-by @var{message}, a colon, and a space. It is followed by a newline.
-
-@subsection BFD error handler
-Some BFD functions want to print messages describing the
-problem. They call a BFD error handler function. This
-function may be overridden by the program.
-
-The BFD error handler acts like printf.
-
-
-@example
-
-typedef void (*bfd_error_handler_type) (const char *, ...);
-
-@end example
-@findex bfd_set_error_handler
-@subsubsection @code{bfd_set_error_handler}
-@strong{Synopsis}
-@example
-bfd_error_handler_type bfd_set_error_handler (bfd_error_handler_type);
-@end example
-@strong{Description}@*
-Set the BFD error handler function. Returns the previous
-function.
-
-@findex bfd_set_error_program_name
-@subsubsection @code{bfd_set_error_program_name}
-@strong{Synopsis}
-@example
-void bfd_set_error_program_name (const char *);
-@end example
-@strong{Description}@*
-Set the program name to use when printing a BFD error. This
-is printed before the error message followed by a colon and
-space. The string must not be changed after it is passed to
-this function.
-
-@findex bfd_get_error_handler
-@subsubsection @code{bfd_get_error_handler}
-@strong{Synopsis}
-@example
-bfd_error_handler_type bfd_get_error_handler (void);
-@end example
-@strong{Description}@*
-Return the BFD error handler function.
-
-@subsection BFD assert handler
-If BFD finds an internal inconsistency, the bfd assert
-handler is called with information on the BFD version, BFD
-source file and line. If this happens, most programs linked
-against BFD are expected to want to exit with an error, or mark
-the current BFD operation as failed, so it is recommended to
-override the default handler, which just calls
-_bfd_error_handler and continues.
-
-
-@example
-
-typedef void (*bfd_assert_handler_type) (const char *bfd_formatmsg,
- const char *bfd_version,
- const char *bfd_file,
- int bfd_line);
-
-@end example
-@findex bfd_set_assert_handler
-@subsubsection @code{bfd_set_assert_handler}
-@strong{Synopsis}
-@example
-bfd_assert_handler_type bfd_set_assert_handler (bfd_assert_handler_type);
-@end example
-@strong{Description}@*
-Set the BFD assert handler function. Returns the previous
-function.
-
-@findex bfd_get_assert_handler
-@subsubsection @code{bfd_get_assert_handler}
-@strong{Synopsis}
-@example
-bfd_assert_handler_type bfd_get_assert_handler (void);
-@end example
-@strong{Description}@*
-Return the BFD assert handler function.
-
-@node Miscellaneous, Memory Usage, Error reporting, BFD front end
-@section Miscellaneous
-
-
-@subsection Miscellaneous functions
-
-
-@findex bfd_get_reloc_upper_bound
-@subsubsection @code{bfd_get_reloc_upper_bound}
-@strong{Synopsis}
-@example
-long bfd_get_reloc_upper_bound (bfd *abfd, asection *sect);
-@end example
-@strong{Description}@*
-Return the number of bytes required to store the
-relocation information associated with section @var{sect}
-attached to bfd @var{abfd}. If an error occurs, return -1.
-
-@findex bfd_canonicalize_reloc
-@subsubsection @code{bfd_canonicalize_reloc}
-@strong{Synopsis}
-@example
-long bfd_canonicalize_reloc
- (bfd *abfd, asection *sec, arelent **loc, asymbol **syms);
-@end example
-@strong{Description}@*
-Call the back end associated with the open BFD
-@var{abfd} and translate the external form of the relocation
-information attached to @var{sec} into the internal canonical
-form. Place the table into memory at @var{loc}, which has
-been preallocated, usually by a call to
-@code{bfd_get_reloc_upper_bound}. Returns the number of relocs, or
--1 on error.
-
-The @var{syms} table is also needed for horrible internal magic
-reasons.
-
-@findex bfd_set_reloc
-@subsubsection @code{bfd_set_reloc}
-@strong{Synopsis}
-@example
-void bfd_set_reloc
- (bfd *abfd, asection *sec, arelent **rel, unsigned int count);
-@end example
-@strong{Description}@*
-Set the relocation pointer and count within
-section @var{sec} to the values @var{rel} and @var{count}.
-The argument @var{abfd} is ignored.
-
-@findex bfd_set_file_flags
-@subsubsection @code{bfd_set_file_flags}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_set_file_flags (bfd *abfd, flagword flags);
-@end example
-@strong{Description}@*
-Set the flag word in the BFD @var{abfd} to the value @var{flags}.
-
-Possible errors are:
-@itemize @bullet
-
-@item
-@code{bfd_error_wrong_format} - The target bfd was not of object format.
-@item
-@code{bfd_error_invalid_operation} - The target bfd was open for reading.
-@item
-@code{bfd_error_invalid_operation} -
-The flag word contained a bit which was not applicable to the
-type of file. E.g., an attempt was made to set the @code{D_PAGED} bit
-on a BFD format which does not support demand paging.
-@end itemize
-
-@findex bfd_get_arch_size
-@subsubsection @code{bfd_get_arch_size}
-@strong{Synopsis}
-@example
-int bfd_get_arch_size (bfd *abfd);
-@end example
-@strong{Description}@*
-Returns the architecture address size, in bits, as determined
-by the object file's format. For ELF, this information is
-included in the header.
-
-@strong{Returns}@*
-Returns the arch size in bits if known, @code{-1} otherwise.
-
-@findex bfd_get_sign_extend_vma
-@subsubsection @code{bfd_get_sign_extend_vma}
-@strong{Synopsis}
-@example
-int bfd_get_sign_extend_vma (bfd *abfd);
-@end example
-@strong{Description}@*
-Indicates if the target architecture "naturally" sign extends
-an address. Some architectures implicitly sign extend address
-values when they are converted to types larger than the size
-of an address. For instance, bfd_get_start_address() will
-return an address sign extended to fill a bfd_vma when this is
-the case.
-
-@strong{Returns}@*
-Returns @code{1} if the target architecture is known to sign
-extend addresses, @code{0} if the target architecture is known to
-not sign extend addresses, and @code{-1} otherwise.
-
-@findex bfd_set_start_address
-@subsubsection @code{bfd_set_start_address}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_set_start_address (bfd *abfd, bfd_vma vma);
-@end example
-@strong{Description}@*
-Make @var{vma} the entry point of output BFD @var{abfd}.
-
-@strong{Returns}@*
-Returns @code{TRUE} on success, @code{FALSE} otherwise.
-
-@findex bfd_get_gp_size
-@subsubsection @code{bfd_get_gp_size}
-@strong{Synopsis}
-@example
-unsigned int bfd_get_gp_size (bfd *abfd);
-@end example
-@strong{Description}@*
-Return the maximum size of objects to be optimized using the GP
-register under MIPS ECOFF. This is typically set by the @code{-G}
-argument to the compiler, assembler or linker.
-
-@findex bfd_set_gp_size
-@subsubsection @code{bfd_set_gp_size}
-@strong{Synopsis}
-@example
-void bfd_set_gp_size (bfd *abfd, unsigned int i);
-@end example
-@strong{Description}@*
-Set the maximum size of objects to be optimized using the GP
-register under ECOFF or MIPS ELF. This is typically set by
-the @code{-G} argument to the compiler, assembler or linker.
-
-@findex bfd_scan_vma
-@subsubsection @code{bfd_scan_vma}
-@strong{Synopsis}
-@example
-bfd_vma bfd_scan_vma (const char *string, const char **end, int base);
-@end example
-@strong{Description}@*
-Convert, like @code{strtoul}, a numerical expression
-@var{string} into a @code{bfd_vma} integer, and return that integer.
-(Though without as many bells and whistles as @code{strtoul}.)
-The expression is assumed to be unsigned (i.e., positive).
-If given a @var{base}, it is used as the base for conversion.
-A base of 0 causes the function to interpret the string
-in hex if a leading "0x" or "0X" is found, otherwise
-in octal if a leading zero is found, otherwise in decimal.
-
-If the value would overflow, the maximum @code{bfd_vma} value is
-returned.
-
-@findex bfd_copy_private_header_data
-@subsubsection @code{bfd_copy_private_header_data}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_copy_private_header_data (bfd *ibfd, bfd *obfd);
-@end example
-@strong{Description}@*
-Copy private BFD header information from the BFD @var{ibfd} to the
-the BFD @var{obfd}. This copies information that may require
-sections to exist, but does not require symbol tables. Return
-@code{true} on success, @code{false} on error.
-Possible error returns are:
-
-@itemize @bullet
-
-@item
-@code{bfd_error_no_memory} -
-Not enough memory exists to create private data for @var{obfd}.
-@end itemize
-@example
-#define bfd_copy_private_header_data(ibfd, obfd) \
- BFD_SEND (obfd, _bfd_copy_private_header_data, \
- (ibfd, obfd))
-@end example
-
-@findex bfd_copy_private_bfd_data
-@subsubsection @code{bfd_copy_private_bfd_data}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_copy_private_bfd_data (bfd *ibfd, bfd *obfd);
-@end example
-@strong{Description}@*
-Copy private BFD information from the BFD @var{ibfd} to the
-the BFD @var{obfd}. Return @code{TRUE} on success, @code{FALSE} on error.
-Possible error returns are:
-
-@itemize @bullet
-
-@item
-@code{bfd_error_no_memory} -
-Not enough memory exists to create private data for @var{obfd}.
-@end itemize
-@example
-#define bfd_copy_private_bfd_data(ibfd, obfd) \
- BFD_SEND (obfd, _bfd_copy_private_bfd_data, \
- (ibfd, obfd))
-@end example
-
-@findex bfd_merge_private_bfd_data
-@subsubsection @code{bfd_merge_private_bfd_data}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_merge_private_bfd_data (bfd *ibfd, bfd *obfd);
-@end example
-@strong{Description}@*
-Merge private BFD information from the BFD @var{ibfd} to the
-the output file BFD @var{obfd} when linking. Return @code{TRUE}
-on success, @code{FALSE} on error. Possible error returns are:
-
-@itemize @bullet
-
-@item
-@code{bfd_error_no_memory} -
-Not enough memory exists to create private data for @var{obfd}.
-@end itemize
-@example
-#define bfd_merge_private_bfd_data(ibfd, obfd) \
- BFD_SEND (obfd, _bfd_merge_private_bfd_data, \
- (ibfd, obfd))
-@end example
-
-@findex bfd_set_private_flags
-@subsubsection @code{bfd_set_private_flags}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_set_private_flags (bfd *abfd, flagword flags);
-@end example
-@strong{Description}@*
-Set private BFD flag information in the BFD @var{abfd}.
-Return @code{TRUE} on success, @code{FALSE} on error. Possible error
-returns are:
-
-@itemize @bullet
-
-@item
-@code{bfd_error_no_memory} -
-Not enough memory exists to create private data for @var{obfd}.
-@end itemize
-@example
-#define bfd_set_private_flags(abfd, flags) \
- BFD_SEND (abfd, _bfd_set_private_flags, (abfd, flags))
-@end example
-
-@findex Other functions
-@subsubsection @code{Other functions}
-@strong{Description}@*
-The following functions exist but have not yet been documented.
-@example
-#define bfd_sizeof_headers(abfd, info) \
- BFD_SEND (abfd, _bfd_sizeof_headers, (abfd, info))
-
-#define bfd_find_nearest_line(abfd, sec, syms, off, file, func, line) \
- BFD_SEND (abfd, _bfd_find_nearest_line, \
- (abfd, sec, syms, off, file, func, line))
-
-#define bfd_find_nearest_line_discriminator(abfd, sec, syms, off, file, func, \
- line, disc) \
- BFD_SEND (abfd, _bfd_find_nearest_line_discriminator, \
- (abfd, sec, syms, off, file, func, line, disc))
-
-#define bfd_find_line(abfd, syms, sym, file, line) \
- BFD_SEND (abfd, _bfd_find_line, \
- (abfd, syms, sym, file, line))
-
-#define bfd_find_inliner_info(abfd, file, func, line) \
- BFD_SEND (abfd, _bfd_find_inliner_info, \
- (abfd, file, func, line))
-
-#define bfd_debug_info_start(abfd) \
- BFD_SEND (abfd, _bfd_debug_info_start, (abfd))
-
-#define bfd_debug_info_end(abfd) \
- BFD_SEND (abfd, _bfd_debug_info_end, (abfd))
-
-#define bfd_debug_info_accumulate(abfd, section) \
- BFD_SEND (abfd, _bfd_debug_info_accumulate, (abfd, section))
-
-#define bfd_stat_arch_elt(abfd, stat) \
- BFD_SEND (abfd, _bfd_stat_arch_elt,(abfd, stat))
-
-#define bfd_update_armap_timestamp(abfd) \
- BFD_SEND (abfd, _bfd_update_armap_timestamp, (abfd))
-
-#define bfd_set_arch_mach(abfd, arch, mach)\
- BFD_SEND ( abfd, _bfd_set_arch_mach, (abfd, arch, mach))
-
-#define bfd_relax_section(abfd, section, link_info, again) \
- BFD_SEND (abfd, _bfd_relax_section, (abfd, section, link_info, again))
-
-#define bfd_gc_sections(abfd, link_info) \
- BFD_SEND (abfd, _bfd_gc_sections, (abfd, link_info))
-
-#define bfd_lookup_section_flags(link_info, flag_info, section) \
- BFD_SEND (abfd, _bfd_lookup_section_flags, (link_info, flag_info, section))
-
-#define bfd_merge_sections(abfd, link_info) \
- BFD_SEND (abfd, _bfd_merge_sections, (abfd, link_info))
-
-#define bfd_is_group_section(abfd, sec) \
- BFD_SEND (abfd, _bfd_is_group_section, (abfd, sec))
-
-#define bfd_discard_group(abfd, sec) \
- BFD_SEND (abfd, _bfd_discard_group, (abfd, sec))
-
-#define bfd_link_hash_table_create(abfd) \
- BFD_SEND (abfd, _bfd_link_hash_table_create, (abfd))
-
-#define bfd_link_hash_table_free(abfd, hash) \
- BFD_SEND (abfd, _bfd_link_hash_table_free, (hash))
-
-#define bfd_link_add_symbols(abfd, info) \
- BFD_SEND (abfd, _bfd_link_add_symbols, (abfd, info))
-
-#define bfd_link_just_syms(abfd, sec, info) \
- BFD_SEND (abfd, _bfd_link_just_syms, (sec, info))
-
-#define bfd_final_link(abfd, info) \
- BFD_SEND (abfd, _bfd_final_link, (abfd, info))
-
-#define bfd_free_cached_info(abfd) \
- BFD_SEND (abfd, _bfd_free_cached_info, (abfd))
-
-#define bfd_get_dynamic_symtab_upper_bound(abfd) \
- BFD_SEND (abfd, _bfd_get_dynamic_symtab_upper_bound, (abfd))
-
-#define bfd_print_private_bfd_data(abfd, file)\
- BFD_SEND (abfd, _bfd_print_private_bfd_data, (abfd, file))
-
-#define bfd_canonicalize_dynamic_symtab(abfd, asymbols) \
- BFD_SEND (abfd, _bfd_canonicalize_dynamic_symtab, (abfd, asymbols))
-
-#define bfd_get_synthetic_symtab(abfd, count, syms, dyncount, dynsyms, ret) \
- BFD_SEND (abfd, _bfd_get_synthetic_symtab, (abfd, count, syms, \
- dyncount, dynsyms, ret))
-
-#define bfd_get_dynamic_reloc_upper_bound(abfd) \
- BFD_SEND (abfd, _bfd_get_dynamic_reloc_upper_bound, (abfd))
-
-#define bfd_canonicalize_dynamic_reloc(abfd, arels, asyms) \
- BFD_SEND (abfd, _bfd_canonicalize_dynamic_reloc, (abfd, arels, asyms))
-
-extern bfd_byte *bfd_get_relocated_section_contents
- (bfd *, struct bfd_link_info *, struct bfd_link_order *, bfd_byte *,
- bfd_boolean, asymbol **);
-
-@end example
-
-@findex bfd_alt_mach_code
-@subsubsection @code{bfd_alt_mach_code}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_alt_mach_code (bfd *abfd, int alternative);
-@end example
-@strong{Description}@*
-When more than one machine code number is available for the
-same machine type, this function can be used to switch between
-the preferred one (alternative == 0) and any others. Currently,
-only ELF supports this feature, with up to two alternate
-machine codes.
-
-@findex bfd_emul_get_maxpagesize
-@subsubsection @code{bfd_emul_get_maxpagesize}
-@strong{Synopsis}
-@example
-bfd_vma bfd_emul_get_maxpagesize (const char *);
-@end example
-@strong{Description}@*
-Returns the maximum page size, in bytes, as determined by
-emulation.
-
-@strong{Returns}@*
-Returns the maximum page size in bytes for ELF, 0 otherwise.
-
-@findex bfd_emul_set_maxpagesize
-@subsubsection @code{bfd_emul_set_maxpagesize}
-@strong{Synopsis}
-@example
-void bfd_emul_set_maxpagesize (const char *, bfd_vma);
-@end example
-@strong{Description}@*
-For ELF, set the maximum page size for the emulation. It is
-a no-op for other formats.
-
-@findex bfd_emul_get_commonpagesize
-@subsubsection @code{bfd_emul_get_commonpagesize}
-@strong{Synopsis}
-@example
-bfd_vma bfd_emul_get_commonpagesize (const char *);
-@end example
-@strong{Description}@*
-Returns the common page size, in bytes, as determined by
-emulation.
-
-@strong{Returns}@*
-Returns the common page size in bytes for ELF, 0 otherwise.
-
-@findex bfd_emul_set_commonpagesize
-@subsubsection @code{bfd_emul_set_commonpagesize}
-@strong{Synopsis}
-@example
-void bfd_emul_set_commonpagesize (const char *, bfd_vma);
-@end example
-@strong{Description}@*
-For ELF, set the common page size for the emulation. It is
-a no-op for other formats.
-
-@findex bfd_demangle
-@subsubsection @code{bfd_demangle}
-@strong{Synopsis}
-@example
-char *bfd_demangle (bfd *, const char *, int);
-@end example
-@strong{Description}@*
-Wrapper around cplus_demangle. Strips leading underscores and
-other such chars that would otherwise confuse the demangler.
-If passed a g++ v3 ABI mangled name, returns a buffer allocated
-with malloc holding the demangled name. Returns NULL otherwise
-and on memory alloc failure.
-
diff -Nur binutils-2.24.orig/bfd/doc/bfdver.texi binutils-2.24/bfd/doc/bfdver.texi
--- binutils-2.24.orig/bfd/doc/bfdver.texi 2013-12-02 10:32:19.000000000 +0100
+++ binutils-2.24/bfd/doc/bfdver.texi 1970-01-01 01:00:00.000000000 +0100
@@ -1,4 +0,0 @@
-@set VERSION 2.24
-@set VERSION_PACKAGE (GNU Binutils)
-@set UPDATED December 2013
-@set BUGURL @uref{http://www.sourceware.org/bugzilla/}
diff -Nur binutils-2.24.orig/bfd/doc/bfdwin.texi binutils-2.24/bfd/doc/bfdwin.texi
--- binutils-2.24.orig/bfd/doc/bfdwin.texi 2013-11-18 09:49:27.000000000 +0100
+++ binutils-2.24/bfd/doc/bfdwin.texi 1970-01-01 01:00:00.000000000 +0100
@@ -1,2 +0,0 @@
-@findex
-@subsubsection @code{}
diff -Nur binutils-2.24.orig/bfd/doc/cache.texi binutils-2.24/bfd/doc/cache.texi
--- binutils-2.24.orig/bfd/doc/cache.texi 2013-11-18 09:49:27.000000000 +0100
+++ binutils-2.24/bfd/doc/cache.texi 1970-01-01 01:00:00.000000000 +0100
@@ -1,65 +0,0 @@
-@section File caching
-The file caching mechanism is embedded within BFD and allows
-the application to open as many BFDs as it wants without
-regard to the underlying operating system's file descriptor
-limit (often as low as 20 open files). The module in
-@code{cache.c} maintains a least recently used list of
-@code{bfd_cache_max_open} files, and exports the name
-@code{bfd_cache_lookup}, which runs around and makes sure that
-the required BFD is open. If not, then it chooses a file to
-close, closes it and opens the one wanted, returning its file
-handle.
-
-@subsection Caching functions
-
-
-@findex bfd_cache_init
-@subsubsection @code{bfd_cache_init}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_cache_init (bfd *abfd);
-@end example
-@strong{Description}@*
-Add a newly opened BFD to the cache.
-
-@findex bfd_cache_close
-@subsubsection @code{bfd_cache_close}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_cache_close (bfd *abfd);
-@end example
-@strong{Description}@*
-Remove the BFD @var{abfd} from the cache. If the attached file is open,
-then close it too.
-
-@strong{Returns}@*
-@code{FALSE} is returned if closing the file fails, @code{TRUE} is
-returned if all is well.
-
-@findex bfd_cache_close_all
-@subsubsection @code{bfd_cache_close_all}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_cache_close_all (void);
-@end example
-@strong{Description}@*
-Remove all BFDs from the cache. If the attached file is open,
-then close it too.
-
-@strong{Returns}@*
-@code{FALSE} is returned if closing one of the file fails, @code{TRUE} is
-returned if all is well.
-
-@findex bfd_open_file
-@subsubsection @code{bfd_open_file}
-@strong{Synopsis}
-@example
-FILE* bfd_open_file (bfd *abfd);
-@end example
-@strong{Description}@*
-Call the OS to open a file for @var{abfd}. Return the @code{FILE *}
-(possibly @code{NULL}) that results from this operation. Set up the
-BFD so that future accesses know the file is open. If the @code{FILE *}
-returned is @code{NULL}, then it won't have been put in the
-cache, so it won't have to be removed from it.
-
diff -Nur binutils-2.24.orig/bfd/doc/coffcode.texi binutils-2.24/bfd/doc/coffcode.texi
--- binutils-2.24.orig/bfd/doc/coffcode.texi 2013-11-18 09:49:27.000000000 +0100
+++ binutils-2.24/bfd/doc/coffcode.texi 1970-01-01 01:00:00.000000000 +0100
@@ -1,686 +0,0 @@
-@section coff backends
-BFD supports a number of different flavours of coff format.
-The major differences between formats are the sizes and
-alignments of fields in structures on disk, and the occasional
-extra field.
-
-Coff in all its varieties is implemented with a few common
-files and a number of implementation specific files. For
-example, The 88k bcs coff format is implemented in the file
-@file{coff-m88k.c}. This file @code{#include}s
-@file{coff/m88k.h} which defines the external structure of the
-coff format for the 88k, and @file{coff/internal.h} which
-defines the internal structure. @file{coff-m88k.c} also
-defines the relocations used by the 88k format
-@xref{Relocations}.
-
-The Intel i960 processor version of coff is implemented in
-@file{coff-i960.c}. This file has the same structure as
-@file{coff-m88k.c}, except that it includes @file{coff/i960.h}
-rather than @file{coff-m88k.h}.
-
-@subsection Porting to a new version of coff
-The recommended method is to select from the existing
-implementations the version of coff which is most like the one
-you want to use. For example, we'll say that i386 coff is
-the one you select, and that your coff flavour is called foo.
-Copy @file{i386coff.c} to @file{foocoff.c}, copy
-@file{../include/coff/i386.h} to @file{../include/coff/foo.h},
-and add the lines to @file{targets.c} and @file{Makefile.in}
-so that your new back end is used. Alter the shapes of the
-structures in @file{../include/coff/foo.h} so that they match
-what you need. You will probably also have to add
-@code{#ifdef}s to the code in @file{coff/internal.h} and
-@file{coffcode.h} if your version of coff is too wild.
-
-You can verify that your new BFD backend works quite simply by
-building @file{objdump} from the @file{binutils} directory,
-and making sure that its version of what's going on and your
-host system's idea (assuming it has the pretty standard coff
-dump utility, usually called @code{att-dump} or just
-@code{dump}) are the same. Then clean up your code, and send
-what you've done to Cygnus. Then your stuff will be in the
-next release, and you won't have to keep integrating it.
-
-@subsection How the coff backend works
-
-
-@subsubsection File layout
-The Coff backend is split into generic routines that are
-applicable to any Coff target and routines that are specific
-to a particular target. The target-specific routines are
-further split into ones which are basically the same for all
-Coff targets except that they use the external symbol format
-or use different values for certain constants.
-
-The generic routines are in @file{coffgen.c}. These routines
-work for any Coff target. They use some hooks into the target
-specific code; the hooks are in a @code{bfd_coff_backend_data}
-structure, one of which exists for each target.
-
-The essentially similar target-specific routines are in
-@file{coffcode.h}. This header file includes executable C code.
-The various Coff targets first include the appropriate Coff
-header file, make any special defines that are needed, and
-then include @file{coffcode.h}.
-
-Some of the Coff targets then also have additional routines in
-the target source file itself.
-
-For example, @file{coff-i960.c} includes
-@file{coff/internal.h} and @file{coff/i960.h}. It then
-defines a few constants, such as @code{I960}, and includes
-@file{coffcode.h}. Since the i960 has complex relocation
-types, @file{coff-i960.c} also includes some code to
-manipulate the i960 relocs. This code is not in
-@file{coffcode.h} because it would not be used by any other
-target.
-
-@subsubsection Coff long section names
-In the standard Coff object format, section names are limited to
-the eight bytes available in the @code{s_name} field of the
-@code{SCNHDR} section header structure. The format requires the
-field to be NUL-padded, but not necessarily NUL-terminated, so
-the longest section names permitted are a full eight characters.
-
-The Microsoft PE variants of the Coff object file format add
-an extension to support the use of long section names. This
-extension is defined in section 4 of the Microsoft PE/COFF
-specification (rev 8.1). If a section name is too long to fit
-into the section header's @code{s_name} field, it is instead
-placed into the string table, and the @code{s_name} field is
-filled with a slash ("/") followed by the ASCII decimal
-representation of the offset of the full name relative to the
-string table base.
-
-Note that this implies that the extension can only be used in object
-files, as executables do not contain a string table. The standard
-specifies that long section names from objects emitted into executable
-images are to be truncated.
-
-However, as a GNU extension, BFD can generate executable images
-that contain a string table and long section names. This
-would appear to be technically valid, as the standard only says
-that Coff debugging information is deprecated, not forbidden,
-and in practice it works, although some tools that parse PE files
-expecting the MS standard format may become confused; @file{PEview} is
-one known example.
-
-The functionality is supported in BFD by code implemented under
-the control of the macro @code{COFF_LONG_SECTION_NAMES}. If not
-defined, the format does not support long section names in any way.
-If defined, it is used to initialise a flag,
-@code{_bfd_coff_long_section_names}, and a hook function pointer,
-@code{_bfd_coff_set_long_section_names}, in the Coff backend data
-structure. The flag controls the generation of long section names
-in output BFDs at runtime; if it is false, as it will be by default
-when generating an executable image, long section names are truncated;
-if true, the long section names extension is employed. The hook
-points to a function that allows the value of the flag to be altered
-at runtime, on formats that support long section names at all; on
-other formats it points to a stub that returns an error indication.
-
-With input BFDs, the flag is set according to whether any long section
-names are detected while reading the section headers. For a completely
-new BFD, the flag is set to the default for the target format. This
-information can be used by a client of the BFD library when deciding
-what output format to generate, and means that a BFD that is opened
-for read and subsequently converted to a writeable BFD and modified
-in-place will retain whatever format it had on input.
-
-If @code{COFF_LONG_SECTION_NAMES} is simply defined (blank), or is
-defined to the value "1", then long section names are enabled by
-default; if it is defined to the value zero, they are disabled by
-default (but still accepted in input BFDs). The header @file{coffcode.h}
-defines a macro, @code{COFF_DEFAULT_LONG_SECTION_NAMES}, which is
-used in the backends to initialise the backend data structure fields
-appropriately; see the comments for further detail.
-
-@subsubsection Bit twiddling
-Each flavour of coff supported in BFD has its own header file
-describing the external layout of the structures. There is also
-an internal description of the coff layout, in
-@file{coff/internal.h}. A major function of the
-coff backend is swapping the bytes and twiddling the bits to
-translate the external form of the structures into the normal
-internal form. This is all performed in the
-@code{bfd_swap}_@i{thing}_@i{direction} routines. Some
-elements are different sizes between different versions of
-coff; it is the duty of the coff version specific include file
-to override the definitions of various packing routines in
-@file{coffcode.h}. E.g., the size of line number entry in coff is
-sometimes 16 bits, and sometimes 32 bits. @code{#define}ing
-@code{PUT_LNSZ_LNNO} and @code{GET_LNSZ_LNNO} will select the
-correct one. No doubt, some day someone will find a version of
-coff which has a varying field size not catered to at the
-moment. To port BFD, that person will have to add more @code{#defines}.
-Three of the bit twiddling routines are exported to
-@code{gdb}; @code{coff_swap_aux_in}, @code{coff_swap_sym_in}
-and @code{coff_swap_lineno_in}. @code{GDB} reads the symbol
-table on its own, but uses BFD to fix things up. More of the
-bit twiddlers are exported for @code{gas};
-@code{coff_swap_aux_out}, @code{coff_swap_sym_out},
-@code{coff_swap_lineno_out}, @code{coff_swap_reloc_out},
-@code{coff_swap_filehdr_out}, @code{coff_swap_aouthdr_out},
-@code{coff_swap_scnhdr_out}. @code{Gas} currently keeps track
-of all the symbol table and reloc drudgery itself, thereby
-saving the internal BFD overhead, but uses BFD to swap things
-on the way out, making cross ports much safer. Doing so also
-allows BFD (and thus the linker) to use the same header files
-as @code{gas}, which makes one avenue to disaster disappear.
-
-@subsubsection Symbol reading
-The simple canonical form for symbols used by BFD is not rich
-enough to keep all the information available in a coff symbol
-table. The back end gets around this problem by keeping the original
-symbol table around, "behind the scenes".
-
-When a symbol table is requested (through a call to
-@code{bfd_canonicalize_symtab}), a request gets through to
-@code{coff_get_normalized_symtab}. This reads the symbol table from
-the coff file and swaps all the structures inside into the
-internal form. It also fixes up all the pointers in the table
-(represented in the file by offsets from the first symbol in
-the table) into physical pointers to elements in the new
-internal table. This involves some work since the meanings of
-fields change depending upon context: a field that is a
-pointer to another structure in the symbol table at one moment
-may be the size in bytes of a structure at the next. Another
-pass is made over the table. All symbols which mark file names
-(@code{C_FILE} symbols) are modified so that the internal
-string points to the value in the auxent (the real filename)
-rather than the normal text associated with the symbol
-(@code{".file"}).
-
-At this time the symbol names are moved around. Coff stores
-all symbols less than nine characters long physically
-within the symbol table; longer strings are kept at the end of
-the file in the string table. This pass moves all strings
-into memory and replaces them with pointers to the strings.
-
-The symbol table is massaged once again, this time to create
-the canonical table used by the BFD application. Each symbol
-is inspected in turn, and a decision made (using the
-@code{sclass} field) about the various flags to set in the
-@code{asymbol}. @xref{Symbols}. The generated canonical table
-shares strings with the hidden internal symbol table.
-
-Any linenumbers are read from the coff file too, and attached
-to the symbols which own the functions the linenumbers belong to.
-
-@subsubsection Symbol writing
-Writing a symbol to a coff file which didn't come from a coff
-file will lose any debugging information. The @code{asymbol}
-structure remembers the BFD from which the symbol was taken, and on
-output the back end makes sure that the same destination target as
-source target is present.
-
-When the symbols have come from a coff file then all the
-debugging information is preserved.
-
-Symbol tables are provided for writing to the back end in a
-vector of pointers to pointers. This allows applications like
-the linker to accumulate and output large symbol tables
-without having to do too much byte copying.
-
-This function runs through the provided symbol table and
-patches each symbol marked as a file place holder
-(@code{C_FILE}) to point to the next file place holder in the
-list. It also marks each @code{offset} field in the list with
-the offset from the first symbol of the current symbol.
-
-Another function of this procedure is to turn the canonical
-value form of BFD into the form used by coff. Internally, BFD
-expects symbol values to be offsets from a section base; so a
-symbol physically at 0x120, but in a section starting at
-0x100, would have the value 0x20. Coff expects symbols to
-contain their final value, so symbols have their values
-changed at this point to reflect their sum with their owning
-section. This transformation uses the
-@code{output_section} field of the @code{asymbol}'s
-@code{asection} @xref{Sections}.
-
-@itemize @bullet
-
-@item
-@code{coff_mangle_symbols}
-@end itemize
-This routine runs though the provided symbol table and uses
-the offsets generated by the previous pass and the pointers
-generated when the symbol table was read in to create the
-structured hierarchy required by coff. It changes each pointer
-to a symbol into the index into the symbol table of the asymbol.
-
-@itemize @bullet
-
-@item
-@code{coff_write_symbols}
-@end itemize
-This routine runs through the symbol table and patches up the
-symbols from their internal form into the coff way, calls the
-bit twiddlers, and writes out the table to the file.
-
-@findex coff_symbol_type
-@subsubsection @code{coff_symbol_type}
-@strong{Description}@*
-The hidden information for an @code{asymbol} is described in a
-@code{combined_entry_type}:
-
-
-@example
-
-typedef struct coff_ptr_struct
-@{
- /* Remembers the offset from the first symbol in the file for
- this symbol. Generated by coff_renumber_symbols. */
- unsigned int offset;
-
- /* Should the value of this symbol be renumbered. Used for
- XCOFF C_BSTAT symbols. Set by coff_slurp_symbol_table. */
- unsigned int fix_value : 1;
-
- /* Should the tag field of this symbol be renumbered.
- Created by coff_pointerize_aux. */
- unsigned int fix_tag : 1;
-
- /* Should the endidx field of this symbol be renumbered.
- Created by coff_pointerize_aux. */
- unsigned int fix_end : 1;
-
- /* Should the x_csect.x_scnlen field be renumbered.
- Created by coff_pointerize_aux. */
- unsigned int fix_scnlen : 1;
-
- /* Fix up an XCOFF C_BINCL/C_EINCL symbol. The value is the
- index into the line number entries. Set by coff_slurp_symbol_table. */
- unsigned int fix_line : 1;
-
- /* The container for the symbol structure as read and translated
- from the file. */
- union
- @{
- union internal_auxent auxent;
- struct internal_syment syment;
- @} u;
-@} combined_entry_type;
-
-
-/* Each canonical asymbol really looks like this: */
-
-typedef struct coff_symbol_struct
-@{
- /* The actual symbol which the rest of BFD works with */
- asymbol symbol;
-
- /* A pointer to the hidden information for this symbol */
- combined_entry_type *native;
-
- /* A pointer to the linenumber information for this symbol */
- struct lineno_cache_entry *lineno;
-
- /* Have the line numbers been relocated yet ? */
- bfd_boolean done_lineno;
-@} coff_symbol_type;
-@end example
-@findex bfd_coff_backend_data
-@subsubsection @code{bfd_coff_backend_data}
-
-@example
-/* COFF symbol classifications. */
-
-enum coff_symbol_classification
-@{
- /* Global symbol. */
- COFF_SYMBOL_GLOBAL,
- /* Common symbol. */
- COFF_SYMBOL_COMMON,
- /* Undefined symbol. */
- COFF_SYMBOL_UNDEFINED,
- /* Local symbol. */
- COFF_SYMBOL_LOCAL,
- /* PE section symbol. */
- COFF_SYMBOL_PE_SECTION
-@};
-
-@end example
-Special entry points for gdb to swap in coff symbol table parts:
-@example
-typedef struct
-@{
- void (*_bfd_coff_swap_aux_in)
- (bfd *, void *, int, int, int, int, void *);
-
- void (*_bfd_coff_swap_sym_in)
- (bfd *, void *, void *);
-
- void (*_bfd_coff_swap_lineno_in)
- (bfd *, void *, void *);
-
- unsigned int (*_bfd_coff_swap_aux_out)
- (bfd *, void *, int, int, int, int, void *);
-
- unsigned int (*_bfd_coff_swap_sym_out)
- (bfd *, void *, void *);
-
- unsigned int (*_bfd_coff_swap_lineno_out)
- (bfd *, void *, void *);
-
- unsigned int (*_bfd_coff_swap_reloc_out)
- (bfd *, void *, void *);
-
- unsigned int (*_bfd_coff_swap_filehdr_out)
- (bfd *, void *, void *);
-
- unsigned int (*_bfd_coff_swap_aouthdr_out)
- (bfd *, void *, void *);
-
- unsigned int (*_bfd_coff_swap_scnhdr_out)
- (bfd *, void *, void *);
-
- unsigned int _bfd_filhsz;
- unsigned int _bfd_aoutsz;
- unsigned int _bfd_scnhsz;
- unsigned int _bfd_symesz;
- unsigned int _bfd_auxesz;
- unsigned int _bfd_relsz;
- unsigned int _bfd_linesz;
- unsigned int _bfd_filnmlen;
- bfd_boolean _bfd_coff_long_filenames;
-
- bfd_boolean _bfd_coff_long_section_names;
- bfd_boolean (*_bfd_coff_set_long_section_names)
- (bfd *, int);
-
- unsigned int _bfd_coff_default_section_alignment_power;
- bfd_boolean _bfd_coff_force_symnames_in_strings;
- unsigned int _bfd_coff_debug_string_prefix_length;
-
- void (*_bfd_coff_swap_filehdr_in)
- (bfd *, void *, void *);
-
- void (*_bfd_coff_swap_aouthdr_in)
- (bfd *, void *, void *);
-
- void (*_bfd_coff_swap_scnhdr_in)
- (bfd *, void *, void *);
-
- void (*_bfd_coff_swap_reloc_in)
- (bfd *abfd, void *, void *);
-
- bfd_boolean (*_bfd_coff_bad_format_hook)
- (bfd *, void *);
-
- bfd_boolean (*_bfd_coff_set_arch_mach_hook)
- (bfd *, void *);
-
- void * (*_bfd_coff_mkobject_hook)
- (bfd *, void *, void *);
-
- bfd_boolean (*_bfd_styp_to_sec_flags_hook)
- (bfd *, void *, const char *, asection *, flagword *);
-
- void (*_bfd_set_alignment_hook)
- (bfd *, asection *, void *);
-
- bfd_boolean (*_bfd_coff_slurp_symbol_table)
- (bfd *);
-
- bfd_boolean (*_bfd_coff_symname_in_debug)
- (bfd *, struct internal_syment *);
-
- bfd_boolean (*_bfd_coff_pointerize_aux_hook)
- (bfd *, combined_entry_type *, combined_entry_type *,
- unsigned int, combined_entry_type *);
-
- bfd_boolean (*_bfd_coff_print_aux)
- (bfd *, FILE *, combined_entry_type *, combined_entry_type *,
- combined_entry_type *, unsigned int);
-
- void (*_bfd_coff_reloc16_extra_cases)
- (bfd *, struct bfd_link_info *, struct bfd_link_order *, arelent *,
- bfd_byte *, unsigned int *, unsigned int *);
-
- int (*_bfd_coff_reloc16_estimate)
- (bfd *, asection *, arelent *, unsigned int,
- struct bfd_link_info *);
-
- enum coff_symbol_classification (*_bfd_coff_classify_symbol)
- (bfd *, struct internal_syment *);
-
- bfd_boolean (*_bfd_coff_compute_section_file_positions)
- (bfd *);
-
- bfd_boolean (*_bfd_coff_start_final_link)
- (bfd *, struct bfd_link_info *);
-
- bfd_boolean (*_bfd_coff_relocate_section)
- (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
- struct internal_reloc *, struct internal_syment *, asection **);
-
- reloc_howto_type *(*_bfd_coff_rtype_to_howto)
- (bfd *, asection *, struct internal_reloc *,
- struct coff_link_hash_entry *, struct internal_syment *,
- bfd_vma *);
-
- bfd_boolean (*_bfd_coff_adjust_symndx)
- (bfd *, struct bfd_link_info *, bfd *, asection *,
- struct internal_reloc *, bfd_boolean *);
-
- bfd_boolean (*_bfd_coff_link_add_one_symbol)
- (struct bfd_link_info *, bfd *, const char *, flagword,
- asection *, bfd_vma, const char *, bfd_boolean, bfd_boolean,
- struct bfd_link_hash_entry **);
-
- bfd_boolean (*_bfd_coff_link_output_has_begun)
- (bfd *, struct coff_final_link_info *);
-
- bfd_boolean (*_bfd_coff_final_link_postscript)
- (bfd *, struct coff_final_link_info *);
-
- bfd_boolean (*_bfd_coff_print_pdata)
- (bfd *, void *);
-
-@} bfd_coff_backend_data;
-
-#define coff_backend_info(abfd) \
- ((bfd_coff_backend_data *) (abfd)->xvec->backend_data)
-
-#define bfd_coff_swap_aux_in(a,e,t,c,ind,num,i) \
- ((coff_backend_info (a)->_bfd_coff_swap_aux_in) (a,e,t,c,ind,num,i))
-
-#define bfd_coff_swap_sym_in(a,e,i) \
- ((coff_backend_info (a)->_bfd_coff_swap_sym_in) (a,e,i))
-
-#define bfd_coff_swap_lineno_in(a,e,i) \
- ((coff_backend_info ( a)->_bfd_coff_swap_lineno_in) (a,e,i))
-
-#define bfd_coff_swap_reloc_out(abfd, i, o) \
- ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_out) (abfd, i, o))
-
-#define bfd_coff_swap_lineno_out(abfd, i, o) \
- ((coff_backend_info (abfd)->_bfd_coff_swap_lineno_out) (abfd, i, o))
-
-#define bfd_coff_swap_aux_out(a,i,t,c,ind,num,o) \
- ((coff_backend_info (a)->_bfd_coff_swap_aux_out) (a,i,t,c,ind,num,o))
-
-#define bfd_coff_swap_sym_out(abfd, i,o) \
- ((coff_backend_info (abfd)->_bfd_coff_swap_sym_out) (abfd, i, o))
-
-#define bfd_coff_swap_scnhdr_out(abfd, i,o) \
- ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_out) (abfd, i, o))
-
-#define bfd_coff_swap_filehdr_out(abfd, i,o) \
- ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_out) (abfd, i, o))
-
-#define bfd_coff_swap_aouthdr_out(abfd, i,o) \
- ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_out) (abfd, i, o))
-
-#define bfd_coff_filhsz(abfd) (coff_backend_info (abfd)->_bfd_filhsz)
-#define bfd_coff_aoutsz(abfd) (coff_backend_info (abfd)->_bfd_aoutsz)
-#define bfd_coff_scnhsz(abfd) (coff_backend_info (abfd)->_bfd_scnhsz)
-#define bfd_coff_symesz(abfd) (coff_backend_info (abfd)->_bfd_symesz)
-#define bfd_coff_auxesz(abfd) (coff_backend_info (abfd)->_bfd_auxesz)
-#define bfd_coff_relsz(abfd) (coff_backend_info (abfd)->_bfd_relsz)
-#define bfd_coff_linesz(abfd) (coff_backend_info (abfd)->_bfd_linesz)
-#define bfd_coff_filnmlen(abfd) (coff_backend_info (abfd)->_bfd_filnmlen)
-#define bfd_coff_long_filenames(abfd) \
- (coff_backend_info (abfd)->_bfd_coff_long_filenames)
-#define bfd_coff_long_section_names(abfd) \
- (coff_backend_info (abfd)->_bfd_coff_long_section_names)
-#define bfd_coff_set_long_section_names(abfd, enable) \
- ((coff_backend_info (abfd)->_bfd_coff_set_long_section_names) (abfd, enable))
-#define bfd_coff_default_section_alignment_power(abfd) \
- (coff_backend_info (abfd)->_bfd_coff_default_section_alignment_power)
-#define bfd_coff_swap_filehdr_in(abfd, i,o) \
- ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_in) (abfd, i, o))
-
-#define bfd_coff_swap_aouthdr_in(abfd, i,o) \
- ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_in) (abfd, i, o))
-
-#define bfd_coff_swap_scnhdr_in(abfd, i,o) \
- ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_in) (abfd, i, o))
-
-#define bfd_coff_swap_reloc_in(abfd, i, o) \
- ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_in) (abfd, i, o))
-
-#define bfd_coff_bad_format_hook(abfd, filehdr) \
- ((coff_backend_info (abfd)->_bfd_coff_bad_format_hook) (abfd, filehdr))
-
-#define bfd_coff_set_arch_mach_hook(abfd, filehdr)\
- ((coff_backend_info (abfd)->_bfd_coff_set_arch_mach_hook) (abfd, filehdr))
-#define bfd_coff_mkobject_hook(abfd, filehdr, aouthdr)\
- ((coff_backend_info (abfd)->_bfd_coff_mkobject_hook)\
- (abfd, filehdr, aouthdr))
-
-#define bfd_coff_styp_to_sec_flags_hook(abfd, scnhdr, name, section, flags_ptr)\
- ((coff_backend_info (abfd)->_bfd_styp_to_sec_flags_hook)\
- (abfd, scnhdr, name, section, flags_ptr))
-
-#define bfd_coff_set_alignment_hook(abfd, sec, scnhdr)\
- ((coff_backend_info (abfd)->_bfd_set_alignment_hook) (abfd, sec, scnhdr))
-
-#define bfd_coff_slurp_symbol_table(abfd)\
- ((coff_backend_info (abfd)->_bfd_coff_slurp_symbol_table) (abfd))
-
-#define bfd_coff_symname_in_debug(abfd, sym)\
- ((coff_backend_info (abfd)->_bfd_coff_symname_in_debug) (abfd, sym))
-
-#define bfd_coff_force_symnames_in_strings(abfd)\
- (coff_backend_info (abfd)->_bfd_coff_force_symnames_in_strings)
-
-#define bfd_coff_debug_string_prefix_length(abfd)\
- (coff_backend_info (abfd)->_bfd_coff_debug_string_prefix_length)
-
-#define bfd_coff_print_aux(abfd, file, base, symbol, aux, indaux)\
- ((coff_backend_info (abfd)->_bfd_coff_print_aux)\
- (abfd, file, base, symbol, aux, indaux))
-
-#define bfd_coff_reloc16_extra_cases(abfd, link_info, link_order,\
- reloc, data, src_ptr, dst_ptr)\
- ((coff_backend_info (abfd)->_bfd_coff_reloc16_extra_cases)\
- (abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr))
-
-#define bfd_coff_reloc16_estimate(abfd, section, reloc, shrink, link_info)\
- ((coff_backend_info (abfd)->_bfd_coff_reloc16_estimate)\
- (abfd, section, reloc, shrink, link_info))
-
-#define bfd_coff_classify_symbol(abfd, sym)\
- ((coff_backend_info (abfd)->_bfd_coff_classify_symbol)\
- (abfd, sym))
-
-#define bfd_coff_compute_section_file_positions(abfd)\
- ((coff_backend_info (abfd)->_bfd_coff_compute_section_file_positions)\
- (abfd))
-
-#define bfd_coff_start_final_link(obfd, info)\
- ((coff_backend_info (obfd)->_bfd_coff_start_final_link)\
- (obfd, info))
-#define bfd_coff_relocate_section(obfd,info,ibfd,o,con,rel,isyms,secs)\
- ((coff_backend_info (ibfd)->_bfd_coff_relocate_section)\
- (obfd, info, ibfd, o, con, rel, isyms, secs))
-#define bfd_coff_rtype_to_howto(abfd, sec, rel, h, sym, addendp)\
- ((coff_backend_info (abfd)->_bfd_coff_rtype_to_howto)\
- (abfd, sec, rel, h, sym, addendp))
-#define bfd_coff_adjust_symndx(obfd, info, ibfd, sec, rel, adjustedp)\
- ((coff_backend_info (abfd)->_bfd_coff_adjust_symndx)\
- (obfd, info, ibfd, sec, rel, adjustedp))
-#define bfd_coff_link_add_one_symbol(info, abfd, name, flags, section,\
- value, string, cp, coll, hashp)\
- ((coff_backend_info (abfd)->_bfd_coff_link_add_one_symbol)\
- (info, abfd, name, flags, section, value, string, cp, coll, hashp))
-
-#define bfd_coff_link_output_has_begun(a,p) \
- ((coff_backend_info (a)->_bfd_coff_link_output_has_begun) (a, p))
-#define bfd_coff_final_link_postscript(a,p) \
- ((coff_backend_info (a)->_bfd_coff_final_link_postscript) (a, p))
-
-#define bfd_coff_have_print_pdata(a) \
- (coff_backend_info (a)->_bfd_coff_print_pdata)
-#define bfd_coff_print_pdata(a,p) \
- ((coff_backend_info (a)->_bfd_coff_print_pdata) (a, p))
-
-/* Macro: Returns true if the bfd is a PE executable as opposed to a
- PE object file. */
-#define bfd_pei_p(abfd) \
- (CONST_STRNEQ ((abfd)->xvec->name, "pei-"))
-@end example
-@subsubsection Writing relocations
-To write relocations, the back end steps though the
-canonical relocation table and create an
-@code{internal_reloc}. The symbol index to use is removed from
-the @code{offset} field in the symbol table supplied. The
-address comes directly from the sum of the section base
-address and the relocation offset; the type is dug directly
-from the howto field. Then the @code{internal_reloc} is
-swapped into the shape of an @code{external_reloc} and written
-out to disk.
-
-@subsubsection Reading linenumbers
-Creating the linenumber table is done by reading in the entire
-coff linenumber table, and creating another table for internal use.
-
-A coff linenumber table is structured so that each function
-is marked as having a line number of 0. Each line within the
-function is an offset from the first line in the function. The
-base of the line number information for the table is stored in
-the symbol associated with the function.
-
-Note: The PE format uses line number 0 for a flag indicating a
-new source file.
-
-The information is copied from the external to the internal
-table, and each symbol which marks a function is marked by
-pointing its...
-
-How does this work ?
-
-@subsubsection Reading relocations
-Coff relocations are easily transformed into the internal BFD form
-(@code{arelent}).
-
-Reading a coff relocation table is done in the following stages:
-
-@itemize @bullet
-
-@item
-Read the entire coff relocation table into memory.
-
-@item
-Process each relocation in turn; first swap it from the
-external to the internal form.
-
-@item
-Turn the symbol referenced in the relocation's symbol index
-into a pointer into the canonical symbol table.
-This table is the same as the one returned by a call to
-@code{bfd_canonicalize_symtab}. The back end will call that
-routine and save the result if a canonicalization hasn't been done.
-
-@item
-The reloc index is turned into a pointer to a howto
-structure, in a back end specific way. For instance, the 386
-and 960 use the @code{r_type} to directly produce an index
-into a howto table vector; the 88k subtracts a number from the
-@code{r_type} field and creates an addend field.
-@end itemize
-
diff -Nur binutils-2.24.orig/bfd/doc/core.texi binutils-2.24/bfd/doc/core.texi
--- binutils-2.24.orig/bfd/doc/core.texi 2013-11-18 09:49:27.000000000 +0100
+++ binutils-2.24/bfd/doc/core.texi 1970-01-01 01:00:00.000000000 +0100
@@ -1,70 +0,0 @@
-@section Core files
-
-
-@subsection Core file functions
-
-
-@strong{Description}@*
-These are functions pertaining to core files.
-
-@findex bfd_core_file_failing_command
-@subsubsection @code{bfd_core_file_failing_command}
-@strong{Synopsis}
-@example
-const char *bfd_core_file_failing_command (bfd *abfd);
-@end example
-@strong{Description}@*
-Return a read-only string explaining which program was running
-when it failed and produced the core file @var{abfd}.
-
-@findex bfd_core_file_failing_signal
-@subsubsection @code{bfd_core_file_failing_signal}
-@strong{Synopsis}
-@example
-int bfd_core_file_failing_signal (bfd *abfd);
-@end example
-@strong{Description}@*
-Returns the signal number which caused the core dump which
-generated the file the BFD @var{abfd} is attached to.
-
-@findex bfd_core_file_pid
-@subsubsection @code{bfd_core_file_pid}
-@strong{Synopsis}
-@example
-int bfd_core_file_pid (bfd *abfd);
-@end example
-@strong{Description}@*
-Returns the PID of the process the core dump the BFD
-@var{abfd} is attached to was generated from.
-
-@findex core_file_matches_executable_p
-@subsubsection @code{core_file_matches_executable_p}
-@strong{Synopsis}
-@example
-bfd_boolean core_file_matches_executable_p
- (bfd *core_bfd, bfd *exec_bfd);
-@end example
-@strong{Description}@*
-Return @code{TRUE} if the core file attached to @var{core_bfd}
-was generated by a run of the executable file attached to
-@var{exec_bfd}, @code{FALSE} otherwise.
-
-@findex generic_core_file_matches_executable_p
-@subsubsection @code{generic_core_file_matches_executable_p}
-@strong{Synopsis}
-@example
-bfd_boolean generic_core_file_matches_executable_p
- (bfd *core_bfd, bfd *exec_bfd);
-@end example
-@strong{Description}@*
-Return TRUE if the core file attached to @var{core_bfd}
-was generated by a run of the executable file attached
-to @var{exec_bfd}. The match is based on executable
-basenames only.
-
-Note: When not able to determine the core file failing
-command or the executable name, we still return TRUE even
-though we're not sure that core file and executable match.
-This is to avoid generating a false warning in situations
-where we really don't know whether they match or not.
-
diff -Nur binutils-2.24.orig/bfd/doc/elf.texi binutils-2.24/bfd/doc/elf.texi
--- binutils-2.24.orig/bfd/doc/elf.texi 2013-11-18 09:49:27.000000000 +0100
+++ binutils-2.24/bfd/doc/elf.texi 1970-01-01 01:00:00.000000000 +0100
@@ -1,9 +0,0 @@
-@section ELF backends
-BFD support for ELF formats is being worked on.
-Currently, the best supported back ends are for sparc and i386
-(running svr4 or Solaris 2).
-
-Documentation of the internals of the support code still needs
-to be written. The code is changing quickly enough that we
-haven't bothered yet.
-
diff -Nur binutils-2.24.orig/bfd/doc/format.texi binutils-2.24/bfd/doc/format.texi
--- binutils-2.24.orig/bfd/doc/format.texi 2013-11-18 09:49:27.000000000 +0100
+++ binutils-2.24/bfd/doc/format.texi 1970-01-01 01:00:00.000000000 +0100
@@ -1,112 +0,0 @@
-@section File formats
-A format is a BFD concept of high level file contents type. The
-formats supported by BFD are:
-
-@itemize @bullet
-
-@item
-@code{bfd_object}
-@end itemize
-The BFD may contain data, symbols, relocations and debug info.
-
-@itemize @bullet
-
-@item
-@code{bfd_archive}
-@end itemize
-The BFD contains other BFDs and an optional index.
-
-@itemize @bullet
-
-@item
-@code{bfd_core}
-@end itemize
-The BFD contains the result of an executable core dump.
-
-@subsection File format functions
-
-
-@findex bfd_check_format
-@subsubsection @code{bfd_check_format}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_check_format (bfd *abfd, bfd_format format);
-@end example
-@strong{Description}@*
-Verify if the file attached to the BFD @var{abfd} is compatible
-with the format @var{format} (i.e., one of @code{bfd_object},
-@code{bfd_archive} or @code{bfd_core}).
-
-If the BFD has been set to a specific target before the
-call, only the named target and format combination is
-checked. If the target has not been set, or has been set to
-@code{default}, then all the known target backends is
-interrogated to determine a match. If the default target
-matches, it is used. If not, exactly one target must recognize
-the file, or an error results.
-
-The function returns @code{TRUE} on success, otherwise @code{FALSE}
-with one of the following error codes:
-
-@itemize @bullet
-
-@item
-@code{bfd_error_invalid_operation} -
-if @code{format} is not one of @code{bfd_object}, @code{bfd_archive} or
-@code{bfd_core}.
-
-@item
-@code{bfd_error_system_call} -
-if an error occured during a read - even some file mismatches
-can cause bfd_error_system_calls.
-
-@item
-@code{file_not_recognised} -
-none of the backends recognised the file format.
-
-@item
-@code{bfd_error_file_ambiguously_recognized} -
-more than one backend recognised the file format.
-@end itemize
-
-@findex bfd_check_format_matches
-@subsubsection @code{bfd_check_format_matches}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_check_format_matches
- (bfd *abfd, bfd_format format, char ***matching);
-@end example
-@strong{Description}@*
-Like @code{bfd_check_format}, except when it returns FALSE with
-@code{bfd_errno} set to @code{bfd_error_file_ambiguously_recognized}. In that
-case, if @var{matching} is not NULL, it will be filled in with
-a NULL-terminated list of the names of the formats that matched,
-allocated with @code{malloc}.
-Then the user may choose a format and try again.
-
-When done with the list that @var{matching} points to, the caller
-should free it.
-
-@findex bfd_set_format
-@subsubsection @code{bfd_set_format}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_set_format (bfd *abfd, bfd_format format);
-@end example
-@strong{Description}@*
-This function sets the file format of the BFD @var{abfd} to the
-format @var{format}. If the target set in the BFD does not
-support the format requested, the format is invalid, or the BFD
-is not open for writing, then an error occurs.
-
-@findex bfd_format_string
-@subsubsection @code{bfd_format_string}
-@strong{Synopsis}
-@example
-const char *bfd_format_string (bfd_format format);
-@end example
-@strong{Description}@*
-Return a pointer to a const string
-@code{invalid}, @code{object}, @code{archive}, @code{core}, or @code{unknown},
-depending upon the value of @var{format}.
-
diff -Nur binutils-2.24.orig/bfd/doc/hash.texi binutils-2.24/bfd/doc/hash.texi
--- binutils-2.24.orig/bfd/doc/hash.texi 2013-11-18 09:49:27.000000000 +0100
+++ binutils-2.24/bfd/doc/hash.texi 1970-01-01 01:00:00.000000000 +0100
@@ -1,247 +0,0 @@
-@section Hash Tables
-@cindex Hash tables
-BFD provides a simple set of hash table functions. Routines
-are provided to initialize a hash table, to free a hash table,
-to look up a string in a hash table and optionally create an
-entry for it, and to traverse a hash table. There is
-currently no routine to delete an string from a hash table.
-
-The basic hash table does not permit any data to be stored
-with a string. However, a hash table is designed to present a
-base class from which other types of hash tables may be
-derived. These derived types may store additional information
-with the string. Hash tables were implemented in this way,
-rather than simply providing a data pointer in a hash table
-entry, because they were designed for use by the linker back
-ends. The linker may create thousands of hash table entries,
-and the overhead of allocating private data and storing and
-following pointers becomes noticeable.
-
-The basic hash table code is in @code{hash.c}.
-
-@menu
-* Creating and Freeing a Hash Table::
-* Looking Up or Entering a String::
-* Traversing a Hash Table::
-* Deriving a New Hash Table Type::
-@end menu
-
-@node Creating and Freeing a Hash Table, Looking Up or Entering a String, Hash Tables, Hash Tables
-@subsection Creating and freeing a hash table
-@findex bfd_hash_table_init
-@findex bfd_hash_table_init_n
-To create a hash table, create an instance of a @code{struct
-bfd_hash_table} (defined in @code{bfd.h}) and call
-@code{bfd_hash_table_init} (if you know approximately how many
-entries you will need, the function @code{bfd_hash_table_init_n},
-which takes a @var{size} argument, may be used).
-@code{bfd_hash_table_init} returns @code{FALSE} if some sort of
-error occurs.
-
-@findex bfd_hash_newfunc
-The function @code{bfd_hash_table_init} take as an argument a
-function to use to create new entries. For a basic hash
-table, use the function @code{bfd_hash_newfunc}. @xref{Deriving
-a New Hash Table Type}, for why you would want to use a
-different value for this argument.
-
-@findex bfd_hash_allocate
-@code{bfd_hash_table_init} will create an objalloc which will be
-used to allocate new entries. You may allocate memory on this
-objalloc using @code{bfd_hash_allocate}.
-
-@findex bfd_hash_table_free
-Use @code{bfd_hash_table_free} to free up all the memory that has
-been allocated for a hash table. This will not free up the
-@code{struct bfd_hash_table} itself, which you must provide.
-
-@findex bfd_hash_set_default_size
-Use @code{bfd_hash_set_default_size} to set the default size of
-hash table to use.
-
-@node Looking Up or Entering a String, Traversing a Hash Table, Creating and Freeing a Hash Table, Hash Tables
-@subsection Looking up or entering a string
-@findex bfd_hash_lookup
-The function @code{bfd_hash_lookup} is used both to look up a
-string in the hash table and to create a new entry.
-
-If the @var{create} argument is @code{FALSE}, @code{bfd_hash_lookup}
-will look up a string. If the string is found, it will
-returns a pointer to a @code{struct bfd_hash_entry}. If the
-string is not found in the table @code{bfd_hash_lookup} will
-return @code{NULL}. You should not modify any of the fields in
-the returns @code{struct bfd_hash_entry}.
-
-If the @var{create} argument is @code{TRUE}, the string will be
-entered into the hash table if it is not already there.
-Either way a pointer to a @code{struct bfd_hash_entry} will be
-returned, either to the existing structure or to a newly
-created one. In this case, a @code{NULL} return means that an
-error occurred.
-
-If the @var{create} argument is @code{TRUE}, and a new entry is
-created, the @var{copy} argument is used to decide whether to
-copy the string onto the hash table objalloc or not. If
-@var{copy} is passed as @code{FALSE}, you must be careful not to
-deallocate or modify the string as long as the hash table
-exists.
-
-@node Traversing a Hash Table, Deriving a New Hash Table Type, Looking Up or Entering a String, Hash Tables
-@subsection Traversing a hash table
-@findex bfd_hash_traverse
-The function @code{bfd_hash_traverse} may be used to traverse a
-hash table, calling a function on each element. The traversal
-is done in a random order.
-
-@code{bfd_hash_traverse} takes as arguments a function and a
-generic @code{void *} pointer. The function is called with a
-hash table entry (a @code{struct bfd_hash_entry *}) and the
-generic pointer passed to @code{bfd_hash_traverse}. The function
-must return a @code{boolean} value, which indicates whether to
-continue traversing the hash table. If the function returns
-@code{FALSE}, @code{bfd_hash_traverse} will stop the traversal and
-return immediately.
-
-@node Deriving a New Hash Table Type, , Traversing a Hash Table, Hash Tables
-@subsection Deriving a new hash table type
-Many uses of hash tables want to store additional information
-which each entry in the hash table. Some also find it
-convenient to store additional information with the hash table
-itself. This may be done using a derived hash table.
-
-Since C is not an object oriented language, creating a derived
-hash table requires sticking together some boilerplate
-routines with a few differences specific to the type of hash
-table you want to create.
-
-An example of a derived hash table is the linker hash table.
-The structures for this are defined in @code{bfdlink.h}. The
-functions are in @code{linker.c}.
-
-You may also derive a hash table from an already derived hash
-table. For example, the a.out linker backend code uses a hash
-table derived from the linker hash table.
-
-@menu
-* Define the Derived Structures::
-* Write the Derived Creation Routine::
-* Write Other Derived Routines::
-@end menu
-
-@node Define the Derived Structures, Write the Derived Creation Routine, Deriving a New Hash Table Type, Deriving a New Hash Table Type
-@subsubsection Define the derived structures
-You must define a structure for an entry in the hash table,
-and a structure for the hash table itself.
-
-The first field in the structure for an entry in the hash
-table must be of the type used for an entry in the hash table
-you are deriving from. If you are deriving from a basic hash
-table this is @code{struct bfd_hash_entry}, which is defined in
-@code{bfd.h}. The first field in the structure for the hash
-table itself must be of the type of the hash table you are
-deriving from itself. If you are deriving from a basic hash
-table, this is @code{struct bfd_hash_table}.
-
-For example, the linker hash table defines @code{struct
-bfd_link_hash_entry} (in @code{bfdlink.h}). The first field,
-@code{root}, is of type @code{struct bfd_hash_entry}. Similarly,
-the first field in @code{struct bfd_link_hash_table}, @code{table},
-is of type @code{struct bfd_hash_table}.
-
-@node Write the Derived Creation Routine, Write Other Derived Routines, Define the Derived Structures, Deriving a New Hash Table Type
-@subsubsection Write the derived creation routine
-You must write a routine which will create and initialize an
-entry in the hash table. This routine is passed as the
-function argument to @code{bfd_hash_table_init}.
-
-In order to permit other hash tables to be derived from the
-hash table you are creating, this routine must be written in a
-standard way.
-
-The first argument to the creation routine is a pointer to a
-hash table entry. This may be @code{NULL}, in which case the
-routine should allocate the right amount of space. Otherwise
-the space has already been allocated by a hash table type
-derived from this one.
-
-After allocating space, the creation routine must call the
-creation routine of the hash table type it is derived from,
-passing in a pointer to the space it just allocated. This
-will initialize any fields used by the base hash table.
-
-Finally the creation routine must initialize any local fields
-for the new hash table type.
-
-Here is a boilerplate example of a creation routine.
-@var{function_name} is the name of the routine.
-@var{entry_type} is the type of an entry in the hash table you
-are creating. @var{base_newfunc} is the name of the creation
-routine of the hash table type your hash table is derived
-from.
-
-
-@example
-struct bfd_hash_entry *
-@var{function_name} (struct bfd_hash_entry *entry,
- struct bfd_hash_table *table,
- const char *string)
-@{
- struct @var{entry_type} *ret = (@var{entry_type} *) entry;
-
- /* Allocate the structure if it has not already been allocated by a
- derived class. */
- if (ret == NULL)
- @{
- ret = bfd_hash_allocate (table, sizeof (* ret));
- if (ret == NULL)
- return NULL;
- @}
-
- /* Call the allocation method of the base class. */
- ret = ((@var{entry_type} *)
- @var{base_newfunc} ((struct bfd_hash_entry *) ret, table, string));
-
- /* Initialize the local fields here. */
-
- return (struct bfd_hash_entry *) ret;
-@}
-@end example
-@strong{Description}@*
-The creation routine for the linker hash table, which is in
-@code{linker.c}, looks just like this example.
-@var{function_name} is @code{_bfd_link_hash_newfunc}.
-@var{entry_type} is @code{struct bfd_link_hash_entry}.
-@var{base_newfunc} is @code{bfd_hash_newfunc}, the creation
-routine for a basic hash table.
-
-@code{_bfd_link_hash_newfunc} also initializes the local fields
-in a linker hash table entry: @code{type}, @code{written} and
-@code{next}.
-
-@node Write Other Derived Routines, , Write the Derived Creation Routine, Deriving a New Hash Table Type
-@subsubsection Write other derived routines
-You will want to write other routines for your new hash table,
-as well.
-
-You will want an initialization routine which calls the
-initialization routine of the hash table you are deriving from
-and initializes any other local fields. For the linker hash
-table, this is @code{_bfd_link_hash_table_init} in @code{linker.c}.
-
-You will want a lookup routine which calls the lookup routine
-of the hash table you are deriving from and casts the result.
-The linker hash table uses @code{bfd_link_hash_lookup} in
-@code{linker.c} (this actually takes an additional argument which
-it uses to decide how to return the looked up value).
-
-You may want a traversal routine. This should just call the
-traversal routine of the hash table you are deriving from with
-appropriate casts. The linker hash table uses
-@code{bfd_link_hash_traverse} in @code{linker.c}.
-
-These routines may simply be defined as macros. For example,
-the a.out backend linker hash table, which is derived from the
-linker hash table, uses macros for the lookup and traversal
-routines. These are @code{aout_link_hash_lookup} and
-@code{aout_link_hash_traverse} in aoutx.h.
-
diff -Nur binutils-2.24.orig/bfd/doc/init.texi binutils-2.24/bfd/doc/init.texi
--- binutils-2.24.orig/bfd/doc/init.texi 2013-11-18 09:49:27.000000000 +0100
+++ binutils-2.24/bfd/doc/init.texi 1970-01-01 01:00:00.000000000 +0100
@@ -1,16 +0,0 @@
-@section Initialization
-
-
-@subsection Initialization functions
-These are the functions that handle initializing a BFD.
-
-@findex bfd_init
-@subsubsection @code{bfd_init}
-@strong{Synopsis}
-@example
-void bfd_init (void);
-@end example
-@strong{Description}@*
-This routine must be called before any other BFD function to
-initialize magical internal data structures.
-
diff -Nur binutils-2.24.orig/bfd/doc/libbfd.texi binutils-2.24/bfd/doc/libbfd.texi
--- binutils-2.24.orig/bfd/doc/libbfd.texi 2013-11-18 09:49:27.000000000 +0100
+++ binutils-2.24/bfd/doc/libbfd.texi 1970-01-01 01:00:00.000000000 +0100
@@ -1,179 +0,0 @@
-@section Implementation details
-
-
-@subsection Internal functions
-
-
-@strong{Description}@*
-These routines are used within BFD.
-They are not intended for export, but are documented here for
-completeness.
-
-@findex bfd_write_bigendian_4byte_int
-@subsubsection @code{bfd_write_bigendian_4byte_int}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_write_bigendian_4byte_int (bfd *, unsigned int);
-@end example
-@strong{Description}@*
-Write a 4 byte integer @var{i} to the output BFD @var{abfd}, in big
-endian order regardless of what else is going on. This is useful in
-archives.
-
-@findex bfd_put_size
-@subsubsection @code{bfd_put_size}
-@findex bfd_get_size
-@subsubsection @code{bfd_get_size}
-@strong{Description}@*
-These macros as used for reading and writing raw data in
-sections; each access (except for bytes) is vectored through
-the target format of the BFD and mangled accordingly. The
-mangling performs any necessary endian translations and
-removes alignment restrictions. Note that types accepted and
-returned by these macros are identical so they can be swapped
-around in macros---for example, @file{libaout.h} defines @code{GET_WORD}
-to either @code{bfd_get_32} or @code{bfd_get_64}.
-
-In the put routines, @var{val} must be a @code{bfd_vma}. If we are on a
-system without prototypes, the caller is responsible for making
-sure that is true, with a cast if necessary. We don't cast
-them in the macro definitions because that would prevent @code{lint}
-or @code{gcc -Wall} from detecting sins such as passing a pointer.
-To detect calling these with less than a @code{bfd_vma}, use
-@code{gcc -Wconversion} on a host with 64 bit @code{bfd_vma}'s.
-@example
-
-/* Byte swapping macros for user section data. */
-
-#define bfd_put_8(abfd, val, ptr) \
- ((void) (*((unsigned char *) (ptr)) = (val) & 0xff))
-#define bfd_put_signed_8 \
- bfd_put_8
-#define bfd_get_8(abfd, ptr) \
- (*(const unsigned char *) (ptr) & 0xff)
-#define bfd_get_signed_8(abfd, ptr) \
- (((*(const unsigned char *) (ptr) & 0xff) ^ 0x80) - 0x80)
-
-#define bfd_put_16(abfd, val, ptr) \
- BFD_SEND (abfd, bfd_putx16, ((val),(ptr)))
-#define bfd_put_signed_16 \
- bfd_put_16
-#define bfd_get_16(abfd, ptr) \
- BFD_SEND (abfd, bfd_getx16, (ptr))
-#define bfd_get_signed_16(abfd, ptr) \
- BFD_SEND (abfd, bfd_getx_signed_16, (ptr))
-
-#define bfd_put_32(abfd, val, ptr) \
- BFD_SEND (abfd, bfd_putx32, ((val),(ptr)))
-#define bfd_put_signed_32 \
- bfd_put_32
-#define bfd_get_32(abfd, ptr) \
- BFD_SEND (abfd, bfd_getx32, (ptr))
-#define bfd_get_signed_32(abfd, ptr) \
- BFD_SEND (abfd, bfd_getx_signed_32, (ptr))
-
-#define bfd_put_64(abfd, val, ptr) \
- BFD_SEND (abfd, bfd_putx64, ((val), (ptr)))
-#define bfd_put_signed_64 \
- bfd_put_64
-#define bfd_get_64(abfd, ptr) \
- BFD_SEND (abfd, bfd_getx64, (ptr))
-#define bfd_get_signed_64(abfd, ptr) \
- BFD_SEND (abfd, bfd_getx_signed_64, (ptr))
-
-#define bfd_get(bits, abfd, ptr) \
- ((bits) == 8 ? (bfd_vma) bfd_get_8 (abfd, ptr) \
- : (bits) == 16 ? bfd_get_16 (abfd, ptr) \
- : (bits) == 32 ? bfd_get_32 (abfd, ptr) \
- : (bits) == 64 ? bfd_get_64 (abfd, ptr) \
- : (abort (), (bfd_vma) - 1))
-
-#define bfd_put(bits, abfd, val, ptr) \
- ((bits) == 8 ? bfd_put_8 (abfd, val, ptr) \
- : (bits) == 16 ? bfd_put_16 (abfd, val, ptr) \
- : (bits) == 32 ? bfd_put_32 (abfd, val, ptr) \
- : (bits) == 64 ? bfd_put_64 (abfd, val, ptr) \
- : (abort (), (void) 0))
-
-@end example
-
-@findex bfd_h_put_size
-@subsubsection @code{bfd_h_put_size}
-@strong{Description}@*
-These macros have the same function as their @code{bfd_get_x}
-brethren, except that they are used for removing information
-for the header records of object files. Believe it or not,
-some object files keep their header records in big endian
-order and their data in little endian order.
-@example
-
-/* Byte swapping macros for file header data. */
-
-#define bfd_h_put_8(abfd, val, ptr) \
- bfd_put_8 (abfd, val, ptr)
-#define bfd_h_put_signed_8(abfd, val, ptr) \
- bfd_put_8 (abfd, val, ptr)
-#define bfd_h_get_8(abfd, ptr) \
- bfd_get_8 (abfd, ptr)
-#define bfd_h_get_signed_8(abfd, ptr) \
- bfd_get_signed_8 (abfd, ptr)
-
-#define bfd_h_put_16(abfd, val, ptr) \
- BFD_SEND (abfd, bfd_h_putx16, (val, ptr))
-#define bfd_h_put_signed_16 \
- bfd_h_put_16
-#define bfd_h_get_16(abfd, ptr) \
- BFD_SEND (abfd, bfd_h_getx16, (ptr))
-#define bfd_h_get_signed_16(abfd, ptr) \
- BFD_SEND (abfd, bfd_h_getx_signed_16, (ptr))
-
-#define bfd_h_put_32(abfd, val, ptr) \
- BFD_SEND (abfd, bfd_h_putx32, (val, ptr))
-#define bfd_h_put_signed_32 \
- bfd_h_put_32
-#define bfd_h_get_32(abfd, ptr) \
- BFD_SEND (abfd, bfd_h_getx32, (ptr))
-#define bfd_h_get_signed_32(abfd, ptr) \
- BFD_SEND (abfd, bfd_h_getx_signed_32, (ptr))
-
-#define bfd_h_put_64(abfd, val, ptr) \
- BFD_SEND (abfd, bfd_h_putx64, (val, ptr))
-#define bfd_h_put_signed_64 \
- bfd_h_put_64
-#define bfd_h_get_64(abfd, ptr) \
- BFD_SEND (abfd, bfd_h_getx64, (ptr))
-#define bfd_h_get_signed_64(abfd, ptr) \
- BFD_SEND (abfd, bfd_h_getx_signed_64, (ptr))
-
-/* Aliases for the above, which should eventually go away. */
-
-#define H_PUT_64 bfd_h_put_64
-#define H_PUT_32 bfd_h_put_32
-#define H_PUT_16 bfd_h_put_16
-#define H_PUT_8 bfd_h_put_8
-#define H_PUT_S64 bfd_h_put_signed_64
-#define H_PUT_S32 bfd_h_put_signed_32
-#define H_PUT_S16 bfd_h_put_signed_16
-#define H_PUT_S8 bfd_h_put_signed_8
-#define H_GET_64 bfd_h_get_64
-#define H_GET_32 bfd_h_get_32
-#define H_GET_16 bfd_h_get_16
-#define H_GET_8 bfd_h_get_8
-#define H_GET_S64 bfd_h_get_signed_64
-#define H_GET_S32 bfd_h_get_signed_32
-#define H_GET_S16 bfd_h_get_signed_16
-#define H_GET_S8 bfd_h_get_signed_8
-
-
-@end example
-
-@findex bfd_log2
-@subsubsection @code{bfd_log2}
-@strong{Synopsis}
-@example
-unsigned int bfd_log2 (bfd_vma x);
-@end example
-@strong{Description}@*
-Return the log base 2 of the value supplied, rounded up. E.g., an
-@var{x} of 1025 returns 11. A @var{x} of 0 returns 0.
-
diff -Nur binutils-2.24.orig/bfd/doc/linker.texi binutils-2.24/bfd/doc/linker.texi
--- binutils-2.24.orig/bfd/doc/linker.texi 2013-11-18 09:49:27.000000000 +0100
+++ binutils-2.24/bfd/doc/linker.texi 1970-01-01 01:00:00.000000000 +0100
@@ -1,432 +0,0 @@
-@section Linker Functions
-@cindex Linker
-The linker uses three special entry points in the BFD target
-vector. It is not necessary to write special routines for
-these entry points when creating a new BFD back end, since
-generic versions are provided. However, writing them can
-speed up linking and make it use significantly less runtime
-memory.
-
-The first routine creates a hash table used by the other
-routines. The second routine adds the symbols from an object
-file to the hash table. The third routine takes all the
-object files and links them together to create the output
-file. These routines are designed so that the linker proper
-does not need to know anything about the symbols in the object
-files that it is linking. The linker merely arranges the
-sections as directed by the linker script and lets BFD handle
-the details of symbols and relocs.
-
-The second routine and third routines are passed a pointer to
-a @code{struct bfd_link_info} structure (defined in
-@code{bfdlink.h}) which holds information relevant to the link,
-including the linker hash table (which was created by the
-first routine) and a set of callback functions to the linker
-proper.
-
-The generic linker routines are in @code{linker.c}, and use the
-header file @code{genlink.h}. As of this writing, the only back
-ends which have implemented versions of these routines are
-a.out (in @code{aoutx.h}) and ECOFF (in @code{ecoff.c}). The a.out
-routines are used as examples throughout this section.
-
-@menu
-* Creating a Linker Hash Table::
-* Adding Symbols to the Hash Table::
-* Performing the Final Link::
-@end menu
-
-@node Creating a Linker Hash Table, Adding Symbols to the Hash Table, Linker Functions, Linker Functions
-@subsection Creating a linker hash table
-@cindex _bfd_link_hash_table_create in target vector
-@cindex target vector (_bfd_link_hash_table_create)
-The linker routines must create a hash table, which must be
-derived from @code{struct bfd_link_hash_table} described in
-@code{bfdlink.c}. @xref{Hash Tables}, for information on how to
-create a derived hash table. This entry point is called using
-the target vector of the linker output file.
-
-The @code{_bfd_link_hash_table_create} entry point must allocate
-and initialize an instance of the desired hash table. If the
-back end does not require any additional information to be
-stored with the entries in the hash table, the entry point may
-simply create a @code{struct bfd_link_hash_table}. Most likely,
-however, some additional information will be needed.
-
-For example, with each entry in the hash table the a.out
-linker keeps the index the symbol has in the final output file
-(this index number is used so that when doing a relocatable
-link the symbol index used in the output file can be quickly
-filled in when copying over a reloc). The a.out linker code
-defines the required structures and functions for a hash table
-derived from @code{struct bfd_link_hash_table}. The a.out linker
-hash table is created by the function
-@code{NAME(aout,link_hash_table_create)}; it simply allocates
-space for the hash table, initializes it, and returns a
-pointer to it.
-
-When writing the linker routines for a new back end, you will
-generally not know exactly which fields will be required until
-you have finished. You should simply create a new hash table
-which defines no additional fields, and then simply add fields
-as they become necessary.
-
-@node Adding Symbols to the Hash Table, Performing the Final Link, Creating a Linker Hash Table, Linker Functions
-@subsection Adding symbols to the hash table
-@cindex _bfd_link_add_symbols in target vector
-@cindex target vector (_bfd_link_add_symbols)
-The linker proper will call the @code{_bfd_link_add_symbols}
-entry point for each object file or archive which is to be
-linked (typically these are the files named on the command
-line, but some may also come from the linker script). The
-entry point is responsible for examining the file. For an
-object file, BFD must add any relevant symbol information to
-the hash table. For an archive, BFD must determine which
-elements of the archive should be used and adding them to the
-link.
-
-The a.out version of this entry point is
-@code{NAME(aout,link_add_symbols)}.
-
-@menu
-* Differing file formats::
-* Adding symbols from an object file::
-* Adding symbols from an archive::
-@end menu
-
-@node Differing file formats, Adding symbols from an object file, Adding Symbols to the Hash Table, Adding Symbols to the Hash Table
-@subsubsection Differing file formats
-Normally all the files involved in a link will be of the same
-format, but it is also possible to link together different
-format object files, and the back end must support that. The
-@code{_bfd_link_add_symbols} entry point is called via the target
-vector of the file to be added. This has an important
-consequence: the function may not assume that the hash table
-is the type created by the corresponding
-@code{_bfd_link_hash_table_create} vector. All the
-@code{_bfd_link_add_symbols} function can assume about the hash
-table is that it is derived from @code{struct
-bfd_link_hash_table}.
-
-Sometimes the @code{_bfd_link_add_symbols} function must store
-some information in the hash table entry to be used by the
-@code{_bfd_final_link} function. In such a case the output bfd
-xvec must be checked to make sure that the hash table was
-created by an object file of the same format.
-
-The @code{_bfd_final_link} routine must be prepared to handle a
-hash entry without any extra information added by the
-@code{_bfd_link_add_symbols} function. A hash entry without
-extra information will also occur when the linker script
-directs the linker to create a symbol. Note that, regardless
-of how a hash table entry is added, all the fields will be
-initialized to some sort of null value by the hash table entry
-initialization function.
-
-See @code{ecoff_link_add_externals} for an example of how to
-check the output bfd before saving information (in this
-case, the ECOFF external symbol debugging information) in a
-hash table entry.
-
-@node Adding symbols from an object file, Adding symbols from an archive, Differing file formats, Adding Symbols to the Hash Table
-@subsubsection Adding symbols from an object file
-When the @code{_bfd_link_add_symbols} routine is passed an object
-file, it must add all externally visible symbols in that
-object file to the hash table. The actual work of adding the
-symbol to the hash table is normally handled by the function
-@code{_bfd_generic_link_add_one_symbol}. The
-@code{_bfd_link_add_symbols} routine is responsible for reading
-all the symbols from the object file and passing the correct
-information to @code{_bfd_generic_link_add_one_symbol}.
-
-The @code{_bfd_link_add_symbols} routine should not use
-@code{bfd_canonicalize_symtab} to read the symbols. The point of
-providing this routine is to avoid the overhead of converting
-the symbols into generic @code{asymbol} structures.
-
-@findex _bfd_generic_link_add_one_symbol
-@code{_bfd_generic_link_add_one_symbol} handles the details of
-combining common symbols, warning about multiple definitions,
-and so forth. It takes arguments which describe the symbol to
-add, notably symbol flags, a section, and an offset. The
-symbol flags include such things as @code{BSF_WEAK} or
-@code{BSF_INDIRECT}. The section is a section in the object
-file, or something like @code{bfd_und_section_ptr} for an undefined
-symbol or @code{bfd_com_section_ptr} for a common symbol.
-
-If the @code{_bfd_final_link} routine is also going to need to
-read the symbol information, the @code{_bfd_link_add_symbols}
-routine should save it somewhere attached to the object file
-BFD. However, the information should only be saved if the
-@code{keep_memory} field of the @code{info} argument is TRUE, so
-that the @code{-no-keep-memory} linker switch is effective.
-
-The a.out function which adds symbols from an object file is
-@code{aout_link_add_object_symbols}, and most of the interesting
-work is in @code{aout_link_add_symbols}. The latter saves
-pointers to the hash tables entries created by
-@code{_bfd_generic_link_add_one_symbol} indexed by symbol number,
-so that the @code{_bfd_final_link} routine does not have to call
-the hash table lookup routine to locate the entry.
-
-@node Adding symbols from an archive, , Adding symbols from an object file, Adding Symbols to the Hash Table
-@subsubsection Adding symbols from an archive
-When the @code{_bfd_link_add_symbols} routine is passed an
-archive, it must look through the symbols defined by the
-archive and decide which elements of the archive should be
-included in the link. For each such element it must call the
-@code{add_archive_element} linker callback, and it must add the
-symbols from the object file to the linker hash table. (The
-callback may in fact indicate that a replacement BFD should be
-used, in which case the symbols from that BFD should be added
-to the linker hash table instead.)
-
-@findex _bfd_generic_link_add_archive_symbols
-In most cases the work of looking through the symbols in the
-archive should be done by the
-@code{_bfd_generic_link_add_archive_symbols} function. This
-function builds a hash table from the archive symbol table and
-looks through the list of undefined symbols to see which
-elements should be included.
-@code{_bfd_generic_link_add_archive_symbols} is passed a function
-to call to make the final decision about adding an archive
-element to the link and to do the actual work of adding the
-symbols to the linker hash table.
-
-The function passed to
-@code{_bfd_generic_link_add_archive_symbols} must read the
-symbols of the archive element and decide whether the archive
-element should be included in the link. If the element is to
-be included, the @code{add_archive_element} linker callback
-routine must be called with the element as an argument, and
-the element's symbols must be added to the linker hash table
-just as though the element had itself been passed to the
-@code{_bfd_link_add_symbols} function. The @code{add_archive_element}
-callback has the option to indicate that it would like to
-replace the element archive with a substitute BFD, in which
-case it is the symbols of that substitute BFD that must be
-added to the linker hash table instead.
-
-When the a.out @code{_bfd_link_add_symbols} function receives an
-archive, it calls @code{_bfd_generic_link_add_archive_symbols}
-passing @code{aout_link_check_archive_element} as the function
-argument. @code{aout_link_check_archive_element} calls
-@code{aout_link_check_ar_symbols}. If the latter decides to add
-the element (an element is only added if it provides a real,
-non-common, definition for a previously undefined or common
-symbol) it calls the @code{add_archive_element} callback and then
-@code{aout_link_check_archive_element} calls
-@code{aout_link_add_symbols} to actually add the symbols to the
-linker hash table - possibly those of a substitute BFD, if the
-@code{add_archive_element} callback avails itself of that option.
-
-The ECOFF back end is unusual in that it does not normally
-call @code{_bfd_generic_link_add_archive_symbols}, because ECOFF
-archives already contain a hash table of symbols. The ECOFF
-back end searches the archive itself to avoid the overhead of
-creating a new hash table.
-
-@node Performing the Final Link, , Adding Symbols to the Hash Table, Linker Functions
-@subsection Performing the final link
-@cindex _bfd_link_final_link in target vector
-@cindex target vector (_bfd_final_link)
-When all the input files have been processed, the linker calls
-the @code{_bfd_final_link} entry point of the output BFD. This
-routine is responsible for producing the final output file,
-which has several aspects. It must relocate the contents of
-the input sections and copy the data into the output sections.
-It must build an output symbol table including any local
-symbols from the input files and the global symbols from the
-hash table. When producing relocatable output, it must
-modify the input relocs and write them into the output file.
-There may also be object format dependent work to be done.
-
-The linker will also call the @code{write_object_contents} entry
-point when the BFD is closed. The two entry points must work
-together in order to produce the correct output file.
-
-The details of how this works are inevitably dependent upon
-the specific object file format. The a.out
-@code{_bfd_final_link} routine is @code{NAME(aout,final_link)}.
-
-@menu
-* Information provided by the linker::
-* Relocating the section contents::
-* Writing the symbol table::
-@end menu
-
-@node Information provided by the linker, Relocating the section contents, Performing the Final Link, Performing the Final Link
-@subsubsection Information provided by the linker
-Before the linker calls the @code{_bfd_final_link} entry point,
-it sets up some data structures for the function to use.
-
-The @code{input_bfds} field of the @code{bfd_link_info} structure
-will point to a list of all the input files included in the
-link. These files are linked through the @code{link_next} field
-of the @code{bfd} structure.
-
-Each section in the output file will have a list of
-@code{link_order} structures attached to the @code{map_head.link_order}
-field (the @code{link_order} structure is defined in
-@code{bfdlink.h}). These structures describe how to create the
-contents of the output section in terms of the contents of
-various input sections, fill constants, and, eventually, other
-types of information. They also describe relocs that must be
-created by the BFD backend, but do not correspond to any input
-file; this is used to support -Ur, which builds constructors
-while generating a relocatable object file.
-
-@node Relocating the section contents, Writing the symbol table, Information provided by the linker, Performing the Final Link
-@subsubsection Relocating the section contents
-The @code{_bfd_final_link} function should look through the
-@code{link_order} structures attached to each section of the
-output file. Each @code{link_order} structure should either be
-handled specially, or it should be passed to the function
-@code{_bfd_default_link_order} which will do the right thing
-(@code{_bfd_default_link_order} is defined in @code{linker.c}).
-
-For efficiency, a @code{link_order} of type
-@code{bfd_indirect_link_order} whose associated section belongs
-to a BFD of the same format as the output BFD must be handled
-specially. This type of @code{link_order} describes part of an
-output section in terms of a section belonging to one of the
-input files. The @code{_bfd_final_link} function should read the
-contents of the section and any associated relocs, apply the
-relocs to the section contents, and write out the modified
-section contents. If performing a relocatable link, the
-relocs themselves must also be modified and written out.
-
-@findex _bfd_relocate_contents
-@findex _bfd_final_link_relocate
-The functions @code{_bfd_relocate_contents} and
-@code{_bfd_final_link_relocate} provide some general support for
-performing the actual relocations, notably overflow checking.
-Their arguments include information about the symbol the
-relocation is against and a @code{reloc_howto_type} argument
-which describes the relocation to perform. These functions
-are defined in @code{reloc.c}.
-
-The a.out function which handles reading, relocating, and
-writing section contents is @code{aout_link_input_section}. The
-actual relocation is done in @code{aout_link_input_section_std}
-and @code{aout_link_input_section_ext}.
-
-@node Writing the symbol table, , Relocating the section contents, Performing the Final Link
-@subsubsection Writing the symbol table
-The @code{_bfd_final_link} function must gather all the symbols
-in the input files and write them out. It must also write out
-all the symbols in the global hash table. This must be
-controlled by the @code{strip} and @code{discard} fields of the
-@code{bfd_link_info} structure.
-
-The local symbols of the input files will not have been
-entered into the linker hash table. The @code{_bfd_final_link}
-routine must consider each input file and include the symbols
-in the output file. It may be convenient to do this when
-looking through the @code{link_order} structures, or it may be
-done by stepping through the @code{input_bfds} list.
-
-The @code{_bfd_final_link} routine must also traverse the global
-hash table to gather all the externally visible symbols. It
-is possible that most of the externally visible symbols may be
-written out when considering the symbols of each input file,
-but it is still necessary to traverse the hash table since the
-linker script may have defined some symbols that are not in
-any of the input files.
-
-The @code{strip} field of the @code{bfd_link_info} structure
-controls which symbols are written out. The possible values
-are listed in @code{bfdlink.h}. If the value is @code{strip_some},
-then the @code{keep_hash} field of the @code{bfd_link_info}
-structure is a hash table of symbols to keep; each symbol
-should be looked up in this hash table, and only symbols which
-are present should be included in the output file.
-
-If the @code{strip} field of the @code{bfd_link_info} structure
-permits local symbols to be written out, the @code{discard} field
-is used to further controls which local symbols are included
-in the output file. If the value is @code{discard_l}, then all
-local symbols which begin with a certain prefix are discarded;
-this is controlled by the @code{bfd_is_local_label_name} entry point.
-
-The a.out backend handles symbols by calling
-@code{aout_link_write_symbols} on each input BFD and then
-traversing the global hash table with the function
-@code{aout_link_write_other_symbol}. It builds a string table
-while writing out the symbols, which is written to the output
-file at the end of @code{NAME(aout,final_link)}.
-
-@findex bfd_link_split_section
-@subsubsection @code{bfd_link_split_section}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_link_split_section (bfd *abfd, asection *sec);
-@end example
-@strong{Description}@*
-Return nonzero if @var{sec} should be split during a
-reloceatable or final link.
-@example
-#define bfd_link_split_section(abfd, sec) \
- BFD_SEND (abfd, _bfd_link_split_section, (abfd, sec))
-
-@end example
-
-@findex bfd_section_already_linked
-@subsubsection @code{bfd_section_already_linked}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_section_already_linked (bfd *abfd,
- asection *sec,
- struct bfd_link_info *info);
-@end example
-@strong{Description}@*
-Check if @var{data} has been already linked during a reloceatable
-or final link. Return TRUE if it has.
-@example
-#define bfd_section_already_linked(abfd, sec, info) \
- BFD_SEND (abfd, _section_already_linked, (abfd, sec, info))
-
-@end example
-
-@findex bfd_generic_define_common_symbol
-@subsubsection @code{bfd_generic_define_common_symbol}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_generic_define_common_symbol
- (bfd *output_bfd, struct bfd_link_info *info,
- struct bfd_link_hash_entry *h);
-@end example
-@strong{Description}@*
-Convert common symbol @var{h} into a defined symbol.
-Return TRUE on success and FALSE on failure.
-@example
-#define bfd_define_common_symbol(output_bfd, info, h) \
- BFD_SEND (output_bfd, _bfd_define_common_symbol, (output_bfd, info, h))
-
-@end example
-
-@findex bfd_find_version_for_sym
-@subsubsection @code{bfd_find_version_for_sym}
-@strong{Synopsis}
-@example
-struct bfd_elf_version_tree * bfd_find_version_for_sym
- (struct bfd_elf_version_tree *verdefs,
- const char *sym_name, bfd_boolean *hide);
-@end example
-@strong{Description}@*
-Search an elf version script tree for symbol versioning
-info and export / don't-export status for a given symbol.
-Return non-NULL on success and NULL on failure; also sets
-the output @samp{hide} boolean parameter.
-
-@findex bfd_hide_sym_by_version
-@subsubsection @code{bfd_hide_sym_by_version}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_hide_sym_by_version
- (struct bfd_elf_version_tree *verdefs, const char *sym_name);
-@end example
-@strong{Description}@*
-Search an elf version script tree for symbol versioning
-info for a given symbol. Return TRUE if the symbol is hidden.
-
diff -Nur binutils-2.24.orig/bfd/doc/mmo.texi binutils-2.24/bfd/doc/mmo.texi
--- binutils-2.24.orig/bfd/doc/mmo.texi 2013-11-18 09:49:27.000000000 +0100
+++ binutils-2.24/bfd/doc/mmo.texi 1970-01-01 01:00:00.000000000 +0100
@@ -1,365 +0,0 @@
-@section mmo backend
-The mmo object format is used exclusively together with Professor
-Donald E.@: Knuth's educational 64-bit processor MMIX. The simulator
-@command{mmix} which is available at
-@url{http://www-cs-faculty.stanford.edu/~knuth/programs/mmix.tar.gz}
-understands this format. That package also includes a combined
-assembler and linker called @command{mmixal}. The mmo format has
-no advantages feature-wise compared to e.g. ELF. It is a simple
-non-relocatable object format with no support for archives or
-debugging information, except for symbol value information and
-line numbers (which is not yet implemented in BFD). See
-@url{http://www-cs-faculty.stanford.edu/~knuth/mmix.html} for more
-information about MMIX. The ELF format is used for intermediate
-object files in the BFD implementation.
-
-@c We want to xref the symbol table node. A feature in "chew"
-@c requires that "commands" do not contain spaces in the
-@c arguments. Hence the hyphen in "Symbol-table".
-@menu
-* File layout::
-* Symbol-table::
-* mmo section mapping::
-@end menu
-
-@node File layout, Symbol-table, mmo, mmo
-@subsection File layout
-The mmo file contents is not partitioned into named sections as
-with e.g.@: ELF. Memory areas is formed by specifying the
-location of the data that follows. Only the memory area
-@samp{0x0000@dots{}00} to @samp{0x01ff@dots{}ff} is executable, so
-it is used for code (and constants) and the area
-@samp{0x2000@dots{}00} to @samp{0x20ff@dots{}ff} is used for
-writable data. @xref{mmo section mapping}.
-
-There is provision for specifying ``special data'' of 65536
-different types. We use type 80 (decimal), arbitrarily chosen the
-same as the ELF @code{e_machine} number for MMIX, filling it with
-section information normally found in ELF objects. @xref{mmo
-section mapping}.
-
-Contents is entered as 32-bit words, xor:ed over previous
-contents, always zero-initialized. A word that starts with the
-byte @samp{0x98} forms a command called a @samp{lopcode}, where
-the next byte distinguished between the thirteen lopcodes. The
-two remaining bytes, called the @samp{Y} and @samp{Z} fields, or
-the @samp{YZ} field (a 16-bit big-endian number), are used for
-various purposes different for each lopcode. As documented in
-@url{http://www-cs-faculty.stanford.edu/~knuth/mmixal-intro.ps.gz},
-the lopcodes are:
-
-@table @code
-@item lop_quote
-0x98000001. The next word is contents, regardless of whether it
-starts with 0x98 or not.
-
-@item lop_loc
-0x9801YYZZ, where @samp{Z} is 1 or 2. This is a location
-directive, setting the location for the next data to the next
-32-bit word (for @math{Z = 1}) or 64-bit word (for @math{Z = 2}),
-plus @math{Y * 2^56}. Normally @samp{Y} is 0 for the text segment
-and 2 for the data segment.
-
-@item lop_skip
-0x9802YYZZ. Increase the current location by @samp{YZ} bytes.
-
-@item lop_fixo
-0x9803YYZZ, where @samp{Z} is 1 or 2. Store the current location
-as 64 bits into the location pointed to by the next 32-bit
-(@math{Z = 1}) or 64-bit (@math{Z = 2}) word, plus @math{Y *
-2^56}.
-
-@item lop_fixr
-0x9804YYZZ. @samp{YZ} is stored into the current location plus
-@math{2 - 4 * YZ}.
-
-@item lop_fixrx
-0x980500ZZ. @samp{Z} is 16 or 24. A value @samp{L} derived from
-the following 32-bit word are used in a manner similar to
-@samp{YZ} in lop_fixr: it is xor:ed into the current location
-minus @math{4 * L}. The first byte of the word is 0 or 1. If it
-is 1, then @math{L = (@var{lowest 24 bits of word}) - 2^Z}, if 0,
-then @math{L = (@var{lowest 24 bits of word})}.
-
-@item lop_file
-0x9806YYZZ. @samp{Y} is the file number, @samp{Z} is count of
-32-bit words. Set the file number to @samp{Y} and the line
-counter to 0. The next @math{Z * 4} bytes contain the file name,
-padded with zeros if the count is not a multiple of four. The
-same @samp{Y} may occur multiple times, but @samp{Z} must be 0 for
-all but the first occurrence.
-
-@item lop_line
-0x9807YYZZ. @samp{YZ} is the line number. Together with
-lop_file, it forms the source location for the next 32-bit word.
-Note that for each non-lopcode 32-bit word, line numbers are
-assumed incremented by one.
-
-@item lop_spec
-0x9808YYZZ. @samp{YZ} is the type number. Data until the next
-lopcode other than lop_quote forms special data of type @samp{YZ}.
-@xref{mmo section mapping}.
-
-Other types than 80, (or type 80 with a content that does not
-parse) is stored in sections named @code{.MMIX.spec_data.@var{n}}
-where @var{n} is the @samp{YZ}-type. The flags for such a
-sections say not to allocate or load the data. The vma is 0.
-Contents of multiple occurrences of special data @var{n} is
-concatenated to the data of the previous lop_spec @var{n}s. The
-location in data or code at which the lop_spec occurred is lost.
-
-@item lop_pre
-0x980901ZZ. The first lopcode in a file. The @samp{Z} field forms the
-length of header information in 32-bit words, where the first word
-tells the time in seconds since @samp{00:00:00 GMT Jan 1 1970}.
-
-@item lop_post
-0x980a00ZZ. @math{Z > 32}. This lopcode follows after all
-content-generating lopcodes in a program. The @samp{Z} field
-denotes the value of @samp{rG} at the beginning of the program.
-The following @math{256 - Z} big-endian 64-bit words are loaded
-into global registers @samp{$G} @dots{} @samp{$255}.
-
-@item lop_stab
-0x980b0000. The next-to-last lopcode in a program. Must follow
-immediately after the lop_post lopcode and its data. After this
-lopcode follows all symbols in a compressed format
-(@pxref{Symbol-table}).
-
-@item lop_end
-0x980cYYZZ. The last lopcode in a program. It must follow the
-lop_stab lopcode and its data. The @samp{YZ} field contains the
-number of 32-bit words of symbol table information after the
-preceding lop_stab lopcode.
-@end table
-
-Note that the lopcode "fixups"; @code{lop_fixr}, @code{lop_fixrx} and
-@code{lop_fixo} are not generated by BFD, but are handled. They are
-generated by @code{mmixal}.
-
-This trivial one-label, one-instruction file:
-
-@example
- :Main TRAP 1,2,3
-@end example
-
-can be represented this way in mmo:
-
-@example
- 0x98090101 - lop_pre, one 32-bit word with timestamp.
-
- 0x98010002 - lop_loc, text segment, using a 64-bit address.
- Note that mmixal does not emit this for the file above.
- 0x00000000 - Address, high 32 bits.
- 0x00000000 - Address, low 32 bits.
- 0x98060002 - lop_file, 2 32-bit words for file-name.
- 0x74657374 - "test"
- 0x2e730000 - ".s\0\0"
- 0x98070001 - lop_line, line 1.
- 0x00010203 - TRAP 1,2,3
- 0x980a00ff - lop_post, setting $255 to 0.
- 0x00000000
- 0x00000000
- 0x980b0000 - lop_stab for ":Main" = 0, serial 1.
- 0x203a4040 @xref{Symbol-table}.
- 0x10404020
- 0x4d206120
- 0x69016e00
- 0x81000000
- 0x980c0005 - lop_end; symbol table contained five 32-bit words.
-@end example
-@node Symbol-table, mmo section mapping, File layout, mmo
-@subsection Symbol table format
-From mmixal.w (or really, the generated mmixal.tex) in
-@url{http://www-cs-faculty.stanford.edu/~knuth/programs/mmix.tar.gz}):
-``Symbols are stored and retrieved by means of a @samp{ternary
-search trie}, following ideas of Bentley and Sedgewick. (See
-ACM--SIAM Symp.@: on Discrete Algorithms @samp{8} (1997), 360--369;
-R.@:Sedgewick, @samp{Algorithms in C} (Reading, Mass.@:
-Addison--Wesley, 1998), @samp{15.4}.) Each trie node stores a
-character, and there are branches to subtries for the cases where
-a given character is less than, equal to, or greater than the
-character in the trie. There also is a pointer to a symbol table
-entry if a symbol ends at the current node.''
-
-So it's a tree encoded as a stream of bytes. The stream of bytes
-acts on a single virtual global symbol, adding and removing
-characters and signalling complete symbol points. Here, we read
-the stream and create symbols at the completion points.
-
-First, there's a control byte @code{m}. If any of the listed bits
-in @code{m} is nonzero, we execute what stands at the right, in
-the listed order:
-
-@example
- (MMO3_LEFT)
- 0x40 - Traverse left trie.
- (Read a new command byte and recurse.)
-
- (MMO3_SYMBITS)
- 0x2f - Read the next byte as a character and store it in the
- current character position; increment character position.
- Test the bits of @code{m}:
-
- (MMO3_WCHAR)
- 0x80 - The character is 16-bit (so read another byte,
- merge into current character.
-
- (MMO3_TYPEBITS)
- 0xf - We have a complete symbol; parse the type, value
- and serial number and do what should be done
- with a symbol. The type and length information
- is in j = (m & 0xf).
-
- (MMO3_REGQUAL_BITS)
- j == 0xf: A register variable. The following
- byte tells which register.
- j <= 8: An absolute symbol. Read j bytes as the
- big-endian number the symbol equals.
- A j = 2 with two zero bytes denotes an
- unknown symbol.
- j > 8: As with j <= 8, but add (0x20 << 56)
- to the value in the following j - 8
- bytes.
-
- Then comes the serial number, as a variant of
- uleb128, but better named ubeb128:
- Read bytes and shift the previous value left 7
- (multiply by 128). Add in the new byte, repeat
- until a byte has bit 7 set. The serial number
- is the computed value minus 128.
-
- (MMO3_MIDDLE)
- 0x20 - Traverse middle trie. (Read a new command byte
- and recurse.) Decrement character position.
-
- (MMO3_RIGHT)
- 0x10 - Traverse right trie. (Read a new command byte and
- recurse.)
-@end example
-
-Let's look again at the @code{lop_stab} for the trivial file
-(@pxref{File layout}).
-
-@example
- 0x980b0000 - lop_stab for ":Main" = 0, serial 1.
- 0x203a4040
- 0x10404020
- 0x4d206120
- 0x69016e00
- 0x81000000
-@end example
-
-This forms the trivial trie (note that the path between ``:'' and
-``M'' is redundant):
-
-@example
- 203a ":"
- 40 /
- 40 /
- 10 \
- 40 /
- 40 /
- 204d "M"
- 2061 "a"
- 2069 "i"
- 016e "n" is the last character in a full symbol, and
- with a value represented in one byte.
- 00 The value is 0.
- 81 The serial number is 1.
-@end example
-
-@node mmo section mapping, , Symbol-table, mmo
-@subsection mmo section mapping
-The implementation in BFD uses special data type 80 (decimal) to
-encapsulate and describe named sections, containing e.g.@: debug
-information. If needed, any datum in the encapsulation will be
-quoted using lop_quote. First comes a 32-bit word holding the
-number of 32-bit words containing the zero-terminated zero-padded
-segment name. After the name there's a 32-bit word holding flags
-describing the section type. Then comes a 64-bit big-endian word
-with the section length (in bytes), then another with the section
-start address. Depending on the type of section, the contents
-might follow, zero-padded to 32-bit boundary. For a loadable
-section (such as data or code), the contents might follow at some
-later point, not necessarily immediately, as a lop_loc with the
-same start address as in the section description, followed by the
-contents. This in effect forms a descriptor that must be emitted
-before the actual contents. Sections described this way must not
-overlap.
-
-For areas that don't have such descriptors, synthetic sections are
-formed by BFD. Consecutive contents in the two memory areas
-@samp{0x0000@dots{}00} to @samp{0x01ff@dots{}ff} and
-@samp{0x2000@dots{}00} to @samp{0x20ff@dots{}ff} are entered in
-sections named @code{.text} and @code{.data} respectively. If an area
-is not otherwise described, but would together with a neighboring
-lower area be less than @samp{0x40000000} bytes long, it is joined
-with the lower area and the gap is zero-filled. For other cases,
-a new section is formed, named @code{.MMIX.sec.@var{n}}. Here,
-@var{n} is a number, a running count through the mmo file,
-starting at 0.
-
-A loadable section specified as:
-
-@example
- .section secname,"ax"
- TETRA 1,2,3,4,-1,-2009
- BYTE 80
-@end example
-
-and linked to address @samp{0x4}, is represented by the sequence:
-
-@example
- 0x98080050 - lop_spec 80
- 0x00000002 - two 32-bit words for the section name
- 0x7365636e - "secn"
- 0x616d6500 - "ame\0"
- 0x00000033 - flags CODE, READONLY, LOAD, ALLOC
- 0x00000000 - high 32 bits of section length
- 0x0000001c - section length is 28 bytes; 6 * 4 + 1 + alignment to 32 bits
- 0x00000000 - high 32 bits of section address
- 0x00000004 - section address is 4
- 0x98010002 - 64 bits with address of following data
- 0x00000000 - high 32 bits of address
- 0x00000004 - low 32 bits: data starts at address 4
- 0x00000001 - 1
- 0x00000002 - 2
- 0x00000003 - 3
- 0x00000004 - 4
- 0xffffffff - -1
- 0xfffff827 - -2009
- 0x50000000 - 80 as a byte, padded with zeros.
-@end example
-
-Note that the lop_spec wrapping does not include the section
-contents. Compare this to a non-loaded section specified as:
-
-@example
- .section thirdsec
- TETRA 200001,100002
- BYTE 38,40
-@end example
-
-This, when linked to address @samp{0x200000000000001c}, is
-represented by:
-
-@example
- 0x98080050 - lop_spec 80
- 0x00000002 - two 32-bit words for the section name
- 0x7365636e - "thir"
- 0x616d6500 - "dsec"
- 0x00000010 - flag READONLY
- 0x00000000 - high 32 bits of section length
- 0x0000000c - section length is 12 bytes; 2 * 4 + 2 + alignment to 32 bits
- 0x20000000 - high 32 bits of address
- 0x0000001c - low 32 bits of address 0x200000000000001c
- 0x00030d41 - 200001
- 0x000186a2 - 100002
- 0x26280000 - 38, 40 as bytes, padded with zeros
-@end example
-
-For the latter example, the section contents must not be
-loaded in memory, and is therefore specified as part of the
-special data. The address is usually unimportant but might
-provide information for e.g.@: the DWARF 2 debugging format.
diff -Nur binutils-2.24.orig/bfd/doc/opncls.texi binutils-2.24/bfd/doc/opncls.texi
--- binutils-2.24.orig/bfd/doc/opncls.texi 2013-11-18 09:49:27.000000000 +0100
+++ binutils-2.24/bfd/doc/opncls.texi 1970-01-01 01:00:00.000000000 +0100
@@ -1,432 +0,0 @@
-
-@example
-/* Set to N to open the next N BFDs using an alternate id space. */
-extern unsigned int bfd_use_reserved_id;
-@end example
-@section Opening and closing BFDs
-
-
-@subsection Functions for opening and closing
-
-
-@findex bfd_fopen
-@subsubsection @code{bfd_fopen}
-@strong{Synopsis}
-@example
-bfd *bfd_fopen (const char *filename, const char *target,
- const char *mode, int fd);
-@end example
-@strong{Description}@*
-Open the file @var{filename} with the target @var{target}.
-Return a pointer to the created BFD. If @var{fd} is not -1,
-then @code{fdopen} is used to open the file; otherwise, @code{fopen}
-is used. @var{mode} is passed directly to @code{fopen} or
-@code{fdopen}.
-
-Calls @code{bfd_find_target}, so @var{target} is interpreted as by
-that function.
-
-The new BFD is marked as cacheable iff @var{fd} is -1.
-
-If @code{NULL} is returned then an error has occured. Possible errors
-are @code{bfd_error_no_memory}, @code{bfd_error_invalid_target} or
-@code{system_call} error.
-
-On error, @var{fd} is always closed.
-
-@findex bfd_openr
-@subsubsection @code{bfd_openr}
-@strong{Synopsis}
-@example
-bfd *bfd_openr (const char *filename, const char *target);
-@end example
-@strong{Description}@*
-Open the file @var{filename} (using @code{fopen}) with the target
-@var{target}. Return a pointer to the created BFD.
-
-Calls @code{bfd_find_target}, so @var{target} is interpreted as by
-that function.
-
-If @code{NULL} is returned then an error has occured. Possible errors
-are @code{bfd_error_no_memory}, @code{bfd_error_invalid_target} or
-@code{system_call} error.
-
-@findex bfd_fdopenr
-@subsubsection @code{bfd_fdopenr}
-@strong{Synopsis}
-@example
-bfd *bfd_fdopenr (const char *filename, const char *target, int fd);
-@end example
-@strong{Description}@*
-@code{bfd_fdopenr} is to @code{bfd_fopenr} much like @code{fdopen} is to
-@code{fopen}. It opens a BFD on a file already described by the
-@var{fd} supplied.
-
-When the file is later @code{bfd_close}d, the file descriptor will
-be closed. If the caller desires that this file descriptor be
-cached by BFD (opened as needed, closed as needed to free
-descriptors for other opens), with the supplied @var{fd} used as
-an initial file descriptor (but subject to closure at any time),
-call bfd_set_cacheable(bfd, 1) on the returned BFD. The default
-is to assume no caching; the file descriptor will remain open
-until @code{bfd_close}, and will not be affected by BFD operations
-on other files.
-
-Possible errors are @code{bfd_error_no_memory},
-@code{bfd_error_invalid_target} and @code{bfd_error_system_call}.
-
-On error, @var{fd} is closed.
-
-@findex bfd_openstreamr
-@subsubsection @code{bfd_openstreamr}
-@strong{Synopsis}
-@example
-bfd *bfd_openstreamr (const char *, const char *, void *);
-@end example
-@strong{Description}@*
-Open a BFD for read access on an existing stdio stream. When
-the BFD is passed to @code{bfd_close}, the stream will be closed.
-
-@findex bfd_openr_iovec
-@subsubsection @code{bfd_openr_iovec}
-@strong{Synopsis}
-@example
-bfd *bfd_openr_iovec (const char *filename, const char *target,
- void *(*open_func) (struct bfd *nbfd,
- void *open_closure),
- void *open_closure,
- file_ptr (*pread_func) (struct bfd *nbfd,
- void *stream,
- void *buf,
- file_ptr nbytes,
- file_ptr offset),
- int (*close_func) (struct bfd *nbfd,
- void *stream),
- int (*stat_func) (struct bfd *abfd,
- void *stream,
- struct stat *sb));
-@end example
-@strong{Description}@*
-Create and return a BFD backed by a read-only @var{stream}.
-The @var{stream} is created using @var{open_func}, accessed using
-@var{pread_func} and destroyed using @var{close_func}.
-
-Calls @code{bfd_find_target}, so @var{target} is interpreted as by
-that function.
-
-Calls @var{open_func} (which can call @code{bfd_zalloc} and
-@code{bfd_get_filename}) to obtain the read-only stream backing
-the BFD. @var{open_func} either succeeds returning the
-non-@code{NULL} @var{stream}, or fails returning @code{NULL}
-(setting @code{bfd_error}).
-
-Calls @var{pread_func} to request @var{nbytes} of data from
-@var{stream} starting at @var{offset} (e.g., via a call to
-@code{bfd_read}). @var{pread_func} either succeeds returning the
-number of bytes read (which can be less than @var{nbytes} when
-end-of-file), or fails returning -1 (setting @code{bfd_error}).
-
-Calls @var{close_func} when the BFD is later closed using
-@code{bfd_close}. @var{close_func} either succeeds returning 0, or
-fails returning -1 (setting @code{bfd_error}).
-
-Calls @var{stat_func} to fill in a stat structure for bfd_stat,
-bfd_get_size, and bfd_get_mtime calls. @var{stat_func} returns 0
-on success, or returns -1 on failure (setting @code{bfd_error}).
-
-If @code{bfd_openr_iovec} returns @code{NULL} then an error has
-occurred. Possible errors are @code{bfd_error_no_memory},
-@code{bfd_error_invalid_target} and @code{bfd_error_system_call}.
-
-@findex bfd_openw
-@subsubsection @code{bfd_openw}
-@strong{Synopsis}
-@example
-bfd *bfd_openw (const char *filename, const char *target);
-@end example
-@strong{Description}@*
-Create a BFD, associated with file @var{filename}, using the
-file format @var{target}, and return a pointer to it.
-
-Possible errors are @code{bfd_error_system_call}, @code{bfd_error_no_memory},
-@code{bfd_error_invalid_target}.
-
-@findex bfd_close
-@subsubsection @code{bfd_close}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_close (bfd *abfd);
-@end example
-@strong{Description}@*
-Close a BFD. If the BFD was open for writing, then pending
-operations are completed and the file written out and closed.
-If the created file is executable, then @code{chmod} is called
-to mark it as such.
-
-All memory attached to the BFD is released.
-
-The file descriptor associated with the BFD is closed (even
-if it was passed in to BFD by @code{bfd_fdopenr}).
-
-@strong{Returns}@*
-@code{TRUE} is returned if all is ok, otherwise @code{FALSE}.
-
-@findex bfd_close_all_done
-@subsubsection @code{bfd_close_all_done}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_close_all_done (bfd *);
-@end example
-@strong{Description}@*
-Close a BFD. Differs from @code{bfd_close} since it does not
-complete any pending operations. This routine would be used
-if the application had just used BFD for swapping and didn't
-want to use any of the writing code.
-
-If the created file is executable, then @code{chmod} is called
-to mark it as such.
-
-All memory attached to the BFD is released.
-
-@strong{Returns}@*
-@code{TRUE} is returned if all is ok, otherwise @code{FALSE}.
-
-@findex bfd_create
-@subsubsection @code{bfd_create}
-@strong{Synopsis}
-@example
-bfd *bfd_create (const char *filename, bfd *templ);
-@end example
-@strong{Description}@*
-Create a new BFD in the manner of @code{bfd_openw}, but without
-opening a file. The new BFD takes the target from the target
-used by @var{templ}. The format is always set to @code{bfd_object}.
-
-@findex bfd_make_writable
-@subsubsection @code{bfd_make_writable}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_make_writable (bfd *abfd);
-@end example
-@strong{Description}@*
-Takes a BFD as created by @code{bfd_create} and converts it
-into one like as returned by @code{bfd_openw}. It does this
-by converting the BFD to BFD_IN_MEMORY. It's assumed that
-you will call @code{bfd_make_readable} on this bfd later.
-
-@strong{Returns}@*
-@code{TRUE} is returned if all is ok, otherwise @code{FALSE}.
-
-@findex bfd_make_readable
-@subsubsection @code{bfd_make_readable}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_make_readable (bfd *abfd);
-@end example
-@strong{Description}@*
-Takes a BFD as created by @code{bfd_create} and
-@code{bfd_make_writable} and converts it into one like as
-returned by @code{bfd_openr}. It does this by writing the
-contents out to the memory buffer, then reversing the
-direction.
-
-@strong{Returns}@*
-@code{TRUE} is returned if all is ok, otherwise @code{FALSE}.
-
-@findex bfd_alloc
-@subsubsection @code{bfd_alloc}
-@strong{Synopsis}
-@example
-void *bfd_alloc (bfd *abfd, bfd_size_type wanted);
-@end example
-@strong{Description}@*
-Allocate a block of @var{wanted} bytes of memory attached to
-@code{abfd} and return a pointer to it.
-
-@findex bfd_alloc2
-@subsubsection @code{bfd_alloc2}
-@strong{Synopsis}
-@example
-void *bfd_alloc2 (bfd *abfd, bfd_size_type nmemb, bfd_size_type size);
-@end example
-@strong{Description}@*
-Allocate a block of @var{nmemb} elements of @var{size} bytes each
-of memory attached to @code{abfd} and return a pointer to it.
-
-@findex bfd_zalloc
-@subsubsection @code{bfd_zalloc}
-@strong{Synopsis}
-@example
-void *bfd_zalloc (bfd *abfd, bfd_size_type wanted);
-@end example
-@strong{Description}@*
-Allocate a block of @var{wanted} bytes of zeroed memory
-attached to @code{abfd} and return a pointer to it.
-
-@findex bfd_zalloc2
-@subsubsection @code{bfd_zalloc2}
-@strong{Synopsis}
-@example
-void *bfd_zalloc2 (bfd *abfd, bfd_size_type nmemb, bfd_size_type size);
-@end example
-@strong{Description}@*
-Allocate a block of @var{nmemb} elements of @var{size} bytes each
-of zeroed memory attached to @code{abfd} and return a pointer to it.
-
-@findex bfd_calc_gnu_debuglink_crc32
-@subsubsection @code{bfd_calc_gnu_debuglink_crc32}
-@strong{Synopsis}
-@example
-unsigned long bfd_calc_gnu_debuglink_crc32
- (unsigned long crc, const unsigned char *buf, bfd_size_type len);
-@end example
-@strong{Description}@*
-Computes a CRC value as used in the .gnu_debuglink section.
-Advances the previously computed @var{crc} value by computing
-and adding in the crc32 for @var{len} bytes of @var{buf}.
-
-@strong{Returns}@*
-Return the updated CRC32 value.
-
-@findex bfd_get_debug_link_info
-@subsubsection @code{bfd_get_debug_link_info}
-@strong{Synopsis}
-@example
-char *bfd_get_debug_link_info (bfd *abfd, unsigned long *crc32_out);
-@end example
-@strong{Description}@*
-fetch the filename and CRC32 value for any separate debuginfo
-associated with @var{abfd}. Return NULL if no such info found,
-otherwise return filename and update @var{crc32_out}. The
-returned filename is allocated with @code{malloc}; freeing it
-is the responsibility of the caller.
-
-@findex bfd_get_alt_debug_link_info
-@subsubsection @code{bfd_get_alt_debug_link_info}
-@strong{Synopsis}
-@example
-char *bfd_get_alt_debug_link_info (bfd *abfd, unsigned long *crc32_out);
-@end example
-@strong{Description}@*
-Fetch the filename and BuildID value for any alternate debuginfo
-associated with @var{abfd}. Return NULL if no such info found,
-otherwise return filename and update @var{buildid_out}. The
-returned filename is allocated with @code{malloc}; freeing it
-is the responsibility of the caller.
-
-@findex separate_debug_file_exists
-@subsubsection @code{separate_debug_file_exists}
-@strong{Synopsis}
-@example
-bfd_boolean separate_debug_file_exists
- (char *name, unsigned long crc32);
-@end example
-@strong{Description}@*
-Checks to see if @var{name} is a file and if its contents
-match @var{crc32}.
-
-@findex separate_alt_debug_file_exists
-@subsubsection @code{separate_alt_debug_file_exists}
-@strong{Synopsis}
-@example
-bfd_boolean separate_alt_debug_file_exists
- (char *name, unsigned long crc32);
-@end example
-@strong{Description}@*
-Checks to see if @var{name} is a file and if its BuildID
-matches @var{buildid}.
-
-@findex find_separate_debug_file
-@subsubsection @code{find_separate_debug_file}
-@strong{Synopsis}
-@example
-char *find_separate_debug_file (bfd *abfd);
-@end example
-@strong{Description}@*
-Searches @var{abfd} for a section called @var{section_name} which
-is expected to contain a reference to a file containing separate
-debugging information. The function scans various locations in
-the filesystem, including the file tree rooted at
-@var{debug_file_directory}, and returns the first matching
-filename that it finds. If @var{check_crc} is TRUE then the
-contents of the file must also match the CRC value contained in
-@var{section_name}. Returns NULL if no valid file could be found.
-
-@findex bfd_follow_gnu_debuglink
-@subsubsection @code{bfd_follow_gnu_debuglink}
-@strong{Synopsis}
-@example
-char *bfd_follow_gnu_debuglink (bfd *abfd, const char *dir);
-@end example
-@strong{Description}@*
-Takes a BFD and searches it for a .gnu_debuglink section. If this
-section is found, it examines the section for the name and checksum
-of a '.debug' file containing auxiliary debugging information. It
-then searches the filesystem for this .debug file in some standard
-locations, including the directory tree rooted at @var{dir}, and if
-found returns the full filename.
-
-If @var{dir} is NULL, it will search a default path configured into
-libbfd at build time. [XXX this feature is not currently
-implemented].
-
-@strong{Returns}@*
-@code{NULL} on any errors or failure to locate the .debug file,
-otherwise a pointer to a heap-allocated string containing the
-filename. The caller is responsible for freeing this string.
-
-@findex bfd_follow_gnu_debugaltlink
-@subsubsection @code{bfd_follow_gnu_debugaltlink}
-@strong{Synopsis}
-@example
-char *bfd_follow_gnu_debugaltlink (bfd *abfd, const char *dir);
-@end example
-@strong{Description}@*
-Takes a BFD and searches it for a .gnu_debugaltlink section. If this
-section is found, it examines the section for the name of a file
-containing auxiliary debugging information. It then searches the
-filesystem for this file in a set of standard locations, including
-the directory tree rooted at @var{dir}, and if found returns the
-full filename.
-
-If @var{dir} is NULL, it will search a default path configured into
-libbfd at build time. [FIXME: This feature is not currently
-implemented].
-
-@strong{Returns}@*
-@code{NULL} on any errors or failure to locate the debug file,
-otherwise a pointer to a heap-allocated string containing the
-filename. The caller is responsible for freeing this string.
-
-@findex bfd_create_gnu_debuglink_section
-@subsubsection @code{bfd_create_gnu_debuglink_section}
-@strong{Synopsis}
-@example
-struct bfd_section *bfd_create_gnu_debuglink_section
- (bfd *abfd, const char *filename);
-@end example
-@strong{Description}@*
-Takes a @var{BFD} and adds a .gnu_debuglink section to it. The section is sized
-to be big enough to contain a link to the specified @var{filename}.
-
-@strong{Returns}@*
-A pointer to the new section is returned if all is ok. Otherwise @code{NULL} is
-returned and bfd_error is set.
-
-@findex bfd_fill_in_gnu_debuglink_section
-@subsubsection @code{bfd_fill_in_gnu_debuglink_section}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_fill_in_gnu_debuglink_section
- (bfd *abfd, struct bfd_section *sect, const char *filename);
-@end example
-@strong{Description}@*
-Takes a @var{BFD} and containing a .gnu_debuglink section @var{SECT}
-and fills in the contents of the section to contain a link to the
-specified @var{filename}. The filename should be relative to the
-current directory.
-
-@strong{Returns}@*
-@code{TRUE} is returned if all is ok. Otherwise @code{FALSE} is returned
-and bfd_error is set.
-
diff -Nur binutils-2.24.orig/bfd/doc/reloc.texi binutils-2.24/bfd/doc/reloc.texi
--- binutils-2.24.orig/bfd/doc/reloc.texi 2013-11-18 09:49:27.000000000 +0100
+++ binutils-2.24/bfd/doc/reloc.texi 1970-01-01 01:00:00.000000000 +0100
@@ -1,3849 +0,0 @@
-@section Relocations
-BFD maintains relocations in much the same way it maintains
-symbols: they are left alone until required, then read in
-en-masse and translated into an internal form. A common
-routine @code{bfd_perform_relocation} acts upon the
-canonical form to do the fixup.
-
-Relocations are maintained on a per section basis,
-while symbols are maintained on a per BFD basis.
-
-All that a back end has to do to fit the BFD interface is to create
-a @code{struct reloc_cache_entry} for each relocation
-in a particular section, and fill in the right bits of the structures.
-
-@menu
-* typedef arelent::
-* howto manager::
-@end menu
-
-
-@node typedef arelent, howto manager, Relocations, Relocations
-@subsection typedef arelent
-This is the structure of a relocation entry:
-
-
-@example
-
-typedef enum bfd_reloc_status
-@{
- /* No errors detected. */
- bfd_reloc_ok,
-
- /* The relocation was performed, but there was an overflow. */
- bfd_reloc_overflow,
-
- /* The address to relocate was not within the section supplied. */
- bfd_reloc_outofrange,
-
- /* Used by special functions. */
- bfd_reloc_continue,
-
- /* Unsupported relocation size requested. */
- bfd_reloc_notsupported,
-
- /* Unused. */
- bfd_reloc_other,
-
- /* The symbol to relocate against was undefined. */
- bfd_reloc_undefined,
-
- /* The relocation was performed, but may not be ok - presently
- generated only when linking i960 coff files with i960 b.out
- symbols. If this type is returned, the error_message argument
- to bfd_perform_relocation will be set. */
- bfd_reloc_dangerous
- @}
- bfd_reloc_status_type;
-
-
-typedef struct reloc_cache_entry
-@{
- /* A pointer into the canonical table of pointers. */
- struct bfd_symbol **sym_ptr_ptr;
-
- /* offset in section. */
- bfd_size_type address;
-
- /* addend for relocation value. */
- bfd_vma addend;
-
- /* Pointer to how to perform the required relocation. */
- reloc_howto_type *howto;
-
-@}
-arelent;
-
-@end example
-@strong{Description}@*
-Here is a description of each of the fields within an @code{arelent}:
-
-@itemize @bullet
-
-@item
-@code{sym_ptr_ptr}
-@end itemize
-The symbol table pointer points to a pointer to the symbol
-associated with the relocation request. It is the pointer
-into the table returned by the back end's
-@code{canonicalize_symtab} action. @xref{Symbols}. The symbol is
-referenced through a pointer to a pointer so that tools like
-the linker can fix up all the symbols of the same name by
-modifying only one pointer. The relocation routine looks in
-the symbol and uses the base of the section the symbol is
-attached to and the value of the symbol as the initial
-relocation offset. If the symbol pointer is zero, then the
-section provided is looked up.
-
-@itemize @bullet
-
-@item
-@code{address}
-@end itemize
-The @code{address} field gives the offset in bytes from the base of
-the section data which owns the relocation record to the first
-byte of relocatable information. The actual data relocated
-will be relative to this point; for example, a relocation
-type which modifies the bottom two bytes of a four byte word
-would not touch the first byte pointed to in a big endian
-world.
-
-@itemize @bullet
-
-@item
-@code{addend}
-@end itemize
-The @code{addend} is a value provided by the back end to be added (!)
-to the relocation offset. Its interpretation is dependent upon
-the howto. For example, on the 68k the code:
-
-@example
- char foo[];
- main()
- @{
- return foo[0x12345678];
- @}
-@end example
-
-Could be compiled into:
-
-@example
- linkw fp,#-4
- moveb @@#12345678,d0
- extbl d0
- unlk fp
- rts
-@end example
-
-This could create a reloc pointing to @code{foo}, but leave the
-offset in the data, something like:
-
-@example
-RELOCATION RECORDS FOR [.text]:
-offset type value
-00000006 32 _foo
-
-00000000 4e56 fffc ; linkw fp,#-4
-00000004 1039 1234 5678 ; moveb @@#12345678,d0
-0000000a 49c0 ; extbl d0
-0000000c 4e5e ; unlk fp
-0000000e 4e75 ; rts
-@end example
-
-Using coff and an 88k, some instructions don't have enough
-space in them to represent the full address range, and
-pointers have to be loaded in two parts. So you'd get something like:
-
-@example
- or.u r13,r0,hi16(_foo+0x12345678)
- ld.b r2,r13,lo16(_foo+0x12345678)
- jmp r1
-@end example
-
-This should create two relocs, both pointing to @code{_foo}, and with
-0x12340000 in their addend field. The data would consist of:
-
-@example
-RELOCATION RECORDS FOR [.text]:
-offset type value
-00000002 HVRT16 _foo+0x12340000
-00000006 LVRT16 _foo+0x12340000
-
-00000000 5da05678 ; or.u r13,r0,0x5678
-00000004 1c4d5678 ; ld.b r2,r13,0x5678
-00000008 f400c001 ; jmp r1
-@end example
-
-The relocation routine digs out the value from the data, adds
-it to the addend to get the original offset, and then adds the
-value of @code{_foo}. Note that all 32 bits have to be kept around
-somewhere, to cope with carry from bit 15 to bit 16.
-
-One further example is the sparc and the a.out format. The
-sparc has a similar problem to the 88k, in that some
-instructions don't have room for an entire offset, but on the
-sparc the parts are created in odd sized lumps. The designers of
-the a.out format chose to not use the data within the section
-for storing part of the offset; all the offset is kept within
-the reloc. Anything in the data should be ignored.
-
-@example
- save %sp,-112,%sp
- sethi %hi(_foo+0x12345678),%g2
- ldsb [%g2+%lo(_foo+0x12345678)],%i0
- ret
- restore
-@end example
-
-Both relocs contain a pointer to @code{foo}, and the offsets
-contain junk.
-
-@example
-RELOCATION RECORDS FOR [.text]:
-offset type value
-00000004 HI22 _foo+0x12345678
-00000008 LO10 _foo+0x12345678
-
-00000000 9de3bf90 ; save %sp,-112,%sp
-00000004 05000000 ; sethi %hi(_foo+0),%g2
-00000008 f048a000 ; ldsb [%g2+%lo(_foo+0)],%i0
-0000000c 81c7e008 ; ret
-00000010 81e80000 ; restore
-@end example
-
-@itemize @bullet
-
-@item
-@code{howto}
-@end itemize
-The @code{howto} field can be imagined as a
-relocation instruction. It is a pointer to a structure which
-contains information on what to do with all of the other
-information in the reloc record and data section. A back end
-would normally have a relocation instruction set and turn
-relocations into pointers to the correct structure on input -
-but it would be possible to create each howto field on demand.
-
-@subsubsection @code{enum complain_overflow}
-Indicates what sort of overflow checking should be done when
-performing a relocation.
-
-
-@example
-
-enum complain_overflow
-@{
- /* Do not complain on overflow. */
- complain_overflow_dont,
-
- /* Complain if the value overflows when considered as a signed
- number one bit larger than the field. ie. A bitfield of N bits
- is allowed to represent -2**n to 2**n-1. */
- complain_overflow_bitfield,
-
- /* Complain if the value overflows when considered as a signed
- number. */
- complain_overflow_signed,
-
- /* Complain if the value overflows when considered as an
- unsigned number. */
- complain_overflow_unsigned
-@};
-@end example
-@subsubsection @code{reloc_howto_type}
-The @code{reloc_howto_type} is a structure which contains all the
-information that libbfd needs to know to tie up a back end's data.
-
-
-@example
-struct bfd_symbol; /* Forward declaration. */
-
-struct reloc_howto_struct
-@{
- /* The type field has mainly a documentary use - the back end can
- do what it wants with it, though normally the back end's
- external idea of what a reloc number is stored
- in this field. For example, a PC relative word relocation
- in a coff environment has the type 023 - because that's
- what the outside world calls a R_PCRWORD reloc. */
- unsigned int type;
-
- /* The value the final relocation is shifted right by. This drops
- unwanted data from the relocation. */
- unsigned int rightshift;
-
- /* The size of the item to be relocated. This is *not* a
- power-of-two measure. To get the number of bytes operated
- on by a type of relocation, use bfd_get_reloc_size. */
- int size;
-
- /* The number of bits in the item to be relocated. This is used
- when doing overflow checking. */
- unsigned int bitsize;
-
- /* The relocation is relative to the field being relocated. */
- bfd_boolean pc_relative;
-
- /* The bit position of the reloc value in the destination.
- The relocated value is left shifted by this amount. */
- unsigned int bitpos;
-
- /* What type of overflow error should be checked for when
- relocating. */
- enum complain_overflow complain_on_overflow;
-
- /* If this field is non null, then the supplied function is
- called rather than the normal function. This allows really
- strange relocation methods to be accommodated (e.g., i960 callj
- instructions). */
- bfd_reloc_status_type (*special_function)
- (bfd *, arelent *, struct bfd_symbol *, void *, asection *,
- bfd *, char **);
-
- /* The textual name of the relocation type. */
- char *name;
-
- /* Some formats record a relocation addend in the section contents
- rather than with the relocation. For ELF formats this is the
- distinction between USE_REL and USE_RELA (though the code checks
- for USE_REL == 1/0). The value of this field is TRUE if the
- addend is recorded with the section contents; when performing a
- partial link (ld -r) the section contents (the data) will be
- modified. The value of this field is FALSE if addends are
- recorded with the relocation (in arelent.addend); when performing
- a partial link the relocation will be modified.
- All relocations for all ELF USE_RELA targets should set this field
- to FALSE (values of TRUE should be looked on with suspicion).
- However, the converse is not true: not all relocations of all ELF
- USE_REL targets set this field to TRUE. Why this is so is peculiar
- to each particular target. For relocs that aren't used in partial
- links (e.g. GOT stuff) it doesn't matter what this is set to. */
- bfd_boolean partial_inplace;
-
- /* src_mask selects the part of the instruction (or data) to be used
- in the relocation sum. If the target relocations don't have an
- addend in the reloc, eg. ELF USE_REL, src_mask will normally equal
- dst_mask to extract the addend from the section contents. If
- relocations do have an addend in the reloc, eg. ELF USE_RELA, this
- field should be zero. Non-zero values for ELF USE_RELA targets are
- bogus as in those cases the value in the dst_mask part of the
- section contents should be treated as garbage. */
- bfd_vma src_mask;
-
- /* dst_mask selects which parts of the instruction (or data) are
- replaced with a relocated value. */
- bfd_vma dst_mask;
-
- /* When some formats create PC relative instructions, they leave
- the value of the pc of the place being relocated in the offset
- slot of the instruction, so that a PC relative relocation can
- be made just by adding in an ordinary offset (e.g., sun3 a.out).
- Some formats leave the displacement part of an instruction
- empty (e.g., m88k bcs); this flag signals the fact. */
- bfd_boolean pcrel_offset;
-@};
-
-@end example
-@findex The HOWTO Macro
-@subsubsection @code{The HOWTO Macro}
-@strong{Description}@*
-The HOWTO define is horrible and will go away.
-@example
-#define HOWTO(C, R, S, B, P, BI, O, SF, NAME, INPLACE, MASKSRC, MASKDST, PC) \
- @{ (unsigned) C, R, S, B, P, BI, O, SF, NAME, INPLACE, MASKSRC, MASKDST, PC @}
-@end example
-
-@strong{Description}@*
-And will be replaced with the totally magic way. But for the
-moment, we are compatible, so do it this way.
-@example
-#define NEWHOWTO(FUNCTION, NAME, SIZE, REL, IN) \
- HOWTO (0, 0, SIZE, 0, REL, 0, complain_overflow_dont, FUNCTION, \
- NAME, FALSE, 0, 0, IN)
-
-@end example
-
-@strong{Description}@*
-This is used to fill in an empty howto entry in an array.
-@example
-#define EMPTY_HOWTO(C) \
- HOWTO ((C), 0, 0, 0, FALSE, 0, complain_overflow_dont, NULL, \
- NULL, FALSE, 0, 0, FALSE)
-
-@end example
-
-@strong{Description}@*
-Helper routine to turn a symbol into a relocation value.
-@example
-#define HOWTO_PREPARE(relocation, symbol) \
- @{ \
- if (symbol != NULL) \
- @{ \
- if (bfd_is_com_section (symbol->section)) \
- @{ \
- relocation = 0; \
- @} \
- else \
- @{ \
- relocation = symbol->value; \
- @} \
- @} \
- @}
-
-@end example
-
-@findex bfd_get_reloc_size
-@subsubsection @code{bfd_get_reloc_size}
-@strong{Synopsis}
-@example
-unsigned int bfd_get_reloc_size (reloc_howto_type *);
-@end example
-@strong{Description}@*
-For a reloc_howto_type that operates on a fixed number of bytes,
-this returns the number of bytes operated on.
-
-@findex arelent_chain
-@subsubsection @code{arelent_chain}
-@strong{Description}@*
-How relocs are tied together in an @code{asection}:
-@example
-typedef struct relent_chain
-@{
- arelent relent;
- struct relent_chain *next;
-@}
-arelent_chain;
-
-@end example
-
-@findex bfd_check_overflow
-@subsubsection @code{bfd_check_overflow}
-@strong{Synopsis}
-@example
-bfd_reloc_status_type bfd_check_overflow
- (enum complain_overflow how,
- unsigned int bitsize,
- unsigned int rightshift,
- unsigned int addrsize,
- bfd_vma relocation);
-@end example
-@strong{Description}@*
-Perform overflow checking on @var{relocation} which has
-@var{bitsize} significant bits and will be shifted right by
-@var{rightshift} bits, on a machine with addresses containing
-@var{addrsize} significant bits. The result is either of
-@code{bfd_reloc_ok} or @code{bfd_reloc_overflow}.
-
-@findex bfd_perform_relocation
-@subsubsection @code{bfd_perform_relocation}
-@strong{Synopsis}
-@example
-bfd_reloc_status_type bfd_perform_relocation
- (bfd *abfd,
- arelent *reloc_entry,
- void *data,
- asection *input_section,
- bfd *output_bfd,
- char **error_message);
-@end example
-@strong{Description}@*
-If @var{output_bfd} is supplied to this function, the
-generated image will be relocatable; the relocations are
-copied to the output file after they have been changed to
-reflect the new state of the world. There are two ways of
-reflecting the results of partial linkage in an output file:
-by modifying the output data in place, and by modifying the
-relocation record. Some native formats (e.g., basic a.out and
-basic coff) have no way of specifying an addend in the
-relocation type, so the addend has to go in the output data.
-This is no big deal since in these formats the output data
-slot will always be big enough for the addend. Complex reloc
-types with addends were invented to solve just this problem.
-The @var{error_message} argument is set to an error message if
-this return @code{bfd_reloc_dangerous}.
-
-@findex bfd_install_relocation
-@subsubsection @code{bfd_install_relocation}
-@strong{Synopsis}
-@example
-bfd_reloc_status_type bfd_install_relocation
- (bfd *abfd,
- arelent *reloc_entry,
- void *data, bfd_vma data_start,
- asection *input_section,
- char **error_message);
-@end example
-@strong{Description}@*
-This looks remarkably like @code{bfd_perform_relocation}, except it
-does not expect that the section contents have been filled in.
-I.e., it's suitable for use when creating, rather than applying
-a relocation.
-
-For now, this function should be considered reserved for the
-assembler.
-
-
-@node howto manager, , typedef arelent, Relocations
-@subsection The howto manager
-When an application wants to create a relocation, but doesn't
-know what the target machine might call it, it can find out by
-using this bit of code.
-
-@findex bfd_reloc_code_type
-@subsubsection @code{bfd_reloc_code_type}
-@strong{Description}@*
-The insides of a reloc code. The idea is that, eventually, there
-will be one enumerator for every type of relocation we ever do.
-Pass one of these values to @code{bfd_reloc_type_lookup}, and it'll
-return a howto pointer.
-
-This does mean that the application must determine the correct
-enumerator value; you can't get a howto pointer from a random set
-of attributes.
-
-Here are the possible values for @code{enum bfd_reloc_code_real}:
-
-@deffn {} BFD_RELOC_64
-@deffnx {} BFD_RELOC_32
-@deffnx {} BFD_RELOC_26
-@deffnx {} BFD_RELOC_24
-@deffnx {} BFD_RELOC_16
-@deffnx {} BFD_RELOC_14
-@deffnx {} BFD_RELOC_8
-Basic absolute relocations of N bits.
-@end deffn
-@deffn {} BFD_RELOC_64_PCREL
-@deffnx {} BFD_RELOC_32_PCREL
-@deffnx {} BFD_RELOC_24_PCREL
-@deffnx {} BFD_RELOC_16_PCREL
-@deffnx {} BFD_RELOC_12_PCREL
-@deffnx {} BFD_RELOC_8_PCREL
-PC-relative relocations. Sometimes these are relative to the address
-of the relocation itself; sometimes they are relative to the start of
-the section containing the relocation. It depends on the specific target.
-
-The 24-bit relocation is used in some Intel 960 configurations.
-@end deffn
-@deffn {} BFD_RELOC_32_SECREL
-Section relative relocations. Some targets need this for DWARF2.
-@end deffn
-@deffn {} BFD_RELOC_32_GOT_PCREL
-@deffnx {} BFD_RELOC_16_GOT_PCREL
-@deffnx {} BFD_RELOC_8_GOT_PCREL
-@deffnx {} BFD_RELOC_32_GOTOFF
-@deffnx {} BFD_RELOC_16_GOTOFF
-@deffnx {} BFD_RELOC_LO16_GOTOFF
-@deffnx {} BFD_RELOC_HI16_GOTOFF
-@deffnx {} BFD_RELOC_HI16_S_GOTOFF
-@deffnx {} BFD_RELOC_8_GOTOFF
-@deffnx {} BFD_RELOC_64_PLT_PCREL
-@deffnx {} BFD_RELOC_32_PLT_PCREL
-@deffnx {} BFD_RELOC_24_PLT_PCREL
-@deffnx {} BFD_RELOC_16_PLT_PCREL
-@deffnx {} BFD_RELOC_8_PLT_PCREL
-@deffnx {} BFD_RELOC_64_PLTOFF
-@deffnx {} BFD_RELOC_32_PLTOFF
-@deffnx {} BFD_RELOC_16_PLTOFF
-@deffnx {} BFD_RELOC_LO16_PLTOFF
-@deffnx {} BFD_RELOC_HI16_PLTOFF
-@deffnx {} BFD_RELOC_HI16_S_PLTOFF
-@deffnx {} BFD_RELOC_8_PLTOFF
-For ELF.
-@end deffn
-@deffn {} BFD_RELOC_SIZE32
-@deffnx {} BFD_RELOC_SIZE64
-Size relocations.
-@end deffn
-@deffn {} BFD_RELOC_68K_GLOB_DAT
-@deffnx {} BFD_RELOC_68K_JMP_SLOT
-@deffnx {} BFD_RELOC_68K_RELATIVE
-@deffnx {} BFD_RELOC_68K_TLS_GD32
-@deffnx {} BFD_RELOC_68K_TLS_GD16
-@deffnx {} BFD_RELOC_68K_TLS_GD8
-@deffnx {} BFD_RELOC_68K_TLS_LDM32
-@deffnx {} BFD_RELOC_68K_TLS_LDM16
-@deffnx {} BFD_RELOC_68K_TLS_LDM8
-@deffnx {} BFD_RELOC_68K_TLS_LDO32
-@deffnx {} BFD_RELOC_68K_TLS_LDO16
-@deffnx {} BFD_RELOC_68K_TLS_LDO8
-@deffnx {} BFD_RELOC_68K_TLS_IE32
-@deffnx {} BFD_RELOC_68K_TLS_IE16
-@deffnx {} BFD_RELOC_68K_TLS_IE8
-@deffnx {} BFD_RELOC_68K_TLS_LE32
-@deffnx {} BFD_RELOC_68K_TLS_LE16
-@deffnx {} BFD_RELOC_68K_TLS_LE8
-Relocations used by 68K ELF.
-@end deffn
-@deffn {} BFD_RELOC_32_BASEREL
-@deffnx {} BFD_RELOC_16_BASEREL
-@deffnx {} BFD_RELOC_LO16_BASEREL
-@deffnx {} BFD_RELOC_HI16_BASEREL
-@deffnx {} BFD_RELOC_HI16_S_BASEREL
-@deffnx {} BFD_RELOC_8_BASEREL
-@deffnx {} BFD_RELOC_RVA
-Linkage-table relative.
-@end deffn
-@deffn {} BFD_RELOC_8_FFnn
-Absolute 8-bit relocation, but used to form an address like 0xFFnn.
-@end deffn
-@deffn {} BFD_RELOC_32_PCREL_S2
-@deffnx {} BFD_RELOC_16_PCREL_S2
-@deffnx {} BFD_RELOC_23_PCREL_S2
-These PC-relative relocations are stored as word displacements --
-i.e., byte displacements shifted right two bits. The 30-bit word
-displacement (<<32_PCREL_S2>> -- 32 bits, shifted 2) is used on the
-SPARC. (SPARC tools generally refer to this as <>.) The
-signed 16-bit displacement is used on the MIPS, and the 23-bit
-displacement is used on the Alpha.
-@end deffn
-@deffn {} BFD_RELOC_HI22
-@deffnx {} BFD_RELOC_LO10
-High 22 bits and low 10 bits of 32-bit value, placed into lower bits of
-the target word. These are used on the SPARC.
-@end deffn
-@deffn {} BFD_RELOC_GPREL16
-@deffnx {} BFD_RELOC_GPREL32
-For systems that allocate a Global Pointer register, these are
-displacements off that register. These relocation types are
-handled specially, because the value the register will have is
-decided relatively late.
-@end deffn
-@deffn {} BFD_RELOC_I960_CALLJ
-Reloc types used for i960/b.out.
-@end deffn
-@deffn {} BFD_RELOC_NONE
-@deffnx {} BFD_RELOC_SPARC_WDISP22
-@deffnx {} BFD_RELOC_SPARC22
-@deffnx {} BFD_RELOC_SPARC13
-@deffnx {} BFD_RELOC_SPARC_GOT10
-@deffnx {} BFD_RELOC_SPARC_GOT13
-@deffnx {} BFD_RELOC_SPARC_GOT22
-@deffnx {} BFD_RELOC_SPARC_PC10
-@deffnx {} BFD_RELOC_SPARC_PC22
-@deffnx {} BFD_RELOC_SPARC_WPLT30
-@deffnx {} BFD_RELOC_SPARC_COPY
-@deffnx {} BFD_RELOC_SPARC_GLOB_DAT
-@deffnx {} BFD_RELOC_SPARC_JMP_SLOT
-@deffnx {} BFD_RELOC_SPARC_RELATIVE
-@deffnx {} BFD_RELOC_SPARC_UA16
-@deffnx {} BFD_RELOC_SPARC_UA32
-@deffnx {} BFD_RELOC_SPARC_UA64
-@deffnx {} BFD_RELOC_SPARC_GOTDATA_HIX22
-@deffnx {} BFD_RELOC_SPARC_GOTDATA_LOX10
-@deffnx {} BFD_RELOC_SPARC_GOTDATA_OP_HIX22
-@deffnx {} BFD_RELOC_SPARC_GOTDATA_OP_LOX10
-@deffnx {} BFD_RELOC_SPARC_GOTDATA_OP
-@deffnx {} BFD_RELOC_SPARC_JMP_IREL
-@deffnx {} BFD_RELOC_SPARC_IRELATIVE
-SPARC ELF relocations. There is probably some overlap with other
-relocation types already defined.
-@end deffn
-@deffn {} BFD_RELOC_SPARC_BASE13
-@deffnx {} BFD_RELOC_SPARC_BASE22
-I think these are specific to SPARC a.out (e.g., Sun 4).
-@end deffn
-@deffn {} BFD_RELOC_SPARC_64
-@deffnx {} BFD_RELOC_SPARC_10
-@deffnx {} BFD_RELOC_SPARC_11
-@deffnx {} BFD_RELOC_SPARC_OLO10
-@deffnx {} BFD_RELOC_SPARC_HH22
-@deffnx {} BFD_RELOC_SPARC_HM10
-@deffnx {} BFD_RELOC_SPARC_LM22
-@deffnx {} BFD_RELOC_SPARC_PC_HH22
-@deffnx {} BFD_RELOC_SPARC_PC_HM10
-@deffnx {} BFD_RELOC_SPARC_PC_LM22
-@deffnx {} BFD_RELOC_SPARC_WDISP16
-@deffnx {} BFD_RELOC_SPARC_WDISP19
-@deffnx {} BFD_RELOC_SPARC_7
-@deffnx {} BFD_RELOC_SPARC_6
-@deffnx {} BFD_RELOC_SPARC_5
-@deffnx {} BFD_RELOC_SPARC_DISP64
-@deffnx {} BFD_RELOC_SPARC_PLT32
-@deffnx {} BFD_RELOC_SPARC_PLT64
-@deffnx {} BFD_RELOC_SPARC_HIX22
-@deffnx {} BFD_RELOC_SPARC_LOX10
-@deffnx {} BFD_RELOC_SPARC_H44
-@deffnx {} BFD_RELOC_SPARC_M44
-@deffnx {} BFD_RELOC_SPARC_L44
-@deffnx {} BFD_RELOC_SPARC_REGISTER
-@deffnx {} BFD_RELOC_SPARC_H34
-@deffnx {} BFD_RELOC_SPARC_SIZE32
-@deffnx {} BFD_RELOC_SPARC_SIZE64
-@deffnx {} BFD_RELOC_SPARC_WDISP10
-SPARC64 relocations
-@end deffn
-@deffn {} BFD_RELOC_SPARC_REV32
-SPARC little endian relocation
-@end deffn
-@deffn {} BFD_RELOC_SPARC_TLS_GD_HI22
-@deffnx {} BFD_RELOC_SPARC_TLS_GD_LO10
-@deffnx {} BFD_RELOC_SPARC_TLS_GD_ADD
-@deffnx {} BFD_RELOC_SPARC_TLS_GD_CALL
-@deffnx {} BFD_RELOC_SPARC_TLS_LDM_HI22
-@deffnx {} BFD_RELOC_SPARC_TLS_LDM_LO10
-@deffnx {} BFD_RELOC_SPARC_TLS_LDM_ADD
-@deffnx {} BFD_RELOC_SPARC_TLS_LDM_CALL
-@deffnx {} BFD_RELOC_SPARC_TLS_LDO_HIX22
-@deffnx {} BFD_RELOC_SPARC_TLS_LDO_LOX10
-@deffnx {} BFD_RELOC_SPARC_TLS_LDO_ADD
-@deffnx {} BFD_RELOC_SPARC_TLS_IE_HI22
-@deffnx {} BFD_RELOC_SPARC_TLS_IE_LO10
-@deffnx {} BFD_RELOC_SPARC_TLS_IE_LD
-@deffnx {} BFD_RELOC_SPARC_TLS_IE_LDX
-@deffnx {} BFD_RELOC_SPARC_TLS_IE_ADD
-@deffnx {} BFD_RELOC_SPARC_TLS_LE_HIX22
-@deffnx {} BFD_RELOC_SPARC_TLS_LE_LOX10
-@deffnx {} BFD_RELOC_SPARC_TLS_DTPMOD32
-@deffnx {} BFD_RELOC_SPARC_TLS_DTPMOD64
-@deffnx {} BFD_RELOC_SPARC_TLS_DTPOFF32
-@deffnx {} BFD_RELOC_SPARC_TLS_DTPOFF64
-@deffnx {} BFD_RELOC_SPARC_TLS_TPOFF32
-@deffnx {} BFD_RELOC_SPARC_TLS_TPOFF64
-SPARC TLS relocations
-@end deffn
-@deffn {} BFD_RELOC_SPU_IMM7
-@deffnx {} BFD_RELOC_SPU_IMM8
-@deffnx {} BFD_RELOC_SPU_IMM10
-@deffnx {} BFD_RELOC_SPU_IMM10W
-@deffnx {} BFD_RELOC_SPU_IMM16
-@deffnx {} BFD_RELOC_SPU_IMM16W
-@deffnx {} BFD_RELOC_SPU_IMM18
-@deffnx {} BFD_RELOC_SPU_PCREL9a
-@deffnx {} BFD_RELOC_SPU_PCREL9b
-@deffnx {} BFD_RELOC_SPU_PCREL16
-@deffnx {} BFD_RELOC_SPU_LO16
-@deffnx {} BFD_RELOC_SPU_HI16
-@deffnx {} BFD_RELOC_SPU_PPU32
-@deffnx {} BFD_RELOC_SPU_PPU64
-@deffnx {} BFD_RELOC_SPU_ADD_PIC
-SPU Relocations.
-@end deffn
-@deffn {} BFD_RELOC_ALPHA_GPDISP_HI16
-Alpha ECOFF and ELF relocations. Some of these treat the symbol or
-"addend" in some special way.
-For GPDISP_HI16 ("gpdisp") relocations, the symbol is ignored when
-writing; when reading, it will be the absolute section symbol. The
-addend is the displacement in bytes of the "lda" instruction from
-the "ldah" instruction (which is at the address of this reloc).
-@end deffn
-@deffn {} BFD_RELOC_ALPHA_GPDISP_LO16
-For GPDISP_LO16 ("ignore") relocations, the symbol is handled as
-with GPDISP_HI16 relocs. The addend is ignored when writing the
-relocations out, and is filled in with the file's GP value on
-reading, for convenience.
-@end deffn
-@deffn {} BFD_RELOC_ALPHA_GPDISP
-The ELF GPDISP relocation is exactly the same as the GPDISP_HI16
-relocation except that there is no accompanying GPDISP_LO16
-relocation.
-@end deffn
-@deffn {} BFD_RELOC_ALPHA_LITERAL
-@deffnx {} BFD_RELOC_ALPHA_ELF_LITERAL
-@deffnx {} BFD_RELOC_ALPHA_LITUSE
-The Alpha LITERAL/LITUSE relocs are produced by a symbol reference;
-the assembler turns it into a LDQ instruction to load the address of
-the symbol, and then fills in a register in the real instruction.
-
-The LITERAL reloc, at the LDQ instruction, refers to the .lita
-section symbol. The addend is ignored when writing, but is filled
-in with the file's GP value on reading, for convenience, as with the
-GPDISP_LO16 reloc.
-
-The ELF_LITERAL reloc is somewhere between 16_GOTOFF and GPDISP_LO16.
-It should refer to the symbol to be referenced, as with 16_GOTOFF,
-but it generates output not based on the position within the .got
-section, but relative to the GP value chosen for the file during the
-final link stage.
-
-The LITUSE reloc, on the instruction using the loaded address, gives
-information to the linker that it might be able to use to optimize
-away some literal section references. The symbol is ignored (read
-as the absolute section symbol), and the "addend" indicates the type
-of instruction using the register:
-1 - "memory" fmt insn
-2 - byte-manipulation (byte offset reg)
-3 - jsr (target of branch)
-@end deffn
-@deffn {} BFD_RELOC_ALPHA_HINT
-The HINT relocation indicates a value that should be filled into the
-"hint" field of a jmp/jsr/ret instruction, for possible branch-
-prediction logic which may be provided on some processors.
-@end deffn
-@deffn {} BFD_RELOC_ALPHA_LINKAGE
-The LINKAGE relocation outputs a linkage pair in the object file,
-which is filled by the linker.
-@end deffn
-@deffn {} BFD_RELOC_ALPHA_CODEADDR
-The CODEADDR relocation outputs a STO_CA in the object file,
-which is filled by the linker.
-@end deffn
-@deffn {} BFD_RELOC_ALPHA_GPREL_HI16
-@deffnx {} BFD_RELOC_ALPHA_GPREL_LO16
-The GPREL_HI/LO relocations together form a 32-bit offset from the
-GP register.
-@end deffn
-@deffn {} BFD_RELOC_ALPHA_BRSGP
-Like BFD_RELOC_23_PCREL_S2, except that the source and target must
-share a common GP, and the target address is adjusted for
-STO_ALPHA_STD_GPLOAD.
-@end deffn
-@deffn {} BFD_RELOC_ALPHA_NOP
-The NOP relocation outputs a NOP if the longword displacement
-between two procedure entry points is < 2^21.
-@end deffn
-@deffn {} BFD_RELOC_ALPHA_BSR
-The BSR relocation outputs a BSR if the longword displacement
-between two procedure entry points is < 2^21.
-@end deffn
-@deffn {} BFD_RELOC_ALPHA_LDA
-The LDA relocation outputs a LDA if the longword displacement
-between two procedure entry points is < 2^16.
-@end deffn
-@deffn {} BFD_RELOC_ALPHA_BOH
-The BOH relocation outputs a BSR if the longword displacement
-between two procedure entry points is < 2^21, or else a hint.
-@end deffn
-@deffn {} BFD_RELOC_ALPHA_TLSGD
-@deffnx {} BFD_RELOC_ALPHA_TLSLDM
-@deffnx {} BFD_RELOC_ALPHA_DTPMOD64
-@deffnx {} BFD_RELOC_ALPHA_GOTDTPREL16
-@deffnx {} BFD_RELOC_ALPHA_DTPREL64
-@deffnx {} BFD_RELOC_ALPHA_DTPREL_HI16
-@deffnx {} BFD_RELOC_ALPHA_DTPREL_LO16
-@deffnx {} BFD_RELOC_ALPHA_DTPREL16
-@deffnx {} BFD_RELOC_ALPHA_GOTTPREL16
-@deffnx {} BFD_RELOC_ALPHA_TPREL64
-@deffnx {} BFD_RELOC_ALPHA_TPREL_HI16
-@deffnx {} BFD_RELOC_ALPHA_TPREL_LO16
-@deffnx {} BFD_RELOC_ALPHA_TPREL16
-Alpha thread-local storage relocations.
-@end deffn
-@deffn {} BFD_RELOC_MIPS_JMP
-@deffnx {} BFD_RELOC_MICROMIPS_JMP
-The MIPS jump instruction.
-@end deffn
-@deffn {} BFD_RELOC_MIPS16_JMP
-The MIPS16 jump instruction.
-@end deffn
-@deffn {} BFD_RELOC_MIPS16_GPREL
-MIPS16 GP relative reloc.
-@end deffn
-@deffn {} BFD_RELOC_HI16
-High 16 bits of 32-bit value; simple reloc.
-@end deffn
-@deffn {} BFD_RELOC_HI16_S
-High 16 bits of 32-bit value but the low 16 bits will be sign
-extended and added to form the final result. If the low 16
-bits form a negative number, we need to add one to the high value
-to compensate for the borrow when the low bits are added.
-@end deffn
-@deffn {} BFD_RELOC_LO16
-Low 16 bits.
-@end deffn
-@deffn {} BFD_RELOC_HI16_PCREL
-High 16 bits of 32-bit pc-relative value
-@end deffn
-@deffn {} BFD_RELOC_HI16_S_PCREL
-High 16 bits of 32-bit pc-relative value, adjusted
-@end deffn
-@deffn {} BFD_RELOC_LO16_PCREL
-Low 16 bits of pc-relative value
-@end deffn
-@deffn {} BFD_RELOC_MIPS16_GOT16
-@deffnx {} BFD_RELOC_MIPS16_CALL16
-Equivalent of BFD_RELOC_MIPS_*, but with the MIPS16 layout of
-16-bit immediate fields
-@end deffn
-@deffn {} BFD_RELOC_MIPS16_HI16
-MIPS16 high 16 bits of 32-bit value.
-@end deffn
-@deffn {} BFD_RELOC_MIPS16_HI16_S
-MIPS16 high 16 bits of 32-bit value but the low 16 bits will be sign
-extended and added to form the final result. If the low 16
-bits form a negative number, we need to add one to the high value
-to compensate for the borrow when the low bits are added.
-@end deffn
-@deffn {} BFD_RELOC_MIPS16_LO16
-MIPS16 low 16 bits.
-@end deffn
-@deffn {} BFD_RELOC_MIPS16_TLS_GD
-@deffnx {} BFD_RELOC_MIPS16_TLS_LDM
-@deffnx {} BFD_RELOC_MIPS16_TLS_DTPREL_HI16
-@deffnx {} BFD_RELOC_MIPS16_TLS_DTPREL_LO16
-@deffnx {} BFD_RELOC_MIPS16_TLS_GOTTPREL
-@deffnx {} BFD_RELOC_MIPS16_TLS_TPREL_HI16
-@deffnx {} BFD_RELOC_MIPS16_TLS_TPREL_LO16
-MIPS16 TLS relocations
-@end deffn
-@deffn {} BFD_RELOC_MIPS_LITERAL
-@deffnx {} BFD_RELOC_MICROMIPS_LITERAL
-Relocation against a MIPS literal section.
-@end deffn
-@deffn {} BFD_RELOC_MICROMIPS_7_PCREL_S1
-@deffnx {} BFD_RELOC_MICROMIPS_10_PCREL_S1
-@deffnx {} BFD_RELOC_MICROMIPS_16_PCREL_S1
-microMIPS PC-relative relocations.
-@end deffn
-@deffn {} BFD_RELOC_MICROMIPS_GPREL16
-@deffnx {} BFD_RELOC_MICROMIPS_HI16
-@deffnx {} BFD_RELOC_MICROMIPS_HI16_S
-@deffnx {} BFD_RELOC_MICROMIPS_LO16
-microMIPS versions of generic BFD relocs.
-@end deffn
-@deffn {} BFD_RELOC_MIPS_GOT16
-@deffnx {} BFD_RELOC_MICROMIPS_GOT16
-@deffnx {} BFD_RELOC_MIPS_CALL16
-@deffnx {} BFD_RELOC_MICROMIPS_CALL16
-@deffnx {} BFD_RELOC_MIPS_GOT_HI16
-@deffnx {} BFD_RELOC_MICROMIPS_GOT_HI16
-@deffnx {} BFD_RELOC_MIPS_GOT_LO16
-@deffnx {} BFD_RELOC_MICROMIPS_GOT_LO16
-@deffnx {} BFD_RELOC_MIPS_CALL_HI16
-@deffnx {} BFD_RELOC_MICROMIPS_CALL_HI16
-@deffnx {} BFD_RELOC_MIPS_CALL_LO16
-@deffnx {} BFD_RELOC_MICROMIPS_CALL_LO16
-@deffnx {} BFD_RELOC_MIPS_SUB
-@deffnx {} BFD_RELOC_MICROMIPS_SUB
-@deffnx {} BFD_RELOC_MIPS_GOT_PAGE
-@deffnx {} BFD_RELOC_MICROMIPS_GOT_PAGE
-@deffnx {} BFD_RELOC_MIPS_GOT_OFST
-@deffnx {} BFD_RELOC_MICROMIPS_GOT_OFST
-@deffnx {} BFD_RELOC_MIPS_GOT_DISP
-@deffnx {} BFD_RELOC_MICROMIPS_GOT_DISP
-@deffnx {} BFD_RELOC_MIPS_SHIFT5
-@deffnx {} BFD_RELOC_MIPS_SHIFT6
-@deffnx {} BFD_RELOC_MIPS_INSERT_A
-@deffnx {} BFD_RELOC_MIPS_INSERT_B
-@deffnx {} BFD_RELOC_MIPS_DELETE
-@deffnx {} BFD_RELOC_MIPS_HIGHEST
-@deffnx {} BFD_RELOC_MICROMIPS_HIGHEST
-@deffnx {} BFD_RELOC_MIPS_HIGHER
-@deffnx {} BFD_RELOC_MICROMIPS_HIGHER
-@deffnx {} BFD_RELOC_MIPS_SCN_DISP
-@deffnx {} BFD_RELOC_MICROMIPS_SCN_DISP
-@deffnx {} BFD_RELOC_MIPS_REL16
-@deffnx {} BFD_RELOC_MIPS_RELGOT
-@deffnx {} BFD_RELOC_MIPS_JALR
-@deffnx {} BFD_RELOC_MICROMIPS_JALR
-@deffnx {} BFD_RELOC_MIPS_TLS_DTPMOD32
-@deffnx {} BFD_RELOC_MIPS_TLS_DTPREL32
-@deffnx {} BFD_RELOC_MIPS_TLS_DTPMOD64
-@deffnx {} BFD_RELOC_MIPS_TLS_DTPREL64
-@deffnx {} BFD_RELOC_MIPS_TLS_GD
-@deffnx {} BFD_RELOC_MICROMIPS_TLS_GD
-@deffnx {} BFD_RELOC_MIPS_TLS_LDM
-@deffnx {} BFD_RELOC_MICROMIPS_TLS_LDM
-@deffnx {} BFD_RELOC_MIPS_TLS_DTPREL_HI16
-@deffnx {} BFD_RELOC_MICROMIPS_TLS_DTPREL_HI16
-@deffnx {} BFD_RELOC_MIPS_TLS_DTPREL_LO16
-@deffnx {} BFD_RELOC_MICROMIPS_TLS_DTPREL_LO16
-@deffnx {} BFD_RELOC_MIPS_TLS_GOTTPREL
-@deffnx {} BFD_RELOC_MICROMIPS_TLS_GOTTPREL
-@deffnx {} BFD_RELOC_MIPS_TLS_TPREL32
-@deffnx {} BFD_RELOC_MIPS_TLS_TPREL64
-@deffnx {} BFD_RELOC_MIPS_TLS_TPREL_HI16
-@deffnx {} BFD_RELOC_MICROMIPS_TLS_TPREL_HI16
-@deffnx {} BFD_RELOC_MIPS_TLS_TPREL_LO16
-@deffnx {} BFD_RELOC_MICROMIPS_TLS_TPREL_LO16
-@deffnx {} BFD_RELOC_MIPS_EH
-MIPS ELF relocations.
-@end deffn
-@deffn {} BFD_RELOC_MIPS_COPY
-@deffnx {} BFD_RELOC_MIPS_JUMP_SLOT
-MIPS ELF relocations (VxWorks and PLT extensions).
-@end deffn
-@deffn {} BFD_RELOC_MOXIE_10_PCREL
-Moxie ELF relocations.
-@end deffn
-@deffn {} BFD_RELOC_FRV_LABEL16
-@deffnx {} BFD_RELOC_FRV_LABEL24
-@deffnx {} BFD_RELOC_FRV_LO16
-@deffnx {} BFD_RELOC_FRV_HI16
-@deffnx {} BFD_RELOC_FRV_GPREL12
-@deffnx {} BFD_RELOC_FRV_GPRELU12
-@deffnx {} BFD_RELOC_FRV_GPREL32
-@deffnx {} BFD_RELOC_FRV_GPRELHI
-@deffnx {} BFD_RELOC_FRV_GPRELLO
-@deffnx {} BFD_RELOC_FRV_GOT12
-@deffnx {} BFD_RELOC_FRV_GOTHI
-@deffnx {} BFD_RELOC_FRV_GOTLO
-@deffnx {} BFD_RELOC_FRV_FUNCDESC
-@deffnx {} BFD_RELOC_FRV_FUNCDESC_GOT12
-@deffnx {} BFD_RELOC_FRV_FUNCDESC_GOTHI
-@deffnx {} BFD_RELOC_FRV_FUNCDESC_GOTLO
-@deffnx {} BFD_RELOC_FRV_FUNCDESC_VALUE
-@deffnx {} BFD_RELOC_FRV_FUNCDESC_GOTOFF12
-@deffnx {} BFD_RELOC_FRV_FUNCDESC_GOTOFFHI
-@deffnx {} BFD_RELOC_FRV_FUNCDESC_GOTOFFLO
-@deffnx {} BFD_RELOC_FRV_GOTOFF12
-@deffnx {} BFD_RELOC_FRV_GOTOFFHI
-@deffnx {} BFD_RELOC_FRV_GOTOFFLO
-@deffnx {} BFD_RELOC_FRV_GETTLSOFF
-@deffnx {} BFD_RELOC_FRV_TLSDESC_VALUE
-@deffnx {} BFD_RELOC_FRV_GOTTLSDESC12
-@deffnx {} BFD_RELOC_FRV_GOTTLSDESCHI
-@deffnx {} BFD_RELOC_FRV_GOTTLSDESCLO
-@deffnx {} BFD_RELOC_FRV_TLSMOFF12
-@deffnx {} BFD_RELOC_FRV_TLSMOFFHI
-@deffnx {} BFD_RELOC_FRV_TLSMOFFLO
-@deffnx {} BFD_RELOC_FRV_GOTTLSOFF12
-@deffnx {} BFD_RELOC_FRV_GOTTLSOFFHI
-@deffnx {} BFD_RELOC_FRV_GOTTLSOFFLO
-@deffnx {} BFD_RELOC_FRV_TLSOFF
-@deffnx {} BFD_RELOC_FRV_TLSDESC_RELAX
-@deffnx {} BFD_RELOC_FRV_GETTLSOFF_RELAX
-@deffnx {} BFD_RELOC_FRV_TLSOFF_RELAX
-@deffnx {} BFD_RELOC_FRV_TLSMOFF
-Fujitsu Frv Relocations.
-@end deffn
-@deffn {} BFD_RELOC_MN10300_GOTOFF24
-This is a 24bit GOT-relative reloc for the mn10300.
-@end deffn
-@deffn {} BFD_RELOC_MN10300_GOT32
-This is a 32bit GOT-relative reloc for the mn10300, offset by two bytes
-in the instruction.
-@end deffn
-@deffn {} BFD_RELOC_MN10300_GOT24
-This is a 24bit GOT-relative reloc for the mn10300, offset by two bytes
-in the instruction.
-@end deffn
-@deffn {} BFD_RELOC_MN10300_GOT16
-This is a 16bit GOT-relative reloc for the mn10300, offset by two bytes
-in the instruction.
-@end deffn
-@deffn {} BFD_RELOC_MN10300_COPY
-Copy symbol at runtime.
-@end deffn
-@deffn {} BFD_RELOC_MN10300_GLOB_DAT
-Create GOT entry.
-@end deffn
-@deffn {} BFD_RELOC_MN10300_JMP_SLOT
-Create PLT entry.
-@end deffn
-@deffn {} BFD_RELOC_MN10300_RELATIVE
-Adjust by program base.
-@end deffn
-@deffn {} BFD_RELOC_MN10300_SYM_DIFF
-Together with another reloc targeted at the same location,
-allows for a value that is the difference of two symbols
-in the same section.
-@end deffn
-@deffn {} BFD_RELOC_MN10300_ALIGN
-The addend of this reloc is an alignment power that must
-be honoured at the offset's location, regardless of linker
-relaxation.
-@end deffn
-@deffn {} BFD_RELOC_MN10300_TLS_GD
-@deffnx {} BFD_RELOC_MN10300_TLS_LD
-@deffnx {} BFD_RELOC_MN10300_TLS_LDO
-@deffnx {} BFD_RELOC_MN10300_TLS_GOTIE
-@deffnx {} BFD_RELOC_MN10300_TLS_IE
-@deffnx {} BFD_RELOC_MN10300_TLS_LE
-@deffnx {} BFD_RELOC_MN10300_TLS_DTPMOD
-@deffnx {} BFD_RELOC_MN10300_TLS_DTPOFF
-@deffnx {} BFD_RELOC_MN10300_TLS_TPOFF
-Various TLS-related relocations.
-@end deffn
-@deffn {} BFD_RELOC_MN10300_32_PCREL
-This is a 32bit pcrel reloc for the mn10300, offset by two bytes in the
-instruction.
-@end deffn
-@deffn {} BFD_RELOC_MN10300_16_PCREL
-This is a 16bit pcrel reloc for the mn10300, offset by two bytes in the
-instruction.
-@end deffn
-@deffn {} BFD_RELOC_386_GOT32
-@deffnx {} BFD_RELOC_386_PLT32
-@deffnx {} BFD_RELOC_386_COPY
-@deffnx {} BFD_RELOC_386_GLOB_DAT
-@deffnx {} BFD_RELOC_386_JUMP_SLOT
-@deffnx {} BFD_RELOC_386_RELATIVE
-@deffnx {} BFD_RELOC_386_GOTOFF
-@deffnx {} BFD_RELOC_386_GOTPC
-@deffnx {} BFD_RELOC_386_TLS_TPOFF
-@deffnx {} BFD_RELOC_386_TLS_IE
-@deffnx {} BFD_RELOC_386_TLS_GOTIE
-@deffnx {} BFD_RELOC_386_TLS_LE
-@deffnx {} BFD_RELOC_386_TLS_GD
-@deffnx {} BFD_RELOC_386_TLS_LDM
-@deffnx {} BFD_RELOC_386_TLS_LDO_32
-@deffnx {} BFD_RELOC_386_TLS_IE_32
-@deffnx {} BFD_RELOC_386_TLS_LE_32
-@deffnx {} BFD_RELOC_386_TLS_DTPMOD32
-@deffnx {} BFD_RELOC_386_TLS_DTPOFF32
-@deffnx {} BFD_RELOC_386_TLS_TPOFF32
-@deffnx {} BFD_RELOC_386_TLS_GOTDESC
-@deffnx {} BFD_RELOC_386_TLS_DESC_CALL
-@deffnx {} BFD_RELOC_386_TLS_DESC
-@deffnx {} BFD_RELOC_386_IRELATIVE
-i386/elf relocations
-@end deffn
-@deffn {} BFD_RELOC_X86_64_GOT32
-@deffnx {} BFD_RELOC_X86_64_PLT32
-@deffnx {} BFD_RELOC_X86_64_COPY
-@deffnx {} BFD_RELOC_X86_64_GLOB_DAT
-@deffnx {} BFD_RELOC_X86_64_JUMP_SLOT
-@deffnx {} BFD_RELOC_X86_64_RELATIVE
-@deffnx {} BFD_RELOC_X86_64_GOTPCREL
-@deffnx {} BFD_RELOC_X86_64_32S
-@deffnx {} BFD_RELOC_X86_64_DTPMOD64
-@deffnx {} BFD_RELOC_X86_64_DTPOFF64
-@deffnx {} BFD_RELOC_X86_64_TPOFF64
-@deffnx {} BFD_RELOC_X86_64_TLSGD
-@deffnx {} BFD_RELOC_X86_64_TLSLD
-@deffnx {} BFD_RELOC_X86_64_DTPOFF32
-@deffnx {} BFD_RELOC_X86_64_GOTTPOFF
-@deffnx {} BFD_RELOC_X86_64_TPOFF32
-@deffnx {} BFD_RELOC_X86_64_GOTOFF64
-@deffnx {} BFD_RELOC_X86_64_GOTPC32
-@deffnx {} BFD_RELOC_X86_64_GOT64
-@deffnx {} BFD_RELOC_X86_64_GOTPCREL64
-@deffnx {} BFD_RELOC_X86_64_GOTPC64
-@deffnx {} BFD_RELOC_X86_64_GOTPLT64
-@deffnx {} BFD_RELOC_X86_64_PLTOFF64
-@deffnx {} BFD_RELOC_X86_64_GOTPC32_TLSDESC
-@deffnx {} BFD_RELOC_X86_64_TLSDESC_CALL
-@deffnx {} BFD_RELOC_X86_64_TLSDESC
-@deffnx {} BFD_RELOC_X86_64_IRELATIVE
-@deffnx {} BFD_RELOC_X86_64_PC32_BND
-@deffnx {} BFD_RELOC_X86_64_PLT32_BND
-x86-64/elf relocations
-@end deffn
-@deffn {} BFD_RELOC_NS32K_IMM_8
-@deffnx {} BFD_RELOC_NS32K_IMM_16
-@deffnx {} BFD_RELOC_NS32K_IMM_32
-@deffnx {} BFD_RELOC_NS32K_IMM_8_PCREL
-@deffnx {} BFD_RELOC_NS32K_IMM_16_PCREL
-@deffnx {} BFD_RELOC_NS32K_IMM_32_PCREL
-@deffnx {} BFD_RELOC_NS32K_DISP_8
-@deffnx {} BFD_RELOC_NS32K_DISP_16
-@deffnx {} BFD_RELOC_NS32K_DISP_32
-@deffnx {} BFD_RELOC_NS32K_DISP_8_PCREL
-@deffnx {} BFD_RELOC_NS32K_DISP_16_PCREL
-@deffnx {} BFD_RELOC_NS32K_DISP_32_PCREL
-ns32k relocations
-@end deffn
-@deffn {} BFD_RELOC_PDP11_DISP_8_PCREL
-@deffnx {} BFD_RELOC_PDP11_DISP_6_PCREL
-PDP11 relocations
-@end deffn
-@deffn {} BFD_RELOC_PJ_CODE_HI16
-@deffnx {} BFD_RELOC_PJ_CODE_LO16
-@deffnx {} BFD_RELOC_PJ_CODE_DIR16
-@deffnx {} BFD_RELOC_PJ_CODE_DIR32
-@deffnx {} BFD_RELOC_PJ_CODE_REL16
-@deffnx {} BFD_RELOC_PJ_CODE_REL32
-Picojava relocs. Not all of these appear in object files.
-@end deffn
-@deffn {} BFD_RELOC_PPC_B26
-@deffnx {} BFD_RELOC_PPC_BA26
-@deffnx {} BFD_RELOC_PPC_TOC16
-@deffnx {} BFD_RELOC_PPC_B16
-@deffnx {} BFD_RELOC_PPC_B16_BRTAKEN
-@deffnx {} BFD_RELOC_PPC_B16_BRNTAKEN
-@deffnx {} BFD_RELOC_PPC_BA16
-@deffnx {} BFD_RELOC_PPC_BA16_BRTAKEN
-@deffnx {} BFD_RELOC_PPC_BA16_BRNTAKEN
-@deffnx {} BFD_RELOC_PPC_COPY
-@deffnx {} BFD_RELOC_PPC_GLOB_DAT
-@deffnx {} BFD_RELOC_PPC_JMP_SLOT
-@deffnx {} BFD_RELOC_PPC_RELATIVE
-@deffnx {} BFD_RELOC_PPC_LOCAL24PC
-@deffnx {} BFD_RELOC_PPC_EMB_NADDR32
-@deffnx {} BFD_RELOC_PPC_EMB_NADDR16
-@deffnx {} BFD_RELOC_PPC_EMB_NADDR16_LO
-@deffnx {} BFD_RELOC_PPC_EMB_NADDR16_HI
-@deffnx {} BFD_RELOC_PPC_EMB_NADDR16_HA
-@deffnx {} BFD_RELOC_PPC_EMB_SDAI16
-@deffnx {} BFD_RELOC_PPC_EMB_SDA2I16
-@deffnx {} BFD_RELOC_PPC_EMB_SDA2REL
-@deffnx {} BFD_RELOC_PPC_EMB_SDA21
-@deffnx {} BFD_RELOC_PPC_EMB_MRKREF
-@deffnx {} BFD_RELOC_PPC_EMB_RELSEC16
-@deffnx {} BFD_RELOC_PPC_EMB_RELST_LO
-@deffnx {} BFD_RELOC_PPC_EMB_RELST_HI
-@deffnx {} BFD_RELOC_PPC_EMB_RELST_HA
-@deffnx {} BFD_RELOC_PPC_EMB_BIT_FLD
-@deffnx {} BFD_RELOC_PPC_EMB_RELSDA
-@deffnx {} BFD_RELOC_PPC_VLE_REL8
-@deffnx {} BFD_RELOC_PPC_VLE_REL15
-@deffnx {} BFD_RELOC_PPC_VLE_REL24
-@deffnx {} BFD_RELOC_PPC_VLE_LO16A
-@deffnx {} BFD_RELOC_PPC_VLE_LO16D
-@deffnx {} BFD_RELOC_PPC_VLE_HI16A
-@deffnx {} BFD_RELOC_PPC_VLE_HI16D
-@deffnx {} BFD_RELOC_PPC_VLE_HA16A
-@deffnx {} BFD_RELOC_PPC_VLE_HA16D
-@deffnx {} BFD_RELOC_PPC_VLE_SDA21
-@deffnx {} BFD_RELOC_PPC_VLE_SDA21_LO
-@deffnx {} BFD_RELOC_PPC_VLE_SDAREL_LO16A
-@deffnx {} BFD_RELOC_PPC_VLE_SDAREL_LO16D
-@deffnx {} BFD_RELOC_PPC_VLE_SDAREL_HI16A
-@deffnx {} BFD_RELOC_PPC_VLE_SDAREL_HI16D
-@deffnx {} BFD_RELOC_PPC_VLE_SDAREL_HA16A
-@deffnx {} BFD_RELOC_PPC_VLE_SDAREL_HA16D
-@deffnx {} BFD_RELOC_PPC64_HIGHER
-@deffnx {} BFD_RELOC_PPC64_HIGHER_S
-@deffnx {} BFD_RELOC_PPC64_HIGHEST
-@deffnx {} BFD_RELOC_PPC64_HIGHEST_S
-@deffnx {} BFD_RELOC_PPC64_TOC16_LO
-@deffnx {} BFD_RELOC_PPC64_TOC16_HI
-@deffnx {} BFD_RELOC_PPC64_TOC16_HA
-@deffnx {} BFD_RELOC_PPC64_TOC
-@deffnx {} BFD_RELOC_PPC64_PLTGOT16
-@deffnx {} BFD_RELOC_PPC64_PLTGOT16_LO
-@deffnx {} BFD_RELOC_PPC64_PLTGOT16_HI
-@deffnx {} BFD_RELOC_PPC64_PLTGOT16_HA
-@deffnx {} BFD_RELOC_PPC64_ADDR16_DS
-@deffnx {} BFD_RELOC_PPC64_ADDR16_LO_DS
-@deffnx {} BFD_RELOC_PPC64_GOT16_DS
-@deffnx {} BFD_RELOC_PPC64_GOT16_LO_DS
-@deffnx {} BFD_RELOC_PPC64_PLT16_LO_DS
-@deffnx {} BFD_RELOC_PPC64_SECTOFF_DS
-@deffnx {} BFD_RELOC_PPC64_SECTOFF_LO_DS
-@deffnx {} BFD_RELOC_PPC64_TOC16_DS
-@deffnx {} BFD_RELOC_PPC64_TOC16_LO_DS
-@deffnx {} BFD_RELOC_PPC64_PLTGOT16_DS
-@deffnx {} BFD_RELOC_PPC64_PLTGOT16_LO_DS
-@deffnx {} BFD_RELOC_PPC64_ADDR16_HIGH
-@deffnx {} BFD_RELOC_PPC64_ADDR16_HIGHA
-Power(rs6000) and PowerPC relocations.
-@end deffn
-@deffn {} BFD_RELOC_PPC_TLS
-@deffnx {} BFD_RELOC_PPC_TLSGD
-@deffnx {} BFD_RELOC_PPC_TLSLD
-@deffnx {} BFD_RELOC_PPC_DTPMOD
-@deffnx {} BFD_RELOC_PPC_TPREL16
-@deffnx {} BFD_RELOC_PPC_TPREL16_LO
-@deffnx {} BFD_RELOC_PPC_TPREL16_HI
-@deffnx {} BFD_RELOC_PPC_TPREL16_HA
-@deffnx {} BFD_RELOC_PPC_TPREL
-@deffnx {} BFD_RELOC_PPC_DTPREL16
-@deffnx {} BFD_RELOC_PPC_DTPREL16_LO
-@deffnx {} BFD_RELOC_PPC_DTPREL16_HI
-@deffnx {} BFD_RELOC_PPC_DTPREL16_HA
-@deffnx {} BFD_RELOC_PPC_DTPREL
-@deffnx {} BFD_RELOC_PPC_GOT_TLSGD16
-@deffnx {} BFD_RELOC_PPC_GOT_TLSGD16_LO
-@deffnx {} BFD_RELOC_PPC_GOT_TLSGD16_HI
-@deffnx {} BFD_RELOC_PPC_GOT_TLSGD16_HA
-@deffnx {} BFD_RELOC_PPC_GOT_TLSLD16
-@deffnx {} BFD_RELOC_PPC_GOT_TLSLD16_LO
-@deffnx {} BFD_RELOC_PPC_GOT_TLSLD16_HI
-@deffnx {} BFD_RELOC_PPC_GOT_TLSLD16_HA
-@deffnx {} BFD_RELOC_PPC_GOT_TPREL16
-@deffnx {} BFD_RELOC_PPC_GOT_TPREL16_LO
-@deffnx {} BFD_RELOC_PPC_GOT_TPREL16_HI
-@deffnx {} BFD_RELOC_PPC_GOT_TPREL16_HA
-@deffnx {} BFD_RELOC_PPC_GOT_DTPREL16
-@deffnx {} BFD_RELOC_PPC_GOT_DTPREL16_LO
-@deffnx {} BFD_RELOC_PPC_GOT_DTPREL16_HI
-@deffnx {} BFD_RELOC_PPC_GOT_DTPREL16_HA
-@deffnx {} BFD_RELOC_PPC64_TPREL16_DS
-@deffnx {} BFD_RELOC_PPC64_TPREL16_LO_DS
-@deffnx {} BFD_RELOC_PPC64_TPREL16_HIGHER
-@deffnx {} BFD_RELOC_PPC64_TPREL16_HIGHERA
-@deffnx {} BFD_RELOC_PPC64_TPREL16_HIGHEST
-@deffnx {} BFD_RELOC_PPC64_TPREL16_HIGHESTA
-@deffnx {} BFD_RELOC_PPC64_DTPREL16_DS
-@deffnx {} BFD_RELOC_PPC64_DTPREL16_LO_DS
-@deffnx {} BFD_RELOC_PPC64_DTPREL16_HIGHER
-@deffnx {} BFD_RELOC_PPC64_DTPREL16_HIGHERA
-@deffnx {} BFD_RELOC_PPC64_DTPREL16_HIGHEST
-@deffnx {} BFD_RELOC_PPC64_DTPREL16_HIGHESTA
-@deffnx {} BFD_RELOC_PPC64_TPREL16_HIGH
-@deffnx {} BFD_RELOC_PPC64_TPREL16_HIGHA
-@deffnx {} BFD_RELOC_PPC64_DTPREL16_HIGH
-@deffnx {} BFD_RELOC_PPC64_DTPREL16_HIGHA
-PowerPC and PowerPC64 thread-local storage relocations.
-@end deffn
-@deffn {} BFD_RELOC_I370_D12
-IBM 370/390 relocations
-@end deffn
-@deffn {} BFD_RELOC_CTOR
-The type of reloc used to build a constructor table - at the moment
-probably a 32 bit wide absolute relocation, but the target can choose.
-It generally does map to one of the other relocation types.
-@end deffn
-@deffn {} BFD_RELOC_ARM_PCREL_BRANCH
-ARM 26 bit pc-relative branch. The lowest two bits must be zero and are
-not stored in the instruction.
-@end deffn
-@deffn {} BFD_RELOC_ARM_PCREL_BLX
-ARM 26 bit pc-relative branch. The lowest bit must be zero and is
-not stored in the instruction. The 2nd lowest bit comes from a 1 bit
-field in the instruction.
-@end deffn
-@deffn {} BFD_RELOC_THUMB_PCREL_BLX
-Thumb 22 bit pc-relative branch. The lowest bit must be zero and is
-not stored in the instruction. The 2nd lowest bit comes from a 1 bit
-field in the instruction.
-@end deffn
-@deffn {} BFD_RELOC_ARM_PCREL_CALL
-ARM 26-bit pc-relative branch for an unconditional BL or BLX instruction.
-@end deffn
-@deffn {} BFD_RELOC_ARM_PCREL_JUMP
-ARM 26-bit pc-relative branch for B or conditional BL instruction.
-@end deffn
-@deffn {} BFD_RELOC_THUMB_PCREL_BRANCH7
-@deffnx {} BFD_RELOC_THUMB_PCREL_BRANCH9
-@deffnx {} BFD_RELOC_THUMB_PCREL_BRANCH12
-@deffnx {} BFD_RELOC_THUMB_PCREL_BRANCH20
-@deffnx {} BFD_RELOC_THUMB_PCREL_BRANCH23
-@deffnx {} BFD_RELOC_THUMB_PCREL_BRANCH25
-Thumb 7-, 9-, 12-, 20-, 23-, and 25-bit pc-relative branches.
-The lowest bit must be zero and is not stored in the instruction.
-Note that the corresponding ELF R_ARM_THM_JUMPnn constant has an
-"nn" one smaller in all cases. Note further that BRANCH23
-corresponds to R_ARM_THM_CALL.
-@end deffn
-@deffn {} BFD_RELOC_ARM_OFFSET_IMM
-12-bit immediate offset, used in ARM-format ldr and str instructions.
-@end deffn
-@deffn {} BFD_RELOC_ARM_THUMB_OFFSET
-5-bit immediate offset, used in Thumb-format ldr and str instructions.
-@end deffn
-@deffn {} BFD_RELOC_ARM_TARGET1
-Pc-relative or absolute relocation depending on target. Used for
-entries in .init_array sections.
-@end deffn
-@deffn {} BFD_RELOC_ARM_ROSEGREL32
-Read-only segment base relative address.
-@end deffn
-@deffn {} BFD_RELOC_ARM_SBREL32
-Data segment base relative address.
-@end deffn
-@deffn {} BFD_RELOC_ARM_TARGET2
-This reloc is used for references to RTTI data from exception handling
-tables. The actual definition depends on the target. It may be a
-pc-relative or some form of GOT-indirect relocation.
-@end deffn
-@deffn {} BFD_RELOC_ARM_PREL31
-31-bit PC relative address.
-@end deffn
-@deffn {} BFD_RELOC_ARM_MOVW
-@deffnx {} BFD_RELOC_ARM_MOVT
-@deffnx {} BFD_RELOC_ARM_MOVW_PCREL
-@deffnx {} BFD_RELOC_ARM_MOVT_PCREL
-@deffnx {} BFD_RELOC_ARM_THUMB_MOVW
-@deffnx {} BFD_RELOC_ARM_THUMB_MOVT
-@deffnx {} BFD_RELOC_ARM_THUMB_MOVW_PCREL
-@deffnx {} BFD_RELOC_ARM_THUMB_MOVT_PCREL
-Low and High halfword relocations for MOVW and MOVT instructions.
-@end deffn
-@deffn {} BFD_RELOC_ARM_JUMP_SLOT
-@deffnx {} BFD_RELOC_ARM_GLOB_DAT
-@deffnx {} BFD_RELOC_ARM_GOT32
-@deffnx {} BFD_RELOC_ARM_PLT32
-@deffnx {} BFD_RELOC_ARM_RELATIVE
-@deffnx {} BFD_RELOC_ARM_GOTOFF
-@deffnx {} BFD_RELOC_ARM_GOTPC
-@deffnx {} BFD_RELOC_ARM_GOT_PREL
-Relocations for setting up GOTs and PLTs for shared libraries.
-@end deffn
-@deffn {} BFD_RELOC_ARM_TLS_GD32
-@deffnx {} BFD_RELOC_ARM_TLS_LDO32
-@deffnx {} BFD_RELOC_ARM_TLS_LDM32
-@deffnx {} BFD_RELOC_ARM_TLS_DTPOFF32
-@deffnx {} BFD_RELOC_ARM_TLS_DTPMOD32
-@deffnx {} BFD_RELOC_ARM_TLS_TPOFF32
-@deffnx {} BFD_RELOC_ARM_TLS_IE32
-@deffnx {} BFD_RELOC_ARM_TLS_LE32
-@deffnx {} BFD_RELOC_ARM_TLS_GOTDESC
-@deffnx {} BFD_RELOC_ARM_TLS_CALL
-@deffnx {} BFD_RELOC_ARM_THM_TLS_CALL
-@deffnx {} BFD_RELOC_ARM_TLS_DESCSEQ
-@deffnx {} BFD_RELOC_ARM_THM_TLS_DESCSEQ
-@deffnx {} BFD_RELOC_ARM_TLS_DESC
-ARM thread-local storage relocations.
-@end deffn
-@deffn {} BFD_RELOC_ARM_ALU_PC_G0_NC
-@deffnx {} BFD_RELOC_ARM_ALU_PC_G0
-@deffnx {} BFD_RELOC_ARM_ALU_PC_G1_NC
-@deffnx {} BFD_RELOC_ARM_ALU_PC_G1
-@deffnx {} BFD_RELOC_ARM_ALU_PC_G2
-@deffnx {} BFD_RELOC_ARM_LDR_PC_G0
-@deffnx {} BFD_RELOC_ARM_LDR_PC_G1
-@deffnx {} BFD_RELOC_ARM_LDR_PC_G2
-@deffnx {} BFD_RELOC_ARM_LDRS_PC_G0
-@deffnx {} BFD_RELOC_ARM_LDRS_PC_G1
-@deffnx {} BFD_RELOC_ARM_LDRS_PC_G2
-@deffnx {} BFD_RELOC_ARM_LDC_PC_G0
-@deffnx {} BFD_RELOC_ARM_LDC_PC_G1
-@deffnx {} BFD_RELOC_ARM_LDC_PC_G2
-@deffnx {} BFD_RELOC_ARM_ALU_SB_G0_NC
-@deffnx {} BFD_RELOC_ARM_ALU_SB_G0
-@deffnx {} BFD_RELOC_ARM_ALU_SB_G1_NC
-@deffnx {} BFD_RELOC_ARM_ALU_SB_G1
-@deffnx {} BFD_RELOC_ARM_ALU_SB_G2
-@deffnx {} BFD_RELOC_ARM_LDR_SB_G0
-@deffnx {} BFD_RELOC_ARM_LDR_SB_G1
-@deffnx {} BFD_RELOC_ARM_LDR_SB_G2
-@deffnx {} BFD_RELOC_ARM_LDRS_SB_G0
-@deffnx {} BFD_RELOC_ARM_LDRS_SB_G1
-@deffnx {} BFD_RELOC_ARM_LDRS_SB_G2
-@deffnx {} BFD_RELOC_ARM_LDC_SB_G0
-@deffnx {} BFD_RELOC_ARM_LDC_SB_G1
-@deffnx {} BFD_RELOC_ARM_LDC_SB_G2
-ARM group relocations.
-@end deffn
-@deffn {} BFD_RELOC_ARM_V4BX
-Annotation of BX instructions.
-@end deffn
-@deffn {} BFD_RELOC_ARM_IRELATIVE
-ARM support for STT_GNU_IFUNC.
-@end deffn
-@deffn {} BFD_RELOC_ARM_IMMEDIATE
-@deffnx {} BFD_RELOC_ARM_ADRL_IMMEDIATE
-@deffnx {} BFD_RELOC_ARM_T32_IMMEDIATE
-@deffnx {} BFD_RELOC_ARM_T32_ADD_IMM
-@deffnx {} BFD_RELOC_ARM_T32_IMM12
-@deffnx {} BFD_RELOC_ARM_T32_ADD_PC12
-@deffnx {} BFD_RELOC_ARM_SHIFT_IMM
-@deffnx {} BFD_RELOC_ARM_SMC
-@deffnx {} BFD_RELOC_ARM_HVC
-@deffnx {} BFD_RELOC_ARM_SWI
-@deffnx {} BFD_RELOC_ARM_MULTI
-@deffnx {} BFD_RELOC_ARM_CP_OFF_IMM
-@deffnx {} BFD_RELOC_ARM_CP_OFF_IMM_S2
-@deffnx {} BFD_RELOC_ARM_T32_CP_OFF_IMM
-@deffnx {} BFD_RELOC_ARM_T32_CP_OFF_IMM_S2
-@deffnx {} BFD_RELOC_ARM_ADR_IMM
-@deffnx {} BFD_RELOC_ARM_LDR_IMM
-@deffnx {} BFD_RELOC_ARM_LITERAL
-@deffnx {} BFD_RELOC_ARM_IN_POOL
-@deffnx {} BFD_RELOC_ARM_OFFSET_IMM8
-@deffnx {} BFD_RELOC_ARM_T32_OFFSET_U8
-@deffnx {} BFD_RELOC_ARM_T32_OFFSET_IMM
-@deffnx {} BFD_RELOC_ARM_HWLITERAL
-@deffnx {} BFD_RELOC_ARM_THUMB_ADD
-@deffnx {} BFD_RELOC_ARM_THUMB_IMM
-@deffnx {} BFD_RELOC_ARM_THUMB_SHIFT
-These relocs are only used within the ARM assembler. They are not
-(at present) written to any object files.
-@end deffn
-@deffn {} BFD_RELOC_SH_PCDISP8BY2
-@deffnx {} BFD_RELOC_SH_PCDISP12BY2
-@deffnx {} BFD_RELOC_SH_IMM3
-@deffnx {} BFD_RELOC_SH_IMM3U
-@deffnx {} BFD_RELOC_SH_DISP12
-@deffnx {} BFD_RELOC_SH_DISP12BY2
-@deffnx {} BFD_RELOC_SH_DISP12BY4
-@deffnx {} BFD_RELOC_SH_DISP12BY8
-@deffnx {} BFD_RELOC_SH_DISP20
-@deffnx {} BFD_RELOC_SH_DISP20BY8
-@deffnx {} BFD_RELOC_SH_IMM4
-@deffnx {} BFD_RELOC_SH_IMM4BY2
-@deffnx {} BFD_RELOC_SH_IMM4BY4
-@deffnx {} BFD_RELOC_SH_IMM8
-@deffnx {} BFD_RELOC_SH_IMM8BY2
-@deffnx {} BFD_RELOC_SH_IMM8BY4
-@deffnx {} BFD_RELOC_SH_PCRELIMM8BY2
-@deffnx {} BFD_RELOC_SH_PCRELIMM8BY4
-@deffnx {} BFD_RELOC_SH_SWITCH16
-@deffnx {} BFD_RELOC_SH_SWITCH32
-@deffnx {} BFD_RELOC_SH_USES
-@deffnx {} BFD_RELOC_SH_COUNT
-@deffnx {} BFD_RELOC_SH_ALIGN
-@deffnx {} BFD_RELOC_SH_CODE
-@deffnx {} BFD_RELOC_SH_DATA
-@deffnx {} BFD_RELOC_SH_LABEL
-@deffnx {} BFD_RELOC_SH_LOOP_START
-@deffnx {} BFD_RELOC_SH_LOOP_END
-@deffnx {} BFD_RELOC_SH_COPY
-@deffnx {} BFD_RELOC_SH_GLOB_DAT
-@deffnx {} BFD_RELOC_SH_JMP_SLOT
-@deffnx {} BFD_RELOC_SH_RELATIVE
-@deffnx {} BFD_RELOC_SH_GOTPC
-@deffnx {} BFD_RELOC_SH_GOT_LOW16
-@deffnx {} BFD_RELOC_SH_GOT_MEDLOW16
-@deffnx {} BFD_RELOC_SH_GOT_MEDHI16
-@deffnx {} BFD_RELOC_SH_GOT_HI16
-@deffnx {} BFD_RELOC_SH_GOTPLT_LOW16
-@deffnx {} BFD_RELOC_SH_GOTPLT_MEDLOW16
-@deffnx {} BFD_RELOC_SH_GOTPLT_MEDHI16
-@deffnx {} BFD_RELOC_SH_GOTPLT_HI16
-@deffnx {} BFD_RELOC_SH_PLT_LOW16
-@deffnx {} BFD_RELOC_SH_PLT_MEDLOW16
-@deffnx {} BFD_RELOC_SH_PLT_MEDHI16
-@deffnx {} BFD_RELOC_SH_PLT_HI16
-@deffnx {} BFD_RELOC_SH_GOTOFF_LOW16
-@deffnx {} BFD_RELOC_SH_GOTOFF_MEDLOW16
-@deffnx {} BFD_RELOC_SH_GOTOFF_MEDHI16
-@deffnx {} BFD_RELOC_SH_GOTOFF_HI16
-@deffnx {} BFD_RELOC_SH_GOTPC_LOW16
-@deffnx {} BFD_RELOC_SH_GOTPC_MEDLOW16
-@deffnx {} BFD_RELOC_SH_GOTPC_MEDHI16
-@deffnx {} BFD_RELOC_SH_GOTPC_HI16
-@deffnx {} BFD_RELOC_SH_COPY64
-@deffnx {} BFD_RELOC_SH_GLOB_DAT64
-@deffnx {} BFD_RELOC_SH_JMP_SLOT64
-@deffnx {} BFD_RELOC_SH_RELATIVE64
-@deffnx {} BFD_RELOC_SH_GOT10BY4
-@deffnx {} BFD_RELOC_SH_GOT10BY8
-@deffnx {} BFD_RELOC_SH_GOTPLT10BY4
-@deffnx {} BFD_RELOC_SH_GOTPLT10BY8
-@deffnx {} BFD_RELOC_SH_GOTPLT32
-@deffnx {} BFD_RELOC_SH_SHMEDIA_CODE
-@deffnx {} BFD_RELOC_SH_IMMU5
-@deffnx {} BFD_RELOC_SH_IMMS6
-@deffnx {} BFD_RELOC_SH_IMMS6BY32
-@deffnx {} BFD_RELOC_SH_IMMU6
-@deffnx {} BFD_RELOC_SH_IMMS10
-@deffnx {} BFD_RELOC_SH_IMMS10BY2
-@deffnx {} BFD_RELOC_SH_IMMS10BY4
-@deffnx {} BFD_RELOC_SH_IMMS10BY8
-@deffnx {} BFD_RELOC_SH_IMMS16
-@deffnx {} BFD_RELOC_SH_IMMU16
-@deffnx {} BFD_RELOC_SH_IMM_LOW16
-@deffnx {} BFD_RELOC_SH_IMM_LOW16_PCREL
-@deffnx {} BFD_RELOC_SH_IMM_MEDLOW16
-@deffnx {} BFD_RELOC_SH_IMM_MEDLOW16_PCREL
-@deffnx {} BFD_RELOC_SH_IMM_MEDHI16
-@deffnx {} BFD_RELOC_SH_IMM_MEDHI16_PCREL
-@deffnx {} BFD_RELOC_SH_IMM_HI16
-@deffnx {} BFD_RELOC_SH_IMM_HI16_PCREL
-@deffnx {} BFD_RELOC_SH_PT_16
-@deffnx {} BFD_RELOC_SH_TLS_GD_32
-@deffnx {} BFD_RELOC_SH_TLS_LD_32
-@deffnx {} BFD_RELOC_SH_TLS_LDO_32
-@deffnx {} BFD_RELOC_SH_TLS_IE_32
-@deffnx {} BFD_RELOC_SH_TLS_LE_32
-@deffnx {} BFD_RELOC_SH_TLS_DTPMOD32
-@deffnx {} BFD_RELOC_SH_TLS_DTPOFF32
-@deffnx {} BFD_RELOC_SH_TLS_TPOFF32
-@deffnx {} BFD_RELOC_SH_GOT20
-@deffnx {} BFD_RELOC_SH_GOTOFF20
-@deffnx {} BFD_RELOC_SH_GOTFUNCDESC
-@deffnx {} BFD_RELOC_SH_GOTFUNCDESC20
-@deffnx {} BFD_RELOC_SH_GOTOFFFUNCDESC
-@deffnx {} BFD_RELOC_SH_GOTOFFFUNCDESC20
-@deffnx {} BFD_RELOC_SH_FUNCDESC
-Renesas / SuperH SH relocs. Not all of these appear in object files.
-@end deffn
-@deffn {} BFD_RELOC_ARC_B22_PCREL
-ARC Cores relocs.
-ARC 22 bit pc-relative branch. The lowest two bits must be zero and are
-not stored in the instruction. The high 20 bits are installed in bits 26
-through 7 of the instruction.
-@end deffn
-@deffn {} BFD_RELOC_ARC_B26
-ARC 26 bit absolute branch. The lowest two bits must be zero and are not
-stored in the instruction. The high 24 bits are installed in bits 23
-through 0.
-@end deffn
-@deffn {} BFD_RELOC_BFIN_16_IMM
-ADI Blackfin 16 bit immediate absolute reloc.
-@end deffn
-@deffn {} BFD_RELOC_BFIN_16_HIGH
-ADI Blackfin 16 bit immediate absolute reloc higher 16 bits.
-@end deffn
-@deffn {} BFD_RELOC_BFIN_4_PCREL
-ADI Blackfin 'a' part of LSETUP.
-@end deffn
-@deffn {} BFD_RELOC_BFIN_5_PCREL
-ADI Blackfin.
-@end deffn
-@deffn {} BFD_RELOC_BFIN_16_LOW
-ADI Blackfin 16 bit immediate absolute reloc lower 16 bits.
-@end deffn
-@deffn {} BFD_RELOC_BFIN_10_PCREL
-ADI Blackfin.
-@end deffn
-@deffn {} BFD_RELOC_BFIN_11_PCREL
-ADI Blackfin 'b' part of LSETUP.
-@end deffn
-@deffn {} BFD_RELOC_BFIN_12_PCREL_JUMP
-ADI Blackfin.
-@end deffn
-@deffn {} BFD_RELOC_BFIN_12_PCREL_JUMP_S
-ADI Blackfin Short jump, pcrel.
-@end deffn
-@deffn {} BFD_RELOC_BFIN_24_PCREL_CALL_X
-ADI Blackfin Call.x not implemented.
-@end deffn
-@deffn {} BFD_RELOC_BFIN_24_PCREL_JUMP_L
-ADI Blackfin Long Jump pcrel.
-@end deffn
-@deffn {} BFD_RELOC_BFIN_GOT17M4
-@deffnx {} BFD_RELOC_BFIN_GOTHI
-@deffnx {} BFD_RELOC_BFIN_GOTLO
-@deffnx {} BFD_RELOC_BFIN_FUNCDESC
-@deffnx {} BFD_RELOC_BFIN_FUNCDESC_GOT17M4
-@deffnx {} BFD_RELOC_BFIN_FUNCDESC_GOTHI
-@deffnx {} BFD_RELOC_BFIN_FUNCDESC_GOTLO
-@deffnx {} BFD_RELOC_BFIN_FUNCDESC_VALUE
-@deffnx {} BFD_RELOC_BFIN_FUNCDESC_GOTOFF17M4
-@deffnx {} BFD_RELOC_BFIN_FUNCDESC_GOTOFFHI
-@deffnx {} BFD_RELOC_BFIN_FUNCDESC_GOTOFFLO
-@deffnx {} BFD_RELOC_BFIN_GOTOFF17M4
-@deffnx {} BFD_RELOC_BFIN_GOTOFFHI
-@deffnx {} BFD_RELOC_BFIN_GOTOFFLO
-ADI Blackfin FD-PIC relocations.
-@end deffn
-@deffn {} BFD_RELOC_BFIN_GOT
-ADI Blackfin GOT relocation.
-@end deffn
-@deffn {} BFD_RELOC_BFIN_PLTPC
-ADI Blackfin PLTPC relocation.
-@end deffn
-@deffn {} BFD_ARELOC_BFIN_PUSH
-ADI Blackfin arithmetic relocation.
-@end deffn
-@deffn {} BFD_ARELOC_BFIN_CONST
-ADI Blackfin arithmetic relocation.
-@end deffn
-@deffn {} BFD_ARELOC_BFIN_ADD
-ADI Blackfin arithmetic relocation.
-@end deffn
-@deffn {} BFD_ARELOC_BFIN_SUB
-ADI Blackfin arithmetic relocation.
-@end deffn
-@deffn {} BFD_ARELOC_BFIN_MULT
-ADI Blackfin arithmetic relocation.
-@end deffn
-@deffn {} BFD_ARELOC_BFIN_DIV
-ADI Blackfin arithmetic relocation.
-@end deffn
-@deffn {} BFD_ARELOC_BFIN_MOD
-ADI Blackfin arithmetic relocation.
-@end deffn
-@deffn {} BFD_ARELOC_BFIN_LSHIFT
-ADI Blackfin arithmetic relocation.
-@end deffn
-@deffn {} BFD_ARELOC_BFIN_RSHIFT
-ADI Blackfin arithmetic relocation.
-@end deffn
-@deffn {} BFD_ARELOC_BFIN_AND
-ADI Blackfin arithmetic relocation.
-@end deffn
-@deffn {} BFD_ARELOC_BFIN_OR
-ADI Blackfin arithmetic relocation.
-@end deffn
-@deffn {} BFD_ARELOC_BFIN_XOR
-ADI Blackfin arithmetic relocation.
-@end deffn
-@deffn {} BFD_ARELOC_BFIN_LAND
-ADI Blackfin arithmetic relocation.
-@end deffn
-@deffn {} BFD_ARELOC_BFIN_LOR
-ADI Blackfin arithmetic relocation.
-@end deffn
-@deffn {} BFD_ARELOC_BFIN_LEN
-ADI Blackfin arithmetic relocation.
-@end deffn
-@deffn {} BFD_ARELOC_BFIN_NEG
-ADI Blackfin arithmetic relocation.
-@end deffn
-@deffn {} BFD_ARELOC_BFIN_COMP
-ADI Blackfin arithmetic relocation.
-@end deffn
-@deffn {} BFD_ARELOC_BFIN_PAGE
-ADI Blackfin arithmetic relocation.
-@end deffn
-@deffn {} BFD_ARELOC_BFIN_HWPAGE
-ADI Blackfin arithmetic relocation.
-@end deffn
-@deffn {} BFD_ARELOC_BFIN_ADDR
-ADI Blackfin arithmetic relocation.
-@end deffn
-@deffn {} BFD_RELOC_D10V_10_PCREL_R
-Mitsubishi D10V relocs.
-This is a 10-bit reloc with the right 2 bits
-assumed to be 0.
-@end deffn
-@deffn {} BFD_RELOC_D10V_10_PCREL_L
-Mitsubishi D10V relocs.
-This is a 10-bit reloc with the right 2 bits
-assumed to be 0. This is the same as the previous reloc
-except it is in the left container, i.e.,
-shifted left 15 bits.
-@end deffn
-@deffn {} BFD_RELOC_D10V_18
-This is an 18-bit reloc with the right 2 bits
-assumed to be 0.
-@end deffn
-@deffn {} BFD_RELOC_D10V_18_PCREL
-This is an 18-bit reloc with the right 2 bits
-assumed to be 0.
-@end deffn
-@deffn {} BFD_RELOC_D30V_6
-Mitsubishi D30V relocs.
-This is a 6-bit absolute reloc.
-@end deffn
-@deffn {} BFD_RELOC_D30V_9_PCREL
-This is a 6-bit pc-relative reloc with
-the right 3 bits assumed to be 0.
-@end deffn
-@deffn {} BFD_RELOC_D30V_9_PCREL_R
-This is a 6-bit pc-relative reloc with
-the right 3 bits assumed to be 0. Same
-as the previous reloc but on the right side
-of the container.
-@end deffn
-@deffn {} BFD_RELOC_D30V_15
-This is a 12-bit absolute reloc with the
-right 3 bitsassumed to be 0.
-@end deffn
-@deffn {} BFD_RELOC_D30V_15_PCREL
-This is a 12-bit pc-relative reloc with
-the right 3 bits assumed to be 0.
-@end deffn
-@deffn {} BFD_RELOC_D30V_15_PCREL_R
-This is a 12-bit pc-relative reloc with
-the right 3 bits assumed to be 0. Same
-as the previous reloc but on the right side
-of the container.
-@end deffn
-@deffn {} BFD_RELOC_D30V_21
-This is an 18-bit absolute reloc with
-the right 3 bits assumed to be 0.
-@end deffn
-@deffn {} BFD_RELOC_D30V_21_PCREL
-This is an 18-bit pc-relative reloc with
-the right 3 bits assumed to be 0.
-@end deffn
-@deffn {} BFD_RELOC_D30V_21_PCREL_R
-This is an 18-bit pc-relative reloc with
-the right 3 bits assumed to be 0. Same
-as the previous reloc but on the right side
-of the container.
-@end deffn
-@deffn {} BFD_RELOC_D30V_32
-This is a 32-bit absolute reloc.
-@end deffn
-@deffn {} BFD_RELOC_D30V_32_PCREL
-This is a 32-bit pc-relative reloc.
-@end deffn
-@deffn {} BFD_RELOC_DLX_HI16_S
-DLX relocs
-@end deffn
-@deffn {} BFD_RELOC_DLX_LO16
-DLX relocs
-@end deffn
-@deffn {} BFD_RELOC_DLX_JMP26
-DLX relocs
-@end deffn
-@deffn {} BFD_RELOC_M32C_HI8
-@deffnx {} BFD_RELOC_M32C_RL_JUMP
-@deffnx {} BFD_RELOC_M32C_RL_1ADDR
-@deffnx {} BFD_RELOC_M32C_RL_2ADDR
-Renesas M16C/M32C Relocations.
-@end deffn
-@deffn {} BFD_RELOC_M32R_24
-Renesas M32R (formerly Mitsubishi M32R) relocs.
-This is a 24 bit absolute address.
-@end deffn
-@deffn {} BFD_RELOC_M32R_10_PCREL
-This is a 10-bit pc-relative reloc with the right 2 bits assumed to be 0.
-@end deffn
-@deffn {} BFD_RELOC_M32R_18_PCREL
-This is an 18-bit reloc with the right 2 bits assumed to be 0.
-@end deffn
-@deffn {} BFD_RELOC_M32R_26_PCREL
-This is a 26-bit reloc with the right 2 bits assumed to be 0.
-@end deffn
-@deffn {} BFD_RELOC_M32R_HI16_ULO
-This is a 16-bit reloc containing the high 16 bits of an address
-used when the lower 16 bits are treated as unsigned.
-@end deffn
-@deffn {} BFD_RELOC_M32R_HI16_SLO
-This is a 16-bit reloc containing the high 16 bits of an address
-used when the lower 16 bits are treated as signed.
-@end deffn
-@deffn {} BFD_RELOC_M32R_LO16
-This is a 16-bit reloc containing the lower 16 bits of an address.
-@end deffn
-@deffn {} BFD_RELOC_M32R_SDA16
-This is a 16-bit reloc containing the small data area offset for use in
-add3, load, and store instructions.
-@end deffn
-@deffn {} BFD_RELOC_M32R_GOT24
-@deffnx {} BFD_RELOC_M32R_26_PLTREL
-@deffnx {} BFD_RELOC_M32R_COPY
-@deffnx {} BFD_RELOC_M32R_GLOB_DAT
-@deffnx {} BFD_RELOC_M32R_JMP_SLOT
-@deffnx {} BFD_RELOC_M32R_RELATIVE
-@deffnx {} BFD_RELOC_M32R_GOTOFF
-@deffnx {} BFD_RELOC_M32R_GOTOFF_HI_ULO
-@deffnx {} BFD_RELOC_M32R_GOTOFF_HI_SLO
-@deffnx {} BFD_RELOC_M32R_GOTOFF_LO
-@deffnx {} BFD_RELOC_M32R_GOTPC24
-@deffnx {} BFD_RELOC_M32R_GOT16_HI_ULO
-@deffnx {} BFD_RELOC_M32R_GOT16_HI_SLO
-@deffnx {} BFD_RELOC_M32R_GOT16_LO
-@deffnx {} BFD_RELOC_M32R_GOTPC_HI_ULO
-@deffnx {} BFD_RELOC_M32R_GOTPC_HI_SLO
-@deffnx {} BFD_RELOC_M32R_GOTPC_LO
-For PIC.
-@end deffn
-@deffn {} BFD_RELOC_V850_9_PCREL
-This is a 9-bit reloc
-@end deffn
-@deffn {} BFD_RELOC_V850_22_PCREL
-This is a 22-bit reloc
-@end deffn
-@deffn {} BFD_RELOC_V850_SDA_16_16_OFFSET
-This is a 16 bit offset from the short data area pointer.
-@end deffn
-@deffn {} BFD_RELOC_V850_SDA_15_16_OFFSET
-This is a 16 bit offset (of which only 15 bits are used) from the
-short data area pointer.
-@end deffn
-@deffn {} BFD_RELOC_V850_ZDA_16_16_OFFSET
-This is a 16 bit offset from the zero data area pointer.
-@end deffn
-@deffn {} BFD_RELOC_V850_ZDA_15_16_OFFSET
-This is a 16 bit offset (of which only 15 bits are used) from the
-zero data area pointer.
-@end deffn
-@deffn {} BFD_RELOC_V850_TDA_6_8_OFFSET
-This is an 8 bit offset (of which only 6 bits are used) from the
-tiny data area pointer.
-@end deffn
-@deffn {} BFD_RELOC_V850_TDA_7_8_OFFSET
-This is an 8bit offset (of which only 7 bits are used) from the tiny
-data area pointer.
-@end deffn
-@deffn {} BFD_RELOC_V850_TDA_7_7_OFFSET
-This is a 7 bit offset from the tiny data area pointer.
-@end deffn
-@deffn {} BFD_RELOC_V850_TDA_16_16_OFFSET
-This is a 16 bit offset from the tiny data area pointer.
-@end deffn
-@deffn {} BFD_RELOC_V850_TDA_4_5_OFFSET
-This is a 5 bit offset (of which only 4 bits are used) from the tiny
-data area pointer.
-@end deffn
-@deffn {} BFD_RELOC_V850_TDA_4_4_OFFSET
-This is a 4 bit offset from the tiny data area pointer.
-@end deffn
-@deffn {} BFD_RELOC_V850_SDA_16_16_SPLIT_OFFSET
-This is a 16 bit offset from the short data area pointer, with the
-bits placed non-contiguously in the instruction.
-@end deffn
-@deffn {} BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET
-This is a 16 bit offset from the zero data area pointer, with the
-bits placed non-contiguously in the instruction.
-@end deffn
-@deffn {} BFD_RELOC_V850_CALLT_6_7_OFFSET
-This is a 6 bit offset from the call table base pointer.
-@end deffn
-@deffn {} BFD_RELOC_V850_CALLT_16_16_OFFSET
-This is a 16 bit offset from the call table base pointer.
-@end deffn
-@deffn {} BFD_RELOC_V850_LONGCALL
-Used for relaxing indirect function calls.
-@end deffn
-@deffn {} BFD_RELOC_V850_LONGJUMP
-Used for relaxing indirect jumps.
-@end deffn
-@deffn {} BFD_RELOC_V850_ALIGN
-Used to maintain alignment whilst relaxing.
-@end deffn
-@deffn {} BFD_RELOC_V850_LO16_SPLIT_OFFSET
-This is a variation of BFD_RELOC_LO16 that can be used in v850e ld.bu
-instructions.
-@end deffn
-@deffn {} BFD_RELOC_V850_16_PCREL
-This is a 16-bit reloc.
-@end deffn
-@deffn {} BFD_RELOC_V850_17_PCREL
-This is a 17-bit reloc.
-@end deffn
-@deffn {} BFD_RELOC_V850_23
-This is a 23-bit reloc.
-@end deffn
-@deffn {} BFD_RELOC_V850_32_PCREL
-This is a 32-bit reloc.
-@end deffn
-@deffn {} BFD_RELOC_V850_32_ABS
-This is a 32-bit reloc.
-@end deffn
-@deffn {} BFD_RELOC_V850_16_SPLIT_OFFSET
-This is a 16-bit reloc.
-@end deffn
-@deffn {} BFD_RELOC_V850_16_S1
-This is a 16-bit reloc.
-@end deffn
-@deffn {} BFD_RELOC_V850_LO16_S1
-Low 16 bits. 16 bit shifted by 1.
-@end deffn
-@deffn {} BFD_RELOC_V850_CALLT_15_16_OFFSET
-This is a 16 bit offset from the call table base pointer.
-@end deffn
-@deffn {} BFD_RELOC_V850_32_GOTPCREL
-DSO relocations.
-@end deffn
-@deffn {} BFD_RELOC_V850_16_GOT
-DSO relocations.
-@end deffn
-@deffn {} BFD_RELOC_V850_32_GOT
-DSO relocations.
-@end deffn
-@deffn {} BFD_RELOC_V850_22_PLT_PCREL
-DSO relocations.
-@end deffn
-@deffn {} BFD_RELOC_V850_32_PLT_PCREL
-DSO relocations.
-@end deffn
-@deffn {} BFD_RELOC_V850_COPY
-DSO relocations.
-@end deffn
-@deffn {} BFD_RELOC_V850_GLOB_DAT
-DSO relocations.
-@end deffn
-@deffn {} BFD_RELOC_V850_JMP_SLOT
-DSO relocations.
-@end deffn
-@deffn {} BFD_RELOC_V850_RELATIVE
-DSO relocations.
-@end deffn
-@deffn {} BFD_RELOC_V850_16_GOTOFF
-DSO relocations.
-@end deffn
-@deffn {} BFD_RELOC_V850_32_GOTOFF
-DSO relocations.
-@end deffn
-@deffn {} BFD_RELOC_V850_CODE
-start code.
-@end deffn
-@deffn {} BFD_RELOC_V850_DATA
-start data in text.
-@end deffn
-@deffn {} BFD_RELOC_TIC30_LDP
-This is a 8bit DP reloc for the tms320c30, where the most
-significant 8 bits of a 24 bit word are placed into the least
-significant 8 bits of the opcode.
-@end deffn
-@deffn {} BFD_RELOC_TIC54X_PARTLS7
-This is a 7bit reloc for the tms320c54x, where the least
-significant 7 bits of a 16 bit word are placed into the least
-significant 7 bits of the opcode.
-@end deffn
-@deffn {} BFD_RELOC_TIC54X_PARTMS9
-This is a 9bit DP reloc for the tms320c54x, where the most
-significant 9 bits of a 16 bit word are placed into the least
-significant 9 bits of the opcode.
-@end deffn
-@deffn {} BFD_RELOC_TIC54X_23
-This is an extended address 23-bit reloc for the tms320c54x.
-@end deffn
-@deffn {} BFD_RELOC_TIC54X_16_OF_23
-This is a 16-bit reloc for the tms320c54x, where the least
-significant 16 bits of a 23-bit extended address are placed into
-the opcode.
-@end deffn
-@deffn {} BFD_RELOC_TIC54X_MS7_OF_23
-This is a reloc for the tms320c54x, where the most
-significant 7 bits of a 23-bit extended address are placed into
-the opcode.
-@end deffn
-@deffn {} BFD_RELOC_C6000_PCR_S21
-@deffnx {} BFD_RELOC_C6000_PCR_S12
-@deffnx {} BFD_RELOC_C6000_PCR_S10
-@deffnx {} BFD_RELOC_C6000_PCR_S7
-@deffnx {} BFD_RELOC_C6000_ABS_S16
-@deffnx {} BFD_RELOC_C6000_ABS_L16
-@deffnx {} BFD_RELOC_C6000_ABS_H16
-@deffnx {} BFD_RELOC_C6000_SBR_U15_B
-@deffnx {} BFD_RELOC_C6000_SBR_U15_H
-@deffnx {} BFD_RELOC_C6000_SBR_U15_W
-@deffnx {} BFD_RELOC_C6000_SBR_S16
-@deffnx {} BFD_RELOC_C6000_SBR_L16_B
-@deffnx {} BFD_RELOC_C6000_SBR_L16_H
-@deffnx {} BFD_RELOC_C6000_SBR_L16_W
-@deffnx {} BFD_RELOC_C6000_SBR_H16_B
-@deffnx {} BFD_RELOC_C6000_SBR_H16_H
-@deffnx {} BFD_RELOC_C6000_SBR_H16_W
-@deffnx {} BFD_RELOC_C6000_SBR_GOT_U15_W
-@deffnx {} BFD_RELOC_C6000_SBR_GOT_L16_W
-@deffnx {} BFD_RELOC_C6000_SBR_GOT_H16_W
-@deffnx {} BFD_RELOC_C6000_DSBT_INDEX
-@deffnx {} BFD_RELOC_C6000_PREL31
-@deffnx {} BFD_RELOC_C6000_COPY
-@deffnx {} BFD_RELOC_C6000_JUMP_SLOT
-@deffnx {} BFD_RELOC_C6000_EHTYPE
-@deffnx {} BFD_RELOC_C6000_PCR_H16
-@deffnx {} BFD_RELOC_C6000_PCR_L16
-@deffnx {} BFD_RELOC_C6000_ALIGN
-@deffnx {} BFD_RELOC_C6000_FPHEAD
-@deffnx {} BFD_RELOC_C6000_NOCMP
-TMS320C6000 relocations.
-@end deffn
-@deffn {} BFD_RELOC_FR30_48
-This is a 48 bit reloc for the FR30 that stores 32 bits.
-@end deffn
-@deffn {} BFD_RELOC_FR30_20
-This is a 32 bit reloc for the FR30 that stores 20 bits split up into
-two sections.
-@end deffn
-@deffn {} BFD_RELOC_FR30_6_IN_4
-This is a 16 bit reloc for the FR30 that stores a 6 bit word offset in
-4 bits.
-@end deffn
-@deffn {} BFD_RELOC_FR30_8_IN_8
-This is a 16 bit reloc for the FR30 that stores an 8 bit byte offset
-into 8 bits.
-@end deffn
-@deffn {} BFD_RELOC_FR30_9_IN_8
-This is a 16 bit reloc for the FR30 that stores a 9 bit short offset
-into 8 bits.
-@end deffn
-@deffn {} BFD_RELOC_FR30_10_IN_8
-This is a 16 bit reloc for the FR30 that stores a 10 bit word offset
-into 8 bits.
-@end deffn
-@deffn {} BFD_RELOC_FR30_9_PCREL
-This is a 16 bit reloc for the FR30 that stores a 9 bit pc relative
-short offset into 8 bits.
-@end deffn
-@deffn {} BFD_RELOC_FR30_12_PCREL
-This is a 16 bit reloc for the FR30 that stores a 12 bit pc relative
-short offset into 11 bits.
-@end deffn
-@deffn {} BFD_RELOC_MCORE_PCREL_IMM8BY4
-@deffnx {} BFD_RELOC_MCORE_PCREL_IMM11BY2
-@deffnx {} BFD_RELOC_MCORE_PCREL_IMM4BY2
-@deffnx {} BFD_RELOC_MCORE_PCREL_32
-@deffnx {} BFD_RELOC_MCORE_PCREL_JSR_IMM11BY2
-@deffnx {} BFD_RELOC_MCORE_RVA
-Motorola Mcore relocations.
-@end deffn
-@deffn {} BFD_RELOC_MEP_8
-@deffnx {} BFD_RELOC_MEP_16
-@deffnx {} BFD_RELOC_MEP_32
-@deffnx {} BFD_RELOC_MEP_PCREL8A2
-@deffnx {} BFD_RELOC_MEP_PCREL12A2
-@deffnx {} BFD_RELOC_MEP_PCREL17A2
-@deffnx {} BFD_RELOC_MEP_PCREL24A2
-@deffnx {} BFD_RELOC_MEP_PCABS24A2
-@deffnx {} BFD_RELOC_MEP_LOW16
-@deffnx {} BFD_RELOC_MEP_HI16U
-@deffnx {} BFD_RELOC_MEP_HI16S
-@deffnx {} BFD_RELOC_MEP_GPREL
-@deffnx {} BFD_RELOC_MEP_TPREL
-@deffnx {} BFD_RELOC_MEP_TPREL7
-@deffnx {} BFD_RELOC_MEP_TPREL7A2
-@deffnx {} BFD_RELOC_MEP_TPREL7A4
-@deffnx {} BFD_RELOC_MEP_UIMM24
-@deffnx {} BFD_RELOC_MEP_ADDR24A4
-@deffnx {} BFD_RELOC_MEP_GNU_VTINHERIT
-@deffnx {} BFD_RELOC_MEP_GNU_VTENTRY
-Toshiba Media Processor Relocations.
-@end deffn
-@deffn {} BFD_RELOC_METAG_HIADDR16
-@deffnx {} BFD_RELOC_METAG_LOADDR16
-@deffnx {} BFD_RELOC_METAG_RELBRANCH
-@deffnx {} BFD_RELOC_METAG_GETSETOFF
-@deffnx {} BFD_RELOC_METAG_HIOG
-@deffnx {} BFD_RELOC_METAG_LOOG
-@deffnx {} BFD_RELOC_METAG_REL8
-@deffnx {} BFD_RELOC_METAG_REL16
-@deffnx {} BFD_RELOC_METAG_HI16_GOTOFF
-@deffnx {} BFD_RELOC_METAG_LO16_GOTOFF
-@deffnx {} BFD_RELOC_METAG_GETSET_GOTOFF
-@deffnx {} BFD_RELOC_METAG_GETSET_GOT
-@deffnx {} BFD_RELOC_METAG_HI16_GOTPC
-@deffnx {} BFD_RELOC_METAG_LO16_GOTPC
-@deffnx {} BFD_RELOC_METAG_HI16_PLT
-@deffnx {} BFD_RELOC_METAG_LO16_PLT
-@deffnx {} BFD_RELOC_METAG_RELBRANCH_PLT
-@deffnx {} BFD_RELOC_METAG_GOTOFF
-@deffnx {} BFD_RELOC_METAG_PLT
-@deffnx {} BFD_RELOC_METAG_COPY
-@deffnx {} BFD_RELOC_METAG_JMP_SLOT
-@deffnx {} BFD_RELOC_METAG_RELATIVE
-@deffnx {} BFD_RELOC_METAG_GLOB_DAT
-@deffnx {} BFD_RELOC_METAG_TLS_GD
-@deffnx {} BFD_RELOC_METAG_TLS_LDM
-@deffnx {} BFD_RELOC_METAG_TLS_LDO_HI16
-@deffnx {} BFD_RELOC_METAG_TLS_LDO_LO16
-@deffnx {} BFD_RELOC_METAG_TLS_LDO
-@deffnx {} BFD_RELOC_METAG_TLS_IE
-@deffnx {} BFD_RELOC_METAG_TLS_IENONPIC
-@deffnx {} BFD_RELOC_METAG_TLS_IENONPIC_HI16
-@deffnx {} BFD_RELOC_METAG_TLS_IENONPIC_LO16
-@deffnx {} BFD_RELOC_METAG_TLS_TPOFF
-@deffnx {} BFD_RELOC_METAG_TLS_DTPMOD
-@deffnx {} BFD_RELOC_METAG_TLS_DTPOFF
-@deffnx {} BFD_RELOC_METAG_TLS_LE
-@deffnx {} BFD_RELOC_METAG_TLS_LE_HI16
-@deffnx {} BFD_RELOC_METAG_TLS_LE_LO16
-Imagination Technologies Meta relocations.
-@end deffn
-@deffn {} BFD_RELOC_MMIX_GETA
-@deffnx {} BFD_RELOC_MMIX_GETA_1
-@deffnx {} BFD_RELOC_MMIX_GETA_2
-@deffnx {} BFD_RELOC_MMIX_GETA_3
-These are relocations for the GETA instruction.
-@end deffn
-@deffn {} BFD_RELOC_MMIX_CBRANCH
-@deffnx {} BFD_RELOC_MMIX_CBRANCH_J
-@deffnx {} BFD_RELOC_MMIX_CBRANCH_1
-@deffnx {} BFD_RELOC_MMIX_CBRANCH_2
-@deffnx {} BFD_RELOC_MMIX_CBRANCH_3
-These are relocations for a conditional branch instruction.
-@end deffn
-@deffn {} BFD_RELOC_MMIX_PUSHJ
-@deffnx {} BFD_RELOC_MMIX_PUSHJ_1
-@deffnx {} BFD_RELOC_MMIX_PUSHJ_2
-@deffnx {} BFD_RELOC_MMIX_PUSHJ_3
-@deffnx {} BFD_RELOC_MMIX_PUSHJ_STUBBABLE
-These are relocations for the PUSHJ instruction.
-@end deffn
-@deffn {} BFD_RELOC_MMIX_JMP
-@deffnx {} BFD_RELOC_MMIX_JMP_1
-@deffnx {} BFD_RELOC_MMIX_JMP_2
-@deffnx {} BFD_RELOC_MMIX_JMP_3
-These are relocations for the JMP instruction.
-@end deffn
-@deffn {} BFD_RELOC_MMIX_ADDR19
-This is a relocation for a relative address as in a GETA instruction or
-a branch.
-@end deffn
-@deffn {} BFD_RELOC_MMIX_ADDR27
-This is a relocation for a relative address as in a JMP instruction.
-@end deffn
-@deffn {} BFD_RELOC_MMIX_REG_OR_BYTE
-This is a relocation for an instruction field that may be a general
-register or a value 0..255.
-@end deffn
-@deffn {} BFD_RELOC_MMIX_REG
-This is a relocation for an instruction field that may be a general
-register.
-@end deffn
-@deffn {} BFD_RELOC_MMIX_BASE_PLUS_OFFSET
-This is a relocation for two instruction fields holding a register and
-an offset, the equivalent of the relocation.
-@end deffn
-@deffn {} BFD_RELOC_MMIX_LOCAL
-This relocation is an assertion that the expression is not allocated as
-a global register. It does not modify contents.
-@end deffn
-@deffn {} BFD_RELOC_AVR_7_PCREL
-This is a 16 bit reloc for the AVR that stores 8 bit pc relative
-short offset into 7 bits.
-@end deffn
-@deffn {} BFD_RELOC_AVR_13_PCREL
-This is a 16 bit reloc for the AVR that stores 13 bit pc relative
-short offset into 12 bits.
-@end deffn
-@deffn {} BFD_RELOC_AVR_16_PM
-This is a 16 bit reloc for the AVR that stores 17 bit value (usually
-program memory address) into 16 bits.
-@end deffn
-@deffn {} BFD_RELOC_AVR_LO8_LDI
-This is a 16 bit reloc for the AVR that stores 8 bit value (usually
-data memory address) into 8 bit immediate value of LDI insn.
-@end deffn
-@deffn {} BFD_RELOC_AVR_HI8_LDI
-This is a 16 bit reloc for the AVR that stores 8 bit value (high 8 bit
-of data memory address) into 8 bit immediate value of LDI insn.
-@end deffn
-@deffn {} BFD_RELOC_AVR_HH8_LDI
-This is a 16 bit reloc for the AVR that stores 8 bit value (most high 8 bit
-of program memory address) into 8 bit immediate value of LDI insn.
-@end deffn
-@deffn {} BFD_RELOC_AVR_MS8_LDI
-This is a 16 bit reloc for the AVR that stores 8 bit value (most high 8 bit
-of 32 bit value) into 8 bit immediate value of LDI insn.
-@end deffn
-@deffn {} BFD_RELOC_AVR_LO8_LDI_NEG
-This is a 16 bit reloc for the AVR that stores negated 8 bit value
-(usually data memory address) into 8 bit immediate value of SUBI insn.
-@end deffn
-@deffn {} BFD_RELOC_AVR_HI8_LDI_NEG
-This is a 16 bit reloc for the AVR that stores negated 8 bit value
-(high 8 bit of data memory address) into 8 bit immediate value of
-SUBI insn.
-@end deffn
-@deffn {} BFD_RELOC_AVR_HH8_LDI_NEG
-This is a 16 bit reloc for the AVR that stores negated 8 bit value
-(most high 8 bit of program memory address) into 8 bit immediate value
-of LDI or SUBI insn.
-@end deffn
-@deffn {} BFD_RELOC_AVR_MS8_LDI_NEG
-This is a 16 bit reloc for the AVR that stores negated 8 bit value (msb
-of 32 bit value) into 8 bit immediate value of LDI insn.
-@end deffn
-@deffn {} BFD_RELOC_AVR_LO8_LDI_PM
-This is a 16 bit reloc for the AVR that stores 8 bit value (usually
-command address) into 8 bit immediate value of LDI insn.
-@end deffn
-@deffn {} BFD_RELOC_AVR_LO8_LDI_GS
-This is a 16 bit reloc for the AVR that stores 8 bit value
-(command address) into 8 bit immediate value of LDI insn. If the address
-is beyond the 128k boundary, the linker inserts a jump stub for this reloc
-in the lower 128k.
-@end deffn
-@deffn {} BFD_RELOC_AVR_HI8_LDI_PM
-This is a 16 bit reloc for the AVR that stores 8 bit value (high 8 bit
-of command address) into 8 bit immediate value of LDI insn.
-@end deffn
-@deffn {} BFD_RELOC_AVR_HI8_LDI_GS
-This is a 16 bit reloc for the AVR that stores 8 bit value (high 8 bit
-of command address) into 8 bit immediate value of LDI insn. If the address
-is beyond the 128k boundary, the linker inserts a jump stub for this reloc
-below 128k.
-@end deffn
-@deffn {} BFD_RELOC_AVR_HH8_LDI_PM
-This is a 16 bit reloc for the AVR that stores 8 bit value (most high 8 bit
-of command address) into 8 bit immediate value of LDI insn.
-@end deffn
-@deffn {} BFD_RELOC_AVR_LO8_LDI_PM_NEG
-This is a 16 bit reloc for the AVR that stores negated 8 bit value
-(usually command address) into 8 bit immediate value of SUBI insn.
-@end deffn
-@deffn {} BFD_RELOC_AVR_HI8_LDI_PM_NEG
-This is a 16 bit reloc for the AVR that stores negated 8 bit value
-(high 8 bit of 16 bit command address) into 8 bit immediate value
-of SUBI insn.
-@end deffn
-@deffn {} BFD_RELOC_AVR_HH8_LDI_PM_NEG
-This is a 16 bit reloc for the AVR that stores negated 8 bit value
-(high 6 bit of 22 bit command address) into 8 bit immediate
-value of SUBI insn.
-@end deffn
-@deffn {} BFD_RELOC_AVR_CALL
-This is a 32 bit reloc for the AVR that stores 23 bit value
-into 22 bits.
-@end deffn
-@deffn {} BFD_RELOC_AVR_LDI
-This is a 16 bit reloc for the AVR that stores all needed bits
-for absolute addressing with ldi with overflow check to linktime
-@end deffn
-@deffn {} BFD_RELOC_AVR_6
-This is a 6 bit reloc for the AVR that stores offset for ldd/std
-instructions
-@end deffn
-@deffn {} BFD_RELOC_AVR_6_ADIW
-This is a 6 bit reloc for the AVR that stores offset for adiw/sbiw
-instructions
-@end deffn
-@deffn {} BFD_RELOC_AVR_8_LO
-This is a 8 bit reloc for the AVR that stores bits 0..7 of a symbol
-in .byte lo8(symbol)
-@end deffn
-@deffn {} BFD_RELOC_AVR_8_HI
-This is a 8 bit reloc for the AVR that stores bits 8..15 of a symbol
-in .byte hi8(symbol)
-@end deffn
-@deffn {} BFD_RELOC_AVR_8_HLO
-This is a 8 bit reloc for the AVR that stores bits 16..23 of a symbol
-in .byte hlo8(symbol)
-@end deffn
-@deffn {} BFD_RELOC_RL78_NEG8
-@deffnx {} BFD_RELOC_RL78_NEG16
-@deffnx {} BFD_RELOC_RL78_NEG24
-@deffnx {} BFD_RELOC_RL78_NEG32
-@deffnx {} BFD_RELOC_RL78_16_OP
-@deffnx {} BFD_RELOC_RL78_24_OP
-@deffnx {} BFD_RELOC_RL78_32_OP
-@deffnx {} BFD_RELOC_RL78_8U
-@deffnx {} BFD_RELOC_RL78_16U
-@deffnx {} BFD_RELOC_RL78_24U
-@deffnx {} BFD_RELOC_RL78_DIR3U_PCREL
-@deffnx {} BFD_RELOC_RL78_DIFF
-@deffnx {} BFD_RELOC_RL78_GPRELB
-@deffnx {} BFD_RELOC_RL78_GPRELW
-@deffnx {} BFD_RELOC_RL78_GPRELL
-@deffnx {} BFD_RELOC_RL78_SYM
-@deffnx {} BFD_RELOC_RL78_OP_SUBTRACT
-@deffnx {} BFD_RELOC_RL78_OP_NEG
-@deffnx {} BFD_RELOC_RL78_OP_AND
-@deffnx {} BFD_RELOC_RL78_OP_SHRA
-@deffnx {} BFD_RELOC_RL78_ABS8
-@deffnx {} BFD_RELOC_RL78_ABS16
-@deffnx {} BFD_RELOC_RL78_ABS16_REV
-@deffnx {} BFD_RELOC_RL78_ABS32
-@deffnx {} BFD_RELOC_RL78_ABS32_REV
-@deffnx {} BFD_RELOC_RL78_ABS16U
-@deffnx {} BFD_RELOC_RL78_ABS16UW
-@deffnx {} BFD_RELOC_RL78_ABS16UL
-@deffnx {} BFD_RELOC_RL78_RELAX
-@deffnx {} BFD_RELOC_RL78_HI16
-@deffnx {} BFD_RELOC_RL78_HI8
-@deffnx {} BFD_RELOC_RL78_LO16
-@deffnx {} BFD_RELOC_RL78_CODE
-Renesas RL78 Relocations.
-@end deffn
-@deffn {} BFD_RELOC_RX_NEG8
-@deffnx {} BFD_RELOC_RX_NEG16
-@deffnx {} BFD_RELOC_RX_NEG24
-@deffnx {} BFD_RELOC_RX_NEG32
-@deffnx {} BFD_RELOC_RX_16_OP
-@deffnx {} BFD_RELOC_RX_24_OP
-@deffnx {} BFD_RELOC_RX_32_OP
-@deffnx {} BFD_RELOC_RX_8U
-@deffnx {} BFD_RELOC_RX_16U
-@deffnx {} BFD_RELOC_RX_24U
-@deffnx {} BFD_RELOC_RX_DIR3U_PCREL
-@deffnx {} BFD_RELOC_RX_DIFF
-@deffnx {} BFD_RELOC_RX_GPRELB
-@deffnx {} BFD_RELOC_RX_GPRELW
-@deffnx {} BFD_RELOC_RX_GPRELL
-@deffnx {} BFD_RELOC_RX_SYM
-@deffnx {} BFD_RELOC_RX_OP_SUBTRACT
-@deffnx {} BFD_RELOC_RX_OP_NEG
-@deffnx {} BFD_RELOC_RX_ABS8
-@deffnx {} BFD_RELOC_RX_ABS16
-@deffnx {} BFD_RELOC_RX_ABS16_REV
-@deffnx {} BFD_RELOC_RX_ABS32
-@deffnx {} BFD_RELOC_RX_ABS32_REV
-@deffnx {} BFD_RELOC_RX_ABS16U
-@deffnx {} BFD_RELOC_RX_ABS16UW
-@deffnx {} BFD_RELOC_RX_ABS16UL
-@deffnx {} BFD_RELOC_RX_RELAX
-Renesas RX Relocations.
-@end deffn
-@deffn {} BFD_RELOC_390_12
-Direct 12 bit.
-@end deffn
-@deffn {} BFD_RELOC_390_GOT12
-12 bit GOT offset.
-@end deffn
-@deffn {} BFD_RELOC_390_PLT32
-32 bit PC relative PLT address.
-@end deffn
-@deffn {} BFD_RELOC_390_COPY
-Copy symbol at runtime.
-@end deffn
-@deffn {} BFD_RELOC_390_GLOB_DAT
-Create GOT entry.
-@end deffn
-@deffn {} BFD_RELOC_390_JMP_SLOT
-Create PLT entry.
-@end deffn
-@deffn {} BFD_RELOC_390_RELATIVE
-Adjust by program base.
-@end deffn
-@deffn {} BFD_RELOC_390_GOTPC
-32 bit PC relative offset to GOT.
-@end deffn
-@deffn {} BFD_RELOC_390_GOT16
-16 bit GOT offset.
-@end deffn
-@deffn {} BFD_RELOC_390_PC12DBL
-PC relative 12 bit shifted by 1.
-@end deffn
-@deffn {} BFD_RELOC_390_PLT12DBL
-12 bit PC rel. PLT shifted by 1.
-@end deffn
-@deffn {} BFD_RELOC_390_PC16DBL
-PC relative 16 bit shifted by 1.
-@end deffn
-@deffn {} BFD_RELOC_390_PLT16DBL
-16 bit PC rel. PLT shifted by 1.
-@end deffn
-@deffn {} BFD_RELOC_390_PC24DBL
-PC relative 24 bit shifted by 1.
-@end deffn
-@deffn {} BFD_RELOC_390_PLT24DBL
-24 bit PC rel. PLT shifted by 1.
-@end deffn
-@deffn {} BFD_RELOC_390_PC32DBL
-PC relative 32 bit shifted by 1.
-@end deffn
-@deffn {} BFD_RELOC_390_PLT32DBL
-32 bit PC rel. PLT shifted by 1.
-@end deffn
-@deffn {} BFD_RELOC_390_GOTPCDBL
-32 bit PC rel. GOT shifted by 1.
-@end deffn
-@deffn {} BFD_RELOC_390_GOT64
-64 bit GOT offset.
-@end deffn
-@deffn {} BFD_RELOC_390_PLT64
-64 bit PC relative PLT address.
-@end deffn
-@deffn {} BFD_RELOC_390_GOTENT
-32 bit rel. offset to GOT entry.
-@end deffn
-@deffn {} BFD_RELOC_390_GOTOFF64
-64 bit offset to GOT.
-@end deffn
-@deffn {} BFD_RELOC_390_GOTPLT12
-12-bit offset to symbol-entry within GOT, with PLT handling.
-@end deffn
-@deffn {} BFD_RELOC_390_GOTPLT16
-16-bit offset to symbol-entry within GOT, with PLT handling.
-@end deffn
-@deffn {} BFD_RELOC_390_GOTPLT32
-32-bit offset to symbol-entry within GOT, with PLT handling.
-@end deffn
-@deffn {} BFD_RELOC_390_GOTPLT64
-64-bit offset to symbol-entry within GOT, with PLT handling.
-@end deffn
-@deffn {} BFD_RELOC_390_GOTPLTENT
-32-bit rel. offset to symbol-entry within GOT, with PLT handling.
-@end deffn
-@deffn {} BFD_RELOC_390_PLTOFF16
-16-bit rel. offset from the GOT to a PLT entry.
-@end deffn
-@deffn {} BFD_RELOC_390_PLTOFF32
-32-bit rel. offset from the GOT to a PLT entry.
-@end deffn
-@deffn {} BFD_RELOC_390_PLTOFF64
-64-bit rel. offset from the GOT to a PLT entry.
-@end deffn
-@deffn {} BFD_RELOC_390_TLS_LOAD
-@deffnx {} BFD_RELOC_390_TLS_GDCALL
-@deffnx {} BFD_RELOC_390_TLS_LDCALL
-@deffnx {} BFD_RELOC_390_TLS_GD32
-@deffnx {} BFD_RELOC_390_TLS_GD64
-@deffnx {} BFD_RELOC_390_TLS_GOTIE12
-@deffnx {} BFD_RELOC_390_TLS_GOTIE32
-@deffnx {} BFD_RELOC_390_TLS_GOTIE64
-@deffnx {} BFD_RELOC_390_TLS_LDM32
-@deffnx {} BFD_RELOC_390_TLS_LDM64
-@deffnx {} BFD_RELOC_390_TLS_IE32
-@deffnx {} BFD_RELOC_390_TLS_IE64
-@deffnx {} BFD_RELOC_390_TLS_IEENT
-@deffnx {} BFD_RELOC_390_TLS_LE32
-@deffnx {} BFD_RELOC_390_TLS_LE64
-@deffnx {} BFD_RELOC_390_TLS_LDO32
-@deffnx {} BFD_RELOC_390_TLS_LDO64
-@deffnx {} BFD_RELOC_390_TLS_DTPMOD
-@deffnx {} BFD_RELOC_390_TLS_DTPOFF
-@deffnx {} BFD_RELOC_390_TLS_TPOFF
-s390 tls relocations.
-@end deffn
-@deffn {} BFD_RELOC_390_20
-@deffnx {} BFD_RELOC_390_GOT20
-@deffnx {} BFD_RELOC_390_GOTPLT20
-@deffnx {} BFD_RELOC_390_TLS_GOTIE20
-Long displacement extension.
-@end deffn
-@deffn {} BFD_RELOC_390_IRELATIVE
-STT_GNU_IFUNC relocation.
-@end deffn
-@deffn {} BFD_RELOC_SCORE_GPREL15
-Score relocations
-Low 16 bit for load/store
-@end deffn
-@deffn {} BFD_RELOC_SCORE_DUMMY2
-@deffnx {} BFD_RELOC_SCORE_JMP
-This is a 24-bit reloc with the right 1 bit assumed to be 0
-@end deffn
-@deffn {} BFD_RELOC_SCORE_BRANCH
-This is a 19-bit reloc with the right 1 bit assumed to be 0
-@end deffn
-@deffn {} BFD_RELOC_SCORE_IMM30
-This is a 32-bit reloc for 48-bit instructions.
-@end deffn
-@deffn {} BFD_RELOC_SCORE_IMM32
-This is a 32-bit reloc for 48-bit instructions.
-@end deffn
-@deffn {} BFD_RELOC_SCORE16_JMP
-This is a 11-bit reloc with the right 1 bit assumed to be 0
-@end deffn
-@deffn {} BFD_RELOC_SCORE16_BRANCH
-This is a 8-bit reloc with the right 1 bit assumed to be 0
-@end deffn
-@deffn {} BFD_RELOC_SCORE_BCMP
-This is a 9-bit reloc with the right 1 bit assumed to be 0
-@end deffn
-@deffn {} BFD_RELOC_SCORE_GOT15
-@deffnx {} BFD_RELOC_SCORE_GOT_LO16
-@deffnx {} BFD_RELOC_SCORE_CALL15
-@deffnx {} BFD_RELOC_SCORE_DUMMY_HI16
-Undocumented Score relocs
-@end deffn
-@deffn {} BFD_RELOC_IP2K_FR9
-Scenix IP2K - 9-bit register number / data address
-@end deffn
-@deffn {} BFD_RELOC_IP2K_BANK
-Scenix IP2K - 4-bit register/data bank number
-@end deffn
-@deffn {} BFD_RELOC_IP2K_ADDR16CJP
-Scenix IP2K - low 13 bits of instruction word address
-@end deffn
-@deffn {} BFD_RELOC_IP2K_PAGE3
-Scenix IP2K - high 3 bits of instruction word address
-@end deffn
-@deffn {} BFD_RELOC_IP2K_LO8DATA
-@deffnx {} BFD_RELOC_IP2K_HI8DATA
-@deffnx {} BFD_RELOC_IP2K_EX8DATA
-Scenix IP2K - ext/low/high 8 bits of data address
-@end deffn
-@deffn {} BFD_RELOC_IP2K_LO8INSN
-@deffnx {} BFD_RELOC_IP2K_HI8INSN
-Scenix IP2K - low/high 8 bits of instruction word address
-@end deffn
-@deffn {} BFD_RELOC_IP2K_PC_SKIP
-Scenix IP2K - even/odd PC modifier to modify snb pcl.0
-@end deffn
-@deffn {} BFD_RELOC_IP2K_TEXT
-Scenix IP2K - 16 bit word address in text section.
-@end deffn
-@deffn {} BFD_RELOC_IP2K_FR_OFFSET
-Scenix IP2K - 7-bit sp or dp offset
-@end deffn
-@deffn {} BFD_RELOC_VPE4KMATH_DATA
-@deffnx {} BFD_RELOC_VPE4KMATH_INSN
-Scenix VPE4K coprocessor - data/insn-space addressing
-@end deffn
-@deffn {} BFD_RELOC_VTABLE_INHERIT
-@deffnx {} BFD_RELOC_VTABLE_ENTRY
-These two relocations are used by the linker to determine which of
-the entries in a C++ virtual function table are actually used. When
-the --gc-sections option is given, the linker will zero out the entries
-that are not used, so that the code for those functions need not be
-included in the output.
-
-VTABLE_INHERIT is a zero-space relocation used to describe to the
-linker the inheritance tree of a C++ virtual function table. The
-relocation's symbol should be the parent class' vtable, and the
-relocation should be located at the child vtable.
-
-VTABLE_ENTRY is a zero-space relocation that describes the use of a
-virtual function table entry. The reloc's symbol should refer to the
-table of the class mentioned in the code. Off of that base, an offset
-describes the entry that is being used. For Rela hosts, this offset
-is stored in the reloc's addend. For Rel hosts, we are forced to put
-this offset in the reloc's section offset.
-@end deffn
-@deffn {} BFD_RELOC_IA64_IMM14
-@deffnx {} BFD_RELOC_IA64_IMM22
-@deffnx {} BFD_RELOC_IA64_IMM64
-@deffnx {} BFD_RELOC_IA64_DIR32MSB
-@deffnx {} BFD_RELOC_IA64_DIR32LSB
-@deffnx {} BFD_RELOC_IA64_DIR64MSB
-@deffnx {} BFD_RELOC_IA64_DIR64LSB
-@deffnx {} BFD_RELOC_IA64_GPREL22
-@deffnx {} BFD_RELOC_IA64_GPREL64I
-@deffnx {} BFD_RELOC_IA64_GPREL32MSB
-@deffnx {} BFD_RELOC_IA64_GPREL32LSB
-@deffnx {} BFD_RELOC_IA64_GPREL64MSB
-@deffnx {} BFD_RELOC_IA64_GPREL64LSB
-@deffnx {} BFD_RELOC_IA64_LTOFF22
-@deffnx {} BFD_RELOC_IA64_LTOFF64I
-@deffnx {} BFD_RELOC_IA64_PLTOFF22
-@deffnx {} BFD_RELOC_IA64_PLTOFF64I
-@deffnx {} BFD_RELOC_IA64_PLTOFF64MSB
-@deffnx {} BFD_RELOC_IA64_PLTOFF64LSB
-@deffnx {} BFD_RELOC_IA64_FPTR64I
-@deffnx {} BFD_RELOC_IA64_FPTR32MSB
-@deffnx {} BFD_RELOC_IA64_FPTR32LSB
-@deffnx {} BFD_RELOC_IA64_FPTR64MSB
-@deffnx {} BFD_RELOC_IA64_FPTR64LSB
-@deffnx {} BFD_RELOC_IA64_PCREL21B
-@deffnx {} BFD_RELOC_IA64_PCREL21BI
-@deffnx {} BFD_RELOC_IA64_PCREL21M
-@deffnx {} BFD_RELOC_IA64_PCREL21F
-@deffnx {} BFD_RELOC_IA64_PCREL22
-@deffnx {} BFD_RELOC_IA64_PCREL60B
-@deffnx {} BFD_RELOC_IA64_PCREL64I
-@deffnx {} BFD_RELOC_IA64_PCREL32MSB
-@deffnx {} BFD_RELOC_IA64_PCREL32LSB
-@deffnx {} BFD_RELOC_IA64_PCREL64MSB
-@deffnx {} BFD_RELOC_IA64_PCREL64LSB
-@deffnx {} BFD_RELOC_IA64_LTOFF_FPTR22
-@deffnx {} BFD_RELOC_IA64_LTOFF_FPTR64I
-@deffnx {} BFD_RELOC_IA64_LTOFF_FPTR32MSB
-@deffnx {} BFD_RELOC_IA64_LTOFF_FPTR32LSB
-@deffnx {} BFD_RELOC_IA64_LTOFF_FPTR64MSB
-@deffnx {} BFD_RELOC_IA64_LTOFF_FPTR64LSB
-@deffnx {} BFD_RELOC_IA64_SEGREL32MSB
-@deffnx {} BFD_RELOC_IA64_SEGREL32LSB
-@deffnx {} BFD_RELOC_IA64_SEGREL64MSB
-@deffnx {} BFD_RELOC_IA64_SEGREL64LSB
-@deffnx {} BFD_RELOC_IA64_SECREL32MSB
-@deffnx {} BFD_RELOC_IA64_SECREL32LSB
-@deffnx {} BFD_RELOC_IA64_SECREL64MSB
-@deffnx {} BFD_RELOC_IA64_SECREL64LSB
-@deffnx {} BFD_RELOC_IA64_REL32MSB
-@deffnx {} BFD_RELOC_IA64_REL32LSB
-@deffnx {} BFD_RELOC_IA64_REL64MSB
-@deffnx {} BFD_RELOC_IA64_REL64LSB
-@deffnx {} BFD_RELOC_IA64_LTV32MSB
-@deffnx {} BFD_RELOC_IA64_LTV32LSB
-@deffnx {} BFD_RELOC_IA64_LTV64MSB
-@deffnx {} BFD_RELOC_IA64_LTV64LSB
-@deffnx {} BFD_RELOC_IA64_IPLTMSB
-@deffnx {} BFD_RELOC_IA64_IPLTLSB
-@deffnx {} BFD_RELOC_IA64_COPY
-@deffnx {} BFD_RELOC_IA64_LTOFF22X
-@deffnx {} BFD_RELOC_IA64_LDXMOV
-@deffnx {} BFD_RELOC_IA64_TPREL14
-@deffnx {} BFD_RELOC_IA64_TPREL22
-@deffnx {} BFD_RELOC_IA64_TPREL64I
-@deffnx {} BFD_RELOC_IA64_TPREL64MSB
-@deffnx {} BFD_RELOC_IA64_TPREL64LSB
-@deffnx {} BFD_RELOC_IA64_LTOFF_TPREL22
-@deffnx {} BFD_RELOC_IA64_DTPMOD64MSB
-@deffnx {} BFD_RELOC_IA64_DTPMOD64LSB
-@deffnx {} BFD_RELOC_IA64_LTOFF_DTPMOD22
-@deffnx {} BFD_RELOC_IA64_DTPREL14
-@deffnx {} BFD_RELOC_IA64_DTPREL22
-@deffnx {} BFD_RELOC_IA64_DTPREL64I
-@deffnx {} BFD_RELOC_IA64_DTPREL32MSB
-@deffnx {} BFD_RELOC_IA64_DTPREL32LSB
-@deffnx {} BFD_RELOC_IA64_DTPREL64MSB
-@deffnx {} BFD_RELOC_IA64_DTPREL64LSB
-@deffnx {} BFD_RELOC_IA64_LTOFF_DTPREL22
-Intel IA64 Relocations.
-@end deffn
-@deffn {} BFD_RELOC_M68HC11_HI8
-Motorola 68HC11 reloc.
-This is the 8 bit high part of an absolute address.
-@end deffn
-@deffn {} BFD_RELOC_M68HC11_LO8
-Motorola 68HC11 reloc.
-This is the 8 bit low part of an absolute address.
-@end deffn
-@deffn {} BFD_RELOC_M68HC11_3B
-Motorola 68HC11 reloc.
-This is the 3 bit of a value.
-@end deffn
-@deffn {} BFD_RELOC_M68HC11_RL_JUMP
-Motorola 68HC11 reloc.
-This reloc marks the beginning of a jump/call instruction.
-It is used for linker relaxation to correctly identify beginning
-of instruction and change some branches to use PC-relative
-addressing mode.
-@end deffn
-@deffn {} BFD_RELOC_M68HC11_RL_GROUP
-Motorola 68HC11 reloc.
-This reloc marks a group of several instructions that gcc generates
-and for which the linker relaxation pass can modify and/or remove
-some of them.
-@end deffn
-@deffn {} BFD_RELOC_M68HC11_LO16
-Motorola 68HC11 reloc.
-This is the 16-bit lower part of an address. It is used for 'call'
-instruction to specify the symbol address without any special
-transformation (due to memory bank window).
-@end deffn
-@deffn {} BFD_RELOC_M68HC11_PAGE
-Motorola 68HC11 reloc.
-This is a 8-bit reloc that specifies the page number of an address.
-It is used by 'call' instruction to specify the page number of
-the symbol.
-@end deffn
-@deffn {} BFD_RELOC_M68HC11_24
-Motorola 68HC11 reloc.
-This is a 24-bit reloc that represents the address with a 16-bit
-value and a 8-bit page number. The symbol address is transformed
-to follow the 16K memory bank of 68HC12 (seen as mapped in the window).
-@end deffn
-@deffn {} BFD_RELOC_M68HC12_5B
-Motorola 68HC12 reloc.
-This is the 5 bits of a value.
-@end deffn
-@deffn {} BFD_RELOC_XGATE_RL_JUMP
-Freescale XGATE reloc.
-This reloc marks the beginning of a bra/jal instruction.
-@end deffn
-@deffn {} BFD_RELOC_XGATE_RL_GROUP
-Freescale XGATE reloc.
-This reloc marks a group of several instructions that gcc generates
-and for which the linker relaxation pass can modify and/or remove
-some of them.
-@end deffn
-@deffn {} BFD_RELOC_XGATE_LO16
-Freescale XGATE reloc.
-This is the 16-bit lower part of an address. It is used for the '16-bit'
-instructions.
-@end deffn
-@deffn {} BFD_RELOC_XGATE_GPAGE
-Freescale XGATE reloc.
-@end deffn
-@deffn {} BFD_RELOC_XGATE_24
-Freescale XGATE reloc.
-@end deffn
-@deffn {} BFD_RELOC_XGATE_PCREL_9
-Freescale XGATE reloc.
-This is a 9-bit pc-relative reloc.
-@end deffn
-@deffn {} BFD_RELOC_XGATE_PCREL_10
-Freescale XGATE reloc.
-This is a 10-bit pc-relative reloc.
-@end deffn
-@deffn {} BFD_RELOC_XGATE_IMM8_LO
-Freescale XGATE reloc.
-This is the 16-bit lower part of an address. It is used for the '16-bit'
-instructions.
-@end deffn
-@deffn {} BFD_RELOC_XGATE_IMM8_HI
-Freescale XGATE reloc.
-This is the 16-bit higher part of an address. It is used for the '16-bit'
-instructions.
-@end deffn
-@deffn {} BFD_RELOC_XGATE_IMM3
-Freescale XGATE reloc.
-This is a 3-bit pc-relative reloc.
-@end deffn
-@deffn {} BFD_RELOC_XGATE_IMM4
-Freescale XGATE reloc.
-This is a 4-bit pc-relative reloc.
-@end deffn
-@deffn {} BFD_RELOC_XGATE_IMM5
-Freescale XGATE reloc.
-This is a 5-bit pc-relative reloc.
-@end deffn
-@deffn {} BFD_RELOC_M68HC12_9B
-Motorola 68HC12 reloc.
-This is the 9 bits of a value.
-@end deffn
-@deffn {} BFD_RELOC_M68HC12_16B
-Motorola 68HC12 reloc.
-This is the 16 bits of a value.
-@end deffn
-@deffn {} BFD_RELOC_M68HC12_9_PCREL
-Motorola 68HC12/XGATE reloc.
-This is a PCREL9 branch.
-@end deffn
-@deffn {} BFD_RELOC_M68HC12_10_PCREL
-Motorola 68HC12/XGATE reloc.
-This is a PCREL10 branch.
-@end deffn
-@deffn {} BFD_RELOC_M68HC12_LO8XG
-Motorola 68HC12/XGATE reloc.
-This is the 8 bit low part of an absolute address and immediately precedes
-a matching HI8XG part.
-@end deffn
-@deffn {} BFD_RELOC_M68HC12_HI8XG
-Motorola 68HC12/XGATE reloc.
-This is the 8 bit high part of an absolute address and immediately follows
-a matching LO8XG part.
-@end deffn
-@deffn {} BFD_RELOC_16C_NUM08
-@deffnx {} BFD_RELOC_16C_NUM08_C
-@deffnx {} BFD_RELOC_16C_NUM16
-@deffnx {} BFD_RELOC_16C_NUM16_C
-@deffnx {} BFD_RELOC_16C_NUM32
-@deffnx {} BFD_RELOC_16C_NUM32_C
-@deffnx {} BFD_RELOC_16C_DISP04
-@deffnx {} BFD_RELOC_16C_DISP04_C
-@deffnx {} BFD_RELOC_16C_DISP08
-@deffnx {} BFD_RELOC_16C_DISP08_C
-@deffnx {} BFD_RELOC_16C_DISP16
-@deffnx {} BFD_RELOC_16C_DISP16_C
-@deffnx {} BFD_RELOC_16C_DISP24
-@deffnx {} BFD_RELOC_16C_DISP24_C
-@deffnx {} BFD_RELOC_16C_DISP24a
-@deffnx {} BFD_RELOC_16C_DISP24a_C
-@deffnx {} BFD_RELOC_16C_REG04
-@deffnx {} BFD_RELOC_16C_REG04_C
-@deffnx {} BFD_RELOC_16C_REG04a
-@deffnx {} BFD_RELOC_16C_REG04a_C
-@deffnx {} BFD_RELOC_16C_REG14
-@deffnx {} BFD_RELOC_16C_REG14_C
-@deffnx {} BFD_RELOC_16C_REG16
-@deffnx {} BFD_RELOC_16C_REG16_C
-@deffnx {} BFD_RELOC_16C_REG20
-@deffnx {} BFD_RELOC_16C_REG20_C
-@deffnx {} BFD_RELOC_16C_ABS20
-@deffnx {} BFD_RELOC_16C_ABS20_C
-@deffnx {} BFD_RELOC_16C_ABS24
-@deffnx {} BFD_RELOC_16C_ABS24_C
-@deffnx {} BFD_RELOC_16C_IMM04
-@deffnx {} BFD_RELOC_16C_IMM04_C
-@deffnx {} BFD_RELOC_16C_IMM16
-@deffnx {} BFD_RELOC_16C_IMM16_C
-@deffnx {} BFD_RELOC_16C_IMM20
-@deffnx {} BFD_RELOC_16C_IMM20_C
-@deffnx {} BFD_RELOC_16C_IMM24
-@deffnx {} BFD_RELOC_16C_IMM24_C
-@deffnx {} BFD_RELOC_16C_IMM32
-@deffnx {} BFD_RELOC_16C_IMM32_C
-NS CR16C Relocations.
-@end deffn
-@deffn {} BFD_RELOC_CR16_NUM8
-@deffnx {} BFD_RELOC_CR16_NUM16
-@deffnx {} BFD_RELOC_CR16_NUM32
-@deffnx {} BFD_RELOC_CR16_NUM32a
-@deffnx {} BFD_RELOC_CR16_REGREL0
-@deffnx {} BFD_RELOC_CR16_REGREL4
-@deffnx {} BFD_RELOC_CR16_REGREL4a
-@deffnx {} BFD_RELOC_CR16_REGREL14
-@deffnx {} BFD_RELOC_CR16_REGREL14a
-@deffnx {} BFD_RELOC_CR16_REGREL16
-@deffnx {} BFD_RELOC_CR16_REGREL20
-@deffnx {} BFD_RELOC_CR16_REGREL20a
-@deffnx {} BFD_RELOC_CR16_ABS20
-@deffnx {} BFD_RELOC_CR16_ABS24
-@deffnx {} BFD_RELOC_CR16_IMM4
-@deffnx {} BFD_RELOC_CR16_IMM8
-@deffnx {} BFD_RELOC_CR16_IMM16
-@deffnx {} BFD_RELOC_CR16_IMM20
-@deffnx {} BFD_RELOC_CR16_IMM24
-@deffnx {} BFD_RELOC_CR16_IMM32
-@deffnx {} BFD_RELOC_CR16_IMM32a
-@deffnx {} BFD_RELOC_CR16_DISP4
-@deffnx {} BFD_RELOC_CR16_DISP8
-@deffnx {} BFD_RELOC_CR16_DISP16
-@deffnx {} BFD_RELOC_CR16_DISP20
-@deffnx {} BFD_RELOC_CR16_DISP24
-@deffnx {} BFD_RELOC_CR16_DISP24a
-@deffnx {} BFD_RELOC_CR16_SWITCH8
-@deffnx {} BFD_RELOC_CR16_SWITCH16
-@deffnx {} BFD_RELOC_CR16_SWITCH32
-@deffnx {} BFD_RELOC_CR16_GOT_REGREL20
-@deffnx {} BFD_RELOC_CR16_GOTC_REGREL20
-@deffnx {} BFD_RELOC_CR16_GLOB_DAT
-NS CR16 Relocations.
-@end deffn
-@deffn {} BFD_RELOC_CRX_REL4
-@deffnx {} BFD_RELOC_CRX_REL8
-@deffnx {} BFD_RELOC_CRX_REL8_CMP
-@deffnx {} BFD_RELOC_CRX_REL16
-@deffnx {} BFD_RELOC_CRX_REL24
-@deffnx {} BFD_RELOC_CRX_REL32
-@deffnx {} BFD_RELOC_CRX_REGREL12
-@deffnx {} BFD_RELOC_CRX_REGREL22
-@deffnx {} BFD_RELOC_CRX_REGREL28
-@deffnx {} BFD_RELOC_CRX_REGREL32
-@deffnx {} BFD_RELOC_CRX_ABS16
-@deffnx {} BFD_RELOC_CRX_ABS32
-@deffnx {} BFD_RELOC_CRX_NUM8
-@deffnx {} BFD_RELOC_CRX_NUM16
-@deffnx {} BFD_RELOC_CRX_NUM32
-@deffnx {} BFD_RELOC_CRX_IMM16
-@deffnx {} BFD_RELOC_CRX_IMM32
-@deffnx {} BFD_RELOC_CRX_SWITCH8
-@deffnx {} BFD_RELOC_CRX_SWITCH16
-@deffnx {} BFD_RELOC_CRX_SWITCH32
-NS CRX Relocations.
-@end deffn
-@deffn {} BFD_RELOC_CRIS_BDISP8
-@deffnx {} BFD_RELOC_CRIS_UNSIGNED_5
-@deffnx {} BFD_RELOC_CRIS_SIGNED_6
-@deffnx {} BFD_RELOC_CRIS_UNSIGNED_6
-@deffnx {} BFD_RELOC_CRIS_SIGNED_8
-@deffnx {} BFD_RELOC_CRIS_UNSIGNED_8
-@deffnx {} BFD_RELOC_CRIS_SIGNED_16
-@deffnx {} BFD_RELOC_CRIS_UNSIGNED_16
-@deffnx {} BFD_RELOC_CRIS_LAPCQ_OFFSET
-@deffnx {} BFD_RELOC_CRIS_UNSIGNED_4
-These relocs are only used within the CRIS assembler. They are not
-(at present) written to any object files.
-@end deffn
-@deffn {} BFD_RELOC_CRIS_COPY
-@deffnx {} BFD_RELOC_CRIS_GLOB_DAT
-@deffnx {} BFD_RELOC_CRIS_JUMP_SLOT
-@deffnx {} BFD_RELOC_CRIS_RELATIVE
-Relocs used in ELF shared libraries for CRIS.
-@end deffn
-@deffn {} BFD_RELOC_CRIS_32_GOT
-32-bit offset to symbol-entry within GOT.
-@end deffn
-@deffn {} BFD_RELOC_CRIS_16_GOT
-16-bit offset to symbol-entry within GOT.
-@end deffn
-@deffn {} BFD_RELOC_CRIS_32_GOTPLT
-32-bit offset to symbol-entry within GOT, with PLT handling.
-@end deffn
-@deffn {} BFD_RELOC_CRIS_16_GOTPLT
-16-bit offset to symbol-entry within GOT, with PLT handling.
-@end deffn
-@deffn {} BFD_RELOC_CRIS_32_GOTREL
-32-bit offset to symbol, relative to GOT.
-@end deffn
-@deffn {} BFD_RELOC_CRIS_32_PLT_GOTREL
-32-bit offset to symbol with PLT entry, relative to GOT.
-@end deffn
-@deffn {} BFD_RELOC_CRIS_32_PLT_PCREL
-32-bit offset to symbol with PLT entry, relative to this relocation.
-@end deffn
-@deffn {} BFD_RELOC_CRIS_32_GOT_GD
-@deffnx {} BFD_RELOC_CRIS_16_GOT_GD
-@deffnx {} BFD_RELOC_CRIS_32_GD
-@deffnx {} BFD_RELOC_CRIS_DTP
-@deffnx {} BFD_RELOC_CRIS_32_DTPREL
-@deffnx {} BFD_RELOC_CRIS_16_DTPREL
-@deffnx {} BFD_RELOC_CRIS_32_GOT_TPREL
-@deffnx {} BFD_RELOC_CRIS_16_GOT_TPREL
-@deffnx {} BFD_RELOC_CRIS_32_TPREL
-@deffnx {} BFD_RELOC_CRIS_16_TPREL
-@deffnx {} BFD_RELOC_CRIS_DTPMOD
-@deffnx {} BFD_RELOC_CRIS_32_IE
-Relocs used in TLS code for CRIS.
-@end deffn
-@deffn {} BFD_RELOC_860_COPY
-@deffnx {} BFD_RELOC_860_GLOB_DAT
-@deffnx {} BFD_RELOC_860_JUMP_SLOT
-@deffnx {} BFD_RELOC_860_RELATIVE
-@deffnx {} BFD_RELOC_860_PC26
-@deffnx {} BFD_RELOC_860_PLT26
-@deffnx {} BFD_RELOC_860_PC16
-@deffnx {} BFD_RELOC_860_LOW0
-@deffnx {} BFD_RELOC_860_SPLIT0
-@deffnx {} BFD_RELOC_860_LOW1
-@deffnx {} BFD_RELOC_860_SPLIT1
-@deffnx {} BFD_RELOC_860_LOW2
-@deffnx {} BFD_RELOC_860_SPLIT2
-@deffnx {} BFD_RELOC_860_LOW3
-@deffnx {} BFD_RELOC_860_LOGOT0
-@deffnx {} BFD_RELOC_860_SPGOT0
-@deffnx {} BFD_RELOC_860_LOGOT1
-@deffnx {} BFD_RELOC_860_SPGOT1
-@deffnx {} BFD_RELOC_860_LOGOTOFF0
-@deffnx {} BFD_RELOC_860_SPGOTOFF0
-@deffnx {} BFD_RELOC_860_LOGOTOFF1
-@deffnx {} BFD_RELOC_860_SPGOTOFF1
-@deffnx {} BFD_RELOC_860_LOGOTOFF2
-@deffnx {} BFD_RELOC_860_LOGOTOFF3
-@deffnx {} BFD_RELOC_860_LOPC
-@deffnx {} BFD_RELOC_860_HIGHADJ
-@deffnx {} BFD_RELOC_860_HAGOT
-@deffnx {} BFD_RELOC_860_HAGOTOFF
-@deffnx {} BFD_RELOC_860_HAPC
-@deffnx {} BFD_RELOC_860_HIGH
-@deffnx {} BFD_RELOC_860_HIGOT
-@deffnx {} BFD_RELOC_860_HIGOTOFF
-Intel i860 Relocations.
-@end deffn
-@deffn {} BFD_RELOC_OPENRISC_ABS_26
-@deffnx {} BFD_RELOC_OPENRISC_REL_26
-OpenRISC Relocations.
-@end deffn
-@deffn {} BFD_RELOC_H8_DIR16A8
-@deffnx {} BFD_RELOC_H8_DIR16R8
-@deffnx {} BFD_RELOC_H8_DIR24A8
-@deffnx {} BFD_RELOC_H8_DIR24R8
-@deffnx {} BFD_RELOC_H8_DIR32A16
-@deffnx {} BFD_RELOC_H8_DISP32A16
-H8 elf Relocations.
-@end deffn
-@deffn {} BFD_RELOC_XSTORMY16_REL_12
-@deffnx {} BFD_RELOC_XSTORMY16_12
-@deffnx {} BFD_RELOC_XSTORMY16_24
-@deffnx {} BFD_RELOC_XSTORMY16_FPTR16
-Sony Xstormy16 Relocations.
-@end deffn
-@deffn {} BFD_RELOC_RELC
-Self-describing complex relocations.
-@end deffn
-@deffn {} BFD_RELOC_XC16X_PAG
-@deffnx {} BFD_RELOC_XC16X_POF
-@deffnx {} BFD_RELOC_XC16X_SEG
-@deffnx {} BFD_RELOC_XC16X_SOF
-Infineon Relocations.
-@end deffn
-@deffn {} BFD_RELOC_VAX_GLOB_DAT
-@deffnx {} BFD_RELOC_VAX_JMP_SLOT
-@deffnx {} BFD_RELOC_VAX_RELATIVE
-Relocations used by VAX ELF.
-@end deffn
-@deffn {} BFD_RELOC_MT_PC16
-Morpho MT - 16 bit immediate relocation.
-@end deffn
-@deffn {} BFD_RELOC_MT_HI16
-Morpho MT - Hi 16 bits of an address.
-@end deffn
-@deffn {} BFD_RELOC_MT_LO16
-Morpho MT - Low 16 bits of an address.
-@end deffn
-@deffn {} BFD_RELOC_MT_GNU_VTINHERIT
-Morpho MT - Used to tell the linker which vtable entries are used.
-@end deffn
-@deffn {} BFD_RELOC_MT_GNU_VTENTRY
-Morpho MT - Used to tell the linker which vtable entries are used.
-@end deffn
-@deffn {} BFD_RELOC_MT_PCINSN8
-Morpho MT - 8 bit immediate relocation.
-@end deffn
-@deffn {} BFD_RELOC_MSP430_10_PCREL
-@deffnx {} BFD_RELOC_MSP430_16_PCREL
-@deffnx {} BFD_RELOC_MSP430_16
-@deffnx {} BFD_RELOC_MSP430_16_PCREL_BYTE
-@deffnx {} BFD_RELOC_MSP430_16_BYTE
-@deffnx {} BFD_RELOC_MSP430_2X_PCREL
-@deffnx {} BFD_RELOC_MSP430_RL_PCREL
-@deffnx {} BFD_RELOC_MSP430_ABS8
-@deffnx {} BFD_RELOC_MSP430X_PCR20_EXT_SRC
-@deffnx {} BFD_RELOC_MSP430X_PCR20_EXT_DST
-@deffnx {} BFD_RELOC_MSP430X_PCR20_EXT_ODST
-@deffnx {} BFD_RELOC_MSP430X_ABS20_EXT_SRC
-@deffnx {} BFD_RELOC_MSP430X_ABS20_EXT_DST
-@deffnx {} BFD_RELOC_MSP430X_ABS20_EXT_ODST
-@deffnx {} BFD_RELOC_MSP430X_ABS20_ADR_SRC
-@deffnx {} BFD_RELOC_MSP430X_ABS20_ADR_DST
-@deffnx {} BFD_RELOC_MSP430X_PCR16
-@deffnx {} BFD_RELOC_MSP430X_PCR20_CALL
-@deffnx {} BFD_RELOC_MSP430X_ABS16
-@deffnx {} BFD_RELOC_MSP430_ABS_HI16
-@deffnx {} BFD_RELOC_MSP430_PREL31
-@deffnx {} BFD_RELOC_MSP430_SYM_DIFF
-msp430 specific relocation codes
-@end deffn
-@deffn {} BFD_RELOC_NIOS2_S16
-@deffnx {} BFD_RELOC_NIOS2_U16
-@deffnx {} BFD_RELOC_NIOS2_CALL26
-@deffnx {} BFD_RELOC_NIOS2_IMM5
-@deffnx {} BFD_RELOC_NIOS2_CACHE_OPX
-@deffnx {} BFD_RELOC_NIOS2_IMM6
-@deffnx {} BFD_RELOC_NIOS2_IMM8
-@deffnx {} BFD_RELOC_NIOS2_HI16
-@deffnx {} BFD_RELOC_NIOS2_LO16
-@deffnx {} BFD_RELOC_NIOS2_HIADJ16
-@deffnx {} BFD_RELOC_NIOS2_GPREL
-@deffnx {} BFD_RELOC_NIOS2_UJMP
-@deffnx {} BFD_RELOC_NIOS2_CJMP
-@deffnx {} BFD_RELOC_NIOS2_CALLR
-@deffnx {} BFD_RELOC_NIOS2_ALIGN
-@deffnx {} BFD_RELOC_NIOS2_GOT16
-@deffnx {} BFD_RELOC_NIOS2_CALL16
-@deffnx {} BFD_RELOC_NIOS2_GOTOFF_LO
-@deffnx {} BFD_RELOC_NIOS2_GOTOFF_HA
-@deffnx {} BFD_RELOC_NIOS2_PCREL_LO
-@deffnx {} BFD_RELOC_NIOS2_PCREL_HA
-@deffnx {} BFD_RELOC_NIOS2_TLS_GD16
-@deffnx {} BFD_RELOC_NIOS2_TLS_LDM16
-@deffnx {} BFD_RELOC_NIOS2_TLS_LDO16
-@deffnx {} BFD_RELOC_NIOS2_TLS_IE16
-@deffnx {} BFD_RELOC_NIOS2_TLS_LE16
-@deffnx {} BFD_RELOC_NIOS2_TLS_DTPMOD
-@deffnx {} BFD_RELOC_NIOS2_TLS_DTPREL
-@deffnx {} BFD_RELOC_NIOS2_TLS_TPREL
-@deffnx {} BFD_RELOC_NIOS2_COPY
-@deffnx {} BFD_RELOC_NIOS2_GLOB_DAT
-@deffnx {} BFD_RELOC_NIOS2_JUMP_SLOT
-@deffnx {} BFD_RELOC_NIOS2_RELATIVE
-@deffnx {} BFD_RELOC_NIOS2_GOTOFF
-Relocations used by the Altera Nios II core.
-@end deffn
-@deffn {} BFD_RELOC_IQ2000_OFFSET_16
-@deffnx {} BFD_RELOC_IQ2000_OFFSET_21
-@deffnx {} BFD_RELOC_IQ2000_UHI16
-IQ2000 Relocations.
-@end deffn
-@deffn {} BFD_RELOC_XTENSA_RTLD
-Special Xtensa relocation used only by PLT entries in ELF shared
-objects to indicate that the runtime linker should set the value
-to one of its own internal functions or data structures.
-@end deffn
-@deffn {} BFD_RELOC_XTENSA_GLOB_DAT
-@deffnx {} BFD_RELOC_XTENSA_JMP_SLOT
-@deffnx {} BFD_RELOC_XTENSA_RELATIVE
-Xtensa relocations for ELF shared objects.
-@end deffn
-@deffn {} BFD_RELOC_XTENSA_PLT
-Xtensa relocation used in ELF object files for symbols that may require
-PLT entries. Otherwise, this is just a generic 32-bit relocation.
-@end deffn
-@deffn {} BFD_RELOC_XTENSA_DIFF8
-@deffnx {} BFD_RELOC_XTENSA_DIFF16
-@deffnx {} BFD_RELOC_XTENSA_DIFF32
-Xtensa relocations to mark the difference of two local symbols.
-These are only needed to support linker relaxation and can be ignored
-when not relaxing. The field is set to the value of the difference
-assuming no relaxation. The relocation encodes the position of the
-first symbol so the linker can determine whether to adjust the field
-value.
-@end deffn
-@deffn {} BFD_RELOC_XTENSA_SLOT0_OP
-@deffnx {} BFD_RELOC_XTENSA_SLOT1_OP
-@deffnx {} BFD_RELOC_XTENSA_SLOT2_OP
-@deffnx {} BFD_RELOC_XTENSA_SLOT3_OP
-@deffnx {} BFD_RELOC_XTENSA_SLOT4_OP
-@deffnx {} BFD_RELOC_XTENSA_SLOT5_OP
-@deffnx {} BFD_RELOC_XTENSA_SLOT6_OP
-@deffnx {} BFD_RELOC_XTENSA_SLOT7_OP
-@deffnx {} BFD_RELOC_XTENSA_SLOT8_OP
-@deffnx {} BFD_RELOC_XTENSA_SLOT9_OP
-@deffnx {} BFD_RELOC_XTENSA_SLOT10_OP
-@deffnx {} BFD_RELOC_XTENSA_SLOT11_OP
-@deffnx {} BFD_RELOC_XTENSA_SLOT12_OP
-@deffnx {} BFD_RELOC_XTENSA_SLOT13_OP
-@deffnx {} BFD_RELOC_XTENSA_SLOT14_OP
-Generic Xtensa relocations for instruction operands. Only the slot
-number is encoded in the relocation. The relocation applies to the
-last PC-relative immediate operand, or if there are no PC-relative
-immediates, to the last immediate operand.
-@end deffn
-@deffn {} BFD_RELOC_XTENSA_SLOT0_ALT
-@deffnx {} BFD_RELOC_XTENSA_SLOT1_ALT
-@deffnx {} BFD_RELOC_XTENSA_SLOT2_ALT
-@deffnx {} BFD_RELOC_XTENSA_SLOT3_ALT
-@deffnx {} BFD_RELOC_XTENSA_SLOT4_ALT
-@deffnx {} BFD_RELOC_XTENSA_SLOT5_ALT
-@deffnx {} BFD_RELOC_XTENSA_SLOT6_ALT
-@deffnx {} BFD_RELOC_XTENSA_SLOT7_ALT
-@deffnx {} BFD_RELOC_XTENSA_SLOT8_ALT
-@deffnx {} BFD_RELOC_XTENSA_SLOT9_ALT
-@deffnx {} BFD_RELOC_XTENSA_SLOT10_ALT
-@deffnx {} BFD_RELOC_XTENSA_SLOT11_ALT
-@deffnx {} BFD_RELOC_XTENSA_SLOT12_ALT
-@deffnx {} BFD_RELOC_XTENSA_SLOT13_ALT
-@deffnx {} BFD_RELOC_XTENSA_SLOT14_ALT
-Alternate Xtensa relocations. Only the slot is encoded in the
-relocation. The meaning of these relocations is opcode-specific.
-@end deffn
-@deffn {} BFD_RELOC_XTENSA_OP0
-@deffnx {} BFD_RELOC_XTENSA_OP1
-@deffnx {} BFD_RELOC_XTENSA_OP2
-Xtensa relocations for backward compatibility. These have all been
-replaced by BFD_RELOC_XTENSA_SLOT0_OP.
-@end deffn
-@deffn {} BFD_RELOC_XTENSA_ASM_EXPAND
-Xtensa relocation to mark that the assembler expanded the
-instructions from an original target. The expansion size is
-encoded in the reloc size.
-@end deffn
-@deffn {} BFD_RELOC_XTENSA_ASM_SIMPLIFY
-Xtensa relocation to mark that the linker should simplify
-assembler-expanded instructions. This is commonly used
-internally by the linker after analysis of a
-BFD_RELOC_XTENSA_ASM_EXPAND.
-@end deffn
-@deffn {} BFD_RELOC_XTENSA_TLSDESC_FN
-@deffnx {} BFD_RELOC_XTENSA_TLSDESC_ARG
-@deffnx {} BFD_RELOC_XTENSA_TLS_DTPOFF
-@deffnx {} BFD_RELOC_XTENSA_TLS_TPOFF
-@deffnx {} BFD_RELOC_XTENSA_TLS_FUNC
-@deffnx {} BFD_RELOC_XTENSA_TLS_ARG
-@deffnx {} BFD_RELOC_XTENSA_TLS_CALL
-Xtensa TLS relocations.
-@end deffn
-@deffn {} BFD_RELOC_Z80_DISP8
-8 bit signed offset in (ix+d) or (iy+d).
-@end deffn
-@deffn {} BFD_RELOC_Z8K_DISP7
-DJNZ offset.
-@end deffn
-@deffn {} BFD_RELOC_Z8K_CALLR
-CALR offset.
-@end deffn
-@deffn {} BFD_RELOC_Z8K_IMM4L
-4 bit value.
-@end deffn
-@deffn {} BFD_RELOC_LM32_CALL
-@deffnx {} BFD_RELOC_LM32_BRANCH
-@deffnx {} BFD_RELOC_LM32_16_GOT
-@deffnx {} BFD_RELOC_LM32_GOTOFF_HI16
-@deffnx {} BFD_RELOC_LM32_GOTOFF_LO16
-@deffnx {} BFD_RELOC_LM32_COPY
-@deffnx {} BFD_RELOC_LM32_GLOB_DAT
-@deffnx {} BFD_RELOC_LM32_JMP_SLOT
-@deffnx {} BFD_RELOC_LM32_RELATIVE
-Lattice Mico32 relocations.
-@end deffn
-@deffn {} BFD_RELOC_MACH_O_SECTDIFF
-Difference between two section addreses. Must be followed by a
-BFD_RELOC_MACH_O_PAIR.
-@end deffn
-@deffn {} BFD_RELOC_MACH_O_LOCAL_SECTDIFF
-Like BFD_RELOC_MACH_O_SECTDIFF but with a local symbol.
-@end deffn
-@deffn {} BFD_RELOC_MACH_O_PAIR
-Pair of relocation. Contains the first symbol.
-@end deffn
-@deffn {} BFD_RELOC_MACH_O_X86_64_BRANCH32
-@deffnx {} BFD_RELOC_MACH_O_X86_64_BRANCH8
-PCREL relocations. They are marked as branch to create PLT entry if
-required.
-@end deffn
-@deffn {} BFD_RELOC_MACH_O_X86_64_GOT
-Used when referencing a GOT entry.
-@end deffn
-@deffn {} BFD_RELOC_MACH_O_X86_64_GOT_LOAD
-Used when loading a GOT entry with movq. It is specially marked so that
-the linker could optimize the movq to a leaq if possible.
-@end deffn
-@deffn {} BFD_RELOC_MACH_O_X86_64_SUBTRACTOR32
-Symbol will be substracted. Must be followed by a BFD_RELOC_64.
-@end deffn
-@deffn {} BFD_RELOC_MACH_O_X86_64_SUBTRACTOR64
-Symbol will be substracted. Must be followed by a BFD_RELOC_64.
-@end deffn
-@deffn {} BFD_RELOC_MACH_O_X86_64_PCREL32_1
-Same as BFD_RELOC_32_PCREL but with an implicit -1 addend.
-@end deffn
-@deffn {} BFD_RELOC_MACH_O_X86_64_PCREL32_2
-Same as BFD_RELOC_32_PCREL but with an implicit -2 addend.
-@end deffn
-@deffn {} BFD_RELOC_MACH_O_X86_64_PCREL32_4
-Same as BFD_RELOC_32_PCREL but with an implicit -4 addend.
-@end deffn
-@deffn {} BFD_RELOC_MICROBLAZE_32_LO
-This is a 32 bit reloc for the microblaze that stores the
-low 16 bits of a value
-@end deffn
-@deffn {} BFD_RELOC_MICROBLAZE_32_LO_PCREL
-This is a 32 bit pc-relative reloc for the microblaze that
-stores the low 16 bits of a value
-@end deffn
-@deffn {} BFD_RELOC_MICROBLAZE_32_ROSDA
-This is a 32 bit reloc for the microblaze that stores a
-value relative to the read-only small data area anchor
-@end deffn
-@deffn {} BFD_RELOC_MICROBLAZE_32_RWSDA
-This is a 32 bit reloc for the microblaze that stores a
-value relative to the read-write small data area anchor
-@end deffn
-@deffn {} BFD_RELOC_MICROBLAZE_32_SYM_OP_SYM
-This is a 32 bit reloc for the microblaze to handle
-expressions of the form "Symbol Op Symbol"
-@end deffn
-@deffn {} BFD_RELOC_MICROBLAZE_64_NONE
-This is a 64 bit reloc that stores the 32 bit pc relative
-value in two words (with an imm instruction). No relocation is
-done here - only used for relaxing
-@end deffn
-@deffn {} BFD_RELOC_MICROBLAZE_64_GOTPC
-This is a 64 bit reloc that stores the 32 bit pc relative
-value in two words (with an imm instruction). The relocation is
-PC-relative GOT offset
-@end deffn
-@deffn {} BFD_RELOC_MICROBLAZE_64_GOT
-This is a 64 bit reloc that stores the 32 bit pc relative
-value in two words (with an imm instruction). The relocation is
-GOT offset
-@end deffn
-@deffn {} BFD_RELOC_MICROBLAZE_64_PLT
-This is a 64 bit reloc that stores the 32 bit pc relative
-value in two words (with an imm instruction). The relocation is
-PC-relative offset into PLT
-@end deffn
-@deffn {} BFD_RELOC_MICROBLAZE_64_GOTOFF
-This is a 64 bit reloc that stores the 32 bit GOT relative
-value in two words (with an imm instruction). The relocation is
-relative offset from _GLOBAL_OFFSET_TABLE_
-@end deffn
-@deffn {} BFD_RELOC_MICROBLAZE_32_GOTOFF
-This is a 32 bit reloc that stores the 32 bit GOT relative
-value in a word. The relocation is relative offset from
-@end deffn
-@deffn {} BFD_RELOC_MICROBLAZE_COPY
-This is used to tell the dynamic linker to copy the value out of
-the dynamic object into the runtime process image.
-@end deffn
-@deffn {} BFD_RELOC_MICROBLAZE_64_TLS
-Unused Reloc
-@end deffn
-@deffn {} BFD_RELOC_MICROBLAZE_64_TLSGD
-This is a 64 bit reloc that stores the 32 bit GOT relative value
-of the GOT TLS GD info entry in two words (with an imm instruction). The
-relocation is GOT offset.
-@end deffn
-@deffn {} BFD_RELOC_MICROBLAZE_64_TLSLD
-This is a 64 bit reloc that stores the 32 bit GOT relative value
-of the GOT TLS LD info entry in two words (with an imm instruction). The
-relocation is GOT offset.
-@end deffn
-@deffn {} BFD_RELOC_MICROBLAZE_32_TLSDTPMOD
-This is a 32 bit reloc that stores the Module ID to GOT(n).
-@end deffn
-@deffn {} BFD_RELOC_MICROBLAZE_32_TLSDTPREL
-This is a 32 bit reloc that stores TLS offset to GOT(n+1).
-@end deffn
-@deffn {} BFD_RELOC_MICROBLAZE_64_TLSDTPREL
-This is a 32 bit reloc for storing TLS offset to two words (uses imm
-instruction)
-@end deffn
-@deffn {} BFD_RELOC_MICROBLAZE_64_TLSGOTTPREL
-This is a 64 bit reloc that stores 32-bit thread pointer relative offset
-to two words (uses imm instruction).
-@end deffn
-@deffn {} BFD_RELOC_MICROBLAZE_64_TLSTPREL
-This is a 64 bit reloc that stores 32-bit thread pointer relative offset
-to two words (uses imm instruction).
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_RELOC_START
-AArch64 pseudo relocation code to mark the start of the AArch64
-relocation enumerators. N.B. the order of the enumerators is
-important as several tables in the AArch64 bfd backend are indexed
-by these enumerators; make sure they are all synced.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_NONE
-AArch64 null relocation code.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_64
-@deffnx {} BFD_RELOC_AARCH64_32
-@deffnx {} BFD_RELOC_AARCH64_16
-Basic absolute relocations of N bits. These are equivalent to
-BFD_RELOC_N and they were added to assist the indexing of the howto
-table.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_64_PCREL
-@deffnx {} BFD_RELOC_AARCH64_32_PCREL
-@deffnx {} BFD_RELOC_AARCH64_16_PCREL
-PC-relative relocations. These are equivalent to BFD_RELOC_N_PCREL
-and they were added to assist the indexing of the howto table.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_MOVW_G0
-AArch64 MOV[NZK] instruction with most significant bits 0 to 15
-of an unsigned address/value.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_MOVW_G0_NC
-AArch64 MOV[NZK] instruction with less significant bits 0 to 15 of
-an address/value. No overflow checking.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_MOVW_G1
-AArch64 MOV[NZK] instruction with most significant bits 16 to 31
-of an unsigned address/value.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_MOVW_G1_NC
-AArch64 MOV[NZK] instruction with less significant bits 16 to 31
-of an address/value. No overflow checking.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_MOVW_G2
-AArch64 MOV[NZK] instruction with most significant bits 32 to 47
-of an unsigned address/value.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_MOVW_G2_NC
-AArch64 MOV[NZK] instruction with less significant bits 32 to 47
-of an address/value. No overflow checking.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_MOVW_G3
-AArch64 MOV[NZK] instruction with most signficant bits 48 to 64
-of a signed or unsigned address/value.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_MOVW_G0_S
-AArch64 MOV[NZ] instruction with most significant bits 0 to 15
-of a signed value. Changes instruction to MOVZ or MOVN depending on the
-value's sign.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_MOVW_G1_S
-AArch64 MOV[NZ] instruction with most significant bits 16 to 31
-of a signed value. Changes instruction to MOVZ or MOVN depending on the
-value's sign.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_MOVW_G2_S
-AArch64 MOV[NZ] instruction with most significant bits 32 to 47
-of a signed value. Changes instruction to MOVZ or MOVN depending on the
-value's sign.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_LD_LO19_PCREL
-AArch64 Load Literal instruction, holding a 19 bit pc-relative word
-offset. The lowest two bits must be zero and are not stored in the
-instruction, giving a 21 bit signed byte offset.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_ADR_LO21_PCREL
-AArch64 ADR instruction, holding a simple 21 bit pc-relative byte offset.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_ADR_HI21_PCREL
-AArch64 ADRP instruction, with bits 12 to 32 of a pc-relative page
-offset, giving a 4KB aligned page base address.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL
-AArch64 ADRP instruction, with bits 12 to 32 of a pc-relative page
-offset, giving a 4KB aligned page base address, but with no overflow
-checking.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_ADD_LO12
-AArch64 ADD immediate instruction, holding bits 0 to 11 of the address.
-Used in conjunction with BFD_RELOC_AARCH64_ADR_HI21_PCREL.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_LDST8_LO12
-AArch64 8-bit load/store instruction, holding bits 0 to 11 of the
-address. Used in conjunction with BFD_RELOC_AARCH64_ADR_HI21_PCREL.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_TSTBR14
-AArch64 14 bit pc-relative test bit and branch.
-The lowest two bits must be zero and are not stored in the instruction,
-giving a 16 bit signed byte offset.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_BRANCH19
-AArch64 19 bit pc-relative conditional branch and compare & branch.
-The lowest two bits must be zero and are not stored in the instruction,
-giving a 21 bit signed byte offset.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_JUMP26
-AArch64 26 bit pc-relative unconditional branch.
-The lowest two bits must be zero and are not stored in the instruction,
-giving a 28 bit signed byte offset.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_CALL26
-AArch64 26 bit pc-relative unconditional branch and link.
-The lowest two bits must be zero and are not stored in the instruction,
-giving a 28 bit signed byte offset.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_LDST16_LO12
-AArch64 16-bit load/store instruction, holding bits 0 to 11 of the
-address. Used in conjunction with BFD_RELOC_AARCH64_ADR_HI21_PCREL.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_LDST32_LO12
-AArch64 32-bit load/store instruction, holding bits 0 to 11 of the
-address. Used in conjunction with BFD_RELOC_AARCH64_ADR_HI21_PCREL.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_LDST64_LO12
-AArch64 64-bit load/store instruction, holding bits 0 to 11 of the
-address. Used in conjunction with BFD_RELOC_AARCH64_ADR_HI21_PCREL.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_LDST128_LO12
-AArch64 128-bit load/store instruction, holding bits 0 to 11 of the
-address. Used in conjunction with BFD_RELOC_AARCH64_ADR_HI21_PCREL.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_GOT_LD_PREL19
-AArch64 Load Literal instruction, holding a 19 bit PC relative word
-offset of the global offset table entry for a symbol. The lowest two
-bits must be zero and are not stored in the instruction, giving a 21
-bit signed byte offset. This relocation type requires signed overflow
-checking.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_ADR_GOT_PAGE
-Get to the page base of the global offset table entry for a symbol as
-part of an ADRP instruction using a 21 bit PC relative value.Used in
-conjunction with BFD_RELOC_AARCH64_LD64_GOT_LO12_NC.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_LD64_GOT_LO12_NC
-Unsigned 12 bit byte offset for 64 bit load/store from the page of
-the GOT entry for this symbol. Used in conjunction with
-BFD_RELOC_AARCH64_ADR_GOTPAGE. Valid in LP64 ABI only.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_LD32_GOT_LO12_NC
-Unsigned 12 bit byte offset for 32 bit load/store from the page of
-the GOT entry for this symbol. Used in conjunction with
-BFD_RELOC_AARCH64_ADR_GOTPAGE. Valid in ILP32 ABI only.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21
-Get to the page base of the global offset table entry for a symbols
-tls_index structure as part of an adrp instruction using a 21 bit PC
-relative value. Used in conjunction with
-BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC
-Unsigned 12 bit byte offset to global offset table entry for a symbols
-tls_index structure. Used in conjunction with
-BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G1
-AArch64 TLS INITIAL EXEC relocation.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC
-AArch64 TLS INITIAL EXEC relocation.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21
-AArch64 TLS INITIAL EXEC relocation.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC
-AArch64 TLS INITIAL EXEC relocation.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC
-AArch64 TLS INITIAL EXEC relocation.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19
-AArch64 TLS INITIAL EXEC relocation.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2
-AArch64 TLS LOCAL EXEC relocation.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1
-AArch64 TLS LOCAL EXEC relocation.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC
-AArch64 TLS LOCAL EXEC relocation.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0
-AArch64 TLS LOCAL EXEC relocation.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC
-AArch64 TLS LOCAL EXEC relocation.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12
-AArch64 TLS LOCAL EXEC relocation.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12
-AArch64 TLS LOCAL EXEC relocation.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC
-AArch64 TLS LOCAL EXEC relocation.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_TLSDESC_LD_PREL19
-AArch64 TLS DESC relocation.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_TLSDESC_ADR_PREL21
-AArch64 TLS DESC relocation.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21
-AArch64 TLS DESC relocation.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC
-AArch64 TLS DESC relocation.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC
-AArch64 TLS DESC relocation.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC
-AArch64 TLS DESC relocation.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_TLSDESC_OFF_G1
-AArch64 TLS DESC relocation.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC
-AArch64 TLS DESC relocation.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_TLSDESC_LDR
-AArch64 TLS DESC relocation.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_TLSDESC_ADD
-AArch64 TLS DESC relocation.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_TLSDESC_CALL
-AArch64 TLS DESC relocation.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_COPY
-AArch64 TLS relocation.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_GLOB_DAT
-AArch64 TLS relocation.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_JUMP_SLOT
-AArch64 TLS relocation.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_RELATIVE
-AArch64 TLS relocation.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_TLS_DTPMOD
-AArch64 TLS relocation.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_TLS_DTPREL
-AArch64 TLS relocation.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_TLS_TPREL
-AArch64 TLS relocation.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_TLSDESC
-AArch64 TLS relocation.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_IRELATIVE
-AArch64 support for STT_GNU_IFUNC.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_RELOC_END
-AArch64 pseudo relocation code to mark the end of the AArch64
-relocation enumerators that have direct mapping to ELF reloc codes.
-There are a few more enumerators after this one; those are mainly
-used by the AArch64 assembler for the internal fixup or to select
-one of the above enumerators.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_GAS_INTERNAL_FIXUP
-AArch64 pseudo relocation code to be used internally by the AArch64
-assembler and not (currently) written to any object files.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_LDST_LO12
-AArch64 unspecified load/store instruction, holding bits 0 to 11 of the
-address. Used in conjunction with BFD_RELOC_AARCH64_ADR_HI21_PCREL.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_LD_GOT_LO12_NC
-AArch64 pseudo relocation code to be used internally by the AArch64
-assembler and not (currently) written to any object files.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_LO12_NC
-AArch64 pseudo relocation code to be used internally by the AArch64
-assembler and not (currently) written to any object files.
-@end deffn
-@deffn {} BFD_RELOC_AARCH64_TLSDESC_LD_LO12_NC
-AArch64 pseudo relocation code to be used internally by the AArch64
-assembler and not (currently) written to any object files.
-@end deffn
-@deffn {} BFD_RELOC_TILEPRO_COPY
-@deffnx {} BFD_RELOC_TILEPRO_GLOB_DAT
-@deffnx {} BFD_RELOC_TILEPRO_JMP_SLOT
-@deffnx {} BFD_RELOC_TILEPRO_RELATIVE
-@deffnx {} BFD_RELOC_TILEPRO_BROFF_X1
-@deffnx {} BFD_RELOC_TILEPRO_JOFFLONG_X1
-@deffnx {} BFD_RELOC_TILEPRO_JOFFLONG_X1_PLT
-@deffnx {} BFD_RELOC_TILEPRO_IMM8_X0
-@deffnx {} BFD_RELOC_TILEPRO_IMM8_Y0
-@deffnx {} BFD_RELOC_TILEPRO_IMM8_X1
-@deffnx {} BFD_RELOC_TILEPRO_IMM8_Y1
-@deffnx {} BFD_RELOC_TILEPRO_DEST_IMM8_X1
-@deffnx {} BFD_RELOC_TILEPRO_MT_IMM15_X1
-@deffnx {} BFD_RELOC_TILEPRO_MF_IMM15_X1
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_LO
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_LO
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_HI
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_HI
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_HA
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_HA
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_PCREL
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_PCREL
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_LO_PCREL
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_LO_PCREL
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_HI_PCREL
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_HI_PCREL
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_HA_PCREL
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_HA_PCREL
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_GOT
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_GOT
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_GOT_LO
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_GOT_LO
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_GOT_HI
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_GOT_HI
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_GOT_HA
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_GOT_HA
-@deffnx {} BFD_RELOC_TILEPRO_MMSTART_X0
-@deffnx {} BFD_RELOC_TILEPRO_MMEND_X0
-@deffnx {} BFD_RELOC_TILEPRO_MMSTART_X1
-@deffnx {} BFD_RELOC_TILEPRO_MMEND_X1
-@deffnx {} BFD_RELOC_TILEPRO_SHAMT_X0
-@deffnx {} BFD_RELOC_TILEPRO_SHAMT_X1
-@deffnx {} BFD_RELOC_TILEPRO_SHAMT_Y0
-@deffnx {} BFD_RELOC_TILEPRO_SHAMT_Y1
-@deffnx {} BFD_RELOC_TILEPRO_TLS_GD_CALL
-@deffnx {} BFD_RELOC_TILEPRO_IMM8_X0_TLS_GD_ADD
-@deffnx {} BFD_RELOC_TILEPRO_IMM8_X1_TLS_GD_ADD
-@deffnx {} BFD_RELOC_TILEPRO_IMM8_Y0_TLS_GD_ADD
-@deffnx {} BFD_RELOC_TILEPRO_IMM8_Y1_TLS_GD_ADD
-@deffnx {} BFD_RELOC_TILEPRO_TLS_IE_LOAD
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_LO
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_LO
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_HI
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_HI
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_HA
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_HA
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_LO
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_LO
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_HI
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_HI
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_HA
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_HA
-@deffnx {} BFD_RELOC_TILEPRO_TLS_DTPMOD32
-@deffnx {} BFD_RELOC_TILEPRO_TLS_DTPOFF32
-@deffnx {} BFD_RELOC_TILEPRO_TLS_TPOFF32
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_LO
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_LO
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_HI
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_HI
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_HA
-@deffnx {} BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_HA
-Tilera TILEPro Relocations.
-@end deffn
-@deffn {} BFD_RELOC_TILEGX_HW0
-@deffnx {} BFD_RELOC_TILEGX_HW1
-@deffnx {} BFD_RELOC_TILEGX_HW2
-@deffnx {} BFD_RELOC_TILEGX_HW3
-@deffnx {} BFD_RELOC_TILEGX_HW0_LAST
-@deffnx {} BFD_RELOC_TILEGX_HW1_LAST
-@deffnx {} BFD_RELOC_TILEGX_HW2_LAST
-@deffnx {} BFD_RELOC_TILEGX_COPY
-@deffnx {} BFD_RELOC_TILEGX_GLOB_DAT
-@deffnx {} BFD_RELOC_TILEGX_JMP_SLOT
-@deffnx {} BFD_RELOC_TILEGX_RELATIVE
-@deffnx {} BFD_RELOC_TILEGX_BROFF_X1
-@deffnx {} BFD_RELOC_TILEGX_JUMPOFF_X1
-@deffnx {} BFD_RELOC_TILEGX_JUMPOFF_X1_PLT
-@deffnx {} BFD_RELOC_TILEGX_IMM8_X0
-@deffnx {} BFD_RELOC_TILEGX_IMM8_Y0
-@deffnx {} BFD_RELOC_TILEGX_IMM8_X1
-@deffnx {} BFD_RELOC_TILEGX_IMM8_Y1
-@deffnx {} BFD_RELOC_TILEGX_DEST_IMM8_X1
-@deffnx {} BFD_RELOC_TILEGX_MT_IMM14_X1
-@deffnx {} BFD_RELOC_TILEGX_MF_IMM14_X1
-@deffnx {} BFD_RELOC_TILEGX_MMSTART_X0
-@deffnx {} BFD_RELOC_TILEGX_MMEND_X0
-@deffnx {} BFD_RELOC_TILEGX_SHAMT_X0
-@deffnx {} BFD_RELOC_TILEGX_SHAMT_X1
-@deffnx {} BFD_RELOC_TILEGX_SHAMT_Y0
-@deffnx {} BFD_RELOC_TILEGX_SHAMT_Y1
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW0
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW0
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW1
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW1
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW2
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW2
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW3
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW3
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW0_PCREL
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW0_PCREL
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW1_PCREL
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW1_PCREL
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW2_PCREL
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW2_PCREL
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW3_PCREL
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW3_PCREL
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_PCREL
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_PCREL
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_PCREL
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_PCREL
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST_PCREL
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST_PCREL
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW0_GOT
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW0_GOT
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW0_PLT_PCREL
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW0_PLT_PCREL
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW1_PLT_PCREL
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW1_PLT_PCREL
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW2_PLT_PCREL
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW2_PLT_PCREL
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_GOT
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_GOT
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_GOT
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_GOT
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW3_PLT_PCREL
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW3_PLT_PCREL
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_GD
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_GD
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_LE
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_LE
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_LE
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_LE
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_LE
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_LE
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_GD
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_GD
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_GD
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_GD
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_IE
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_IE
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_IE
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_IE
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_IE
-@deffnx {} BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_IE
-@deffnx {} BFD_RELOC_TILEGX_TLS_DTPMOD64
-@deffnx {} BFD_RELOC_TILEGX_TLS_DTPOFF64
-@deffnx {} BFD_RELOC_TILEGX_TLS_TPOFF64
-@deffnx {} BFD_RELOC_TILEGX_TLS_DTPMOD32
-@deffnx {} BFD_RELOC_TILEGX_TLS_DTPOFF32
-@deffnx {} BFD_RELOC_TILEGX_TLS_TPOFF32
-@deffnx {} BFD_RELOC_TILEGX_TLS_GD_CALL
-@deffnx {} BFD_RELOC_TILEGX_IMM8_X0_TLS_GD_ADD
-@deffnx {} BFD_RELOC_TILEGX_IMM8_X1_TLS_GD_ADD
-@deffnx {} BFD_RELOC_TILEGX_IMM8_Y0_TLS_GD_ADD
-@deffnx {} BFD_RELOC_TILEGX_IMM8_Y1_TLS_GD_ADD
-@deffnx {} BFD_RELOC_TILEGX_TLS_IE_LOAD
-@deffnx {} BFD_RELOC_TILEGX_IMM8_X0_TLS_ADD
-@deffnx {} BFD_RELOC_TILEGX_IMM8_X1_TLS_ADD
-@deffnx {} BFD_RELOC_TILEGX_IMM8_Y0_TLS_ADD
-@deffnx {} BFD_RELOC_TILEGX_IMM8_Y1_TLS_ADD
-Tilera TILE-Gx Relocations.
-@end deffn
-@deffn {} BFD_RELOC_EPIPHANY_SIMM8
-Adapteva EPIPHANY - 8 bit signed pc-relative displacement
-@end deffn
-@deffn {} BFD_RELOC_EPIPHANY_SIMM24
-Adapteva EPIPHANY - 24 bit signed pc-relative displacement
-@end deffn
-@deffn {} BFD_RELOC_EPIPHANY_HIGH
-Adapteva EPIPHANY - 16 most-significant bits of absolute address
-@end deffn
-@deffn {} BFD_RELOC_EPIPHANY_LOW
-Adapteva EPIPHANY - 16 least-significant bits of absolute address
-@end deffn
-@deffn {} BFD_RELOC_EPIPHANY_SIMM11
-Adapteva EPIPHANY - 11 bit signed number - add/sub immediate
-@end deffn
-@deffn {} BFD_RELOC_EPIPHANY_IMM11
-Adapteva EPIPHANY - 11 bit sign-magnitude number (ld/st displacement)
-@end deffn
-@deffn {} BFD_RELOC_EPIPHANY_IMM8
-Adapteva EPIPHANY - 8 bit immediate for 16 bit mov instruction.
-@end deffn
-
-@example
-
-typedef enum bfd_reloc_code_real bfd_reloc_code_real_type;
-@end example
-@findex bfd_reloc_type_lookup
-@subsubsection @code{bfd_reloc_type_lookup}
-@strong{Synopsis}
-@example
-reloc_howto_type *bfd_reloc_type_lookup
- (bfd *abfd, bfd_reloc_code_real_type code);
-reloc_howto_type *bfd_reloc_name_lookup
- (bfd *abfd, const char *reloc_name);
-@end example
-@strong{Description}@*
-Return a pointer to a howto structure which, when
-invoked, will perform the relocation @var{code} on data from the
-architecture noted.
-
-@findex bfd_default_reloc_type_lookup
-@subsubsection @code{bfd_default_reloc_type_lookup}
-@strong{Synopsis}
-@example
-reloc_howto_type *bfd_default_reloc_type_lookup
- (bfd *abfd, bfd_reloc_code_real_type code);
-@end example
-@strong{Description}@*
-Provides a default relocation lookup routine for any architecture.
-
-@findex bfd_get_reloc_code_name
-@subsubsection @code{bfd_get_reloc_code_name}
-@strong{Synopsis}
-@example
-const char *bfd_get_reloc_code_name (bfd_reloc_code_real_type code);
-@end example
-@strong{Description}@*
-Provides a printable name for the supplied relocation code.
-Useful mainly for printing error messages.
-
-@findex bfd_generic_relax_section
-@subsubsection @code{bfd_generic_relax_section}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_generic_relax_section
- (bfd *abfd,
- asection *section,
- struct bfd_link_info *,
- bfd_boolean *);
-@end example
-@strong{Description}@*
-Provides default handling for relaxing for back ends which
-don't do relaxing.
-
-@findex bfd_generic_gc_sections
-@subsubsection @code{bfd_generic_gc_sections}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_generic_gc_sections
- (bfd *, struct bfd_link_info *);
-@end example
-@strong{Description}@*
-Provides default handling for relaxing for back ends which
-don't do section gc -- i.e., does nothing.
-
-@findex bfd_generic_lookup_section_flags
-@subsubsection @code{bfd_generic_lookup_section_flags}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_generic_lookup_section_flags
- (struct bfd_link_info *, struct flag_info *, asection *);
-@end example
-@strong{Description}@*
-Provides default handling for section flags lookup
--- i.e., does nothing.
-Returns FALSE if the section should be omitted, otherwise TRUE.
-
-@findex bfd_generic_merge_sections
-@subsubsection @code{bfd_generic_merge_sections}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_generic_merge_sections
- (bfd *, struct bfd_link_info *);
-@end example
-@strong{Description}@*
-Provides default handling for SEC_MERGE section merging for back ends
-which don't have SEC_MERGE support -- i.e., does nothing.
-
-@findex bfd_generic_get_relocated_section_contents
-@subsubsection @code{bfd_generic_get_relocated_section_contents}
-@strong{Synopsis}
-@example
-bfd_byte *bfd_generic_get_relocated_section_contents
- (bfd *abfd,
- struct bfd_link_info *link_info,
- struct bfd_link_order *link_order,
- bfd_byte *data,
- bfd_boolean relocatable,
- asymbol **symbols);
-@end example
-@strong{Description}@*
-Provides default handling of relocation effort for back ends
-which can't be bothered to do it efficiently.
-
diff -Nur binutils-2.24.orig/bfd/doc/section.texi binutils-2.24/bfd/doc/section.texi
--- binutils-2.24.orig/bfd/doc/section.texi 2013-11-18 09:49:27.000000000 +0100
+++ binutils-2.24/bfd/doc/section.texi 1970-01-01 01:00:00.000000000 +0100
@@ -1,1035 +0,0 @@
-@section Sections
-The raw data contained within a BFD is maintained through the
-section abstraction. A single BFD may have any number of
-sections. It keeps hold of them by pointing to the first;
-each one points to the next in the list.
-
-Sections are supported in BFD in @code{section.c}.
-
-@menu
-* Section Input::
-* Section Output::
-* typedef asection::
-* section prototypes::
-@end menu
-
-@node Section Input, Section Output, Sections, Sections
-@subsection Section input
-When a BFD is opened for reading, the section structures are
-created and attached to the BFD.
-
-Each section has a name which describes the section in the
-outside world---for example, @code{a.out} would contain at least
-three sections, called @code{.text}, @code{.data} and @code{.bss}.
-
-Names need not be unique; for example a COFF file may have several
-sections named @code{.data}.
-
-Sometimes a BFD will contain more than the ``natural'' number of
-sections. A back end may attach other sections containing
-constructor data, or an application may add a section (using
-@code{bfd_make_section}) to the sections attached to an already open
-BFD. For example, the linker creates an extra section
-@code{COMMON} for each input file's BFD to hold information about
-common storage.
-
-The raw data is not necessarily read in when
-the section descriptor is created. Some targets may leave the
-data in place until a @code{bfd_get_section_contents} call is
-made. Other back ends may read in all the data at once. For
-example, an S-record file has to be read once to determine the
-size of the data. An IEEE-695 file doesn't contain raw data in
-sections, but data and relocation expressions intermixed, so
-the data area has to be parsed to get out the data and
-relocations.
-
-@node Section Output, typedef asection, Section Input, Sections
-@subsection Section output
-To write a new object style BFD, the various sections to be
-written have to be created. They are attached to the BFD in
-the same way as input sections; data is written to the
-sections using @code{bfd_set_section_contents}.
-
-Any program that creates or combines sections (e.g., the assembler
-and linker) must use the @code{asection} fields @code{output_section} and
-@code{output_offset} to indicate the file sections to which each
-section must be written. (If the section is being created from
-scratch, @code{output_section} should probably point to the section
-itself and @code{output_offset} should probably be zero.)
-
-The data to be written comes from input sections attached
-(via @code{output_section} pointers) to
-the output sections. The output section structure can be
-considered a filter for the input section: the output section
-determines the vma of the output data and the name, but the
-input section determines the offset into the output section of
-the data to be written.
-
-E.g., to create a section "O", starting at 0x100, 0x123 long,
-containing two subsections, "A" at offset 0x0 (i.e., at vma
-0x100) and "B" at offset 0x20 (i.e., at vma 0x120) the @code{asection}
-structures would look like:
-
-@example
- section name "A"
- output_offset 0x00
- size 0x20
- output_section -----------> section name "O"
- | vma 0x100
- section name "B" | size 0x123
- output_offset 0x20 |
- size 0x103 |
- output_section --------|
-@end example
-
-@subsection Link orders
-The data within a section is stored in a @dfn{link_order}.
-These are much like the fixups in @code{gas}. The link_order
-abstraction allows a section to grow and shrink within itself.
-
-A link_order knows how big it is, and which is the next
-link_order and where the raw data for it is; it also points to
-a list of relocations which apply to it.
-
-The link_order is used by the linker to perform relaxing on
-final code. The compiler creates code which is as big as
-necessary to make it work without relaxing, and the user can
-select whether to relax. Sometimes relaxing takes a lot of
-time. The linker runs around the relocations to see if any
-are attached to data which can be shrunk, if so it does it on
-a link_order by link_order basis.
-
-
-@node typedef asection, section prototypes, Section Output, Sections
-@subsection typedef asection
-Here is the section structure:
-
-
-@example
-
-typedef struct bfd_section
-@{
- /* The name of the section; the name isn't a copy, the pointer is
- the same as that passed to bfd_make_section. */
- const char *name;
-
- /* A unique sequence number. */
- int id;
-
- /* Which section in the bfd; 0..n-1 as sections are created in a bfd. */
- int index;
-
- /* The next section in the list belonging to the BFD, or NULL. */
- struct bfd_section *next;
-
- /* The previous section in the list belonging to the BFD, or NULL. */
- struct bfd_section *prev;
-
- /* The field flags contains attributes of the section. Some
- flags are read in from the object file, and some are
- synthesized from other information. */
- flagword flags;
-
-#define SEC_NO_FLAGS 0x000
-
- /* Tells the OS to allocate space for this section when loading.
- This is clear for a section containing debug information only. */
-#define SEC_ALLOC 0x001
-
- /* Tells the OS to load the section from the file when loading.
- This is clear for a .bss section. */
-#define SEC_LOAD 0x002
-
- /* The section contains data still to be relocated, so there is
- some relocation information too. */
-#define SEC_RELOC 0x004
-
- /* A signal to the OS that the section contains read only data. */
-#define SEC_READONLY 0x008
-
- /* The section contains code only. */
-#define SEC_CODE 0x010
-
- /* The section contains data only. */
-#define SEC_DATA 0x020
-
- /* The section will reside in ROM. */
-#define SEC_ROM 0x040
-
- /* The section contains constructor information. This section
- type is used by the linker to create lists of constructors and
- destructors used by @code{g++}. When a back end sees a symbol
- which should be used in a constructor list, it creates a new
- section for the type of name (e.g., @code{__CTOR_LIST__}), attaches
- the symbol to it, and builds a relocation. To build the lists
- of constructors, all the linker has to do is catenate all the
- sections called @code{__CTOR_LIST__} and relocate the data
- contained within - exactly the operations it would peform on
- standard data. */
-#define SEC_CONSTRUCTOR 0x080
-
- /* The section has contents - a data section could be
- @code{SEC_ALLOC} | @code{SEC_HAS_CONTENTS}; a debug section could be
- @code{SEC_HAS_CONTENTS} */
-#define SEC_HAS_CONTENTS 0x100
-
- /* An instruction to the linker to not output the section
- even if it has information which would normally be written. */
-#define SEC_NEVER_LOAD 0x200
-
- /* The section contains thread local data. */
-#define SEC_THREAD_LOCAL 0x400
-
- /* The section has GOT references. This flag is only for the
- linker, and is currently only used by the elf32-hppa back end.
- It will be set if global offset table references were detected
- in this section, which indicate to the linker that the section
- contains PIC code, and must be handled specially when doing a
- static link. */
-#define SEC_HAS_GOT_REF 0x800
-
- /* The section contains common symbols (symbols may be defined
- multiple times, the value of a symbol is the amount of
- space it requires, and the largest symbol value is the one
- used). Most targets have exactly one of these (which we
- translate to bfd_com_section_ptr), but ECOFF has two. */
-#define SEC_IS_COMMON 0x1000
-
- /* The section contains only debugging information. For
- example, this is set for ELF .debug and .stab sections.
- strip tests this flag to see if a section can be
- discarded. */
-#define SEC_DEBUGGING 0x2000
-
- /* The contents of this section are held in memory pointed to
- by the contents field. This is checked by bfd_get_section_contents,
- and the data is retrieved from memory if appropriate. */
-#define SEC_IN_MEMORY 0x4000
-
- /* The contents of this section are to be excluded by the
- linker for executable and shared objects unless those
- objects are to be further relocated. */
-#define SEC_EXCLUDE 0x8000
-
- /* The contents of this section are to be sorted based on the sum of
- the symbol and addend values specified by the associated relocation
- entries. Entries without associated relocation entries will be
- appended to the end of the section in an unspecified order. */
-#define SEC_SORT_ENTRIES 0x10000
-
- /* When linking, duplicate sections of the same name should be
- discarded, rather than being combined into a single section as
- is usually done. This is similar to how common symbols are
- handled. See SEC_LINK_DUPLICATES below. */
-#define SEC_LINK_ONCE 0x20000
-
- /* If SEC_LINK_ONCE is set, this bitfield describes how the linker
- should handle duplicate sections. */
-#define SEC_LINK_DUPLICATES 0xc0000
-
- /* This value for SEC_LINK_DUPLICATES means that duplicate
- sections with the same name should simply be discarded. */
-#define SEC_LINK_DUPLICATES_DISCARD 0x0
-
- /* This value for SEC_LINK_DUPLICATES means that the linker
- should warn if there are any duplicate sections, although
- it should still only link one copy. */
-#define SEC_LINK_DUPLICATES_ONE_ONLY 0x40000
-
- /* This value for SEC_LINK_DUPLICATES means that the linker
- should warn if any duplicate sections are a different size. */
-#define SEC_LINK_DUPLICATES_SAME_SIZE 0x80000
-
- /* This value for SEC_LINK_DUPLICATES means that the linker
- should warn if any duplicate sections contain different
- contents. */
-#define SEC_LINK_DUPLICATES_SAME_CONTENTS \
- (SEC_LINK_DUPLICATES_ONE_ONLY | SEC_LINK_DUPLICATES_SAME_SIZE)
-
- /* This section was created by the linker as part of dynamic
- relocation or other arcane processing. It is skipped when
- going through the first-pass output, trusting that someone
- else up the line will take care of it later. */
-#define SEC_LINKER_CREATED 0x100000
-
- /* This section should not be subject to garbage collection.
- Also set to inform the linker that this section should not be
- listed in the link map as discarded. */
-#define SEC_KEEP 0x200000
-
- /* This section contains "short" data, and should be placed
- "near" the GP. */
-#define SEC_SMALL_DATA 0x400000
-
- /* Attempt to merge identical entities in the section.
- Entity size is given in the entsize field. */
-#define SEC_MERGE 0x800000
-
- /* If given with SEC_MERGE, entities to merge are zero terminated
- strings where entsize specifies character size instead of fixed
- size entries. */
-#define SEC_STRINGS 0x1000000
-
- /* This section contains data about section groups. */
-#define SEC_GROUP 0x2000000
-
- /* The section is a COFF shared library section. This flag is
- only for the linker. If this type of section appears in
- the input file, the linker must copy it to the output file
- without changing the vma or size. FIXME: Although this
- was originally intended to be general, it really is COFF
- specific (and the flag was renamed to indicate this). It
- might be cleaner to have some more general mechanism to
- allow the back end to control what the linker does with
- sections. */
-#define SEC_COFF_SHARED_LIBRARY 0x4000000
-
- /* This input section should be copied to output in reverse order
- as an array of pointers. This is for ELF linker internal use
- only. */
-#define SEC_ELF_REVERSE_COPY 0x4000000
-
- /* This section contains data which may be shared with other
- executables or shared objects. This is for COFF only. */
-#define SEC_COFF_SHARED 0x8000000
-
- /* When a section with this flag is being linked, then if the size of
- the input section is less than a page, it should not cross a page
- boundary. If the size of the input section is one page or more,
- it should be aligned on a page boundary. This is for TI
- TMS320C54X only. */
-#define SEC_TIC54X_BLOCK 0x10000000
-
- /* Conditionally link this section; do not link if there are no
- references found to any symbol in the section. This is for TI
- TMS320C54X only. */
-#define SEC_TIC54X_CLINK 0x20000000
-
- /* Indicate that section has the no read flag set. This happens
- when memory read flag isn't set. */
-#define SEC_COFF_NOREAD 0x40000000
-
- /* End of section flags. */
-
- /* Some internal packed boolean fields. */
-
- /* See the vma field. */
- unsigned int user_set_vma : 1;
-
- /* A mark flag used by some of the linker backends. */
- unsigned int linker_mark : 1;
-
- /* Another mark flag used by some of the linker backends. Set for
- output sections that have an input section. */
- unsigned int linker_has_input : 1;
-
- /* Mark flag used by some linker backends for garbage collection. */
- unsigned int gc_mark : 1;
-
- /* Section compression status. */
- unsigned int compress_status : 2;
-#define COMPRESS_SECTION_NONE 0
-#define COMPRESS_SECTION_DONE 1
-#define DECOMPRESS_SECTION_SIZED 2
-
- /* The following flags are used by the ELF linker. */
-
- /* Mark sections which have been allocated to segments. */
- unsigned int segment_mark : 1;
-
- /* Type of sec_info information. */
- unsigned int sec_info_type:3;
-#define SEC_INFO_TYPE_NONE 0
-#define SEC_INFO_TYPE_STABS 1
-#define SEC_INFO_TYPE_MERGE 2
-#define SEC_INFO_TYPE_EH_FRAME 3
-#define SEC_INFO_TYPE_JUST_SYMS 4
-
- /* Nonzero if this section uses RELA relocations, rather than REL. */
- unsigned int use_rela_p:1;
-
- /* Bits used by various backends. The generic code doesn't touch
- these fields. */
-
- unsigned int sec_flg0:1;
- unsigned int sec_flg1:1;
- unsigned int sec_flg2:1;
- unsigned int sec_flg3:1;
- unsigned int sec_flg4:1;
- unsigned int sec_flg5:1;
-
- /* End of internal packed boolean fields. */
-
- /* The virtual memory address of the section - where it will be
- at run time. The symbols are relocated against this. The
- user_set_vma flag is maintained by bfd; if it's not set, the
- backend can assign addresses (for example, in @code{a.out}, where
- the default address for @code{.data} is dependent on the specific
- target and various flags). */
- bfd_vma vma;
-
- /* The load address of the section - where it would be in a
- rom image; really only used for writing section header
- information. */
- bfd_vma lma;
-
- /* The size of the section in octets, as it will be output.
- Contains a value even if the section has no contents (e.g., the
- size of @code{.bss}). */
- bfd_size_type size;
-
- /* For input sections, the original size on disk of the section, in
- octets. This field should be set for any section whose size is
- changed by linker relaxation. It is required for sections where
- the linker relaxation scheme doesn't cache altered section and
- reloc contents (stabs, eh_frame, SEC_MERGE, some coff relaxing
- targets), and thus the original size needs to be kept to read the
- section multiple times. For output sections, rawsize holds the
- section size calculated on a previous linker relaxation pass. */
- bfd_size_type rawsize;
-
- /* The compressed size of the section in octets. */
- bfd_size_type compressed_size;
-
- /* Relaxation table. */
- struct relax_table *relax;
-
- /* Count of used relaxation table entries. */
- int relax_count;
-
-
- /* If this section is going to be output, then this value is the
- offset in *bytes* into the output section of the first byte in the
- input section (byte ==> smallest addressable unit on the
- target). In most cases, if this was going to start at the
- 100th octet (8-bit quantity) in the output section, this value
- would be 100. However, if the target byte size is 16 bits
- (bfd_octets_per_byte is "2"), this value would be 50. */
- bfd_vma output_offset;
-
- /* The output section through which to map on output. */
- struct bfd_section *output_section;
-
- /* The alignment requirement of the section, as an exponent of 2 -
- e.g., 3 aligns to 2^3 (or 8). */
- unsigned int alignment_power;
-
- /* If an input section, a pointer to a vector of relocation
- records for the data in this section. */
- struct reloc_cache_entry *relocation;
-
- /* If an output section, a pointer to a vector of pointers to
- relocation records for the data in this section. */
- struct reloc_cache_entry **orelocation;
-
- /* The number of relocation records in one of the above. */
- unsigned reloc_count;
-
- /* Information below is back end specific - and not always used
- or updated. */
-
- /* File position of section data. */
- file_ptr filepos;
-
- /* File position of relocation info. */
- file_ptr rel_filepos;
-
- /* File position of line data. */
- file_ptr line_filepos;
-
- /* Pointer to data for applications. */
- void *userdata;
-
- /* If the SEC_IN_MEMORY flag is set, this points to the actual
- contents. */
- unsigned char *contents;
-
- /* Attached line number information. */
- alent *lineno;
-
- /* Number of line number records. */
- unsigned int lineno_count;
-
- /* Entity size for merging purposes. */
- unsigned int entsize;
-
- /* Points to the kept section if this section is a link-once section,
- and is discarded. */
- struct bfd_section *kept_section;
-
- /* When a section is being output, this value changes as more
- linenumbers are written out. */
- file_ptr moving_line_filepos;
-
- /* What the section number is in the target world. */
- int target_index;
-
- void *used_by_bfd;
-
- /* If this is a constructor section then here is a list of the
- relocations created to relocate items within it. */
- struct relent_chain *constructor_chain;
-
- /* The BFD which owns the section. */
- bfd *owner;
-
- /* A symbol which points at this section only. */
- struct bfd_symbol *symbol;
- struct bfd_symbol **symbol_ptr_ptr;
-
- /* Early in the link process, map_head and map_tail are used to build
- a list of input sections attached to an output section. Later,
- output sections use these fields for a list of bfd_link_order
- structs. */
- union @{
- struct bfd_link_order *link_order;
- struct bfd_section *s;
- @} map_head, map_tail;
-@} asection;
-
-/* Relax table contains information about instructions which can
- be removed by relaxation -- replacing a long address with a
- short address. */
-struct relax_table @{
- /* Address where bytes may be deleted. */
- bfd_vma addr;
-
- /* Number of bytes to be deleted. */
- int size;
-@};
-
-/* These sections are global, and are managed by BFD. The application
- and target back end are not permitted to change the values in
- these sections. */
-extern asection _bfd_std_section[4];
-
-#define BFD_ABS_SECTION_NAME "*ABS*"
-#define BFD_UND_SECTION_NAME "*UND*"
-#define BFD_COM_SECTION_NAME "*COM*"
-#define BFD_IND_SECTION_NAME "*IND*"
-
-/* Pointer to the common section. */
-#define bfd_com_section_ptr (&_bfd_std_section[0])
-/* Pointer to the undefined section. */
-#define bfd_und_section_ptr (&_bfd_std_section[1])
-/* Pointer to the absolute section. */
-#define bfd_abs_section_ptr (&_bfd_std_section[2])
-/* Pointer to the indirect section. */
-#define bfd_ind_section_ptr (&_bfd_std_section[3])
-
-#define bfd_is_und_section(sec) ((sec) == bfd_und_section_ptr)
-#define bfd_is_abs_section(sec) ((sec) == bfd_abs_section_ptr)
-#define bfd_is_ind_section(sec) ((sec) == bfd_ind_section_ptr)
-
-#define bfd_is_const_section(SEC) \
- ( ((SEC) == bfd_abs_section_ptr) \
- || ((SEC) == bfd_und_section_ptr) \
- || ((SEC) == bfd_com_section_ptr) \
- || ((SEC) == bfd_ind_section_ptr))
-
-/* Macros to handle insertion and deletion of a bfd's sections. These
- only handle the list pointers, ie. do not adjust section_count,
- target_index etc. */
-#define bfd_section_list_remove(ABFD, S) \
- do \
- @{ \
- asection *_s = S; \
- asection *_next = _s->next; \
- asection *_prev = _s->prev; \
- if (_prev) \
- _prev->next = _next; \
- else \
- (ABFD)->sections = _next; \
- if (_next) \
- _next->prev = _prev; \
- else \
- (ABFD)->section_last = _prev; \
- @} \
- while (0)
-#define bfd_section_list_append(ABFD, S) \
- do \
- @{ \
- asection *_s = S; \
- bfd *_abfd = ABFD; \
- _s->next = NULL; \
- if (_abfd->section_last) \
- @{ \
- _s->prev = _abfd->section_last; \
- _abfd->section_last->next = _s; \
- @} \
- else \
- @{ \
- _s->prev = NULL; \
- _abfd->sections = _s; \
- @} \
- _abfd->section_last = _s; \
- @} \
- while (0)
-#define bfd_section_list_prepend(ABFD, S) \
- do \
- @{ \
- asection *_s = S; \
- bfd *_abfd = ABFD; \
- _s->prev = NULL; \
- if (_abfd->sections) \
- @{ \
- _s->next = _abfd->sections; \
- _abfd->sections->prev = _s; \
- @} \
- else \
- @{ \
- _s->next = NULL; \
- _abfd->section_last = _s; \
- @} \
- _abfd->sections = _s; \
- @} \
- while (0)
-#define bfd_section_list_insert_after(ABFD, A, S) \
- do \
- @{ \
- asection *_a = A; \
- asection *_s = S; \
- asection *_next = _a->next; \
- _s->next = _next; \
- _s->prev = _a; \
- _a->next = _s; \
- if (_next) \
- _next->prev = _s; \
- else \
- (ABFD)->section_last = _s; \
- @} \
- while (0)
-#define bfd_section_list_insert_before(ABFD, B, S) \
- do \
- @{ \
- asection *_b = B; \
- asection *_s = S; \
- asection *_prev = _b->prev; \
- _s->prev = _prev; \
- _s->next = _b; \
- _b->prev = _s; \
- if (_prev) \
- _prev->next = _s; \
- else \
- (ABFD)->sections = _s; \
- @} \
- while (0)
-#define bfd_section_removed_from_list(ABFD, S) \
- ((S)->next == NULL ? (ABFD)->section_last != (S) : (S)->next->prev != (S))
-
-#define BFD_FAKE_SECTION(SEC, FLAGS, SYM, NAME, IDX) \
- /* name, id, index, next, prev, flags, user_set_vma, */ \
- @{ NAME, IDX, 0, NULL, NULL, FLAGS, 0, \
- \
- /* linker_mark, linker_has_input, gc_mark, decompress_status, */ \
- 0, 0, 1, 0, \
- \
- /* segment_mark, sec_info_type, use_rela_p, */ \
- 0, 0, 0, \
- \
- /* sec_flg0, sec_flg1, sec_flg2, sec_flg3, sec_flg4, sec_flg5, */ \
- 0, 0, 0, 0, 0, 0, \
- \
- /* vma, lma, size, rawsize, compressed_size, relax, relax_count, */ \
- 0, 0, 0, 0, 0, 0, 0, \
- \
- /* output_offset, output_section, alignment_power, */ \
- 0, &SEC, 0, \
- \
- /* relocation, orelocation, reloc_count, filepos, rel_filepos, */ \
- NULL, NULL, 0, 0, 0, \
- \
- /* line_filepos, userdata, contents, lineno, lineno_count, */ \
- 0, NULL, NULL, NULL, 0, \
- \
- /* entsize, kept_section, moving_line_filepos, */ \
- 0, NULL, 0, \
- \
- /* target_index, used_by_bfd, constructor_chain, owner, */ \
- 0, NULL, NULL, NULL, \
- \
- /* symbol, symbol_ptr_ptr, */ \
- (struct bfd_symbol *) SYM, &SEC.symbol, \
- \
- /* map_head, map_tail */ \
- @{ NULL @}, @{ NULL @} \
- @}
-
-@end example
-
-@node section prototypes, , typedef asection, Sections
-@subsection Section prototypes
-These are the functions exported by the section handling part of BFD.
-
-@findex bfd_section_list_clear
-@subsubsection @code{bfd_section_list_clear}
-@strong{Synopsis}
-@example
-void bfd_section_list_clear (bfd *);
-@end example
-@strong{Description}@*
-Clears the section list, and also resets the section count and
-hash table entries.
-
-@findex bfd_get_section_by_name
-@subsubsection @code{bfd_get_section_by_name}
-@strong{Synopsis}
-@example
-asection *bfd_get_section_by_name (bfd *abfd, const char *name);
-@end example
-@strong{Description}@*
-Return the most recently created section attached to @var{abfd}
-named @var{name}. Return NULL if no such section exists.
-
-@findex bfd_get_next_section_by_name
-@subsubsection @code{bfd_get_next_section_by_name}
-@strong{Synopsis}
-@example
-asection *bfd_get_next_section_by_name (asection *sec);
-@end example
-@strong{Description}@*
-Given @var{sec} is a section returned by @code{bfd_get_section_by_name},
-return the next most recently created section attached to the same
-BFD with the same name. Return NULL if no such section exists.
-
-@findex bfd_get_linker_section
-@subsubsection @code{bfd_get_linker_section}
-@strong{Synopsis}
-@example
-asection *bfd_get_linker_section (bfd *abfd, const char *name);
-@end example
-@strong{Description}@*
-Return the linker created section attached to @var{abfd}
-named @var{name}. Return NULL if no such section exists.
-
-@findex bfd_get_section_by_name_if
-@subsubsection @code{bfd_get_section_by_name_if}
-@strong{Synopsis}
-@example
-asection *bfd_get_section_by_name_if
- (bfd *abfd,
- const char *name,
- bfd_boolean (*func) (bfd *abfd, asection *sect, void *obj),
- void *obj);
-@end example
-@strong{Description}@*
-Call the provided function @var{func} for each section
-attached to the BFD @var{abfd} whose name matches @var{name},
-passing @var{obj} as an argument. The function will be called
-as if by
-
-@example
- func (abfd, the_section, obj);
-@end example
-
-It returns the first section for which @var{func} returns true,
-otherwise @code{NULL}.
-
-@findex bfd_get_unique_section_name
-@subsubsection @code{bfd_get_unique_section_name}
-@strong{Synopsis}
-@example
-char *bfd_get_unique_section_name
- (bfd *abfd, const char *templat, int *count);
-@end example
-@strong{Description}@*
-Invent a section name that is unique in @var{abfd} by tacking
-a dot and a digit suffix onto the original @var{templat}. If
-@var{count} is non-NULL, then it specifies the first number
-tried as a suffix to generate a unique name. The value
-pointed to by @var{count} will be incremented in this case.
-
-@findex bfd_make_section_old_way
-@subsubsection @code{bfd_make_section_old_way}
-@strong{Synopsis}
-@example
-asection *bfd_make_section_old_way (bfd *abfd, const char *name);
-@end example
-@strong{Description}@*
-Create a new empty section called @var{name}
-and attach it to the end of the chain of sections for the
-BFD @var{abfd}. An attempt to create a section with a name which
-is already in use returns its pointer without changing the
-section chain.
-
-It has the funny name since this is the way it used to be
-before it was rewritten....
-
-Possible errors are:
-@itemize @bullet
-
-@item
-@code{bfd_error_invalid_operation} -
-If output has already started for this BFD.
-@item
-@code{bfd_error_no_memory} -
-If memory allocation fails.
-@end itemize
-
-@findex bfd_make_section_anyway_with_flags
-@subsubsection @code{bfd_make_section_anyway_with_flags}
-@strong{Synopsis}
-@example
-asection *bfd_make_section_anyway_with_flags
- (bfd *abfd, const char *name, flagword flags);
-@end example
-@strong{Description}@*
-Create a new empty section called @var{name} and attach it to the end of
-the chain of sections for @var{abfd}. Create a new section even if there
-is already a section with that name. Also set the attributes of the
-new section to the value @var{flags}.
-
-Return @code{NULL} and set @code{bfd_error} on error; possible errors are:
-@itemize @bullet
-
-@item
-@code{bfd_error_invalid_operation} - If output has already started for @var{abfd}.
-@item
-@code{bfd_error_no_memory} - If memory allocation fails.
-@end itemize
-
-@findex bfd_make_section_anyway
-@subsubsection @code{bfd_make_section_anyway}
-@strong{Synopsis}
-@example
-asection *bfd_make_section_anyway (bfd *abfd, const char *name);
-@end example
-@strong{Description}@*
-Create a new empty section called @var{name} and attach it to the end of
-the chain of sections for @var{abfd}. Create a new section even if there
-is already a section with that name.
-
-Return @code{NULL} and set @code{bfd_error} on error; possible errors are:
-@itemize @bullet
-
-@item
-@code{bfd_error_invalid_operation} - If output has already started for @var{abfd}.
-@item
-@code{bfd_error_no_memory} - If memory allocation fails.
-@end itemize
-
-@findex bfd_make_section_with_flags
-@subsubsection @code{bfd_make_section_with_flags}
-@strong{Synopsis}
-@example
-asection *bfd_make_section_with_flags
- (bfd *, const char *name, flagword flags);
-@end example
-@strong{Description}@*
-Like @code{bfd_make_section_anyway}, but return @code{NULL} (without calling
-bfd_set_error ()) without changing the section chain if there is already a
-section named @var{name}. Also set the attributes of the new section to
-the value @var{flags}. If there is an error, return @code{NULL} and set
-@code{bfd_error}.
-
-@findex bfd_make_section
-@subsubsection @code{bfd_make_section}
-@strong{Synopsis}
-@example
-asection *bfd_make_section (bfd *, const char *name);
-@end example
-@strong{Description}@*
-Like @code{bfd_make_section_anyway}, but return @code{NULL} (without calling
-bfd_set_error ()) without changing the section chain if there is already a
-section named @var{name}. If there is an error, return @code{NULL} and set
-@code{bfd_error}.
-
-@findex bfd_set_section_flags
-@subsubsection @code{bfd_set_section_flags}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_set_section_flags
- (bfd *abfd, asection *sec, flagword flags);
-@end example
-@strong{Description}@*
-Set the attributes of the section @var{sec} in the BFD
-@var{abfd} to the value @var{flags}. Return @code{TRUE} on success,
-@code{FALSE} on error. Possible error returns are:
-
-@itemize @bullet
-
-@item
-@code{bfd_error_invalid_operation} -
-The section cannot have one or more of the attributes
-requested. For example, a .bss section in @code{a.out} may not
-have the @code{SEC_HAS_CONTENTS} field set.
-@end itemize
-
-@findex bfd_rename_section
-@subsubsection @code{bfd_rename_section}
-@strong{Synopsis}
-@example
-void bfd_rename_section
- (bfd *abfd, asection *sec, const char *newname);
-@end example
-@strong{Description}@*
-Rename section @var{sec} in @var{abfd} to @var{newname}.
-
-@findex bfd_map_over_sections
-@subsubsection @code{bfd_map_over_sections}
-@strong{Synopsis}
-@example
-void bfd_map_over_sections
- (bfd *abfd,
- void (*func) (bfd *abfd, asection *sect, void *obj),
- void *obj);
-@end example
-@strong{Description}@*
-Call the provided function @var{func} for each section
-attached to the BFD @var{abfd}, passing @var{obj} as an
-argument. The function will be called as if by
-
-@example
- func (abfd, the_section, obj);
-@end example
-
-This is the preferred method for iterating over sections; an
-alternative would be to use a loop:
-
-@example
- asection *p;
- for (p = abfd->sections; p != NULL; p = p->next)
- func (abfd, p, ...)
-@end example
-
-@findex bfd_sections_find_if
-@subsubsection @code{bfd_sections_find_if}
-@strong{Synopsis}
-@example
-asection *bfd_sections_find_if
- (bfd *abfd,
- bfd_boolean (*operation) (bfd *abfd, asection *sect, void *obj),
- void *obj);
-@end example
-@strong{Description}@*
-Call the provided function @var{operation} for each section
-attached to the BFD @var{abfd}, passing @var{obj} as an
-argument. The function will be called as if by
-
-@example
- operation (abfd, the_section, obj);
-@end example
-
-It returns the first section for which @var{operation} returns true.
-
-@findex bfd_set_section_size
-@subsubsection @code{bfd_set_section_size}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_set_section_size
- (bfd *abfd, asection *sec, bfd_size_type val);
-@end example
-@strong{Description}@*
-Set @var{sec} to the size @var{val}. If the operation is
-ok, then @code{TRUE} is returned, else @code{FALSE}.
-
-Possible error returns:
-@itemize @bullet
-
-@item
-@code{bfd_error_invalid_operation} -
-Writing has started to the BFD, so setting the size is invalid.
-@end itemize
-
-@findex bfd_set_section_contents
-@subsubsection @code{bfd_set_section_contents}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_set_section_contents
- (bfd *abfd, asection *section, const void *data,
- file_ptr offset, bfd_size_type count);
-@end example
-@strong{Description}@*
-Sets the contents of the section @var{section} in BFD
-@var{abfd} to the data starting in memory at @var{data}. The
-data is written to the output section starting at offset
-@var{offset} for @var{count} octets.
-
-Normally @code{TRUE} is returned, else @code{FALSE}. Possible error
-returns are:
-@itemize @bullet
-
-@item
-@code{bfd_error_no_contents} -
-The output section does not have the @code{SEC_HAS_CONTENTS}
-attribute, so nothing can be written to it.
-@item
-and some more too
-@end itemize
-This routine is front end to the back end function
-@code{_bfd_set_section_contents}.
-
-@findex bfd_get_section_contents
-@subsubsection @code{bfd_get_section_contents}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_get_section_contents
- (bfd *abfd, asection *section, void *location, file_ptr offset,
- bfd_size_type count);
-@end example
-@strong{Description}@*
-Read data from @var{section} in BFD @var{abfd}
-into memory starting at @var{location}. The data is read at an
-offset of @var{offset} from the start of the input section,
-and is read for @var{count} bytes.
-
-If the contents of a constructor with the @code{SEC_CONSTRUCTOR}
-flag set are requested or if the section does not have the
-@code{SEC_HAS_CONTENTS} flag set, then the @var{location} is filled
-with zeroes. If no errors occur, @code{TRUE} is returned, else
-@code{FALSE}.
-
-@findex bfd_malloc_and_get_section
-@subsubsection @code{bfd_malloc_and_get_section}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_malloc_and_get_section
- (bfd *abfd, asection *section, bfd_byte **buf);
-@end example
-@strong{Description}@*
-Read all data from @var{section} in BFD @var{abfd}
-into a buffer, *@var{buf}, malloc'd by this function.
-
-@findex bfd_copy_private_section_data
-@subsubsection @code{bfd_copy_private_section_data}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_copy_private_section_data
- (bfd *ibfd, asection *isec, bfd *obfd, asection *osec);
-@end example
-@strong{Description}@*
-Copy private section information from @var{isec} in the BFD
-@var{ibfd} to the section @var{osec} in the BFD @var{obfd}.
-Return @code{TRUE} on success, @code{FALSE} on error. Possible error
-returns are:
-
-@itemize @bullet
-
-@item
-@code{bfd_error_no_memory} -
-Not enough memory exists to create private data for @var{osec}.
-@end itemize
-@example
-#define bfd_copy_private_section_data(ibfd, isection, obfd, osection) \
- BFD_SEND (obfd, _bfd_copy_private_section_data, \
- (ibfd, isection, obfd, osection))
-@end example
-
-@findex bfd_generic_is_group_section
-@subsubsection @code{bfd_generic_is_group_section}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_generic_is_group_section (bfd *, const asection *sec);
-@end example
-@strong{Description}@*
-Returns TRUE if @var{sec} is a member of a group.
-
-@findex bfd_generic_discard_group
-@subsubsection @code{bfd_generic_discard_group}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_generic_discard_group (bfd *abfd, asection *group);
-@end example
-@strong{Description}@*
-Remove all members of @var{group} from the output.
-
diff -Nur binutils-2.24.orig/bfd/doc/syms.texi binutils-2.24/bfd/doc/syms.texi
--- binutils-2.24.orig/bfd/doc/syms.texi 2013-11-18 09:49:27.000000000 +0100
+++ binutils-2.24/bfd/doc/syms.texi 1970-01-01 01:00:00.000000000 +0100
@@ -1,480 +0,0 @@
-@section Symbols
-BFD tries to maintain as much symbol information as it can when
-it moves information from file to file. BFD passes information
-to applications though the @code{asymbol} structure. When the
-application requests the symbol table, BFD reads the table in
-the native form and translates parts of it into the internal
-format. To maintain more than the information passed to
-applications, some targets keep some information ``behind the
-scenes'' in a structure only the particular back end knows
-about. For example, the coff back end keeps the original
-symbol table structure as well as the canonical structure when
-a BFD is read in. On output, the coff back end can reconstruct
-the output symbol table so that no information is lost, even
-information unique to coff which BFD doesn't know or
-understand. If a coff symbol table were read, but were written
-through an a.out back end, all the coff specific information
-would be lost. The symbol table of a BFD
-is not necessarily read in until a canonicalize request is
-made. Then the BFD back end fills in a table provided by the
-application with pointers to the canonical information. To
-output symbols, the application provides BFD with a table of
-pointers to pointers to @code{asymbol}s. This allows applications
-like the linker to output a symbol as it was read, since the ``behind
-the scenes'' information will be still available.
-@menu
-* Reading Symbols::
-* Writing Symbols::
-* Mini Symbols::
-* typedef asymbol::
-* symbol handling functions::
-@end menu
-
-@node Reading Symbols, Writing Symbols, Symbols, Symbols
-@subsection Reading symbols
-There are two stages to reading a symbol table from a BFD:
-allocating storage, and the actual reading process. This is an
-excerpt from an application which reads the symbol table:
-
-@example
- long storage_needed;
- asymbol **symbol_table;
- long number_of_symbols;
- long i;
-
- storage_needed = bfd_get_symtab_upper_bound (abfd);
-
- if (storage_needed < 0)
- FAIL
-
- if (storage_needed == 0)
- return;
-
- symbol_table = xmalloc (storage_needed);
- ...
- number_of_symbols =
- bfd_canonicalize_symtab (abfd, symbol_table);
-
- if (number_of_symbols < 0)
- FAIL
-
- for (i = 0; i < number_of_symbols; i++)
- process_symbol (symbol_table[i]);
-@end example
-
-All storage for the symbols themselves is in an objalloc
-connected to the BFD; it is freed when the BFD is closed.
-
-@node Writing Symbols, Mini Symbols, Reading Symbols, Symbols
-@subsection Writing symbols
-Writing of a symbol table is automatic when a BFD open for
-writing is closed. The application attaches a vector of
-pointers to pointers to symbols to the BFD being written, and
-fills in the symbol count. The close and cleanup code reads
-through the table provided and performs all the necessary
-operations. The BFD output code must always be provided with an
-``owned'' symbol: one which has come from another BFD, or one
-which has been created using @code{bfd_make_empty_symbol}. Here is an
-example showing the creation of a symbol table with only one element:
-
-@example
- #include "sysdep.h"
- #include "bfd.h"
- int main (void)
- @{
- bfd *abfd;
- asymbol *ptrs[2];
- asymbol *new;
-
- abfd = bfd_openw ("foo","a.out-sunos-big");
- bfd_set_format (abfd, bfd_object);
- new = bfd_make_empty_symbol (abfd);
- new->name = "dummy_symbol";
- new->section = bfd_make_section_old_way (abfd, ".text");
- new->flags = BSF_GLOBAL;
- new->value = 0x12345;
-
- ptrs[0] = new;
- ptrs[1] = 0;
-
- bfd_set_symtab (abfd, ptrs, 1);
- bfd_close (abfd);
- return 0;
- @}
-
- ./makesym
- nm foo
- 00012345 A dummy_symbol
-@end example
-
-Many formats cannot represent arbitrary symbol information; for
-instance, the @code{a.out} object format does not allow an
-arbitrary number of sections. A symbol pointing to a section
-which is not one of @code{.text}, @code{.data} or @code{.bss} cannot
-be described.
-
-@node Mini Symbols, typedef asymbol, Writing Symbols, Symbols
-@subsection Mini Symbols
-Mini symbols provide read-only access to the symbol table.
-They use less memory space, but require more time to access.
-They can be useful for tools like nm or objdump, which may
-have to handle symbol tables of extremely large executables.
-
-The @code{bfd_read_minisymbols} function will read the symbols
-into memory in an internal form. It will return a @code{void *}
-pointer to a block of memory, a symbol count, and the size of
-each symbol. The pointer is allocated using @code{malloc}, and
-should be freed by the caller when it is no longer needed.
-
-The function @code{bfd_minisymbol_to_symbol} will take a pointer
-to a minisymbol, and a pointer to a structure returned by
-@code{bfd_make_empty_symbol}, and return a @code{asymbol} structure.
-The return value may or may not be the same as the value from
-@code{bfd_make_empty_symbol} which was passed in.
-
-
-@node typedef asymbol, symbol handling functions, Mini Symbols, Symbols
-@subsection typedef asymbol
-An @code{asymbol} has the form:
-
-
-@example
-
-typedef struct bfd_symbol
-@{
- /* A pointer to the BFD which owns the symbol. This information
- is necessary so that a back end can work out what additional
- information (invisible to the application writer) is carried
- with the symbol.
-
- This field is *almost* redundant, since you can use section->owner
- instead, except that some symbols point to the global sections
- bfd_@{abs,com,und@}_section. This could be fixed by making
- these globals be per-bfd (or per-target-flavor). FIXME. */
- struct bfd *the_bfd; /* Use bfd_asymbol_bfd(sym) to access this field. */
-
- /* The text of the symbol. The name is left alone, and not copied; the
- application may not alter it. */
- const char *name;
-
- /* The value of the symbol. This really should be a union of a
- numeric value with a pointer, since some flags indicate that
- a pointer to another symbol is stored here. */
- symvalue value;
-
- /* Attributes of a symbol. */
-#define BSF_NO_FLAGS 0x00
-
- /* The symbol has local scope; @code{static} in @code{C}. The value
- is the offset into the section of the data. */
-#define BSF_LOCAL (1 << 0)
-
- /* The symbol has global scope; initialized data in @code{C}. The
- value is the offset into the section of the data. */
-#define BSF_GLOBAL (1 << 1)
-
- /* The symbol has global scope and is exported. The value is
- the offset into the section of the data. */
-#define BSF_EXPORT BSF_GLOBAL /* No real difference. */
-
- /* A normal C symbol would be one of:
- @code{BSF_LOCAL}, @code{BSF_COMMON}, @code{BSF_UNDEFINED} or
- @code{BSF_GLOBAL}. */
-
- /* The symbol is a debugging record. The value has an arbitrary
- meaning, unless BSF_DEBUGGING_RELOC is also set. */
-#define BSF_DEBUGGING (1 << 2)
-
- /* The symbol denotes a function entry point. Used in ELF,
- perhaps others someday. */
-#define BSF_FUNCTION (1 << 3)
-
- /* Used by the linker. */
-#define BSF_KEEP (1 << 5)
-#define BSF_KEEP_G (1 << 6)
-
- /* A weak global symbol, overridable without warnings by
- a regular global symbol of the same name. */
-#define BSF_WEAK (1 << 7)
-
- /* This symbol was created to point to a section, e.g. ELF's
- STT_SECTION symbols. */
-#define BSF_SECTION_SYM (1 << 8)
-
- /* The symbol used to be a common symbol, but now it is
- allocated. */
-#define BSF_OLD_COMMON (1 << 9)
-
- /* In some files the type of a symbol sometimes alters its
- location in an output file - ie in coff a @code{ISFCN} symbol
- which is also @code{C_EXT} symbol appears where it was
- declared and not at the end of a section. This bit is set
- by the target BFD part to convey this information. */
-#define BSF_NOT_AT_END (1 << 10)
-
- /* Signal that the symbol is the label of constructor section. */
-#define BSF_CONSTRUCTOR (1 << 11)
-
- /* Signal that the symbol is a warning symbol. The name is a
- warning. The name of the next symbol is the one to warn about;
- if a reference is made to a symbol with the same name as the next
- symbol, a warning is issued by the linker. */
-#define BSF_WARNING (1 << 12)
-
- /* Signal that the symbol is indirect. This symbol is an indirect
- pointer to the symbol with the same name as the next symbol. */
-#define BSF_INDIRECT (1 << 13)
-
- /* BSF_FILE marks symbols that contain a file name. This is used
- for ELF STT_FILE symbols. */
-#define BSF_FILE (1 << 14)
-
- /* Symbol is from dynamic linking information. */
-#define BSF_DYNAMIC (1 << 15)
-
- /* The symbol denotes a data object. Used in ELF, and perhaps
- others someday. */
-#define BSF_OBJECT (1 << 16)
-
- /* This symbol is a debugging symbol. The value is the offset
- into the section of the data. BSF_DEBUGGING should be set
- as well. */
-#define BSF_DEBUGGING_RELOC (1 << 17)
-
- /* This symbol is thread local. Used in ELF. */
-#define BSF_THREAD_LOCAL (1 << 18)
-
- /* This symbol represents a complex relocation expression,
- with the expression tree serialized in the symbol name. */
-#define BSF_RELC (1 << 19)
-
- /* This symbol represents a signed complex relocation expression,
- with the expression tree serialized in the symbol name. */
-#define BSF_SRELC (1 << 20)
-
- /* This symbol was created by bfd_get_synthetic_symtab. */
-#define BSF_SYNTHETIC (1 << 21)
-
- /* This symbol is an indirect code object. Unrelated to BSF_INDIRECT.
- The dynamic linker will compute the value of this symbol by
- calling the function that it points to. BSF_FUNCTION must
- also be also set. */
-#define BSF_GNU_INDIRECT_FUNCTION (1 << 22)
- /* This symbol is a globally unique data object. The dynamic linker
- will make sure that in the entire process there is just one symbol
- with this name and type in use. BSF_OBJECT must also be set. */
-#define BSF_GNU_UNIQUE (1 << 23)
-
- flagword flags;
-
- /* A pointer to the section to which this symbol is
- relative. This will always be non NULL, there are special
- sections for undefined and absolute symbols. */
- struct bfd_section *section;
-
- /* Back end special data. */
- union
- @{
- void *p;
- bfd_vma i;
- @}
- udata;
-@}
-asymbol;
-
-@end example
-
-@node symbol handling functions, , typedef asymbol, Symbols
-@subsection Symbol handling functions
-
-
-@findex bfd_get_symtab_upper_bound
-@subsubsection @code{bfd_get_symtab_upper_bound}
-@strong{Description}@*
-Return the number of bytes required to store a vector of pointers
-to @code{asymbols} for all the symbols in the BFD @var{abfd},
-including a terminal NULL pointer. If there are no symbols in
-the BFD, then return 0. If an error occurs, return -1.
-@example
-#define bfd_get_symtab_upper_bound(abfd) \
- BFD_SEND (abfd, _bfd_get_symtab_upper_bound, (abfd))
-
-@end example
-
-@findex bfd_is_local_label
-@subsubsection @code{bfd_is_local_label}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_is_local_label (bfd *abfd, asymbol *sym);
-@end example
-@strong{Description}@*
-Return TRUE if the given symbol @var{sym} in the BFD @var{abfd} is
-a compiler generated local label, else return FALSE.
-
-@findex bfd_is_local_label_name
-@subsubsection @code{bfd_is_local_label_name}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_is_local_label_name (bfd *abfd, const char *name);
-@end example
-@strong{Description}@*
-Return TRUE if a symbol with the name @var{name} in the BFD
-@var{abfd} is a compiler generated local label, else return
-FALSE. This just checks whether the name has the form of a
-local label.
-@example
-#define bfd_is_local_label_name(abfd, name) \
- BFD_SEND (abfd, _bfd_is_local_label_name, (abfd, name))
-
-@end example
-
-@findex bfd_is_target_special_symbol
-@subsubsection @code{bfd_is_target_special_symbol}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_is_target_special_symbol (bfd *abfd, asymbol *sym);
-@end example
-@strong{Description}@*
-Return TRUE iff a symbol @var{sym} in the BFD @var{abfd} is something
-special to the particular target represented by the BFD. Such symbols
-should normally not be mentioned to the user.
-@example
-#define bfd_is_target_special_symbol(abfd, sym) \
- BFD_SEND (abfd, _bfd_is_target_special_symbol, (abfd, sym))
-
-@end example
-
-@findex bfd_canonicalize_symtab
-@subsubsection @code{bfd_canonicalize_symtab}
-@strong{Description}@*
-Read the symbols from the BFD @var{abfd}, and fills in
-the vector @var{location} with pointers to the symbols and
-a trailing NULL.
-Return the actual number of symbol pointers, not
-including the NULL.
-@example
-#define bfd_canonicalize_symtab(abfd, location) \
- BFD_SEND (abfd, _bfd_canonicalize_symtab, (abfd, location))
-
-@end example
-
-@findex bfd_set_symtab
-@subsubsection @code{bfd_set_symtab}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_set_symtab
- (bfd *abfd, asymbol **location, unsigned int count);
-@end example
-@strong{Description}@*
-Arrange that when the output BFD @var{abfd} is closed,
-the table @var{location} of @var{count} pointers to symbols
-will be written.
-
-@findex bfd_print_symbol_vandf
-@subsubsection @code{bfd_print_symbol_vandf}
-@strong{Synopsis}
-@example
-void bfd_print_symbol_vandf (bfd *abfd, void *file, asymbol *symbol);
-@end example
-@strong{Description}@*
-Print the value and flags of the @var{symbol} supplied to the
-stream @var{file}.
-
-@findex bfd_make_empty_symbol
-@subsubsection @code{bfd_make_empty_symbol}
-@strong{Description}@*
-Create a new @code{asymbol} structure for the BFD @var{abfd}
-and return a pointer to it.
-
-This routine is necessary because each back end has private
-information surrounding the @code{asymbol}. Building your own
-@code{asymbol} and pointing to it will not create the private
-information, and will cause problems later on.
-@example
-#define bfd_make_empty_symbol(abfd) \
- BFD_SEND (abfd, _bfd_make_empty_symbol, (abfd))
-
-@end example
-
-@findex _bfd_generic_make_empty_symbol
-@subsubsection @code{_bfd_generic_make_empty_symbol}
-@strong{Synopsis}
-@example
-asymbol *_bfd_generic_make_empty_symbol (bfd *);
-@end example
-@strong{Description}@*
-Create a new @code{asymbol} structure for the BFD @var{abfd}
-and return a pointer to it. Used by core file routines,
-binary back-end and anywhere else where no private info
-is needed.
-
-@findex bfd_make_debug_symbol
-@subsubsection @code{bfd_make_debug_symbol}
-@strong{Description}@*
-Create a new @code{asymbol} structure for the BFD @var{abfd},
-to be used as a debugging symbol. Further details of its use have
-yet to be worked out.
-@example
-#define bfd_make_debug_symbol(abfd,ptr,size) \
- BFD_SEND (abfd, _bfd_make_debug_symbol, (abfd, ptr, size))
-
-@end example
-
-@findex bfd_decode_symclass
-@subsubsection @code{bfd_decode_symclass}
-@strong{Description}@*
-Return a character corresponding to the symbol
-class of @var{symbol}, or '?' for an unknown class.
-
-@strong{Synopsis}
-@example
-int bfd_decode_symclass (asymbol *symbol);
-@end example
-@findex bfd_is_undefined_symclass
-@subsubsection @code{bfd_is_undefined_symclass}
-@strong{Description}@*
-Returns non-zero if the class symbol returned by
-bfd_decode_symclass represents an undefined symbol.
-Returns zero otherwise.
-
-@strong{Synopsis}
-@example
-bfd_boolean bfd_is_undefined_symclass (int symclass);
-@end example
-@findex bfd_symbol_info
-@subsubsection @code{bfd_symbol_info}
-@strong{Description}@*
-Fill in the basic info about symbol that nm needs.
-Additional info may be added by the back-ends after
-calling this function.
-
-@strong{Synopsis}
-@example
-void bfd_symbol_info (asymbol *symbol, symbol_info *ret);
-@end example
-@findex bfd_copy_private_symbol_data
-@subsubsection @code{bfd_copy_private_symbol_data}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_copy_private_symbol_data
- (bfd *ibfd, asymbol *isym, bfd *obfd, asymbol *osym);
-@end example
-@strong{Description}@*
-Copy private symbol information from @var{isym} in the BFD
-@var{ibfd} to the symbol @var{osym} in the BFD @var{obfd}.
-Return @code{TRUE} on success, @code{FALSE} on error. Possible error
-returns are:
-
-@itemize @bullet
-
-@item
-@code{bfd_error_no_memory} -
-Not enough memory exists to create private data for @var{osec}.
-@end itemize
-@example
-#define bfd_copy_private_symbol_data(ibfd, isymbol, obfd, osymbol) \
- BFD_SEND (obfd, _bfd_copy_private_symbol_data, \
- (ibfd, isymbol, obfd, osymbol))
-
-@end example
-
diff -Nur binutils-2.24.orig/bfd/doc/targets.texi binutils-2.24/bfd/doc/targets.texi
--- binutils-2.24.orig/bfd/doc/targets.texi 2013-11-18 09:49:27.000000000 +0100
+++ binutils-2.24/bfd/doc/targets.texi 1970-01-01 01:00:00.000000000 +0100
@@ -1,621 +0,0 @@
-@section Targets
-
-
-@strong{Description}@*
-Each port of BFD to a different machine requires the creation
-of a target back end. All the back end provides to the root
-part of BFD is a structure containing pointers to functions
-which perform certain low level operations on files. BFD
-translates the applications's requests through a pointer into
-calls to the back end routines.
-
-When a file is opened with @code{bfd_openr}, its format and
-target are unknown. BFD uses various mechanisms to determine
-how to interpret the file. The operations performed are:
-
-@itemize @bullet
-
-@item
-Create a BFD by calling the internal routine
-@code{_bfd_new_bfd}, then call @code{bfd_find_target} with the
-target string supplied to @code{bfd_openr} and the new BFD pointer.
-
-@item
-If a null target string was provided to @code{bfd_find_target},
-look up the environment variable @code{GNUTARGET} and use
-that as the target string.
-
-@item
-If the target string is still @code{NULL}, or the target string is
-@code{default}, then use the first item in the target vector
-as the target type, and set @code{target_defaulted} in the BFD to
-cause @code{bfd_check_format} to loop through all the targets.
-@xref{bfd_target}. @xref{Formats}.
-
-@item
-Otherwise, inspect the elements in the target vector
-one by one, until a match on target name is found. When found,
-use it.
-
-@item
-Otherwise return the error @code{bfd_error_invalid_target} to
-@code{bfd_openr}.
-
-@item
-@code{bfd_openr} attempts to open the file using
-@code{bfd_open_file}, and returns the BFD.
-@end itemize
-Once the BFD has been opened and the target selected, the file
-format may be determined. This is done by calling
-@code{bfd_check_format} on the BFD with a suggested format.
-If @code{target_defaulted} has been set, each possible target
-type is tried to see if it recognizes the specified format.
-@code{bfd_check_format} returns @code{TRUE} when the caller guesses right.
-@menu
-* bfd_target::
-@end menu
-
-@node bfd_target, , Targets, Targets
-
-@subsection bfd_target
-
-
-@strong{Description}@*
-This structure contains everything that BFD knows about a
-target. It includes things like its byte order, name, and which
-routines to call to do various operations.
-
-Every BFD points to a target structure with its @code{xvec}
-member.
-
-The macros below are used to dispatch to functions through the
-@code{bfd_target} vector. They are used in a number of macros further
-down in @file{bfd.h}, and are also used when calling various
-routines by hand inside the BFD implementation. The @var{arglist}
-argument must be parenthesized; it contains all the arguments
-to the called function.
-
-They make the documentation (more) unpleasant to read, so if
-someone wants to fix this and not break the above, please do.
-@example
-#define BFD_SEND(bfd, message, arglist) \
- ((*((bfd)->xvec->message)) arglist)
-
-#ifdef DEBUG_BFD_SEND
-#undef BFD_SEND
-#define BFD_SEND(bfd, message, arglist) \
- (((bfd) && (bfd)->xvec && (bfd)->xvec->message) ? \
- ((*((bfd)->xvec->message)) arglist) : \
- (bfd_assert (__FILE__,__LINE__), NULL))
-#endif
-@end example
-For operations which index on the BFD format:
-@example
-#define BFD_SEND_FMT(bfd, message, arglist) \
- (((bfd)->xvec->message[(int) ((bfd)->format)]) arglist)
-
-#ifdef DEBUG_BFD_SEND
-#undef BFD_SEND_FMT
-#define BFD_SEND_FMT(bfd, message, arglist) \
- (((bfd) && (bfd)->xvec && (bfd)->xvec->message) ? \
- (((bfd)->xvec->message[(int) ((bfd)->format)]) arglist) : \
- (bfd_assert (__FILE__,__LINE__), NULL))
-#endif
-
-@end example
-This is the structure which defines the type of BFD this is. The
-@code{xvec} member of the struct @code{bfd} itself points here. Each
-module that implements access to a different target under BFD,
-defines one of these.
-
-FIXME, these names should be rationalised with the names of
-the entry points which call them. Too bad we can't have one
-macro to define them both!
-@example
-enum bfd_flavour
-@{
- bfd_target_unknown_flavour,
- bfd_target_aout_flavour,
- bfd_target_coff_flavour,
- bfd_target_ecoff_flavour,
- bfd_target_xcoff_flavour,
- bfd_target_elf_flavour,
- bfd_target_ieee_flavour,
- bfd_target_nlm_flavour,
- bfd_target_oasys_flavour,
- bfd_target_tekhex_flavour,
- bfd_target_srec_flavour,
- bfd_target_verilog_flavour,
- bfd_target_ihex_flavour,
- bfd_target_som_flavour,
- bfd_target_os9k_flavour,
- bfd_target_versados_flavour,
- bfd_target_msdos_flavour,
- bfd_target_ovax_flavour,
- bfd_target_evax_flavour,
- bfd_target_mmo_flavour,
- bfd_target_mach_o_flavour,
- bfd_target_pef_flavour,
- bfd_target_pef_xlib_flavour,
- bfd_target_sym_flavour
-@};
-
-enum bfd_endian @{ BFD_ENDIAN_BIG, BFD_ENDIAN_LITTLE, BFD_ENDIAN_UNKNOWN @};
-
-/* Forward declaration. */
-typedef struct bfd_link_info _bfd_link_info;
-
-/* Forward declaration. */
-typedef struct flag_info flag_info;
-
-typedef struct bfd_target
-@{
- /* Identifies the kind of target, e.g., SunOS4, Ultrix, etc. */
- char *name;
-
- /* The "flavour" of a back end is a general indication about
- the contents of a file. */
- enum bfd_flavour flavour;
-
- /* The order of bytes within the data area of a file. */
- enum bfd_endian byteorder;
-
- /* The order of bytes within the header parts of a file. */
- enum bfd_endian header_byteorder;
-
- /* A mask of all the flags which an executable may have set -
- from the set @code{BFD_NO_FLAGS}, @code{HAS_RELOC}, ...@code{D_PAGED}. */
- flagword object_flags;
-
- /* A mask of all the flags which a section may have set - from
- the set @code{SEC_NO_FLAGS}, @code{SEC_ALLOC}, ...@code{SET_NEVER_LOAD}. */
- flagword section_flags;
-
- /* The character normally found at the front of a symbol.
- (if any), perhaps `_'. */
- char symbol_leading_char;
-
- /* The pad character for file names within an archive header. */
- char ar_pad_char;
-
- /* The maximum number of characters in an archive header. */
- unsigned char ar_max_namelen;
-
- /* How well this target matches, used to select between various
- possible targets when more than one target matches. */
- unsigned char match_priority;
-
- /* Entries for byte swapping for data. These are different from the
- other entry points, since they don't take a BFD as the first argument.
- Certain other handlers could do the same. */
- bfd_uint64_t (*bfd_getx64) (const void *);
- bfd_int64_t (*bfd_getx_signed_64) (const void *);
- void (*bfd_putx64) (bfd_uint64_t, void *);
- bfd_vma (*bfd_getx32) (const void *);
- bfd_signed_vma (*bfd_getx_signed_32) (const void *);
- void (*bfd_putx32) (bfd_vma, void *);
- bfd_vma (*bfd_getx16) (const void *);
- bfd_signed_vma (*bfd_getx_signed_16) (const void *);
- void (*bfd_putx16) (bfd_vma, void *);
-
- /* Byte swapping for the headers. */
- bfd_uint64_t (*bfd_h_getx64) (const void *);
- bfd_int64_t (*bfd_h_getx_signed_64) (const void *);
- void (*bfd_h_putx64) (bfd_uint64_t, void *);
- bfd_vma (*bfd_h_getx32) (const void *);
- bfd_signed_vma (*bfd_h_getx_signed_32) (const void *);
- void (*bfd_h_putx32) (bfd_vma, void *);
- bfd_vma (*bfd_h_getx16) (const void *);
- bfd_signed_vma (*bfd_h_getx_signed_16) (const void *);
- void (*bfd_h_putx16) (bfd_vma, void *);
-
- /* Format dependent routines: these are vectors of entry points
- within the target vector structure, one for each format to check. */
-
- /* Check the format of a file being read. Return a @code{bfd_target *} or zero. */
- const struct bfd_target *(*_bfd_check_format[bfd_type_end]) (bfd *);
-
- /* Set the format of a file being written. */
- bfd_boolean (*_bfd_set_format[bfd_type_end]) (bfd *);
-
- /* Write cached information into a file being written, at @code{bfd_close}. */
- bfd_boolean (*_bfd_write_contents[bfd_type_end]) (bfd *);
-
-@end example
-The general target vector. These vectors are initialized using the
-BFD_JUMP_TABLE macros.
-@example
-
- /* Generic entry points. */
-#define BFD_JUMP_TABLE_GENERIC(NAME) \
- NAME##_close_and_cleanup, \
- NAME##_bfd_free_cached_info, \
- NAME##_new_section_hook, \
- NAME##_get_section_contents, \
- NAME##_get_section_contents_in_window
-
- /* Called when the BFD is being closed to do any necessary cleanup. */
- bfd_boolean (*_close_and_cleanup) (bfd *);
- /* Ask the BFD to free all cached information. */
- bfd_boolean (*_bfd_free_cached_info) (bfd *);
- /* Called when a new section is created. */
- bfd_boolean (*_new_section_hook) (bfd *, sec_ptr);
- /* Read the contents of a section. */
- bfd_boolean (*_bfd_get_section_contents)
- (bfd *, sec_ptr, void *, file_ptr, bfd_size_type);
- bfd_boolean (*_bfd_get_section_contents_in_window)
- (bfd *, sec_ptr, bfd_window *, file_ptr, bfd_size_type);
-
- /* Entry points to copy private data. */
-#define BFD_JUMP_TABLE_COPY(NAME) \
- NAME##_bfd_copy_private_bfd_data, \
- NAME##_bfd_merge_private_bfd_data, \
- _bfd_generic_init_private_section_data, \
- NAME##_bfd_copy_private_section_data, \
- NAME##_bfd_copy_private_symbol_data, \
- NAME##_bfd_copy_private_header_data, \
- NAME##_bfd_set_private_flags, \
- NAME##_bfd_print_private_bfd_data
-
- /* Called to copy BFD general private data from one object file
- to another. */
- bfd_boolean (*_bfd_copy_private_bfd_data) (bfd *, bfd *);
- /* Called to merge BFD general private data from one object file
- to a common output file when linking. */
- bfd_boolean (*_bfd_merge_private_bfd_data) (bfd *, bfd *);
- /* Called to initialize BFD private section data from one object file
- to another. */
-#define bfd_init_private_section_data(ibfd, isec, obfd, osec, link_info) \
- BFD_SEND (obfd, _bfd_init_private_section_data, (ibfd, isec, obfd, osec, link_info))
- bfd_boolean (*_bfd_init_private_section_data)
- (bfd *, sec_ptr, bfd *, sec_ptr, struct bfd_link_info *);
- /* Called to copy BFD private section data from one object file
- to another. */
- bfd_boolean (*_bfd_copy_private_section_data)
- (bfd *, sec_ptr, bfd *, sec_ptr);
- /* Called to copy BFD private symbol data from one symbol
- to another. */
- bfd_boolean (*_bfd_copy_private_symbol_data)
- (bfd *, asymbol *, bfd *, asymbol *);
- /* Called to copy BFD private header data from one object file
- to another. */
- bfd_boolean (*_bfd_copy_private_header_data)
- (bfd *, bfd *);
- /* Called to set private backend flags. */
- bfd_boolean (*_bfd_set_private_flags) (bfd *, flagword);
-
- /* Called to print private BFD data. */
- bfd_boolean (*_bfd_print_private_bfd_data) (bfd *, void *);
-
- /* Core file entry points. */
-#define BFD_JUMP_TABLE_CORE(NAME) \
- NAME##_core_file_failing_command, \
- NAME##_core_file_failing_signal, \
- NAME##_core_file_matches_executable_p, \
- NAME##_core_file_pid
-
- char * (*_core_file_failing_command) (bfd *);
- int (*_core_file_failing_signal) (bfd *);
- bfd_boolean (*_core_file_matches_executable_p) (bfd *, bfd *);
- int (*_core_file_pid) (bfd *);
-
- /* Archive entry points. */
-#define BFD_JUMP_TABLE_ARCHIVE(NAME) \
- NAME##_slurp_armap, \
- NAME##_slurp_extended_name_table, \
- NAME##_construct_extended_name_table, \
- NAME##_truncate_arname, \
- NAME##_write_armap, \
- NAME##_read_ar_hdr, \
- NAME##_write_ar_hdr, \
- NAME##_openr_next_archived_file, \
- NAME##_get_elt_at_index, \
- NAME##_generic_stat_arch_elt, \
- NAME##_update_armap_timestamp
-
- bfd_boolean (*_bfd_slurp_armap) (bfd *);
- bfd_boolean (*_bfd_slurp_extended_name_table) (bfd *);
- bfd_boolean (*_bfd_construct_extended_name_table)
- (bfd *, char **, bfd_size_type *, const char **);
- void (*_bfd_truncate_arname) (bfd *, const char *, char *);
- bfd_boolean (*write_armap)
- (bfd *, unsigned int, struct orl *, unsigned int, int);
- void * (*_bfd_read_ar_hdr_fn) (bfd *);
- bfd_boolean (*_bfd_write_ar_hdr_fn) (bfd *, bfd *);
- bfd * (*openr_next_archived_file) (bfd *, bfd *);
-#define bfd_get_elt_at_index(b,i) BFD_SEND (b, _bfd_get_elt_at_index, (b,i))
- bfd * (*_bfd_get_elt_at_index) (bfd *, symindex);
- int (*_bfd_stat_arch_elt) (bfd *, struct stat *);
- bfd_boolean (*_bfd_update_armap_timestamp) (bfd *);
-
- /* Entry points used for symbols. */
-#define BFD_JUMP_TABLE_SYMBOLS(NAME) \
- NAME##_get_symtab_upper_bound, \
- NAME##_canonicalize_symtab, \
- NAME##_make_empty_symbol, \
- NAME##_print_symbol, \
- NAME##_get_symbol_info, \
- NAME##_bfd_is_local_label_name, \
- NAME##_bfd_is_target_special_symbol, \
- NAME##_get_lineno, \
- NAME##_find_nearest_line, \
- _bfd_generic_find_nearest_line_discriminator, \
- _bfd_generic_find_line, \
- NAME##_find_inliner_info, \
- NAME##_bfd_make_debug_symbol, \
- NAME##_read_minisymbols, \
- NAME##_minisymbol_to_symbol
-
- long (*_bfd_get_symtab_upper_bound) (bfd *);
- long (*_bfd_canonicalize_symtab)
- (bfd *, struct bfd_symbol **);
- struct bfd_symbol *
- (*_bfd_make_empty_symbol) (bfd *);
- void (*_bfd_print_symbol)
- (bfd *, void *, struct bfd_symbol *, bfd_print_symbol_type);
-#define bfd_print_symbol(b,p,s,e) BFD_SEND (b, _bfd_print_symbol, (b,p,s,e))
- void (*_bfd_get_symbol_info)
- (bfd *, struct bfd_symbol *, symbol_info *);
-#define bfd_get_symbol_info(b,p,e) BFD_SEND (b, _bfd_get_symbol_info, (b,p,e))
- bfd_boolean (*_bfd_is_local_label_name) (bfd *, const char *);
- bfd_boolean (*_bfd_is_target_special_symbol) (bfd *, asymbol *);
- alent * (*_get_lineno) (bfd *, struct bfd_symbol *);
- bfd_boolean (*_bfd_find_nearest_line)
- (bfd *, struct bfd_section *, struct bfd_symbol **, bfd_vma,
- const char **, const char **, unsigned int *);
- bfd_boolean (*_bfd_find_nearest_line_discriminator)
- (bfd *, struct bfd_section *, struct bfd_symbol **, bfd_vma,
- const char **, const char **, unsigned int *, unsigned int *);
- bfd_boolean (*_bfd_find_line)
- (bfd *, struct bfd_symbol **, struct bfd_symbol *,
- const char **, unsigned int *);
- bfd_boolean (*_bfd_find_inliner_info)
- (bfd *, const char **, const char **, unsigned int *);
- /* Back-door to allow format-aware applications to create debug symbols
- while using BFD for everything else. Currently used by the assembler
- when creating COFF files. */
- asymbol * (*_bfd_make_debug_symbol)
- (bfd *, void *, unsigned long size);
-#define bfd_read_minisymbols(b, d, m, s) \
- BFD_SEND (b, _read_minisymbols, (b, d, m, s))
- long (*_read_minisymbols)
- (bfd *, bfd_boolean, void **, unsigned int *);
-#define bfd_minisymbol_to_symbol(b, d, m, f) \
- BFD_SEND (b, _minisymbol_to_symbol, (b, d, m, f))
- asymbol * (*_minisymbol_to_symbol)
- (bfd *, bfd_boolean, const void *, asymbol *);
-
- /* Routines for relocs. */
-#define BFD_JUMP_TABLE_RELOCS(NAME) \
- NAME##_get_reloc_upper_bound, \
- NAME##_canonicalize_reloc, \
- NAME##_bfd_reloc_type_lookup, \
- NAME##_bfd_reloc_name_lookup
-
- long (*_get_reloc_upper_bound) (bfd *, sec_ptr);
- long (*_bfd_canonicalize_reloc)
- (bfd *, sec_ptr, arelent **, struct bfd_symbol **);
- /* See documentation on reloc types. */
- reloc_howto_type *
- (*reloc_type_lookup) (bfd *, bfd_reloc_code_real_type);
- reloc_howto_type *
- (*reloc_name_lookup) (bfd *, const char *);
-
-
- /* Routines used when writing an object file. */
-#define BFD_JUMP_TABLE_WRITE(NAME) \
- NAME##_set_arch_mach, \
- NAME##_set_section_contents
-
- bfd_boolean (*_bfd_set_arch_mach)
- (bfd *, enum bfd_architecture, unsigned long);
- bfd_boolean (*_bfd_set_section_contents)
- (bfd *, sec_ptr, const void *, file_ptr, bfd_size_type);
-
- /* Routines used by the linker. */
-#define BFD_JUMP_TABLE_LINK(NAME) \
- NAME##_sizeof_headers, \
- NAME##_bfd_get_relocated_section_contents, \
- NAME##_bfd_relax_section, \
- NAME##_bfd_link_hash_table_create, \
- NAME##_bfd_link_hash_table_free, \
- NAME##_bfd_link_add_symbols, \
- NAME##_bfd_link_just_syms, \
- NAME##_bfd_copy_link_hash_symbol_type, \
- NAME##_bfd_final_link, \
- NAME##_bfd_link_split_section, \
- NAME##_bfd_gc_sections, \
- NAME##_bfd_lookup_section_flags, \
- NAME##_bfd_merge_sections, \
- NAME##_bfd_is_group_section, \
- NAME##_bfd_discard_group, \
- NAME##_section_already_linked, \
- NAME##_bfd_define_common_symbol
-
- int (*_bfd_sizeof_headers) (bfd *, struct bfd_link_info *);
- bfd_byte * (*_bfd_get_relocated_section_contents)
- (bfd *, struct bfd_link_info *, struct bfd_link_order *,
- bfd_byte *, bfd_boolean, struct bfd_symbol **);
-
- bfd_boolean (*_bfd_relax_section)
- (bfd *, struct bfd_section *, struct bfd_link_info *, bfd_boolean *);
-
- /* Create a hash table for the linker. Different backends store
- different information in this table. */
- struct bfd_link_hash_table *
- (*_bfd_link_hash_table_create) (bfd *);
-
- /* Release the memory associated with the linker hash table. */
- void (*_bfd_link_hash_table_free) (struct bfd_link_hash_table *);
-
- /* Add symbols from this object file into the hash table. */
- bfd_boolean (*_bfd_link_add_symbols) (bfd *, struct bfd_link_info *);
-
- /* Indicate that we are only retrieving symbol values from this section. */
- void (*_bfd_link_just_syms) (asection *, struct bfd_link_info *);
-
- /* Copy the symbol type of a linker hash table entry. */
-#define bfd_copy_link_hash_symbol_type(b, t, f) \
- BFD_SEND (b, _bfd_copy_link_hash_symbol_type, (b, t, f))
- void (*_bfd_copy_link_hash_symbol_type)
- (bfd *, struct bfd_link_hash_entry *, struct bfd_link_hash_entry *);
-
- /* Do a link based on the link_order structures attached to each
- section of the BFD. */
- bfd_boolean (*_bfd_final_link) (bfd *, struct bfd_link_info *);
-
- /* Should this section be split up into smaller pieces during linking. */
- bfd_boolean (*_bfd_link_split_section) (bfd *, struct bfd_section *);
-
- /* Remove sections that are not referenced from the output. */
- bfd_boolean (*_bfd_gc_sections) (bfd *, struct bfd_link_info *);
-
- /* Sets the bitmask of allowed and disallowed section flags. */
- bfd_boolean (*_bfd_lookup_section_flags) (struct bfd_link_info *,
- struct flag_info *,
- asection *);
-
- /* Attempt to merge SEC_MERGE sections. */
- bfd_boolean (*_bfd_merge_sections) (bfd *, struct bfd_link_info *);
-
- /* Is this section a member of a group? */
- bfd_boolean (*_bfd_is_group_section) (bfd *, const struct bfd_section *);
-
- /* Discard members of a group. */
- bfd_boolean (*_bfd_discard_group) (bfd *, struct bfd_section *);
-
- /* Check if SEC has been already linked during a reloceatable or
- final link. */
- bfd_boolean (*_section_already_linked) (bfd *, asection *,
- struct bfd_link_info *);
-
- /* Define a common symbol. */
- bfd_boolean (*_bfd_define_common_symbol) (bfd *, struct bfd_link_info *,
- struct bfd_link_hash_entry *);
-
- /* Routines to handle dynamic symbols and relocs. */
-#define BFD_JUMP_TABLE_DYNAMIC(NAME) \
- NAME##_get_dynamic_symtab_upper_bound, \
- NAME##_canonicalize_dynamic_symtab, \
- NAME##_get_synthetic_symtab, \
- NAME##_get_dynamic_reloc_upper_bound, \
- NAME##_canonicalize_dynamic_reloc
-
- /* Get the amount of memory required to hold the dynamic symbols. */
- long (*_bfd_get_dynamic_symtab_upper_bound) (bfd *);
- /* Read in the dynamic symbols. */
- long (*_bfd_canonicalize_dynamic_symtab)
- (bfd *, struct bfd_symbol **);
- /* Create synthetized symbols. */
- long (*_bfd_get_synthetic_symtab)
- (bfd *, long, struct bfd_symbol **, long, struct bfd_symbol **,
- struct bfd_symbol **);
- /* Get the amount of memory required to hold the dynamic relocs. */
- long (*_bfd_get_dynamic_reloc_upper_bound) (bfd *);
- /* Read in the dynamic relocs. */
- long (*_bfd_canonicalize_dynamic_reloc)
- (bfd *, arelent **, struct bfd_symbol **);
-
-@end example
-A pointer to an alternative bfd_target in case the current one is not
-satisfactory. This can happen when the target cpu supports both big
-and little endian code, and target chosen by the linker has the wrong
-endianness. The function open_output() in ld/ldlang.c uses this field
-to find an alternative output format that is suitable.
-@example
- /* Opposite endian version of this target. */
- const struct bfd_target * alternative_target;
-
- /* Data for use by back-end routines, which isn't
- generic enough to belong in this structure. */
- const void *backend_data;
-
-@} bfd_target;
-
-@end example
-
-@findex bfd_set_default_target
-@subsubsection @code{bfd_set_default_target}
-@strong{Synopsis}
-@example
-bfd_boolean bfd_set_default_target (const char *name);
-@end example
-@strong{Description}@*
-Set the default target vector to use when recognizing a BFD.
-This takes the name of the target, which may be a BFD target
-name or a configuration triplet.
-
-@findex bfd_find_target
-@subsubsection @code{bfd_find_target}
-@strong{Synopsis}
-@example
-const bfd_target *bfd_find_target (const char *target_name, bfd *abfd);
-@end example
-@strong{Description}@*
-Return a pointer to the transfer vector for the object target
-named @var{target_name}. If @var{target_name} is @code{NULL},
-choose the one in the environment variable @code{GNUTARGET}; if
-that is null or not defined, then choose the first entry in the
-target list. Passing in the string "default" or setting the
-environment variable to "default" will cause the first entry in
-the target list to be returned, and "target_defaulted" will be
-set in the BFD if @var{abfd} isn't @code{NULL}. This causes
-@code{bfd_check_format} to loop over all the targets to find the
-one that matches the file being read.
-
-@findex bfd_get_target_info
-@subsubsection @code{bfd_get_target_info}
-@strong{Synopsis}
-@example
-const bfd_target *bfd_get_target_info (const char *target_name,
- bfd *abfd,
- bfd_boolean *is_bigendian,
- int *underscoring,
- const char **def_target_arch);
-@end example
-@strong{Description}@*
-Return a pointer to the transfer vector for the object target
-named @var{target_name}. If @var{target_name} is @code{NULL},
-choose the one in the environment variable @code{GNUTARGET}; if
-that is null or not defined, then choose the first entry in the
-target list. Passing in the string "default" or setting the
-environment variable to "default" will cause the first entry in
-the target list to be returned, and "target_defaulted" will be
-set in the BFD if @var{abfd} isn't @code{NULL}. This causes
-@code{bfd_check_format} to loop over all the targets to find the
-one that matches the file being read.
-If @var{is_bigendian} is not @code{NULL}, then set this value to target's
-endian mode. True for big-endian, FALSE for little-endian or for
-invalid target.
-If @var{underscoring} is not @code{NULL}, then set this value to target's
-underscoring mode. Zero for none-underscoring, -1 for invalid target,
-else the value of target vector's symbol underscoring.
-If @var{def_target_arch} is not @code{NULL}, then set it to the architecture
-string specified by the target_name.
-
-@findex bfd_target_list
-@subsubsection @code{bfd_target_list}
-@strong{Synopsis}
-@example
-const char ** bfd_target_list (void);
-@end example
-@strong{Description}@*
-Return a freshly malloced NULL-terminated
-vector of the names of all the valid BFD targets. Do not
-modify the names.
-
-@findex bfd_seach_for_target
-@subsubsection @code{bfd_seach_for_target}
-@strong{Synopsis}
-@example
-const bfd_target *bfd_search_for_target
- (int (*search_func) (const bfd_target *, void *),
- void *);
-@end example
-@strong{Description}@*
-Return a pointer to the first transfer vector in the list of
-transfer vectors maintained by BFD that produces a non-zero
-result when passed to the function @var{search_func}. The
-parameter @var{data} is passed, unexamined, to the search
-function.
-
diff -Nur binutils-2.24.orig/bfd/elf32-nds32.c binutils-2.24/bfd/elf32-nds32.c
--- binutils-2.24.orig/bfd/elf32-nds32.c 1970-01-01 01:00:00.000000000 +0100
+++ binutils-2.24/bfd/elf32-nds32.c 2024-05-17 16:16:15.000091142 +0200
@@ -0,0 +1,20274 @@
+/* NDS32-specific support for 32-bit ELF.
+ Copyright (C) 2012-2013 Free Software Foundation, Inc.
+ Contributed by Andes Technology Corporation.
+
+ This file is part of BFD, the Binary File Descriptor library.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+ 02110-1301, USA.*/
+
+
+#include "sysdep.h"
+#include "bfd.h"
+#include "bfd_stdint.h"
+#include "bfdlink.h"
+#include "libbfd.h"
+#include "elf-bfd.h"
+#include "libiberty.h"
+#include "bfd_stdint.h"
+#include "elf/nds32.h"
+#include "opcode/nds32.h"
+#include "elf32-nds32.h"
+#include "opcode/cgen.h"
+#include "../opcodes/nds32-opc.h"
+
+/* Relocation HOWTO functions. */
+static bfd_reloc_status_type nds32_elf_ignore_reloc
+ (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
+static bfd_reloc_status_type nds32_elf_9_pcrel_reloc
+ (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
+static bfd_reloc_status_type nds32_elf_hi20_reloc
+ (bfd *, arelent *, asymbol *, void *,
+ asection *, bfd *, char **);
+static bfd_reloc_status_type nds32_elf_lo12_reloc
+ (bfd *, arelent *, asymbol *, void *,
+ asection *, bfd *, char **);
+static bfd_reloc_status_type nds32_elf_generic_reloc
+ (bfd *, arelent *, asymbol *, void *,
+ asection *, bfd *, char **);
+static bfd_reloc_status_type nds32_elf_sda15_reloc
+ (bfd *, arelent *, asymbol *, void *,
+ asection *, bfd *, char **);
+
+/* Helper functions for HOWTO. */
+static bfd_reloc_status_type nds32_elf_do_9_pcrel_reloc
+ (bfd *, reloc_howto_type *, asection *, bfd_byte *, bfd_vma,
+ asection *, bfd_vma, bfd_vma);
+static void nds32_elf_relocate_hi20
+ (bfd *, int, Elf_Internal_Rela *, Elf_Internal_Rela *, bfd_byte *, bfd_vma);
+static reloc_howto_type *bfd_elf32_bfd_reloc_type_table_lookup
+ (enum elf_nds32_reloc_type);
+static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup
+ (bfd *, bfd_reloc_code_real_type);
+
+/* Target hooks. */
+static void nds32_info_to_howto_rel
+ (bfd *, arelent *, Elf_Internal_Rela *dst);
+static void nds32_info_to_howto
+ (bfd *, arelent *, Elf_Internal_Rela *dst);
+static bfd_boolean nds32_elf_add_symbol_hook
+ (bfd *, struct bfd_link_info *, Elf_Internal_Sym *, const char **,
+ flagword *, asection **, bfd_vma *);
+static bfd_boolean nds32_elf_relocate_section
+ (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
+ Elf_Internal_Rela *, Elf_Internal_Sym *, asection **);
+static bfd_boolean nds32_elf_object_p (bfd *);
+static void nds32_elf_final_write_processing (bfd *, bfd_boolean);
+static bfd_boolean nds32_elf_set_private_flags (bfd *, flagword);
+static bfd_boolean nds32_elf_merge_private_bfd_data (bfd *, bfd *);
+static bfd_boolean nds32_elf_print_private_bfd_data (bfd *, void *);
+static bfd_boolean nds32_elf_gc_sweep_hook
+ (bfd *, struct bfd_link_info *, asection *, const Elf_Internal_Rela *);
+static bfd_boolean nds32_elf_check_relocs
+ (bfd *, struct bfd_link_info *, asection *, const Elf_Internal_Rela *);
+static asection *nds32_elf_gc_mark_hook
+ (asection *, struct bfd_link_info *, Elf_Internal_Rela *,
+ struct elf_link_hash_entry *, Elf_Internal_Sym *);
+static bfd_boolean nds32_elf_adjust_dynamic_symbol
+ (struct bfd_link_info *, struct elf_link_hash_entry *);
+static bfd_boolean nds32_elf_size_dynamic_sections
+ (bfd *, struct bfd_link_info *);
+static bfd_boolean nds32_elf_create_dynamic_sections
+ (bfd *, struct bfd_link_info *);
+static bfd_boolean nds32_elf_finish_dynamic_sections
+ (bfd *, struct bfd_link_info *info);
+static bfd_boolean nds32_elf_finish_dynamic_symbol
+ (bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
+ Elf_Internal_Sym *);
+static bfd_boolean nds32_elf_mkobject (bfd *);
+
+/* Nds32 helper functions. */
+static bfd_reloc_status_type nds32_elf_final_sda_base
+ (bfd *, struct bfd_link_info *, bfd_vma *, bfd_boolean);
+static bfd_boolean allocate_dynrelocs (struct elf_link_hash_entry *, void *);
+static bfd_boolean readonly_dynrelocs (struct elf_link_hash_entry *, void *);
+static Elf_Internal_Rela *find_relocs_at_address
+ (Elf_Internal_Rela *, Elf_Internal_Rela *,
+ Elf_Internal_Rela *, enum elf_nds32_reloc_type);
+static bfd_vma calculate_memory_address
+(bfd *, Elf_Internal_Rela *, Elf_Internal_Sym *, Elf_Internal_Shdr *);
+static int nds32_get_section_contents (bfd *, asection *,
+ bfd_byte **, bfd_boolean);
+static int nds32_elf_ex9_init (void);
+static bfd_boolean nds32_elf_ex9_build_hash_table
+(bfd *, asection *, struct bfd_link_info *);
+static bfd_boolean nds32_elf_ex9_itb_base (struct bfd_link_info *);
+static void nds32_elf_ex9_import_table (struct bfd_link_info *);
+static void nds32_elf_ex9_finish (struct bfd_link_info *);
+static void nds32_elf_ex9_reloc_jmp (struct bfd_link_info *);
+static void nds32_elf_get_insn_with_reg
+ (Elf_Internal_Rela *, uint32_t, uint32_t *);
+static int nds32_get_local_syms (bfd *, asection *ATTRIBUTE_UNUSED,
+ Elf_Internal_Sym **);
+static bfd_boolean nds32_elf_ex9_replace_instruction
+ (struct bfd_link_info *, bfd *, asection *);
+static int nds32_elf_ifc_init (void);
+static bfd_boolean nds32_elf_ifc_calc (struct bfd_link_info *, bfd *,
+ asection *);
+static void nds32_elf_ifc_cse_algo (struct bfd_link_info *);
+static bfd_boolean nds32_elf_ifc_finish (struct bfd_link_info *);
+static bfd_boolean nds32_elf_ifc_replace (struct bfd_link_info *);
+static bfd_boolean nds32_elf_ifc_trace_code (struct bfd_link_info *,
+ bfd *,asection *);
+static bfd_boolean nds32_elf_ifc_reloc (void);
+static bfd_boolean nds32_relax_fp_as_gp
+ (struct bfd_link_info *link_info, bfd *abfd, asection *sec,
+ Elf_Internal_Rela *internal_relocs, Elf_Internal_Rela *irelend,
+ Elf_Internal_Sym *isymbuf);
+static bfd_boolean nds32_fag_remove_unused_fpbase
+ (bfd *abfd, asection *sec, Elf_Internal_Rela *internal_relocs,
+ Elf_Internal_Rela *irelend);
+static bfd_byte*
+nds32_elf_get_relocated_section_contents (bfd *abfd,
+ struct bfd_link_info *link_info,
+ struct bfd_link_order *link_order,
+ bfd_byte *data,
+ bfd_boolean relocatable,
+ asymbol **symbols);
+static void nds32_elf_ict_hash_init (void);
+static void nds32_elf_ict_relocate (struct bfd_link_info *);
+static asection*
+nds32_elf_get_target_section (struct bfd_link_info *, char *);
+
+enum
+{
+ MACH_V1 = bfd_mach_n1h,
+ MACH_V2 = bfd_mach_n1h_v2,
+ MACH_V3 = bfd_mach_n1h_v3,
+ MACH_V3M = bfd_mach_n1h_v3m,
+};
+
+#define MIN(a, b) ((a) > (b) ? (b) : (a))
+#define MAX(a, b) ((a) > (b) ? (a) : (b))
+
+/* True if insn is 4byte. */
+#define INSN_32BIT(insn) ((((insn) & 0x80000000) == 0 ? (TRUE) : (FALSE)))
+
+/* The name of the dynamic interpreter. This is put in the .interp
+ section. */
+#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
+
+/**/
+#define NDS32_GUARD_SEC_P(flags) ((flags) & SEC_ALLOC \
+ && (flags) & SEC_LOAD \
+ && (flags) & SEC_READONLY)
+
+/* The nop opcode we use. */
+#define NDS32_NOP32 0x40000009
+#define NDS32_NOP16 0x9200
+
+/* The size in bytes of an entry in the procedure linkage table. */
+#define PLT_ENTRY_SIZE 24
+#define PLT_HEADER_SIZE 24
+
+/* The first entry in a procedure linkage table are reserved,
+ and the initial contents are unimportant (we zero them out).
+ Subsequent entries look like this. */
+#define PLT0_ENTRY_WORD0 0x46f00000 /* sethi r15, HI20(.got+4) */
+#define PLT0_ENTRY_WORD1 0x58f78000 /* ori r15, r25, LO12(.got+4) */
+#define PLT0_ENTRY_WORD2 0x05178000 /* lwi r17, [r15+0] */
+#define PLT0_ENTRY_WORD3 0x04f78001 /* lwi r15, [r15+4] */
+#define PLT0_ENTRY_WORD4 0x4a003c00 /* jr r15 */
+
+/* $ta is change to $r15 (from $r25). */
+#define PLT0_PIC_ENTRY_WORD0 0x46f00000 /* sethi r15, HI20(got[1]@GOT) */
+#define PLT0_PIC_ENTRY_WORD1 0x58f78000 /* ori r15, r15, LO12(got[1]@GOT) */
+#define PLT0_PIC_ENTRY_WORD2 0x40f7f400 /* add r15, gp, r15 */
+#define PLT0_PIC_ENTRY_WORD3 0x05178000 /* lwi r17, [r15+0] */
+#define PLT0_PIC_ENTRY_WORD4 0x04f78001 /* lwi r15, [r15+4] */
+#define PLT0_PIC_ENTRY_WORD5 0x4a003c00 /* jr r15 */
+
+#define PLT_ENTRY_WORD0 0x46f00000 /* sethi r15, HI20(&got[n+3]) */
+#define PLT_ENTRY_WORD1 0x04f78000 /* lwi r15, r15, LO12(&got[n+3]) */
+#define PLT_ENTRY_WORD2 0x4a003c00 /* jr r15 */
+#define PLT_ENTRY_WORD3 0x45000000 /* movi r16, sizeof(RELA) * n */
+#define PLT_ENTRY_WORD4 0x48000000 /* j .plt0. */
+
+#define PLT_PIC_ENTRY_WORD0 0x46f00000 /* sethi r15, HI20(got[n+3]@GOT) */
+#define PLT_PIC_ENTRY_WORD1 0x58f78000 /* ori r15, r15, LO12(got[n+3]@GOT) */
+#define PLT_PIC_ENTRY_WORD2 0x38febc02 /* lw r15, [gp+r15] */
+#define PLT_PIC_ENTRY_WORD3 0x4a003c00 /* jr r15 */
+#define PLT_PIC_ENTRY_WORD4 0x45000000 /* movi r16, sizeof(RELA) * n */
+#define PLT_PIC_ENTRY_WORD5 0x48000000 /* j .plt0 */
+
+/* These are macros used to get the relocation accurate value. */
+#define ACCURATE_8BIT_S1 (0x100)
+#define ACCURATE_U9BIT_S1 (0x400)
+#define ACCURATE_12BIT_S1 (0x2000)
+#define ACCURATE_14BIT_S1 (0x4000)
+#define ACCURATE_19BIT (0x40000)
+
+/* These are macros used to get the relocation conservative value. */
+#define CONSERVATIVE_8BIT_S1 (0x100 - 4)
+#define CONSERVATIVE_14BIT_S1 (0x4000 - 4)
+#define CONSERVATIVE_16BIT_S1 (0x10000 - 4)
+#define CONSERVATIVE_24BIT_S1 (0x1000000 - 4)
+/* These must be more conservative because the address may be in
+ different segment. */
+#define CONSERVATIVE_15BIT (0x4000 - 0x1000)
+#define CONSERVATIVE_15BIT_S1 (0x8000 - 0x1000)
+#define CONSERVATIVE_15BIT_S2 (0x10000 - 0x1000)
+#define CONSERVATIVE_19BIT (0x40000 - 0x1000)
+#define CONSERVATIVE_20BIT (0x80000 - 0x1000)
+
+#define NDS32_ICT_SECTION ".nds32.ict"
+
+/* Size of small data/bss sections, used to calculate SDA_BASE. */
+static long got_size = 0;
+static int is_SDA_BASE_set = 0;
+static int is_ITB_BASE_set = 0;
+
+/* Convert ELF-VER in eflags to string for debugging purpose. */
+static const char *const nds32_elfver_strtab[] = {
+ "ELF-1.2",
+ "ELF-1.3",
+ "ELF-1.4",
+};
+
+/* The nds32 linker needs to keep track of the number of relocs that it
+ decides to copy in check_relocs for each symbol. This is so that
+ it can discard PC relative relocs if it doesn't need them when
+ linking with -Bsymbolic. We store the information in a field
+ extending the regular ELF linker hash table. */
+
+/* This structure keeps track of the number of PC relative relocs we
+ have copied for a given symbol. */
+
+struct elf_nds32_pcrel_relocs_copied
+{
+ /* Next section. */
+ struct elf_nds32_pcrel_relocs_copied *next;
+ /* A section in dynobj. */
+ asection *section;
+ /* Number of relocs copied in this section. */
+ bfd_size_type count;
+};
+
+/* The sh linker needs to keep track of the number of relocs that it
+ decides to copy as dynamic relocs in check_relocs for each symbol.
+ This is so that it can later discard them if they are found to be
+ unnecessary. We store the information in a field extending the
+ regular ELF linker hash table. */
+
+struct elf_nds32_dyn_relocs
+{
+ struct elf_nds32_dyn_relocs *next;
+
+ /* The input section of the reloc. */
+ asection *sec;
+
+ /* Total number of relocs copied for the input section. */
+ bfd_size_type count;
+
+ /* Number of pc-relative relocs copied for the input section. */
+ bfd_size_type pc_count;
+};
+
+/* Nds32 ELF linker hash entry. */
+
+enum elf_nds32_tls_type
+{
+ GOT_UNKNOWN = (0),
+ GOT_NORMAL = (1 << 0),
+ GOT_TLS_LE = (1 << 1),
+ GOT_TLS_IE = (1 << 2),
+ GOT_TLS_IEGP = (1 << 3),
+ GOT_TLS_LD = (1 << 4),
+ GOT_TLS_GD = (1 << 5),
+ GOT_TLS_DESC = (1 << 6),
+};
+
+struct elf_nds32_link_hash_entry
+{
+ struct elf_link_hash_entry root;
+
+ /* Track dynamic relocs copied for this symbol. */
+ struct elf_nds32_dyn_relocs *dyn_relocs;
+
+ /* For checking relocation type. */
+ enum elf_nds32_tls_type tls_type;
+
+ int offset_to_gp;
+
+ /* For saving function attribute indirect_call and entry address. */
+ bfd_boolean indirect_call;
+};
+
+/* Get the nds32 ELF linker hash table from a link_info structure. */
+
+#define FP_BASE_NAME "_FP_BASE_"
+static int check_start_export_sym = 0;
+static size_t ex9_relax_size = 0; /* Save ex9 predicted reducing size. */
+static asection *ex9_section = NULL;
+/* File for exporting indirect call table. */
+static FILE *ict_file = NULL;
+static bfd_boolean ignore_indirect_call = FALSE;
+
+/* Rom-patch symbol hash table. */
+struct elf_nds32_ict_hash_entry
+{
+ struct bfd_hash_entry root;
+ struct elf_link_hash_entry *h;
+ unsigned int order;
+};
+
+/* Rom-patch hash table. */
+static struct bfd_hash_table indirect_call_table;
+
+/* Table to save initial crc table. */
+static unsigned short byte_crc_table[256];
+static unsigned short byte_inv_crc_table[256];
+
+/* The offset for executable tls relaxation. */
+#define TP_OFFSET 0x0
+
+typedef struct
+{
+ int min_id;
+ int max_id;
+ int count;
+ int bias;
+ int init;
+} elf32_nds32_relax_group_t;
+
+struct elf_nds32_obj_tdata
+{
+ struct elf_obj_tdata root;
+
+ /* tls_type for each local got entry. */
+ char *local_got_tls_type;
+
+ unsigned int hdr_size;
+
+ /* GOTPLT entries for TLS descriptors. */
+ bfd_vma *local_tlsdesc_gotent;
+
+ int* offset_to_gp;
+
+ /* for R_NDS32_RELAX_GROUP handling. */
+ elf32_nds32_relax_group_t relax_group;
+};
+
+#define elf_nds32_tdata(bfd) \
+ ((struct elf_nds32_obj_tdata *) (bfd)->tdata.any)
+
+#define elf32_nds32_local_got_tls_type(bfd) \
+ (elf_nds32_tdata (bfd)->local_got_tls_type)
+
+#define elf32_nds32_local_gp_offset(bfd) \
+ (elf_nds32_tdata (bfd)->offset_to_gp)
+
+#define elf32_nds32_relax_group_ptr(bfd) \
+ &(elf_nds32_tdata (bfd)->relax_group)
+
+#define elf32_nds32_hash_entry(ent) ((struct elf_nds32_link_hash_entry *)(ent))
+
+bfd_boolean
+nds32_elf_mkobject (bfd *abfd)
+{
+ return bfd_elf_allocate_object (abfd, sizeof (struct elf_nds32_obj_tdata),
+ NDS32_ELF_DATA);
+}
+
+
+/* Relocations used for relocation. */
+/* NOTE!
+ the index order must be the same with elf_nds32_reloc_type in
+ include/elf/nds32.h
+ */
+#define HOWTO2(C, R, S, B, P, BI, O, SF, NAME, INPLACE, MASKSRC, MASKDST, PC) \
+ [C] = HOWTO(C, R, S, B, P, BI, O, SF, NAME, INPLACE, MASKSRC, MASKDST, PC)
+
+static reloc_howto_type nds32_elf_howto_table[] = {
+ /* This reloc does nothing. */
+ HOWTO2 (R_NDS32_NONE, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_bitfield,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_NONE", /* name */
+ FALSE, /* partial_inplace */
+ 0, /* src_mask */
+ 0, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* A 16 bit absolute relocation. */
+ HOWTO2 (R_NDS32_16, /* type */
+ 0, /* rightshift */
+ 1, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_bitfield,/* complain_on_overflow */
+ nds32_elf_generic_reloc,/* special_function */
+ "R_NDS32_16", /* name */
+ FALSE, /* partial_inplace */
+ 0xffff, /* src_mask */
+ 0xffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* A 32 bit absolute relocation. */
+ HOWTO2 (R_NDS32_32, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_bitfield,/* complain_on_overflow */
+ nds32_elf_generic_reloc,/* special_function */
+ "R_NDS32_32", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* A 20 bit address. */
+ HOWTO2 (R_NDS32_20, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 20, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_unsigned,/* complain_on_overflow */
+ nds32_elf_generic_reloc,/* special_function */
+ "R_NDS32_20", /* name */
+ FALSE, /* partial_inplace */
+ 0xfffff, /* src_mask */
+ 0xfffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* An PC Relative 9-bit relocation, shifted by 2.
+ This reloc is complicated because relocations are relative to pc & -4.
+ i.e. branches in the right insn slot use the address of the left insn
+ slot for pc. */
+ /* ??? It's not clear whether this should have partial_inplace set or not.
+ Branch relaxing in the assembler can store the addend in the insn,
+ and if bfd_install_relocation gets called the addend may get added
+ again. */
+ HOWTO2 (R_NDS32_9_PCREL, /* type */
+ 1, /* rightshift */
+ 1, /* size (0 = byte, 1 = short, 2 = long) */
+ 8, /* bitsize */
+ TRUE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ nds32_elf_9_pcrel_reloc,/* special_function */
+ "R_NDS32_9_PCREL", /* name */
+ FALSE, /* partial_inplace */
+ 0xff, /* src_mask */
+ 0xff, /* dst_mask */
+ TRUE), /* pcrel_offset */
+
+ /* A relative 15 bit relocation, right shifted by 1. */
+ HOWTO2 (R_NDS32_15_PCREL, /* type */
+ 1, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 14, /* bitsize */
+ TRUE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_15_PCREL", /* name */
+ FALSE, /* partial_inplace */
+ 0x3fff, /* src_mask */
+ 0x3fff, /* dst_mask */
+ TRUE), /* pcrel_offset */
+
+ /* A relative 17 bit relocation, right shifted by 1. */
+ HOWTO2 (R_NDS32_17_PCREL, /* type */
+ 1, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ TRUE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_17_PCREL", /* name */
+ FALSE, /* partial_inplace */
+ 0xffff, /* src_mask */
+ 0xffff, /* dst_mask */
+ TRUE), /* pcrel_offset */
+
+ /* A relative 25 bit relocation, right shifted by 1. */
+ /* ??? It's not clear whether this should have partial_inplace set or not.
+ Branch relaxing in the assembler can store the addend in the insn,
+ and if bfd_install_relocation gets called the addend may get added
+ again. */
+ HOWTO2 (R_NDS32_25_PCREL, /* type */
+ 1, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 24, /* bitsize */
+ TRUE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_25_PCREL", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffff, /* src_mask */
+ 0xffffff, /* dst_mask */
+ TRUE), /* pcrel_offset */
+
+ /* High 20 bits of address when lower 12 is or'd in. */
+ HOWTO2 (R_NDS32_HI20, /* type */
+ 12, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 20, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_hi20_reloc, /* special_function */
+ "R_NDS32_HI20", /* name */
+ FALSE, /* partial_inplace */
+ 0x000fffff, /* src_mask */
+ 0x000fffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Lower 12 bits of address. */
+ HOWTO2 (R_NDS32_LO12S3, /* type */
+ 3, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 9, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_lo12_reloc, /* special_function */
+ "R_NDS32_LO12S3", /* name */
+ FALSE, /* partial_inplace */
+ 0x000001ff, /* src_mask */
+ 0x000001ff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Lower 12 bits of address. */
+ HOWTO2 (R_NDS32_LO12S2, /* type */
+ 2, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 10, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_lo12_reloc, /* special_function */
+ "R_NDS32_LO12S2", /* name */
+ FALSE, /* partial_inplace */
+ 0x000003ff, /* src_mask */
+ 0x000003ff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Lower 12 bits of address. */
+ HOWTO2 (R_NDS32_LO12S1, /* type */
+ 1, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 11, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_lo12_reloc, /* special_function */
+ "R_NDS32_LO12S1", /* name */
+ FALSE, /* partial_inplace */
+ 0x000007ff, /* src_mask */
+ 0x000007ff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Lower 12 bits of address. */
+ HOWTO2 (R_NDS32_LO12S0, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 12, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_lo12_reloc, /* special_function */
+ "R_NDS32_LO12S0", /* name */
+ FALSE, /* partial_inplace */
+ 0x00000fff, /* src_mask */
+ 0x00000fff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Small data area 15 bits offset. */
+ HOWTO2 (R_NDS32_SDA15S3, /* type */
+ 3, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 15, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ nds32_elf_sda15_reloc, /* special_function */
+ "R_NDS32_SDA15S3", /* name */
+ FALSE, /* partial_inplace */
+ 0x00007fff, /* src_mask */
+ 0x00007fff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Small data area 15 bits offset. */
+ HOWTO2 (R_NDS32_SDA15S2, /* type */
+ 2, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 15, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ nds32_elf_sda15_reloc, /* special_function */
+ "R_NDS32_SDA15S2", /* name */
+ FALSE, /* partial_inplace */
+ 0x00007fff, /* src_mask */
+ 0x00007fff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Small data area 15 bits offset. */
+ HOWTO2 (R_NDS32_SDA15S1, /* type */
+ 1, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 15, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ nds32_elf_sda15_reloc, /* special_function */
+ "R_NDS32_SDA15S1", /* name */
+ FALSE, /* partial_inplace */
+ 0x00007fff, /* src_mask */
+ 0x00007fff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Small data area 15 bits offset. */
+ HOWTO2 (R_NDS32_SDA15S0, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 15, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ nds32_elf_sda15_reloc, /* special_function */
+ "R_NDS32_SDA15S0", /* name */
+ FALSE, /* partial_inplace */
+ 0x00007fff, /* src_mask */
+ 0x00007fff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* GNU extension to record C++ vtable hierarchy */
+ HOWTO2 (R_NDS32_GNU_VTINHERIT,/* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 0, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ NULL, /* special_function */
+ "R_NDS32_GNU_VTINHERIT",/* name */
+ FALSE, /* partial_inplace */
+ 0, /* src_mask */
+ 0, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* GNU extension to record C++ vtable member usage */
+ HOWTO2 (R_NDS32_GNU_VTENTRY, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 0, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ _bfd_elf_rel_vtable_reloc_fn,/* special_function */
+ "R_NDS32_GNU_VTENTRY", /* name */
+ FALSE, /* partial_inplace */
+ 0, /* src_mask */
+ 0, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* A 16 bit absolute relocation. */
+ HOWTO2 (R_NDS32_16_RELA, /* type */
+ 0, /* rightshift */
+ 1, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_bitfield,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_16_RELA", /* name */
+ FALSE, /* partial_inplace */
+ 0xffff, /* src_mask */
+ 0xffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* A 32 bit absolute relocation. */
+ HOWTO2 (R_NDS32_32_RELA, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_bitfield,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_32_RELA", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* A 20 bit address. */
+ HOWTO2 (R_NDS32_20_RELA, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 20, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_20_RELA", /* name */
+ FALSE, /* partial_inplace */
+ 0xfffff, /* src_mask */
+ 0xfffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ HOWTO2 (R_NDS32_9_PCREL_RELA, /* type */
+ 1, /* rightshift */
+ 1, /* size (0 = byte, 1 = short, 2 = long) */
+ 8, /* bitsize */
+ TRUE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_9_PCREL_RELA",/* name */
+ FALSE, /* partial_inplace */
+ 0xff, /* src_mask */
+ 0xff, /* dst_mask */
+ TRUE), /* pcrel_offset */
+
+ /* A relative 15 bit relocation, right shifted by 1. */
+ HOWTO2 (R_NDS32_15_PCREL_RELA,/* type */
+ 1, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 14, /* bitsize */
+ TRUE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_15_PCREL_RELA",/* name */
+ FALSE, /* partial_inplace */
+ 0x3fff, /* src_mask */
+ 0x3fff, /* dst_mask */
+ TRUE), /* pcrel_offset */
+
+ /* A relative 17 bit relocation, right shifted by 1. */
+ HOWTO2 (R_NDS32_17_PCREL_RELA,/* type */
+ 1, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ TRUE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_17_PCREL_RELA",/* name */
+ FALSE, /* partial_inplace */
+ 0xffff, /* src_mask */
+ 0xffff, /* dst_mask */
+ TRUE), /* pcrel_offset */
+
+ /* A relative 25 bit relocation, right shifted by 2. */
+ HOWTO2 (R_NDS32_25_PCREL_RELA,/* type */
+ 1, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 24, /* bitsize */
+ TRUE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_25_PCREL_RELA",/* name */
+ FALSE, /* partial_inplace */
+ 0xffffff, /* src_mask */
+ 0xffffff, /* dst_mask */
+ TRUE), /* pcrel_offset */
+
+ /* High 20 bits of address when lower 16 is or'd in. */
+ HOWTO2 (R_NDS32_HI20_RELA, /* type */
+ 12, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 20, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_HI20_RELA", /* name */
+ FALSE, /* partial_inplace */
+ 0x000fffff, /* src_mask */
+ 0x000fffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Lower 12 bits of address. */
+ HOWTO2 (R_NDS32_LO12S3_RELA, /* type */
+ 3, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 9, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_LO12S3_RELA", /* name */
+ FALSE, /* partial_inplace */
+ 0x000001ff, /* src_mask */
+ 0x000001ff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Lower 12 bits of address. */
+ HOWTO2 (R_NDS32_LO12S2_RELA, /* type */
+ 2, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 10, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_LO12S2_RELA", /* name */
+ FALSE, /* partial_inplace */
+ 0x000003ff, /* src_mask */
+ 0x000003ff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Lower 12 bits of address. */
+ HOWTO2 (R_NDS32_LO12S1_RELA, /* type */
+ 1, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 11, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_LO12S1_RELA", /* name */
+ FALSE, /* partial_inplace */
+ 0x000007ff, /* src_mask */
+ 0x000007ff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Lower 12 bits of address. */
+ HOWTO2 (R_NDS32_LO12S0_RELA, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 12, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_LO12S0_RELA", /* name */
+ FALSE, /* partial_inplace */
+ 0x00000fff, /* src_mask */
+ 0x00000fff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Small data area 15 bits offset. */
+ HOWTO2 (R_NDS32_SDA15S3_RELA, /* type */
+ 3, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 15, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_SDA15S3_RELA",/* name */
+ FALSE, /* partial_inplace */
+ 0x00007fff, /* src_mask */
+ 0x00007fff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Small data area 15 bits offset. */
+ HOWTO2 (R_NDS32_SDA15S2_RELA, /* type */
+ 2, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 15, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_SDA15S2_RELA",/* name */
+ FALSE, /* partial_inplace */
+ 0x00007fff, /* src_mask */
+ 0x00007fff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ HOWTO2 (R_NDS32_SDA15S1_RELA, /* type */
+ 1, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 15, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_SDA15S1_RELA",/* name */
+ FALSE, /* partial_inplace */
+ 0x00007fff, /* src_mask */
+ 0x00007fff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ HOWTO2 (R_NDS32_SDA15S0_RELA, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 15, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_SDA15S0_RELA",/* name */
+ FALSE, /* partial_inplace */
+ 0x00007fff, /* src_mask */
+ 0x00007fff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* GNU extension to record C++ vtable hierarchy */
+ HOWTO2 (R_NDS32_RELA_GNU_VTINHERIT,/* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 0, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ NULL, /* special_function */
+ "R_NDS32_RELA_GNU_VTINHERIT",/* name */
+ FALSE, /* partial_inplace */
+ 0, /* src_mask */
+ 0, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* GNU extension to record C++ vtable member usage */
+ HOWTO2 (R_NDS32_RELA_GNU_VTENTRY,/* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 0, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ _bfd_elf_rel_vtable_reloc_fn,/* special_function */
+ "R_NDS32_RELA_GNU_VTENTRY",/* name */
+ FALSE, /* partial_inplace */
+ 0, /* src_mask */
+ 0, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Like R_NDS32_20, but referring to the GOT table entry for
+ the symbol. */
+ HOWTO2 (R_NDS32_GOT20, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 20, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_GOT20", /* name */
+ FALSE, /* partial_inplace */
+ 0xfffff, /* src_mask */
+ 0xfffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Like R_NDS32_PCREL, but referring to the procedure linkage table
+ entry for the symbol. */
+ HOWTO2 (R_NDS32_25_PLTREL, /* type */
+ 1, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 24, /* bitsize */
+ TRUE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_25_PLTREL", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffff, /* src_mask */
+ 0xffffff, /* dst_mask */
+ TRUE), /* pcrel_offset */
+
+ /* This is used only by the dynamic linker. The symbol should exist
+ both in the object being run and in some shared library. The
+ dynamic linker copies the data addressed by the symbol from the
+ shared library into the object, because the object being
+ run has to have the data at some particular address. */
+ HOWTO2 (R_NDS32_COPY, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_bitfield,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_COPY", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Like R_NDS32_20, but used when setting global offset table
+ entries. */
+ HOWTO2 (R_NDS32_GLOB_DAT, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_bitfield,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_GLOB_DAT", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Marks a procedure linkage table entry for a symbol. */
+ HOWTO2 (R_NDS32_JMP_SLOT, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_bitfield,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_JMP_SLOT", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Used only by the dynamic linker. When the object is run, this
+ longword is set to the load address of the object, plus the
+ addend. */
+ HOWTO2 (R_NDS32_RELATIVE, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_bitfield,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_RELATIVE", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ HOWTO2 (R_NDS32_GOTOFF, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 20, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_GOTOFF", /* name */
+ FALSE, /* partial_inplace */
+ 0xfffff, /* src_mask */
+ 0xfffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* An PC Relative 20-bit relocation used when setting PIC offset
+ table register. */
+ HOWTO2 (R_NDS32_GOTPC20, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 20, /* bitsize */
+ TRUE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_GOTPC20", /* name */
+ FALSE, /* partial_inplace */
+ 0xfffff, /* src_mask */
+ 0xfffff, /* dst_mask */
+ TRUE), /* pcrel_offset */
+
+ /* Like R_NDS32_HI20, but referring to the GOT table entry for
+ the symbol. */
+ HOWTO2 (R_NDS32_GOT_HI20, /* type */
+ 12, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 20, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_GOT_HI20", /* name */
+ FALSE, /* partial_inplace */
+ 0x000fffff, /* src_mask */
+ 0x000fffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ HOWTO2 (R_NDS32_GOT_LO12, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 12, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_GOT_LO12", /* name */
+ FALSE, /* partial_inplace */
+ 0x00000fff, /* src_mask */
+ 0x00000fff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* An PC Relative relocation used when setting PIC offset table register.
+ Like R_NDS32_HI20, but referring to the GOT table entry for
+ the symbol. */
+ HOWTO2 (R_NDS32_GOTPC_HI20, /* type */
+ 12, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 20, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_GOTPC_HI20", /* name */
+ FALSE, /* partial_inplace */
+ 0x000fffff, /* src_mask */
+ 0x000fffff, /* dst_mask */
+ TRUE), /* pcrel_offset */
+ HOWTO2 (R_NDS32_GOTPC_LO12, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 12, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_GOTPC_LO12", /* name */
+ FALSE, /* partial_inplace */
+ 0x00000fff, /* src_mask */
+ 0x00000fff, /* dst_mask */
+ TRUE), /* pcrel_offset */
+
+ HOWTO2 (R_NDS32_GOTOFF_HI20, /* type */
+ 12, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 20, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_GOTOFF_HI20", /* name */
+ FALSE, /* partial_inplace */
+ 0x000fffff, /* src_mask */
+ 0x000fffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ HOWTO2 (R_NDS32_GOTOFF_LO12, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 12, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_GOTOFF_LO12", /* name */
+ FALSE, /* partial_inplace */
+ 0x00000fff, /* src_mask */
+ 0x00000fff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Alignment hint for relaxable instruction. This is used with
+ R_NDS32_LABEL as a pair. Relax this instruction from 4 bytes to 2
+ in order to make next label aligned on word boundary. */
+ HOWTO2 (R_NDS32_INSN16, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_INSN16", /* name */
+ FALSE, /* partial_inplace */
+ 0x00000fff, /* src_mask */
+ 0x00000fff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Alignment hint for label. */
+ HOWTO2 (R_NDS32_LABEL, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_LABEL", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Relax hint for unconditional call sequence */
+ HOWTO2 (R_NDS32_LONGCALL1, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_LONGCALL1", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Relax hint for conditional call sequence. */
+ HOWTO2 (R_NDS32_LONGCALL2, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_LONGCALL2", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Relax hint for conditional call sequence. */
+ HOWTO2 (R_NDS32_LONGCALL3, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_LONGCALL3", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Relax hint for unconditional branch sequence. */
+ HOWTO2 (R_NDS32_LONGJUMP1, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_LONGJUMP1", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Relax hint for conditional branch sequence. */
+ HOWTO2 (R_NDS32_LONGJUMP2, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_LONGJUMP2", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Relax hint for conditional branch sequence. */
+ HOWTO2 (R_NDS32_LONGJUMP3, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_LONGJUMP3", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Relax hint for load/store sequence. */
+ HOWTO2 (R_NDS32_LOADSTORE, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_LOADSTORE", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Relax hint for load/store sequence. */
+ HOWTO2 (R_NDS32_9_FIXED_RELA, /* type */
+ 0, /* rightshift */
+ 1, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_9_FIXED_RELA",/* name */
+ FALSE, /* partial_inplace */
+ 0x000000ff, /* src_mask */
+ 0x000000ff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Relax hint for load/store sequence. */
+ HOWTO2 (R_NDS32_15_FIXED_RELA,/* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_15_FIXED_RELA",/* name */
+ FALSE, /* partial_inplace */
+ 0x00003fff, /* src_mask */
+ 0x00003fff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Relax hint for load/store sequence. */
+ HOWTO2 (R_NDS32_17_FIXED_RELA,/* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_17_FIXED_RELA",/* name */
+ FALSE, /* partial_inplace */
+ 0x0000ffff, /* src_mask */
+ 0x0000ffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Relax hint for load/store sequence. */
+ HOWTO2 (R_NDS32_25_FIXED_RELA,/* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_25_FIXED_RELA",/* name */
+ FALSE, /* partial_inplace */
+ 0x00ffffff, /* src_mask */
+ 0x00ffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* High 20 bits of PLT symbol offset relative to PC. */
+ HOWTO2 (R_NDS32_PLTREL_HI20, /* type */
+ 12, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 20, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_PLTREL_HI20", /* name */
+ FALSE, /* partial_inplace */
+ 0x000fffff, /* src_mask */
+ 0x000fffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Low 12 bits of PLT symbol offset relative to PC. */
+ HOWTO2 (R_NDS32_PLTREL_LO12, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 12, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_PLTREL_LO12", /* name */
+ FALSE, /* partial_inplace */
+ 0x00000fff, /* src_mask */
+ 0x00000fff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* High 20 bits of PLT symbol offset relative to GOT (GP). */
+ HOWTO2 (R_NDS32_PLT_GOTREL_HI20, /* type */
+ 12, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 20, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_PLT_GOTREL_HI20",/* name */
+ FALSE, /* partial_inplace */
+ 0x000fffff, /* src_mask */
+ 0x000fffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Low 12 bits of PLT symbol offset relative to GOT (GP). */
+ HOWTO2 (R_NDS32_PLT_GOTREL_LO12,/* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 12, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_PLT_GOTREL_LO12",/* name */
+ FALSE, /* partial_inplace */
+ 0x00000fff, /* src_mask */
+ 0x00000fff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Small data area 12 bits offset. */
+ HOWTO2 (R_NDS32_SDA12S2_DP_RELA,/* type */
+ 2, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 12, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_SDA12S2_DP_RELA",/* name */
+ FALSE, /* partial_inplace */
+ 0x00000fff, /* src_mask */
+ 0x00000fff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Small data area 12 bits offset. */
+ HOWTO2 (R_NDS32_SDA12S2_SP_RELA,/* type */
+ 2, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 12, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_SDA12S2_SP_RELA",/* name */
+ FALSE, /* partial_inplace */
+ 0x00000fff, /* src_mask */
+ 0x00000fff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ /* Lower 12 bits of address. */
+
+ HOWTO2 (R_NDS32_LO12S2_DP_RELA, /* type */
+ 2, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 10, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_LO12S2_DP_RELA",/* name */
+ FALSE, /* partial_inplace */
+ 0x000003ff, /* src_mask */
+ 0x000003ff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Lower 12 bits of address. */
+ HOWTO2 (R_NDS32_LO12S2_SP_RELA,/* type */
+ 2, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 10, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_LO12S2_SP_RELA",/* name */
+ FALSE, /* partial_inplace */
+ 0x000003ff, /* src_mask */
+ 0x000003ff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ /* Lower 12 bits of address. Special identity for or case. */
+ HOWTO2 (R_NDS32_LO12S0_ORI_RELA,/* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 12, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_LO12S0_ORI_RELA",/* name */
+ FALSE, /* partial_inplace */
+ 0x00000fff, /* src_mask */
+ 0x00000fff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ /* Small data area 19 bits offset. */
+ HOWTO2 (R_NDS32_SDA16S3_RELA, /* type */
+ 3, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_SDA16S3_RELA",/* name */
+ FALSE, /* partial_inplace */
+ 0x0000ffff, /* src_mask */
+ 0x0000ffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Small data area 15 bits offset. */
+ HOWTO2 (R_NDS32_SDA17S2_RELA, /* type */
+ 2, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 17, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_SDA17S2_RELA",/* name */
+ FALSE, /* partial_inplace */
+ 0x0001ffff, /* src_mask */
+ 0x0001ffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ HOWTO2 (R_NDS32_SDA18S1_RELA, /* type */
+ 1, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 18, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_SDA18S1_RELA",/* name */
+ FALSE, /* partial_inplace */
+ 0x0003ffff, /* src_mask */
+ 0x0003ffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ HOWTO2 (R_NDS32_SDA19S0_RELA, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 19, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_SDA19S0_RELA",/* name */
+ FALSE, /* partial_inplace */
+ 0x0007ffff, /* src_mask */
+ 0x0007ffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ HOWTO2 (R_NDS32_DWARF2_OP1_RELA,/* type */
+ 0, /* rightshift */
+ 0, /* size (0 = byte, 1 = short, 2 = long) */
+ 8, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_DWARF2_OP1_RELA",/* name */
+ FALSE, /* partial_inplace */
+ 0xff, /* src_mask */
+ 0xff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ HOWTO2 (R_NDS32_DWARF2_OP2_RELA,/* type */
+ 0, /* rightshift */
+ 1, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_DWARF2_OP2_RELA",/* name */
+ FALSE, /* partial_inplace */
+ 0xffff, /* src_mask */
+ 0xffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ HOWTO2 (R_NDS32_DWARF2_LEB_RELA,/* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_DWARF2_LEB_RELA",/* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ HOWTO2 (R_NDS32_UPDATE_TA_RELA,/* type */
+ 0, /* rightshift */
+ 1, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_UPDATE_TA_RELA",/* name */
+ FALSE, /* partial_inplace */
+ 0xffff, /* src_mask */
+ 0xffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ /* Like R_NDS32_PCREL, but referring to the procedure linkage table
+ entry for the symbol. */
+ HOWTO2 (R_NDS32_9_PLTREL, /* type */
+ 1, /* rightshift */
+ 1, /* size (0 = byte, 1 = short, 2 = long) */
+ 8, /* bitsize */
+ TRUE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_9_PLTREL", /* name */
+ FALSE, /* partial_inplace */
+ 0xff, /* src_mask */
+ 0xff, /* dst_mask */
+ TRUE), /* pcrel_offset */
+ /* Low 20 bits of PLT symbol offset relative to GOT (GP). */
+ HOWTO2 (R_NDS32_PLT_GOTREL_LO20,/* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 20, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_PLT_GOTREL_LO20",/* name */
+ FALSE, /* partial_inplace */
+ 0x000fffff, /* src_mask */
+ 0x000fffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ /* low 15 bits of PLT symbol offset relative to GOT (GP) */
+ HOWTO2 (R_NDS32_PLT_GOTREL_LO15,/* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 15, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_PLT_GOTREL_LO15",/* name */
+ FALSE, /* partial_inplace */
+ 0x00007fff, /* src_mask */
+ 0x00007fff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ /* Low 19 bits of PLT symbol offset relative to GOT (GP). */
+ HOWTO2 (R_NDS32_PLT_GOTREL_LO19,/* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 19, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_PLT_GOTREL_LO19",/* name */
+ FALSE, /* partial_inplace */
+ 0x0007ffff, /* src_mask */
+ 0x0007ffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ HOWTO2 (R_NDS32_GOT_LO15, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 15, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_GOT_LO15", /* name */
+ FALSE, /* partial_inplace */
+ 0x00007fff, /* src_mask */
+ 0x00007fff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ HOWTO2 (R_NDS32_GOT_LO19, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 19, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_GOT_LO19", /* name */
+ FALSE, /* partial_inplace */
+ 0x0007ffff, /* src_mask */
+ 0x0007ffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ HOWTO2 (R_NDS32_GOTOFF_LO15, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 15, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_GOTOFF_LO15", /* name */
+ FALSE, /* partial_inplace */
+ 0x00007fff, /* src_mask */
+ 0x00007fff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ HOWTO2 (R_NDS32_GOTOFF_LO19, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 19, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_GOTOFF_LO19", /* name */
+ FALSE, /* partial_inplace */
+ 0x0007ffff, /* src_mask */
+ 0x0007ffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ /* GOT 15 bits offset. */
+ HOWTO2 (R_NDS32_GOT15S2_RELA, /* type */
+ 2, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 15, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_GOT15S2_RELA",/* name */
+ FALSE, /* partial_inplace */
+ 0x00007fff, /* src_mask */
+ 0x00007fff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ /* GOT 17 bits offset. */
+ HOWTO2 (R_NDS32_GOT17S2_RELA, /* type */
+ 2, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 17, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_GOT17S2_RELA",/* name */
+ FALSE, /* partial_inplace */
+ 0x0001ffff, /* src_mask */
+ 0x0001ffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ /* A 5 bit address. */
+ HOWTO2 (R_NDS32_5_RELA, /* type */
+ 0, /* rightshift */
+ 1, /* size (0 = byte, 1 = short, 2 = long) */
+ 5, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_5_RELA", /* name */
+ FALSE, /* partial_inplace */
+ 0x1f, /* src_mask */
+ 0x1f, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ HOWTO2 (R_NDS32_10_UPCREL_RELA,/* type */
+ 1, /* rightshift */
+ 1, /* size (0 = byte, 1 = short, 2 = long) */
+ 9, /* bitsize */
+ TRUE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_unsigned,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_10_UPCREL_RELA",/* name */
+ FALSE, /* partial_inplace */
+ 0x1ff, /* src_mask */
+ 0x1ff, /* dst_mask */
+ TRUE), /* pcrel_offset */
+ HOWTO2 (R_NDS32_SDA_FP7U2_RELA,/* type */
+ 2, /* rightshift */
+ 1, /* size (0 = byte, 1 = short, 2 = long) */
+ 7, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_unsigned,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_SDA_FP7U2_RELA",/* name */
+ FALSE, /* partial_inplace */
+ 0x0000007f, /* src_mask */
+ 0x0000007f, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ HOWTO2 (R_NDS32_WORD_9_PCREL_RELA,/* type */
+ 1, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 8, /* bitsize */
+ TRUE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_WORD_9_PCREL_RELA",/* name */
+ FALSE, /* partial_inplace */
+ 0xff, /* src_mask */
+ 0xff, /* dst_mask */
+ TRUE), /* pcrel_offset */
+ HOWTO2 (R_NDS32_25_ABS_RELA, /* type */
+ 1, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 24, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_25_ABS_RELA", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffff, /* src_mask */
+ 0xffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* A relative 17 bit relocation for ifc, right shifted by 1. */
+ HOWTO2 (R_NDS32_17IFC_PCREL_RELA,/* type */
+ 1, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ TRUE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_17IFC_PCREL_RELA",/* name */
+ FALSE, /* partial_inplace */
+ 0xffff, /* src_mask */
+ 0xffff, /* dst_mask */
+ TRUE), /* pcrel_offset */
+
+ /* A relative unsigned 10 bit relocation for ifc, right shifted by 1. */
+ HOWTO2 (R_NDS32_10IFCU_PCREL_RELA,/* type */
+ 1, /* rightshift */
+ 1, /* size (0 = byte, 1 = short, 2 = long) */
+ 9, /* bitsize */
+ TRUE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_unsigned,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_10IFCU_PCREL_RELA",/* name */
+ FALSE, /* partial_inplace */
+ 0x1ff, /* src_mask */
+ 0x1ff, /* dst_mask */
+ TRUE), /* pcrel_offset */
+
+ /* Relax hint for unconditional call sequence */
+ HOWTO2 (R_NDS32_LONGCALL4, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_LONGCALL4", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Relax hint for conditional call sequence. */
+ HOWTO2 (R_NDS32_LONGCALL5, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_LONGCALL5", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Relax hint for conditional call sequence. */
+ HOWTO2 (R_NDS32_LONGCALL6, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_LONGCALL6", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Relax hint for unconditional branch sequence. */
+ HOWTO2 (R_NDS32_LONGJUMP4, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_LONGJUMP4", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Relax hint for conditional branch sequence. */
+ HOWTO2 (R_NDS32_LONGJUMP5, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_LONGJUMP5", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Relax hint for conditional branch sequence. */
+ HOWTO2 (R_NDS32_LONGJUMP6, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_LONGJUMP6", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Relax hint for conditional branch sequence. */
+ HOWTO2 (R_NDS32_LONGJUMP7, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_LONGJUMP7", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Check sum value for security. */
+ HOWTO2 (R_NDS32_SECURITY_16, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ FALSE, /* pc_relative */
+ 5, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_SECURITY_16", /* name */
+ FALSE, /* partial_inplace */
+ 0x1fffe0, /* src_mask */
+ 0x1fffe0, /* dst_mask */
+ TRUE), /* pcrel_offset */
+
+ /* TLS LE TP offset relocation */
+ HOWTO2 (R_NDS32_TLS_TPOFF, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_bitfield,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_TLS_TPOFF", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Like R_NDS32_HI20, but referring to the TLS LE entry for the symbol. */
+ HOWTO2 (R_NDS32_TLS_LE_HI20, /* type */
+ 12, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 20, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_TLS_LE_HI20", /* name */
+ FALSE, /* partial_inplace */
+ 0x000fffff, /* src_mask */
+ 0x000fffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ HOWTO2 (R_NDS32_TLS_LE_LO12, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 12, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_TLS_LE_LO12", /* name */
+ FALSE, /* partial_inplace */
+ 0x00000fff, /* src_mask */
+ 0x00000fff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* A 20 bit address. */
+ HOWTO2 (R_NDS32_TLS_LE_20, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 20, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_TLS_LE_20", /* name */
+ FALSE, /* partial_inplace */
+ 0xfffff, /* src_mask */
+ 0xfffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ HOWTO2 (R_NDS32_TLS_LE_15S0, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 15, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_TLS_LE_15S0", /* name */
+ FALSE, /* partial_inplace */
+ 0x7fff, /* src_mask */
+ 0x7fff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ HOWTO2 (R_NDS32_TLS_LE_15S1, /* type */
+ 1, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 15, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_TLS_LE_15S1", /* name */
+ FALSE, /* partial_inplace */
+ 0x7fff, /* src_mask */
+ 0x7fff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ HOWTO2 (R_NDS32_TLS_LE_15S2, /* type */
+ 2, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 15, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_TLS_LE_15S2", /* name */
+ FALSE, /* partial_inplace */
+ 0x7fff, /* src_mask */
+ 0x7fff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Like R_NDS32_HI20, but referring to the TLS IE entry for the symbol. */
+ HOWTO2 (R_NDS32_TLS_IE_HI20, /* type */
+ 12, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 20, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_TLS_IE_HI20", /* name */
+ FALSE, /* partial_inplace */
+ 0x000fffff, /* src_mask */
+ 0x000fffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ HOWTO2 (R_NDS32_TLS_IE_LO12, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 12, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_TLS_IE_LO12", /* name */
+ FALSE, /* partial_inplace */
+ 0x00000fff, /* src_mask */
+ 0x00000fff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ HOWTO2 (R_NDS32_TLS_IE_LO12S2,/* type */
+ 2, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 10, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_TLS_IE_LO12S2",/* name */
+ FALSE, /* partial_inplace */
+ 0x000003ff, /* src_mask */
+ 0x000003ff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Like R_NDS32_HI20, but referring to the TLS IE (PIE) entry for the symbol. */
+ HOWTO2 (R_NDS32_TLS_IEGP_HI20,/* type */
+ 12, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 20, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_TLS_IEGP_HI20",/* name */
+ FALSE, /* partial_inplace */
+ 0x000fffff, /* src_mask */
+ 0x000fffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ HOWTO2 (R_NDS32_TLS_IEGP_LO12,/* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 12, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_TLS_IEGP_LO12",/* name */
+ FALSE, /* partial_inplace */
+ 0x00000fff, /* src_mask */
+ 0x00000fff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ HOWTO2 (R_NDS32_TLS_IEGP_LO12S2,/* type */
+ 2, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 10, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_TLS_IEGP_LO12S2",/* name */
+ FALSE, /* partial_inplace */
+ 0x000003ff, /* src_mask */
+ 0x000003ff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* TLS description relocation */
+ HOWTO2 (R_NDS32_TLS_DESC, /* type */
+ 12, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 20, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_hi20_reloc, /* special_function */
+ "R_NDS32_TLS_DESC_HI20",/* name */
+ FALSE, /* partial_inplace */
+ 0x000fffff, /* src_mask */
+ 0x000fffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* TLS GD/LD description offset high part. */
+ HOWTO2 (R_NDS32_TLS_DESC_HI20,/* type */
+ 12, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 20, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_hi20_reloc, /* special_function */
+ "R_NDS32_TLS_DESC_HI20",/* name */
+ FALSE, /* partial_inplace */
+ 0x000fffff, /* src_mask */
+ 0x000fffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ /* TLS GD/LD description offset low part. */
+ HOWTO2 (R_NDS32_TLS_DESC_LO12,/* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 12, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_lo12_reloc, /* special_function */
+ "R_NDS32_TLS_DESC_LO12",/* name */
+ FALSE, /* partial_inplace */
+ 0x00000fff, /* src_mask */
+ 0x00000fff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* TLS GD/LD description offset set (movi). */
+ HOWTO2 (R_NDS32_TLS_DESC_20, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 20, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_TLS_DESC_20", /* name */
+ FALSE, /* partial_inplace */
+ 0x000fffff, /* src_mask */
+ 0x000fffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* TLS GD/LD description offset set (lwi.gp). */
+ HOWTO2 (R_NDS32_TLS_DESC_SDA17S2,/* type */
+ 2, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 17, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_TLS_DESC_SDA17S2",/* name */
+ FALSE, /* partial_inplace */
+ 0x0001ffff, /* src_mask */
+ 0x0001ffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* Jump-patch table relocations. */
+ /* High 20 bits of jump-patch table address. */
+ HOWTO2 (R_NDS32_ICT_HI20, /* type */
+ 12, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 20, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_ICT_HI20", /* name */
+ FALSE, /* partial_inplace */
+ 0x000fffff, /* src_mask */
+ 0x000fffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ /* Lower 12 bits of jump-patch table address. */
+ HOWTO2 (R_NDS32_ICT_LO12,/* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 12, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_ICT_LO12",/* name */
+ FALSE, /* partial_inplace */
+ 0x00000fff, /* src_mask */
+ 0x00000fff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ /* A relative 25 bit relocation, right shifted by 2. */
+ HOWTO2 (R_NDS32_ICT_25PC,/* type */
+ 1, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 24, /* bitsize */
+ TRUE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed,/* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_NDS32_ICT_25PC",/* name */
+ FALSE, /* partial_inplace */
+ 0xffffff, /* src_mask */
+ 0xffffff, /* dst_mask */
+ TRUE), /* pcrel_offset */
+};
+
+/* Relocations used for relaxation. */
+#define HOWTO3(C, R, S, B, P, BI, O, SF, NAME, INPLACE, MASKSRC, MASKDST, PC) \
+ [C-R_NDS32_RELAX_ENTRY] = HOWTO(C, R, S, B, P, BI, O, SF, NAME, INPLACE, MASKSRC, MASKDST, PC)
+
+static reloc_howto_type nds32_elf_relax_howto_table[] = {
+ HOWTO3 (R_NDS32_RELAX_ENTRY, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_RELAX_ENTRY", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ HOWTO3 (R_NDS32_GOT_SUFF, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_GOT_SUFF", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ HOWTO3 (R_NDS32_GOTOFF_SUFF, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_bitfield,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_GOTOFF_SUFF", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ HOWTO3 (R_NDS32_PLT_GOT_SUFF, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_PLT_GOT_SUFF",/* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ HOWTO3 (R_NDS32_MULCALL_SUFF, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_MULCALL_SUFF",/* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ HOWTO3 (R_NDS32_PTR, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_PTR", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ HOWTO3 (R_NDS32_PTR_COUNT, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_PTR_COUNT", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ HOWTO3 (R_NDS32_PTR_RESOLVED, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_PTR_RESOLVED",/* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ HOWTO3 (R_NDS32_PLTBLOCK, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_PLTBLOCK", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ HOWTO3 (R_NDS32_RELAX_REGION_BEGIN,/* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_RELAX_REGION_BEGIN",/* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ HOWTO3 (R_NDS32_RELAX_REGION_END,/* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_RELAX_REGION_END",/* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ HOWTO3 (R_NDS32_MINUEND, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_MINUEND", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ HOWTO3 (R_NDS32_SUBTRAHEND, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_SUBTRAHEND", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ HOWTO3 (R_NDS32_DIFF8, /* type */
+ 0, /* rightshift */
+ 0, /* size (0 = byte, 1 = short, 2 = long) */
+ 8, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_DIFF8", /* name */
+ FALSE, /* partial_inplace */
+ 0x000000ff, /* src_mask */
+ 0x000000ff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ HOWTO3 (R_NDS32_DIFF16, /* type */
+ 0, /* rightshift */
+ 1, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_DIFF16", /* name */
+ FALSE, /* partial_inplace */
+ 0x0000ffff, /* src_mask */
+ 0x0000ffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ HOWTO3 (R_NDS32_DIFF32, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_DIFF32", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ HOWTO3 (R_NDS32_DIFF_ULEB128, /* type */
+ 0, /* rightshift */
+ 0, /* size (0 = byte, 1 = short, 2 = long) */
+ 0, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_DIFF_ULEB128",/* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ HOWTO3 (R_NDS32_DATA, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_DATA", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ HOWTO3 (R_NDS32_TRAN, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_TRAN", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ HOWTO3 (R_NDS32_EMPTY, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_EMPTY", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ HOWTO3 (R_NDS32_TLS_LE_ADD, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_TLS_LE_ADD", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+ HOWTO3 (R_NDS32_TLS_LE_LS, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_TLS_LE_LS", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ HOWTO3 (R_NDS32_TLS_IEGP_LW, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_TLS_IEGP_LW", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* TLS GD/LD description address base addition. */
+ HOWTO3 (R_NDS32_TLS_DESC_ADD, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_TLS_DESC_ADD",/* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* TLS GD/LD description function load. */
+ HOWTO3 (R_NDS32_TLS_DESC_FUNC,/* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_TLS_DESC_FUNC",/* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* TLS DESC resolve function call. */
+ HOWTO3 (R_NDS32_TLS_DESC_CALL,/* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_TLS_DESC_CALL",/* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* TLS DESC variable access. */
+ HOWTO3 (R_NDS32_TLS_DESC_MEM, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_TLS_DESC_MEM",/* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* TLS GD/LD description mark (@tlsdec). */
+ HOWTO3 (R_NDS32_RELAX_REMOVE, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_REMOVE", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+
+ /* TLS GD/LD description mark (@tlsdec). */
+ HOWTO3 (R_NDS32_RELAX_GROUP, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont,/* complain_on_overflow */
+ nds32_elf_ignore_reloc,/* special_function */
+ "R_NDS32_GROUP", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
+};
+
+
+static unsigned long dl_tlsdesc_lazy_trampoline[] =
+{
+ 0x46200000, /* sethi $r2,#0x0 */
+ 0x58210000, /* ori $r2,$r2,#0x0 */
+ 0x40217400, /* add $r2,$r2,$gp */
+ 0x04210000, /* lwi $r2,[$r2+#0x0] */
+ 0x46300000, /* sethi $r3,#0x0 */
+ 0x58318000, /* ori $r3,$r3,#0x0 */
+ 0x4031f400, /* add $r3,$r3,$gp */
+ 0x4a000800, /* jr $r2 */
+};
+
+/* === code === */
+
+static void
+nds32_put_trampoline (void *contents, const unsigned long *template,
+ unsigned count)
+{
+ unsigned ix;
+
+ for (ix = 0; ix != count; ix++)
+ {
+ unsigned long insn = template[ix];
+ bfd_putb32 (insn, (char *) contents + ix * 4);
+ }
+}
+
+/* nds32_insertion_sort sorts an array with nmemb elements of size size.
+ This prototype is the same as qsort (). */
+
+void
+nds32_insertion_sort (void *base, size_t nmemb, size_t size,
+ int (*compar) (const void *lhs, const void *rhs))
+{
+ char *ptr = (char *) base;
+ int i, j;
+ char *tmp = alloca (size);
+
+ /* If i is less than j, i is inserted before j.
+
+ |---- j ----- i --------------|
+ \ / \ /
+ sorted unsorted
+ */
+
+ for (i = 1; i < (int) nmemb; i++)
+ {
+ for (j = (i - 1); j >= 0; j--)
+ if (compar (ptr + i * size, ptr + j * size) >= 0)
+ break;
+
+ j++;
+
+ if (i == j)
+ continue; /* i is in order. */
+
+ memcpy (tmp, ptr + i * size, size);
+ memmove (ptr + (j + 1) * size, ptr + j * size, (i - j) * size);
+ memcpy (ptr + j * size, tmp, size);
+ }
+}
+
+/* Sort relocation by r_offset.
+
+ We didn't use qsort () in stdlib, because quick-sort is not a stable sorting
+ algorithm. Relocations at the same r_offset must keep their order.
+ For example, RELAX_ENTRY must be the very first relocation entry.
+
+ Currently, this function implements insertion-sort.
+
+ FIXME: If we already sort them in assembler, why bother sort them
+ here again? */
+
+static int
+compar_reloc (const void *lhs, const void *rhs)
+{
+ const Elf_Internal_Rela *l = (const Elf_Internal_Rela *) lhs;
+ const Elf_Internal_Rela *r = (const Elf_Internal_Rela *) rhs;
+
+ if (l->r_offset > r->r_offset)
+ return 1;
+ else if (l->r_offset == r->r_offset)
+ return 0;
+ else
+ return -1;
+}
+
+/* Functions listed below are only used for old relocs.
+ nds32_elf_9_pcrel_reloc
+ nds32_elf_do_9_pcrel_reloc
+ nds32_elf_hi20_reloc
+ nds32_elf_relocate_hi20
+ nds32_elf_lo12_reloc
+ nds32_elf_sda15_reloc
+ nds32_elf_generic_reloc */
+
+/* Handle the R_NDS32_9_PCREL & R_NDS32_9_PCREL_RELA reloc. */
+
+static bfd_reloc_status_type
+nds32_elf_9_pcrel_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
+ void *data, asection *input_section, bfd *output_bfd,
+ char **error_message ATTRIBUTE_UNUSED)
+{
+ /* This part is from bfd_elf_generic_reloc. */
+ if (output_bfd != (bfd *) NULL
+ && (symbol->flags & BSF_SECTION_SYM) == 0
+ && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
+ {
+ reloc_entry->address += input_section->output_offset;
+ return bfd_reloc_ok;
+ }
+
+ if (output_bfd != NULL)
+ {
+ /* FIXME: See bfd_perform_relocation. Is this right? */
+ return bfd_reloc_continue;
+ }
+
+ return nds32_elf_do_9_pcrel_reloc (abfd, reloc_entry->howto,
+ input_section,
+ data, reloc_entry->address,
+ symbol->section,
+ (symbol->value
+ + symbol->section->output_section->vma
+ + symbol->section->output_offset),
+ reloc_entry->addend);
+}
+
+/* Utility to actually perform an R_NDS32_9_PCREL reloc. */
+#define N_ONES(n) (((((bfd_vma) 1 << ((n) - 1)) - 1) << 1) | 1)
+
+static bfd_reloc_status_type
+nds32_elf_do_9_pcrel_reloc (bfd *abfd, reloc_howto_type *howto,
+ asection *input_section, bfd_byte *data,
+ bfd_vma offset,
+ asection *symbol_section ATTRIBUTE_UNUSED,
+ bfd_vma symbol_value, bfd_vma addend)
+{
+ bfd_signed_vma relocation;
+ unsigned short x;
+ bfd_reloc_status_type status;
+
+ /* Sanity check the address (offset in section). */
+ if (offset > bfd_get_section_limit (abfd, input_section))
+ return bfd_reloc_outofrange;
+
+ relocation = symbol_value + addend;
+ /* Make it pc relative. */
+ relocation -= (input_section->output_section->vma
+ + input_section->output_offset);
+ /* These jumps mask off the lower two bits of the current address
+ before doing pcrel calculations. */
+ relocation -= (offset & -(bfd_vma) 2);
+
+ if (relocation < -ACCURATE_8BIT_S1 || relocation >= ACCURATE_8BIT_S1)
+ status = bfd_reloc_overflow;
+ else
+ status = bfd_reloc_ok;
+
+ x = bfd_getb16 (data + offset);
+
+ relocation >>= howto->rightshift;
+ relocation <<= howto->bitpos;
+ x = (x & ~howto->dst_mask)
+ | (((x & howto->src_mask) + relocation) & howto->dst_mask);
+
+ bfd_putb16 ((bfd_vma) x, data + offset);
+
+ return status;
+}
+
+/* Handle the R_NDS32_HI20_[SU]LO relocs.
+ HI20_SLO is for the add3 and load/store with displacement instructions.
+ HI20 is for the or3 instruction.
+ For R_NDS32_HI20_SLO, the lower 16 bits are sign extended when added to
+ the high 16 bytes so if the lower 16 bits are negative (bit 15 == 1) then
+ we must add one to the high 16 bytes (which will get subtracted off when
+ the low 16 bits are added).
+ These relocs have to be done in combination with an R_NDS32_LO12 reloc
+ because there is a carry from the LO12 to the HI20. Here we just save
+ the information we need; we do the actual relocation when we see the LO12.
+ This code is copied from the elf32-mips.c. We also support an arbitrary
+ number of HI20 relocs to be associated with a single LO12 reloc. The
+ assembler sorts the relocs to ensure each HI20 immediately precedes its
+ LO12. However if there are multiple copies, the assembler may not find
+ the real LO12 so it picks the first one it finds. */
+
+struct nds32_hi20
+{
+ struct nds32_hi20 *next;
+ bfd_byte *addr;
+ bfd_vma addend;
+};
+
+static struct nds32_hi20 *nds32_hi20_list;
+
+static bfd_reloc_status_type
+nds32_elf_hi20_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
+ asymbol *symbol, void *data, asection *input_section,
+ bfd *output_bfd, char **error_message ATTRIBUTE_UNUSED)
+{
+ bfd_reloc_status_type ret;
+ bfd_vma relocation;
+ struct nds32_hi20 *n;
+
+ /* This part is from bfd_elf_generic_reloc.
+ If we're relocating, and this an external symbol, we don't want
+ to change anything. */
+ if (output_bfd != (bfd *) NULL
+ && (symbol->flags & BSF_SECTION_SYM) == 0 && reloc_entry->addend == 0)
+ {
+ reloc_entry->address += input_section->output_offset;
+ return bfd_reloc_ok;
+ }
+
+ /* Sanity check the address (offset in section). */
+ if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
+ return bfd_reloc_outofrange;
+
+ ret = bfd_reloc_ok;
+ if (bfd_is_und_section (symbol->section) && output_bfd == (bfd *) NULL)
+ ret = bfd_reloc_undefined;
+
+ if (bfd_is_com_section (symbol->section))
+ relocation = 0;
+ else
+ relocation = symbol->value;
+
+ relocation += symbol->section->output_section->vma;
+ relocation += symbol->section->output_offset;
+ relocation += reloc_entry->addend;
+
+ /* Save the information, and let LO12 do the actual relocation. */
+ n = (struct nds32_hi20 *) bfd_malloc ((bfd_size_type) sizeof *n);
+ if (n == NULL)
+ return bfd_reloc_outofrange;
+
+ n->addr = (bfd_byte *) data + reloc_entry->address;
+ n->addend = relocation;
+ n->next = nds32_hi20_list;
+ nds32_hi20_list = n;
+
+ if (output_bfd != (bfd *) NULL)
+ reloc_entry->address += input_section->output_offset;
+
+ return ret;
+}
+
+/* Handle an NDS32 ELF HI20 reloc. */
+
+static void
+nds32_elf_relocate_hi20 (bfd *input_bfd ATTRIBUTE_UNUSED,
+ int type ATTRIBUTE_UNUSED, Elf_Internal_Rela *relhi,
+ Elf_Internal_Rela *rello, bfd_byte *contents,
+ bfd_vma addend)
+{
+ unsigned long insn;
+ bfd_vma addlo;
+
+ insn = bfd_getb32 (contents + relhi->r_offset);
+
+ addlo = bfd_getb32 (contents + rello->r_offset);
+ addlo &= 0xfff;
+
+ addend += ((insn & 0xfffff) << 20) + addlo;
+
+ insn = (insn & 0xfff00000) | ((addend >> 12) & 0xfffff);
+ bfd_putb32 (insn, contents + relhi->r_offset);
+}
+
+/* Do an R_NDS32_LO12 relocation. This is a straightforward 12 bit
+ inplace relocation; this function exists in order to do the
+ R_NDS32_HI20_[SU]LO relocation described above. */
+
+static bfd_reloc_status_type
+nds32_elf_lo12_reloc (bfd *input_bfd, arelent *reloc_entry, asymbol *symbol,
+ void *data, asection *input_section, bfd *output_bfd,
+ char **error_message)
+{
+ /* This part is from bfd_elf_generic_reloc.
+ If we're relocating, and this an external symbol, we don't want
+ to change anything. */
+ if (output_bfd != NULL && (symbol->flags & BSF_SECTION_SYM) == 0
+ && reloc_entry->addend == 0)
+ {
+ reloc_entry->address += input_section->output_offset;
+ return bfd_reloc_ok;
+ }
+
+ if (nds32_hi20_list != NULL)
+ {
+ struct nds32_hi20 *l;
+
+ l = nds32_hi20_list;
+ while (l != NULL)
+ {
+ unsigned long insn;
+ unsigned long val;
+ unsigned long vallo;
+ struct nds32_hi20 *next;
+
+ /* Do the HI20 relocation. Note that we actually don't need
+ to know anything about the LO12 itself, except where to
+ find the low 12 bits of the addend needed by the LO12. */
+ insn = bfd_getb32 (l->addr);
+ vallo = bfd_getb32 ((bfd_byte *) data + reloc_entry->address);
+ vallo &= 0xfff;
+ switch (reloc_entry->howto->type)
+ {
+ case R_NDS32_LO12S3:
+ vallo <<= 3;
+ break;
+
+ case R_NDS32_LO12S2:
+ vallo <<= 2;
+ break;
+
+ case R_NDS32_LO12S1:
+ vallo <<= 1;
+ break;
+
+ case R_NDS32_LO12S0:
+ vallo <<= 0;
+ break;
+ }
+
+ val = ((insn & 0xfffff) << 12) + vallo;
+ val += l->addend;
+
+ insn = (insn & ~(bfd_vma) 0xfffff) | ((val >> 12) & 0xfffff);
+ bfd_putb32 ((bfd_vma) insn, l->addr);
+
+ next = l->next;
+ free (l);
+ l = next;
+ }
+
+ nds32_hi20_list = NULL;
+ }
+
+ /* Now do the LO12 reloc in the usual way.
+ ??? It would be nice to call bfd_elf_generic_reloc here,
+ but we have partial_inplace set. bfd_elf_generic_reloc will
+ pass the handling back to bfd_install_relocation which will install
+ a section relative addend which is wrong. */
+ return nds32_elf_generic_reloc (input_bfd, reloc_entry, symbol, data,
+ input_section, output_bfd, error_message);
+}
+
+/* Do generic partial_inplace relocation.
+ This is a local replacement for bfd_elf_generic_reloc. */
+
+static bfd_reloc_status_type
+nds32_elf_generic_reloc (bfd *input_bfd, arelent *reloc_entry,
+ asymbol *symbol, void *data, asection *input_section,
+ bfd *output_bfd, char **error_message ATTRIBUTE_UNUSED)
+{
+ bfd_reloc_status_type ret;
+ bfd_vma relocation;
+ bfd_byte *inplace_address;
+
+ /* This part is from bfd_elf_generic_reloc.
+ If we're relocating, and this an external symbol, we don't want
+ to change anything. */
+ if (output_bfd != NULL && (symbol->flags & BSF_SECTION_SYM) == 0
+ && reloc_entry->addend == 0)
+ {
+ reloc_entry->address += input_section->output_offset;
+ return bfd_reloc_ok;
+ }
+
+ /* Now do the reloc in the usual way.
+ ??? It would be nice to call bfd_elf_generic_reloc here,
+ but we have partial_inplace set. bfd_elf_generic_reloc will
+ pass the handling back to bfd_install_relocation which will install
+ a section relative addend which is wrong. */
+
+ /* Sanity check the address (offset in section). */
+ if (reloc_entry->address > bfd_get_section_limit (input_bfd, input_section))
+ return bfd_reloc_outofrange;
+
+ ret = bfd_reloc_ok;
+ if (bfd_is_und_section (symbol->section) && output_bfd == (bfd *) NULL)
+ ret = bfd_reloc_undefined;
+
+ if (bfd_is_com_section (symbol->section) || output_bfd != (bfd *) NULL)
+ relocation = 0;
+ else
+ relocation = symbol->value;
+
+ /* Only do this for a final link. */
+ if (output_bfd == (bfd *) NULL)
+ {
+ relocation += symbol->section->output_section->vma;
+ relocation += symbol->section->output_offset;
+ }
+
+ relocation += reloc_entry->addend;
+ switch (reloc_entry->howto->type)
+ {
+ case R_NDS32_LO12S3:
+ relocation >>= 3;
+ break;
+
+ case R_NDS32_LO12S2:
+ relocation >>= 2;
+ break;
+
+ case R_NDS32_LO12S1:
+ relocation >>= 1;
+ break;
+
+ case R_NDS32_LO12S0:
+ default:
+ relocation >>= 0;
+ break;
+ }
+
+ inplace_address = (bfd_byte *) data + reloc_entry->address;
+
+#define DOIT(x) \
+ x = ((x & ~reloc_entry->howto->dst_mask) | \
+ (((x & reloc_entry->howto->src_mask) + relocation) & \
+ reloc_entry->howto->dst_mask))
+
+ switch (reloc_entry->howto->size)
+ {
+ case 1:
+ {
+ short x = bfd_getb16 (inplace_address);
+
+ DOIT (x);
+ bfd_putb16 ((bfd_vma) x, inplace_address);
+ }
+ break;
+ case 2:
+ {
+ unsigned long x = bfd_getb32 (inplace_address);
+
+ DOIT (x);
+ bfd_putb32 ((bfd_vma) x, inplace_address);
+ }
+ break;
+ default:
+ BFD_ASSERT (0);
+ }
+
+ if (output_bfd != (bfd *) NULL)
+ reloc_entry->address += input_section->output_offset;
+
+ return ret;
+}
+
+/* Handle the R_NDS32_SDA15 reloc.
+ This reloc is used to compute the address of objects in the small data area
+ and to perform loads and stores from that area.
+ The lower 15 bits are sign extended and added to the register specified
+ in the instruction, which is assumed to point to _SDA_BASE_.
+
+ Since the lower 15 bits offset is left-shifted 0, 1 or 2 bits depending on
+ the access size, this must be taken care of. */
+
+static bfd_reloc_status_type
+nds32_elf_sda15_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
+ asymbol *symbol, void *data ATTRIBUTE_UNUSED,
+ asection *input_section, bfd *output_bfd,
+ char **error_message ATTRIBUTE_UNUSED)
+{
+ /* This part is from bfd_elf_generic_reloc. */
+ if (output_bfd != (bfd *) NULL
+ && (symbol->flags & BSF_SECTION_SYM) == 0
+ && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
+ {
+ reloc_entry->address += input_section->output_offset;
+ return bfd_reloc_ok;
+ }
+
+ if (output_bfd != NULL)
+ {
+ /* FIXME: See bfd_perform_relocation. Is this right? */
+ return bfd_reloc_continue;
+ }
+
+ /* FIXME: not sure what to do here yet. But then again, the linker
+ may never call us. */
+ abort ();
+}
+
+/* nds32_elf_ignore_reloc is the special function for
+ relocation types which don't need to be relocated
+ like relaxation relocation types.
+ This function simply return bfd_reloc_ok when it is
+ invoked. */
+
+static bfd_reloc_status_type
+nds32_elf_ignore_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
+ asymbol *symbol ATTRIBUTE_UNUSED,
+ void *data ATTRIBUTE_UNUSED, asection *input_section,
+ bfd *output_bfd, char **error_message ATTRIBUTE_UNUSED)
+{
+ if (output_bfd != NULL)
+ reloc_entry->address += input_section->output_offset;
+
+ return bfd_reloc_ok;
+}
+
+
+/* Map BFD reloc types to NDS32 ELF reloc types. */
+
+struct nds32_reloc_map_entry
+{
+ bfd_reloc_code_real_type bfd_reloc_val;
+ unsigned char elf_reloc_val;
+};
+
+static const struct nds32_reloc_map_entry nds32_reloc_map[] = {
+ {BFD_RELOC_NONE, R_NDS32_NONE},
+ {BFD_RELOC_16, R_NDS32_16_RELA},
+ {BFD_RELOC_32, R_NDS32_32_RELA},
+ {BFD_RELOC_NDS32_20, R_NDS32_20_RELA},
+ {BFD_RELOC_NDS32_5, R_NDS32_5_RELA},
+ {BFD_RELOC_NDS32_9_PCREL, R_NDS32_9_PCREL_RELA},
+ {BFD_RELOC_NDS32_WORD_9_PCREL, R_NDS32_WORD_9_PCREL_RELA},
+ {BFD_RELOC_NDS32_15_PCREL, R_NDS32_15_PCREL_RELA},
+ {BFD_RELOC_NDS32_17_PCREL, R_NDS32_17_PCREL_RELA},
+ {BFD_RELOC_NDS32_25_PCREL, R_NDS32_25_PCREL_RELA},
+ {BFD_RELOC_NDS32_10_UPCREL, R_NDS32_10_UPCREL_RELA},
+ {BFD_RELOC_NDS32_HI20, R_NDS32_HI20_RELA},
+ {BFD_RELOC_NDS32_LO12S3, R_NDS32_LO12S3_RELA},
+ {BFD_RELOC_NDS32_LO12S2, R_NDS32_LO12S2_RELA},
+ {BFD_RELOC_NDS32_LO12S1, R_NDS32_LO12S1_RELA},
+ {BFD_RELOC_NDS32_LO12S0, R_NDS32_LO12S0_RELA},
+ {BFD_RELOC_NDS32_LO12S0_ORI, R_NDS32_LO12S0_ORI_RELA},
+ {BFD_RELOC_NDS32_SDA15S3, R_NDS32_SDA15S3_RELA},
+ {BFD_RELOC_NDS32_SDA15S2, R_NDS32_SDA15S2_RELA},
+ {BFD_RELOC_NDS32_SDA15S1, R_NDS32_SDA15S1_RELA},
+ {BFD_RELOC_NDS32_SDA15S0, R_NDS32_SDA15S0_RELA},
+ {BFD_RELOC_VTABLE_INHERIT, R_NDS32_RELA_GNU_VTINHERIT},
+ {BFD_RELOC_VTABLE_ENTRY, R_NDS32_RELA_GNU_VTENTRY},
+
+ {BFD_RELOC_NDS32_GOT20, R_NDS32_GOT20},
+ {BFD_RELOC_NDS32_9_PLTREL, R_NDS32_9_PLTREL},
+ {BFD_RELOC_NDS32_25_PLTREL, R_NDS32_25_PLTREL},
+ {BFD_RELOC_NDS32_COPY, R_NDS32_COPY},
+ {BFD_RELOC_NDS32_GLOB_DAT, R_NDS32_GLOB_DAT},
+ {BFD_RELOC_NDS32_JMP_SLOT, R_NDS32_JMP_SLOT},
+ {BFD_RELOC_NDS32_RELATIVE, R_NDS32_RELATIVE},
+ {BFD_RELOC_NDS32_GOTOFF, R_NDS32_GOTOFF},
+ {BFD_RELOC_NDS32_GOTPC20, R_NDS32_GOTPC20},
+ {BFD_RELOC_NDS32_GOT_HI20, R_NDS32_GOT_HI20},
+ {BFD_RELOC_NDS32_GOT_LO12, R_NDS32_GOT_LO12},
+ {BFD_RELOC_NDS32_GOT_LO15, R_NDS32_GOT_LO15},
+ {BFD_RELOC_NDS32_GOT_LO19, R_NDS32_GOT_LO19},
+ {BFD_RELOC_NDS32_GOTPC_HI20, R_NDS32_GOTPC_HI20},
+ {BFD_RELOC_NDS32_GOTPC_LO12, R_NDS32_GOTPC_LO12},
+ {BFD_RELOC_NDS32_GOTOFF_HI20, R_NDS32_GOTOFF_HI20},
+ {BFD_RELOC_NDS32_GOTOFF_LO12, R_NDS32_GOTOFF_LO12},
+ {BFD_RELOC_NDS32_GOTOFF_LO15, R_NDS32_GOTOFF_LO15},
+ {BFD_RELOC_NDS32_GOTOFF_LO19, R_NDS32_GOTOFF_LO19},
+ {BFD_RELOC_NDS32_INSN16, R_NDS32_INSN16},
+ {BFD_RELOC_NDS32_LABEL, R_NDS32_LABEL},
+ {BFD_RELOC_NDS32_LONGCALL1, R_NDS32_LONGCALL1},
+ {BFD_RELOC_NDS32_LONGCALL2, R_NDS32_LONGCALL2},
+ {BFD_RELOC_NDS32_LONGCALL3, R_NDS32_LONGCALL3},
+ {BFD_RELOC_NDS32_LONGCALL4, R_NDS32_LONGCALL4},
+ {BFD_RELOC_NDS32_LONGCALL5, R_NDS32_LONGCALL5},
+ {BFD_RELOC_NDS32_LONGCALL6, R_NDS32_LONGCALL6},
+ {BFD_RELOC_NDS32_LONGJUMP1, R_NDS32_LONGJUMP1},
+ {BFD_RELOC_NDS32_LONGJUMP2, R_NDS32_LONGJUMP2},
+ {BFD_RELOC_NDS32_LONGJUMP3, R_NDS32_LONGJUMP3},
+ {BFD_RELOC_NDS32_LONGJUMP4, R_NDS32_LONGJUMP4},
+ {BFD_RELOC_NDS32_LONGJUMP5, R_NDS32_LONGJUMP5},
+ {BFD_RELOC_NDS32_LONGJUMP6, R_NDS32_LONGJUMP6},
+ {BFD_RELOC_NDS32_LONGJUMP7, R_NDS32_LONGJUMP7},
+ {BFD_RELOC_NDS32_SECURITY_16, R_NDS32_SECURITY_16},
+ {BFD_RELOC_NDS32_LOADSTORE, R_NDS32_LOADSTORE},
+ {BFD_RELOC_NDS32_9_FIXED, R_NDS32_9_FIXED_RELA},
+ {BFD_RELOC_NDS32_15_FIXED, R_NDS32_15_FIXED_RELA},
+ {BFD_RELOC_NDS32_17_FIXED, R_NDS32_17_FIXED_RELA},
+ {BFD_RELOC_NDS32_25_FIXED, R_NDS32_25_FIXED_RELA},
+ {BFD_RELOC_NDS32_PLTREL_HI20, R_NDS32_PLTREL_HI20},
+ {BFD_RELOC_NDS32_PLTREL_LO12, R_NDS32_PLTREL_LO12},
+ {BFD_RELOC_NDS32_PLT_GOTREL_HI20, R_NDS32_PLT_GOTREL_HI20},
+ {BFD_RELOC_NDS32_PLT_GOTREL_LO12, R_NDS32_PLT_GOTREL_LO12},
+ {BFD_RELOC_NDS32_PLT_GOTREL_LO15, R_NDS32_PLT_GOTREL_LO15},
+ {BFD_RELOC_NDS32_PLT_GOTREL_LO19, R_NDS32_PLT_GOTREL_LO19},
+ {BFD_RELOC_NDS32_PLT_GOTREL_LO20, R_NDS32_PLT_GOTREL_LO20},
+ {BFD_RELOC_NDS32_SDA12S2_DP, R_NDS32_SDA12S2_DP_RELA},
+ {BFD_RELOC_NDS32_SDA12S2_SP, R_NDS32_SDA12S2_SP_RELA},
+ {BFD_RELOC_NDS32_LO12S2_DP, R_NDS32_LO12S2_DP_RELA},
+ {BFD_RELOC_NDS32_LO12S2_SP, R_NDS32_LO12S2_SP_RELA},
+ {BFD_RELOC_NDS32_SDA16S3, R_NDS32_SDA16S3_RELA},
+ {BFD_RELOC_NDS32_SDA17S2, R_NDS32_SDA17S2_RELA},
+ {BFD_RELOC_NDS32_SDA18S1, R_NDS32_SDA18S1_RELA},
+ {BFD_RELOC_NDS32_SDA19S0, R_NDS32_SDA19S0_RELA},
+ {BFD_RELOC_NDS32_SDA_FP7U2_RELA, R_NDS32_SDA_FP7U2_RELA},
+ {BFD_RELOC_NDS32_DWARF2_OP1, R_NDS32_DWARF2_OP1_RELA},
+ {BFD_RELOC_NDS32_DWARF2_OP2, R_NDS32_DWARF2_OP2_RELA},
+ {BFD_RELOC_NDS32_DWARF2_LEB, R_NDS32_DWARF2_LEB_RELA},
+ {BFD_RELOC_NDS32_UPDATE_TA, R_NDS32_UPDATE_TA_RELA},
+ {BFD_RELOC_NDS32_GOT_SUFF, R_NDS32_GOT_SUFF},
+ {BFD_RELOC_NDS32_GOTOFF_SUFF, R_NDS32_GOTOFF_SUFF},
+ {BFD_RELOC_NDS32_GOT15S2, R_NDS32_GOT15S2_RELA},
+ {BFD_RELOC_NDS32_GOT17S2, R_NDS32_GOT17S2_RELA},
+ {BFD_RELOC_NDS32_PTR, R_NDS32_PTR},
+ {BFD_RELOC_NDS32_PTR_COUNT, R_NDS32_PTR_COUNT},
+ {BFD_RELOC_NDS32_PLT_GOT_SUFF, R_NDS32_PLT_GOT_SUFF},
+ {BFD_RELOC_NDS32_PTR_RESOLVED, R_NDS32_PTR_RESOLVED},
+ {BFD_RELOC_NDS32_RELAX_ENTRY, R_NDS32_RELAX_ENTRY},
+ {BFD_RELOC_NDS32_MULCALL_SUFF, R_NDS32_MULCALL_SUFF},
+ {BFD_RELOC_NDS32_PLTBLOCK, R_NDS32_PLTBLOCK},
+ {BFD_RELOC_NDS32_RELAX_REGION_BEGIN, R_NDS32_RELAX_REGION_BEGIN},
+ {BFD_RELOC_NDS32_RELAX_REGION_END, R_NDS32_RELAX_REGION_END},
+ {BFD_RELOC_NDS32_MINUEND, R_NDS32_MINUEND},
+ {BFD_RELOC_NDS32_SUBTRAHEND, R_NDS32_SUBTRAHEND},
+ {BFD_RELOC_NDS32_EMPTY, R_NDS32_EMPTY},
+
+ {BFD_RELOC_NDS32_DIFF8, R_NDS32_DIFF8},
+ {BFD_RELOC_NDS32_DIFF16, R_NDS32_DIFF16},
+ {BFD_RELOC_NDS32_DIFF32, R_NDS32_DIFF32},
+ {BFD_RELOC_NDS32_DIFF_ULEB128, R_NDS32_DIFF_ULEB128},
+ {BFD_RELOC_NDS32_25_ABS, R_NDS32_25_ABS_RELA},
+ {BFD_RELOC_NDS32_DATA, R_NDS32_DATA},
+ {BFD_RELOC_NDS32_TRAN, R_NDS32_TRAN},
+ {BFD_RELOC_NDS32_17IFC_PCREL, R_NDS32_17IFC_PCREL_RELA},
+ {BFD_RELOC_NDS32_10IFCU_PCREL, R_NDS32_10IFCU_PCREL_RELA},
+ {BFD_RELOC_NDS32_TLS_LE_HI20, R_NDS32_TLS_LE_HI20},
+ {BFD_RELOC_NDS32_TLS_LE_LO12, R_NDS32_TLS_LE_LO12},
+ {BFD_RELOC_NDS32_TLS_LE_ADD, R_NDS32_TLS_LE_ADD},
+ {BFD_RELOC_NDS32_TLS_LE_LS, R_NDS32_TLS_LE_LS},
+ {BFD_RELOC_NDS32_TLS_IE_HI20, R_NDS32_TLS_IE_HI20},
+ {BFD_RELOC_NDS32_TLS_IE_LO12S2, R_NDS32_TLS_IE_LO12S2},
+ {BFD_RELOC_NDS32_TLS_LE_20, R_NDS32_TLS_LE_20},
+ {BFD_RELOC_NDS32_TLS_LE_15S0, R_NDS32_TLS_LE_15S0},
+ {BFD_RELOC_NDS32_TLS_LE_15S1, R_NDS32_TLS_LE_15S1},
+ {BFD_RELOC_NDS32_TLS_LE_15S2, R_NDS32_TLS_LE_15S2},
+
+ {BFD_RELOC_NDS32_TLS_DESC, R_NDS32_TLS_DESC},
+ {BFD_RELOC_NDS32_TLS_DESC_HI20, R_NDS32_TLS_DESC_HI20},
+ {BFD_RELOC_NDS32_TLS_DESC_LO12, R_NDS32_TLS_DESC_LO12},
+ {BFD_RELOC_NDS32_TLS_DESC_ADD, R_NDS32_TLS_DESC_ADD},
+ {BFD_RELOC_NDS32_TLS_DESC_FUNC, R_NDS32_TLS_DESC_FUNC},
+ {BFD_RELOC_NDS32_TLS_DESC_CALL, R_NDS32_TLS_DESC_CALL},
+ {BFD_RELOC_NDS32_TLS_DESC_MEM, R_NDS32_TLS_DESC_MEM},
+ {BFD_RELOC_NDS32_TLS_DESC_20, R_NDS32_TLS_DESC_20},
+ {BFD_RELOC_NDS32_TLS_DESC_SDA17S2, R_NDS32_TLS_DESC_SDA17S2},
+ {BFD_RELOC_NDS32_TLS_IE_LO12, R_NDS32_TLS_IE_LO12},
+ {BFD_RELOC_NDS32_TLS_IEGP_HI20, R_NDS32_TLS_IEGP_HI20},
+ {BFD_RELOC_NDS32_TLS_IEGP_LO12, R_NDS32_TLS_IEGP_LO12},
+ {BFD_RELOC_NDS32_TLS_IEGP_LO12S2, R_NDS32_TLS_IEGP_LO12S2},
+ {BFD_RELOC_NDS32_TLS_IEGP_LW, R_NDS32_TLS_IEGP_LW},
+
+ {BFD_RELOC_NDS32_REMOVE, R_NDS32_RELAX_REMOVE},
+ {BFD_RELOC_NDS32_GROUP, R_NDS32_RELAX_GROUP},
+
+ {BFD_RELOC_NDS32_ICT_HI20, R_NDS32_ICT_HI20},
+ {BFD_RELOC_NDS32_ICT_LO12, R_NDS32_ICT_LO12},
+ {BFD_RELOC_NDS32_ICT_25PC, R_NDS32_ICT_25PC},
+};
+
+/* Patch tag. */
+
+/* Reserve space for COUNT dynamic relocations in relocation selection
+ SRELOC. */
+
+static inline void
+elf32_nds32_allocate_dynrelocs (struct bfd_link_info *info, asection *sreloc,
+ bfd_size_type count)
+{
+ BFD_ASSERT (elf_hash_table (info)->dynamic_sections_created);
+ if (sreloc == NULL)
+ abort ();
+ sreloc->size += sizeof (Elf32_External_Rela) * count;
+}
+
+static reloc_howto_type *
+bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
+ const char *r_name)
+{
+ unsigned int i;
+
+ for (i = 0; i < ARRAY_SIZE (nds32_elf_howto_table); i++)
+ if (nds32_elf_howto_table[i].name != NULL
+ && strcasecmp (nds32_elf_howto_table[i].name, r_name) == 0)
+ return &nds32_elf_howto_table[i];
+
+ for (i = 0; i < ARRAY_SIZE (nds32_elf_relax_howto_table); i++)
+ if (nds32_elf_relax_howto_table[i].name != NULL
+ && strcasecmp (nds32_elf_relax_howto_table[i].name, r_name) == 0)
+ return &nds32_elf_relax_howto_table[i];
+
+ return NULL;
+}
+
+static reloc_howto_type *
+bfd_elf32_bfd_reloc_type_table_lookup (enum elf_nds32_reloc_type code)
+{
+ if (code < R_NDS32_RELAX_ENTRY)
+ {
+ BFD_ASSERT (code < ARRAY_SIZE (nds32_elf_howto_table));
+ return &nds32_elf_howto_table[code];
+ }
+ else
+ {
+ if ((size_t) (code - R_NDS32_RELAX_ENTRY) >=
+ ARRAY_SIZE (nds32_elf_relax_howto_table))
+ {
+ int i = code;
+ i += 1;
+ }
+
+ BFD_ASSERT ((size_t) (code - R_NDS32_RELAX_ENTRY)
+ < ARRAY_SIZE (nds32_elf_relax_howto_table));
+ return &nds32_elf_relax_howto_table[code - R_NDS32_RELAX_ENTRY];
+ }
+}
+
+static reloc_howto_type *
+bfd_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
+ bfd_reloc_code_real_type code)
+{
+ unsigned int i;
+
+ for (i = 0; i < ARRAY_SIZE (nds32_reloc_map); i++)
+ {
+ if (nds32_reloc_map[i].bfd_reloc_val == code)
+ return bfd_elf32_bfd_reloc_type_table_lookup
+ (nds32_reloc_map[i].elf_reloc_val);
+ }
+
+ return NULL;
+}
+
+/* Set the howto pointer for an NDS32 ELF reloc. */
+
+static void
+nds32_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
+ Elf_Internal_Rela *dst)
+{
+ enum elf_nds32_reloc_type r_type;
+
+ r_type = ELF32_R_TYPE (dst->r_info);
+ BFD_ASSERT (ELF32_R_TYPE (dst->r_info) <= R_NDS32_GNU_VTENTRY);
+ cache_ptr->howto = bfd_elf32_bfd_reloc_type_table_lookup (r_type);
+}
+
+static void
+nds32_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
+ Elf_Internal_Rela *dst)
+{
+ BFD_ASSERT ((ELF32_R_TYPE (dst->r_info) == R_NDS32_NONE)
+ || ((ELF32_R_TYPE (dst->r_info) > R_NDS32_GNU_VTENTRY)
+ && (ELF32_R_TYPE (dst->r_info) < R_NDS32_max)));
+ cache_ptr->howto =
+ bfd_elf32_bfd_reloc_type_table_lookup (ELF32_R_TYPE (dst->r_info));
+}
+
+/* Support for core dump NOTE sections.
+ Reference to include/linux/elfcore.h in Linux. */
+
+static bfd_boolean
+nds32_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
+{
+ int offset;
+ size_t size;
+
+ switch (note->descsz)
+ {
+ case 0x114:
+ /* Linux/NDS32 32-bit, ABI1 */
+
+ /* pr_cursig */
+ elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
+
+ /* pr_pid */
+ elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 24);
+
+ /* pr_reg */
+ offset = 72;
+ size = 200;
+ break;
+
+ case 0xfc:
+ /* Linux/NDS32 32-bit */
+
+ /* pr_cursig */
+ elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
+
+ /* pr_pid */
+ elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 24);
+
+ /* pr_reg */
+ offset = 72;
+ size = 176;
+ break;
+
+ default:
+ return FALSE;
+ }
+
+ /* Make a ".reg" section. */
+ return _bfd_elfcore_make_pseudosection (abfd, ".reg",
+ size, note->descpos + offset);
+}
+
+static bfd_boolean
+nds32_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
+{
+ switch (note->descsz)
+ {
+ case 124:
+ /* Linux/NDS32 */
+
+ /* __kernel_uid_t, __kernel_gid_t are short on NDS32 platform. */
+ elf_tdata (abfd)->core->program =
+ _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
+ elf_tdata (abfd)->core->command =
+ _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
+
+ default:
+ return FALSE;
+ }
+
+ /* Note that for some reason, a spurious space is tacked
+ onto the end of the args in some (at least one anyway)
+ implementations, so strip it off if it exists. */
+ {
+ char *command = elf_tdata (abfd)->core->command;
+ int n = strlen (command);
+
+ if (0 < n && command[n - 1] == ' ')
+ command[n - 1] = '\0';
+ }
+
+ return TRUE;
+}
+
+/* Hook called by the linker routine which adds symbols from an object
+ file. We must handle the special NDS32 section numbers here.
+ We also keep watching for whether we need to create the sdata special
+ linker sections. */
+
+static bfd_boolean
+nds32_elf_add_symbol_hook (bfd *abfd,
+ struct bfd_link_info *info ATTRIBUTE_UNUSED,
+ Elf_Internal_Sym *sym,
+ const char **namep ATTRIBUTE_UNUSED,
+ flagword *flagsp ATTRIBUTE_UNUSED,
+ asection **secp, bfd_vma *valp)
+{
+ switch (sym->st_shndx)
+ {
+ case SHN_COMMON:
+ /* Common symbols less than the GP size are automatically
+ treated as SHN_MIPS_SCOMMON symbols. */
+ if (sym->st_size > elf_gp_size (abfd)
+ || ELF_ST_TYPE (sym->st_info) == STT_TLS)
+ break;
+
+ /* st_value is the alignemnt constraint.
+ That might be its actual size if it is an array or structure. */
+ switch (sym->st_value)
+ {
+ case 1:
+ *secp = bfd_make_section_old_way (abfd, ".scommon_b");
+ break;
+ case 2:
+ *secp = bfd_make_section_old_way (abfd, ".scommon_h");
+ break;
+ case 4:
+ *secp = bfd_make_section_old_way (abfd, ".scommon_w");
+ break;
+ case 8:
+ *secp = bfd_make_section_old_way (abfd, ".scommon_d");
+ break;
+ default:
+ return TRUE;
+ }
+
+ (*secp)->flags |= SEC_IS_COMMON;
+ *valp = sym->st_size;
+ break;
+ }
+
+ return TRUE;
+}
+
+
+/* This function can figure out the best location for a base register to access
+ data relative to this base register
+ INPUT:
+ sda_d0: size of first DOUBLE WORD data section
+ sda_w0: size of first WORD data section
+ sda_h0: size of first HALF WORD data section
+ sda_b : size of BYTE data section
+ sda_hi: size of second HALF WORD data section
+ sda_w1: size of second WORD data section
+ sda_d1: size of second DOUBLE WORD data section
+ OUTPUT:
+ offset (always positive) from the beginning of sda_d0 if OK
+ a negative error value if fail
+ NOTE:
+ these 7 sections have to be located back to back if exist
+ a pass in 0 value for non-existing section */
+
+/* Due to the interpretation of simm15 field of load/store depending on
+ data accessing size, the organization of base register relative data shall
+ like the following figure
+ -------------------------------------------
+ | DOUBLE WORD sized data (range +/- 128K)
+ -------------------------------------------
+ | WORD sized data (range +/- 64K)
+ -------------------------------------------
+ | HALF WORD sized data (range +/- 32K)
+ -------------------------------------------
+ | BYTE sized data (range +/- 16K)
+ -------------------------------------------
+ | HALF WORD sized data (range +/- 32K)
+ -------------------------------------------
+ | WORD sized data (range +/- 64K)
+ -------------------------------------------
+ | DOUBLE WORD sized data (range +/- 128K)
+ -------------------------------------------
+ Its base register shall be set to access these data freely. */
+
+/* We have to figure out the SDA_BASE value, so that we can adjust the
+ symbol value correctly. We look up the symbol _SDA_BASE_ in the output
+ BFD. If we can't find it, we're stuck. We cache it in the ELF
+ target data. We don't need to adjust the symbol value for an
+ external symbol if we are producing relocatable output. */
+
+static asection *sda_rela_sec = NULL;
+
+#define SDA_SECTION_NUM 10
+
+static bfd_reloc_status_type
+nds32_elf_final_sda_base (bfd *output_bfd, struct bfd_link_info *info,
+ bfd_vma *psb, bfd_boolean add_symbol)
+{
+ int relax_fp_as_gp;
+ struct elf_nds32_link_hash_table *table;
+ struct bfd_link_hash_entry *h, *h2;
+ long unsigned int total = 0;
+ asection *first = NULL, *final = NULL, *temp;
+ bfd_vma sda_base = 0;
+
+ h = bfd_link_hash_lookup (info->hash, "_SDA_BASE_", FALSE, FALSE, TRUE);
+ if (!h || (h->type != bfd_link_hash_defined && h->type != bfd_link_hash_defweak))
+ {
+ /* The first section must be 4-byte aligned to promise _SDA_BASE_ being
+ 4 byte-aligned. Therefore, it has to set the first section ".data"
+ 4 byte-aligned. */
+ static const char sec_name[SDA_SECTION_NUM][10] = {
+ ".data", ".got", ".sdata_d", ".sdata_w", ".sdata_h", ".sdata_b",
+ ".sbss_b", ".sbss_h", ".sbss_w", ".sbss_d"
+ };
+ size_t i = 0;
+
+ if (output_bfd->sections == NULL)
+ {
+ *psb = elf_gp (output_bfd);
+ return bfd_reloc_ok;
+ }
+
+ /* Get the first and final section. */
+ while (i < ARRAY_SIZE (sec_name))
+ {
+ temp = bfd_get_section_by_name (output_bfd, sec_name[i]);
+ if (temp && !first && (temp->size != 0 || temp->rawsize != 0))
+ first = temp;
+ if (temp && (temp->size != 0 || temp->rawsize != 0))
+ final = temp;
+
+ /* Summarize the sections in order to check if joining .bss. */
+ if (temp && temp->size != 0)
+ total += temp->size;
+ else if (temp && temp->rawsize != 0)
+ total += temp->rawsize;
+
+ i++;
+ }
+
+ /* Check .bss size. */
+ temp = bfd_get_section_by_name (output_bfd, ".bss");
+ if (temp)
+ {
+ if (temp->size != 0)
+ total += temp->size;
+ else if (temp->rawsize != 0)
+ total += temp->rawsize;
+
+ if (total < 0x80000)
+ {
+ if (!first && (temp->size != 0 || temp->rawsize != 0))
+ first = temp;
+ if ((temp->size != 0 || temp->rawsize != 0))
+ final = temp;
+ }
+ }
+
+ if (first && final)
+ {
+ /* The middle of data region. */
+ sda_base = final->vma / 2 + final->rawsize / 2 + first->vma / 2;
+
+ /* Find the section sda_base located. */
+ i = 0;
+ while (i < ARRAY_SIZE (sec_name))
+ {
+ final = bfd_get_section_by_name (output_bfd, sec_name[i]);
+ if (final && (final->size != 0 || final->rawsize != 0)
+ && sda_base >= final->vma)
+ {
+ first = final;
+ i++;
+ }
+ else
+ break;
+ }
+ }
+ else
+ {
+ /* If there is not any default data section in output bfd, try to find
+ the first data section. If no data section be found, just simplily
+ choose the first output section. */
+ temp = output_bfd->sections;
+ while (temp)
+ {
+ if (temp->flags & SEC_ALLOC
+ && (((temp->flags & SEC_DATA)
+ && ((temp->flags & SEC_READONLY) == 0))
+ || (temp->flags & SEC_LOAD) == 0)
+ && (temp->size != 0 || temp->rawsize != 0))
+ {
+ if (!first)
+ first = temp;
+ final = temp;
+ }
+ temp = temp->next;
+ }
+
+ /* There is no data or bss section. */
+ if (!first || (first->size == 0 && first->rawsize == 0))
+ {
+ first = output_bfd->sections;
+ while (first && first->size == 0 && first->rawsize == 0)
+ first = first->next;
+ }
+
+ /* There is no concrete section. */
+ if (!first)
+ {
+ *psb = elf_gp (output_bfd);
+ return bfd_reloc_ok;
+ }
+
+ if (final && (final->vma + final->rawsize - first->vma) <= 0x4000)
+ sda_base = final->vma / 2 + final->rawsize / 2 + first->vma / 2;
+ else
+ sda_base = first->vma + 0x2000;
+ }
+
+ sda_base -= first->vma;
+ sda_base = sda_base & (~7);
+
+ if (!_bfd_generic_link_add_one_symbol
+ (info, output_bfd, "_SDA_BASE_", BSF_GLOBAL | BSF_WEAK, first,
+ (bfd_vma) sda_base, (const char *) NULL, FALSE,
+ get_elf_backend_data (output_bfd)->collect, &h))
+ return FALSE;
+
+ sda_rela_sec = first;
+
+ }
+
+ /* Set _FP_BASE_ to _SDA_BASE_. */
+ table = nds32_elf_hash_table (info);
+ relax_fp_as_gp = table->relax_fp_as_gp;
+ h2 = bfd_link_hash_lookup (info->hash, FP_BASE_NAME, FALSE, FALSE, FALSE);
+ /* _SDA_BASE_ is difined in linker script. */
+ if (!first)
+ {
+ first = h->u.def.section;
+ sda_base = h->u.def.value;
+ }
+
+ if (relax_fp_as_gp && h2
+ && (h2->type == bfd_link_hash_undefweak
+ || h2->type == bfd_link_hash_undefined))
+ {
+ /* Define a weak FP_BASE_NAME here to prevent the undefined symbol.
+ And set FP equal to SDA_BASE to do relaxation for
+ la $fp, _FP_BASE_. */
+ if (!_bfd_generic_link_add_one_symbol
+ (info, output_bfd, FP_BASE_NAME, BSF_GLOBAL | BSF_WEAK,
+ first, sda_base, (const char *) NULL,
+ FALSE, get_elf_backend_data (output_bfd)->collect, &h2))
+ return FALSE;
+ }
+
+ if (add_symbol == TRUE)
+ {
+ if (h)
+ {
+ /* Now set gp. */
+ elf_gp (output_bfd) = (h->u.def.value
+ + h->u.def.section->output_section->vma
+ + h->u.def.section->output_offset);
+ }
+ else
+ {
+ (*_bfd_error_handler) (_("error: Can't find symbol: _SDA_BASE_."));
+ return bfd_reloc_dangerous;
+ }
+ }
+
+ *psb = h->u.def.value + h->u.def.section->output_section->vma
+ + h->u.def.section->output_offset;
+ return bfd_reloc_ok;
+}
+
+
+/* Return size of a PLT entry. */
+#define elf_nds32_sizeof_plt(info) PLT_ENTRY_SIZE
+
+
+/* Create an entry in an nds32 ELF linker hash table. */
+
+static struct bfd_hash_entry *
+nds32_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
+ struct bfd_hash_table *table,
+ const char *string)
+{
+ struct elf_nds32_link_hash_entry *ret;
+
+ ret = (struct elf_nds32_link_hash_entry *) entry;
+
+ /* Allocate the structure if it has not already been allocated by a
+ subclass. */
+ if (ret == NULL)
+ ret = (struct elf_nds32_link_hash_entry *)
+ bfd_hash_allocate (table, sizeof (struct elf_nds32_link_hash_entry));
+
+ if (ret == NULL)
+ return (struct bfd_hash_entry *) ret;
+
+ /* Call the allocation method of the superclass. */
+ ret = (struct elf_nds32_link_hash_entry *)
+ _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret, table, string);
+
+ if (ret != NULL)
+ {
+ struct elf_nds32_link_hash_entry *eh;
+
+ eh = (struct elf_nds32_link_hash_entry *) ret;
+ eh->dyn_relocs = NULL;
+ eh->tls_type = GOT_UNKNOWN;
+ eh->offset_to_gp = 0;
+ eh->indirect_call = FALSE;
+ }
+
+ return (struct bfd_hash_entry *) ret;
+}
+
+/* Create an nds32 ELF linker hash table. */
+
+static struct bfd_link_hash_table *
+nds32_elf_link_hash_table_create (bfd *abfd)
+{
+ struct elf_nds32_link_hash_table *ret;
+
+ bfd_size_type amt = sizeof (struct elf_nds32_link_hash_table);
+
+ ret = (struct elf_nds32_link_hash_table *) bfd_zmalloc (amt);
+ if (ret == NULL)
+ return NULL;
+
+ /* patch tag. */
+ if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
+ nds32_elf_link_hash_newfunc,
+ sizeof (struct elf_nds32_link_hash_entry),
+ NDS32_ELF_DATA))
+ {
+ free (ret);
+ return NULL;
+ }
+
+ ret->sdynbss = NULL;
+ ret->srelbss = NULL;
+ ret->sym_ld_script = NULL;
+ ret->ex9_export_file = NULL;
+ ret->ex9_import_file = NULL;
+
+ return &ret->root.root;
+}
+
+/* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up
+ shortcuts to them in our hash table. */
+
+static bfd_boolean
+create_got_section (bfd *dynobj, struct bfd_link_info *info)
+{
+ struct elf_link_hash_table *ehtab;
+
+ if (!_bfd_elf_create_got_section (dynobj, info))
+ return FALSE;
+
+ ehtab = elf_hash_table (info);
+ ehtab->sgot = bfd_get_section_by_name (dynobj, ".got");
+ ehtab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
+ if (!ehtab->sgot || !ehtab->sgotplt)
+ abort ();
+
+ /* _bfd_elf_create_got_section will create it for us. */
+ ehtab->srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
+ if (ehtab->srelgot == NULL
+ || !bfd_set_section_flags (dynobj, ehtab->srelgot,
+ (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
+ | SEC_IN_MEMORY | SEC_LINKER_CREATED
+ | SEC_READONLY))
+ || !bfd_set_section_alignment (dynobj, ehtab->srelgot, 2))
+ return FALSE;
+
+ return TRUE;
+}
+
+/* Create dynamic sections when linking against a dynamic object. */
+
+static bfd_boolean
+nds32_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
+{
+ struct elf_link_hash_table *ehtab;
+ struct elf_nds32_link_hash_table *htab;
+ flagword flags, pltflags;
+ register asection *s;
+ const struct elf_backend_data *bed;
+ int ptralign = 2; /* 32-bit */
+ const char *secname;
+ char *relname;
+ flagword secflags;
+ asection *sec;
+
+ bed = get_elf_backend_data (abfd);
+ ehtab = elf_hash_table (info);
+ htab = nds32_elf_hash_table (info);
+
+ /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and
+ .rel[a].bss sections. */
+
+ flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
+ | SEC_LINKER_CREATED);
+
+ pltflags = flags;
+ pltflags |= SEC_CODE;
+ if (bed->plt_not_loaded)
+ pltflags &= ~(SEC_LOAD | SEC_HAS_CONTENTS);
+ if (bed->plt_readonly)
+ pltflags |= SEC_READONLY;
+
+ s = bfd_make_section (abfd, ".plt");
+ ehtab->splt = s;
+ if (s == NULL
+ || !bfd_set_section_flags (abfd, s, pltflags)
+ || !bfd_set_section_alignment (abfd, s, bed->plt_alignment))
+ return FALSE;
+
+ if (bed->want_plt_sym)
+ {
+ /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
+ .plt section. */
+ struct bfd_link_hash_entry *bh = NULL;
+ struct elf_link_hash_entry *h;
+
+ if (!(_bfd_generic_link_add_one_symbol
+ (info, abfd, "_PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL, s,
+ (bfd_vma) 0, (const char *) NULL, FALSE,
+ get_elf_backend_data (abfd)->collect, &bh)))
+ return FALSE;
+
+ h = (struct elf_link_hash_entry *) bh;
+ h->def_regular = 1;
+ h->type = STT_OBJECT;
+
+ if (info->shared && !bfd_elf_link_record_dynamic_symbol (info, h))
+ return FALSE;
+ }
+
+ s = bfd_make_section (abfd,
+ bed->default_use_rela_p ? ".rela.plt" : ".rel.plt");
+ ehtab->srelplt = s;
+ if (s == NULL
+ || !bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
+ || !bfd_set_section_alignment (abfd, s, ptralign))
+ return FALSE;
+
+ if (ehtab->sgot == NULL && !create_got_section (abfd, info))
+ return FALSE;
+
+ for (sec = abfd->sections; sec; sec = sec->next)
+ {
+ secflags = bfd_get_section_flags (abfd, sec);
+ if ((secflags & (SEC_DATA | SEC_LINKER_CREATED))
+ || ((secflags & SEC_HAS_CONTENTS) != SEC_HAS_CONTENTS))
+ continue;
+ secname = bfd_get_section_name (abfd, sec);
+ relname = (char *) bfd_malloc ((bfd_size_type) strlen (secname) + 6);
+ strcpy (relname, ".rela");
+ strcat (relname, secname);
+ if (bfd_get_section_by_name (abfd, secname))
+ continue;
+ s = bfd_make_section (abfd, relname);
+ if (s == NULL
+ || !bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
+ || !bfd_set_section_alignment (abfd, s, ptralign))
+ return FALSE;
+ }
+
+ if (bed->want_dynbss)
+ {
+ /* The .dynbss section is a place to put symbols which are defined
+ by dynamic objects, are referenced by regular objects, and are
+ not functions. We must allocate space for them in the process
+ image and use a R_*_COPY reloc to tell the dynamic linker to
+ initialize them at run time. The linker script puts the .dynbss
+ section into the .bss section of the final image. */
+ s = bfd_make_section (abfd, ".dynbss");
+ htab->sdynbss = s;
+ if (s == NULL
+ || !bfd_set_section_flags (abfd, s, SEC_ALLOC | SEC_LINKER_CREATED))
+ return FALSE;
+ /* The .rel[a].bss section holds copy relocs. This section is not
+ normally needed. We need to create it here, though, so that the
+ linker will map it to an output section. We can't just create it
+ only if we need it, because we will not know whether we need it
+ until we have seen all the input files, and the first time the
+ main linker code calls BFD after examining all the input files
+ (size_dynamic_sections) the input sections have already been
+ mapped to the output sections. If the section turns out not to
+ be needed, we can discard it later. We will never need this
+ section when generating a shared object, since they do not use
+ copy relocs. */
+ if (!info->shared)
+ {
+ s = bfd_make_section (abfd, (bed->default_use_rela_p
+ ? ".rela.bss" : ".rel.bss"));
+ htab->srelbss = s;
+ if (s == NULL
+ || !bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
+ || !bfd_set_section_alignment (abfd, s, ptralign))
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+/* Copy the extra info we tack onto an elf_link_hash_entry. */
+static void
+nds32_elf_copy_indirect_symbol (struct bfd_link_info *info,
+ struct elf_link_hash_entry *dir,
+ struct elf_link_hash_entry *ind)
+{
+ struct elf_nds32_link_hash_entry *edir, *eind;
+
+ edir = (struct elf_nds32_link_hash_entry *) dir;
+ eind = (struct elf_nds32_link_hash_entry *) ind;
+
+ if (eind->dyn_relocs != NULL)
+ {
+ if (edir->dyn_relocs != NULL)
+ {
+ struct elf_nds32_dyn_relocs **pp;
+ struct elf_nds32_dyn_relocs *p;
+
+ if (ind->root.type == bfd_link_hash_indirect)
+ abort ();
+
+ /* Add reloc counts against the weak sym to the strong sym
+ list. Merge any entries against the same section. */
+ for (pp = &eind->dyn_relocs; (p = *pp) != NULL;)
+ {
+ struct elf_nds32_dyn_relocs *q;
+
+ for (q = edir->dyn_relocs; q != NULL; q = q->next)
+ if (q->sec == p->sec)
+ {
+ q->pc_count += p->pc_count;
+ q->count += p->count;
+ *pp = p->next;
+ break;
+ }
+ if (q == NULL)
+ pp = &p->next;
+ }
+ *pp = edir->dyn_relocs;
+ }
+
+ edir->dyn_relocs = eind->dyn_relocs;
+ eind->dyn_relocs = NULL;
+ }
+
+ if (ind->root.type == bfd_link_hash_indirect)
+ {
+ if (dir->got.refcount <= 0)
+ {
+ edir->tls_type = eind->tls_type;
+ eind->tls_type = GOT_UNKNOWN;
+ }
+ }
+
+ _bfd_elf_link_hash_copy_indirect (info, dir, ind);
+}
+
+
+/* Adjust a symbol defined by a dynamic object and referenced by a
+ regular object. The current definition is in some section of the
+ dynamic object, but we're not including those sections. We have to
+ change the definition to something the rest of the link can
+ understand. */
+
+static bfd_boolean
+nds32_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
+ struct elf_link_hash_entry *h)
+{
+ struct elf_nds32_link_hash_table *htab;
+ struct elf_nds32_link_hash_entry *eh;
+ struct elf_nds32_dyn_relocs *p;
+ bfd *dynobj;
+ asection *s;
+ unsigned int power_of_two;
+
+ dynobj = elf_hash_table (info)->dynobj;
+
+ /* Make sure we know what is going on here. */
+ BFD_ASSERT (dynobj != NULL
+ && (h->needs_plt
+ || h->u.weakdef != NULL
+ || (h->def_dynamic && h->ref_regular && !h->def_regular)));
+
+
+ /* If this is a function, put it in the procedure linkage table. We
+ will fill in the contents of the procedure linkage table later,
+ when we know the address of the .got section. */
+ if (h->type == STT_FUNC || h->needs_plt)
+ {
+ if (!info->shared
+ && !h->def_dynamic
+ && !h->ref_dynamic
+ && h->root.type != bfd_link_hash_undefweak
+ && h->root.type != bfd_link_hash_undefined)
+ {
+ /* This case can occur if we saw a PLT reloc in an input
+ file, but the symbol was never referred to by a dynamic
+ object. In such a case, we don't actually need to build
+ a procedure linkage table, and we can just do a PCREL
+ reloc instead. */
+ h->plt.offset = (bfd_vma) - 1;
+ h->needs_plt = 0;
+ }
+
+ return TRUE;
+ }
+ else
+ h->plt.offset = (bfd_vma) - 1;
+
+ /* If this is a weak symbol, and there is a real definition, the
+ processor independent code will have arranged for us to see the
+ real definition first, and we can just use the same value. */
+ if (h->u.weakdef != NULL)
+ {
+ BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
+ || h->u.weakdef->root.type == bfd_link_hash_defweak);
+ h->root.u.def.section = h->u.weakdef->root.u.def.section;
+ h->root.u.def.value = h->u.weakdef->root.u.def.value;
+ return TRUE;
+ }
+
+ /* This is a reference to a symbol defined by a dynamic object which
+ is not a function. */
+
+ /* If we are creating a shared library, we must presume that the
+ only references to the symbol are via the global offset table.
+ For such cases we need not do anything here; the relocations will
+ be handled correctly by relocate_section. */
+ if (info->shared)
+ return TRUE;
+
+ /* If there are no references to this symbol that do not use the
+ GOT, we don't need to generate a copy reloc. */
+ if (!h->non_got_ref)
+ return TRUE;
+
+ /* If -z nocopyreloc was given, we won't generate them either. */
+ if (info->nocopyreloc)
+ {
+ h->non_got_ref = 0;
+ return TRUE;
+ }
+
+ eh = (struct elf_nds32_link_hash_entry *) h;
+ for (p = eh->dyn_relocs; p != NULL; p = p->next)
+ {
+ s = p->sec->output_section;
+ if (s != NULL && (s->flags & (SEC_READONLY | SEC_HAS_CONTENTS)) != 0)
+ break;
+ }
+
+ /* If we didn't find any dynamic relocs in sections which needs the
+ copy reloc, then we'll be keeping the dynamic relocs and avoiding
+ the copy reloc. */
+ if (p == NULL)
+ {
+ h->non_got_ref = 0;
+ return TRUE;
+ }
+
+ /* We must allocate the symbol in our .dynbss section, which will
+ become part of the .bss section of the executable. There will be
+ an entry for this symbol in the .dynsym section. The dynamic
+ object will contain position independent code, so all references
+ from the dynamic object to this symbol will go through the global
+ offset table. The dynamic linker will use the .dynsym entry to
+ determine the address it must put in the global offset table, so
+ both the dynamic object and the regular object will refer to the
+ same memory location for the variable. */
+
+ htab = nds32_elf_hash_table (info);
+ s = htab->sdynbss;
+ BFD_ASSERT (s != NULL);
+
+ /* We must generate a R_NDS32_COPY reloc to tell the dynamic linker
+ to copy the initial value out of the dynamic object and into the
+ runtime process image. We need to remember the offset into the
+ .rela.bss section we are going to use. */
+ if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
+ {
+ asection *srel;
+
+ srel = htab->srelbss;
+ BFD_ASSERT (srel != NULL);
+ srel->size += sizeof (Elf32_External_Rela);
+ h->needs_copy = 1;
+ }
+
+ /* We need to figure out the alignment required for this symbol. I
+ have no idea how ELF linkers handle this. */
+ power_of_two = bfd_log2 (h->size);
+ if (power_of_two > 3)
+ power_of_two = 3;
+
+ /* Apply the required alignment. */
+ s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two));
+ if (power_of_two > bfd_get_section_alignment (dynobj, s))
+ {
+ if (!bfd_set_section_alignment (dynobj, s, power_of_two))
+ return FALSE;
+ }
+
+ /* Define the symbol as being at this point in the section. */
+ h->root.u.def.section = s;
+ h->root.u.def.value = s->size;
+
+ /* Increment the section size to make room for the symbol. */
+ s->size += h->size;
+
+ return TRUE;
+}
+
+/* Allocate space in .plt, .got and associated reloc sections for
+ dynamic relocs. */
+
+static bfd_boolean
+allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
+{
+ struct bfd_link_info *info;
+ struct elf_link_hash_table *ehtab;
+ struct elf_nds32_link_hash_table *htab;
+ struct elf_nds32_link_hash_entry *eh;
+ struct elf_nds32_dyn_relocs *p;
+
+ if (h->root.type == bfd_link_hash_indirect)
+ return TRUE;
+
+ /* When warning symbols are created, they **replace** the "real"
+ entry in the hash table, thus we never get to see the real
+ symbol in a hash traversal. So look at it now. */
+ if (h->root.type == bfd_link_hash_warning)
+ h = (struct elf_link_hash_entry *) h->root.u.i.link;
+
+ eh = (struct elf_nds32_link_hash_entry *) h;
+
+ info = (struct bfd_link_info *) inf;
+ ehtab = elf_hash_table (info);
+ htab = nds32_elf_hash_table (info);
+ if (htab == NULL)
+ return FALSE;
+
+ if ((htab->root.dynamic_sections_created || h->type == STT_GNU_IFUNC)
+ && h->plt.refcount > 0
+ && !(info->pie && h->def_regular))
+ {
+ /* Make sure this symbol is output as a dynamic symbol.
+ Undefined weak syms won't yet be marked as dynamic. */
+ if (h->dynindx == -1 && !h->forced_local)
+ {
+ if (!bfd_elf_link_record_dynamic_symbol (info, h))
+ return FALSE;
+ }
+
+ if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, h))
+ {
+ asection *s = ehtab->splt;
+
+ /* If this is the first .plt entry, make room for the special
+ first entry. */
+ if (s->size == 0)
+ s->size += PLT_ENTRY_SIZE;
+
+ h->plt.offset = s->size;
+
+ /* If this symbol is not defined in a regular file, and we are
+ not generating a shared library, then set the symbol to this
+ location in the .plt. This is required to make function
+ pointers compare as equal between the normal executable and
+ the shared library. */
+ if (!info->shared && !h->def_regular)
+ {
+ h->root.u.def.section = s;
+ h->root.u.def.value = h->plt.offset;
+ }
+
+ /* Make room for this entry. */
+ s->size += PLT_ENTRY_SIZE;
+
+ /* We also need to make an entry in the .got.plt section, which
+ will be placed in the .got section by the linker script. */
+ ehtab->sgotplt->size += 4;
+
+ /* We also need to make an entry in the .rel.plt section. */
+ ehtab->srelplt->size += sizeof (Elf32_External_Rela);
+ htab->next_tls_desc_index++;
+ }
+ else
+ {
+ h->plt.offset = (bfd_vma) - 1;
+ h->needs_plt = 0;
+ }
+ }
+ else
+ {
+ h->plt.offset = (bfd_vma) - 1;
+ h->needs_plt = 0;
+ }
+
+ if (h->got.refcount > 0)
+ {
+ asection *sgot;
+ bfd_boolean dyn;
+ int tls_type = elf32_nds32_hash_entry (h)->tls_type;
+
+ /* Make sure this symbol is output as a dynamic symbol.
+ Undefined weak syms won't yet be marked as dynamic. */
+ if (h->dynindx == -1 && !h->forced_local)
+ {
+ if (!bfd_elf_link_record_dynamic_symbol (info, h))
+ return FALSE;
+ }
+
+ sgot = elf_hash_table (info)->sgot;
+ h->got.offset = sgot->size;
+
+ if (tls_type == GOT_UNKNOWN)
+ abort ();
+
+ /* Non-TLS symbols, and TLS_IE need one GOT slot. */
+ if (tls_type & (GOT_NORMAL | GOT_TLS_IE | GOT_TLS_IEGP))
+ sgot->size += 4;
+ else
+ {
+ /* TLS_DESC, TLS_GD, and TLS_LD need 2 consecutive GOT slots. */
+ if (tls_type & GOT_TLS_DESC)
+ sgot->size += 8;
+ }
+
+ dyn = htab->root.dynamic_sections_created;
+
+ if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h))
+ {
+ if (tls_type == GOT_TLS_DESC)
+ {
+ /* TLS_DESC needs a relocation slot within .rela.plt. */
+ htab->num_tls_desc++;
+ ehtab->srelplt->size += sizeof (Elf32_External_Rela);
+ htab->tls_trampoline = -1;
+ }
+ else
+ {
+ /* other relocations need a relocation slot within .rela.got. */
+ ehtab->srelgot->size += sizeof (Elf32_External_Rela);
+ }
+ }
+ }
+ else
+ h->got.offset = (bfd_vma) -1;
+
+ if (eh->dyn_relocs == NULL)
+ return TRUE;
+
+ /* In the shared -Bsymbolic case, discard space allocated for
+ dynamic pc-relative relocs against symbols which turn out to be
+ defined in regular objects. For the normal shared case, discard
+ space for pc-relative relocs that have become local due to symbol
+ visibility changes. */
+
+ if (info->shared)
+ {
+ if (h->def_regular && (h->forced_local || info->symbolic))
+ {
+ struct elf_nds32_dyn_relocs **pp;
+
+ for (pp = &eh->dyn_relocs; (p = *pp) != NULL;)
+ {
+ p->count -= p->pc_count;
+ p->pc_count = 0;
+ if (p->count == 0)
+ *pp = p->next;
+ else
+ pp = &p->next;
+ }
+ }
+ }
+ else
+ {
+ /* For the non-shared case, discard space for relocs against
+ symbols which turn out to need copy relocs or are not dynamic. */
+
+ if (!h->non_got_ref
+ && ((h->def_dynamic
+ && !h->def_regular)
+ || (htab->root.dynamic_sections_created
+ && (h->root.type == bfd_link_hash_undefweak
+ || h->root.type == bfd_link_hash_undefined))))
+ {
+ /* Make sure this symbol is output as a dynamic symbol.
+ Undefined weak syms won't yet be marked as dynamic. */
+ if (h->dynindx == -1 && !h->forced_local)
+ {
+ if (!bfd_elf_link_record_dynamic_symbol (info, h))
+ return FALSE;
+ }
+
+ /* If that succeeded, we know we'll be keeping all the
+ relocs. */
+ if (h->dynindx != -1)
+ goto keep;
+ }
+
+ eh->dyn_relocs = NULL;
+
+keep:;
+ }
+
+ /* Finally, allocate space. */
+ for (p = eh->dyn_relocs; p != NULL; p = p->next)
+ {
+ asection *sreloc = elf_section_data (p->sec)->sreloc;
+ sreloc->size += p->count * sizeof (Elf32_External_Rela);
+ }
+
+ return TRUE;
+}
+
+/* Add relocation REL to the end of relocation section SRELOC. */
+
+static void
+elf32_nds32_add_dynreloc (bfd *output_bfd,
+ struct bfd_link_info *info ATTRIBUTE_UNUSED,
+ asection *sreloc, Elf_Internal_Rela *rel)
+{
+ bfd_byte *loc;
+ if (sreloc == NULL)
+ abort ();
+
+ loc = sreloc->contents;
+ loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
+ if (sreloc->reloc_count * sizeof (Elf32_External_Rela) > sreloc->size)
+ abort ();
+
+ bfd_elf32_swap_reloca_out (output_bfd, rel, loc);
+}
+
+/* Find any dynamic relocs that apply to read-only sections. */
+
+static bfd_boolean
+readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf)
+{
+ struct elf_nds32_link_hash_entry *eh;
+ struct elf_nds32_dyn_relocs *p;
+
+ if (h->root.type == bfd_link_hash_warning)
+ h = (struct elf_link_hash_entry *) h->root.u.i.link;
+
+ eh = (struct elf_nds32_link_hash_entry *) h;
+ for (p = eh->dyn_relocs; p != NULL; p = p->next)
+ {
+ asection *s = p->sec->output_section;
+
+ if (s != NULL && (s->flags & SEC_READONLY) != 0)
+ {
+ struct bfd_link_info *info = (struct bfd_link_info *) inf;
+
+ info->flags |= DF_TEXTREL;
+
+ /* Not an error, just cut short the traversal. */
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+/* Set the sizes of the dynamic sections. */
+
+static bfd_boolean
+nds32_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
+ struct bfd_link_info *info)
+{
+ bfd *dynobj;
+ asection *s;
+ bfd_boolean plt;
+ bfd_boolean relocs;
+ bfd *ibfd;
+ struct elf_nds32_link_hash_table *htab;
+
+ htab = nds32_elf_hash_table (info);
+ if (htab == NULL)
+ return FALSE;
+
+ dynobj = elf_hash_table (info)->dynobj;
+ BFD_ASSERT (dynobj != NULL);
+
+ if (elf_hash_table (info)->dynamic_sections_created)
+ {
+ /* Set the contents of the .interp section to the interpreter. */
+ if (info->executable)
+ {
+ s = bfd_get_section_by_name (dynobj, ".interp");
+ BFD_ASSERT (s != NULL);
+ s->size = sizeof ELF_DYNAMIC_INTERPRETER;
+ s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
+ }
+ }
+
+ /* Set up .got offsets for local syms, and space for local dynamic
+ relocs. */
+ for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
+ {
+ bfd_signed_vma *local_got;
+ bfd_signed_vma *end_local_got;
+ bfd_size_type locsymcount;
+ Elf_Internal_Shdr *symtab_hdr;
+ asection *sgot;
+ char *local_tls_type;
+ unsigned long symndx;
+ bfd_vma *local_tlsdesc_gotent;
+
+ if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
+ continue;
+
+ for (s = ibfd->sections; s != NULL; s = s->next)
+ {
+ struct elf_nds32_dyn_relocs *p;
+
+ for (p = ((struct elf_nds32_dyn_relocs *)
+ elf_section_data (s)->local_dynrel);
+ p != NULL; p = p->next)
+ {
+ if (!bfd_is_abs_section (p->sec)
+ && bfd_is_abs_section (p->sec->output_section))
+ {
+ /* Input section has been discarded, either because
+ it is a copy of a linkonce section or due to
+ linker script /DISCARD/, so we'll be discarding
+ the relocs too. */
+ }
+ else if (p->count != 0)
+ {
+ asection *sreloc = elf_section_data (p->sec)->sreloc;
+ sreloc->size += p->count * sizeof (Elf32_External_Rela);
+ if ((p->sec->output_section->flags & SEC_READONLY) != 0)
+ info->flags |= DF_TEXTREL;
+ }
+ }
+ }
+
+ local_got = elf_local_got_refcounts (ibfd);
+ if (!local_got)
+ continue;
+
+ symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
+ locsymcount = symtab_hdr->sh_info;
+ end_local_got = local_got + locsymcount;
+ sgot = elf_hash_table (info)->sgot;
+ local_tls_type = elf32_nds32_local_got_tls_type (ibfd);
+ local_tlsdesc_gotent = elf32_nds32_local_tlsdesc_gotent (ibfd);
+ for (symndx = 0; local_got < end_local_got;
+ ++local_got, ++local_tls_type, ++local_tlsdesc_gotent, ++symndx)
+ {
+ if (*local_got > 0)
+ {
+ int num_of_got_entry_needed = 0;
+ *local_got = sgot->size;
+ *local_tlsdesc_gotent = sgot->size;
+
+ /* TLS_NORMAL, and TLS_IE need one slot in .got. */
+ if (*local_tls_type & (GOT_NORMAL | GOT_TLS_IE | GOT_TLS_IEGP))
+ num_of_got_entry_needed = 1;
+ /* TLS_GD, TLS_LD, and TLS_DESC need an 8-byte structure in the GOT. */
+ else if (*local_tls_type & GOT_TLS_DESC)
+ num_of_got_entry_needed = 2;
+
+ sgot->size += (num_of_got_entry_needed << 2);
+
+ /* non-relax-able TLS_DESCs need a slot in .rela.plt.
+ others need a slot in .rela.got. */
+ if (*local_tls_type == GOT_TLS_DESC)
+ {
+ if (info->shared)
+ {
+ htab->num_tls_desc++;
+ htab->root.srelplt->size += sizeof (Elf32_External_Rela);
+ htab->tls_trampoline = -1;
+ }
+ else
+ {
+ /* TLS_DESC -> TLS_LE */
+ }
+ }
+ else
+ {
+ htab->root.srelgot->size += sizeof (Elf32_External_Rela);
+ }
+ }
+ else
+ {
+ *local_got = (bfd_vma) -1;
+ *local_tlsdesc_gotent = (bfd_vma) -1;
+ }
+ }
+ }
+
+ /* Allocate global sym .plt and .got entries, and space for global
+ sym dynamic relocs. */
+ elf_link_hash_traverse (&htab->root, allocate_dynrelocs, (void *) info);
+
+ /* For every jump slot reserved in the sgotplt, reloc_count is
+ incremented. However, when we reserve space for TLS descriptors,
+ it's not incremented, so in order to compute the space reserved
+ for them, it suffices to multiply the reloc count by the jump
+ slot size. */
+ if (htab->root.srelplt)
+ htab->sgotplt_jump_table_size = elf32_nds32_compute_jump_table_size (htab);
+
+ if (htab->tls_trampoline)
+ {
+ htab->tls_trampoline = htab->root.splt->size;
+
+ /* If we're not using lazy TLS relocations, don't generate the
+ PLT and GOT entries they require. */
+ if (!(info->flags & DF_BIND_NOW))
+ {
+ htab->dt_tlsdesc_got = htab->root.sgot->size;
+ htab->root.sgot->size += 4;
+
+ htab->dt_tlsdesc_plt = htab->root.splt->size;
+ htab->root.splt->size += 4 * ARRAY_SIZE (dl_tlsdesc_lazy_trampoline);
+ }
+ }
+
+ /* We now have determined the sizes of the various dynamic sections.
+ Allocate memory for them. */
+ /* The check_relocs and adjust_dynamic_symbol entry points have
+ determined the sizes of the various dynamic sections. Allocate
+ memory for them. */
+ plt = FALSE;
+ relocs = FALSE;
+ for (s = dynobj->sections; s != NULL; s = s->next)
+ {
+ if ((s->flags & SEC_LINKER_CREATED) == 0)
+ continue;
+
+ if (s == htab->root.splt)
+ {
+ /* Strip this section if we don't need it; see the
+ comment below. */
+ plt = s->size != 0;
+ }
+ else if (s == elf_hash_table (info)->sgot)
+ {
+ got_size += s->size;
+ }
+ else if (s == elf_hash_table (info)->sgotplt)
+ {
+ got_size += s->size;
+ }
+ else if (strncmp (bfd_get_section_name (dynobj, s), ".rela", 5) == 0)
+ {
+ if (s->size != 0 && s != elf_hash_table (info)->srelplt)
+ relocs = TRUE;
+
+ /* We use the reloc_count field as a counter if we need
+ to copy relocs into the output file. */
+ s->reloc_count = 0;
+ }
+ else
+ {
+ /* It's not one of our sections, so don't allocate space. */
+ continue;
+ }
+
+ if (s->size == 0)
+ {
+ /* If we don't need this section, strip it from the
+ output file. This is mostly to handle .rela.bss and
+ .rela.plt. We must create both sections in
+ create_dynamic_sections, because they must be created
+ before the linker maps input sections to output
+ sections. The linker does that before
+ adjust_dynamic_symbol is called, and it is that
+ function which decides whether anything needs to go
+ into these sections. */
+ s->flags |= SEC_EXCLUDE;
+ continue;
+ }
+
+ /* Allocate memory for the section contents. We use bfd_zalloc
+ here in case unused entries are not reclaimed before the
+ section's contents are written out. This should not happen,
+ but this way if it does, we get a R_NDS32_NONE reloc instead
+ of garbage. */
+ s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
+ if (s->contents == NULL)
+ return FALSE;
+ }
+
+
+ if (htab->root.dynamic_sections_created)
+ {
+ /* Add some entries to the .dynamic section. We fill in the
+ values later, in nds32_elf_finish_dynamic_sections, but we
+ must add the entries now so that we get the correct size for
+ the .dynamic section. The DT_DEBUG entry is filled in by the
+ dynamic linker and used by the debugger. */
+#define add_dynamic_entry(TAG, VAL) _bfd_elf_add_dynamic_entry (info, TAG, VAL)
+
+ if (info->executable)
+ {
+ if (!add_dynamic_entry (DT_DEBUG, 0))
+ return FALSE;
+ }
+
+ if (elf_hash_table (info)->splt->size != 0)
+ {
+ if (!add_dynamic_entry (DT_PLTGOT, 0)
+ || !add_dynamic_entry (DT_PLTRELSZ, 0)
+ || !add_dynamic_entry (DT_PLTREL, DT_RELA)
+ || !add_dynamic_entry (DT_JMPREL, 0))
+ return FALSE;
+ }
+
+ if (plt)
+ {
+ if (htab->dt_tlsdesc_plt
+ && (!add_dynamic_entry (DT_TLSDESC_PLT, 0)
+ || !add_dynamic_entry (DT_TLSDESC_GOT, 0)))
+ return FALSE;
+ }
+
+ if (relocs)
+ {
+ if (!add_dynamic_entry (DT_RELA, 0)
+ || !add_dynamic_entry (DT_RELASZ, 0)
+ || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
+ return FALSE;
+
+ /* If any dynamic relocs apply to a read-only section,
+ then we need a DT_TEXTREL entry. */
+ if ((info->flags & DF_TEXTREL) == 0)
+ elf_link_hash_traverse (&htab->root, readonly_dynrelocs,
+ (void *) info);
+
+ if ((info->flags & DF_TEXTREL) != 0)
+ {
+ if (!add_dynamic_entry (DT_TEXTREL, 0))
+ return FALSE;
+ }
+ }
+ }
+#undef add_dynamic_entry
+
+ return TRUE;
+}
+
+static bfd_reloc_status_type
+nds32_relocate_contents (reloc_howto_type *howto, bfd *input_bfd,
+ bfd_vma relocation, bfd_byte *location)
+{
+ int size;
+ bfd_vma x = 0;
+ bfd_reloc_status_type flag;
+ unsigned int rightshift = howto->rightshift;
+ unsigned int bitpos = howto->bitpos;
+
+ /* If the size is negative, negate RELOCATION. This isn't very
+ general. */
+ if (howto->size < 0)
+ relocation = -relocation;
+
+ /* Get the value we are going to relocate. */
+ size = bfd_get_reloc_size (howto);
+ switch (size)
+ {
+ default:
+ case 0:
+ case 1:
+ case 8:
+ abort ();
+ break;
+ case 2:
+ x = bfd_getb16 (location);
+ break;
+ case 4:
+ x = bfd_getb32 (location);
+ break;
+ }
+
+ /* Check for overflow. FIXME: We may drop bits during the addition
+ which we don't check for. We must either check at every single
+ operation, which would be tedious, or we must do the computations
+ in a type larger than bfd_vma, which would be inefficient. */
+ flag = bfd_reloc_ok;
+ if (howto->complain_on_overflow != complain_overflow_dont)
+ {
+ bfd_vma addrmask, fieldmask, signmask, ss;
+ bfd_vma a, b, sum;
+
+ /* Get the values to be added together. For signed and unsigned
+ relocations, we assume that all values should be truncated to
+ the size of an address. For bitfields, all the bits matter.
+ See also bfd_check_overflow. */
+ fieldmask = N_ONES (howto->bitsize);
+ signmask = ~fieldmask;
+ addrmask = N_ONES (bfd_arch_bits_per_address (input_bfd)) | fieldmask;
+ a = (relocation & addrmask) >> rightshift;
+ b = (x & howto->src_mask & addrmask) >> bitpos;
+
+ switch (howto->complain_on_overflow)
+ {
+ case complain_overflow_signed:
+ /* If any sign bits are set, all sign bits must be set.
+ That is, A must be a valid negative address after
+ shifting. */
+ signmask = ~(fieldmask >> 1);
+ /* Fall through. */
+
+ case complain_overflow_bitfield:
+ /* Much like the signed check, but for a field one bit
+ wider. We allow a bitfield to represent numbers in the
+ range -2**n to 2**n-1, where n is the number of bits in the
+ field. Note that when bfd_vma is 32 bits, a 32-bit reloc
+ can't overflow, which is exactly what we want. */
+ ss = a & signmask;
+ if (ss != 0 && ss != ((addrmask >> rightshift) & signmask))
+ flag = bfd_reloc_overflow;
+
+ /* We only need this next bit of code if the sign bit of B
+ is below the sign bit of A. This would only happen if
+ SRC_MASK had fewer bits than BITSIZE. Note that if
+ SRC_MASK has more bits than BITSIZE, we can get into
+ trouble; we would need to verify that B is in range, as
+ we do for A above. */
+ ss = ((~howto->src_mask) >> 1) & howto->src_mask;
+ ss >>= bitpos;
+
+ /* Set all the bits above the sign bit. */
+ b = (b ^ ss) - ss;
+
+ /* Now we can do the addition. */
+ sum = a + b;
+
+ /* See if the result has the correct sign. Bits above the
+ sign bit are junk now; ignore them. If the sum is
+ positive, make sure we did not have all negative inputs;
+ if the sum is negative, make sure we did not have all
+ positive inputs. The test below looks only at the sign
+ bits, and it really just
+ SIGN (A) == SIGN (B) && SIGN (A) != SIGN (SUM)
+
+ We mask with addrmask here to explicitly allow an address
+ wrap-around. The Linux kernel relies on it, and it is
+ the only way to write assembler code which can run when
+ loaded at a location 0x80000000 away from the location at
+ which it is linked. */
+ if (((~(a ^ b)) & (a ^ sum)) & signmask & addrmask)
+ flag = bfd_reloc_overflow;
+
+ break;
+
+ case complain_overflow_unsigned:
+ /* Checking for an unsigned overflow is relatively easy:
+ trim the addresses and add, and trim the result as well.
+ Overflow is normally indicated when the result does not
+ fit in the field. However, we also need to consider the
+ case when, e.g., fieldmask is 0x7fffffff or smaller, an
+ input is 0x80000000, and bfd_vma is only 32 bits; then we
+ will get sum == 0, but there is an overflow, since the
+ inputs did not fit in the field. Instead of doing a
+ separate test, we can check for this by or-ing in the
+ operands when testing for the sum overflowing its final
+ field. */
+ sum = (a + b) & addrmask;
+ if ((a | b | sum) & signmask)
+ flag = bfd_reloc_overflow;
+ break;
+
+ default:
+ abort ();
+ }
+ }
+
+ /* Put RELOCATION in the right bits. */
+ relocation >>= (bfd_vma) rightshift;
+ relocation <<= (bfd_vma) bitpos;
+
+ /* Add RELOCATION to the right bits of X. */
+ /* FIXME : 090616
+ Because the relaxation may generate duplicate relocation at one address,
+ an addition to immediate in the instruction may cause the relocation added
+ several times.
+ This bug should be fixed in assembler, but a check is also needed here. */
+ if (howto->partial_inplace)
+ x = ((x & ~howto->dst_mask)
+ | (((x & howto->src_mask) + relocation) & howto->dst_mask));
+ else
+ x = ((x & ~howto->dst_mask) | ((relocation) & howto->dst_mask));
+
+
+ /* Put the relocated value back in the object file. */
+ switch (size)
+ {
+ default:
+ case 0:
+ case 1:
+ case 8:
+ abort ();
+ break;
+ case 2:
+ bfd_putb16 (x, location);
+ break;
+ case 4:
+ bfd_putb32 (x, location);
+ break;
+ }
+
+ return flag;
+}
+
+static bfd_reloc_status_type
+nds32_elf_final_link_relocate (reloc_howto_type *howto, bfd *input_bfd,
+ asection *input_section, bfd_byte *contents,
+ bfd_vma address, bfd_vma value, bfd_vma addend)
+{
+ bfd_vma relocation;
+
+ /* Sanity check the address. */
+ if (address > bfd_get_section_limit (input_bfd, input_section))
+ return bfd_reloc_outofrange;
+
+ /* This function assumes that we are dealing with a basic relocation
+ against a symbol. We want to compute the value of the symbol to
+ relocate to. This is just VALUE, the value of the symbol, plus
+ ADDEND, any addend associated with the reloc. */
+ relocation = value + addend;
+
+ /* If the relocation is PC relative, we want to set RELOCATION to
+ the distance between the symbol (currently in RELOCATION) and the
+ location we are relocating. Some targets (e.g., i386-aout)
+ arrange for the contents of the section to be the negative of the
+ offset of the location within the section; for such targets
+ pcrel_offset is FALSE. Other targets (e.g., m88kbcs or ELF)
+ simply leave the contents of the section as zero; for such
+ targets pcrel_offset is TRUE. If pcrel_offset is FALSE we do not
+ need to subtract out the offset of the location within the
+ section (which is just ADDRESS). */
+ if (howto->pc_relative)
+ {
+ relocation -= (input_section->output_section->vma
+ + input_section->output_offset);
+ if (howto->pcrel_offset)
+ relocation -= address;
+ }
+
+ return nds32_relocate_contents (howto, input_bfd, relocation,
+ contents + address);
+}
+
+static bfd_boolean
+nds32_elf_output_symbol_hook (struct bfd_link_info *info,
+ const char *name,
+ Elf_Internal_Sym *elfsym ATTRIBUTE_UNUSED,
+ asection *input_sec,
+ struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
+{
+ const char *source;
+ FILE *sym_ld_script = NULL;
+ struct elf_nds32_link_hash_table *table;
+
+ table = nds32_elf_hash_table (info);
+ sym_ld_script = table->sym_ld_script;
+ if (!sym_ld_script)
+ return TRUE;
+
+ if (!h || !name || *name == '\0')
+ return TRUE;
+
+ if (input_sec->flags & SEC_EXCLUDE)
+ return TRUE;
+
+ if (!check_start_export_sym)
+ {
+ fprintf (sym_ld_script, "SECTIONS\n{\n");
+ check_start_export_sym = 1;
+ }
+
+ if (h->root.type == bfd_link_hash_defined
+ || h->root.type == bfd_link_hash_defweak)
+ {
+ if (!h->root.u.def.section->output_section)
+ return TRUE;
+
+ if (bfd_is_const_section (input_sec))
+ source = input_sec->name;
+ else
+ source = input_sec->owner->filename;
+
+ fprintf (sym_ld_script, "\t%s = 0x%08lx;\t /* %s */\n",
+ h->root.root.string,
+ (h->root.u.def.value
+ + h->root.u.def.section->output_section->vma
+ + h->root.u.def.section->output_offset), source);
+ }
+
+ return TRUE;
+}
+
+/* Relocate an NDS32/D ELF section.
+ There is some attempt to make this function usable for many architectures,
+ both for RELA and REL type relocs, if only to serve as a learning tool.
+
+ The RELOCATE_SECTION function is called by the new ELF backend linker
+ to handle the relocations for a section.
+
+ The relocs are always passed as Rela structures; if the section
+ actually uses Rel structures, the r_addend field will always be
+ zero.
+
+ This function is responsible for adjust the section contents as
+ necessary, and (if using Rela relocs and generating a
+ relocatable output file) adjusting the reloc addend as
+ necessary.
+
+ This function does not have to worry about setting the reloc
+ address or the reloc symbol index.
+
+ LOCAL_SYMS is a pointer to the swapped in local symbols.
+
+ LOCAL_SECTIONS is an array giving the section in the input file
+ corresponding to the st_shndx field of each local symbol.
+
+ The global hash table entry for the global symbols can be found
+ via elf_sym_hashes (input_bfd).
+
+ When generating relocatable output, this function must handle
+ STB_LOCAL/STT_SECTION symbols specially. The output symbol is
+ going to be the section symbol corresponding to the output
+ section, which means that the addend must be adjusted
+ accordingly. */
+
+/* Return the base VMA address which should be subtracted from real addresses
+ when resolving @dtpoff relocation.
+ This is PT_TLS segment p_vaddr. */
+
+/* Return the relocation value for @tpoff relocation
+ if STT_TLS virtual address is ADDRESS. */
+
+/* Return the relocation value for @gottpoff relocation
+ if STT_TLS virtual address is ADDRESS. */
+static bfd_vma
+gottpoff (struct bfd_link_info *info, bfd_vma address)
+{
+ bfd_vma tp_base;
+ bfd_vma tp_offset;
+
+ /* If tls_sec is NULL, we should have signalled an error already. */
+ if (elf_hash_table (info)->tls_sec == NULL)
+ return 0;
+
+ tp_base = elf_hash_table (info)->tls_sec->vma;
+ tp_offset = address - tp_base;
+
+ return tp_offset;
+}
+
+#define POLY 0x755b /* crc = (0x10000 | POLY) >> 1 = 0xbaad. */
+#define INV_POLY 0xb55d
+
+/* Initial the crc table value. */
+
+static void
+nds32_precompute_byte_crc_table (void)
+{
+ int i;
+ int j;
+ unsigned short r;
+ r = 0;
+ for (i = 0; i < 0x100; ++i)
+ {
+ r = i << 8;
+ for (j = 7; j >= 0; --j)
+ {
+ unsigned short p = (r & 0x8000) ? POLY : 0;
+ r = (r << 1) ^ p;
+ }
+ byte_crc_table[i] = r;
+ }
+}
+
+static void
+nds32_precompute_byte_inv_crc_table (void)
+{
+ int i;
+ int j;
+ unsigned short r;
+ r = 0;
+ for (i = 0; i < 0x100; ++i)
+ {
+ r = i << 8;
+ for (j = 7; j >= 0; --j)
+ {
+ unsigned short p = (r & 0x8000) ? INV_POLY : 0;
+ r = (r << 1) ^ p;
+ }
+ byte_inv_crc_table[i] = r;
+ }
+}
+
+/* Perform the crc computation. */
+
+static void
+nds32_crc_compute (bfd_byte *ptr, unsigned int size, unsigned short *sum)
+{
+ unsigned char b;
+
+ if (size == 2)
+ {
+ b = *ptr++ ^ (*sum >> 8);
+ *sum = (0xffff & (*sum << 8)) ^ byte_crc_table[b];
+ b = *ptr++ ^ (*sum >> 8);
+ *sum = (0xffff & (*sum << 8)) ^ byte_crc_table[b];
+ b = (*sum >> 8);
+ *sum = (0xffff & (*sum << 8)) ^ byte_crc_table[b];
+ b = (*sum >> 8);
+ *sum = (0xffff & (*sum << 8)) ^ byte_crc_table[b];
+ }
+ else
+ {
+ b = *ptr++ ^ (*sum >> 8);
+ *sum = (0xffff & (*sum << 8)) ^ byte_crc_table[b];
+ b = *ptr++ ^ (*sum >> 8);
+ *sum = (0xffff & (*sum << 8)) ^ byte_crc_table[b];
+ b = *ptr++ ^ (*sum >> 8);
+ *sum = (0xffff & (*sum << 8)) ^ byte_crc_table[b];
+ b = *ptr++ ^ (*sum >> 8);
+ *sum = (0xffff & (*sum << 8)) ^ byte_crc_table[b];
+ }
+}
+
+static void
+nds32_crc_final (int num, unsigned short *sum)
+{
+ int i, tmp, r = 0;
+ unsigned short crc, inv_crc = 0;
+
+ crc = *sum;
+ /* Reverse it. */
+ for (i = 0; i < 16; ++i)
+ {
+ tmp = crc & 0x1;
+ inv_crc = (inv_crc << 1) | tmp;
+ crc = crc >> 1;
+ }
+
+ for (i = 0; i < num + 2; ++i)
+ {
+ if (i == 0)
+ tmp = (inv_crc >> 8) ^ (r >> 8);
+ else if (i == 1)
+ tmp = (inv_crc & 0xff) ^ (r >> 8);
+ else
+ tmp = (r >> 8);
+ r = (0xffff & (r << 8)) ^ byte_inv_crc_table[tmp];
+ }
+ crc = r;
+ inv_crc = 0;
+
+ for (i = 0; i < 16; ++i)
+ {
+ tmp = crc & 0x1;
+ inv_crc = (inv_crc << 1) | tmp;
+ crc = crc >> 1;
+ }
+
+ *sum = inv_crc;
+}
+
+/* Traverse the security region and get the crc. */
+
+static bfd_vma
+nds32_elf_crc_relocation (Elf_Internal_Rela *start_rel,
+ Elf_Internal_Rela *end_rel,
+ Elf_Internal_Rela *irelend,
+ bfd_byte *contents)
+{
+ static bfd_boolean init = FALSE;
+ bfd_byte *location;
+ bfd_vma address;
+ bfd_vma x;
+ unsigned short sum = 0;
+ int num = 0;
+ static bfd_byte *ex9_contents = NULL;
+ Elf_Internal_Rela *irel;
+ bfd_boolean ex_final = FALSE;
+
+ if (init == FALSE)
+ {
+ nds32_precompute_byte_crc_table ();
+ nds32_precompute_byte_inv_crc_table ();
+ init = TRUE;
+ if (ex9_section)
+ nds32_get_section_contents (ex9_section->owner, ex9_section,
+ &ex9_contents, TRUE);
+ }
+
+ /* Check the final instruction is isps or not. */
+ irel = end_rel;
+ while (irel < irelend && irel->r_offset == end_rel->r_offset)
+ {
+ if (ELF32_R_TYPE (irel->r_info) == R_NDS32_SECURITY_16
+ && irel->r_addend == NDS32_SECURITY_RESTART)
+ {
+ ex_final = TRUE;
+ break;
+ }
+ irel++;
+ }
+
+
+ /* It doesn't have to add crc itself. */
+
+ for (address = start_rel->r_offset + 4; address <= end_rel->r_offset;)
+ {
+ /* Don't check the next crc itself. */
+ if (address == end_rel->r_offset && ex_final)
+ break;
+
+ num += 4;
+ location = contents + address;
+ x = bfd_getb32 (location);
+ if (INSN_32BIT (x))
+ {
+ /* 4byte instruction. */
+ nds32_crc_compute (location, 4, &sum);
+ address += 4;
+ }
+ else
+ {
+ /* 2byte instruction. */
+ /* Ex9 has to fetch table instruction. */
+ if (((x >> 16) & 0xfe00) == INSN_EX9_IT_1 && ((x >> 16) & 0x1e0))
+ {
+ if (!ex9_contents)
+ (*_bfd_error_handler) (_("SIG error: Can't get ex9 contents."));
+ nds32_crc_compute (ex9_contents + ((x >> 16) & 0x1ff) * 4,
+ 4, &sum);
+ }
+ else if (((x >> 16) & 0xffe0) == INSN_EX9_IT_2)
+ {
+ if (!ex9_contents)
+ (*_bfd_error_handler) (_("SIG error: Can't get ex9 contents."));
+ nds32_crc_compute (ex9_contents + ((x >> 16) & 0x1f) * 4,
+ 4, &sum);
+ }
+ else
+ nds32_crc_compute (location, 2, &sum);
+ address += 2;
+ }
+ }
+
+ nds32_crc_final (num, &sum);
+
+ return sum;
+}
+
+/* Move all SECURITY_16 to the final one for each instruction. */
+
+static void
+nds32_elf_crc_adjust_reloc (Elf_Internal_Rela *relocs,
+ Elf_Internal_Rela *relend)
+{
+ Elf_Internal_Rela *rel, *crc_rel = NULL;
+ Elf_Internal_Rela rel_temp;
+
+ for (rel = relocs; rel < relend; rel++)
+ {
+ if (crc_rel && crc_rel->r_offset == rel->r_offset)
+ {
+ memcpy (&rel_temp, rel, sizeof (Elf_Internal_Rela));
+ memcpy (rel, crc_rel, sizeof (Elf_Internal_Rela));
+ memcpy (crc_rel, &rel_temp, sizeof (Elf_Internal_Rela));
+ crc_rel = rel;
+ }
+ else if (ELF32_R_TYPE (rel->r_info) == R_NDS32_SECURITY_16)
+ {
+ crc_rel = rel;
+ continue;
+ }
+ }
+}
+
+static bfd_boolean
+patch_tls_desc_to_ie (bfd_byte *contents, Elf_Internal_Rela *rel, bfd *ibfd)
+{
+ /* TLS_GD/TLS_LD model #1
+ 46 00 00 00 sethi $r0,#0x0
+ 58 00 00 00 ori $r0,$r0,#0x0
+ 40 00 74 00 add $r0,$r0,$gp
+ 04 10 00 00 lwi $r1,[$r0+#0x0]
+ 4b e0 04 01 jral $lp,$r1 */
+
+ /* TLS_GD/TLS_LD model #2
+ 46 00 00 00 sethi $r0,#0x0
+ 58 00 00 00 ori $r0,$r0,#0x0
+ 38 10 74 02 lw $r1,[$r0+($gp<<#0x0)] <= TODO: not necessary $r1 register allocation
+ 40 00 74 00 add $r0,$r0,$gp
+ 4b e0 04 01 jral $lp,$r1 */
+
+ /* TLS_IE model (non-PIC)
+ 46 00 00 00 sethi $r0,#0x0
+ 04 00 00 00 lwi $r0,[$r0+#0x0]
+ 38 00 64 02 lw $r0,[$r0+($r25<<#0x0)] */
+
+ /* TLS_IE model (PIC)
+ 46 00 00 00 sethi $r0,#0x0
+ 58 00 00 00 ori $r0,$r0,#0x0
+ 38 00 74 02 lw $r0,[$r0+($gp<<#0x0)]
+ 38 00 64 02 lw $r0,[$r0+($r25<<#0x0)] */
+
+ /* TLS_GD_TO_IE model
+ 46 00 00 00 sethi $r0,#0x0
+ 58 00 00 00 ori $r0,$r0,#0x0
+ 40 00 74 00 add $r0,$rM,$gp
+ 04 00 00 01 lwi $r0,[$r0+#0x4]
+ 40 00 64 00 add $r0,$r0,$r25 */
+
+ bfd_boolean rz = FALSE;
+
+ typedef struct
+ {
+ uint32_t opcode;
+ uint32_t mask;
+ } pat_t;
+
+ uint32_t patch[3] =
+ {
+ 0x40007400, /* add $r0,$rM,$gp */
+ 0x04000001, /* lwi $r0,[$r0+#0x4] */
+ 0x40006400, /* add $r0,$r0,$r25 */
+ };
+
+ pat_t mode0[3] =
+ {
+ { 0x40000000, 0xfe0003ff },
+ { 0x04000000, 0xfe000000 },
+ { 0x4be00001, 0xffff83ff },
+ };
+
+ pat_t mode1[3] =
+ {
+ { 0x38007402, 0xfe007fff },
+ { 0x40007400, 0xfe007fff },
+ { 0x4be00001, 0xffff83ff },
+ };
+
+ unsigned char *p = contents + rel->r_offset;
+
+ uint32_t insn;
+ uint32_t regidx = 0;
+ insn = bfd_getb32 (p);
+ if (INSN_SETHI == (0xfe0fffffu & insn))
+ {
+ regidx = 0x1f & (insn >> 20);
+ p += 4;
+ }
+
+ insn = bfd_getb32 (p);
+ if (INSN_ORI == (0xfe007fffu & insn))
+ {
+ regidx = 0x1f & (insn >> 20);
+ p += 4;
+ }
+
+ if (patch[2] == bfd_getb32 (p + 8)) /* character instruction */
+ {
+ /* already patched? */
+ if ((patch[0] == (0xfff07fffu & bfd_getb32 (p + 0))) &&
+ (patch[1] == bfd_getb32 (p + 4)))
+ rz = TRUE;
+ }
+ else if (mode0[0].opcode == (mode0[0].mask & bfd_getb32 (p + 0)))
+ {
+ if ((mode0[1].opcode == (mode0[1].mask & bfd_getb32 (p + 4))) &&
+ (mode0[2].opcode == (mode0[2].mask & bfd_getb32 (p + 8))))
+ {
+ bfd_putb32 (patch[0] | (regidx << 15), p + 0);
+ bfd_putb32 (patch[1], p + 4);
+ bfd_putb32 (patch[2], p + 8);
+ rz = TRUE;
+ }
+ }
+ else if (mode1[0].opcode == (mode1[0].mask & bfd_getb32 (p + 0)))
+ {
+ if ((mode1[1].opcode == (mode1[1].mask & bfd_getb32 (p + 4))) &&
+ (mode1[2].opcode == (mode1[2].mask & bfd_getb32 (p + 8))))
+ {
+ bfd_putb32 (patch[0] | (regidx << 15), p + 0);
+ bfd_putb32 (patch[1], p + 4);
+ bfd_putb32 (patch[2], p + 8);
+ rz = TRUE;
+ }
+ }
+
+ if (!rz)
+ {
+ printf ("%s: %s @ 0x%08x\n", __func__, ibfd->filename,
+ (int) rel->r_offset);
+ BFD_ASSERT(0); /* unsupported pattern */
+ }
+
+ return rz;
+}
+
+static enum elf_nds32_tls_type
+get_tls_type (enum elf_nds32_reloc_type r_type, struct elf_link_hash_entry *h);
+
+static unsigned int
+ones32 (register unsigned int x)
+{
+ /* 32-bit recursive reduction using SWAR...
+ but first step is mapping 2-bit values
+ into sum of 2 1-bit values in sneaky way. */
+ x -= ((x >> 1) & 0x55555555);
+ x = (((x >> 2) & 0x33333333) + (x & 0x33333333));
+ x = (((x >> 4) + x) & 0x0f0f0f0f);
+ x += (x >> 8);
+ x += (x >> 16);
+ return (x & 0x0000003f);
+}
+
+static unsigned int
+fls (register unsigned int x)
+{
+ return ffs (x & (-x));
+}
+
+#define nds32_elf_local_tlsdesc_gotent(bfd) \
+ (elf_nds32_tdata (bfd)->local_tlsdesc_gotent)
+
+static bfd_boolean
+nds32_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
+ struct bfd_link_info *info, bfd *input_bfd,
+ asection *input_section, bfd_byte *contents,
+ Elf_Internal_Rela *relocs,
+ Elf_Internal_Sym *local_syms,
+ asection **local_sections)
+{
+ Elf_Internal_Shdr *symtab_hdr;
+ struct elf_link_hash_entry **sym_hashes;
+ Elf_Internal_Rela *rel, *relend;
+ bfd_boolean ret = TRUE; /* Assume success. */
+ int align = 0;
+ bfd_reloc_status_type r;
+ const char *errmsg = NULL;
+ bfd_vma gp;
+ struct elf_link_hash_table *ehtab;
+ struct elf_nds32_link_hash_table *htab;
+ bfd *dynobj;
+ bfd_vma *local_got_offsets;
+ asection *sgot, *splt, *sreloc;
+ bfd_vma high_address;
+ struct elf_nds32_link_hash_table *table;
+ int eliminate_gc_relocs;
+ bfd_vma fpbase_addr;
+ Elf_Internal_Rela *crc_rel = NULL;
+
+ symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
+ sym_hashes = elf_sym_hashes (input_bfd);
+ ehtab = elf_hash_table (info);
+ htab = nds32_elf_hash_table (info);
+ high_address = bfd_get_section_limit (input_bfd, input_section);
+
+ dynobj = htab->root.dynobj;
+ local_got_offsets = elf_local_got_offsets (input_bfd);
+
+ sgot = ehtab->sgot;
+ splt = ehtab->splt;
+ sreloc = NULL;
+
+ rel = relocs;
+ relend = relocs + input_section->reloc_count;
+
+ table = nds32_elf_hash_table (info);
+ eliminate_gc_relocs = table->eliminate_gc_relocs;
+
+ /* explain _SDA_BASE_ */
+ /* By this time, we can adjust the value of _SDA_BASE_. */
+ if ((!info->relocatable))
+ {
+ is_SDA_BASE_set = 1;
+ r = nds32_elf_final_sda_base (output_bfd, info, &gp, TRUE);
+ if (r != bfd_reloc_ok)
+ return FALSE;
+ }
+
+#ifdef NDS32_LINUX_TOOLCHAIN
+ /* Do TLS model conversion once at first. */
+ nds32_elf_unify_tls_model (input_bfd, input_section, contents, info);
+#endif
+
+ if (is_ITB_BASE_set == 0)
+ {
+ /* Set the _ITB_BASE_. */
+ if (!nds32_elf_ex9_itb_base (info))
+ {
+ (*_bfd_error_handler) (_("%B: error: Cannot set _ITB_BASE_"),
+ output_bfd);
+ bfd_set_error (bfd_error_bad_value);
+ }
+ }
+
+ if (table->target_optimize & NDS32_RELAX_IFC_ON)
+ if (!nds32_elf_ifc_reloc ())
+ (*_bfd_error_handler) (_("error: IFC relocation error."));
+
+ /* Relocation for .ex9.itable. */
+ if ((table->target_optimize & NDS32_RELAX_EX9_ON)
+ || (table->ex9_import_file && table->update_ex9_table))
+ nds32_elf_ex9_reloc_jmp (info);
+
+ if (indirect_call_table.count > 0)
+ nds32_elf_ict_relocate (info);
+
+ /* Use gp as fp to prevent truncated fit. Because in relaxation time
+ the fp value is set as gp, and it has be reverted for instruction
+ setting fp. */
+ fpbase_addr = elf_gp (output_bfd);
+
+ /* Move all SECURITY_16 to the final one for each instruction. */
+ nds32_elf_crc_adjust_reloc (relocs, relend);
+
+ /* Deal with (dynamic) relocations. */
+ for (rel = relocs; rel < relend; rel++)
+ {
+ enum elf_nds32_reloc_type r_type;
+ reloc_howto_type *howto = NULL;
+ unsigned long r_symndx;
+ struct elf_link_hash_entry *h = NULL;
+ struct bfd_link_hash_entry *h2;
+ Elf_Internal_Sym *sym = NULL;
+ asection *sec;
+ bfd_vma relocation;
+ struct elf_nds32_ict_hash_entry *entry;
+ bfd_vma relocation_sym = 0xdeadbeef;
+ Elf_Internal_Rela *lorel;
+ bfd_vma off;
+
+ /* We can't modify r_addend here as elf_link_input_bfd has an assert to
+ ensure it's zero (we use REL relocs, not RELA). Therefore this
+ should be assigning zero to `addend', but for clarity we use
+ `r_addend'. */
+
+ bfd_vma addend = rel->r_addend;
+ bfd_vma offset = rel->r_offset;
+
+ r_type = ELF32_R_TYPE (rel->r_info);
+ if (r_type >= R_NDS32_max)
+ {
+ (*_bfd_error_handler) (_("%B: error: unknown relocation type %d."),
+ input_bfd, r_type);
+ bfd_set_error (bfd_error_bad_value);
+ ret = FALSE;
+ continue;
+ }
+
+ if (r_type == R_NDS32_GNU_VTENTRY
+ || r_type == R_NDS32_GNU_VTINHERIT
+ || r_type == R_NDS32_NONE
+ || r_type == R_NDS32_RELA_GNU_VTENTRY
+ || r_type == R_NDS32_RELA_GNU_VTINHERIT
+ || (r_type >= R_NDS32_INSN16 && r_type <= R_NDS32_25_FIXED_RELA)
+ || r_type == R_NDS32_DATA
+ || r_type == R_NDS32_TRAN
+ || (r_type >= R_NDS32_LONGCALL4 && r_type <= R_NDS32_LONGJUMP7))
+ continue;
+
+ /* Save security beginning. */
+ if (r_type == R_NDS32_SECURITY_16 && crc_rel == NULL)
+ {
+ crc_rel = rel;
+ continue;
+ }
+
+ /* If we enter the fp-as-gp region. Resolve the address of best fp-base. */
+ if (ELF32_R_TYPE (rel->r_info) == R_NDS32_RELAX_REGION_BEGIN
+ && (rel->r_addend & R_NDS32_RELAX_REGION_OMIT_FP_FLAG))
+ {
+ int dist;
+
+ /* Distance to relocation of best fp-base is encoded in R_SYM. */
+ dist = rel->r_addend >> 16;
+ fpbase_addr = calculate_memory_address (input_bfd, rel + dist,
+ local_syms, symtab_hdr);
+ }
+ else if (ELF32_R_TYPE (rel->r_info) == R_NDS32_RELAX_REGION_END
+ && (rel->r_addend & R_NDS32_RELAX_REGION_OMIT_FP_FLAG))
+ {
+ fpbase_addr = elf_gp (output_bfd);
+ }
+
+ if (((r_type >= R_NDS32_DWARF2_OP1_RELA
+ && r_type <= R_NDS32_DWARF2_LEB_RELA) || r_type >= R_NDS32_RELAX_ENTRY)
+ && !info->relocatable)
+ continue;
+
+ howto = bfd_elf32_bfd_reloc_type_table_lookup (r_type);
+ r_symndx = ELF32_R_SYM (rel->r_info);
+
+ /* This is a final link. */
+ sym = NULL;
+ sec = NULL;
+ h = NULL;
+
+ if (r_symndx < symtab_hdr->sh_info)
+ {
+ /* Local symbol. */
+ sym = local_syms + r_symndx;
+ sec = local_sections[r_symndx];
+
+ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
+ addend = rel->r_addend;
+
+ /* keep symbol location for static TLS_IE GOT entry */
+ relocation_sym = relocation;
+ }
+ else
+ {
+ /* External symbol. */
+ bfd_boolean warned, unresolved_reloc;
+ int symndx = r_symndx - symtab_hdr->sh_info;
+
+ RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
+ r_symndx, symtab_hdr, sym_hashes, h, sec,
+ relocation, unresolved_reloc, warned);
+
+ /* keep symbol location for static TLS_IE GOT entry */
+ relocation_sym = relocation;
+
+ /* la $fp, _FP_BASE_ is per-function (region).
+ Handle it specially. */
+ switch ((int) r_type)
+ {
+ case R_NDS32_SDA19S0_RELA:
+ case R_NDS32_SDA15S0_RELA:
+ case R_NDS32_20_RELA:
+ if (strcmp (elf_sym_hashes (input_bfd)[symndx]->root.root.string,
+ FP_BASE_NAME) == 0)
+ {
+ relocation = fpbase_addr;
+ break;
+ }
+ }
+ }
+
+ if (info->relocatable)
+ {
+ /* This is a relocatable link. We don't have to change
+ anything, unless the reloc is against a section symbol,
+ in which case we have to adjust according to where the
+ section symbol winds up in the output section. */
+ if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
+ rel->r_addend += sec->output_offset + sym->st_value;
+
+ continue;
+ }
+
+ /* Sanity check the address. */
+ if (offset > high_address)
+ {
+ r = bfd_reloc_outofrange;
+ goto check_reloc;
+ }
+
+ if ((r_type >= R_NDS32_DWARF2_OP1_RELA
+ && r_type <= R_NDS32_DWARF2_LEB_RELA)
+ || r_type >= R_NDS32_RELAX_ENTRY)
+ continue;
+
+ switch ((int) r_type)
+ {
+ case R_NDS32_GOTOFF:
+ /* Relocation is relative to the start of the global offset
+ table (for ld24 rx, #uimm24), e.g. access at label + addend
+
+ ld24 rx. #label@GOTOFF + addend
+ sub rx, r12. */
+ case R_NDS32_GOTOFF_HI20:
+ case R_NDS32_GOTOFF_LO12:
+ case R_NDS32_GOTOFF_LO15:
+ case R_NDS32_GOTOFF_LO19:
+ BFD_ASSERT (sgot != NULL);
+
+ relocation -= elf_gp (output_bfd);
+ break;
+
+ case R_NDS32_9_PLTREL:
+ case R_NDS32_25_PLTREL:
+ /* Relocation is to the entry for this symbol in the
+ procedure linkage table. */
+
+ /* The native assembler will generate a 25_PLTREL reloc
+ for a local symbol if you assemble a call from one
+ section to another when using -K pic. */
+ if (h == NULL)
+ break;
+
+ if (h->forced_local)
+ break;
+
+ /* We didn't make a PLT entry for this symbol. This
+ happens when statically linking PIC code, or when
+ using -Bsymbolic. */
+ if (h->plt.offset == (bfd_vma) - 1)
+ break;
+
+ relocation = (splt->output_section->vma
+ + splt->output_offset + h->plt.offset);
+ break;
+
+ case R_NDS32_PLT_GOTREL_HI20:
+ case R_NDS32_PLT_GOTREL_LO12:
+ case R_NDS32_PLT_GOTREL_LO15:
+ case R_NDS32_PLT_GOTREL_LO19:
+ case R_NDS32_PLT_GOTREL_LO20:
+ if (h == NULL
+ || h->forced_local
+ || h->plt.offset == (bfd_vma) -1
+ || (info->pie && h->def_regular))
+ {
+ /* TODO: find better checking to optimize PIE PLT relocations. */
+ /* We didn't make a PLT entry for this symbol. This
+ happens when statically linking PIC code, or when
+ using -Bsymbolic. */
+ if (h)
+ h->plt.offset = (bfd_vma) -1; /* cancel PLT trampoline. */
+ relocation -= elf_gp(output_bfd);
+ break;
+ }
+
+ relocation = (splt->output_section->vma
+ + splt->output_offset + h->plt.offset);
+
+ relocation -= elf_gp (output_bfd);
+ break;
+
+ case R_NDS32_PLTREL_HI20:
+ case R_NDS32_PLTREL_LO12:
+
+ /* Relocation is to the entry for this symbol in the
+ procedure linkage table. */
+
+ /* The native assembler will generate a 25_PLTREL reloc
+ for a local symbol if you assemble a call from one
+ section to another when using -K pic. */
+ if (h == NULL)
+ break;
+
+ if (h->forced_local)
+ break;
+
+ if (h->plt.offset == (bfd_vma) - 1)
+ /* We didn't make a PLT entry for this symbol. This
+ happens when statically linking PIC code, or when
+ using -Bsymbolic. */
+ break;
+
+ if (splt == NULL)
+ break;
+
+ relocation = (splt->output_section->vma
+ + splt->output_offset
+ + h->plt.offset + 4)
+ - (input_section->output_section->vma
+ + input_section->output_offset
+ + rel->r_offset);
+
+ break;
+
+ case R_NDS32_GOTPC20:
+ /* .got(_GLOBAL_OFFSET_TABLE_) - pc relocation
+ ld24 rx,#_GLOBAL_OFFSET_TABLE_ */
+ relocation = elf_gp (output_bfd);
+ break;
+
+ case R_NDS32_GOTPC_HI20:
+ case R_NDS32_GOTPC_LO12:
+ /* .got(_GLOBAL_OFFSET_TABLE_) - pc relocation
+ bl .+4
+ seth rx,#high(_GLOBAL_OFFSET_TABLE_)
+ or3 rx,rx,#low(_GLOBAL_OFFSET_TABLE_ +4)
+ or
+ bl .+4
+ seth rx,#shigh(_GLOBAL_OFFSET_TABLE_)
+ add3 rx,rx,#low(_GLOBAL_OFFSET_TABLE_ +4) */
+ relocation = elf_gp (output_bfd);
+ relocation -= (input_section->output_section->vma
+ + input_section->output_offset + rel->r_offset);
+ break;
+
+ case R_NDS32_GOT20:
+ /* Fall through. */
+ case R_NDS32_GOT_HI20:
+ case R_NDS32_GOT_LO12:
+ case R_NDS32_GOT_LO15:
+ case R_NDS32_GOT_LO19:
+ /* Relocation is to the entry for this symbol in the global
+ offset table. */
+ BFD_ASSERT (sgot != NULL);
+
+ if (h != NULL) /* External symbol */
+ {
+ bfd_boolean dyn;
+
+ off = h->got.offset;
+ BFD_ASSERT (off != (bfd_vma) - 1);
+ dyn = htab->root.dynamic_sections_created;
+ if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
+ || (info->shared
+ && (info->symbolic
+ || h->dynindx == -1
+ || h->forced_local) && h->def_regular))
+ {
+ /* This is actually a static link, or it is a
+ -Bsymbolic link and the symbol is defined
+ locally, or the symbol was forced to be local
+ because of a version file. We must initialize
+ this entry in the global offset table. Since the
+ offset must always be a multiple of 4, we use the
+ least significant bit to record whether we have
+ initialized it already.
+
+ When doing a dynamic link, we create a .rela.got
+ relocation entry to initialize the value. This
+ is done in the finish_dynamic_symbol routine. */
+ if ((off & 1) != 0) /* clear LSB */
+ off &= ~1;
+ else
+ {
+ bfd_put_32 (output_bfd, relocation, sgot->contents + off);
+ h->got.offset |= 1; /* mark initialized */
+ }
+ }
+ relocation = sgot->output_section->vma + sgot->output_offset + off
+ - elf_gp (output_bfd);
+ }
+ else /* Local symbol */
+ {
+ bfd_byte *loc;
+
+ BFD_ASSERT (local_got_offsets != NULL
+ && local_got_offsets[r_symndx] != (bfd_vma) - 1);
+
+ off = local_got_offsets[r_symndx];
+
+ /* The offset must always be a multiple of 4. We use
+ the least significant bit to record whether we have
+ already processed this entry. */
+ if ((off & 1) != 0) /* clear LSB */
+ off &= ~1;
+ else
+ {
+ bfd_put_32 (output_bfd, relocation, sgot->contents + off);
+
+ if (info->shared)
+ {
+ asection *srelgot;
+ Elf_Internal_Rela outrel;
+
+ /* We need to generate a R_NDS32_RELATIVE reloc
+ for the dynamic linker. */
+ srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
+ BFD_ASSERT (srelgot != NULL);
+
+ outrel.r_offset = (elf_gp (output_bfd)
+ + sgot->output_offset + off);
+ outrel.r_info = ELF32_R_INFO (0, R_NDS32_RELATIVE);
+ outrel.r_addend = relocation;
+ loc = srelgot->contents;
+ loc +=
+ srelgot->reloc_count * sizeof (Elf32_External_Rela);
+ bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
+ ++srelgot->reloc_count;
+ }
+ local_got_offsets[r_symndx] |= 1;
+ }
+ relocation = sgot->output_section->vma + sgot->output_offset + off
+ - elf_gp (output_bfd);
+ }
+
+ break;
+
+ case R_NDS32_25_PCREL_RELA:
+ case R_NDS32_HI20_RELA:
+ case R_NDS32_LO12S0_RELA:
+ /* Merge normal and indirect call functions. */
+ if (!ignore_indirect_call && h
+ && elf32_nds32_hash_entry (h)->indirect_call)
+ {
+ (*_bfd_error_handler)
+ (_("%B: Warning: there are mixed"
+ " indirect call function \'%s\'\n"),
+ input_bfd, h->root.root.string);
+
+ entry = (struct elf_nds32_ict_hash_entry*)
+ bfd_hash_lookup (&indirect_call_table, h->root.root.string,
+ FALSE, FALSE);
+ if (!entry)
+ {
+ (*_bfd_error_handler)
+ (_("%B %A: internal error indirect call relocation "
+ "0x%lx without hash.\n"),
+ input_bfd, sec, rel->r_offset);
+ bfd_set_error (bfd_error_bad_value);
+ return FALSE;
+ }
+
+ h2 = bfd_link_hash_lookup (info->hash,
+ "_INDIRECT_CALL_TABLE_BASE_",
+ FALSE, FALSE, FALSE);
+ relocation = ((h2->u.def.value
+ + h2->u.def.section->output_section->vma
+ + h2->u.def.section->output_offset)
+ + (entry->order * 4));
+ break;
+ }
+
+ /* Fall through. */
+ case R_NDS32_16_RELA:
+ case R_NDS32_20_RELA:
+ case R_NDS32_5_RELA:
+ case R_NDS32_32_RELA:
+ case R_NDS32_9_PCREL_RELA:
+ case R_NDS32_WORD_9_PCREL_RELA:
+ case R_NDS32_10_UPCREL_RELA:
+ case R_NDS32_15_PCREL_RELA:
+ case R_NDS32_17_PCREL_RELA:
+ case R_NDS32_LO12S3_RELA:
+ case R_NDS32_LO12S2_RELA:
+ case R_NDS32_LO12S2_DP_RELA:
+ case R_NDS32_LO12S2_SP_RELA:
+ case R_NDS32_LO12S1_RELA:
+ case R_NDS32_LO12S0_ORI_RELA:
+ if (info->shared && r_symndx != 0
+ && (input_section->flags & SEC_ALLOC) != 0
+ && (eliminate_gc_relocs == 0
+ || (sec && (sec->flags & SEC_EXCLUDE) == 0))
+ && ((r_type != R_NDS32_9_PCREL_RELA
+ && r_type != R_NDS32_WORD_9_PCREL_RELA
+ && r_type != R_NDS32_10_UPCREL_RELA
+ && r_type != R_NDS32_15_PCREL_RELA
+ && r_type != R_NDS32_17_PCREL_RELA
+ && r_type != R_NDS32_25_PCREL_RELA
+ && !(r_type == R_NDS32_32_RELA
+ && strcmp (input_section->name, ".eh_frame") == 0))
+ || (h != NULL && h->dynindx != -1
+ && (!info->symbolic || !h->def_regular))))
+ {
+ Elf_Internal_Rela outrel;
+ bfd_boolean skip, relocate;
+ bfd_byte *loc;
+
+ /* When generating a shared object, these relocations
+ are copied into the output file to be resolved at run
+ time. */
+
+ if (sreloc == NULL)
+ {
+ const char *name;
+
+ name = bfd_elf_string_from_elf_section
+ (input_bfd, elf_elfheader (input_bfd)->e_shstrndx,
+ elf_section_data (input_section)->rela.hdr->sh_name);
+ if (name == NULL)
+ return FALSE;
+
+ BFD_ASSERT (strncmp (name, ".rela", 5) == 0
+ && strcmp (bfd_get_section_name (input_bfd,
+ input_section),
+ name + 5) == 0);
+
+ sreloc = bfd_get_section_by_name (dynobj, name);
+ BFD_ASSERT (sreloc != NULL);
+ }
+
+ skip = FALSE;
+ relocate = FALSE;
+
+ outrel.r_offset = _bfd_elf_section_offset (output_bfd,
+ info,
+ input_section,
+ rel->r_offset);
+ if (outrel.r_offset == (bfd_vma) - 1)
+ skip = TRUE;
+ else if (outrel.r_offset == (bfd_vma) - 2)
+ skip = TRUE, relocate = TRUE;
+ outrel.r_offset += (input_section->output_section->vma
+ + input_section->output_offset);
+
+ if (skip)
+ memset (&outrel, 0, sizeof outrel);
+ else if (r_type == R_NDS32_17_PCREL_RELA
+ || r_type == R_NDS32_15_PCREL_RELA
+ || r_type == R_NDS32_25_PCREL_RELA)
+ {
+ BFD_ASSERT (h != NULL && h->dynindx != -1);
+ outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
+ outrel.r_addend = rel->r_addend;
+ }
+ else
+ {
+ /* h->dynindx may be -1 if this symbol was marked to
+ become local. */
+ if (h == NULL
+ || ((info->symbolic || h->dynindx == -1)
+ && h->def_regular)
+ || (info->pie && h->def_regular))
+ {
+ relocate = TRUE;
+ outrel.r_info = ELF32_R_INFO (0, R_NDS32_RELATIVE);
+ outrel.r_addend = relocation + rel->r_addend;
+ if (h)
+ h->plt.offset = (bfd_vma) -1; /* cancel PLT trampoline. */
+ }
+ else
+ {
+ if (h->dynindx == -1)
+ {
+ (*_bfd_error_handler)
+ (_("%B: relocation %s against `%s' can not be used when"
+ "making a shared object; recompile with -fPIC"),
+ input_bfd, nds32_elf_howto_table[r_type].name, h->root.root.string);
+ bfd_set_error (bfd_error_bad_value);
+ return FALSE;
+ }
+ outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
+ outrel.r_addend = rel->r_addend;
+ }
+ }
+
+ loc = sreloc->contents;
+ loc += sreloc->reloc_count * sizeof (Elf32_External_Rela);
+ bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
+ ++sreloc->reloc_count;
+
+ /* If this reloc is against an external symbol, we do
+ not want to fiddle with the addend. Otherwise, we
+ need to include the symbol value so that it becomes
+ an addend for the dynamic reloc. */
+ if (!relocate)
+ continue;
+ }
+ break;
+
+ case R_NDS32_25_ABS_RELA:
+ if (info->shared)
+ {
+ (*_bfd_error_handler)
+ (_("%s: warning: cannot deal R_NDS32_25_ABS_RELA in shared mode."),
+ bfd_get_filename (input_bfd));
+ return FALSE;
+ }
+ break;
+
+ case R_NDS32_9_PCREL:
+ r = nds32_elf_do_9_pcrel_reloc (input_bfd, howto, input_section,
+ contents, offset,
+ sec, relocation, addend);
+ goto check_reloc;
+
+ case R_NDS32_HI20:
+ /* We allow an arbitrary number of HI20 relocs before the
+ LO12 reloc. This permits GCC to emit the HI and LO relocs
+ itself. */
+ for (lorel = rel + 1;
+ (lorel < relend
+ && ELF32_R_TYPE (lorel->r_info) == R_NDS32_HI20); lorel++)
+ continue;
+ if (lorel < relend
+ && (ELF32_R_TYPE (lorel->r_info) == R_NDS32_LO12S3
+ || ELF32_R_TYPE (lorel->r_info) == R_NDS32_LO12S2
+ || ELF32_R_TYPE (lorel->r_info) == R_NDS32_LO12S1
+ || ELF32_R_TYPE (lorel->r_info) == R_NDS32_LO12S0))
+ {
+ nds32_elf_relocate_hi20 (input_bfd, r_type, rel, lorel,
+ contents, relocation + addend);
+ r = bfd_reloc_ok;
+ }
+ else
+ r = _bfd_final_link_relocate (howto, input_bfd, input_section,
+ contents, offset, relocation,
+ addend);
+
+ goto check_reloc;
+
+ case R_NDS32_GOT17S2_RELA:
+ case R_NDS32_GOT15S2_RELA:
+ BFD_ASSERT (sgot != NULL);
+
+ if (h != NULL)
+ {
+ bfd_boolean dyn;
+
+ off = h->got.offset;
+ BFD_ASSERT (off != (bfd_vma) - 1);
+
+ dyn = htab->root.dynamic_sections_created;
+ if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL
+ (dyn, info->shared, h) || (info->shared
+ && (info->symbolic
+ || h->dynindx == -1
+ || h->forced_local)
+ && h->def_regular))
+ {
+ /* This is actually a static link, or it is a
+ -Bsymbolic link and the symbol is defined
+ locally, or the symbol was forced to be local
+ because of a version file. We must initialize
+ this entry in the global offset table. Since the
+ offset must always be a multiple of 4, we use the
+ least significant bit to record whether we have
+ initialized it already.
+
+ When doing a dynamic link, we create a .rela.got
+ relocation entry to initialize the value. This
+ is done in the finish_dynamic_symbol routine. */
+ if ((off & 1) != 0)
+ off &= ~1;
+ else
+ {
+ bfd_put_32 (output_bfd, relocation,
+ sgot->contents + off);
+ h->got.offset |= 1;
+ }
+ }
+ }
+ else
+ {
+ bfd_byte *loc;
+
+ BFD_ASSERT (local_got_offsets != NULL
+ && local_got_offsets[r_symndx] != (bfd_vma) - 1);
+
+ off = local_got_offsets[r_symndx];
+
+ /* The offset must always be a multiple of 4. We use
+ the least significant bit to record whether we have
+ already processed this entry. */
+ if ((off & 1) != 0)
+ off &= ~1;
+ else
+ {
+ bfd_put_32 (output_bfd, relocation, sgot->contents + off);
+
+ if (info->shared)
+ {
+ asection *srelgot;
+ Elf_Internal_Rela outrel;
+
+ /* We need to generate a R_NDS32_RELATIVE reloc
+ for the dynamic linker. */
+ srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
+ BFD_ASSERT (srelgot != NULL);
+
+ outrel.r_offset = (elf_gp (output_bfd)
+ + sgot->output_offset + off);
+ outrel.r_info = ELF32_R_INFO (0, R_NDS32_RELATIVE);
+ outrel.r_addend = relocation;
+ loc = srelgot->contents;
+ loc +=
+ srelgot->reloc_count * sizeof (Elf32_External_Rela);
+ bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
+ ++srelgot->reloc_count;
+ }
+ local_got_offsets[r_symndx] |= 1;
+ }
+ }
+ relocation = sgot->output_section->vma + sgot->output_offset + off
+ - elf_gp (output_bfd);
+
+ if (relocation & align)
+ {
+ /* Incorrect alignment. */
+ (*_bfd_error_handler)
+ (_("%B: warning: unaligned access to GOT entry."), input_bfd);
+ ret = FALSE;
+ r = bfd_reloc_dangerous;
+ goto check_reloc;
+ }
+ break;
+
+ case R_NDS32_SDA16S3_RELA:
+ case R_NDS32_SDA15S3_RELA:
+ case R_NDS32_SDA15S3:
+ align = 0x7;
+ goto handle_sda;
+
+ case R_NDS32_SDA17S2_RELA:
+ case R_NDS32_SDA15S2_RELA:
+ case R_NDS32_SDA12S2_SP_RELA:
+ case R_NDS32_SDA12S2_DP_RELA:
+ case R_NDS32_SDA15S2:
+ case R_NDS32_SDA_FP7U2_RELA:
+ align = 0x3;
+ goto handle_sda;
+
+ case R_NDS32_SDA18S1_RELA:
+ case R_NDS32_SDA15S1_RELA:
+ case R_NDS32_SDA15S1:
+ align = 0x1;
+ goto handle_sda;
+
+ case R_NDS32_SDA19S0_RELA:
+ case R_NDS32_SDA15S0_RELA:
+ case R_NDS32_SDA15S0:
+ align = 0x0;
+handle_sda:
+ BFD_ASSERT (sec != NULL);
+
+ /* If the symbol is in the abs section, the out_bfd will be null.
+ This happens when the relocation has a symbol@GOTOFF. */
+ r = nds32_elf_final_sda_base (output_bfd, info, &gp, FALSE);
+ if (r != bfd_reloc_ok)
+ {
+ (*_bfd_error_handler)
+ (_("%B: warning: relocate SDA_BASE failed."), input_bfd);
+ ret = FALSE;
+ goto check_reloc;
+ }
+
+ /* At this point `relocation' contains the object's
+ address. */
+ if (r_type == R_NDS32_SDA_FP7U2_RELA)
+ {
+ relocation -= fpbase_addr;
+ }
+ else
+ relocation -= gp;
+ /* Now it contains the offset from _SDA_BASE_. */
+
+ /* Make sure alignment is correct. */
+
+ if (relocation & align)
+ {
+ /* Incorrect alignment. */
+ (*_bfd_error_handler)
+ (_("%B(%A): warning: unaligned small data access of type %d."),
+ input_bfd, input_section, r_type);
+ ret = FALSE;
+ goto check_reloc;
+ }
+
+ break;
+ case R_NDS32_17IFC_PCREL_RELA:
+ case R_NDS32_10IFCU_PCREL_RELA:
+ /* do nothing */
+ break;
+
+ case R_NDS32_TLS_LE_HI20:
+ case R_NDS32_TLS_LE_LO12:
+ case R_NDS32_TLS_LE_20:
+ case R_NDS32_TLS_LE_15S0:
+ case R_NDS32_TLS_LE_15S1:
+ case R_NDS32_TLS_LE_15S2:
+ if (elf_hash_table (info)->tls_sec != NULL)
+ relocation -= (elf_hash_table (info)->tls_sec->vma + TP_OFFSET);
+ break;
+ case R_NDS32_TLS_IE_HI20:
+ case R_NDS32_TLS_IE_LO12S2:
+ case R_NDS32_TLS_DESC_HI20:
+ case R_NDS32_TLS_DESC_LO12:
+ case R_NDS32_TLS_IE_LO12:
+ case R_NDS32_TLS_IEGP_HI20:
+ case R_NDS32_TLS_IEGP_LO12:
+ case R_NDS32_TLS_IEGP_LO12S2:
+ {
+ /* Relocation is to the entry for this symbol in the global
+ offset table. */
+ enum elf_nds32_tls_type tls_type, org_tls_type, eff_tls_type;
+ asection *srelgot;
+ Elf_Internal_Rela outrel;
+ bfd_byte *loc;
+ int indx = 0;
+
+ eff_tls_type = org_tls_type = get_tls_type (r_type, h);
+
+ BFD_ASSERT (sgot != NULL);
+ if (h != NULL)
+ {
+ bfd_boolean dyn;
+
+ off = h->got.offset;
+ BFD_ASSERT (off != (bfd_vma) -1);
+ dyn = htab->root.dynamic_sections_created;
+ tls_type = ((struct elf_nds32_link_hash_entry *) h)->tls_type;
+ if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
+ && (!info->shared
+ || !SYMBOL_REFERENCES_LOCAL (info, h)))
+ indx = h->dynindx;
+ }
+ else
+ {
+ BFD_ASSERT (local_got_offsets != NULL
+ && local_got_offsets[r_symndx] != (bfd_vma) - 1);
+
+ off = local_got_offsets[r_symndx];
+ tls_type = elf32_nds32_local_got_tls_type (input_bfd)[r_symndx];
+ }
+
+ relocation = sgot->output_section->vma + sgot->output_offset + off;
+
+ if (1 < ones32 (tls_type))
+ {
+ eff_tls_type = 1 << (fls (tls_type) - 1);
+ /* TLS model shall be handled in nds32_elf_unify_tls_model () */
+
+ /* TLS model X -> LE is not implement yet!
+ * workaround here! */
+ if (eff_tls_type == GOT_TLS_LE)
+ {
+ eff_tls_type = 1 << (fls (tls_type ^ eff_tls_type) - 1);
+ }
+ }
+
+ /* The offset must always be a multiple of 4. We use
+ the least significant bit to record whether we have
+ already processed this entry. */
+ bfd_boolean need_relocs = FALSE;
+ srelgot = ehtab->srelgot;
+ if ((info->shared || indx != 0)
+ && (h == NULL || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
+ || h->root.type != bfd_link_hash_undefweak))
+ {
+ need_relocs = TRUE;
+ BFD_ASSERT (srelgot != NULL);
+ }
+
+ if (off & 1)
+ {
+ off &= ~1;
+ relocation &= ~1;
+
+ if (eff_tls_type & GOT_TLS_DESC)
+ {
+ relocation -= elf_gp (output_bfd);
+ if ((R_NDS32_TLS_DESC_HI20 == r_type) && (!need_relocs))
+ {
+ /* TLS model shall be converted */
+ BFD_ASSERT(0);
+ }
+ }
+ else if (eff_tls_type & GOT_TLS_IEGP)
+ {
+ relocation -= elf_gp (output_bfd);
+ }
+ }
+ else
+ {
+ if ((eff_tls_type & GOT_TLS_LE) && (tls_type ^ eff_tls_type))
+ {
+ /* TLS model workaround shall be applied */
+ BFD_ASSERT(0);
+ }
+ else if (eff_tls_type & (GOT_TLS_IE | GOT_TLS_IEGP))
+ {
+ if (eff_tls_type & GOT_TLS_IEGP)
+ relocation -= elf_gp(output_bfd);
+
+ if (need_relocs)
+ {
+ if (indx == 0)
+ outrel.r_addend = gottpoff (info, relocation_sym);
+ else
+ outrel.r_addend = 0;
+ outrel.r_offset = (sgot->output_section->vma
+ + sgot->output_offset + off);
+ outrel.r_info = ELF32_R_INFO (indx, R_NDS32_TLS_TPOFF);
+
+ elf32_nds32_add_dynreloc (output_bfd, info, srelgot,
+ &outrel);
+ }
+ else
+ {
+ bfd_put_32 (output_bfd, gottpoff (info, relocation_sym),
+ sgot->contents + off);
+ }
+ }
+ else if (eff_tls_type & GOT_TLS_DESC)
+ {
+ relocation -= elf_gp (output_bfd);
+ if (need_relocs)
+ {
+ asection *srelplt;
+ srelplt = ehtab->srelplt;
+
+ if (indx == 0)
+ outrel.r_addend = gottpoff (info, relocation_sym);
+ else
+ outrel.r_addend = 0;
+ outrel.r_offset = (sgot->output_section->vma
+ + sgot->output_offset + off);
+ outrel.r_info = ELF32_R_INFO (indx, R_NDS32_TLS_DESC);
+
+ loc = srelplt->contents;
+ loc += htab->next_tls_desc_index++ * sizeof (Elf32_External_Rela);
+ BFD_ASSERT (loc + sizeof (Elf32_External_Rela)
+ <= srelplt->contents + srelplt->size);
+
+ bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
+ }
+ else
+ {
+ /* feed me! */
+ bfd_put_32 (output_bfd, 0xdeadbeef,
+ sgot->contents + off);
+ bfd_put_32 (output_bfd, gottpoff (info, relocation_sym),
+ sgot->contents + off + 4);
+ patch_tls_desc_to_ie (contents, rel, input_bfd);
+ BFD_ASSERT(0);
+ }
+ }
+ else
+ {
+ /* TLS model workaround shall be applied */
+ BFD_ASSERT(0);
+ }
+
+ if (h != NULL)
+ h->got.offset |= 1;
+ else
+ local_got_offsets[r_symndx] |= 1;
+ }
+ }
+ break;
+
+ case R_NDS32_SECURITY_16:
+ relocation = nds32_elf_crc_relocation (crc_rel, rel, relend,
+ contents);
+ crc_rel->r_addend = NDS32_SECURITY_NONE;
+ r = nds32_elf_final_link_relocate (howto, input_bfd,
+ input_section, contents,
+ crc_rel->r_offset, relocation,
+ crc_rel->r_addend);
+ crc_rel = NULL;
+ goto check_reloc;
+ break;
+ /* DON'T fall through. */
+ case R_NDS32_ICT_HI20:
+ case R_NDS32_ICT_LO12:
+ case R_NDS32_ICT_25PC:
+ if (!ignore_indirect_call)
+ {
+ entry = (struct elf_nds32_ict_hash_entry*)
+ bfd_hash_lookup (&indirect_call_table, h->root.root.string,
+ FALSE, FALSE);
+ if (!entry)
+ {
+ (*_bfd_error_handler)
+ (_("%B %A: internal error indirect call relocation "
+ "0x%lx without hash.\n"),
+ input_bfd, sec, rel->r_offset);
+ bfd_set_error (bfd_error_bad_value);
+ return FALSE;
+ }
+
+ h2 = bfd_link_hash_lookup (info->hash,
+ "_INDIRECT_CALL_TABLE_BASE_",
+ FALSE, FALSE, FALSE);
+ relocation = ((h2->u.def.value
+ + h2->u.def.section->output_section->vma
+ + h2->u.def.section->output_offset)
+ + (entry->order * 4));
+ }
+ break;
+ /* DON'T fall through. */
+
+ default:
+ /* OLD_NDS32_RELOC. */
+
+ r = _bfd_final_link_relocate (howto, input_bfd, input_section,
+ contents, offset, relocation, addend);
+ goto check_reloc;
+ }
+
+ switch ((int) r_type)
+ {
+ case R_NDS32_20_RELA:
+ case R_NDS32_5_RELA:
+ case R_NDS32_9_PCREL_RELA:
+ case R_NDS32_WORD_9_PCREL_RELA:
+ case R_NDS32_10_UPCREL_RELA:
+ case R_NDS32_15_PCREL_RELA:
+ case R_NDS32_17_PCREL_RELA:
+ case R_NDS32_25_PCREL_RELA:
+ case R_NDS32_25_ABS_RELA:
+ case R_NDS32_HI20_RELA:
+ case R_NDS32_LO12S3_RELA:
+ case R_NDS32_LO12S2_RELA:
+ case R_NDS32_LO12S2_DP_RELA:
+ case R_NDS32_LO12S2_SP_RELA:
+ case R_NDS32_LO12S1_RELA:
+ case R_NDS32_LO12S0_RELA:
+ case R_NDS32_LO12S0_ORI_RELA:
+ case R_NDS32_SDA16S3_RELA:
+ case R_NDS32_SDA17S2_RELA:
+ case R_NDS32_SDA18S1_RELA:
+ case R_NDS32_SDA19S0_RELA:
+ case R_NDS32_SDA15S3_RELA:
+ case R_NDS32_SDA15S2_RELA:
+ case R_NDS32_SDA12S2_DP_RELA:
+ case R_NDS32_SDA12S2_SP_RELA:
+ case R_NDS32_SDA15S1_RELA:
+ case R_NDS32_SDA15S0_RELA:
+ case R_NDS32_SDA_FP7U2_RELA:
+ case R_NDS32_9_PLTREL:
+ case R_NDS32_25_PLTREL:
+ case R_NDS32_GOT20:
+ case R_NDS32_GOT_HI20:
+ case R_NDS32_GOT_LO12:
+ case R_NDS32_GOT_LO15:
+ case R_NDS32_GOT_LO19:
+ case R_NDS32_GOT15S2_RELA:
+ case R_NDS32_GOT17S2_RELA:
+ case R_NDS32_GOTPC20:
+ case R_NDS32_GOTPC_HI20:
+ case R_NDS32_GOTPC_LO12:
+ case R_NDS32_GOTOFF:
+ case R_NDS32_GOTOFF_HI20:
+ case R_NDS32_GOTOFF_LO12:
+ case R_NDS32_GOTOFF_LO15:
+ case R_NDS32_GOTOFF_LO19:
+ case R_NDS32_PLTREL_HI20:
+ case R_NDS32_PLTREL_LO12:
+ case R_NDS32_PLT_GOTREL_HI20:
+ case R_NDS32_PLT_GOTREL_LO12:
+ case R_NDS32_PLT_GOTREL_LO15:
+ case R_NDS32_PLT_GOTREL_LO19:
+ case R_NDS32_PLT_GOTREL_LO20:
+ case R_NDS32_17IFC_PCREL_RELA:
+ case R_NDS32_10IFCU_PCREL_RELA:
+ case R_NDS32_TLS_LE_HI20:
+ case R_NDS32_TLS_LE_LO12:
+ case R_NDS32_TLS_IE_HI20:
+ case R_NDS32_TLS_IE_LO12S2:
+ case R_NDS32_TLS_LE_20:
+ case R_NDS32_TLS_LE_15S0:
+ case R_NDS32_TLS_LE_15S1:
+ case R_NDS32_TLS_LE_15S2:
+ case R_NDS32_TLS_DESC_HI20:
+ case R_NDS32_TLS_DESC_LO12:
+ case R_NDS32_TLS_IE_LO12:
+ case R_NDS32_TLS_IEGP_HI20:
+ case R_NDS32_TLS_IEGP_LO12:
+ case R_NDS32_TLS_IEGP_LO12S2:
+ /* Instruction related relocs must handle endian properly. */
+ /* NOTE: PIC IS NOT HANDLE YET; DO IT LATER. */
+ r = nds32_elf_final_link_relocate (howto, input_bfd,
+ input_section, contents,
+ rel->r_offset, relocation,
+ rel->r_addend);
+ break;
+
+ case R_NDS32_ICT_HI20:
+ case R_NDS32_ICT_LO12:
+ case R_NDS32_ICT_25PC:
+ r = nds32_elf_final_link_relocate (howto, input_bfd, input_section,
+ contents, rel->r_offset,
+ relocation, 0);
+ break;
+
+ default:
+ /* All other relocs can use default handler. */
+ r = _bfd_final_link_relocate (howto, input_bfd, input_section,
+ contents, rel->r_offset,
+ relocation, rel->r_addend);
+ break;
+ }
+
+check_reloc:
+
+ if (r != bfd_reloc_ok)
+ {
+ /* FIXME: This should be generic enough to go in a utility. */
+ const char *name;
+
+ if (h != NULL)
+ name = h->root.root.string;
+ else
+ {
+ name = bfd_elf_string_from_elf_section
+ (input_bfd, symtab_hdr->sh_link, sym->st_name);
+ if (name == NULL || *name == '\0')
+ name = bfd_section_name (input_bfd, sec);
+ }
+
+ if (errmsg != NULL)
+ goto common_error;
+
+ switch (r)
+ {
+ case bfd_reloc_overflow:
+ if (!((*info->callbacks->reloc_overflow)
+ (info, (h ? &h->root : NULL), name, howto->name,
+ (bfd_vma) 0, input_bfd, input_section, offset)))
+ return FALSE;
+ break;
+
+ case bfd_reloc_undefined:
+ if (!((*info->callbacks->undefined_symbol)
+ (info, name, input_bfd, input_section, offset, TRUE)))
+ return FALSE;
+ break;
+
+ case bfd_reloc_outofrange:
+ errmsg = _("internal error: out of range error");
+ goto common_error;
+
+ case bfd_reloc_notsupported:
+ errmsg = _("internal error: unsupported relocation error");
+ goto common_error;
+
+ case bfd_reloc_dangerous:
+ errmsg = _("internal error: dangerous error");
+ goto common_error;
+
+ default:
+ errmsg = _("internal error: unknown error");
+ /* Fall through. */
+
+common_error:
+ if (!((*info->callbacks->warning)
+ (info, errmsg, name, input_bfd, input_section, offset)))
+ return FALSE;
+ break;
+ }
+ }
+ }
+
+ /* Resotre header size to avoid overflow load. */
+ if (elf_nds32_tdata (input_bfd)->hdr_size != 0)
+ symtab_hdr->sh_size = elf_nds32_tdata (input_bfd)->hdr_size;
+
+ return ret;
+}
+
+/* Finish up dynamic symbol handling. We set the contents of various
+ dynamic sections here. */
+
+static bfd_boolean
+nds32_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info,
+ struct elf_link_hash_entry *h,
+ Elf_Internal_Sym *sym)
+{
+ struct elf_link_hash_table *ehtab;
+ struct elf_nds32_link_hash_entry *hent;
+ bfd_byte *loc;
+
+ ehtab = elf_hash_table (info);
+ hent = (struct elf_nds32_link_hash_entry *) h;
+
+ if (h->plt.offset != (bfd_vma) - 1)
+ {
+ asection *splt;
+ asection *sgot;
+ asection *srela;
+
+ bfd_vma plt_index;
+ bfd_vma got_offset;
+ bfd_vma local_plt_offset;
+ Elf_Internal_Rela rela;
+
+ /* This symbol has an entry in the procedure linkage table. Set
+ it up. */
+
+ BFD_ASSERT (h->dynindx != -1);
+
+ splt = ehtab->splt;
+ sgot = ehtab->sgotplt;
+ srela = ehtab->srelplt;
+ BFD_ASSERT (splt != NULL && sgot != NULL && srela != NULL);
+
+ /* Get the index in the procedure linkage table which
+ corresponds to this symbol. This is the index of this symbol
+ in all the symbols for which we are making plt entries. The
+ first entry in the procedure linkage table is reserved. */
+ plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
+
+ /* Get the offset into the .got table of the entry that
+ corresponds to this function. Each .got entry is 4 bytes.
+ The first three are reserved. */
+ got_offset = (plt_index + 3) * 4;
+
+ /* Fill in the entry in the procedure linkage table. */
+ if (!info->shared)
+ {
+ unsigned long insn;
+
+ insn = PLT_ENTRY_WORD0 + (((sgot->output_section->vma
+ + sgot->output_offset + got_offset) >> 12)
+ & 0xfffff);
+ bfd_putb32 (insn, splt->contents + h->plt.offset);
+
+ insn = PLT_ENTRY_WORD1 + (((sgot->output_section->vma
+ + sgot->output_offset + got_offset) & 0x0fff)
+ >> 2);
+ bfd_putb32 (insn, splt->contents + h->plt.offset + 4);
+
+ insn = PLT_ENTRY_WORD2;
+ bfd_putb32 (insn, splt->contents + h->plt.offset + 8);
+
+ insn = PLT_ENTRY_WORD3 + (plt_index & 0x7ffff);
+ bfd_putb32 (insn, splt->contents + h->plt.offset + 12);
+
+ insn = PLT_ENTRY_WORD4
+ + (((unsigned int) ((-(h->plt.offset + 16)) >> 1)) & 0xffffff);
+ bfd_putb32 (insn, splt->contents + h->plt.offset + 16);
+ local_plt_offset = 12;
+ }
+ else
+ {
+ /* sda_base must be set at this time. */
+ unsigned long insn;
+ long offset;
+
+ /* FIXME, sda_base is 65536, it will damage opcode. */
+ offset = sgot->output_section->vma + sgot->output_offset + got_offset
+ - elf_gp (output_bfd);
+ insn = PLT_PIC_ENTRY_WORD0 + ((offset >> 12) & 0xfffff);
+ bfd_putb32 (insn, splt->contents + h->plt.offset);
+
+ insn = PLT_PIC_ENTRY_WORD1 + (offset & 0xfff);
+ bfd_putb32 (insn, splt->contents + h->plt.offset + 4);
+
+ insn = PLT_PIC_ENTRY_WORD2;
+ bfd_putb32 (insn, splt->contents + h->plt.offset + 8);
+
+ insn = PLT_PIC_ENTRY_WORD3;
+ bfd_putb32 (insn, splt->contents + h->plt.offset + 12);
+
+ insn = PLT_PIC_ENTRY_WORD4 + (plt_index & 0x7fffff);
+ bfd_putb32 (insn, splt->contents + h->plt.offset + 16);
+
+ insn = PLT_PIC_ENTRY_WORD5
+ + (((unsigned int) ((-(h->plt.offset + 20)) >> 1)) & 0xffffff);
+ bfd_putb32 (insn, splt->contents + h->plt.offset + 20);
+
+ local_plt_offset = 16;
+ }
+
+ /* Fill in the entry in the global offset table,
+ so it will fall through to the next instruction for the first time. */
+ bfd_put_32 (output_bfd,
+ (splt->output_section->vma + splt->output_offset
+ + h->plt.offset + local_plt_offset),
+ sgot->contents + got_offset);
+
+ /* Fill in the entry in the .rela.plt section. */
+ rela.r_offset = (sgot->output_section->vma
+ + sgot->output_offset + got_offset);
+ rela.r_info = ELF32_R_INFO (h->dynindx, R_NDS32_JMP_SLOT);
+ rela.r_addend = 0;
+ loc = srela->contents;
+ loc += plt_index * sizeof (Elf32_External_Rela);
+ bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
+
+ if (!h->def_regular)
+ {
+ /* Mark the symbol as undefined, rather than as defined in
+ the .plt section. Leave the value alone. */
+ sym->st_shndx = SHN_UNDEF;
+ if (!h->ref_regular_nonweak)
+ sym->st_value = 0;
+ }
+ }
+
+ if ((h->got.offset != (bfd_vma) -1) && (hent->tls_type == GOT_NORMAL))
+ {
+ asection *sgot;
+ asection *srelagot;
+ Elf_Internal_Rela rela;
+
+ /* This symbol has an entry in the global offset table.
+ Set it up. */
+
+ sgot = ehtab->sgot;
+ srelagot = ehtab->srelgot;
+ BFD_ASSERT (sgot != NULL && srelagot != NULL);
+
+ rela.r_offset = (sgot->output_section->vma
+ + sgot->output_offset + (h->got.offset & ~1));
+
+ /* If this is a -Bsymbolic link, and the symbol is defined
+ locally, we just want to emit a RELATIVE reloc. Likewise if
+ the symbol was forced to be local because of a version file.
+ The entry in the global offset table will already have been
+ initialized in the relocate_section function. */
+ if ((info->shared
+ && (info->symbolic || h->dynindx == -1 || h->forced_local)
+ && h->def_regular)
+ || (info->pie && h->def_regular))
+ {
+ rela.r_info = ELF32_R_INFO (0, R_NDS32_RELATIVE);
+ rela.r_addend = (h->root.u.def.value
+ + h->root.u.def.section->output_section->vma
+ + h->root.u.def.section->output_offset);
+
+ /* FIXME: cancel PLT trampoline, too late ?? */
+ /* h->plt.offset = (bfd_vma) -1; */
+ }
+ else
+ {
+ BFD_ASSERT ((h->got.offset & 1) == 0);
+ bfd_put_32 (output_bfd, (bfd_vma) 0,
+ sgot->contents + h->got.offset);
+ rela.r_info = ELF32_R_INFO (h->dynindx, R_NDS32_GLOB_DAT);
+ rela.r_addend = 0;
+ }
+
+ loc = srelagot->contents;
+ loc += srelagot->reloc_count * sizeof (Elf32_External_Rela);
+ bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
+ ++srelagot->reloc_count;
+ BFD_ASSERT (loc < (srelagot->contents + srelagot->size));
+ }
+
+ if (h->needs_copy)
+ {
+ asection *s;
+ Elf_Internal_Rela rela;
+
+ /* This symbols needs a copy reloc. Set it up. */
+
+ BFD_ASSERT (h->dynindx != -1
+ && (h->root.type == bfd_link_hash_defined
+ || h->root.type == bfd_link_hash_defweak));
+
+ s = bfd_get_section_by_name (h->root.u.def.section->owner, ".rela.bss");
+ BFD_ASSERT (s != NULL);
+
+ rela.r_offset = (h->root.u.def.value
+ + h->root.u.def.section->output_section->vma
+ + h->root.u.def.section->output_offset);
+ rela.r_info = ELF32_R_INFO (h->dynindx, R_NDS32_COPY);
+ rela.r_addend = 0;
+ loc = s->contents;
+ loc += s->reloc_count * sizeof (Elf32_External_Rela);
+ bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
+ ++s->reloc_count;
+ }
+
+ /* Mark some specially defined symbols as absolute. */
+ if (strcmp (h->root.root.string, "_DYNAMIC") == 0
+ || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
+ sym->st_shndx = SHN_ABS;
+
+ return TRUE;
+}
+
+
+/* Finish up the dynamic sections. */
+
+static bfd_boolean
+nds32_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
+{
+ bfd *dynobj;
+ asection *sdyn;
+ asection *sgotplt;
+ struct elf_link_hash_table *ehtab;
+ struct elf_nds32_link_hash_table *htab;
+
+ ehtab = elf_hash_table (info);
+ htab = nds32_elf_hash_table (info);
+ if (htab == NULL)
+ return FALSE;
+
+ dynobj = elf_hash_table (info)->dynobj;
+
+ sgotplt = ehtab->sgotplt;
+ /* A broken linker script might have discarded the dynamic sections.
+ Catch this here so that we do not seg-fault later on. */
+ if (sgotplt != NULL && bfd_is_abs_section (sgotplt->output_section))
+ return FALSE;
+ sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
+
+ if (elf_hash_table (info)->dynamic_sections_created)
+ {
+ asection *splt;
+ Elf32_External_Dyn *dyncon, *dynconend;
+
+ BFD_ASSERT (sgotplt != NULL && sdyn != NULL);
+
+ dyncon = (Elf32_External_Dyn *) sdyn->contents;
+ dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
+
+ for (; dyncon < dynconend; dyncon++)
+ {
+ Elf_Internal_Dyn dyn;
+ asection *s;
+
+ bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
+
+ switch (dyn.d_tag)
+ {
+ default:
+ break;
+
+ case DT_PLTGOT:
+ /* name = ".got"; */
+ s = ehtab->sgot->output_section;
+ goto get_vma;
+ case DT_JMPREL:
+ s = ehtab->srelplt->output_section;
+get_vma:
+ BFD_ASSERT (s != NULL);
+ dyn.d_un.d_ptr = s->vma;
+ bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
+ break;
+
+ case DT_PLTRELSZ:
+ s = ehtab->srelplt->output_section;
+ BFD_ASSERT (s != NULL);
+ dyn.d_un.d_val = s->size;
+ bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
+ break;
+
+ case DT_RELASZ:
+ /* My reading of the SVR4 ABI indicates that the
+ procedure linkage table relocs (DT_JMPREL) should be
+ included in the overall relocs (DT_RELA). This is
+ what Solaris does. However, UnixWare can not handle
+ that case. Therefore, we override the DT_RELASZ entry
+ here to make it not include the JMPREL relocs. Since
+ the linker script arranges for .rela.plt to follow all
+ other relocation sections, we don't have to worry
+ about changing the DT_RELA entry. */
+ if (ehtab->srelplt != NULL)
+ {
+ s = ehtab->srelplt->output_section;
+ dyn.d_un.d_val -= s->size;
+ }
+ bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
+ break;
+
+ case DT_TLSDESC_PLT:
+ s = htab->root.splt;
+ dyn.d_un.d_ptr = (s->output_section->vma + s->output_offset
+ + htab->dt_tlsdesc_plt);
+ bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
+ break;
+
+ case DT_TLSDESC_GOT:
+ s = htab->root.sgot;
+ dyn.d_un.d_ptr = (s->output_section->vma + s->output_offset
+ + htab->dt_tlsdesc_got);
+ bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
+ break;
+ }
+ }
+
+ /* Fill in the first entry in the procedure linkage table. */
+ splt = ehtab->splt;
+ if (splt && splt->size > 0)
+ {
+ if (info->shared)
+ {
+ unsigned long insn;
+ long offset;
+
+ /* FIXME, sda_base is 65536, it will damage opcode. */
+ offset = sgotplt->output_section->vma + sgotplt->output_offset + 4
+ - elf_gp (output_bfd);
+ insn = PLT0_PIC_ENTRY_WORD0 | ((offset >> 12) & 0xfffff);
+ bfd_putb32 (insn, splt->contents);
+
+ /* here has a typo? */
+ insn = PLT0_PIC_ENTRY_WORD1 | (offset & 0xfff);
+ bfd_putb32 (insn, splt->contents + 4);
+
+ insn = PLT0_PIC_ENTRY_WORD2;
+ bfd_putb32 (insn, splt->contents + 8);
+
+ insn = PLT0_PIC_ENTRY_WORD3;
+ bfd_putb32 (insn, splt->contents + 12);
+
+ insn = PLT0_PIC_ENTRY_WORD4;
+ bfd_putb32 (insn, splt->contents + 16);
+
+ insn = PLT0_PIC_ENTRY_WORD5;
+ bfd_putb32 (insn, splt->contents + 20);
+ }
+ else
+ {
+ unsigned long insn;
+ unsigned long addr;
+
+ /* addr = .got + 4 */
+ addr = sgotplt->output_section->vma + sgotplt->output_offset + 4;
+ insn = PLT0_ENTRY_WORD0 | ((addr >> 12) & 0xfffff);
+ bfd_putb32 (insn, splt->contents);
+
+ insn = PLT0_ENTRY_WORD1 | (addr & 0x0fff);
+ bfd_putb32 (insn, splt->contents + 4);
+
+ insn = PLT0_ENTRY_WORD2;
+ bfd_putb32 (insn, splt->contents + 8);
+
+ insn = PLT0_ENTRY_WORD3;
+ bfd_putb32 (insn, splt->contents + 12);
+
+ insn = PLT0_ENTRY_WORD4;
+ bfd_putb32 (insn, splt->contents + 16);
+ }
+
+ elf_section_data (splt->output_section)->this_hdr.sh_entsize =
+ PLT_ENTRY_SIZE;
+ }
+
+ if (htab->dt_tlsdesc_plt)
+ {
+ /* Calculate addresses. */
+ asection *sgot = sgot = ehtab->sgot;
+ bfd_vma pltgot = sgotplt->output_section->vma
+ + sgotplt->output_offset;
+ bfd_vma tlsdesc_got = sgot->output_section->vma + sgot->output_offset
+ + htab->dt_tlsdesc_got;
+
+ /* Get GP offset. */
+ pltgot -= elf_gp (output_bfd) - 4; /* PLTGOT[1] */
+ tlsdesc_got -= elf_gp (output_bfd);
+
+ /* Do relocation. */
+ dl_tlsdesc_lazy_trampoline[0] += ((1 << 20) - 1) & (tlsdesc_got >> 12);
+ dl_tlsdesc_lazy_trampoline[1] += 0xfff & tlsdesc_got;
+ dl_tlsdesc_lazy_trampoline[4] += ((1 << 20) - 1) & (pltgot >> 12);
+ dl_tlsdesc_lazy_trampoline[5] += 0xfff & pltgot;
+
+ /* TODO: relaxation. */
+
+ /* Insert .plt. */
+ nds32_put_trampoline (splt->contents + htab->dt_tlsdesc_plt,
+ dl_tlsdesc_lazy_trampoline,
+ ARRAY_SIZE (dl_tlsdesc_lazy_trampoline));
+ }
+ }
+
+ /* Fill in the first three entries in the global offset table. */
+ if (sgotplt && sgotplt->size > 0)
+ {
+ if (sdyn == NULL)
+ bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents);
+ else
+ bfd_put_32 (output_bfd,
+ sdyn->output_section->vma + sdyn->output_offset,
+ sgotplt->contents);
+ bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 4);
+ bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 8);
+
+ elf_section_data (sgotplt->output_section)->this_hdr.sh_entsize = 4;
+ }
+
+ return TRUE;
+}
+
+
+/* Set the right machine number. */
+
+static bfd_boolean
+nds32_elf_object_p (bfd *abfd)
+{
+ static unsigned int cur_arch = 0;
+
+ if (E_N1_ARCH != (elf_elfheader (abfd)->e_flags & EF_NDS_ARCH))
+ {
+ /* E_N1_ARCH is a wild card, so it is set only when no others exist. */
+ cur_arch = (elf_elfheader (abfd)->e_flags & EF_NDS_ARCH);
+ }
+
+ switch (cur_arch)
+ {
+ default:
+ case E_N1_ARCH:
+ bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1);
+ break;
+ case E_N1H_ARCH:
+ bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1h);
+ break;
+ case E_NDS_ARCH_STAR_V2_0:
+ bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1h_v2);
+ break;
+ case E_NDS_ARCH_STAR_V3_0:
+ bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1h_v3);
+ break;
+ case E_NDS_ARCH_STAR_V3_M:
+ bfd_default_set_arch_mach (abfd, bfd_arch_nds32, bfd_mach_n1h_v3m);
+ break;
+ }
+
+ return TRUE;
+}
+
+/* Store the machine number in the flags field. */
+
+static void
+nds32_elf_final_write_processing (bfd *abfd,
+ bfd_boolean linker ATTRIBUTE_UNUSED)
+{
+ unsigned long val;
+ static unsigned int cur_mach = 0;
+ unsigned int i;
+
+ if (bfd_mach_n1 != bfd_get_mach (abfd))
+ {
+ cur_mach = bfd_get_mach (abfd);
+ }
+
+ switch (cur_mach)
+ {
+ case bfd_mach_n1:
+ /* Only happen when object is empty, since the case is abandon. */
+ val = E_N1_ARCH;
+ val |= E_NDS_ABI_AABI;
+ val |= E_NDS32_ELF_VER_1_4;
+ break;
+ case bfd_mach_n1h:
+ val = E_N1H_ARCH;
+ break;
+ case bfd_mach_n1h_v2:
+ val = E_NDS_ARCH_STAR_V2_0;
+ break;
+ case bfd_mach_n1h_v3:
+ val = E_NDS_ARCH_STAR_V3_0;
+ break;
+ case bfd_mach_n1h_v3m:
+ val = E_NDS_ARCH_STAR_V3_M;
+ break;
+ default:
+ val = 0;
+ break;
+ }
+
+ elf_elfheader (abfd)->e_flags &= ~EF_NDS_ARCH;
+ elf_elfheader (abfd)->e_flags |= val;
+
+ if (ict_file)
+ {
+ fprintf (ict_file, ".section " NDS32_ICT_SECTION ", \"ax\"\n"
+ ".globl _INDIRECT_CALL_TABLE_BASE_\n"
+ "_INDIRECT_CALL_TABLE_BASE_:\n");
+ /* Output rom patch entries. */
+ indirect_call_table.frozen = 1;
+ for (i = 0; i < indirect_call_table.size; i++)
+ {
+ struct bfd_hash_entry *p;
+ struct elf_nds32_ict_hash_entry *entry;
+
+ for (p = indirect_call_table.table[i]; p != NULL; p = p->next)
+ {
+ entry = (struct elf_nds32_ict_hash_entry *) p;
+ fprintf (ict_file, "\tj\t%s\n", entry->root.string);
+ }
+ }
+ indirect_call_table.frozen = 0;
+ }
+}
+
+/* Function to keep NDS32 specific file flags. */
+
+static bfd_boolean
+nds32_elf_set_private_flags (bfd *abfd, flagword flags)
+{
+ BFD_ASSERT (!elf_flags_init (abfd)
+ || elf_elfheader (abfd)->e_flags == flags);
+
+ elf_elfheader (abfd)->e_flags = flags;
+ elf_flags_init (abfd) = TRUE;
+ return TRUE;
+}
+
+static unsigned int
+convert_e_flags (unsigned int e_flags, unsigned int arch)
+{
+ if ((e_flags & EF_NDS_ARCH) == E_NDS_ARCH_STAR_V0_9)
+ {
+ /* From 0.9 to 1.0. */
+ e_flags = (e_flags & (~EF_NDS_ARCH)) | E_NDS_ARCH_STAR_V1_0;
+
+ /* Invert E_NDS32_HAS_NO_MAC_INST. */
+ e_flags ^= E_NDS32_HAS_NO_MAC_INST;
+ if (arch == E_NDS_ARCH_STAR_V1_0)
+ {
+ /* Done. */
+ return e_flags;
+ }
+ }
+
+ /* From 1.0 to 2.0. */
+ e_flags = (e_flags & (~EF_NDS_ARCH)) | E_NDS_ARCH_STAR_V2_0;
+
+ /* Clear E_NDS32_HAS_MFUSR_PC_INST. */
+ e_flags &= ~E_NDS32_HAS_MFUSR_PC_INST;
+
+ /* Invert E_NDS32_HAS_NO_MAC_INST. */
+ e_flags ^= E_NDS32_HAS_NO_MAC_INST;
+ return e_flags;
+}
+
+static bfd_boolean
+nds32_check_vec_size (bfd *ibfd)
+{
+ static unsigned int nds32_vec_size = 0;
+
+ asection *sec_t = NULL;
+ bfd_byte *contents = NULL;
+
+ sec_t = bfd_get_section_by_name (ibfd, ".nds32_e_flags");
+
+ if (sec_t && sec_t->size >= 4)
+ {
+ /* Get vec_size in file. */
+ unsigned int flag_t;
+
+ nds32_get_section_contents (ibfd, sec_t, &contents, TRUE);
+ flag_t = bfd_get_32 (ibfd, contents);
+
+ /* The value could only be 4 or 16. */
+
+ if (!nds32_vec_size)
+ /* Set if not set yet. */
+ nds32_vec_size = (flag_t & 0x3);
+ else if (nds32_vec_size != (flag_t & 0x3))
+ {
+ (*_bfd_error_handler) (_("%B: ISR vector size mismatch"
+ " with previous modules, previous %u-byte, current %u-byte"),
+ ibfd,
+ nds32_vec_size == 1 ? 4 : nds32_vec_size == 2 ? 16 : 0xffffffff,
+ (flag_t & 0x3) == 1 ? 4 : (flag_t & 0x3) == 2 ? 16 : 0xffffffff);
+ return FALSE;
+ }
+ else
+ /* Only keep the first vec_size section. */
+ sec_t->flags |= SEC_EXCLUDE;
+ }
+
+ return TRUE;
+}
+
+/* Merge backend specific data from an object file to the output
+ object file when linking. */
+
+static bfd_boolean
+nds32_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
+{
+ flagword out_flags;
+ flagword in_flags;
+ flagword out_16regs;
+ flagword in_no_mac;
+ flagword out_no_mac;
+ flagword in_16regs;
+ flagword out_version;
+ flagword in_version;
+ flagword out_fpu_config;
+ flagword in_fpu_config;
+
+ /* TODO: Revise to use object-attributes instead. */
+ if (!nds32_check_vec_size (ibfd))
+ return FALSE;
+
+ if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
+ || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
+ return TRUE;
+
+ if (bfd_little_endian (ibfd) != bfd_little_endian (obfd))
+ {
+ (*_bfd_error_handler)
+ (_("%B: warning: Endian mismatch with previous modules."), ibfd);
+
+ bfd_set_error (bfd_error_bad_value);
+ return FALSE;
+ }
+
+ /* [Bug 11585] [Ticket 7067] -B option in objcopy cannot work as expected.
+ e_flags = 0 shall be treat as generic one.
+ no checking, and no merging.
+ */
+ if (elf_elfheader (ibfd)->e_flags)
+ {
+ in_version = elf_elfheader (ibfd)->e_flags & EF_NDS32_ELF_VERSION;
+ if (in_version == E_NDS32_ELF_VER_1_2)
+ {
+ (*_bfd_error_handler)
+ (_("%B: warning: Older version of object file encountered, "
+ "Please recompile with current tool chain."), ibfd);
+ }
+
+ /* We may need to merge V1 and V2 arch object files to V2. */
+ if ((elf_elfheader (ibfd)->e_flags & EF_NDS_ARCH)
+ != (elf_elfheader (obfd)->e_flags & EF_NDS_ARCH))
+ {
+ /* Need to convert version. */
+ if ((elf_elfheader (ibfd)->e_flags & EF_NDS_ARCH)
+ == E_NDS_ARCH_STAR_RESERVED)
+ {
+ elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
+ }
+ else if ((elf_elfheader (obfd)->e_flags & EF_NDS_ARCH)
+ == E_NDS_ARCH_STAR_V0_9
+ || (elf_elfheader (ibfd)->e_flags & EF_NDS_ARCH)
+ > (elf_elfheader (obfd)->e_flags & EF_NDS_ARCH))
+ {
+ elf_elfheader (obfd)->e_flags =
+ convert_e_flags (elf_elfheader (obfd)->e_flags,
+ (elf_elfheader (ibfd)->e_flags & EF_NDS_ARCH));
+ }
+ else
+ {
+ elf_elfheader (ibfd)->e_flags =
+ convert_e_flags (elf_elfheader (ibfd)->e_flags,
+ (elf_elfheader (obfd)->e_flags & EF_NDS_ARCH));
+ }
+ }
+
+ /* Extract some flags. */
+ in_flags = elf_elfheader (ibfd)->e_flags
+ & (~(E_NDS32_HAS_REDUCED_REGS | EF_NDS32_ELF_VERSION
+ | E_NDS32_HAS_NO_MAC_INST | E_NDS32_FPU_REG_CONF));
+
+ /* The following flags need special treatment. */
+ in_16regs = elf_elfheader (ibfd)->e_flags & E_NDS32_HAS_REDUCED_REGS;
+ in_no_mac = elf_elfheader (ibfd)->e_flags & E_NDS32_HAS_NO_MAC_INST;
+ in_fpu_config = elf_elfheader (ibfd)->e_flags & E_NDS32_FPU_REG_CONF;
+
+ /* Extract some flags. */
+ out_flags = elf_elfheader (obfd)->e_flags
+ & (~(E_NDS32_HAS_REDUCED_REGS | EF_NDS32_ELF_VERSION
+ | E_NDS32_HAS_NO_MAC_INST | E_NDS32_FPU_REG_CONF));
+
+ /* The following flags need special treatment. */
+ out_16regs = elf_elfheader (obfd)->e_flags & E_NDS32_HAS_REDUCED_REGS;
+ out_no_mac = elf_elfheader (obfd)->e_flags & E_NDS32_HAS_NO_MAC_INST;
+ out_fpu_config = elf_elfheader (obfd)->e_flags & E_NDS32_FPU_REG_CONF;
+ out_version = elf_elfheader (obfd)->e_flags & EF_NDS32_ELF_VERSION;
+ if (!elf_flags_init (obfd))
+ {
+ /* If the input is the default architecture then do not
+ bother setting the flags for the output architecture,
+ instead allow future merges to do this. If no future
+ merges ever set these flags then they will retain their
+ unitialised values, which surprise surprise, correspond
+ to the default values. */
+ if (bfd_get_arch_info (ibfd)->the_default)
+ return TRUE;
+
+ elf_flags_init (obfd) = TRUE;
+ elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
+
+ if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
+ && bfd_get_arch_info (obfd)->the_default)
+ {
+ return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
+ bfd_get_mach (ibfd));
+ }
+
+ return TRUE;
+ }
+
+ /* Check flag compatibility. */
+ if ((in_flags & EF_NDS_ABI) != (out_flags & EF_NDS_ABI))
+ {
+ (*_bfd_error_handler)
+ (_("%B: error: ABI mismatch with previous modules."), ibfd);
+
+ bfd_set_error (bfd_error_bad_value);
+ return FALSE;
+ }
+
+ if ((in_flags & EF_NDS_ARCH) != (out_flags & EF_NDS_ARCH))
+ {
+ if (((in_flags & EF_NDS_ARCH) != E_N1_ARCH))
+ {
+ (*_bfd_error_handler)
+ (_("%B: error: Instruction set mismatch with previous modules."), ibfd);
+
+ bfd_set_error (bfd_error_bad_value);
+ return FALSE;
+ }
+ }
+
+ /* When linking with V1.2 and V1.3 objects together the output is V1.2.
+ and perf ext1 and DIV are mergerd to perf ext1. */
+ if (in_version == E_NDS32_ELF_VER_1_2 || out_version == E_NDS32_ELF_VER_1_2)
+ {
+ elf_elfheader (obfd)->e_flags =
+ (in_flags & (~(E_NDS32_HAS_EXT_INST | E_NDS32_HAS_DIV_INST)))
+ | (out_flags & (~(E_NDS32_HAS_EXT_INST | E_NDS32_HAS_DIV_INST)))
+ | (((in_flags & (E_NDS32_HAS_EXT_INST | E_NDS32_HAS_DIV_INST)))
+ ? E_NDS32_HAS_EXT_INST : 0)
+ | (((out_flags & (E_NDS32_HAS_EXT_INST | E_NDS32_HAS_DIV_INST)))
+ ? E_NDS32_HAS_EXT_INST : 0)
+ | (in_16regs & out_16regs) | (in_no_mac & out_no_mac)
+ | ((in_version > out_version) ? out_version : in_version);
+ }
+ else
+ {
+ if (in_version != out_version)
+ (*_bfd_error_handler) (
+ _("%B: warning: Incompatible elf-versions %s and %s."), ibfd,
+ nds32_elfver_strtab[out_version],
+ nds32_elfver_strtab[in_version]);
+
+ elf_elfheader (obfd)->e_flags = in_flags | out_flags
+ | (in_16regs & out_16regs) | (in_no_mac & out_no_mac)
+ | (in_fpu_config > out_fpu_config ? in_fpu_config : out_fpu_config)
+ | (in_version > out_version ? out_version : in_version);
+ }
+ }
+ return TRUE;
+}
+
+/* Display the flags field. */
+
+static bfd_boolean
+nds32_elf_print_private_bfd_data (bfd *abfd, void *ptr)
+{
+ FILE *file = (FILE *) ptr;
+
+ BFD_ASSERT (abfd != NULL && ptr != NULL);
+
+ _bfd_elf_print_private_bfd_data (abfd, ptr);
+
+ fprintf (file, _("private flags = %lx"), elf_elfheader (abfd)->e_flags);
+
+ switch (elf_elfheader (abfd)->e_flags & EF_NDS_ARCH)
+ {
+ default:
+ case E_N1_ARCH:
+ fprintf (file, _(": n1 instructions"));
+ break;
+ case E_N1H_ARCH:
+ fprintf (file, _(": n1h instructions"));
+ break;
+ }
+
+ fputc ('\n', file);
+
+ return TRUE;
+}
+
+static unsigned int
+nds32_elf_action_discarded (asection *sec)
+{
+
+ if (strncmp
+ (".gcc_except_table", sec->name, sizeof (".gcc_except_table") - 1) == 0)
+ return 0;
+
+ return _bfd_elf_default_action_discarded (sec);
+}
+
+static asection *
+nds32_elf_gc_mark_hook (asection *sec, struct bfd_link_info *info,
+ Elf_Internal_Rela *rel, struct elf_link_hash_entry *h,
+ Elf_Internal_Sym *sym)
+{
+ if (h != NULL)
+ switch (ELF32_R_TYPE (rel->r_info))
+ {
+ case R_NDS32_GNU_VTINHERIT:
+ case R_NDS32_GNU_VTENTRY:
+ case R_NDS32_RELA_GNU_VTINHERIT:
+ case R_NDS32_RELA_GNU_VTENTRY:
+ return NULL;
+ }
+
+ return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
+}
+
+static bfd_boolean
+nds32_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info, asection *sec,
+ const Elf_Internal_Rela *relocs)
+{
+ /* Update the got entry reference counts for the section being removed. */
+ Elf_Internal_Shdr *symtab_hdr;
+ struct elf_link_hash_entry **sym_hashes;
+ bfd_signed_vma *local_got_refcounts;
+ const Elf_Internal_Rela *rel, *relend;
+
+ elf_section_data (sec)->local_dynrel = NULL;
+
+ symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
+ sym_hashes = elf_sym_hashes (abfd);
+ local_got_refcounts = elf_local_got_refcounts (abfd);
+
+ relend = relocs + sec->reloc_count;
+ for (rel = relocs; rel < relend; rel++)
+ {
+ unsigned long r_symndx;
+ struct elf_link_hash_entry *h = NULL;
+
+ r_symndx = ELF32_R_SYM (rel->r_info);
+ if (r_symndx >= symtab_hdr->sh_info)
+ {
+ /* External symbol. */
+ h = sym_hashes[r_symndx - symtab_hdr->sh_info];
+ while (h->root.type == bfd_link_hash_indirect
+ || h->root.type == bfd_link_hash_warning)
+ h = (struct elf_link_hash_entry *) h->root.u.i.link;
+ }
+
+ switch (ELF32_R_TYPE (rel->r_info))
+ {
+ case R_NDS32_GOT_HI20:
+ case R_NDS32_GOT_LO12:
+ case R_NDS32_GOT_LO15:
+ case R_NDS32_GOT_LO19:
+ case R_NDS32_GOT17S2_RELA:
+ case R_NDS32_GOT15S2_RELA:
+ case R_NDS32_GOTOFF:
+ case R_NDS32_GOTOFF_HI20:
+ case R_NDS32_GOTOFF_LO12:
+ case R_NDS32_GOTOFF_LO15:
+ case R_NDS32_GOTOFF_LO19:
+ case R_NDS32_GOT20:
+ case R_NDS32_GOTPC_HI20:
+ case R_NDS32_GOTPC_LO12:
+ case R_NDS32_GOTPC20:
+ if (h != NULL)
+ {
+ if (h->got.refcount > 0)
+ h->got.refcount--;
+ }
+ else
+ {
+ if (local_got_refcounts && local_got_refcounts[r_symndx] > 0)
+ local_got_refcounts[r_symndx]--;
+ }
+ break;
+
+ case R_NDS32_16_RELA:
+ case R_NDS32_20_RELA:
+ case R_NDS32_5_RELA:
+ case R_NDS32_32_RELA:
+ case R_NDS32_HI20_RELA:
+ case R_NDS32_LO12S3_RELA:
+ case R_NDS32_LO12S2_RELA:
+ case R_NDS32_LO12S2_DP_RELA:
+ case R_NDS32_LO12S2_SP_RELA:
+ case R_NDS32_LO12S1_RELA:
+ case R_NDS32_LO12S0_RELA:
+ case R_NDS32_LO12S0_ORI_RELA:
+ case R_NDS32_SDA16S3_RELA:
+ case R_NDS32_SDA17S2_RELA:
+ case R_NDS32_SDA18S1_RELA:
+ case R_NDS32_SDA19S0_RELA:
+ case R_NDS32_SDA15S3_RELA:
+ case R_NDS32_SDA15S2_RELA:
+ case R_NDS32_SDA12S2_DP_RELA:
+ case R_NDS32_SDA12S2_SP_RELA:
+ case R_NDS32_SDA15S1_RELA:
+ case R_NDS32_SDA15S0_RELA:
+ case R_NDS32_SDA_FP7U2_RELA:
+ case R_NDS32_15_PCREL_RELA:
+ case R_NDS32_17_PCREL_RELA:
+ case R_NDS32_25_PCREL_RELA:
+ if (h != NULL)
+ {
+ struct elf_nds32_link_hash_entry *eh;
+ struct elf_nds32_dyn_relocs **pp;
+ struct elf_nds32_dyn_relocs *p;
+
+ if (!info->shared && h->plt.refcount > 0)
+ h->plt.refcount -= 1;
+
+ eh = (struct elf_nds32_link_hash_entry *) h;
+
+ for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
+ if (p->sec == sec)
+ {
+ if (ELF32_R_TYPE (rel->r_info) == R_NDS32_15_PCREL_RELA
+ || ELF32_R_TYPE (rel->r_info) == R_NDS32_17_PCREL_RELA
+ || ELF32_R_TYPE (rel->r_info) == R_NDS32_25_PCREL_RELA)
+ p->pc_count -= 1;
+ p->count -= 1;
+ if (p->count == 0)
+ *pp = p->next;
+ break;
+ }
+ }
+ break;
+
+ case R_NDS32_9_PLTREL:
+ case R_NDS32_25_PLTREL:
+ if (h != NULL)
+ {
+ if (h->plt.refcount > 0)
+ h->plt.refcount--;
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ return TRUE;
+}
+
+static enum elf_nds32_tls_type
+get_tls_type (enum elf_nds32_reloc_type r_type,
+ struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
+{
+ enum elf_nds32_tls_type tls_type;
+ switch (r_type)
+ {
+ case R_NDS32_TLS_LE_HI20:
+ case R_NDS32_TLS_LE_LO12:
+ tls_type = GOT_TLS_LE;
+ break;
+ case R_NDS32_TLS_IE_HI20:
+ case R_NDS32_TLS_IE_LO12S2:
+ case R_NDS32_TLS_IE_LO12:
+ tls_type = GOT_TLS_IE;
+ break;
+ case R_NDS32_TLS_IEGP_HI20:
+ case R_NDS32_TLS_IEGP_LO12:
+ case R_NDS32_TLS_IEGP_LO12S2:
+ tls_type = GOT_TLS_IEGP;
+ break;
+ case R_NDS32_TLS_DESC_HI20:
+ case R_NDS32_TLS_DESC_LO12:
+ case R_NDS32_TLS_DESC_ADD:
+ case R_NDS32_TLS_DESC_FUNC:
+ case R_NDS32_TLS_DESC_CALL:
+ tls_type = GOT_TLS_DESC;
+ break;
+ default:
+ tls_type = GOT_NORMAL;
+ break;
+ }
+ return tls_type;
+}
+
+/* Ensure that we have allocated bookkeeping structures for ABFD's local
+ symbols. */
+
+static bfd_boolean
+elf32_nds32_allocate_local_sym_info (bfd *abfd)
+{
+ if (elf_local_got_refcounts (abfd) == NULL)
+ {
+ bfd_size_type num_syms;
+ bfd_size_type size;
+ char *data;
+
+ num_syms = elf_tdata (abfd)->symtab_hdr.sh_info;
+ /* This space is for got_refcounts, got_tls_type, tlsdesc_gotent, and
+ gp_offset. The details can refer to struct elf_nds32_obj_tdata. */
+ size = num_syms * (sizeof (bfd_signed_vma) + sizeof (char)
+ + sizeof (bfd_vma) + sizeof (int)
+ + sizeof (bfd_boolean) + sizeof (bfd_vma));
+ data = bfd_zalloc (abfd, size);
+ if (data == NULL)
+ return FALSE;
+
+ elf_local_got_refcounts (abfd) = (bfd_signed_vma *) data;
+ data += num_syms * sizeof (bfd_signed_vma);
+
+ elf32_nds32_local_got_tls_type (abfd) = (char *) data;
+ data += num_syms * sizeof (char);
+
+ elf32_nds32_local_tlsdesc_gotent (abfd) = (bfd_vma *) data;
+ data += num_syms * sizeof (bfd_vma);
+
+ elf32_nds32_local_gp_offset (abfd) = (int *) data;
+ data += num_syms * sizeof (int);
+ }
+
+ return TRUE;
+}
+
+/* Look through the relocs for a section during the first phase.
+ Since we don't do .gots or .plts, we just need to consider the
+ virtual table relocs for gc. */
+
+static bfd_boolean
+nds32_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
+ asection *sec, const Elf_Internal_Rela *relocs)
+{
+ Elf_Internal_Shdr *symtab_hdr;
+ struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
+ const Elf_Internal_Rela *rel;
+ const Elf_Internal_Rela *rel_end;
+ struct elf_link_hash_table *ehtab;
+ struct elf_nds32_link_hash_table *htab;
+ bfd *dynobj;
+ asection *sreloc = NULL;
+
+ /* No need for relocation if relocatable already. */
+ if (info->relocatable)
+ {
+ elf32_nds32_check_relax_group (abfd, sec);
+ return TRUE;
+ }
+
+ symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
+ sym_hashes = elf_sym_hashes (abfd);
+ sym_hashes_end =
+ sym_hashes + symtab_hdr->sh_size / sizeof (Elf32_External_Sym);
+ if (!elf_bad_symtab (abfd))
+ sym_hashes_end -= symtab_hdr->sh_info;
+
+ ehtab = elf_hash_table (info);
+ htab = nds32_elf_hash_table (info);
+ dynobj = htab->root.dynobj;
+
+ rel_end = relocs + sec->reloc_count;
+ for (rel = relocs; rel < rel_end; rel++)
+ {
+ enum elf_nds32_reloc_type r_type;
+ struct elf_link_hash_entry *h;
+ unsigned long r_symndx;
+ enum elf_nds32_tls_type tls_type, old_tls_type;
+ struct elf_nds32_ict_hash_entry *entry;
+
+ r_symndx = ELF32_R_SYM (rel->r_info);
+ r_type = ELF32_R_TYPE (rel->r_info);
+ if (r_symndx < symtab_hdr->sh_info)
+ h = NULL;
+ else
+ {
+ h = sym_hashes[r_symndx - symtab_hdr->sh_info];
+ while (h->root.type == bfd_link_hash_indirect
+ || h->root.type == bfd_link_hash_warning)
+ h = (struct elf_link_hash_entry *) h->root.u.i.link;
+ }
+
+ /* create .got section if necessary
+ Some relocs require a global offset table. We create
+ got section here, since these relocation need a got section
+ and if it is not created yet. */
+ if (ehtab->sgot == NULL)
+ {
+ switch (r_type)
+ {
+ case R_NDS32_GOT_HI20:
+ case R_NDS32_GOT_LO12:
+ case R_NDS32_GOT_LO15:
+ case R_NDS32_GOT_LO19:
+ case R_NDS32_GOT17S2_RELA:
+ case R_NDS32_GOT15S2_RELA:
+ case R_NDS32_GOTOFF:
+ case R_NDS32_GOTOFF_HI20:
+ case R_NDS32_GOTOFF_LO12:
+ case R_NDS32_GOTOFF_LO15:
+ case R_NDS32_GOTOFF_LO19:
+ case R_NDS32_GOTPC20:
+ case R_NDS32_GOTPC_HI20:
+ case R_NDS32_GOTPC_LO12:
+ case R_NDS32_GOT20:
+ case R_NDS32_TLS_IE_HI20:
+ case R_NDS32_TLS_IE_LO12:
+ case R_NDS32_TLS_IE_LO12S2:
+ case R_NDS32_TLS_IEGP_HI20:
+ case R_NDS32_TLS_IEGP_LO12:
+ case R_NDS32_TLS_IEGP_LO12S2:
+ case R_NDS32_TLS_DESC_HI20:
+ case R_NDS32_TLS_DESC_LO12:
+ if (dynobj == NULL)
+ htab->root.dynobj = dynobj = abfd;
+ if (!create_got_section (dynobj, info))
+ return FALSE;
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ /* Check relocation type. */
+ switch ((int) r_type)
+ {
+ case R_NDS32_TLS_LE_HI20:
+ case R_NDS32_TLS_LE_LO12:
+ case R_NDS32_GOT_HI20:
+ case R_NDS32_GOT_LO12:
+ case R_NDS32_GOT_LO15:
+ case R_NDS32_GOT_LO19:
+ case R_NDS32_GOT20:
+ case R_NDS32_TLS_IE_HI20:
+ case R_NDS32_TLS_IE_LO12:
+ case R_NDS32_TLS_IE_LO12S2:
+ case R_NDS32_TLS_IEGP_HI20:
+ case R_NDS32_TLS_IEGP_LO12:
+ case R_NDS32_TLS_IEGP_LO12S2:
+ case R_NDS32_TLS_DESC_HI20:
+ case R_NDS32_TLS_DESC_LO12:
+ tls_type = get_tls_type (r_type, h);
+ if (h)
+ {
+ if (tls_type != GOT_TLS_LE)
+ h->got.refcount += 1;
+ old_tls_type = elf32_nds32_hash_entry (h)->tls_type;
+ }
+ else
+ {
+ /* This is a global offset table entry for a local symbol. */
+ if (!elf32_nds32_allocate_local_sym_info (abfd))
+ return FALSE;
+
+ BFD_ASSERT (r_symndx < symtab_hdr->sh_info);
+ if (tls_type != GOT_TLS_LE)
+ elf_local_got_refcounts (abfd)[r_symndx] += 1;
+ old_tls_type = elf32_nds32_local_got_tls_type (abfd)[r_symndx];
+ }
+
+ /* We would already issued an error message if there
+ is a TLS/non-TLS mismatch, based on the symbol
+ type. So just combine any TLS types needed. */
+ if (old_tls_type != GOT_UNKNOWN && old_tls_type != GOT_NORMAL
+ && tls_type != GOT_NORMAL)
+ tls_type |= old_tls_type;
+
+ /* DESC to IE/IEGP if link to executable */
+ if ((tls_type & GOT_TLS_DESC) && (info->executable))
+ tls_type |= (info->pie ? GOT_TLS_IEGP : GOT_TLS_IE);
+
+ if (old_tls_type != tls_type)
+ {
+ if (h != NULL)
+ elf32_nds32_hash_entry (h)->tls_type = tls_type;
+ else
+ elf32_nds32_local_got_tls_type (abfd)[r_symndx] = tls_type;
+ }
+ break;
+
+ case R_NDS32_9_PLTREL:
+ case R_NDS32_25_PLTREL:
+ case R_NDS32_PLTREL_HI20:
+ case R_NDS32_PLTREL_LO12:
+ case R_NDS32_PLT_GOTREL_HI20:
+ case R_NDS32_PLT_GOTREL_LO12:
+ case R_NDS32_PLT_GOTREL_LO15:
+ case R_NDS32_PLT_GOTREL_LO19:
+ case R_NDS32_PLT_GOTREL_LO20:
+ /* This symbol requires a procedure linkage table entry.
+ We actually build the entry in adjust_dynamic_symbol,
+ because this might be a case of linking PIC code without
+ linking in any dynamic objects, in which case we don't
+ need to generate a procedure linkage table after all. */
+
+ /* If this is a local symbol, we resolve it directly without
+ creating a procedure linkage table entry. */
+ /* explain: continue v.s. break here following: */
+ if (h == NULL)
+ continue;
+
+ if (h->forced_local
+ || (info->pie && h->def_regular))
+ break;
+
+ elf32_nds32_hash_entry (h)->tls_type = GOT_NORMAL;
+ h->needs_plt = 1;
+ h->plt.refcount += 1;
+ break;
+
+ case R_NDS32_16_RELA:
+ case R_NDS32_20_RELA:
+ case R_NDS32_5_RELA:
+ case R_NDS32_32_RELA:
+ case R_NDS32_HI20_RELA:
+ case R_NDS32_LO12S3_RELA:
+ case R_NDS32_LO12S2_RELA:
+ case R_NDS32_LO12S2_DP_RELA:
+ case R_NDS32_LO12S2_SP_RELA:
+ case R_NDS32_LO12S1_RELA:
+ case R_NDS32_LO12S0_RELA:
+ case R_NDS32_LO12S0_ORI_RELA:
+ case R_NDS32_SDA16S3_RELA:
+ case R_NDS32_SDA17S2_RELA:
+ case R_NDS32_SDA18S1_RELA:
+ case R_NDS32_SDA19S0_RELA:
+ case R_NDS32_SDA15S3_RELA:
+ case R_NDS32_SDA15S2_RELA:
+ case R_NDS32_SDA12S2_DP_RELA:
+ case R_NDS32_SDA12S2_SP_RELA:
+ case R_NDS32_SDA15S1_RELA:
+ case R_NDS32_SDA15S0_RELA:
+ case R_NDS32_SDA_FP7U2_RELA:
+ case R_NDS32_15_PCREL_RELA:
+ case R_NDS32_17_PCREL_RELA:
+ case R_NDS32_25_PCREL_RELA:
+
+ if (h != NULL && !info->shared)
+ {
+ h->non_got_ref = 1;
+ h->plt.refcount += 1;
+ }
+
+ /* If we are creating a shared library, and this is a reloc against
+ a global symbol, or a non PC relative reloc against a local
+ symbol, then we need to copy the reloc into the shared library.
+ However, if we are linking with -Bsymbolic, we do not need to
+ copy a reloc against a global symbol which is defined in an
+ object we are including in the link (i.e., DEF_REGULAR is set).
+ At this point we have not seen all the input files, so it is
+ possible that DEF_REGULAR is not set now but will be set later
+ (it is never cleared). We account for that possibility below by
+ storing information in the dyn_relocs field of the hash table
+ entry. A similar situation occurs when creating shared libraries
+ and symbol visibility changes render the symbol local.
+
+ If on the other hand, we are creating an executable, we may need
+ to keep relocations for symbols satisfied by a dynamic library
+ if we manage to avoid copy relocs for the symbol. */
+ if ((info->shared
+ && (sec->flags & SEC_ALLOC) != 0
+ && ((r_type != R_NDS32_25_PCREL_RELA
+ && r_type != R_NDS32_15_PCREL_RELA
+ && r_type != R_NDS32_17_PCREL_RELA
+ && !(r_type == R_NDS32_32_RELA
+ && strcmp (sec->name, ".eh_frame") == 0))
+ || (h != NULL
+ && (!info->symbolic
+ || h->root.type == bfd_link_hash_defweak
+ || !h->def_regular))))
+ || (!info->shared
+ && (sec->flags & SEC_ALLOC) != 0
+ && h != NULL
+ && (h->root.type == bfd_link_hash_defweak
+ || !h->def_regular)))
+ {
+ struct elf_nds32_dyn_relocs *p;
+ struct elf_nds32_dyn_relocs **head;
+
+ if (dynobj == NULL)
+ htab->root.dynobj = dynobj = abfd;
+
+ /* When creating a shared object, we must copy these
+ relocs into the output file. We create a reloc
+ section in dynobj and make room for the reloc. */
+ if (sreloc == NULL)
+ {
+ const char *name;
+
+ name = bfd_elf_string_from_elf_section
+ (abfd, elf_elfheader (abfd)->e_shstrndx,
+ elf_section_data (sec)->rela.hdr->sh_name);
+ if (name == NULL)
+ return FALSE;
+
+ BFD_ASSERT (strncmp (name, ".rela", 5) == 0
+ && strcmp (bfd_get_section_name (abfd, sec),
+ name + 5) == 0);
+
+ sreloc = bfd_get_section_by_name (dynobj, name);
+ if (sreloc == NULL)
+ {
+ flagword flags;
+
+ sreloc = bfd_make_section (dynobj, name);
+ flags = (SEC_HAS_CONTENTS | SEC_READONLY
+ | SEC_IN_MEMORY | SEC_LINKER_CREATED);
+ if ((sec->flags & SEC_ALLOC) != 0)
+ flags |= SEC_ALLOC | SEC_LOAD;
+ if (sreloc == NULL
+ || !bfd_set_section_flags (dynobj, sreloc, flags)
+ || !bfd_set_section_alignment (dynobj, sreloc, 2))
+ return FALSE;
+
+ elf_section_type (sreloc) = SHT_RELA;
+ }
+ elf_section_data (sec)->sreloc = sreloc;
+ }
+
+ /* If this is a global symbol, we count the number of
+ relocations we need for this symbol. */
+ if (h != NULL)
+ head = &((struct elf_nds32_link_hash_entry *) h)->dyn_relocs;
+ else
+ {
+ asection *s;
+
+ Elf_Internal_Sym *isym;
+ isym = bfd_sym_from_r_symndx (&htab->sym_cache, abfd, r_symndx);
+ if (isym == NULL)
+ return FALSE;
+
+ /* Track dynamic relocs needed for local syms too. */
+ s = bfd_section_from_elf_index (abfd, isym->st_shndx);
+ if (s == NULL)
+ return FALSE;
+
+ head = ((struct elf_nds32_dyn_relocs **)
+ &elf_section_data (s)->local_dynrel);
+ }
+
+ p = *head;
+ if (p == NULL || p->sec != sec)
+ {
+ bfd_size_type amt = sizeof (*p);
+ p = (struct elf_nds32_dyn_relocs *) bfd_alloc (dynobj, amt);
+ if (p == NULL)
+ return FALSE;
+ p->next = *head;
+ *head = p;
+ p->sec = sec;
+ p->count = 0;
+ p->pc_count = 0;
+ }
+
+ p->count += 1;
+ if (ELF32_R_TYPE (rel->r_info) == R_NDS32_25_PCREL_RELA
+ || ELF32_R_TYPE (rel->r_info) == R_NDS32_15_PCREL_RELA
+ || ELF32_R_TYPE (rel->r_info) == R_NDS32_17_PCREL_RELA)
+ p->pc_count += 1;
+ }
+ break;
+
+ /* Merge jump-patch table symbol here. */
+ case R_NDS32_ICT_HI20:
+ case R_NDS32_ICT_LO12:
+ case R_NDS32_ICT_25PC:
+ if (rel->r_addend != 0)
+ {
+ (*_bfd_error_handler)
+ (_("%B %s: Error: Rom-patch relocation offset: 0x%lx "
+ "with addend 0x%lx\n"),
+ abfd, sec->name, rel->r_offset, rel->r_addend);
+ bfd_set_error (bfd_error_bad_value);
+ return FALSE;
+ }
+
+ if (h)
+ {
+ elf32_nds32_hash_entry (h)->indirect_call = TRUE;
+ entry = (struct elf_nds32_ict_hash_entry *)
+ bfd_hash_lookup (&indirect_call_table, h->root.root.string,
+ TRUE, TRUE);
+ entry->h = h;
+ if (entry == NULL)
+ {
+ (*_bfd_error_handler)
+ (_("%B: failed creating indirect call %s hash table\n"),
+ abfd, h->root.root.string);
+ bfd_set_error (bfd_error_bad_value);
+ return FALSE;
+ }
+ }
+ else
+ {
+ /* Rom-patch functions cannot be local. */
+ (*_bfd_error_handler)
+ (_("%B: indirect call relocation with local symbol.\n"), abfd);
+ bfd_set_error (bfd_error_bad_value);
+ return FALSE;
+ }
+ break;
+
+ /* This relocation describes the C++ object vtable hierarchy.
+ Reconstruct it for later use during GC. */
+ case R_NDS32_RELA_GNU_VTINHERIT:
+ case R_NDS32_GNU_VTINHERIT:
+ if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
+ return FALSE;
+ break;
+
+ /* This relocation describes which C++ vtable entries are actually
+ used. Record for later use during GC. */
+ case R_NDS32_GNU_VTENTRY:
+ if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
+ return FALSE;
+ break;
+ case R_NDS32_RELA_GNU_VTENTRY:
+ if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
+ return FALSE;
+ break;
+ }
+ }
+
+ return TRUE;
+}
+
+/* Write VAL in uleb128 format to P, returning a pointer to the
+ following byte.
+ This code is copied from elf-attr.c. */
+
+static bfd_byte *
+write_uleb128 (bfd_byte *p, unsigned int val)
+{
+ bfd_byte c;
+ do
+ {
+ c = val & 0x7f;
+ val >>= 7;
+ if (val)
+ c |= 0x80;
+ *(p++) = c;
+ }
+ while (val);
+ return p;
+}
+
+static bfd_signed_vma
+calculate_offset (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
+ Elf_Internal_Sym *isymbuf, Elf_Internal_Shdr *symtab_hdr)
+{
+ bfd_signed_vma foff;
+ bfd_vma symval, addend;
+ asection *sym_sec;
+
+ /* Get the value of the symbol referred to by the reloc. */
+ if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
+ {
+ Elf_Internal_Sym *isym;
+
+ /* A local symbol. */
+ isym = isymbuf + ELF32_R_SYM (irel->r_info);
+
+ if (isym->st_shndx == SHN_UNDEF)
+ sym_sec = bfd_und_section_ptr;
+ else if (isym->st_shndx == SHN_ABS)
+ sym_sec = bfd_abs_section_ptr;
+ else if (isym->st_shndx == SHN_COMMON)
+ sym_sec = bfd_com_section_ptr;
+ else
+ sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
+ symval = isym->st_value + sym_sec->output_section->vma
+ + sym_sec->output_offset;
+ }
+ else
+ {
+ unsigned long indx;
+ struct elf_link_hash_entry *h;
+
+ /* An external symbol. */
+ indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
+ h = elf_sym_hashes (abfd)[indx];
+ BFD_ASSERT (h != NULL);
+
+ if (h->root.type != bfd_link_hash_defined
+ && h->root.type != bfd_link_hash_defweak)
+ /* This appears to be a reference to an undefined
+ symbol. Just ignore it--it will be caught by the
+ regular reloc processing. */
+ return 0;
+
+ if (h->root.u.def.section->flags & SEC_MERGE)
+ {
+ sym_sec = h->root.u.def.section;
+ symval = _bfd_merged_section_offset (abfd, &sym_sec,
+ elf_section_data (sym_sec)->sec_info,
+ h->root.u.def.value);
+ symval = symval + sym_sec->output_section->vma
+ + sym_sec->output_offset;
+ }
+ else
+ symval = (h->root.u.def.value
+ + h->root.u.def.section->output_section->vma
+ + h->root.u.def.section->output_offset);
+ }
+
+ addend = irel->r_addend;
+
+ foff = (symval + addend
+ - (irel->r_offset + sec->output_section->vma + sec->output_offset));
+ return foff;
+}
+
+static bfd_vma
+calculate_plt_memory_address (bfd *abfd, struct bfd_link_info *link_info,
+ Elf_Internal_Sym *isymbuf,
+ Elf_Internal_Rela *irel,
+ Elf_Internal_Shdr *symtab_hdr)
+{
+ bfd_vma symval;
+
+ if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
+ {
+ Elf_Internal_Sym *isym;
+ asection *sym_sec;
+ /* A local symbol. */
+ isym = isymbuf + ELF32_R_SYM (irel->r_info);
+
+ if (isym->st_shndx == SHN_UNDEF)
+ sym_sec = bfd_und_section_ptr;
+ else if (isym->st_shndx == SHN_ABS)
+ sym_sec = bfd_abs_section_ptr;
+ else if (isym->st_shndx == SHN_COMMON)
+ sym_sec = bfd_com_section_ptr;
+ else
+ sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
+ symval = isym->st_value + sym_sec->output_section->vma
+ + sym_sec->output_offset;
+ }
+ else
+ {
+ unsigned long indx;
+ struct elf_link_hash_entry *h;
+ struct elf_link_hash_table *ehtab;
+ asection *splt;
+
+ /* An external symbol. */
+ indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
+ h = elf_sym_hashes (abfd)[indx];
+ BFD_ASSERT (h != NULL);
+ ehtab = elf_hash_table (link_info);
+ splt = ehtab->splt;
+
+ while (h->root.type == bfd_link_hash_indirect
+ || h->root.type == bfd_link_hash_warning)
+ h = (struct elf_link_hash_entry *) h->root.u.i.link;
+
+ if (h->plt.offset == (bfd_vma) - 1)
+ {
+ if (h->root.type != bfd_link_hash_defined
+ && h->root.type != bfd_link_hash_defweak)
+ /* This appears to be a reference to an undefined
+ symbol. Just ignore it--it will be caught by the
+ regular reloc processing. */
+ return 0;
+ symval = (h->root.u.def.value
+ + h->root.u.def.section->output_section->vma
+ + h->root.u.def.section->output_offset);
+ }
+ else
+ symval = splt->output_section->vma + h->plt.offset;
+ }
+
+ return symval;
+}
+
+static bfd_signed_vma
+calculate_plt_offset (bfd *abfd, asection *sec, struct bfd_link_info *link_info,
+ Elf_Internal_Sym *isymbuf, Elf_Internal_Rela *irel,
+ Elf_Internal_Shdr *symtab_hdr)
+{
+ bfd_vma foff;
+ if ((foff = calculate_plt_memory_address (abfd, link_info, isymbuf, irel,
+ symtab_hdr)) == 0)
+ return 0;
+ else
+ return foff - (irel->r_offset
+ + sec->output_section->vma + sec->output_offset);
+}
+
+/* Convert a 32-bit instruction to 16-bit one.
+ INSN is the input 32-bit instruction, INSN16 is the output 16-bit
+ instruction. If INSN_TYPE is not NULL, it the CGEN instruction
+ type of INSN16. Return 1 if successful. */
+
+static int
+nds32_convert_32_to_16_alu1 (bfd *abfd, uint32_t insn, uint16_t *pinsn16,
+ int *pinsn_type)
+{
+ uint16_t insn16 = 0;
+ int insn_type;
+ unsigned long mach = bfd_get_mach (abfd);
+
+ if (N32_SH5 (insn) != 0)
+ return 0;
+
+ switch (N32_SUB5 (insn))
+ {
+ case N32_ALU1_ADD_SLLI:
+ case N32_ALU1_ADD_SRLI:
+ if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_IS_RB3 (insn))
+ {
+ insn16 = N16_TYPE333 (ADD333, N32_RT5 (insn), N32_RA5 (insn),
+ N32_RB5 (insn));
+ insn_type = NDS32_INSN_ADD333;
+ }
+ else if (N32_IS_RT4 (insn))
+ {
+ if (N32_RT5 (insn) == N32_RA5 (insn))
+ insn16 = N16_TYPE45 (ADD45, N32_RT54 (insn), N32_RB5 (insn));
+ else if (N32_RT5 (insn) == N32_RB5 (insn))
+ insn16 = N16_TYPE45 (ADD45, N32_RT54 (insn), N32_RA5 (insn));
+ insn_type = NDS32_INSN_ADD45;
+ }
+ break;
+
+ case N32_ALU1_SUB_SLLI:
+ case N32_ALU1_SUB_SRLI:
+ if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_IS_RB3 (insn))
+ {
+ insn16 = N16_TYPE333 (SUB333, N32_RT5 (insn), N32_RA5 (insn),
+ N32_RB5 (insn));
+ insn_type = NDS32_INSN_SUB333;
+ }
+ else if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn))
+ {
+ insn16 = N16_TYPE45 (SUB45, N32_RT54 (insn), N32_RB5 (insn));
+ insn_type = NDS32_INSN_SUB45;
+ }
+ break;
+
+ case N32_ALU1_AND_SLLI:
+ case N32_ALU1_AND_SRLI:
+ /* and $rt, $rt, $rb -> and33 for v3, v3m. */
+ if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
+ && N32_IS_RB3 (insn))
+ {
+ if (N32_RT5 (insn) == N32_RA5 (insn))
+ insn16 = N16_MISC33 (AND33, N32_RT5 (insn), N32_RB5 (insn));
+ else if (N32_RT5 (insn) == N32_RB5 (insn))
+ insn16 = N16_MISC33 (AND33, N32_RT5 (insn), N32_RA5 (insn));
+ if (insn16)
+ insn_type = NDS32_INSN_AND33;
+ }
+ break;
+
+ case N32_ALU1_XOR_SLLI:
+ case N32_ALU1_XOR_SRLI:
+ /* xor $rt, $rt, $rb -> xor33 for v3, v3m. */
+ if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
+ && N32_IS_RB3 (insn))
+ {
+ if (N32_RT5 (insn) == N32_RA5 (insn))
+ insn16 = N16_MISC33 (XOR33, N32_RT5 (insn), N32_RB5 (insn));
+ else if (N32_RT5 (insn) == N32_RB5 (insn))
+ insn16 = N16_MISC33 (XOR33, N32_RT5 (insn), N32_RA5 (insn));
+ if (insn16)
+ insn_type = NDS32_INSN_XOR33;
+ }
+ break;
+
+ case N32_ALU1_OR_SLLI:
+ case N32_ALU1_OR_SRLI:
+ /* or $rt, $rt, $rb -> or33 for v3, v3m. */
+ if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
+ && N32_IS_RB3 (insn))
+ {
+ if (N32_RT5 (insn) == N32_RA5 (insn))
+ insn16 = N16_MISC33 (OR33, N32_RT5 (insn), N32_RB5 (insn));
+ else if (N32_RT5 (insn) == N32_RB5 (insn))
+ insn16 = N16_MISC33 (OR33, N32_RT5 (insn), N32_RA5 (insn));
+ if (insn16)
+ insn_type = NDS32_INSN_OR33;
+ }
+ break;
+ case N32_ALU1_NOR:
+ /* nor $rt, $ra, $ra -> not33 for v3, v3m. */
+ if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RB3 (insn)
+ && N32_RA5 (insn) == N32_RB5 (insn))
+ {
+ insn16 = N16_MISC33 (NOT33, N32_RT5 (insn), N32_RA5 (insn));
+ insn_type = NDS32_INSN_NOT33;
+ }
+ break;
+ case N32_ALU1_SRAI:
+ if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn))
+ {
+ insn16 = N16_TYPE45 (SRAI45, N32_RT54 (insn), N32_UB5 (insn));
+ insn_type = NDS32_INSN_SRAI45;
+ }
+ break;
+
+ case N32_ALU1_SRLI:
+ if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn))
+ {
+ insn16 = N16_TYPE45 (SRLI45, N32_RT54 (insn), N32_UB5 (insn));
+ insn_type = NDS32_INSN_SRLI45;
+ }
+ break;
+
+ case N32_ALU1_SLLI:
+ if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_UB5 (insn) < 8)
+ {
+ insn16 = N16_TYPE333 (SLLI333, N32_RT5 (insn), N32_RA5 (insn),
+ N32_UB5 (insn));
+ insn_type = NDS32_INSN_SLLI333;
+ }
+ break;
+
+ case N32_ALU1_ZEH:
+ if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn))
+ {
+ insn16 = N16_BFMI333 (ZEH33, N32_RT5 (insn), N32_RA5 (insn));
+ insn_type = NDS32_INSN_ZEH33;
+ }
+ break;
+
+ case N32_ALU1_SEB:
+ if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn))
+ {
+ insn16 = N16_BFMI333 (SEB33, N32_RT5 (insn), N32_RA5 (insn));
+ insn_type = NDS32_INSN_SEB33;
+ }
+ break;
+
+ case N32_ALU1_SEH:
+ if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn))
+ {
+ insn16 = N16_BFMI333 (SEH33, N32_RT5 (insn), N32_RA5 (insn));
+ insn_type = NDS32_INSN_SEH33;
+ }
+ break;
+
+ case N32_ALU1_SLT:
+ if (N32_RT5 (insn) == REG_R15 && N32_IS_RA4 (insn))
+ {
+ /* Implicit r15. */
+ insn16 = N16_TYPE45 (SLT45, N32_RA54 (insn), N32_RB5 (insn));
+ insn_type = NDS32_INSN_SLT45;
+ }
+ break;
+
+ case N32_ALU1_SLTS:
+ if (N32_RT5 (insn) == REG_R15 && N32_IS_RA4 (insn))
+ {
+ /* Implicit r15. */
+ insn16 = N16_TYPE45 (SLTS45, N32_RA54 (insn), N32_RB5 (insn));
+ insn_type = NDS32_INSN_SLTS45;
+ }
+ break;
+ }
+
+ if ((insn16 & 0x8000) == 0)
+ return 0;
+
+ if (pinsn16)
+ *pinsn16 = insn16;
+ if (pinsn_type)
+ *pinsn_type = insn_type;
+ return 1;
+}
+
+static int
+nds32_convert_32_to_16_alu2 (bfd *abfd, uint32_t insn, uint16_t *pinsn16,
+ int *pinsn_type)
+{
+ uint16_t insn16 = 0;
+ int insn_type;
+ unsigned long mach = bfd_get_mach (abfd);
+
+ /* TODO: bset, bclr, btgl, btst. */
+ if (__GF (insn, 6, 4) != 0)
+ return 0;
+
+ switch (N32_IMMU (insn, 6))
+ {
+ case N32_ALU2_MUL:
+ if (mach >= MACH_V3 && N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
+ && N32_IS_RB3 (insn))
+ {
+ if (N32_RT5 (insn) == N32_RA5 (insn))
+ insn16 = N16_MISC33 (MUL33, N32_RT5 (insn), N32_RB5 (insn));
+ else if (N32_RT5 (insn) == N32_RB5 (insn))
+ insn16 = N16_MISC33 (MUL33, N32_RT5 (insn), N32_RA5 (insn));
+ if (insn16)
+ insn_type = NDS32_INSN_MUL33;
+ }
+ }
+
+ if ((insn16 & 0x8000) == 0)
+ return 0;
+
+ if (pinsn16)
+ *pinsn16 = insn16;
+ if (pinsn_type)
+ *pinsn_type = insn_type;
+ return 1;
+}
+
+int
+nds32_convert_32_to_16 (bfd *abfd, uint32_t insn, uint16_t *pinsn16,
+ int *pinsn_type)
+{
+ int op6;
+ uint16_t insn16 = 0;
+ int insn_type;
+ unsigned long mach = bfd_get_mach (abfd);
+
+ /* Decode 32-bit instruction. */
+ if (insn & 0x80000000)
+ {
+ /* Not 32-bit insn. */
+ return 0;
+ }
+
+ op6 = N32_OP6 (insn);
+
+ /* Convert it to 16-bit instruction. */
+ switch (op6)
+ {
+ case N32_OP6_MOVI:
+ if (IS_WITHIN_S (N32_IMM20S (insn), 5))
+ {
+ insn16 = N16_TYPE55 (MOVI55, N32_RT5 (insn), N32_IMM20S (insn));
+ insn_type = NDS32_INSN_MOVI55;
+ }
+ else if (mach >= MACH_V3 && N32_IMM20S (insn) >= 16
+ && N32_IMM20S (insn) < 48 && N32_IS_RT4 (insn))
+ {
+ insn16 = N16_TYPE45 (MOVPI45, N32_RT54 (insn),
+ N32_IMM20S (insn) - 16);
+ insn_type = NDS32_INSN_MOVPI45;
+ }
+ break;
+
+ case N32_OP6_ADDI:
+ if (N32_IMM15S (insn) == 0)
+ {
+ /* Do not convert `addi $sp, $sp, 0' to `mov55 $sp, $sp',
+ because `mov55 $sp, $sp' is ifret16 in V3 ISA. */
+ if (mach <= MACH_V2
+ || N32_RT5 (insn) != REG_SP || N32_RA5 (insn) != REG_SP)
+ {
+ insn16 = N16_TYPE55 (MOV55, N32_RT5 (insn), N32_RA5 (insn));
+ insn_type = NDS32_INSN_MOV55;
+ }
+ }
+ else if (N32_IMM15S (insn) > 0)
+ {
+ if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_IMM15S (insn) < 8)
+ {
+ insn16 = N16_TYPE333 (ADDI333, N32_RT5 (insn), N32_RA5 (insn),
+ N32_IMM15S (insn));
+ insn_type = NDS32_INSN_ADDI333;
+ }
+ else if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn)
+ && N32_IMM15S (insn) < 32)
+ {
+ insn16 = N16_TYPE45 (ADDI45, N32_RT54 (insn), N32_IMM15S (insn));
+ insn_type = NDS32_INSN_ADDI45;
+ }
+ else if (mach >= MACH_V2 && N32_RT5 (insn) == REG_SP
+ && N32_RT5 (insn) == N32_RA5 (insn)
+ && N32_IMM15S (insn) < 512)
+ {
+ insn16 = N16_TYPE10 (ADDI10S, N32_IMM15S (insn));
+ insn_type = NDS32_INSN_ADDI10_SP;
+ }
+ else if (mach >= MACH_V3 && N32_IS_RT3 (insn)
+ && N32_RA5 (insn) == REG_SP && N32_IMM15S (insn) < 256
+ && (N32_IMM15S (insn) % 4 == 0))
+ {
+ insn16 = N16_TYPE36 (ADDRI36_SP, N32_RT5 (insn),
+ N32_IMM15S (insn) >> 2);
+ insn_type = NDS32_INSN_ADDRI36_SP;
+ }
+ }
+ else
+ {
+ /* Less than 0. */
+ if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn) && N32_IMM15S (insn) > -8)
+ {
+ insn16 = N16_TYPE333 (SUBI333, N32_RT5 (insn), N32_RA5 (insn),
+ 0 - N32_IMM15S (insn));
+ insn_type = NDS32_INSN_SUBI333;
+ }
+ else if (N32_IS_RT4 (insn) && N32_RT5 (insn) == N32_RA5 (insn)
+ && N32_IMM15S (insn) > -32)
+ {
+ insn16 = N16_TYPE45 (SUBI45, N32_RT54 (insn), 0 - N32_IMM15S (insn));
+ insn_type = NDS32_INSN_SUBI45;
+ }
+ else if (mach >= MACH_V2 && N32_RT5 (insn) == REG_SP
+ && N32_RT5 (insn) == N32_RA5 (insn)
+ && N32_IMM15S (insn) >= -512)
+ {
+ insn16 = N16_TYPE10 (ADDI10S, N32_IMM15S (insn));
+ insn_type = NDS32_INSN_ADDI10_SP;
+ }
+ }
+ break;
+
+ case N32_OP6_ORI:
+ if (N32_IMM15S (insn) == 0)
+ {
+ /* Do not convert `ori $sp, $sp, 0' to `mov55 $sp, $sp',
+ because `mov55 $sp, $sp' is ifret16 in V3 ISA. */
+ if (mach <= MACH_V2
+ || N32_RT5 (insn) != REG_SP || N32_RA5 (insn) != REG_SP)
+ {
+ insn16 = N16_TYPE55 (MOV55, N32_RT5 (insn), N32_RA5 (insn));
+ insn_type = NDS32_INSN_MOV55;
+ }
+ }
+ break;
+
+ case N32_OP6_SUBRI:
+ if (mach >= MACH_V3 && N32_IS_RT3 (insn)
+ && N32_IS_RA3 (insn) && N32_IMM15S (insn) == 0)
+ {
+ insn16 = N16_MISC33 (NEG33, N32_RT5 (insn), N32_RA5 (insn));
+ insn_type = NDS32_INSN_NEG33;
+ }
+ break;
+
+ case N32_OP6_ANDI:
+ if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn))
+ {
+ if (N32_IMM15U (insn) == 1)
+ {
+ insn16 = N16_BFMI333 (XLSB33, N32_RT5 (insn), N32_RA5 (insn));
+ insn_type = NDS32_INSN_XLSB33;
+ }
+ else if (N32_IMM15U (insn) == 0x7ff)
+ {
+ insn16 = N16_BFMI333 (X11B33, N32_RT5 (insn), N32_RA5 (insn));
+ insn_type = NDS32_INSN_X11B33;
+ }
+ else if (N32_IMM15U (insn) == 0xff)
+ {
+ insn16 = N16_BFMI333 (ZEB33, N32_RT5 (insn), N32_RA5 (insn));
+ insn_type = NDS32_INSN_ZEB33;
+ }
+ else if (mach >= MACH_V3 && N32_RT5 (insn) == N32_RA5 (insn)
+ && N32_IMM15U (insn) < 256)
+ {
+ int imm15u = N32_IMM15U (insn);
+
+ if (__builtin_popcount (imm15u) == 1)
+ {
+ /* BMSKI33 */
+ int imm3u = __builtin_ctz (imm15u);
+
+ insn16 = N16_BFMI333 (BMSKI33, N32_RT5 (insn), imm3u);
+ insn_type = NDS32_INSN_BMSKI33;
+ }
+ else if (imm15u != 0 && __builtin_popcount (imm15u + 1) == 1)
+ {
+ /* FEXTI33 */
+ int imm3u = __builtin_ctz (imm15u + 1) - 1;
+
+ insn16 = N16_BFMI333 (FEXTI33, N32_RT5 (insn), imm3u);
+ insn_type = NDS32_INSN_FEXTI33;
+ }
+ }
+ }
+ break;
+
+ case N32_OP6_SLTI:
+ if (N32_RT5 (insn) == REG_R15 && N32_IS_RA4 (insn)
+ && IS_WITHIN_U (N32_IMM15S (insn), 5))
+ {
+ insn16 = N16_TYPE45 (SLTI45, N32_RA54 (insn), N32_IMM15S (insn));
+ insn_type = NDS32_INSN_SLTI45;
+ }
+ break;
+
+ case N32_OP6_SLTSI:
+ if (N32_RT5 (insn) == REG_R15 && N32_IS_RA4 (insn)
+ && IS_WITHIN_U (N32_IMM15S (insn), 5))
+ {
+ insn16 = N16_TYPE45 (SLTSI45, N32_RA54 (insn), N32_IMM15S (insn));
+ insn_type = NDS32_INSN_SLTSI45;
+ }
+ break;
+
+ case N32_OP6_LWI:
+ if (N32_IS_RT4 (insn) && N32_IMM15S (insn) == 0)
+ {
+ insn16 = N16_TYPE45 (LWI450, N32_RT54 (insn), N32_RA5 (insn));
+ insn_type = NDS32_INSN_LWI450;
+ }
+ else if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
+ && IS_WITHIN_U (N32_IMM15S (insn), 3))
+ {
+ insn16 = N16_TYPE333 (LWI333, N32_RT5 (insn), N32_RA5 (insn),
+ N32_IMM15S (insn));
+ insn_type = NDS32_INSN_LWI333;
+ }
+ else if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_FP
+ && IS_WITHIN_U (N32_IMM15S (insn), 7))
+ {
+ insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 0, N32_IMM15S (insn));
+ insn_type = NDS32_INSN_LWI37;
+ }
+ else if (mach >= MACH_V2 && N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_SP
+ && IS_WITHIN_U (N32_IMM15S (insn), 7))
+ {
+ insn16 = N16_TYPE37 (XWI37SP, N32_RT5 (insn), 0, N32_IMM15S (insn));
+ insn_type = NDS32_INSN_LWI37_SP;
+ }
+ else if (mach >= MACH_V2 && N32_IS_RT4 (insn) && N32_RA5 (insn) == REG_R8
+ && -32 <= N32_IMM15S (insn) && N32_IMM15S (insn) < 0)
+ {
+ insn16 = N16_TYPE45 (LWI45_FE, N32_RT54 (insn),
+ N32_IMM15S (insn) + 32);
+ insn_type = NDS32_INSN_LWI45_FE;
+ }
+ break;
+
+ case N32_OP6_SWI:
+ if (N32_IS_RT4 (insn) && N32_IMM15S (insn) == 0)
+ {
+ insn16 = N16_TYPE45 (SWI450, N32_RT54 (insn), N32_RA5 (insn));
+ insn_type = NDS32_INSN_SWI450;
+ }
+ else if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
+ && IS_WITHIN_U (N32_IMM15S (insn), 3))
+ {
+ insn16 = N16_TYPE333 (SWI333, N32_RT5 (insn), N32_RA5 (insn),
+ N32_IMM15S (insn));
+ insn_type = NDS32_INSN_SWI333;
+ }
+ else if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_FP
+ && IS_WITHIN_U (N32_IMM15S (insn), 7))
+ {
+ insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 1, N32_IMM15S (insn));
+ insn_type = NDS32_INSN_SWI37;
+ }
+ else if (mach >= MACH_V2 && N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_SP
+ && IS_WITHIN_U (N32_IMM15S (insn), 7))
+ {
+ insn16 = N16_TYPE37 (XWI37SP, N32_RT5 (insn), 1, N32_IMM15S (insn));
+ insn_type = NDS32_INSN_SWI37_SP;
+ }
+ break;
+
+ case N32_OP6_LWI_BI:
+ if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
+ && IS_WITHIN_U (N32_IMM15S (insn), 3))
+ {
+ insn16 = N16_TYPE333 (LWI333_BI, N32_RT5 (insn), N32_RA5 (insn),
+ N32_IMM15S (insn));
+ insn_type = NDS32_INSN_LWI333_BI;
+ }
+ break;
+
+ case N32_OP6_SWI_BI:
+ if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
+ && IS_WITHIN_U (N32_IMM15S (insn), 3))
+ {
+ insn16 = N16_TYPE333 (SWI333_BI, N32_RT5 (insn), N32_RA5 (insn),
+ N32_IMM15S (insn));
+ insn_type = NDS32_INSN_SWI333_BI;
+ }
+ break;
+
+ case N32_OP6_LHI:
+ if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
+ && IS_WITHIN_U (N32_IMM15S (insn), 3))
+ {
+ insn16 = N16_TYPE333 (LHI333, N32_RT5 (insn), N32_RA5 (insn),
+ N32_IMM15S (insn));
+ insn_type = NDS32_INSN_LHI333;
+ }
+ break;
+
+ case N32_OP6_SHI:
+ if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
+ && IS_WITHIN_U (N32_IMM15S (insn), 3))
+ {
+ insn16 = N16_TYPE333 (SHI333, N32_RT5 (insn), N32_RA5 (insn),
+ N32_IMM15S (insn));
+ insn_type = NDS32_INSN_SHI333;
+ }
+ break;
+
+ case N32_OP6_LBI:
+ if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
+ && IS_WITHIN_U (N32_IMM15S (insn), 3))
+ {
+ insn16 = N16_TYPE333 (LBI333, N32_RT5 (insn), N32_RA5 (insn),
+ N32_IMM15S (insn));
+ insn_type = NDS32_INSN_LBI333;
+ }
+ break;
+
+ case N32_OP6_SBI:
+ if (N32_IS_RT3 (insn) && N32_IS_RA3 (insn)
+ && IS_WITHIN_U (N32_IMM15S (insn), 3))
+ {
+ insn16 = N16_TYPE333 (SBI333, N32_RT5 (insn), N32_RA5 (insn),
+ N32_IMM15S (insn));
+ insn_type = NDS32_INSN_SBI333;
+ }
+ break;
+
+ case N32_OP6_ALU1:
+ return nds32_convert_32_to_16_alu1 (abfd, insn, pinsn16, pinsn_type);
+
+ case N32_OP6_ALU2:
+ return nds32_convert_32_to_16_alu2 (abfd, insn, pinsn16, pinsn_type);
+
+ case N32_OP6_BR1:
+ if (!IS_WITHIN_S (N32_IMM14S (insn), 8))
+ goto done;
+
+ if ((insn & __BIT (14)) == 0)
+ {
+ /* N32_BR1_BEQ */
+ if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_R5
+ && N32_RT5 (insn) != REG_R5)
+ insn16 = N16_TYPE38 (BEQS38, N32_RT5 (insn), N32_IMM14S (insn));
+ else if (N32_IS_RA3 (insn) && N32_RT5 (insn) == REG_R5
+ && N32_RA5 (insn) != REG_R5)
+ insn16 = N16_TYPE38 (BEQS38, N32_RA5 (insn), N32_IMM14S (insn));
+ insn_type = NDS32_INSN_BEQS38;
+ break;
+ }
+ else
+ {
+ /* N32_BR1_BNE */
+ if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_R5
+ && N32_RT5 (insn) != REG_R5)
+ insn16 = N16_TYPE38 (BNES38, N32_RT5 (insn), N32_IMM14S (insn));
+ else if (N32_IS_RA3 (insn) && N32_RT5 (insn) == REG_R5
+ && N32_RA5 (insn) != REG_R5)
+ insn16 = N16_TYPE38 (BNES38, N32_RA5 (insn), N32_IMM14S (insn));
+ insn_type = NDS32_INSN_BNES38;
+ break;
+ }
+ break;
+
+ case N32_OP6_BR2:
+ switch (N32_BR2_SUB (insn))
+ {
+ case N32_BR2_BEQZ:
+ if (N32_IS_RT3 (insn) && IS_WITHIN_S (N32_IMM16S (insn), 8))
+ {
+ insn16 = N16_TYPE38 (BEQZ38, N32_RT5 (insn), N32_IMM16S (insn));
+ insn_type = NDS32_INSN_BEQZ38;
+ }
+ else if (N32_RT5 (insn) == REG_R15 && IS_WITHIN_S (N32_IMM16S (insn), 8))
+ {
+ insn16 = N16_TYPE8 (BEQZS8, N32_IMM16S (insn));
+ insn_type = NDS32_INSN_BEQZS8;
+ }
+ break;
+
+ case N32_BR2_BNEZ:
+ if (N32_IS_RT3 (insn) && IS_WITHIN_S (N32_IMM16S (insn), 8))
+ {
+ insn16 = N16_TYPE38 (BNEZ38, N32_RT5 (insn), N32_IMM16S (insn));
+ insn_type = NDS32_INSN_BNEZ38;
+ }
+ else if (N32_RT5 (insn) == REG_R15 && IS_WITHIN_S (N32_IMM16S (insn), 8))
+ {
+ insn16 = N16_TYPE8 (BNEZS8, N32_IMM16S (insn));
+ insn_type = NDS32_INSN_BNEZS8;
+ }
+ break;
+
+ case N32_BR2_SOP0:
+ if (__GF (insn, 20, 5) == 0 && IS_WITHIN_U (N32_IMM16S (insn), 9))
+ {
+ insn16 = N16_TYPE9 (IFCALL9, N32_IMM16S (insn));
+ insn_type = NDS32_INSN_IFCALL9;
+ }
+ break;
+ }
+ break;
+
+ case N32_OP6_JI:
+ if ((insn & __BIT (24)) == 0)
+ {
+ /* N32_JI_J */
+ if (IS_WITHIN_S (N32_IMM24S (insn), 8))
+ {
+ insn16 = N16_TYPE8 (J8, N32_IMM24S (insn));
+ insn_type = NDS32_INSN_J8;
+ }
+ }
+ break;
+
+ case N32_OP6_JREG:
+ if (__GF (insn, 8, 2) != 0)
+ goto done;
+
+ switch (N32_IMMU (insn, 5))
+ {
+ case N32_JREG_JR:
+ if (N32_JREG_HINT (insn) == 0)
+ {
+ /* jr */
+ insn16 = N16_TYPE5 (JR5, N32_RB5 (insn));
+ insn_type = NDS32_INSN_JR5;
+ }
+ else if (N32_JREG_HINT (insn) == 1)
+ {
+ /* ret */
+ insn16 = N16_TYPE5 (RET5, N32_RB5 (insn));
+ insn_type = NDS32_INSN_RET5;
+ }
+ else if (N32_JREG_HINT (insn) == 3)
+ {
+ /* ifret = mov55 $sp, $sp */
+ insn16 = N16_TYPE55 (MOV55, REG_SP, REG_SP);
+ insn_type = NDS32_INSN_IFRET;
+ }
+ break;
+
+ case N32_JREG_JRAL:
+ /* It's convertible when return rt5 is $lp and address
+ translation is kept. */
+ if (N32_RT5 (insn) == REG_LP && N32_JREG_HINT (insn) == 0)
+ {
+ insn16 = N16_TYPE5 (JRAL5, N32_RB5 (insn));
+ insn_type = NDS32_INSN_JRAL5;
+ }
+ break;
+ }
+ break;
+
+ case N32_OP6_MISC:
+ if (N32_SUB5 (insn) == N32_MISC_BREAK && N32_SWID (insn) < 32)
+ {
+ /* For v3, swid above 31 are used for ex9.it. */
+ insn16 = N16_TYPE5 (BREAK16, N32_SWID (insn));
+ insn_type = NDS32_INSN_BREAK16;
+ }
+ break;
+
+ default:
+ /* This instruction has no 16-bit variant. */
+ goto done;
+ }
+
+done:
+ /* Bit-15 of insn16 should be set for a valid instruction. */
+ if ((insn16 & 0x8000) == 0)
+ return 0;
+
+ if (pinsn16)
+ *pinsn16 = insn16;
+ if (pinsn_type)
+ *pinsn_type = insn_type;
+ return 1;
+}
+
+static int
+special_convert_32_to_16 (unsigned long insn, uint16_t *pinsn16,
+ Elf_Internal_Rela *reloc)
+{
+ uint16_t insn16 = 0;
+
+ if ((reloc->r_addend & R_NDS32_INSN16_FP7U2_FLAG) == 0
+ || (ELF32_R_TYPE (reloc->r_info) != R_NDS32_INSN16))
+ return 0;
+
+ if (!N32_IS_RT3 (insn))
+ return 0;
+
+ switch (N32_OP6 (insn))
+ {
+ case N32_OP6_LWI:
+ if (N32_RA5 (insn) == REG_GP && IS_WITHIN_U (N32_IMM15S (insn), 7))
+ insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 0, N32_IMM15S (insn));
+ break;
+ case N32_OP6_SWI:
+ if (N32_RA5 (insn) == REG_GP && IS_WITHIN_U (N32_IMM15S (insn), 7))
+ insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 1, N32_IMM15S (insn));
+ break;
+ case N32_OP6_HWGP:
+ if (!IS_WITHIN_U (N32_IMM17S (insn), 7))
+ break;
+
+ if (__GF (insn, 17, 3) == 6)
+ insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 0, N32_IMM17S (insn));
+ else if (__GF (insn, 17, 3) == 7)
+ insn16 = N16_TYPE37 (XWI37, N32_RT5 (insn), 1, N32_IMM17S (insn));
+ break;
+ }
+
+ if ((insn16 & 0x8000) == 0)
+ return 0;
+
+ *pinsn16 = insn16;
+ return 1;
+}
+
+/* Convert a 16-bit instruction to 32-bit one.
+ INSN16 it the input and PINSN it the point to output.
+ Return non-zero on successful. Otherwise 0 is returned. */
+
+int
+nds32_convert_16_to_32 (bfd *abfd, uint16_t insn16, uint32_t *pinsn)
+{
+ uint32_t insn = 0xffffffff;
+ unsigned long mach = bfd_get_mach (abfd);
+
+ /* NOTE: push25, pop25 and movd44 do not have 32-bit variants. */
+
+ switch (__GF (insn16, 9, 6))
+ {
+ case 0x4: /* add45 */
+ insn = N32_ALU1 (ADD, N16_RT4 (insn16), N16_RT4 (insn16), N16_RA5 (insn16));
+ goto done;
+ case 0x5: /* sub45 */
+ insn = N32_ALU1 (SUB, N16_RT4 (insn16), N16_RT4 (insn16), N16_RA5 (insn16));
+ goto done;
+ case 0x6: /* addi45 */
+ insn = N32_TYPE2 (ADDI, N16_RT4 (insn16), N16_RT4 (insn16), N16_IMM5U (insn16));
+ goto done;
+ case 0x7: /* subi45 */
+ insn = N32_TYPE2 (ADDI, N16_RT4 (insn16), N16_RT4 (insn16), -N16_IMM5U (insn16));
+ goto done;
+ case 0x8: /* srai45 */
+ insn = N32_ALU1 (SRAI, N16_RT4 (insn16), N16_RT4 (insn16), N16_IMM5U (insn16));
+ goto done;
+ case 0x9: /* srli45 */
+ insn = N32_ALU1 (SRLI, N16_RT4 (insn16), N16_RT4 (insn16), N16_IMM5U (insn16));
+ goto done;
+
+ case 0xa: /* slli333 */
+ insn = N32_ALU1 (SLLI, N16_RT3 (insn16), N16_RA3 (insn16), N16_IMM3U (insn16));
+ goto done;
+ case 0xc: /* add333 */
+ insn = N32_ALU1 (ADD, N16_RT3 (insn16), N16_RA3 (insn16), N16_RB3 (insn16));
+ goto done;
+ case 0xd: /* sub333 */
+ insn = N32_ALU1 (SUB, N16_RT3 (insn16), N16_RA3 (insn16), N16_RB3 (insn16));
+ goto done;
+ case 0xe: /* addi333 */
+ insn = N32_TYPE2 (ADDI, N16_RT3 (insn16), N16_RA3 (insn16), N16_IMM3U (insn16));
+ goto done;
+ case 0xf: /* subi333 */
+ insn = N32_TYPE2 (ADDI, N16_RT3 (insn16), N16_RA3 (insn16), -N16_IMM3U (insn16));
+ goto done;
+
+ case 0x10: /* lwi333 */
+ insn = N32_TYPE2 (LWI, N16_RT3 (insn16), N16_RA3 (insn16), N16_IMM3U (insn16));
+ goto done;
+ case 0x12: /* lhi333 */
+ insn = N32_TYPE2 (LHI, N16_RT3 (insn16), N16_RA3 (insn16), N16_IMM3U (insn16));
+ goto done;
+ case 0x13: /* lbi333 */
+ insn = N32_TYPE2 (LBI, N16_RT3 (insn16), N16_RA3 (insn16), N16_IMM3U (insn16));
+ goto done;
+ case 0x11: /* lwi333.bi */
+ insn = N32_TYPE2 (LWI_BI, N16_RT3 (insn16), N16_RA3 (insn16), N16_IMM3U (insn16));
+ goto done;
+ case 0x14: /* swi333 */
+ insn = N32_TYPE2 (SWI, N16_RT3 (insn16), N16_RA3 (insn16), N16_IMM3U (insn16));
+ goto done;
+ case 0x16: /* shi333 */
+ insn = N32_TYPE2 (SHI, N16_RT3 (insn16), N16_RA3 (insn16), N16_IMM3U (insn16));
+ goto done;
+ case 0x17: /* sbi333 */
+ insn = N32_TYPE2 (SBI, N16_RT3 (insn16), N16_RA3 (insn16), N16_IMM3U (insn16));
+ goto done;
+ case 0x15: /* swi333.bi */
+ insn = N32_TYPE2 (SWI_BI, N16_RT3 (insn16), N16_RA3 (insn16), N16_IMM3U (insn16));
+ goto done;
+
+ case 0x18: /* addri36.sp */
+ insn = N32_TYPE2 (ADDI, N16_RT3 (insn16), REG_SP, N16_IMM6U (insn16) << 2);
+ goto done;
+
+ case 0x19: /* lwi45.fe */
+ insn = N32_TYPE2 (LWI, N16_RT4 (insn16), REG_R8, (N16_IMM5U (insn16) - 32));
+ goto done;
+ case 0x1a: /* lwi450 */
+ insn = N32_TYPE2 (LWI, N16_RT4 (insn16), N16_RA5 (insn16), 0);
+ goto done;
+ case 0x1b: /* swi450 */
+ insn = N32_TYPE2 (SWI, N16_RT4 (insn16), N16_RA5 (insn16), 0);
+ goto done;
+
+ /* These are r15 implied instructions. */
+ case 0x30: /* slts45 */
+ insn = N32_ALU1 (SLTS, REG_TA, N16_RT4 (insn16), N16_RA5 (insn16));
+ goto done;
+ case 0x31: /* slt45 */
+ insn = N32_ALU1 (SLT, REG_TA, N16_RT4 (insn16), N16_RA5 (insn16));
+ goto done;
+ case 0x32: /* sltsi45 */
+ insn = N32_TYPE2 (SLTSI, REG_TA, N16_RT4 (insn16), N16_IMM5U (insn16));
+ goto done;
+ case 0x33: /* slti45 */
+ insn = N32_TYPE2 (SLTI, REG_TA, N16_RT4 (insn16), N16_IMM5U (insn16));
+ goto done;
+ case 0x34: /* beqzs8, bnezs8 */
+ if (insn16 & __BIT (8))
+ insn = N32_BR2 (BNEZ, REG_TA, N16_IMM8S (insn16));
+ else
+ insn = N32_BR2 (BEQZ, REG_TA, N16_IMM8S (insn16));
+ goto done;
+
+ case 0x35: /* break16, ex9.it */
+ /* Only consider range of v3 break16. */
+ insn = N32_TYPE0 (MISC, (N16_IMM5U (insn16) << 5) | N32_MISC_BREAK);
+ goto done;
+
+ case 0x3c: /* ifcall9 */
+ insn = N32_BR2 (SOP0, 0, N16_IMM9U (insn16));
+ goto done;
+ case 0x3d: /* movpi45 */
+ insn = N32_TYPE1 (MOVI, N16_RT4 (insn16), N16_IMM5U (insn16) + 16);
+ goto done;
+
+ case 0x3f: /* MISC33 */
+ switch (insn16 & 0x7)
+ {
+ case 2: /* neg33 */
+ insn = N32_TYPE2 (SUBRI, N16_RT3 (insn16), N16_RA3 (insn16), 0);
+ break;
+ case 3: /* not33 */
+ insn = N32_ALU1 (NOR, N16_RT3 (insn16), N16_RA3 (insn16), N16_RA3 (insn16));
+ break;
+ case 4: /* mul33 */
+ insn = N32_ALU2 (MUL, N16_RT3 (insn16), N16_RT3 (insn16), N16_RA3 (insn16));
+ break;
+ case 5: /* xor33 */
+ insn = N32_ALU1 (XOR, N16_RT3 (insn16), N16_RT3 (insn16), N16_RA3 (insn16));
+ break;
+ case 6: /* and33 */
+ insn = N32_ALU1 (AND, N16_RT3 (insn16), N16_RT3 (insn16), N16_RA3 (insn16));
+ break;
+ case 7: /* or33 */
+ insn = N32_ALU1 (OR, N16_RT3 (insn16), N16_RT3 (insn16), N16_RA3 (insn16));
+ break;
+ }
+ goto done;
+
+ case 0xb: /* ... */
+ switch (insn16 & 0x7)
+ {
+ case 0: /* zeb33 */
+ insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RA3 (insn16), 0xff);
+ break;
+ case 1: /* zeh33 */
+ insn = N32_ALU1 (ZEH, N16_RT3 (insn16), N16_RA3 (insn16), 0);
+ break;
+ case 2: /* seb33 */
+ insn = N32_ALU1 (SEB, N16_RT3 (insn16), N16_RA3 (insn16), 0);
+ break;
+ case 3: /* seh33 */
+ insn = N32_ALU1 (SEH, N16_RT3 (insn16), N16_RA3 (insn16), 0);
+ break;
+ case 4: /* xlsb33 */
+ insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RA3 (insn16), 1);
+ break;
+ case 5: /* x11b33 */
+ insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RA3 (insn16), 0x7ff);
+ break;
+ case 6: /* bmski33 */
+ insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RT3 (insn16),
+ 1 << __GF (insn16, 3, 3));
+ break;
+ case 7: /* fexti33 */
+ insn = N32_TYPE2 (ANDI, N16_RT3 (insn16), N16_RT3 (insn16),
+ (1 << (__GF (insn16, 3, 3) + 1)) - 1);
+ break;
+ }
+ goto done;
+ }
+
+ switch (__GF (insn16, 10, 5))
+ {
+ case 0x0: /* mov55 or ifret16 */
+ if (mach >= MACH_V3 && N16_RT5 (insn16) == REG_SP
+ && N16_RT5 (insn16) == N16_RA5 (insn16))
+ insn = N32_JREG (JR, 0, 0, 0, 3);
+ else
+ insn = N32_TYPE2 (ADDI, N16_RT5 (insn16), N16_RA5 (insn16), 0);
+ goto done;
+ case 0x1: /* movi55 */
+ insn = N32_TYPE1 (MOVI, N16_RT5 (insn16), N16_IMM5S (insn16));
+ goto done;
+ case 0x1b: /* addi10s (V2) */
+ insn = N32_TYPE2 (ADDI, REG_SP, REG_SP, N16_IMM10S (insn16));
+ goto done;
+ }
+
+ switch (__GF (insn16, 11, 4))
+ {
+ case 0x7: /* lwi37.fp/swi37.fp */
+ if (insn16 & __BIT (7)) /* swi37.fp */
+ insn = N32_TYPE2 (SWI, N16_RT38 (insn16), REG_FP, N16_IMM7U (insn16));
+ else /* lwi37.fp */
+ insn = N32_TYPE2 (LWI, N16_RT38 (insn16), REG_FP, N16_IMM7U (insn16));
+ goto done;
+ case 0x8: /* beqz38 */
+ insn = N32_BR2 (BEQZ, N16_RT38 (insn16), N16_IMM8S (insn16));
+ goto done;
+ case 0x9: /* bnez38 */
+ insn = N32_BR2 (BNEZ, N16_RT38 (insn16), N16_IMM8S (insn16));
+ goto done;
+ case 0xa: /* beqs38/j8, implied r5 */
+ if (N16_RT38 (insn16) == 5)
+ insn = N32_JI (J, N16_IMM8S (insn16));
+ else
+ insn = N32_BR1 (BEQ, N16_RT38 (insn16), REG_R5, N16_IMM8S (insn16));
+ goto done;
+ case 0xb: /* bnes38 and others */
+ if (N16_RT38 (insn16) == 5)
+ {
+ switch (__GF (insn16, 5, 3))
+ {
+ case 0: /* jr5 */
+ insn = N32_JREG (JR, 0, N16_RA5 (insn16), 0, 0);
+ break;
+ case 4: /* ret5 */
+ insn = N32_JREG (JR, 0, N16_RA5 (insn16), 0, 1);
+ break;
+ case 1: /* jral5 */
+ insn = N32_JREG (JRAL, REG_LP, N16_RA5 (insn16), 0, 0);
+ break;
+ case 2: /* ex9.it imm5 */
+ /* ex9.it had no 32-bit variantl. */
+ break;
+ case 5: /* add5.pc */
+ /* add5.pc had no 32-bit variantl. */
+ break;
+ }
+ }
+ else /* bnes38 */
+ insn = N32_BR1 (BNE, N16_RT38 (insn16), REG_R5, N16_IMM8S (insn16));
+ goto done;
+ case 0xe: /* lwi37/swi37 */
+ if (insn16 & (1 << 7)) /* swi37.sp */
+ insn = N32_TYPE2 (SWI, N16_RT38 (insn16), REG_SP, N16_IMM7U (insn16));
+ else /* lwi37.sp */
+ insn = N32_TYPE2 (LWI, N16_RT38 (insn16), REG_SP, N16_IMM7U (insn16));
+ goto done;
+ }
+
+done:
+ if (insn & 0x80000000)
+ return 0;
+
+ if (pinsn)
+ *pinsn = insn;
+ return 1;
+}
+
+static bfd_boolean
+is_sda_access_insn (unsigned long insn)
+{
+ switch (N32_OP6 (insn))
+ {
+ case N32_OP6_LWI:
+ case N32_OP6_LHI:
+ case N32_OP6_LHSI:
+ case N32_OP6_LBI:
+ case N32_OP6_LBSI:
+ case N32_OP6_SWI:
+ case N32_OP6_SHI:
+ case N32_OP6_SBI:
+ case N32_OP6_LWC:
+ case N32_OP6_LDC:
+ case N32_OP6_SWC:
+ case N32_OP6_SDC:
+ return TRUE;
+ default:
+ ;
+ }
+ return FALSE;
+}
+
+static unsigned long
+turn_insn_to_sda_access (uint32_t insn, bfd_signed_vma type, uint32_t *pinsn)
+{
+ uint32_t oinsn = 0;
+
+ switch (type)
+ {
+ case R_NDS32_GOT_LO12:
+ case R_NDS32_GOTOFF_LO12:
+ case R_NDS32_PLTREL_LO12:
+ case R_NDS32_PLT_GOTREL_LO12:
+ case R_NDS32_LO12S0_RELA:
+ switch (N32_OP6 (insn))
+ {
+ case N32_OP6_LBI:
+ /* lbi.gp */
+ oinsn = N32_TYPE1 (LBGP, N32_RT5 (insn), 0);
+ break;
+ case N32_OP6_LBSI:
+ /* lbsi.gp */
+ oinsn = N32_TYPE1 (LBGP, N32_RT5 (insn), __BIT (19));
+ break;
+ case N32_OP6_SBI:
+ /* sbi.gp */
+ oinsn = N32_TYPE1 (SBGP, N32_RT5 (insn), 0);
+ break;
+ case N32_OP6_ORI:
+ /* addi.gp */
+ oinsn = N32_TYPE1 (SBGP, N32_RT5 (insn), __BIT (19));
+ break;
+ }
+ break;
+
+ case R_NDS32_LO12S1_RELA:
+ switch (N32_OP6 (insn))
+ {
+ case N32_OP6_LHI:
+ /* lhi.gp */
+ oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), 0);
+ break;
+ case N32_OP6_LHSI:
+ /* lhsi.gp */
+ oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), __BIT (18));
+ break;
+ case N32_OP6_SHI:
+ /* shi.gp */
+ oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), __BIT (19));
+ break;
+ }
+ break;
+
+ case R_NDS32_LO12S2_RELA:
+ switch (N32_OP6 (insn))
+ {
+ case N32_OP6_LWI:
+ /* lwi.gp */
+ oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), __MF (6, 17, 3));
+ break;
+ case N32_OP6_SWI:
+ /* swi.gp */
+ oinsn = N32_TYPE1 (HWGP, N32_RT5 (insn), __MF (7, 17, 3));
+ break;
+ }
+ break;
+
+ case R_NDS32_LO12S2_DP_RELA:
+ case R_NDS32_LO12S2_SP_RELA:
+ oinsn = (insn & 0x7ff07000) | (REG_GP << 15);
+ break;
+ }
+
+ if (oinsn)
+ *pinsn = oinsn;
+
+ return oinsn != 0;
+}
+
+/* Linker hasn't found the correct merge section for non-section symbol
+ in relax time, this work is left to the function elf_link_input_bfd().
+ So for non-section symbol, _bfd_merged_section_offset is also needed
+ to find the correct symbol address. */
+
+static bfd_vma
+nds32_elf_rela_local_sym (bfd *abfd, Elf_Internal_Sym *sym,
+ asection **psec, Elf_Internal_Rela *rel)
+{
+ asection *sec = *psec;
+ bfd_vma relocation;
+
+ relocation = (sec->output_section->vma
+ + sec->output_offset + sym->st_value);
+ if ((sec->flags & SEC_MERGE) && sec->sec_info_type == SEC_INFO_TYPE_MERGE)
+ {
+ if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
+ rel->r_addend =
+ _bfd_merged_section_offset (abfd, psec,
+ elf_section_data (sec)->sec_info,
+ sym->st_value + rel->r_addend);
+ else
+ rel->r_addend =
+ _bfd_merged_section_offset (abfd, psec,
+ elf_section_data (sec)->sec_info,
+ sym->st_value) + rel->r_addend;
+
+ if (sec != *psec)
+ {
+ /* If we have changed the section, and our original section is
+ marked with SEC_EXCLUDE, it means that the original
+ SEC_MERGE section has been completely subsumed in some
+ other SEC_MERGE section. In this case, we need to leave
+ some info around for --emit-relocs. */
+ if ((sec->flags & SEC_EXCLUDE) != 0)
+ sec->kept_section = *psec;
+ sec = *psec;
+ }
+ rel->r_addend -= relocation;
+ rel->r_addend += sec->output_section->vma + sec->output_offset;
+ }
+ return relocation;
+}
+
+static bfd_vma
+calculate_memory_address (bfd *abfd, Elf_Internal_Rela *irel,
+ Elf_Internal_Sym *isymbuf,
+ Elf_Internal_Shdr *symtab_hdr)
+{
+ bfd_signed_vma foff;
+ bfd_vma symval, addend;
+ Elf_Internal_Rela irel_fn;
+ Elf_Internal_Sym *isym;
+ asection *sym_sec;
+
+ /* Get the value of the symbol referred to by the reloc. */
+ if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
+ {
+ /* A local symbol. */
+ isym = isymbuf + ELF32_R_SYM (irel->r_info);
+
+ if (isym->st_shndx == SHN_UNDEF)
+ sym_sec = bfd_und_section_ptr;
+ else if (isym->st_shndx == SHN_ABS)
+ sym_sec = bfd_abs_section_ptr;
+ else if (isym->st_shndx == SHN_COMMON)
+ sym_sec = bfd_com_section_ptr;
+ else
+ sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
+ memcpy (&irel_fn, irel, sizeof (Elf_Internal_Rela));
+ symval = nds32_elf_rela_local_sym (abfd, isym, &sym_sec, &irel_fn);
+ addend = irel_fn.r_addend;
+ }
+ else
+ {
+ unsigned long indx;
+ struct elf_link_hash_entry *h;
+
+ /* An external symbol. */
+ indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
+ h = elf_sym_hashes (abfd)[indx];
+ BFD_ASSERT (h != NULL);
+
+ while (h->root.type == bfd_link_hash_indirect
+ || h->root.type == bfd_link_hash_warning)
+ h = (struct elf_link_hash_entry *) h->root.u.i.link;
+
+ if (h->root.type != bfd_link_hash_defined
+ && h->root.type != bfd_link_hash_defweak)
+ /* This appears to be a reference to an undefined
+ symbol. Just ignore it--it will be caught by the
+ regular reloc processing. */
+ return 0;
+
+ if (h->root.u.def.section->flags & SEC_MERGE)
+ {
+ sym_sec = h->root.u.def.section;
+ symval = _bfd_merged_section_offset (abfd, &sym_sec, elf_section_data
+ (sym_sec)->sec_info, h->root.u.def.value);
+ symval = symval + sym_sec->output_section->vma
+ + sym_sec->output_offset;
+ }
+ else
+ symval = (h->root.u.def.value
+ + h->root.u.def.section->output_section->vma
+ + h->root.u.def.section->output_offset);
+ addend = irel->r_addend;
+ }
+
+ foff = symval + addend;
+
+ return foff;
+}
+
+static bfd_vma
+calculate_got_memory_address (bfd *abfd, struct bfd_link_info *link_info,
+ Elf_Internal_Rela *irel,
+ Elf_Internal_Shdr *symtab_hdr)
+{
+ int symndx;
+ bfd_vma *local_got_offsets;
+ /* Get the value of the symbol referred to by the reloc. */
+ struct elf_link_hash_entry *h;
+ struct elf_link_hash_table *ehtab = elf_hash_table (link_info);
+
+ /* An external symbol. */
+ symndx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
+ h = elf_sym_hashes (abfd)[symndx];
+ while (h->root.type == bfd_link_hash_indirect
+ || h->root.type == bfd_link_hash_warning)
+ h = (struct elf_link_hash_entry *) h->root.u.i.link;
+
+ if (symndx >= 0)
+ {
+ BFD_ASSERT (h != NULL);
+ return ehtab->sgot->output_section->vma + ehtab->sgot->output_offset
+ + h->got.offset;
+ }
+ local_got_offsets = elf_local_got_offsets (abfd);
+ BFD_ASSERT (local_got_offsets != NULL);
+ return ehtab->sgot->output_section->vma + ehtab->sgot->output_offset
+ + local_got_offsets[ELF32_R_SYM (irel->r_info)];
+
+ /* The _GLOBAL_OFFSET_TABLE_ may be undefweak(or should be?). */
+ /* The check of h->root.type is passed. */
+}
+
+static int
+is_16bit_NOP (bfd *abfd ATTRIBUTE_UNUSED,
+ asection *sec, Elf_Internal_Rela *rel)
+{
+ bfd_byte *contents;
+ unsigned short insn16;
+
+ if (!(rel->r_addend & R_NDS32_INSN16_CONVERT_FLAG))
+ return FALSE;
+ contents = elf_section_data (sec)->this_hdr.contents;
+ insn16 = bfd_getb16 (contents + rel->r_offset);
+ if (insn16 == NDS32_NOP16)
+ return TRUE;
+ return FALSE;
+}
+
+/* It checks whether the instruction could be converted to
+ 16-bit form and returns the converted one.
+
+ `internal_relocs' is supposed to be sorted. */
+
+static int
+is_convert_32_to_16 (bfd *abfd, asection *sec,
+ Elf_Internal_Rela *reloc,
+ Elf_Internal_Rela *internal_relocs,
+ Elf_Internal_Rela *irelend,
+ uint16_t *insn16)
+{
+#define NORMAL_32_TO_16 (1 << 0)
+#define SPECIAL_32_TO_16 (1 << 1)
+ bfd_byte *contents = NULL;
+ bfd_signed_vma off;
+ bfd_vma mem_addr;
+ uint32_t insn = 0;
+ Elf_Internal_Rela *pc_rel;
+ Elf_Internal_Shdr *symtab_hdr;
+ Elf_Internal_Sym *isymbuf = NULL;
+ int convert_type;
+ bfd_vma offset;
+
+ if (reloc->r_offset + 4 > sec->size)
+ return FALSE;
+
+ offset = reloc->r_offset;
+
+ if (!nds32_get_section_contents (abfd, sec, &contents, TRUE))
+ return FALSE;
+ insn = bfd_getb32 (contents + offset);
+
+ if (nds32_convert_32_to_16 (abfd, insn, insn16, NULL))
+ convert_type = NORMAL_32_TO_16;
+ else if (special_convert_32_to_16 (insn, insn16, reloc))
+ convert_type = SPECIAL_32_TO_16;
+ else
+ return FALSE;
+
+ symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
+ if (!nds32_get_local_syms (abfd, sec, &isymbuf))
+ return FALSE;
+
+ /* Find the first relocation of the same relocation-type,
+ so we iteratie them forward. */
+ pc_rel = reloc;
+ while ((pc_rel - 1) >= internal_relocs && pc_rel[-1].r_offset == offset)
+ pc_rel--;
+
+ for (; pc_rel < irelend && pc_rel->r_offset == offset; pc_rel++)
+ {
+ if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_15_PCREL_RELA
+ || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_17_PCREL_RELA
+ || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_25_PCREL_RELA
+ || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_25_PLTREL)
+ {
+ off = calculate_offset (abfd, sec, pc_rel, isymbuf, symtab_hdr);
+ if (off >= ACCURATE_8BIT_S1 || off < -ACCURATE_8BIT_S1
+ || off == 0)
+ return FALSE;
+ break;
+ }
+ else if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_20_RELA)
+ {
+ /* movi => movi55 */
+ mem_addr = calculate_memory_address (abfd, pc_rel, isymbuf, symtab_hdr);
+ /* mem_addr is unsigned, but the value should be between [-16, 15]. */
+ if ((mem_addr + 0x10) >> 5)
+ return FALSE;
+ break;
+ }
+ else if ((ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_TLS_LE_20)
+ || (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_TLS_LE_LO12))
+ {
+ /* It never happen movi to movi55 for R_NDS32_TLS_LE_20,
+ because it can be relaxed to addi for TLS_LE_ADD. */
+ return FALSE;
+ }
+ else if ((ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_SDA15S2_RELA
+ || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_SDA17S2_RELA)
+ && (reloc->r_addend & R_NDS32_INSN16_FP7U2_FLAG)
+ && convert_type == SPECIAL_32_TO_16)
+ {
+ /* fp-as-gp
+ We've selected a best fp-base for this access, so we can
+ always resolve it anyway. Do nothing. */
+ break;
+ }
+ else if ((ELF32_R_TYPE (pc_rel->r_info) > R_NDS32_NONE
+ && (ELF32_R_TYPE (pc_rel->r_info) < R_NDS32_RELA_GNU_VTINHERIT))
+ || ((ELF32_R_TYPE (pc_rel->r_info) > R_NDS32_RELA_GNU_VTENTRY)
+ && (ELF32_R_TYPE (pc_rel->r_info) < R_NDS32_INSN16))
+ || ((ELF32_R_TYPE (pc_rel->r_info) > R_NDS32_LOADSTORE)
+ && (ELF32_R_TYPE (pc_rel->r_info) < R_NDS32_DWARF2_OP1_RELA)))
+ {
+ /* Prevent unresolved addi instruction translate to addi45 or addi333. */
+ return FALSE;
+ }
+ else if ((ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_17IFC_PCREL_RELA))
+ {
+ off = calculate_offset (abfd, sec, pc_rel, isymbuf, symtab_hdr);
+ if (off >= ACCURATE_U9BIT_S1 || off <= 0)
+ return FALSE;
+ break;
+ }
+ }
+
+ return TRUE;
+}
+
+static void
+nds32_elf_write_16 (bfd *abfd ATTRIBUTE_UNUSED, bfd_byte *contents,
+ Elf_Internal_Rela *reloc,
+ Elf_Internal_Rela *internal_relocs,
+ Elf_Internal_Rela *irelend,
+ unsigned short insn16)
+{
+ Elf_Internal_Rela *pc_rel;
+ bfd_vma offset;
+
+ offset = reloc->r_offset;
+ bfd_putb16 (insn16, contents + offset);
+ /* Find the first relocation of the same relocation-type,
+ so we iteratie them forward. */
+ pc_rel = reloc;
+ while ((pc_rel - 1) > internal_relocs && pc_rel[-1].r_offset == offset)
+ pc_rel--;
+
+ for (; pc_rel < irelend && pc_rel->r_offset == offset; pc_rel++)
+ {
+ if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_15_PCREL_RELA
+ || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_17_PCREL_RELA
+ || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_25_PCREL_RELA)
+ {
+ pc_rel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_9_PCREL_RELA);
+ }
+ else if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_25_PLTREL)
+ pc_rel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_9_PLTREL);
+ else if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_20_RELA)
+ pc_rel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_5_RELA);
+ else if (ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_SDA15S2_RELA
+ || ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_SDA17S2_RELA)
+ pc_rel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_SDA_FP7U2_RELA);
+ else if ((ELF32_R_TYPE (pc_rel->r_info) == R_NDS32_17IFC_PCREL_RELA))
+ pc_rel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (pc_rel->r_info), R_NDS32_10IFCU_PCREL_RELA);
+ }
+}
+
+/* Find a relocation of type specified by `reloc_type'
+ of the same r_offset with reloc.
+ If not found, return irelend.
+
+ Assuming relocations are sorted by r_offset,
+ we find the relocation from `reloc' backward untill relocs,
+ or find it from `reloc' forward untill irelend. */
+
+static Elf_Internal_Rela *
+find_relocs_at_address (Elf_Internal_Rela *reloc,
+ Elf_Internal_Rela *relocs,
+ Elf_Internal_Rela *irelend,
+ enum elf_nds32_reloc_type reloc_type)
+{
+ Elf_Internal_Rela *rel_t;
+
+ /* Find backward. */
+ for (rel_t = reloc;
+ rel_t >= relocs && rel_t->r_offset == reloc->r_offset;
+ rel_t--)
+ if (ELF32_R_TYPE (rel_t->r_info) == reloc_type)
+ return rel_t;
+
+ /* We didn't find it backward. Try find it forward. */
+ for (rel_t = reloc;
+ rel_t < irelend && rel_t->r_offset == reloc->r_offset;
+ rel_t++)
+ if (ELF32_R_TYPE (rel_t->r_info) == reloc_type)
+ return rel_t;
+
+ return irelend;
+}
+
+/* Find a relocation of specified type and offset.
+ `reloc' is just a refence point to find a relocation at specified offset.
+ If not found, return irelend.
+
+ Assuming relocations are sorted by r_offset,
+ we find the relocation from `reloc' backward untill relocs,
+ or find it from `reloc' forward untill irelend. */
+
+static Elf_Internal_Rela *
+find_relocs_at_address_addr (Elf_Internal_Rela *reloc,
+ Elf_Internal_Rela *relocs,
+ Elf_Internal_Rela *irelend,
+ unsigned char reloc_type,
+ bfd_vma offset_p)
+{
+ Elf_Internal_Rela *rel_t = NULL;
+
+ /* First, we try to find a relocation of offset `offset_p',
+ and then we use find_relocs_at_address to find specific type. */
+
+ if (reloc->r_offset > offset_p)
+ {
+ /* Find backward. */
+ for (rel_t = reloc;
+ rel_t >= relocs && rel_t->r_offset > offset_p; rel_t--)
+ /* Do nothing. */;
+ }
+ else if (reloc->r_offset < offset_p)
+ {
+ /* Find forward. */
+ for (rel_t = reloc;
+ rel_t < irelend && rel_t->r_offset < offset_p; rel_t++)
+ /* Do nothing. */;
+ }
+ else
+ rel_t = reloc;
+
+ /* Not found? */
+ if (rel_t < relocs || rel_t == irelend || rel_t->r_offset != offset_p)
+ return irelend;
+
+ return find_relocs_at_address (rel_t, relocs, irelend, reloc_type);
+}
+
+static bfd_boolean
+nds32_elf_check_dup_relocs (Elf_Internal_Rela *reloc,
+ Elf_Internal_Rela *internal_relocs,
+ Elf_Internal_Rela *irelend,
+ unsigned char reloc_type)
+{
+ Elf_Internal_Rela *rel_t;
+
+ for (rel_t = reloc;
+ rel_t >= internal_relocs && rel_t->r_offset == reloc->r_offset;
+ rel_t--)
+ if (ELF32_R_TYPE (rel_t->r_info) == reloc_type)
+ {
+ if (ELF32_R_SYM (rel_t->r_info) == ELF32_R_SYM (reloc->r_info)
+ && rel_t->r_addend == reloc->r_addend)
+ continue;
+ return TRUE;
+ }
+
+ for (rel_t = reloc; rel_t < irelend && rel_t->r_offset == reloc->r_offset;
+ rel_t++)
+ if (ELF32_R_TYPE (rel_t->r_info) == reloc_type)
+ {
+ if (ELF32_R_SYM (rel_t->r_info) == ELF32_R_SYM (reloc->r_info)
+ && rel_t->r_addend == reloc->r_addend)
+ continue;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+typedef struct nds32_elf_blank nds32_elf_blank_t;
+struct nds32_elf_blank
+{
+ /* Where the blank begins. */
+ bfd_vma offset;
+ /* The size of the blank. */
+ bfd_vma size;
+ /* The accumulative size before this blank. */
+ bfd_vma total_size;
+ nds32_elf_blank_t *next;
+ nds32_elf_blank_t *prev;
+};
+
+static nds32_elf_blank_t *blank_free_list = NULL;
+
+static nds32_elf_blank_t *
+create_nds32_elf_blank (bfd_vma offset_p, bfd_vma size_p)
+{
+ nds32_elf_blank_t *blank_t;
+
+ if (blank_free_list)
+ {
+ blank_t = blank_free_list;
+ blank_free_list = blank_free_list->next;
+ }
+ else
+ blank_t = bfd_malloc (sizeof (nds32_elf_blank_t));
+
+ if (blank_t == NULL)
+ return NULL;
+
+ blank_t->offset = offset_p;
+ blank_t->size = size_p;
+ blank_t->total_size = 0;
+ blank_t->next = NULL;
+ blank_t->prev = NULL;
+
+ return blank_t;
+}
+
+static void
+remove_nds32_elf_blank (nds32_elf_blank_t *blank_p)
+{
+ if (blank_free_list)
+ {
+ blank_free_list->prev = blank_p;
+ blank_p->next = blank_free_list;
+ }
+ else
+ blank_p->next = NULL;
+
+ blank_p->prev = NULL;
+ blank_free_list = blank_p;
+}
+
+static void
+clean_nds32_elf_blank (void)
+{
+ nds32_elf_blank_t *blank_t;
+
+ while (blank_free_list)
+ {
+ blank_t = blank_free_list;
+ blank_free_list = blank_free_list->next;
+ free (blank_t);
+ }
+}
+
+static nds32_elf_blank_t *
+search_nds32_elf_blank (nds32_elf_blank_t *blank_p, bfd_vma addr)
+{
+ nds32_elf_blank_t *blank_t;
+
+ if (!blank_p)
+ return NULL;
+ blank_t = blank_p;
+
+ while (blank_t && addr < blank_t->offset)
+ blank_t = blank_t->prev;
+ while (blank_t && blank_t->next && addr >= blank_t->next->offset)
+ blank_t = blank_t->next;
+
+ return blank_t;
+}
+
+static bfd_vma
+get_nds32_elf_blank_total (nds32_elf_blank_t **blank_p, bfd_vma addr,
+ int overwrite)
+{
+ nds32_elf_blank_t *blank_t;
+
+ blank_t = search_nds32_elf_blank (*blank_p, addr);
+ if (!blank_t)
+ return 0;
+
+ if (overwrite)
+ *blank_p = blank_t;
+
+ if (addr < blank_t->offset + blank_t->size)
+ return blank_t->total_size + (addr - blank_t->offset);
+ else
+ return blank_t->total_size + blank_t->size;
+}
+
+static bfd_boolean
+insert_nds32_elf_blank (nds32_elf_blank_t **blank_p, bfd_vma addr, bfd_vma len)
+{
+ nds32_elf_blank_t *blank_t, *blank_t2;
+
+ if (!*blank_p)
+ {
+ *blank_p = create_nds32_elf_blank (addr, len);
+ return *blank_p ? TRUE : FALSE;
+ }
+
+ blank_t = search_nds32_elf_blank (*blank_p, addr);
+
+ if (blank_t == NULL)
+ {
+ blank_t = create_nds32_elf_blank (addr, len);
+ if (!blank_t)
+ return FALSE;
+ while ((*blank_p)->prev != NULL)
+ *blank_p = (*blank_p)->prev;
+ blank_t->next = *blank_p;
+ (*blank_p)->prev = blank_t;
+ (*blank_p) = blank_t;
+ return TRUE;
+ }
+
+ if (addr < blank_t->offset + blank_t->size
+ && ((addr + len) > (blank_t->offset + blank_t->size)))
+ blank_t->size = addr + len - blank_t->offset - blank_t->size;
+ else
+ {
+ blank_t2 = create_nds32_elf_blank (addr, len);
+ if (!blank_t2)
+ return FALSE;
+ if (blank_t->next)
+ {
+ blank_t->next->prev = blank_t2;
+ blank_t2->next = blank_t->next;
+ }
+ blank_t2->prev = blank_t;
+ blank_t->next = blank_t2;
+ *blank_p = blank_t2;
+ }
+
+ return TRUE;
+}
+
+static bfd_boolean
+insert_nds32_elf_blank_recalc_total (nds32_elf_blank_t **blank_p, bfd_vma addr,
+ bfd_vma len)
+{
+ nds32_elf_blank_t *blank_t;
+
+ if (!insert_nds32_elf_blank (blank_p, addr, len))
+ return FALSE;
+
+ blank_t = *blank_p;
+
+ if (!blank_t->prev)
+ {
+ blank_t->total_size = 0;
+ blank_t = blank_t->next;
+ }
+
+ while (blank_t)
+ {
+ blank_t->total_size = blank_t->prev->total_size + blank_t->prev->size;
+ blank_t = blank_t->next;
+ }
+
+ return TRUE;
+}
+
+static void
+calc_nds32_blank_total (nds32_elf_blank_t *blank_p)
+{
+ nds32_elf_blank_t *blank_t;
+ bfd_vma total_size = 0;
+
+ if (!blank_p)
+ return;
+
+ blank_t = blank_p;
+ while (blank_t->prev)
+ blank_t = blank_t->prev;
+ while (blank_t)
+ {
+ blank_t->total_size = total_size;
+ total_size += blank_t->size;
+ blank_t = blank_t->next;
+ }
+}
+
+static bfd_boolean
+nds32_elf_relax_delete_blanks (bfd *abfd, asection *sec,
+ nds32_elf_blank_t *blank_p)
+{
+ Elf_Internal_Shdr *symtab_hdr; /* Symbol table header of this bfd. */
+ Elf_Internal_Sym *isym = NULL; /* Symbol table of this bfd. */
+ Elf_Internal_Sym *isymend; /* Symbol entry iterator. */
+ unsigned int sec_shndx; /* The section the be relaxed. */
+ bfd_byte *contents; /* Contents data of iterating section. */
+ Elf_Internal_Rela *internal_relocs;
+ Elf_Internal_Rela *irel;
+ Elf_Internal_Rela *irelend;
+ struct elf_link_hash_entry **sym_hashes;
+ struct elf_link_hash_entry **end_hashes;
+ unsigned int symcount;
+ asection *sect;
+ nds32_elf_blank_t *blank_t;
+ nds32_elf_blank_t *blank_t2;
+ nds32_elf_blank_t *blank_head;
+
+ blank_head = blank_t = blank_p;
+ while (blank_head->prev != NULL)
+ blank_head = blank_head->prev;
+ while (blank_t->next != NULL)
+ blank_t = blank_t->next;
+
+ if (blank_t->offset + blank_t->size <= sec->size)
+ {
+ blank_t->next = create_nds32_elf_blank (sec->size + 4, 0);
+ blank_t->next->prev = blank_t;
+ }
+ if (blank_head->offset > 0)
+ {
+ blank_head->prev = create_nds32_elf_blank (0, 0);
+ blank_head->prev->next = blank_head;
+ blank_head = blank_head->prev;
+ }
+
+ sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
+
+ /* The deletion must stop at the next ALIGN reloc for an alignment
+ power larger than the number of bytes we are deleting. */
+
+ symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
+ if (!nds32_get_local_syms (abfd, sec, &isym))
+ return FALSE;
+
+ if (isym == NULL)
+ {
+ isym = bfd_elf_get_elf_syms (abfd, symtab_hdr,
+ symtab_hdr->sh_info, 0, NULL, NULL, NULL);
+ symtab_hdr->contents = (bfd_byte *) isym;
+ }
+
+ if (isym == NULL || symtab_hdr->sh_info == 0)
+ return FALSE;
+
+ blank_t = blank_head;
+ calc_nds32_blank_total (blank_head);
+
+ for (sect = abfd->sections; sect != NULL; sect = sect->next)
+ {
+ /* Adjust all the relocs. */
+
+ /* Relocations MUST be kept in memory, because relaxation adjust them. */
+ internal_relocs = _bfd_elf_link_read_relocs (abfd, sect, NULL, NULL,
+ TRUE /* keep_memory */);
+ irelend = internal_relocs + sect->reloc_count;
+
+ blank_t = blank_head;
+ blank_t2 = blank_head;
+
+ if (!(sect->flags & SEC_RELOC))
+ continue;
+
+ nds32_get_section_contents (abfd, sect, &contents, TRUE);
+
+ for (irel = internal_relocs; irel < irelend; irel++)
+ {
+ bfd_vma raddr;
+
+ if (ELF32_R_TYPE (irel->r_info) >= R_NDS32_DIFF8
+ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_DIFF32
+ && isym[ELF32_R_SYM (irel->r_info)].st_shndx == sec_shndx)
+ {
+ unsigned long val = 0;
+ unsigned long mask;
+ long before, between;
+ long offset;
+
+ switch (ELF32_R_TYPE (irel->r_info))
+ {
+ case R_NDS32_DIFF8:
+ offset = bfd_get_8 (abfd, contents + irel->r_offset);
+ break;
+ case R_NDS32_DIFF16:
+ offset = bfd_get_16 (abfd, contents + irel->r_offset);
+ break;
+ case R_NDS32_DIFF32:
+ val = bfd_get_32 (abfd, contents + irel->r_offset);
+ /* Get the signed bit and mask for the high part. The
+ gcc will alarm when right shift 32-bit since the
+ type size of long may be 32-bit. */
+ mask = 0 - (val >> 31);
+ if (mask)
+ offset = (val | (mask - 0xffffffff));
+ else
+ offset = val;
+ break;
+ default:
+ BFD_ASSERT (0);
+ }
+
+ /* DIFF value
+ 0 |encoded in location|
+ |------------|-------------------|---------
+ sym+off(addend)
+ -- before ---| *****************
+ --------------------- between ---|
+
+ We only care how much data are relax between DIFF, marked as ***. */
+
+ before = get_nds32_elf_blank_total (&blank_t, irel->r_addend, 0);
+ between = get_nds32_elf_blank_total (&blank_t, irel->r_addend + offset, 0);
+ if (between == before)
+ goto done_adjust_diff;
+
+ switch (ELF32_R_TYPE (irel->r_info))
+ {
+ case R_NDS32_DIFF8:
+ bfd_put_8 (abfd, offset - (between - before), contents + irel->r_offset);
+ break;
+ case R_NDS32_DIFF16:
+ bfd_put_16 (abfd, offset - (between - before), contents + irel->r_offset);
+ break;
+ case R_NDS32_DIFF32:
+ bfd_put_32 (abfd, offset - (between - before), contents + irel->r_offset);
+ break;
+ }
+ }
+ else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_DIFF_ULEB128
+ && isym[ELF32_R_SYM (irel->r_info)].st_shndx == sec_shndx)
+ {
+ bfd_vma val = 0;
+ unsigned int len = 0;
+ unsigned long before, between;
+ bfd_byte *endp, *p;
+
+ val = read_unsigned_leb128 (abfd, contents + irel->r_offset, &len);
+
+ before = get_nds32_elf_blank_total (&blank_t, irel->r_addend, 0);
+ between = get_nds32_elf_blank_total (&blank_t, irel->r_addend + val, 0);
+ if (between == before)
+ goto done_adjust_diff;
+
+ p = contents + irel->r_offset;
+ endp = p + len -1;
+ memset (p, 0x80, len);
+ *(endp) = 0;
+ p = write_uleb128 (p, val - (between - before)) - 1;
+ if (p < endp)
+ *p |= 0x80;
+ }
+done_adjust_diff:
+
+ if (sec == sect)
+ {
+ raddr = irel->r_offset;
+ irel->r_offset -= get_nds32_elf_blank_total (&blank_t2, irel->r_offset, 1);
+
+ if (ELF32_R_TYPE (irel->r_info) == R_NDS32_NONE)
+ continue;
+ if (blank_t2 && blank_t2->next
+ && (blank_t2->offset > raddr || blank_t2->next->offset <= raddr))
+ (*_bfd_error_handler) (_("%B: %s\n"), abfd,
+ "Error: search_nds32_elf_blank reports wrong node");
+
+ /* Mark reloc in deleted portion as NONE.
+ For some relocs like R_NDS32_LABEL that doesn't modify the
+ content in the section. R_NDS32_LABEL doesn't belong to the
+ instruction in the section, so we should preserve it. */
+ if (raddr >= blank_t2->offset
+ && raddr < blank_t2->offset + blank_t2->size
+ && ELF32_R_TYPE (irel->r_info) != R_NDS32_LABEL
+ && ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_REGION_BEGIN
+ && ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_REGION_END
+ && ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_ENTRY
+ && ELF32_R_TYPE (irel->r_info) != R_NDS32_SUBTRAHEND
+ && ELF32_R_TYPE (irel->r_info) != R_NDS32_MINUEND)
+ {
+ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
+ R_NDS32_NONE);
+ continue;
+ }
+ }
+
+ if (ELF32_R_TYPE (irel->r_info) == R_NDS32_NONE
+ || ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL
+ || ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_ENTRY)
+ continue;
+
+ if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info
+ && isym[ELF32_R_SYM (irel->r_info)].st_shndx == sec_shndx
+ && ELF_ST_TYPE (isym[ELF32_R_SYM (irel->r_info)].st_info) == STT_SECTION)
+ {
+ if (irel->r_addend <= sec->size)
+ irel->r_addend -=
+ get_nds32_elf_blank_total (&blank_t, irel->r_addend, 1);
+ }
+ }
+ }
+
+ /* Adjust the local symbols defined in this section. */
+ blank_t = blank_head;
+ for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
+ {
+ if (isym->st_shndx == sec_shndx)
+ {
+ if (isym->st_value <= sec->size)
+ {
+ bfd_vma ahead;
+ bfd_vma orig_addr = isym->st_value;
+
+ ahead = get_nds32_elf_blank_total (&blank_t, isym->st_value, 1);
+ isym->st_value -= ahead;
+
+ /* Adjust function size. */
+ if (ELF32_ST_TYPE (isym->st_info) == STT_FUNC && isym->st_size > 0)
+ isym->st_size -= get_nds32_elf_blank_total
+ (&blank_t, orig_addr + isym->st_size, 0) - ahead;
+ }
+ }
+ }
+
+ /* Now adjust the global symbols defined in this section. */
+ symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
+ - symtab_hdr->sh_info);
+ sym_hashes = elf_sym_hashes (abfd);
+ end_hashes = sym_hashes + symcount;
+ blank_t = blank_head;
+ for (; sym_hashes < end_hashes; sym_hashes++)
+ {
+ struct elf_link_hash_entry *sym_hash = *sym_hashes;
+
+ if ((sym_hash->root.type == bfd_link_hash_defined
+ || sym_hash->root.type == bfd_link_hash_defweak)
+ && sym_hash->root.u.def.section == sec)
+ {
+ if (sym_hash->root.u.def.value <= sec->size)
+ {
+ bfd_vma ahead;
+ bfd_vma orig_addr = sym_hash->root.u.def.value;
+
+ ahead = get_nds32_elf_blank_total (&blank_t, sym_hash->root.u.def.value, 1);
+ sym_hash->root.u.def.value -= ahead;
+
+ /* Adjust function size. */
+ if (sym_hash->type == STT_FUNC)
+ sym_hash->size -= get_nds32_elf_blank_total
+ (&blank_t, orig_addr + sym_hash->size, 0) - ahead;
+
+ }
+ }
+ }
+
+ contents = elf_section_data (sec)->this_hdr.contents;
+ blank_t = blank_head;
+ while (blank_t->next)
+ {
+ /* Actually delete the bytes. */
+
+ /* If current blank is the last blank overlap with current section,
+ go to finish process. */
+ if (sec->size <= (blank_t->next->offset))
+ break;
+
+ memmove (contents + blank_t->offset - blank_t->total_size,
+ contents + blank_t->offset + blank_t->size,
+ blank_t->next->offset - (blank_t->offset + blank_t->size));
+
+ blank_t = blank_t->next;
+ }
+
+ if (sec->size > (blank_t->offset + blank_t->size))
+ {
+ /* There are remaining code between blank and section boundary.
+ Move the remaining code to appropriate location. */
+ memmove (contents + blank_t->offset - blank_t->total_size,
+ contents + blank_t->offset + blank_t->size,
+ sec->size - (blank_t->offset + blank_t->size));
+ sec->size -= blank_t->total_size + blank_t->size;
+ }
+ else
+ /* This blank is not entirely included in the section,
+ reduce the section size by only part of the blank size. */
+ sec->size -= blank_t->total_size + (sec->size - blank_t->offset);
+
+ while (blank_head)
+ {
+ blank_t = blank_head;
+ blank_head = blank_head->next;
+ remove_nds32_elf_blank (blank_t);
+ }
+
+ return TRUE;
+}
+
+/* Get the contents of a section. */
+
+static int
+nds32_get_section_contents (bfd *abfd, asection *sec,
+ bfd_byte **contents_p, bfd_boolean cache)
+{
+ /* Get the section contents. */
+ if (elf_section_data (sec)->this_hdr.contents != NULL)
+ *contents_p = elf_section_data (sec)->this_hdr.contents;
+ else
+ {
+ if (!bfd_malloc_and_get_section (abfd, sec, contents_p))
+ return FALSE;
+ if (cache)
+ elf_section_data (sec)->this_hdr.contents = *contents_p;
+ }
+
+ return TRUE;
+}
+
+/* Get the contents of the internal symbol of abfd. */
+
+static int
+nds32_get_local_syms (bfd *abfd, asection *sec ATTRIBUTE_UNUSED,
+ Elf_Internal_Sym **isymbuf_p)
+{
+ Elf_Internal_Shdr *symtab_hdr;
+ symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
+
+ /* Read this BFD's local symbols if we haven't done so already. */
+ if (*isymbuf_p == NULL && symtab_hdr->sh_info != 0)
+ {
+ *isymbuf_p = (Elf_Internal_Sym *) symtab_hdr->contents;
+ if (*isymbuf_p == NULL)
+ {
+ *isymbuf_p = bfd_elf_get_elf_syms (abfd, symtab_hdr,
+ symtab_hdr->sh_info, 0,
+ NULL, NULL, NULL);
+ if (*isymbuf_p == NULL)
+ return FALSE;
+ }
+ }
+ symtab_hdr->contents = (bfd_byte *) (*isymbuf_p);
+
+ return TRUE;
+}
+
+/* Range of small data. */
+static bfd_vma sdata_range[2][2];
+static bfd_vma const sdata_init_range[2] =
+{ ACCURATE_12BIT_S1, ACCURATE_19BIT };
+
+static int
+nds32_elf_insn_size (bfd *abfd ATTRIBUTE_UNUSED,
+ bfd_byte *contents, bfd_vma addr)
+{
+ unsigned long insn = bfd_getb32 (contents + addr);
+
+ if (insn & 0x80000000)
+ return 2;
+
+ return 4;
+}
+
+/* Set the gp relax range. We have to measure the safe range
+ to do gp relaxation. */
+
+static void
+relax_range_measurement (bfd *abfd)
+{
+ asection *sec_f, *sec_b;
+ /* For upper bound. */
+ bfd_vma maxpgsz = get_elf_backend_data (abfd)->maxpagesize;
+ bfd_vma align;
+ static int decide_relax_range = 0;
+ int i;
+ int range_number = ARRAY_SIZE (sdata_init_range);
+
+ if (decide_relax_range)
+ return;
+ decide_relax_range = 1;
+
+ if (sda_rela_sec == NULL)
+ {
+ /* Since there is no data sections, we assume the range is page size. */
+ for (i = 0; i < range_number; i++)
+ {
+ sdata_range[i][0] = sdata_init_range[i] - 0x1000;
+ sdata_range[i][1] = sdata_init_range[i] - 0x1000;
+ }
+ return;
+ }
+
+ /* Get the biggest alignment power after the gp located section. */
+ sec_f = sda_rela_sec->output_section;
+ sec_b = sec_f->next;
+ align = 0;
+ while (sec_b != NULL)
+ {
+ if ((unsigned)(1 << sec_b->alignment_power) > align)
+ align = (1 << sec_b->alignment_power);
+ sec_b = sec_b->next;
+ }
+
+ /* I guess we can not determine the section before
+ gp located section, so we assume the align is max page size. */
+ for (i = 0; i < range_number; i++)
+ {
+ sdata_range[i][1] = sdata_init_range[i] - align;
+ BFD_ASSERT (sdata_range[i][1] <= sdata_init_range[i]);
+ sdata_range[i][0] = sdata_init_range[i] - maxpgsz;
+ BFD_ASSERT (sdata_range[i][0] <= sdata_init_range[i]);
+ }
+}
+
+/* These are macros used to check flags encoded in r_addend.
+ They are only used by nds32_elf_relax_section (). */
+#define GET_SEQ_LEN(addend) ((addend) & 0x000000ff)
+#define IS_1ST_CONVERT(addend) ((addend) & 0x80000000)
+#define IS_OPTIMIZE(addend) ((addend) & 0x40000000)
+#define IS_16BIT_ON(addend) ((addend) & 0x20000000)
+
+/* Relax LONGCALL1 relocation for nds32_elf_relax_section.*/
+
+static bfd_boolean
+nds32_elf_relax_longcall1 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
+ Elf_Internal_Rela *internal_relocs, int *insn_len,
+ bfd_byte *contents, Elf_Internal_Sym *isymbuf,
+ Elf_Internal_Shdr *symtab_hdr)
+{
+ /* There are 3 variations for LONGCALL1
+ case 4-4-2; 16-bit on, optimize off or optimize for space
+ sethi ta, hi20(symbol) ; LONGCALL1/HI20
+ ori ta, ta, lo12(symbol) ; LO12S0
+ jral5 ta ;
+
+ case 4-4-4; 16-bit off, optimize don't care
+ sethi ta, hi20(symbol) ; LONGCALL1/HI20
+ ori ta, ta, lo12(symbol) ; LO12S0
+ jral ta ;
+
+ case 4-4-4; 16-bit on, optimize for speed
+ sethi ta, hi20(symbol) ; LONGCALL1/HI20
+ ori ta, ta, lo12(symbol) ; LO12S0
+ jral ta ;
+ Check code for -mlong-calls output. */
+
+ /* Get the reloc for the address from which the register is
+ being loaded. This reloc will tell us which function is
+ actually being called. */
+
+ bfd_vma laddr;
+ int seq_len; /* Original length of instruction sequence. */
+ uint32_t insn;
+ Elf_Internal_Rela *hi_irelfn, *lo_irelfn, *irelend;
+ bfd_signed_vma foff;
+ uint16_t insn16;
+
+ irelend = internal_relocs + sec->reloc_count;
+ seq_len = GET_SEQ_LEN (irel->r_addend);
+ laddr = irel->r_offset;
+ *insn_len = seq_len;
+
+ hi_irelfn = find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ R_NDS32_HI20_RELA, laddr);
+ lo_irelfn = find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ R_NDS32_LO12S0_ORI_RELA,
+ laddr + 4);
+
+ if (hi_irelfn == irelend || lo_irelfn == irelend)
+ {
+ (*_bfd_error_handler)
+ ("%B: warning: R_NDS32_LONGCALL1 points to unrecognized"
+ "reloc at 0x%lx.", abfd, (long) irel->r_offset);
+ return FALSE;
+ }
+
+ /* Get the value of the symbol referred to by the reloc. */
+ foff = calculate_offset (abfd, sec, hi_irelfn, isymbuf, symtab_hdr);
+
+ /* This condition only happened when symbol is undefined. */
+ if (foff == 0 || foff < -CONSERVATIVE_24BIT_S1
+ || foff >= CONSERVATIVE_24BIT_S1)
+ return FALSE;
+
+ /* Relax to: jal symbol; 25_PCREL */
+ /* For simplicity of coding, we are going to modify the section
+ contents, the section relocs, and the BFD symbol table. We
+ must tell the rest of the code not to free up this
+ information. It would be possible to instead create a table
+ of changes which have to be made, as is done in coff-mips.c;
+ that would be more work, but would require less memory when
+ the linker is run. */
+
+ /* Replace the long call with a jal. */
+ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
+ R_NDS32_25_PCREL_RELA);
+ irel->r_addend = hi_irelfn->r_addend;
+
+ /* We don't resolve this here but resolve it in relocate_section. */
+ insn = INSN_JAL;
+ bfd_putb32 (insn, contents + irel->r_offset);
+
+ hi_irelfn->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_NDS32_NONE);
+ lo_irelfn->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_NONE);
+ *insn_len = 4;
+
+ if (seq_len & 0x2)
+ {
+ insn16 = NDS32_NOP16;
+ bfd_putb16 (insn16, contents + irel->r_offset + *insn_len);
+ lo_irelfn->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_INSN16);
+ lo_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
+ *insn_len += 2;
+ }
+ return TRUE;
+}
+
+#define CONVERT_CONDITION_CALL(insn) (((insn) & 0xffff0000) ^ 0x90000)
+/* Relax LONGCALL2 relocation for nds32_elf_relax_section.*/
+
+static bfd_boolean
+nds32_elf_relax_longcall2 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
+ Elf_Internal_Rela *internal_relocs, int *insn_len,
+ bfd_byte *contents, Elf_Internal_Sym *isymbuf,
+ Elf_Internal_Shdr *symtab_hdr)
+{
+ /* bltz rt, .L1 ; LONGCALL2
+ jal symbol ; 25_PCREL
+ .L1: */
+
+ /* Get the reloc for the address from which the register is
+ being loaded. This reloc will tell us which function is
+ actually being called. */
+
+ bfd_vma laddr;
+ uint32_t insn;
+ Elf_Internal_Rela *i1_irelfn, *cond_irelfn, *irelend;
+ bfd_signed_vma foff;
+
+ irelend = internal_relocs + sec->reloc_count;
+ laddr = irel->r_offset;
+ i1_irelfn =
+ find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ R_NDS32_25_PCREL_RELA, laddr + 4);
+
+ if (i1_irelfn == irelend)
+ {
+ (*_bfd_error_handler)
+ ("%B: warning: R_NDS32_LONGCALL2 points to unrecognized"
+ "reloc at 0x%lx.", abfd, (long) irel->r_offset);
+ return FALSE;
+ }
+
+ insn = bfd_getb32 (contents + laddr);
+
+ /* Get the value of the symbol referred to by the reloc. */
+ foff = calculate_offset (abfd, sec, i1_irelfn, isymbuf, symtab_hdr);
+
+ if (foff == 0 || foff < -CONSERVATIVE_16BIT_S1
+ || foff >= CONSERVATIVE_16BIT_S1)
+ return FALSE;
+
+ /* Relax to bgezal rt, label ; 17_PCREL
+ or bltzal rt, label ; 17_PCREL */
+
+ /* Convert to complimentary conditional call. */
+ insn = CONVERT_CONDITION_CALL (insn);
+
+ /* For simplicity of coding, we are going to modify the section
+ contents, the section relocs, and the BFD symbol table. We
+ must tell the rest of the code not to free up this
+ information. It would be possible to instead create a table
+ of changes which have to be made, as is done in coff-mips.c;
+ that would be more work, but would require less memory when
+ the linker is run. */
+
+ /* Clean unnessary relocations. */
+ i1_irelfn->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (i1_irelfn->r_info), R_NDS32_NONE);
+ cond_irelfn =
+ find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ R_NDS32_17_PCREL_RELA, laddr);
+ if (cond_irelfn != irelend)
+ cond_irelfn->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (cond_irelfn->r_info), R_NDS32_NONE);
+
+ /* Replace the long call with a bgezal. */
+ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (i1_irelfn->r_info),
+ R_NDS32_17_PCREL_RELA);
+ irel->r_addend = i1_irelfn->r_addend;
+
+ bfd_putb32 (insn, contents + irel->r_offset);
+
+ *insn_len = 4;
+ return TRUE;
+}
+
+/* Relax LONGCALL3 relocation for nds32_elf_relax_section.*/
+
+static bfd_boolean
+nds32_elf_relax_longcall3 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
+ Elf_Internal_Rela *internal_relocs, int *insn_len,
+ bfd_byte *contents, Elf_Internal_Sym *isymbuf,
+ Elf_Internal_Shdr *symtab_hdr)
+{
+ /* There are 3 variations for LONGCALL3
+ case 4-4-4-2; 16-bit on, optimize off or optimize for space
+ bltz rt, $1 ; LONGCALL3
+ sethi ta, hi20(symbol) ; HI20
+ ori ta, ta, lo12(symbol) ; LO12S0
+ jral5 ta ;
+ $1
+
+ case 4-4-4-4; 16-bit off, optimize don't care
+ bltz rt, $1 ; LONGCALL3
+ sethi ta, hi20(symbol) ; HI20
+ ori ta, ta, lo12(symbol) ; LO12S0
+ jral ta ;
+ $1
+
+ case 4-4-4-4; 16-bit on, optimize for speed
+ bltz rt, $1 ; LONGCALL3
+ sethi ta, hi20(symbol) ; HI20
+ ori ta, ta, lo12(symbol) ; LO12S0
+ jral ta ;
+ $1 */
+
+ /* Get the reloc for the address from which the register is
+ being loaded. This reloc will tell us which function is
+ actually being called. */
+
+ bfd_vma laddr;
+ int seq_len; /* Original length of instruction sequence. */
+ uint32_t insn;
+ Elf_Internal_Rela *hi_irelfn, *lo_irelfn, *cond_irelfn, *irelend;
+ bfd_signed_vma foff;
+ uint16_t insn16;
+
+ irelend = internal_relocs + sec->reloc_count;
+ seq_len = GET_SEQ_LEN (irel->r_addend);
+ laddr = irel->r_offset;
+ *insn_len = seq_len;
+
+ hi_irelfn =
+ find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ R_NDS32_HI20_RELA, laddr + 4);
+ lo_irelfn =
+ find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ R_NDS32_LO12S0_ORI_RELA, laddr + 8);
+
+ if (hi_irelfn == irelend || lo_irelfn == irelend)
+ {
+ (*_bfd_error_handler)
+ ("%B: warning: R_NDS32_LONGCALL3 points to unrecognized"
+ "reloc at 0x%lx.", abfd, (long) irel->r_offset);
+ return FALSE;
+ }
+
+ /* Get the value of the symbol referred to by the reloc. */
+ foff = calculate_offset (abfd, sec, hi_irelfn, isymbuf, symtab_hdr);
+
+ if (foff == 0 || foff < -CONSERVATIVE_24BIT_S1
+ || foff >= CONSERVATIVE_24BIT_S1)
+ return FALSE;
+
+ insn = bfd_getb32 (contents + laddr);
+ if (foff >= -CONSERVATIVE_16BIT_S1 && foff < CONSERVATIVE_16BIT_S1)
+ {
+ /* Relax to bgezal rt, label ; 17_PCREL
+ or bltzal rt, label ; 17_PCREL */
+
+ /* Convert to complimentary conditional call. */
+ insn = CONVERT_CONDITION_CALL (insn);
+ bfd_putb32 (insn, contents + irel->r_offset);
+
+ *insn_len = 4;
+ irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_NDS32_NONE);
+ hi_irelfn->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_NDS32_NONE);
+ lo_irelfn->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_NONE);
+
+ cond_irelfn =
+ find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ R_NDS32_17_PCREL_RELA, laddr);
+ if (cond_irelfn != irelend)
+ {
+ cond_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
+ R_NDS32_17_PCREL_RELA);
+ cond_irelfn->r_addend = hi_irelfn->r_addend;
+ }
+
+ if (seq_len & 0x2)
+ {
+ insn16 = NDS32_NOP16;
+ bfd_putb16 (insn16, contents + irel->r_offset + *insn_len);
+ hi_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
+ R_NDS32_INSN16);
+ hi_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
+ insn_len += 2;
+ }
+ }
+ else if (foff >= -CONSERVATIVE_24BIT_S1 && foff < CONSERVATIVE_24BIT_S1)
+ {
+ /* Relax to the following instruction sequence
+ bltz rt, $1 ; LONGCALL2
+ jal symbol ; 25_PCREL
+ $1 */
+ *insn_len = 8;
+ insn = INSN_JAL;
+ bfd_putb32 (insn, contents + hi_irelfn->r_offset);
+
+ hi_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
+ R_NDS32_25_PCREL_RELA);
+ irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_LONGCALL2);
+
+ lo_irelfn->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_NONE);
+
+ if (seq_len & 0x2)
+ {
+ insn16 = NDS32_NOP16;
+ bfd_putb16 (insn16, contents + irel->r_offset + *insn_len);
+ lo_irelfn->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_INSN16);
+ lo_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
+ insn_len += 2;
+ }
+ }
+ return TRUE;
+}
+
+/* Relax LONGJUMP1 relocation for nds32_elf_relax_section.*/
+
+static bfd_boolean
+nds32_elf_relax_longjump1 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
+ Elf_Internal_Rela *internal_relocs, int *insn_len,
+ bfd_byte *contents, Elf_Internal_Sym *isymbuf,
+ Elf_Internal_Shdr *symtab_hdr)
+{
+ /* There are 3 variations for LONGJUMP1
+ case 4-4-2; 16-bit bit on, optimize off or optimize for space
+ sethi ta, hi20(symbol) ; LONGJUMP1/HI20
+ ori ta, ta, lo12(symbol) ; LO12S0
+ jr5 ta ;
+
+ case 4-4-4; 16-bit off, optimize don't care
+ sethi ta, hi20(symbol) ; LONGJUMP1/HI20
+ ori ta, ta, lo12(symbol) ; LO12S0
+ jr ta ;
+
+ case 4-4-4; 16-bit on, optimize for speed
+ sethi ta, hi20(symbol) ; LONGJUMP1/HI20
+ ori ta, ta, lo12(symbol) ; LO12S0
+ jr ta ; */
+
+ /* Get the reloc for the address from which the register is
+ being loaded. This reloc will tell us which function is
+ actually being called. */
+
+ bfd_vma laddr;
+ int seq_len; /* Original length of instruction sequence. */
+ int insn16_on; /* 16-bit on/off. */
+ uint32_t insn;
+ Elf_Internal_Rela *hi_irelfn, *lo_irelfn, *irelend;
+ bfd_signed_vma foff;
+ uint16_t insn16;
+ unsigned long reloc;
+
+ irelend = internal_relocs + sec->reloc_count;
+ seq_len = GET_SEQ_LEN (irel->r_addend);
+ laddr = irel->r_offset;
+ *insn_len = seq_len;
+ insn16_on = IS_16BIT_ON (irel->r_addend);
+
+ hi_irelfn =
+ find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ R_NDS32_HI20_RELA, laddr);
+ lo_irelfn =
+ find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ R_NDS32_LO12S0_ORI_RELA, laddr + 4);
+ if (hi_irelfn == irelend || lo_irelfn == irelend)
+ {
+ (*_bfd_error_handler)
+ ("%B: warning: R_NDS32_LONGJUMP1 points to unrecognized"
+ "reloc at 0x%lx.", abfd, (long) irel->r_offset);
+ return FALSE;
+ }
+
+ /* Get the value of the symbol referred to by the reloc. */
+ foff = calculate_offset (abfd, sec, hi_irelfn, isymbuf, symtab_hdr);
+
+ if (foff == 0 || foff >= CONSERVATIVE_24BIT_S1
+ || foff < -CONSERVATIVE_24BIT_S1)
+ return FALSE;
+
+ if (insn16_on && foff >= -ACCURATE_8BIT_S1
+ && foff < ACCURATE_8BIT_S1 && (seq_len & 0x2))
+ {
+ /* j8 label */
+ /* 16-bit on, but not optimized for speed. */
+ reloc = R_NDS32_9_PCREL_RELA;
+ insn16 = INSN_J8;
+ bfd_putb16 (insn16, contents + irel->r_offset);
+ *insn_len = 2;
+ irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
+ }
+ else
+ {
+ /* j label */
+ reloc = R_NDS32_25_PCREL_RELA;
+ insn = INSN_J;
+ bfd_putb32 (insn, contents + irel->r_offset);
+ *insn_len = 4;
+ irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_INSN16);
+ irel->r_addend = 0;
+ }
+
+ hi_irelfn->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), reloc);
+ lo_irelfn->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info), R_NDS32_NONE);
+
+ if ((seq_len & 0x2) && ((*insn_len & 2) == 0))
+ {
+ insn16 = NDS32_NOP16;
+ bfd_putb16 (insn16, contents + irel->r_offset + *insn_len);
+ lo_irelfn->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info),
+ R_NDS32_INSN16);
+ lo_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
+ *insn_len += 2;
+ }
+ return TRUE;
+}
+
+/* Revert condition branch. This function does not check if the input
+ instruction is condition branch or not. */
+
+static void
+nds32_elf_convert_branch (uint16_t insn16, uint32_t insn,
+ uint16_t *re_insn16, uint32_t *re_insn)
+{
+ uint32_t comp_insn = 0;
+ uint16_t comp_insn16 = 0;
+
+ if (insn)
+ {
+ if (N32_OP6 (insn) == N32_OP6_BR1)
+ {
+ /* beqs label. */
+ comp_insn = (insn ^ 0x4000) & 0xffffc000;
+ if (N32_IS_RT3 (insn) && N32_RA5 (insn) == REG_R5)
+ {
+ /* Insn can be contracted to 16-bit implied r5. */
+ comp_insn16 =
+ (comp_insn & 0x4000) ? INSN_BNES38 : INSN_BEQS38;
+ comp_insn16 |= (N32_RT5 (insn) & 0x7) << 8;
+ }
+ }
+ else if (N32_OP6 (insn) == N32_OP6_BR3)
+ {
+ /* bnec $ta, imm11, label. */
+ comp_insn = (insn ^ 0x80000) & 0xffffff00;
+ }
+ else
+ {
+ comp_insn = (insn ^ 0x10000) & 0xffffc000;
+ if (N32_BR2_SUB (insn) == N32_BR2_BEQZ
+ || N32_BR2_SUB (insn) == N32_BR2_BNEZ)
+ {
+ if (N32_IS_RT3 (insn))
+ {
+ /* Insn can be contracted to 16-bit. */
+ comp_insn16 =
+ (comp_insn & 0x10000) ? INSN_BNEZ38 : INSN_BEQZ38;
+ comp_insn16 |= (N32_RT5 (insn) & 0x7) << 8;
+ }
+ else if (N32_RT5 (insn) == REG_R15)
+ {
+ /* Insn can be contracted to 16-bit. */
+ comp_insn16 =
+ (comp_insn & 0x10000) ? INSN_BNES38 : INSN_BEQS38;
+ }
+ }
+ }
+ }
+ else
+ {
+ switch ((insn16 & 0xf000) >> 12)
+ {
+ case 0xc:
+ /* beqz38 or bnez38 */
+ comp_insn16 = (insn16 ^ 0x0800) & 0xff00;
+ comp_insn = (comp_insn16 & 0x0800) ? INSN_BNEZ : INSN_BEQZ;
+ comp_insn |= ((comp_insn16 & 0x0700) >> 8) << 20;
+ break;
+
+ case 0xd:
+ /* beqs38 or bnes38 */
+ comp_insn16 = (insn16 ^ 0x0800) & 0xff00;
+ comp_insn = (comp_insn16 & 0x0800) ? INSN_BNE : INSN_BEQ;
+ comp_insn |= (((comp_insn16 & 0x0700) >> 8) << 20)
+ | (REG_R5 << 15);
+ break;
+
+ case 0xe:
+ /* beqzS8 or bnezS8 */
+ comp_insn16 = (insn16 ^ 0x0100) & 0xff00;
+ comp_insn = (comp_insn16 & 0x0100) ? INSN_BNEZ : INSN_BEQZ;
+ comp_insn |= REG_R15 << 20;
+ break;
+
+ default:
+ break;
+ }
+ }
+ if (comp_insn && re_insn)
+ *re_insn = comp_insn;
+ if (comp_insn16 && re_insn16)
+ *re_insn16 = comp_insn16;
+}
+
+/* Relax LONGJUMP2 relocation for nds32_elf_relax_section.*/
+
+static bfd_boolean
+nds32_elf_relax_longjump2 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
+ Elf_Internal_Rela *internal_relocs, int *insn_len,
+ bfd_byte *contents, Elf_Internal_Sym *isymbuf,
+ Elf_Internal_Shdr *symtab_hdr)
+{
+ /* There are 3 variations for LONGJUMP2
+ case 2-4; 1st insn convertible, 16-bit on,
+ optimize off or optimize for space
+ bnes38 rt, ra, $1 ; LONGJUMP2
+ j label ; 25_PCREL
+ $1:
+
+ case 4-4; 1st insn not convertible
+ bne rt, ra, $1 ; LONGJUMP2
+ j label ; 25_PCREL
+ $1:
+
+ case 4-4; 1st insn convertible, 16-bit on, optimize for speed
+ bne rt, ra, $1 ; LONGJUMP2
+ j label ; 25_PCREL
+ $1: */
+
+ /* Get the reloc for the address from which the register is
+ being loaded. This reloc will tell us which function is
+ actually being called. */
+
+ bfd_vma laddr;
+ int seq_len; /* Original length of instruction sequence. */
+ Elf_Internal_Rela *i2_irelfn, *cond_irelfn, *irelend;
+ int first_size;
+ unsigned int i;
+ bfd_signed_vma foff;
+ uint32_t insn, re_insn = 0;
+ uint16_t insn16, re_insn16 = 0;
+ unsigned long reloc, cond_reloc;
+
+ enum elf_nds32_reloc_type checked_types[] =
+ { R_NDS32_15_PCREL_RELA, R_NDS32_9_PCREL_RELA };
+
+ irelend = internal_relocs + sec->reloc_count;
+ seq_len = GET_SEQ_LEN (irel->r_addend);
+ laddr = irel->r_offset;
+ *insn_len = seq_len;
+ first_size = (seq_len == 6) ? 2 : 4;
+
+ i2_irelfn =
+ find_relocs_at_address_addr (irel, internal_relocs,
+ irelend, R_NDS32_25_PCREL_RELA,
+ laddr + first_size);
+
+ for (i = 0; i < ARRAY_SIZE (checked_types); i++)
+ {
+ cond_irelfn =
+ find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ checked_types[i], laddr);
+ if (cond_irelfn != irelend)
+ break;
+ }
+
+ if (i2_irelfn == irelend || cond_irelfn == irelend)
+ {
+ (*_bfd_error_handler)
+ ("%B: warning: R_NDS32_LONGJUMP2 points to unrecognized"
+ "reloc at 0x%lx.", abfd, (long) irel->r_offset);
+ return FALSE;
+ }
+
+ /* Get the value of the symbol referred to by the reloc. */
+ foff =
+ calculate_offset (abfd, sec, i2_irelfn, isymbuf, symtab_hdr);
+ if (foff == 0 || foff < -CONSERVATIVE_16BIT_S1
+ || foff >= CONSERVATIVE_16BIT_S1)
+ return FALSE;
+
+ /* Get the all corresponding instructions. */
+ if (first_size == 4)
+ {
+ insn = bfd_getb32 (contents + laddr);
+ nds32_elf_convert_branch (0, insn, &re_insn16, &re_insn);
+ }
+ else
+ {
+ insn16 = bfd_getb16 (contents + laddr);
+ nds32_elf_convert_branch (insn16, 0, &re_insn16, &re_insn);
+ }
+
+ if (re_insn16 && foff >= -(ACCURATE_8BIT_S1 - first_size)
+ && foff < ACCURATE_8BIT_S1 - first_size)
+ {
+ if (first_size == 4)
+ {
+ /* Don't convert it to 16-bit now, keep this as relaxable for
+ ``label reloc; INSN16''. */
+
+ /* Save comp_insn32 to buffer. */
+ bfd_putb32 (re_insn, contents + irel->r_offset);
+ *insn_len = 4;
+ reloc = (N32_OP6 (re_insn) == N32_OP6_BR1) ?
+ R_NDS32_15_PCREL_RELA : R_NDS32_17_PCREL_RELA;
+ cond_reloc = R_NDS32_INSN16;
+ }
+ else
+ {
+ bfd_putb16 (re_insn16, contents + irel->r_offset);
+ *insn_len = 2;
+ reloc = R_NDS32_9_PCREL_RELA;
+ cond_reloc = R_NDS32_NONE;
+ }
+ }
+ else if (N32_OP6 (re_insn) == N32_OP6_BR1
+ && (foff >= -(ACCURATE_14BIT_S1 - first_size)
+ && foff < ACCURATE_14BIT_S1 - first_size))
+ {
+ /* beqs label ; 15_PCREL */
+ bfd_putb32 (re_insn, contents + irel->r_offset);
+ *insn_len = 4;
+ reloc = R_NDS32_15_PCREL_RELA;
+ cond_reloc = R_NDS32_NONE;
+ }
+ else if (N32_OP6 (re_insn) == N32_OP6_BR2
+ && foff >= -CONSERVATIVE_16BIT_S1
+ && foff < CONSERVATIVE_16BIT_S1)
+ {
+ /* beqz label ; 17_PCREL */
+ bfd_putb32 (re_insn, contents + irel->r_offset);
+ *insn_len = 4;
+ reloc = R_NDS32_17_PCREL_RELA;
+ cond_reloc = R_NDS32_NONE;
+ }
+ else
+ return FALSE;
+
+ /* Set all relocations. */
+ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (i2_irelfn->r_info), reloc);
+ irel->r_addend = i2_irelfn->r_addend;
+
+ cond_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irelfn->r_info),
+ cond_reloc);
+ cond_irelfn->r_addend = 0;
+
+ if ((seq_len ^ *insn_len ) & 0x2)
+ {
+ insn16 = NDS32_NOP16;
+ bfd_putb16 (insn16, contents + irel->r_offset + 4);
+ i2_irelfn->r_offset = 4;
+ i2_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (i2_irelfn->r_info),
+ R_NDS32_INSN16);
+ i2_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
+ *insn_len += 2;
+ }
+ else
+ i2_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (i2_irelfn->r_info),
+ R_NDS32_NONE);
+ return TRUE;
+}
+
+/* Relax LONGJUMP3 relocation for nds32_elf_relax_section.*/
+
+static bfd_boolean
+nds32_elf_relax_longjump3 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
+ Elf_Internal_Rela *internal_relocs, int *insn_len,
+ bfd_byte *contents, Elf_Internal_Sym *isymbuf,
+ Elf_Internal_Shdr *symtab_hdr)
+{
+ /* There are 5 variations for LONGJUMP3
+ case 1: 2-4-4-2; 1st insn convertible, 16-bit on,
+ optimize off or optimize for space
+ bnes38 rt, ra, $1 ; LONGJUMP3
+ sethi ta, hi20(symbol) ; HI20
+ ori ta, ta, lo12(symbol) ; LO12S0
+ jr5 ta ;
+ $1: ;
+
+ case 2: 2-4-4-2; 1st insn convertible, 16-bit on, optimize for speed
+ bnes38 rt, ra, $1 ; LONGJUMP3
+ sethi ta, hi20(symbol) ; HI20
+ ori ta, ta, lo12(symbol) ; LO12S0
+ jr5 ta ;
+ $1: ; LABEL
+
+ case 3: 4-4-4-2; 1st insn not convertible, 16-bit on,
+ optimize off or optimize for space
+ bne rt, ra, $1 ; LONGJUMP3
+ sethi ta, hi20(symbol) ; HI20
+ ori ta, ta, lo12(symbol) ; LO12S0
+ jr5 ta ;
+ $1: ;
+
+ case 4: 4-4-4-4; 1st insn don't care, 16-bit off, optimize don't care
+ 16-bit off if no INSN16
+ bne rt, ra, $1 ; LONGJUMP3
+ sethi ta, hi20(symbol) ; HI20
+ ori ta, ta, lo12(symbol) ; LO12S0
+ jr ta ;
+ $1: ;
+
+ case 5: 4-4-4-4; 1st insn not convertible, 16-bit on, optimize for speed
+ 16-bit off if no INSN16
+ bne rt, ra, $1 ; LONGJUMP3
+ sethi ta, hi20(symbol) ; HI20
+ ori ta, ta, lo12(symbol) ; LO12S0
+ jr ta ;
+ $1: ; LABEL */
+
+ /* Get the reloc for the address from which the register is
+ being loaded. This reloc will tell us which function is
+ actually being called. */
+ enum elf_nds32_reloc_type checked_types[] =
+ { R_NDS32_15_PCREL_RELA, R_NDS32_9_PCREL_RELA };
+
+ int reloc_off = 0, cond_removed = 0, convertible;
+ bfd_vma laddr;
+ int seq_len; /* Original length of instruction sequence. */
+ Elf_Internal_Rela *hi_irelfn, *lo_irelfn, *cond_irelfn, *irelend;
+ int first_size;
+ unsigned int i;
+ bfd_signed_vma foff;
+ uint32_t insn, re_insn = 0;
+ uint16_t insn16, re_insn16 = 0;
+ unsigned long reloc, cond_reloc;
+
+ irelend = internal_relocs + sec->reloc_count;
+ seq_len = GET_SEQ_LEN (irel->r_addend);
+ laddr = irel->r_offset;
+ *insn_len = seq_len;
+
+ convertible = IS_1ST_CONVERT (irel->r_addend);
+
+ if (convertible)
+ first_size = 2;
+ else
+ first_size = 4;
+
+ /* Get all needed relocations. */
+ hi_irelfn =
+ find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ R_NDS32_HI20_RELA, laddr + first_size);
+ lo_irelfn =
+ find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ R_NDS32_LO12S0_ORI_RELA,
+ laddr + first_size + 4);
+
+ for (i = 0; i < ARRAY_SIZE (checked_types); i++)
+ {
+ cond_irelfn =
+ find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ checked_types[i], laddr);
+ if (cond_irelfn != irelend)
+ break;
+ }
+
+ if (hi_irelfn == irelend || lo_irelfn == irelend || cond_irelfn == irelend)
+ {
+ (*_bfd_error_handler)
+ ("%B: warning: R_NDS32_LONGJUMP3 points to unrecognized"
+ "reloc at 0x%lx.", abfd, (long) irel->r_offset);
+ return FALSE;
+ }
+
+ /* Get the value of the symbol referred to by the reloc. */
+ foff = calculate_offset (abfd, sec, hi_irelfn, isymbuf, symtab_hdr);
+
+ if (foff == 0 || foff < -CONSERVATIVE_24BIT_S1
+ || foff >= CONSERVATIVE_24BIT_S1)
+ return FALSE;
+
+ /* Get the all corresponding instructions. */
+ if (first_size == 4)
+ {
+ insn = bfd_getb32 (contents + laddr);
+ nds32_elf_convert_branch (0, insn, &re_insn16, &re_insn);
+ }
+ else
+ {
+ insn16 = bfd_getb16 (contents + laddr);
+ nds32_elf_convert_branch (insn16, 0, &re_insn16, &re_insn);
+ }
+
+ /* For simplicity of coding, we are going to modify the section
+ contents, the section relocs, and the BFD symbol table. We
+ must tell the rest of the code not to free up this
+ information. It would be possible to instead create a table
+ of changes which have to be made, as is done in coff-mips.c;
+ that would be more work, but would require less memory when
+ the linker is run. */
+
+ if (re_insn16 && foff >= -ACCURATE_8BIT_S1 - first_size
+ && foff < ACCURATE_8BIT_S1 - first_size)
+ {
+ if (!(seq_len & 0x2))
+ {
+ /* Don't convert it to 16-bit now, keep this as relaxable
+ for ``label reloc; INSN1a''6. */
+ /* Save comp_insn32 to buffer. */
+ bfd_putb32 (re_insn, contents + irel->r_offset);
+ *insn_len = 4;
+ reloc = (N32_OP6 (re_insn) == N32_OP6_BR1) ?
+ R_NDS32_15_PCREL_RELA : R_NDS32_17_PCREL_RELA;
+ cond_reloc = R_NDS32_INSN16;
+ }
+ else
+ {
+ /* Not optimize for speed; convert sequence to 16-bit. */
+ /* Save comp_insn16 to buffer. */
+ bfd_putb16 (re_insn16, contents + irel->r_offset);
+ *insn_len = 2;
+ reloc = R_NDS32_9_PCREL_RELA;
+ cond_reloc = R_NDS32_NONE;
+ }
+ cond_removed = 1;
+ }
+ else if (N32_OP6 (re_insn) == N32_OP6_BR1
+ && (foff >= -(ACCURATE_14BIT_S1 - first_size)
+ && foff < ACCURATE_14BIT_S1 - first_size))
+ {
+ /* beqs label ; 15_PCREL */
+ bfd_putb32 (re_insn, contents + irel->r_offset);
+ *insn_len = 4;
+ reloc = R_NDS32_15_PCREL_RELA;
+ cond_reloc = R_NDS32_NONE;
+ cond_removed = 1;
+ }
+ else if (N32_OP6 (re_insn) == N32_OP6_BR2
+ && foff >= -CONSERVATIVE_16BIT_S1
+ && foff < CONSERVATIVE_16BIT_S1)
+ {
+ /* beqz label ; 17_PCREL */
+ bfd_putb32 (re_insn, contents + irel->r_offset);
+ *insn_len = 4;
+ reloc = R_NDS32_17_PCREL_RELA;
+ cond_reloc = R_NDS32_NONE;
+ cond_removed = 1;
+ }
+ else if (foff >= -CONSERVATIVE_24BIT_S1 - reloc_off
+ && foff < CONSERVATIVE_24BIT_S1 - reloc_off)
+ {
+ /* Relax to one of the following 3 variations
+
+ case 2-4; 1st insn convertible, 16-bit on, optimize off or optimize
+ for space
+ bnes38 rt, $1 ; LONGJUMP2
+ j label ; 25_PCREL
+ $1
+
+ case 4-4; 1st insn not convertible, others don't care
+ bne rt, ra, $1 ; LONGJUMP2
+ j label ; 25_PCREL
+ $1
+
+ case 4-4; 1st insn convertible, 16-bit on, optimize for speed
+ bne rt, ra, $1 ; LONGJUMP2
+ j label ; 25_PCREL
+ $1 */
+
+ /* Offset for first instruction. */
+
+ /* Use j label as second instruction. */
+ *insn_len = 4 + first_size;
+ insn = INSN_J;
+ bfd_putb32 (insn, contents + hi_irelfn->r_offset);
+ reloc = R_NDS32_LONGJUMP2;
+ cond_reloc = R_NDS32_25_PLTREL;
+ }
+ else
+ return FALSE;
+
+ if (cond_removed == 1)
+ {
+ /* Set all relocations. */
+ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), reloc);
+ irel->r_addend = hi_irelfn->r_addend;
+
+ cond_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irelfn->r_info),
+ cond_reloc);
+ cond_irelfn->r_addend = 0;
+ hi_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
+ R_NDS32_NONE);
+ }
+ else
+ {
+ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), reloc);
+ irel->r_addend = irel->r_addend;
+ hi_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info),
+ cond_reloc);
+ }
+
+ if ((seq_len ^ *insn_len ) & 0x2)
+ {
+ insn16 = NDS32_NOP16;
+ bfd_putb16 (insn16, contents + irel->r_offset + *insn_len);
+ lo_irelfn->r_offset = *insn_len;
+ lo_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info),
+ R_NDS32_INSN16);
+ lo_irelfn->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
+ *insn_len += 2;
+ }
+ else
+ lo_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (lo_irelfn->r_info),
+ R_NDS32_NONE);
+ return TRUE;
+}
+
+/* Relax LONGCALL4 relocation for nds32_elf_relax_section.*/
+
+static bfd_boolean
+nds32_elf_relax_longcall4 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
+ Elf_Internal_Rela *internal_relocs, int *insn_len,
+ bfd_byte *contents, Elf_Internal_Sym *isymbuf,
+ Elf_Internal_Shdr *symtab_hdr)
+{
+ /* The pattern for LONGCALL4. Support for function cse.
+ sethi ta, hi20(symbol) ; LONGCALL4/HI20
+ ori ta, ta, lo12(symbol) ; LO12S0_ORI/PTR
+ jral ta ; PTR_RES/EMPTY/INSN16 */
+
+ bfd_vma laddr;
+ uint32_t insn;
+ Elf_Internal_Rela *hi_irel, *ptr_irel, *insn_irel, *em_irel, *call_irel;
+ Elf_Internal_Rela *irelend;
+ bfd_signed_vma foff;
+
+ irelend = internal_relocs + sec->reloc_count;
+ laddr = irel->r_offset;
+
+ /* Get the reloc for the address from which the register is
+ being loaded. This reloc will tell us which function is
+ actually being called. */
+ hi_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ R_NDS32_HI20_RELA, laddr);
+
+ if (hi_irel == irelend)
+ {
+ (*_bfd_error_handler)
+ ("%B: warning: R_NDS32_LONGCALL4 points to unrecognized"
+ "reloc at 0x%lx.", abfd, (long) irel->r_offset);
+ return FALSE;
+ }
+
+ /* Get the value of the symbol referred to by the reloc. */
+ foff = calculate_offset (abfd, sec, hi_irel, isymbuf, symtab_hdr);
+
+ /* This condition only happened when symbol is undefined. */
+ if (foff == 0 || foff < -CONSERVATIVE_24BIT_S1
+ || foff >= CONSERVATIVE_24BIT_S1)
+ return FALSE;
+
+ /* Relax to: jal symbol; 25_PCREL */
+ /* For simplicity of coding, we are going to modify the section
+ contents, the section relocs, and the BFD symbol table. We
+ must tell the rest of the code not to free up this
+ information. It would be possible to instead create a table
+ of changes which have to be made, as is done in coff-mips.c;
+ that would be more work, but would require less memory when
+ the linker is run. */
+
+ ptr_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ R_NDS32_PTR_RESOLVED, irel->r_addend);
+ em_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ R_NDS32_EMPTY, irel->r_addend);
+
+ if (ptr_irel == irelend || em_irel == irelend)
+ {
+ (*_bfd_error_handler)
+ ("%B: warning: R_NDS32_LONGCALL4 points to unrecognized"
+ "reloc at 0x%lx.", abfd, (long) irel->r_offset);
+ return FALSE;
+ }
+ /* Check these is enough space to insert jal in R_NDS32_EMPTY. */
+ insn = bfd_getb32 (contents + irel->r_addend);
+ if (insn & 0x80000000)
+ return FALSE;
+
+ /* Replace the long call with a jal. */
+ em_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info),
+ R_NDS32_25_PCREL_RELA);
+ ptr_irel->r_addend = 1;
+
+ /* We don't resolve this here but resolve it in relocate_section. */
+ insn = INSN_JAL;
+ bfd_putb32 (insn, contents + em_irel->r_offset);
+
+ irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
+
+ /* If there is function cse, HI20 can not remove now. */
+ call_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ R_NDS32_LONGCALL4, laddr);
+ if (call_irel == irelend)
+ {
+ *insn_len = 0;
+ hi_irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (hi_irel->r_info), R_NDS32_NONE);
+ }
+
+ insn_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ R_NDS32_INSN16, irel->r_addend);
+ if (insn_irel != irelend)
+ insn_irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
+
+ return TRUE;
+}
+
+/* Relax LONGCALL5 relocation for nds32_elf_relax_section.*/
+
+static bfd_boolean
+nds32_elf_relax_longcall5 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
+ Elf_Internal_Rela *internal_relocs, int *insn_len,
+ bfd_byte *contents, Elf_Internal_Sym *isymbuf,
+ Elf_Internal_Shdr *symtab_hdr)
+{
+ /* The pattern for LONGCALL5.
+ bltz rt, .L1 ; LONGCALL5/17_PCREL
+ jal symbol ; 25_PCREL
+ .L1: */
+
+ bfd_vma laddr;
+ uint32_t insn;
+ Elf_Internal_Rela *cond_irel, *irelend;
+ bfd_signed_vma foff;
+
+ irelend = internal_relocs + sec->reloc_count;
+ laddr = irel->r_offset;
+ insn = bfd_getb32 (contents + laddr);
+
+ /* Get the reloc for the address from which the register is
+ being loaded. This reloc will tell us which function is
+ actually being called. */
+ cond_irel =
+ find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ R_NDS32_25_PCREL_RELA, irel->r_addend);
+ if (cond_irel == irelend)
+ {
+ (*_bfd_error_handler)
+ ("%B: warning: R_NDS32_LONGCALL5 points to unrecognized"
+ "reloc at 0x%lx.", abfd, (long) irel->r_offset);
+ return FALSE;
+ }
+
+ /* Get the value of the symbol referred to by the reloc. */
+ foff = calculate_offset (abfd, sec, cond_irel, isymbuf, symtab_hdr);
+
+ if (foff == 0 || foff < -CONSERVATIVE_16BIT_S1
+ || foff >= CONSERVATIVE_16BIT_S1)
+ return FALSE;
+
+ /* Relax to bgezal rt, label ; 17_PCREL
+ or bltzal rt, label ; 17_PCREL */
+
+ /* Convert to complimentary conditional call. */
+ insn = CONVERT_CONDITION_CALL (insn);
+
+ /* For simplicity of coding, we are going to modify the section
+ contents, the section relocs, and the BFD symbol table. We
+ must tell the rest of the code not to free up this
+ information. It would be possible to instead create a table
+ of changes which have to be made, as is done in coff-mips.c;
+ that would be more work, but would require less memory when
+ the linker is run. */
+
+ /* Modify relocation and contents. */
+ cond_irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_17_PCREL_RELA);
+
+ /* Replace the long call with a bgezal. */
+ bfd_putb32 (insn, contents + cond_irel->r_offset);
+ *insn_len = 0;
+
+ /* Clean unnessary relocations. */
+ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
+
+ cond_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ R_NDS32_17_PCREL_RELA, laddr);
+ cond_irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE);
+
+ return TRUE;
+}
+
+/* Relax LONGCALL6 relocation for nds32_elf_relax_section.*/
+
+static bfd_boolean
+nds32_elf_relax_longcall6 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
+ Elf_Internal_Rela *internal_relocs, int *insn_len,
+ bfd_byte *contents, Elf_Internal_Sym *isymbuf,
+ Elf_Internal_Shdr *symtab_hdr)
+{
+ /* The pattern for LONGCALL6.
+ bltz rt, .L1 ; LONGCALL6/17_PCREL
+ sethi ta, hi20(symbol) ; HI20/PTR
+ ori ta, ta, lo12(symbol) ; LO12S0_ORI/PTR
+ jral ta ; PTR_RES/EMPTY/INSN16
+ .L1 */
+
+ bfd_vma laddr;
+ uint32_t insn;
+ Elf_Internal_Rela *em_irel, *cond_irel, *irelend;
+ bfd_signed_vma foff;
+
+ irelend = internal_relocs + sec->reloc_count;
+ laddr = irel->r_offset;
+
+ /* Get the reloc for the address from which the register is
+ being loaded. This reloc will tell us which function is
+ actually being called. */
+ em_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ R_NDS32_EMPTY, irel->r_addend);
+
+ if (em_irel == irelend)
+ {
+ (*_bfd_error_handler)
+ ("%B: warning: R_NDS32_LONGCALL6 points to unrecognized"
+ "reloc at 0x%lx.", abfd, (long) irel->r_offset);
+ return FALSE;
+ }
+
+ /* Get the value of the symbol referred to by the reloc. */
+ foff = calculate_offset (abfd, sec, em_irel, isymbuf, symtab_hdr);
+
+ if (foff == 0 || foff < -CONSERVATIVE_24BIT_S1
+ || foff >= CONSERVATIVE_24BIT_S1)
+ return FALSE;
+
+ /* Check these is enough space to insert jal in R_NDS32_EMPTY. */
+ insn = bfd_getb32 (contents + irel->r_addend);
+ if (insn & 0x80000000)
+ return FALSE;
+
+ insn = bfd_getb32 (contents + laddr);
+ if (foff >= -CONSERVATIVE_16BIT_S1 && foff < CONSERVATIVE_16BIT_S1)
+ {
+ /* Relax to bgezal rt, label ; 17_PCREL
+ or bltzal rt, label ; 17_PCREL */
+
+ /* Convert to complimentary conditional call. */
+ *insn_len = 0;
+ insn = CONVERT_CONDITION_CALL (insn);
+ bfd_putb32 (insn, contents + em_irel->r_offset);
+
+ em_irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info), R_NDS32_17_PCREL_RELA);
+
+ /* Set resolved relocation. */
+ cond_irel =
+ find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ R_NDS32_PTR_RESOLVED, irel->r_addend);
+ if (cond_irel == irelend)
+ {
+ (*_bfd_error_handler)
+ ("%B: warning: R_NDS32_LONGCALL6 points to unrecognized"
+ "reloc at 0x%lx.", abfd, (long) irel->r_offset);
+ return FALSE;
+ }
+ cond_irel->r_addend = 1;
+
+ /* Clear relocations. */
+
+ irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
+
+ cond_irel =
+ find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ R_NDS32_17_PCREL_RELA, laddr);
+ if (cond_irel != irelend)
+ cond_irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE);
+
+ cond_irel =
+ find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ R_NDS32_INSN16, irel->r_addend);
+ if (cond_irel != irelend)
+ cond_irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE);
+
+ }
+ else if (foff >= -CONSERVATIVE_24BIT_S1 && foff < CONSERVATIVE_24BIT_S1)
+ {
+ /* Relax to the following instruction sequence
+ bltz rt, .L1 ; LONGCALL2/17_PCREL
+ jal symbol ; 25_PCREL/PTR_RES
+ .L1 */
+ *insn_len = 4;
+ /* Convert instruction. */
+ insn = INSN_JAL;
+ bfd_putb32 (insn, contents + em_irel->r_offset);
+
+ /* Convert relocations. */
+ em_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info),
+ R_NDS32_25_PCREL_RELA);
+ irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_LONGCALL5);
+
+ /* Set resolved relocation. */
+ cond_irel =
+ find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ R_NDS32_PTR_RESOLVED, irel->r_addend);
+ if (cond_irel == irelend)
+ {
+ (*_bfd_error_handler)
+ ("%B: warning: R_NDS32_LONGCALL6 points to unrecognized"
+ "reloc at 0x%lx.", abfd, (long) irel->r_offset);
+ return FALSE;
+ }
+ cond_irel->r_addend = 1;
+
+ cond_irel =
+ find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ R_NDS32_INSN16, irel->r_addend);
+ if (cond_irel != irelend)
+ cond_irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE);
+ }
+ return TRUE;
+}
+
+/* Relax LONGJUMP4 relocation for nds32_elf_relax_section.*/
+
+static bfd_boolean
+nds32_elf_relax_longjump4 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
+ Elf_Internal_Rela *internal_relocs, int *insn_len,
+ bfd_byte *contents, Elf_Internal_Sym *isymbuf,
+ Elf_Internal_Shdr *symtab_hdr)
+{
+ /* The pattern for LONGJUMP4.
+ sethi ta, hi20(symbol) ; LONGJUMP4/HI20
+ ori ta, ta, lo12(symbol) ; LO12S0_ORI/PTR
+ jr ta ; PTR_RES/INSN16/EMPTY */
+
+ bfd_vma laddr;
+ int seq_len; /* Original length of instruction sequence. */
+ uint32_t insn;
+ Elf_Internal_Rela *hi_irel, *ptr_irel, *em_irel, *call_irel, *irelend;
+ bfd_signed_vma foff;
+
+ irelend = internal_relocs + sec->reloc_count;
+ seq_len = GET_SEQ_LEN (irel->r_addend);
+ laddr = irel->r_offset;
+ *insn_len = seq_len;
+
+ /* Get the reloc for the address from which the register is
+ being loaded. This reloc will tell us which function is
+ actually being called. */
+
+ hi_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ R_NDS32_HI20_RELA, laddr);
+
+ if (hi_irel == irelend)
+ {
+ (*_bfd_error_handler)
+ ("%B: warning: R_NDS32_LONGJUMP4 points to unrecognized"
+ "reloc at 0x%lx.", abfd, (long) irel->r_offset);
+ return FALSE;
+ }
+
+ /* Get the value of the symbol referred to by the reloc. */
+ foff = calculate_offset (abfd, sec, hi_irel, isymbuf, symtab_hdr);
+
+ if (foff == 0 || foff >= CONSERVATIVE_24BIT_S1
+ || foff < -CONSERVATIVE_24BIT_S1)
+ return FALSE;
+
+ /* Convert it to "j label", it may be converted to j8 in the final
+ pass of relaxation. Therefore, we do not consider this currently.*/
+ ptr_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ R_NDS32_PTR_RESOLVED, irel->r_addend);
+ em_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ R_NDS32_EMPTY, irel->r_addend);
+
+ if (ptr_irel == irelend || em_irel == irelend)
+ {
+ (*_bfd_error_handler)
+ ("%B: warning: R_NDS32_LONGJUMP4 points to unrecognized"
+ "reloc at 0x%lx.", abfd, (long) irel->r_offset);
+ return FALSE;
+ }
+
+ em_irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info), R_NDS32_25_PCREL_RELA);
+ ptr_irel->r_addend = 1;
+
+ /* Write instruction. */
+ insn = INSN_J;
+ bfd_putb32 (insn, contents + em_irel->r_offset);
+
+ /* Clear relocations. */
+ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
+
+ /* If there is function cse, HI20 can not remove now. */
+ call_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ R_NDS32_LONGJUMP4, laddr);
+ if (call_irel == irelend)
+ {
+ *insn_len = 0;
+ hi_irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (hi_irel->r_info), R_NDS32_NONE);
+ }
+
+ return TRUE;
+}
+
+/* Relax LONGJUMP5 relocation for nds32_elf_relax_section.*/
+
+static bfd_boolean
+nds32_elf_relax_longjump5 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
+ Elf_Internal_Rela *internal_relocs, int *insn_len,
+ int *seq_len, bfd_byte *contents,
+ Elf_Internal_Sym *isymbuf,
+ Elf_Internal_Shdr *symtab_hdr)
+{
+ /* There are 2 variations for LONGJUMP5
+ case 2-4; 1st insn convertible, 16-bit on.
+ bnes38 rt, ra, .L1 ; LONGJUMP5/9_PCREL/INSN16
+ j label ; 25_PCREL/INSN16
+ $1:
+
+ case 4-4; 1st insn not convertible
+ bne rt, ra, .L1 ; LONGJUMP5/15_PCREL/INSN16
+ j label ; 25_PCREL/INSN16
+ .L1: */
+
+ bfd_vma laddr;
+ Elf_Internal_Rela *cond_irel, *irelend;
+ unsigned int i;
+ bfd_signed_vma foff;
+ uint32_t insn, re_insn = 0;
+ uint16_t insn16, re_insn16 = 0;
+ unsigned long reloc;
+
+ enum elf_nds32_reloc_type checked_types[] =
+ { R_NDS32_17_PCREL_RELA, R_NDS32_15_PCREL_RELA,
+ R_NDS32_9_PCREL_RELA, R_NDS32_INSN16 };
+
+ irelend = internal_relocs + sec->reloc_count;
+ laddr = irel->r_offset;
+
+ /* Get the reloc for the address from which the register is
+ being loaded. This reloc will tell us which function is
+ actually being called. */
+
+ cond_irel =
+ find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ R_NDS32_25_PCREL_RELA, irel->r_addend);
+ if (cond_irel == irelend)
+ {
+ (*_bfd_error_handler)
+ ("%B: warning: R_NDS32_LONGJUMP5 points to unrecognized"
+ "reloc at 0x%lx.", abfd, (long) irel->r_offset);
+ return FALSE;
+ }
+
+ /* Get the value of the symbol referred to by the reloc. */
+ foff = calculate_offset (abfd, sec, cond_irel, isymbuf, symtab_hdr);
+
+ if (foff == 0 || foff < -CONSERVATIVE_16BIT_S1
+ || foff >= CONSERVATIVE_16BIT_S1)
+ return FALSE;
+
+ /* Get the all corresponding instructions. */
+ insn = bfd_getb32 (contents + laddr);
+ /* Check instruction size. */
+ if (insn & 0x80000000)
+ {
+ *seq_len = 0;
+ insn16 = insn >> 16;
+ nds32_elf_convert_branch (insn16, 0, &re_insn16, &re_insn);
+ }
+ else
+ nds32_elf_convert_branch (0, insn, &re_insn16, &re_insn);
+
+ if (N32_OP6 (re_insn) == N32_OP6_BR1
+ && (foff >= -CONSERVATIVE_14BIT_S1 && foff < CONSERVATIVE_14BIT_S1))
+ {
+ /* beqs label ; 15_PCREL. */
+ bfd_putb32 (re_insn, contents + cond_irel->r_offset);
+ reloc = R_NDS32_15_PCREL_RELA;
+ }
+ else if (N32_OP6 (re_insn) == N32_OP6_BR2
+ && foff >= -CONSERVATIVE_16BIT_S1 && foff < CONSERVATIVE_16BIT_S1)
+ {
+ /* beqz label ; 17_PCREL. */
+ bfd_putb32 (re_insn, contents + cond_irel->r_offset);
+ reloc = R_NDS32_17_PCREL_RELA;
+ }
+ else if ( N32_OP6 (re_insn) == N32_OP6_BR3
+ && foff >= -CONSERVATIVE_8BIT_S1 && foff < CONSERVATIVE_8BIT_S1)
+ {
+ /* beqc label ; 9_PCREL. */
+ bfd_putb32 (re_insn, contents + cond_irel->r_offset);
+ reloc = R_NDS32_WORD_9_PCREL_RELA;
+ }
+ else
+ return FALSE;
+
+ /* Set all relocations. */
+ cond_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), reloc);
+
+ /* Clean relocations. */
+ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
+ for (i = 0; i < ARRAY_SIZE (checked_types); i++)
+ {
+ cond_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ checked_types[i], laddr);
+ if (cond_irel != irelend)
+ {
+ if (*seq_len == 0
+ && (ELF32_R_TYPE (cond_irel->r_info) == R_NDS32_INSN16))
+ {
+ /* If the branch instruction is 2 byte, it cannot remove
+ directly. Only convert it to nop16 and remove it after
+ checking alignment issue. */
+ insn16 = NDS32_NOP16;
+ bfd_putb16 (insn16, contents + laddr);
+ cond_irel->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
+ }
+ else
+ cond_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info),
+ R_NDS32_NONE);
+ }
+ }
+ *insn_len = 0;
+
+ return TRUE;
+}
+
+/* Relax LONGJUMP6 relocation for nds32_elf_relax_section.*/
+
+static bfd_boolean
+nds32_elf_relax_longjump6 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
+ Elf_Internal_Rela *internal_relocs, int *insn_len,
+ int *seq_len, bfd_byte *contents,
+ Elf_Internal_Sym *isymbuf,
+ Elf_Internal_Shdr *symtab_hdr)
+{
+ /* There are 5 variations for LONGJUMP6
+ case : 2-4-4-4; 1st insn convertible, 16-bit on.
+ bnes38 rt, ra, .L1 ; LONGJUMP6/15_PCREL/INSN16
+ sethi ta, hi20(symbol) ; HI20/PTR
+ ori ta, ta, lo12(symbol) ; LO12S0_ORI/PTR
+ jr ta ; PTR_RES/INSN16/EMPTY
+ .L1:
+
+ case : 4-4-4-4; 1st insn not convertible, 16-bit on.
+ bne rt, ra, .L1 ; LONGJUMP6/15_PCREL/INSN16
+ sethi ta, hi20(symbol) ; HI20/PTR
+ ori ta, ta, lo12(symbol) ; LO12S0_ORI/PTR
+ jr ta ; PTR_RES/INSN16/EMPTY
+ .L1: */
+
+ enum elf_nds32_reloc_type checked_types[] =
+ { R_NDS32_17_PCREL_RELA, R_NDS32_15_PCREL_RELA,
+ R_NDS32_9_PCREL_RELA, R_NDS32_INSN16 };
+
+ int reloc_off = 0, cond_removed = 0;
+ bfd_vma laddr;
+ Elf_Internal_Rela *cond_irel, *em_irel, *irelend, *insn_irel;
+ unsigned int i;
+ bfd_signed_vma foff;
+ uint32_t insn, re_insn = 0;
+ uint16_t insn16, re_insn16 = 0;
+ unsigned long reloc;
+
+ irelend = internal_relocs + sec->reloc_count;
+ laddr = irel->r_offset;
+
+ /* Get the reloc for the address from which the register is
+ being loaded. This reloc will tell us which function is
+ actually being called. */
+ em_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ R_NDS32_EMPTY, irel->r_addend);
+
+ if (em_irel == irelend)
+ {
+ (*_bfd_error_handler)
+ ("%B: warning: R_NDS32_LONGJUMP6 points to unrecognized"
+ "reloc at 0x%lx.", abfd, (long) irel->r_offset);
+ return FALSE;
+ }
+
+ /* Get the value of the symbol referred to by the reloc. */
+ foff = calculate_offset (abfd, sec, em_irel, isymbuf, symtab_hdr);
+
+ if (foff == 0 || foff < -CONSERVATIVE_24BIT_S1
+ || foff >= CONSERVATIVE_24BIT_S1)
+ return FALSE;
+
+ insn = bfd_getb32 (contents + laddr);
+ /* Check instruction size. */
+ if (insn & 0x80000000)
+ {
+ *seq_len = 0;
+ insn16 = insn >> 16;
+ nds32_elf_convert_branch (insn16, 0, &re_insn16, &re_insn);
+ }
+ else
+ nds32_elf_convert_branch (0, insn, &re_insn16, &re_insn);
+
+ /* For simplicity of coding, we are going to modify the section
+ contents, the section relocs, and the BFD symbol table. We
+ must tell the rest of the code not to free up this
+ information. It would be possible to instead create a table
+ of changes which have to be made, as is done in coff-mips.c;
+ that would be more work, but would require less memory when
+ the linker is run. */
+
+ if (N32_OP6 (re_insn) == N32_OP6_BR1
+ && (foff >= -CONSERVATIVE_14BIT_S1 && foff < CONSERVATIVE_14BIT_S1))
+ {
+ /* beqs label ; 15_PCREL */
+ bfd_putb32 (re_insn, contents + em_irel->r_offset);
+ reloc = R_NDS32_15_PCREL_RELA;
+ cond_removed = 1;
+ }
+ else if (N32_OP6 (re_insn) == N32_OP6_BR2
+ && foff >= -CONSERVATIVE_16BIT_S1 && foff < CONSERVATIVE_16BIT_S1)
+ {
+ /* beqz label ; 17_PCREL */
+ bfd_putb32 (re_insn, contents + em_irel->r_offset);
+ reloc = R_NDS32_17_PCREL_RELA;
+ cond_removed = 1;
+ }
+ else if (foff >= -CONSERVATIVE_24BIT_S1 - reloc_off
+ && foff < CONSERVATIVE_24BIT_S1 - reloc_off)
+ {
+ /* Relax to one of the following 2 variations
+
+ case 2-4; 1st insn convertible, 16-bit on.
+ bnes38 rt, ra, .L1 ; LONGJUMP5/9_PCREL/INSN16
+ j label ; 25_PCREL/INSN16
+ $1:
+
+ case 4-4; 1st insn not convertible
+ bne rt, ra, .L1 ; LONGJUMP5/15_PCREL/INSN16
+ j label ; 25_PCREL/INSN16
+ .L1: */
+
+ /* Use j label as second instruction. */
+ insn = INSN_J;
+ reloc = R_NDS32_25_PCREL_RELA;
+ bfd_putb32 (insn, contents + em_irel->r_offset);
+ }
+ else
+ return FALSE;
+
+ /* Set all relocations. */
+ em_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (em_irel->r_info), reloc);
+
+ cond_irel =
+ find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ R_NDS32_PTR_RESOLVED, em_irel->r_offset);
+ cond_irel->r_addend = 1;
+
+ /* Use INSN16 of first branch instruction to distinguish if keeping
+ INSN16 of final instruction or not. */
+ insn_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ R_NDS32_INSN16, irel->r_offset);
+ if (insn_irel == irelend)
+ {
+ /* Clean the final INSN16. */
+ insn_irel =
+ find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ R_NDS32_INSN16, em_irel->r_offset);
+ insn_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info),
+ R_NDS32_NONE);
+ }
+
+ if (cond_removed == 1)
+ {
+ *insn_len = 0;
+
+ /* Clear relocations. */
+ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
+
+ for (i = 0; i < ARRAY_SIZE (checked_types); i++)
+ {
+ cond_irel =
+ find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ checked_types[i], laddr);
+ if (cond_irel != irelend)
+ {
+ if (*seq_len == 0
+ && (ELF32_R_TYPE (cond_irel->r_info) == R_NDS32_INSN16))
+ {
+ /* If the branch instruction is 2 byte, it cannot remove
+ directly. Only convert it to nop16 and remove it after
+ checking alignment issue. */
+ insn16 = NDS32_NOP16;
+ bfd_putb16 (insn16, contents + laddr);
+ cond_irel->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
+ }
+ else
+ cond_irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info), R_NDS32_NONE);
+ }
+ }
+ }
+ else
+ {
+ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
+ R_NDS32_LONGJUMP5);
+ }
+
+ return TRUE;
+}
+
+/* Relax LONGJUMP7 relocation for nds32_elf_relax_section.*/
+
+static bfd_boolean
+nds32_elf_relax_longjump7 (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
+ Elf_Internal_Rela *internal_relocs, int *insn_len,
+ int *seq_len, bfd_byte *contents,
+ Elf_Internal_Sym *isymbuf,
+ Elf_Internal_Shdr *symtab_hdr)
+{
+ /* There are 2 variations for LONGJUMP5
+ case 2-4; 1st insn convertible, 16-bit on.
+ movi55 ta, imm11 ; LONGJUMP7/INSN16
+ beq rt, ta, label ; 15_PCREL
+
+ case 4-4; 1st insn not convertible
+ movi55 ta, imm11 ; LONGJUMP7/INSN16
+ beq rt, ta, label ; 15_PCREL */
+
+ bfd_vma laddr;
+ Elf_Internal_Rela *cond_irel, *irelend, *insn_irel;
+ bfd_signed_vma foff;
+ uint32_t insn, re_insn = 0;
+ uint16_t insn16;
+ uint32_t imm11;
+
+ irelend = internal_relocs + sec->reloc_count;
+ laddr = irel->r_offset;
+
+ /* Get the reloc for the address from which the register is
+ being loaded. This reloc will tell us which function is
+ actually being called. */
+
+ cond_irel =
+ find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ R_NDS32_15_PCREL_RELA, irel->r_addend);
+ if (cond_irel == irelend)
+ {
+ (*_bfd_error_handler)
+ ("%B: warning: R_NDS32_LONGJUMP7 points to unrecognized"
+ "reloc at 0x%lx.", abfd, (long) irel->r_offset);
+ return FALSE;
+ }
+
+ /* Get the value of the symbol referred to by the reloc. */
+ foff = calculate_offset (abfd, sec, cond_irel, isymbuf, symtab_hdr);
+
+ if (foff == 0 || foff < -CONSERVATIVE_8BIT_S1
+ || foff >= CONSERVATIVE_8BIT_S1)
+ return FALSE;
+
+ /* Get the first instruction for its size. */
+ insn = bfd_getb32 (contents + laddr);
+ if (insn & 0x80000000)
+ {
+ *seq_len = 0;
+ /* Get the immediate from movi55. */
+ imm11 = N16_IMM5S (insn >> 16);
+ }
+ else
+ {
+ /* Get the immediate from movi. */
+ imm11 = N32_IMM20S (insn);
+ }
+
+ /* Get the branch instruction. */
+ insn = bfd_getb32 (contents + irel->r_addend);
+ /* Convert instruction to BR3. */
+ if ((insn >> 14) & 0x1)
+ re_insn = N32_BR3 (BNEC, N32_RT5 (insn), imm11, 0);
+ else
+ re_insn = N32_BR3 (BEQC, N32_RT5 (insn), imm11, 0);
+
+ bfd_putb32 (re_insn, contents + cond_irel->r_offset);
+
+ /* Set all relocations. */
+ cond_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info),
+ R_NDS32_WORD_9_PCREL_RELA);
+
+ /* Clean relocations. */
+ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
+ insn_irel = find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ R_NDS32_INSN16, irel->r_offset);
+ if (insn_irel != irelend)
+ {
+ if (*seq_len == 0)
+ {
+ /* If the first insntruction is 16bit, convert it to nop16. */
+ insn16 = NDS32_NOP16;
+ bfd_putb16 (insn16, contents + laddr);
+ insn_irel->r_addend = R_NDS32_INSN16_CONVERT_FLAG;
+ }
+ else
+ cond_irel->r_info = ELF32_R_INFO (ELF32_R_SYM (cond_irel->r_info),
+ R_NDS32_NONE);
+ }
+ *insn_len = 0;
+
+ return TRUE;
+}
+
+/* Record the offset to gp, and check if it changed after relaxing.
+ If the offset is fixed or the offset is near enough, try to relax
+ the pattern. This is avoid truncated to fit when relaxing fixed
+ address symbol. Ex: _stack. */
+static bfd_boolean
+nds32_elf_relax_guard (bfd_vma *access_addr, bfd_vma local_sda, asection *sec,
+ Elf_Internal_Rela *irel, bfd_boolean *again,
+ bfd_boolean init,
+ struct elf_nds32_link_hash_table *table,
+ Elf_Internal_Sym *isymbuf, Elf_Internal_Shdr *symtab_hdr)
+
+{
+ /* The default linker script value. */
+ int offset_to_gp;
+ static bfd_boolean sec_pass = FALSE;
+ static asection *first_sec = NULL, *sym_sec;
+ /* Record the number of instructions which may be removed. */
+ static int count = 0, record_count;
+ Elf_Internal_Sym *isym;
+ struct elf_link_hash_entry *h = NULL;
+ int indx;
+ unsigned long r_symndx;
+ bfd *abfd = sec->owner;
+ static bfd_vma record_sda = 0;
+ int sda_offset = 0;
+
+ /* Force doing relaxation when hyper-relax is high. */
+ if (table->hyper_relax == 2)
+ return TRUE;
+
+ /* Record the first section to get the round. */
+ if (init)
+ {
+ if (!first_sec)
+ first_sec = sec;
+ else if (first_sec == sec)
+ {
+ record_count = count;
+ count = 0;
+ sec_pass = TRUE;
+ }
+
+ if (!sec_pass)
+ *again = TRUE;
+
+ return TRUE;;
+ }
+
+ if (record_sda == 0)
+ record_sda = local_sda;
+ else if (local_sda > record_sda)
+ /* In normal case, SDA is fixed or smaller except there is
+ DATA_SEGMENT_ALIGN in linker script.*/
+ sda_offset = local_sda - record_sda;
+
+ /* Although we doesn't delete all instructions here, counting all of
+ them to be conservative. */
+ count++;
+
+ r_symndx = ELF32_R_SYM (irel->r_info);
+ /* Global symbols. */
+ if (r_symndx >= symtab_hdr->sh_info)
+ {
+ indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
+ h = elf_sym_hashes (abfd)[indx];
+ sym_sec = h->root.u.def.section;
+ if (NDS32_GUARD_SEC_P (sym_sec->flags)
+ || bfd_is_abs_section (sym_sec))
+ {
+ /* Forbid doing relaxation when hyper-relax is low. */
+ if (table->hyper_relax == 0)
+ return FALSE;
+
+ offset_to_gp = *access_addr - local_sda;
+ if (elf32_nds32_hash_entry (h)->offset_to_gp == 0)
+ elf32_nds32_hash_entry (h)->offset_to_gp = offset_to_gp;
+ else if (abs (elf32_nds32_hash_entry (h)->offset_to_gp)
+ < abs (offset_to_gp) - sda_offset)
+ {
+ if (*access_addr >= local_sda)
+ *access_addr += (record_count * 4);
+ else
+ *access_addr -= (record_count * 4);
+ }
+ return sec_pass;
+ }
+ }
+ else
+ {
+ if (!elf32_nds32_allocate_local_sym_info (abfd))
+ return FALSE;
+ isym = isymbuf + r_symndx;
+
+ sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
+ if (NDS32_GUARD_SEC_P (sym_sec->flags))
+ {
+ /* Forbid doing relaxation when hyper-relax is low. */
+ if (table->hyper_relax == 0)
+ return FALSE;
+
+ offset_to_gp = *access_addr - local_sda;
+ if (elf32_nds32_local_gp_offset (abfd)[r_symndx] == 0)
+ elf32_nds32_local_gp_offset (abfd)[r_symndx] = offset_to_gp;
+ else if (abs (elf32_nds32_local_gp_offset (abfd)[r_symndx])
+ < abs (offset_to_gp) - sda_offset)
+ {
+ if (*access_addr >= local_sda)
+ *access_addr += (record_count * 4);
+ else
+ *access_addr -= (record_count * 4);
+ }
+ return sec_pass;
+ }
+ }
+
+ return TRUE;
+}
+#define GET_LOADSTORE_RANGE(addend) (((addend) >> 8) & 0x3f)
+
+/* Relax LOADSTORE relocation for nds32_elf_relax_section. */
+
+static bfd_boolean
+nds32_elf_relax_loadstore (struct bfd_link_info *link_info, bfd *abfd,
+ asection *sec, Elf_Internal_Rela *irel,
+ Elf_Internal_Rela *internal_relocs, int *insn_len,
+ bfd_byte *contents, Elf_Internal_Sym *isymbuf,
+ Elf_Internal_Shdr *symtab_hdr, int load_store_relax,
+ struct elf_nds32_link_hash_table *table)
+{
+ int eliminate_sethi = 0, range_type, i;
+ bfd_vma local_sda, laddr;
+ int seq_len; /* Original length of instruction sequence. */
+ uint32_t insn;
+ Elf_Internal_Rela *hi_irelfn = NULL, *irelend;
+ bfd_vma access_addr = 0;
+ bfd_vma range_l = 0, range_h = 0; /* Upper/lower bound. */
+ enum elf_nds32_reloc_type checked_types[] =
+ { R_NDS32_HI20_RELA, R_NDS32_GOT_HI20,
+ R_NDS32_GOTPC_HI20, R_NDS32_GOTOFF_HI20,
+ R_NDS32_PLTREL_HI20, R_NDS32_PLT_GOTREL_HI20,
+ R_NDS32_TLS_LE_HI20, R_NDS32_TLS_IE_HI20,
+ R_NDS32_TLS_IEGP_HI20, R_NDS32_TLS_DESC_HI20
+ };
+
+ irelend = internal_relocs + sec->reloc_count;
+ seq_len = GET_SEQ_LEN (irel->r_addend);
+ laddr = irel->r_offset;
+ *insn_len = seq_len;
+
+ /* Get the high part relocation. */
+ for (i = 0; (unsigned) i < ARRAY_SIZE (checked_types); i++)
+ {
+ hi_irelfn = find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ checked_types[i], laddr);
+ if (hi_irelfn != irelend)
+ break;
+ }
+
+ if (hi_irelfn == irelend)
+ {
+ (*_bfd_error_handler)
+ ("%B: warning: R_NDS32_LOADSTORE points to unrecognized "
+ "reloc at 0x%lx.", abfd, (long) irel->r_offset);
+ return FALSE;
+ }
+
+ range_type = GET_LOADSTORE_RANGE (irel->r_addend);
+ nds32_elf_final_sda_base (sec->output_section->owner,
+ link_info, &local_sda, FALSE);
+
+ switch (ELF32_R_TYPE (hi_irelfn->r_info))
+ {
+ case R_NDS32_HI20_RELA:
+ insn = bfd_getb32 (contents + laddr);
+ access_addr =
+ calculate_memory_address (abfd, hi_irelfn, isymbuf, symtab_hdr);
+
+ /* Try movi. */
+ if (range_type == NDS32_LOADSTORE_IMM)
+ {
+ struct elf_link_hash_entry *h = NULL;
+ int indx;
+
+ if (ELF32_R_SYM (hi_irelfn->r_info) >= symtab_hdr->sh_info)
+ {
+ indx = ELF32_R_SYM (hi_irelfn->r_info) - symtab_hdr->sh_info;
+ h = elf_sym_hashes (abfd)[indx];
+ }
+
+ if ((access_addr < CONSERVATIVE_20BIT)
+ && (!h || (h && strcmp (h->root.root.string, FP_BASE_NAME) != 0)))
+ {
+ eliminate_sethi = 1;
+ break;
+ }
+ }
+
+ if (!nds32_elf_relax_guard (&access_addr, local_sda, sec, hi_irelfn,
+ NULL, FALSE, table, isymbuf, symtab_hdr))
+ return FALSE;
+
+
+ if (!load_store_relax)
+ return FALSE;
+
+ /* Case for set gp register. */
+ if (N32_RT5 (insn) == REG_GP)
+ break;
+
+ if (range_type == NDS32_LOADSTORE_FLOAT_S
+ || range_type == NDS32_LOADSTORE_FLOAT_S)
+ {
+ range_l = sdata_range[0][0];
+ range_h = sdata_range[0][1];
+ }
+ else
+ {
+ range_l = sdata_range[1][0];
+ range_h = sdata_range[1][1];
+ }
+ break;
+
+ case R_NDS32_GOT_HI20:
+ access_addr =
+ calculate_got_memory_address (abfd, link_info, hi_irelfn, symtab_hdr);
+
+ /* If this symbol is not in .got, the return value will be -1.
+ Since the gp value is set to SDA_BASE but not GLOBAL_OFFSET_TABLE,
+ a negative offset is allowed. */
+ if ((bfd_signed_vma) (access_addr - local_sda) < CONSERVATIVE_20BIT
+ && (bfd_signed_vma) (access_addr - local_sda) >= -CONSERVATIVE_20BIT)
+ eliminate_sethi = 1;
+ break;
+
+ case R_NDS32_PLT_GOTREL_HI20:
+ access_addr = calculate_plt_memory_address (abfd, link_info, isymbuf,
+ hi_irelfn, symtab_hdr);
+
+ if ((bfd_signed_vma) (access_addr - local_sda) < CONSERVATIVE_20BIT
+ && (bfd_signed_vma) (access_addr - local_sda) >= -CONSERVATIVE_20BIT)
+ eliminate_sethi = 1;
+ break;
+
+ case R_NDS32_GOTOFF_HI20:
+ access_addr =
+ calculate_memory_address (abfd, hi_irelfn, isymbuf, symtab_hdr);
+
+ if ((bfd_signed_vma) (access_addr - local_sda) < CONSERVATIVE_20BIT
+ && (bfd_signed_vma) (access_addr - local_sda) >= -CONSERVATIVE_20BIT)
+ eliminate_sethi = 1;
+ break;
+
+ case R_NDS32_GOTPC_HI20:
+ /* The access_addr must consider r_addend of hi_irel. */
+ access_addr = sec->output_section->vma + sec->output_offset
+ + irel->r_offset + hi_irelfn->r_addend;
+
+ if ((bfd_signed_vma) (local_sda - access_addr) < CONSERVATIVE_20BIT
+ && (bfd_signed_vma) (local_sda - access_addr) >= -CONSERVATIVE_20BIT)
+ eliminate_sethi = 1;
+ break;
+
+ case R_NDS32_TLS_LE_HI20:
+ access_addr =
+ calculate_memory_address (abfd, hi_irelfn, isymbuf, symtab_hdr);
+ BFD_ASSERT (elf_hash_table (link_info)->tls_sec != NULL);
+ access_addr -= (elf_hash_table (link_info)->tls_sec->vma + TP_OFFSET);
+ if ((range_type == NDS32_LOADSTORE_IMM)
+ && (bfd_signed_vma) (access_addr) < CONSERVATIVE_20BIT
+ && (bfd_signed_vma) (access_addr) >= -CONSERVATIVE_20BIT)
+ eliminate_sethi = 1;
+ break;
+
+ /* TODO: TLS IE/IEGP */
+ case R_NDS32_TLS_IE_HI20:
+ case R_NDS32_TLS_IEGP_HI20:
+ break;
+
+ /* TODO: TLS DESC */
+ case R_NDS32_TLS_DESC_HI20:
+ break;
+
+ default:
+ return FALSE;
+ }
+
+ /* Delete sethi instruction. */
+ if (eliminate_sethi == 1
+ || (local_sda <= access_addr && (access_addr - local_sda) < range_h)
+ || (local_sda > access_addr && (local_sda - access_addr) <= range_l))
+ {
+ hi_irelfn->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (hi_irelfn->r_info), R_NDS32_NONE);
+ irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
+ *insn_len = 0;
+ }
+ return TRUE;
+}
+
+/* Relax LO12 relocation for nds32_elf_relax_section.*/
+
+static void
+nds32_elf_relax_lo12 (struct bfd_link_info *link_info, bfd *abfd,
+ asection *sec, Elf_Internal_Rela *irel,
+ Elf_Internal_Rela *internal_relocs, bfd_byte *contents,
+ Elf_Internal_Sym *isymbuf, Elf_Internal_Shdr *symtab_hdr,
+ struct elf_nds32_link_hash_table *table)
+{
+ uint32_t insn;
+ bfd_vma local_sda, laddr;
+ unsigned long reloc;
+ bfd_vma access_addr;
+ bfd_vma range_l = 0, range_h = 0; /* Upper/lower bound. */
+ Elf_Internal_Rela *irelfn = NULL, *irelend;
+ struct elf_link_hash_entry *h = NULL;
+ int indx;
+
+ /* For SDA base relative relaxation. */
+ nds32_elf_final_sda_base (sec->output_section->owner, link_info,
+ &local_sda, FALSE);
+
+ irelend = internal_relocs + sec->reloc_count;
+ laddr = irel->r_offset;
+ insn = bfd_getb32 (contents + laddr);
+
+ if (!is_sda_access_insn (insn) && N32_OP6 (insn) != N32_OP6_ORI)
+ return;
+
+ access_addr = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr);
+
+ if (ELF32_R_SYM (irel->r_info) >= symtab_hdr->sh_info)
+ {
+ indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
+ h = elf_sym_hashes (abfd)[indx];
+ }
+
+ /* Try movi. */
+ if (N32_OP6 (insn) == N32_OP6_ORI && access_addr < CONSERVATIVE_20BIT
+ && (!h || (h && strcmp (h->root.root.string, FP_BASE_NAME) != 0)))
+ {
+ reloc = R_NDS32_20_RELA;
+ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), reloc);
+ insn = N32_TYPE1 (MOVI, N32_RT5 (insn), 0);
+ bfd_putb32 (insn, contents + laddr);
+ }
+ else
+ {
+ if (!nds32_elf_relax_guard (&access_addr, local_sda, sec, irel, NULL,
+ FALSE, table, isymbuf, symtab_hdr))
+ return;
+
+ range_l = sdata_range[1][0];
+ range_h = sdata_range[1][1];
+ switch (ELF32_R_TYPE (irel->r_info))
+ {
+ case R_NDS32_LO12S0_RELA:
+ reloc = R_NDS32_SDA19S0_RELA;
+ break;
+ case R_NDS32_LO12S1_RELA:
+ reloc = R_NDS32_SDA18S1_RELA;
+ break;
+ case R_NDS32_LO12S2_RELA:
+ reloc = R_NDS32_SDA17S2_RELA;
+ break;
+ case R_NDS32_LO12S2_DP_RELA:
+ range_l = sdata_range[0][0];
+ range_h = sdata_range[0][1];
+ reloc = R_NDS32_SDA12S2_DP_RELA;
+ break;
+ case R_NDS32_LO12S2_SP_RELA:
+ range_l = sdata_range[0][0];
+ range_h = sdata_range[0][1];
+ reloc = R_NDS32_SDA12S2_SP_RELA;
+ break;
+ default:
+ return;
+ }
+
+ /* There are range_h and range_l because linker has to promise
+ all sections move cross one page together. */
+ if ((local_sda <= access_addr && (access_addr - local_sda) < range_h)
+ || (local_sda > access_addr && (local_sda - access_addr) <= range_l))
+ {
+ if (N32_OP6 (insn) == N32_OP6_ORI && N32_RT5 (insn) == REG_GP)
+ {
+ /* Maybe we should add R_NDS32_INSN16 reloc type here
+ or manually do some optimization. sethi can't be
+ eliminated when updating $gp so the relative ori
+ needs to be preserved. */
+ return;
+ }
+ if (!turn_insn_to_sda_access (insn, ELF32_R_TYPE (irel->r_info),
+ &insn))
+ return;
+ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), reloc);
+ bfd_putb32 (insn, contents + laddr);
+
+ irelfn = find_relocs_at_address (irel, internal_relocs, irelend,
+ R_NDS32_INSN16);
+ /* SDA17 must keep INSN16 for converting fp_as_gp. */
+ if (irelfn != irelend && reloc != R_NDS32_SDA17S2_RELA)
+ irelfn->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (irelfn->r_info), R_NDS32_NONE);
+
+ }
+ }
+ return;
+}
+
+/* Relax low part of PIC instruction pattern. */
+
+static void
+nds32_elf_relax_piclo12 (struct bfd_link_info *link_info, bfd *abfd,
+ asection *sec, Elf_Internal_Rela *irel,
+ bfd_byte *contents, Elf_Internal_Sym *isymbuf,
+ Elf_Internal_Shdr *symtab_hdr)
+{
+ uint32_t insn;
+ bfd_vma local_sda, laddr;
+ bfd_signed_vma foff;
+ unsigned long reloc;
+
+ nds32_elf_final_sda_base (sec->output_section->owner, link_info,
+ &local_sda, FALSE);
+ laddr = irel->r_offset;
+ insn = bfd_getb32 (contents + laddr);
+
+ if (N32_OP6 (insn) != N32_OP6_ORI)
+ return;
+
+ if (ELF32_R_TYPE (irel->r_info) == R_NDS32_GOT_LO12)
+ {
+ foff = calculate_got_memory_address (abfd, link_info, irel,
+ symtab_hdr) - local_sda;
+ reloc = R_NDS32_GOT20;
+ }
+ else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_PLT_GOTREL_LO12)
+ {
+ foff = calculate_plt_memory_address (abfd, link_info, isymbuf, irel,
+ symtab_hdr) - local_sda;
+ reloc = R_NDS32_PLT_GOTREL_LO20;
+ }
+ else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_GOTOFF_LO12)
+ {
+ foff = calculate_memory_address (abfd, irel, isymbuf,
+ symtab_hdr) - local_sda;
+ reloc = R_NDS32_GOTOFF;
+ }
+ else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_GOTPC_LO12)
+ {
+ foff = local_sda - sec->output_section->vma + sec->output_offset
+ + irel->r_offset + irel->r_addend;
+ reloc = R_NDS32_GOTPC20;
+ }
+ else
+ return;
+
+ if ((foff < CONSERVATIVE_20BIT) && (foff >= -CONSERVATIVE_20BIT))
+ {
+ /* Turn into MOVI. */
+ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), reloc);
+ insn = N32_TYPE1 (MOVI, N32_RT5 (insn), 0);
+ bfd_putb32 (insn, contents + laddr);
+ }
+}
+
+/* Relax low part of LE TLS instruction pattern. */
+
+static void
+nds32_elf_relax_letlslo12 (struct bfd_link_info *link_info, bfd *abfd,
+ Elf_Internal_Rela *irel,
+ bfd_byte *contents, Elf_Internal_Sym *isymbuf,
+ Elf_Internal_Shdr *symtab_hdr)
+{
+ uint32_t insn;
+ bfd_vma laddr;
+ bfd_signed_vma foff;
+ unsigned long reloc;
+
+ laddr = irel->r_offset;
+ foff = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr);
+ BFD_ASSERT (elf_hash_table (link_info)->tls_sec != NULL);
+ foff -= (elf_hash_table (link_info)->tls_sec->vma + TP_OFFSET);
+ insn = bfd_getb32 (contents + laddr);
+
+ if ( (bfd_signed_vma) (foff) < CONSERVATIVE_20BIT
+ && (bfd_signed_vma) (foff) >= -CONSERVATIVE_20BIT)
+ {
+ /* Pattern sethi-ori transform to movi. */
+ reloc = R_NDS32_TLS_LE_20;
+ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), reloc);
+ insn = N32_TYPE1 (MOVI, N32_RT5 (insn), 0);
+ bfd_putb32 (insn, contents + laddr);
+ }
+}
+
+/* Relax LE TLS calculate address instruction pattern. */
+
+static void
+nds32_elf_relax_letlsadd (struct bfd_link_info *link_info, bfd *abfd,
+ asection *sec, Elf_Internal_Rela *irel,
+ Elf_Internal_Rela *internal_relocs,
+ bfd_byte *contents, Elf_Internal_Sym *isymbuf,
+ Elf_Internal_Shdr *symtab_hdr, bfd_boolean *again)
+{
+ /* Local TLS non-pic
+ sethi ta, hi20(symbol@tpoff) ; TLS_LE_HI20
+ ori ta, ta, lo12(symbol@tpoff) ; TLS_LE_LO12
+ add ra, ta, tp ; TLS_LE_ADD */
+
+ uint32_t insn;
+ bfd_vma laddr;
+ bfd_signed_vma foff;
+ Elf_Internal_Rela *i1_irelfn, *irelend;
+
+ irelend = internal_relocs + sec->reloc_count;
+ laddr = irel->r_offset;
+ insn = bfd_getb32 (contents + laddr);
+ i1_irelfn = find_relocs_at_address (irel, internal_relocs, irelend,
+ R_NDS32_PTR_RESOLVED);
+ foff = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr);
+ BFD_ASSERT (elf_hash_table (link_info)->tls_sec != NULL);
+ foff -= (elf_hash_table (link_info)->tls_sec->vma + TP_OFFSET);
+
+ /* The range is +/-16k. */
+ if ((bfd_signed_vma) (foff) < CONSERVATIVE_15BIT
+ && (bfd_signed_vma) (foff) >= -CONSERVATIVE_15BIT)
+ {
+ /* Transform add to addi. */
+ insn = N32_TYPE2 (ADDI, N32_RT5 (insn), N32_RB5 (insn), 0);
+ irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_TLS_LE_15S0);
+
+ bfd_putb32 (insn, contents + laddr);
+ if (i1_irelfn != irelend)
+ {
+ i1_irelfn->r_addend |= 1;
+ *again = TRUE;
+ }
+ }
+}
+
+/* Relax LE TLS load store instruction pattern. */
+
+static void
+nds32_elf_relax_letlsls (struct bfd_link_info *link_info, bfd *abfd,
+ asection *sec, Elf_Internal_Rela *irel,
+ Elf_Internal_Rela *internal_relocs,
+ bfd_byte *contents, Elf_Internal_Sym *isymbuf,
+ Elf_Internal_Shdr *symtab_hdr, bfd_boolean *again)
+{
+ uint32_t insn;
+ bfd_vma laddr;
+ bfd_signed_vma foff;
+ Elf_Internal_Rela *i1_irelfn, *irelend;
+ int success = 0;
+
+ irelend = internal_relocs + sec->reloc_count;
+ laddr = irel->r_offset;
+ insn = bfd_getb32 (contents + laddr);
+ i1_irelfn = find_relocs_at_address (irel, internal_relocs, irelend,
+ R_NDS32_PTR_RESOLVED);
+ foff = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr);
+ BFD_ASSERT (elf_hash_table (link_info)->tls_sec != NULL);
+ foff -= (elf_hash_table (link_info)->tls_sec->vma + TP_OFFSET);
+
+ switch ((N32_OP6 (insn) << 8) | (insn & 0xff))
+ {
+ case (N32_OP6_MEM << 8) | N32_MEM_LB:
+ case (N32_OP6_MEM << 8) | N32_MEM_SB:
+ case (N32_OP6_MEM << 8) | N32_MEM_LBS:
+ /* The range is +/-16k. */
+ if ((bfd_signed_vma) (foff) < CONSERVATIVE_15BIT
+ && (bfd_signed_vma) (foff) >= -CONSERVATIVE_15BIT)
+ {
+ insn =
+ ((insn & 0xff) << 25) | (insn & 0x1f00000) | ((insn & 0x7c00) << 5);
+ irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_TLS_LE_15S0);
+ success = 1;
+ break;
+ }
+ case (N32_OP6_MEM << 8) | N32_MEM_LH:
+ case (N32_OP6_MEM << 8) | N32_MEM_SH:
+ case (N32_OP6_MEM << 8) | N32_MEM_LHS:
+ /* The range is +/-32k. */
+ if ((bfd_signed_vma) (foff) < CONSERVATIVE_15BIT_S1
+ && (bfd_signed_vma) (foff) >= -CONSERVATIVE_15BIT_S1)
+ {
+ insn =
+ ((insn & 0xff) << 25) | (insn & 0x1f00000) | ((insn & 0x7c00) << 5);
+ irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_TLS_LE_15S1);
+ success = 1;
+ break;
+ }
+ case (N32_OP6_MEM << 8) | N32_MEM_LW:
+ case (N32_OP6_MEM << 8) | N32_MEM_SW:
+ /* The range is +/-64k. */
+ if ((bfd_signed_vma) (foff) < CONSERVATIVE_15BIT_S2
+ && (bfd_signed_vma) (foff) >= -CONSERVATIVE_15BIT_S2)
+ {
+ insn =
+ ((insn & 0xff) << 25) | (insn & 0x1f00000) | ((insn & 0x7c00) << 5);
+ irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_TLS_LE_15S2);
+ success = 1;
+ break;
+ }
+ default:
+ break;
+ }
+
+ if (success)
+ {
+ bfd_putb32 (insn, contents + laddr);
+ if (i1_irelfn != irelend)
+ {
+ i1_irelfn->r_addend |= 1;
+ *again = TRUE;
+ }
+ }
+}
+
+/* Relax PTR relocation for nds32_elf_relax_section. */
+
+static bfd_boolean
+nds32_elf_relax_ptr (bfd *abfd, asection *sec, Elf_Internal_Rela *irel,
+ Elf_Internal_Rela *internal_relocs, int *insn_len,
+ int *seq_len, bfd_byte *contents)
+{
+ Elf_Internal_Rela *ptr_irel, *irelend, *count_irel, *re_irel;
+
+ irelend = internal_relocs + sec->reloc_count;
+
+ re_irel =
+ find_relocs_at_address_addr (irel, internal_relocs, irelend,
+ R_NDS32_PTR_RESOLVED, irel->r_addend);
+
+ if (re_irel == irelend)
+ {
+ (*_bfd_error_handler)
+ ("%B: warning: R_NDS32_PTR points to unrecognized reloc at 0x%lx.",
+ abfd, (long) irel->r_offset);
+ return FALSE;
+ }
+
+ if (re_irel->r_addend != 1)
+ return FALSE;
+
+ /* Pointed target is relaxed and no longer needs this void *,
+ change the type to NONE. */
+ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
+
+ /* Find PTR_COUNT to decide remove it or not. If PTR_COUNT does
+ not exist, it means only count 1 and remove it directly. */
+ /* TODO: I hope we can obsolate R_NDS32_COUNT in the future. */
+ count_irel = find_relocs_at_address (irel, internal_relocs, irelend,
+ R_NDS32_PTR_COUNT);
+ ptr_irel = find_relocs_at_address (irel, internal_relocs, irelend,
+ R_NDS32_PTR);
+ if (count_irel != irelend)
+ {
+ if (--count_irel->r_addend > 0)
+ return FALSE;
+ }
+
+ if (ptr_irel != irelend)
+ return FALSE;
+
+ /* If the PTR_COUNT is already 0, remove current instruction. */
+ *seq_len = nds32_elf_insn_size (abfd, contents, irel->r_offset);
+ *insn_len = 0;
+ return TRUE;
+}
+
+/* Relax PLT_GOT_SUFF relocation for nds32_elf_relax_section. */
+
+static void
+nds32_elf_relax_pltgot_suff (struct bfd_link_info *link_info, bfd *abfd,
+ asection *sec, Elf_Internal_Rela *irel,
+ Elf_Internal_Rela *internal_relocs,
+ bfd_byte *contents, Elf_Internal_Sym *isymbuf,
+ Elf_Internal_Shdr *symtab_hdr, bfd_boolean *again)
+{
+ uint32_t insn;
+ bfd_signed_vma foff;
+ Elf_Internal_Rela *i1_irelfn, *irelend;
+ bfd_vma local_sda, laddr;
+
+ irelend = internal_relocs + sec->reloc_count;
+ laddr = irel->r_offset;
+ insn = bfd_getb32 (contents + laddr);
+
+ /* FIXME: It's a little trouble to turn JRAL5 to JAL since
+ we need additional space. It might be help if we could
+ borrow some space from instructions to be eliminated
+ such as sethi, ori, add. */
+ if (insn & 0x80000000)
+ return;
+
+ if (nds32_elf_check_dup_relocs
+ (irel, internal_relocs, irelend, R_NDS32_PLT_GOT_SUFF))
+ return;
+
+ i1_irelfn =
+ find_relocs_at_address (irel, internal_relocs, irelend,
+ R_NDS32_PTR_RESOLVED);
+
+ /* FIXIT 090606
+ The boundary should be reduced since the .plt section hasn't
+ been created and the address of specific entry is still unknown
+ Maybe the range between the function call and the begin of the
+ .text section can be used to decide if the .plt is in the range
+ of function call. */
+
+ if (N32_OP6 (insn) == N32_OP6_ALU1
+ && N32_SUB5 (insn) == N32_ALU1_ADD)
+ {
+ /* Get the value of the symbol referred to by the reloc. */
+ nds32_elf_final_sda_base (sec->output_section->owner, link_info,
+ &local_sda, FALSE);
+ foff = (bfd_signed_vma) (calculate_plt_memory_address
+ (abfd, link_info, isymbuf, irel,
+ symtab_hdr) - local_sda);
+ /* This condition only happened when symbol is undefined. */
+ if (foff == 0)
+ return;
+
+ if (foff < -CONSERVATIVE_19BIT || foff >= CONSERVATIVE_19BIT)
+ return;
+ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
+ R_NDS32_PLT_GOTREL_LO19);
+ /* addi.gp */
+ insn = N32_TYPE1 (SBGP, N32_RT5 (insn), __BIT (19));
+ }
+ else if (N32_OP6 (insn) == N32_OP6_JREG
+ && N32_SUB5 (insn) == N32_JREG_JRAL)
+ {
+ /* Get the value of the symbol referred to by the reloc. */
+ foff =
+ calculate_plt_offset (abfd, sec, link_info, isymbuf, irel, symtab_hdr);
+ /* This condition only happened when symbol is undefined. */
+ if (foff == 0)
+ return;
+ if (foff < -CONSERVATIVE_24BIT_S1 || foff >= CONSERVATIVE_24BIT_S1)
+ return;
+ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_25_PLTREL);
+ insn = INSN_JAL;
+ }
+ else
+ return;
+
+ bfd_putb32 (insn, contents + laddr);
+ if (i1_irelfn != irelend)
+ {
+ i1_irelfn->r_addend |= 1;
+ *again = TRUE;
+ }
+}
+
+/* Relax GOT_SUFF relocation for nds32_elf_relax_section. */
+
+static void
+nds32_elf_relax_got_suff (struct bfd_link_info *link_info, bfd *abfd,
+ asection *sec, Elf_Internal_Rela *irel,
+ Elf_Internal_Rela *internal_relocs,
+ bfd_byte *contents, Elf_Internal_Shdr *symtab_hdr,
+ bfd_boolean *again)
+{
+ uint32_t insn;
+ bfd_signed_vma foff;
+ Elf_Internal_Rela *i1_irelfn, *irelend;
+ bfd_vma local_sda, laddr;
+
+ irelend = internal_relocs + sec->reloc_count;
+ laddr = irel->r_offset;
+ insn = bfd_getb32 (contents + laddr);
+ if (insn & 0x80000000)
+ return;
+
+ if (nds32_elf_check_dup_relocs
+ (irel, internal_relocs, irelend, R_NDS32_GOT_SUFF))
+ return;
+
+ i1_irelfn = find_relocs_at_address (irel, internal_relocs, irelend,
+ R_NDS32_PTR_RESOLVED);
+
+ nds32_elf_final_sda_base (sec->output_section->owner, link_info,
+ &local_sda, FALSE);
+ foff = calculate_got_memory_address (abfd, link_info, irel,
+ symtab_hdr) - local_sda;
+
+ if (foff < CONSERVATIVE_19BIT && foff >= -CONSERVATIVE_19BIT)
+ {
+ /* Turn LW to LWI.GP. Change relocation type to R_NDS32_GOT_REL. */
+ insn = N32_TYPE1 (HWGP, N32_RT5 (insn), __MF (6, 17, 3));
+ irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_GOT17S2_RELA);
+ bfd_putb32 (insn, contents + laddr);
+ if (i1_irelfn != irelend)
+ {
+ i1_irelfn->r_addend |= 1;
+ *again = TRUE;
+ }
+ }
+}
+
+/* Relax PLT_GOT_SUFF relocation for nds32_elf_relax_section. */
+
+static void
+nds32_elf_relax_gotoff_suff (struct bfd_link_info *link_info, bfd *abfd,
+ asection *sec, Elf_Internal_Rela *irel,
+ Elf_Internal_Rela *internal_relocs,
+ bfd_byte *contents, Elf_Internal_Sym *isymbuf,
+ Elf_Internal_Shdr *symtab_hdr, bfd_boolean *again)
+{
+ int opc_insn_gotoff;
+ uint32_t insn;
+ bfd_signed_vma foff;
+ Elf_Internal_Rela *i1_irelfn, *i2_irelfn, *irelend;
+ bfd_vma local_sda, laddr;
+
+ irelend = internal_relocs + sec->reloc_count;
+ laddr = irel->r_offset;
+ insn = bfd_getb32 (contents + laddr);
+
+ if (insn & 0x80000000)
+ return;
+
+ if (nds32_elf_check_dup_relocs
+ (irel, internal_relocs, irelend, R_NDS32_GOTOFF_SUFF))
+ return;
+
+ i1_irelfn = find_relocs_at_address (irel, internal_relocs, irelend,
+ R_NDS32_PTR_RESOLVED);
+ nds32_elf_final_sda_base (sec->output_section->owner, link_info,
+ &local_sda, FALSE);
+ foff = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr);
+ foff = foff - local_sda;
+
+ if (foff >= CONSERVATIVE_19BIT || foff < -CONSERVATIVE_19BIT)
+ return;
+
+ /* Concatenate opcode and sub-opcode for switch case.
+ It may be MEM or ALU1. */
+ opc_insn_gotoff = (N32_OP6 (insn) << 8) | (insn & 0xff);
+ switch (opc_insn_gotoff)
+ {
+ case (N32_OP6_MEM << 8) | N32_MEM_LW:
+ /* 4-byte aligned. */
+ insn = N32_TYPE1 (HWGP, N32_RT5 (insn), __MF (6, 17, 3));
+ irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA17S2_RELA);
+ break;
+ case (N32_OP6_MEM << 8) | N32_MEM_SW:
+ insn = N32_TYPE1 (HWGP, N32_RT5 (insn), __MF (7, 17, 3));
+ irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA17S2_RELA);
+ break;
+ case (N32_OP6_MEM << 8) | N32_MEM_LH:
+ /* 2-byte aligned. */
+ insn = N32_TYPE1 (HWGP, N32_RT5 (insn), 0);
+ irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA18S1_RELA);
+ break;
+ case (N32_OP6_MEM << 8) | N32_MEM_LHS:
+ insn = N32_TYPE1 (HWGP, N32_RT5 (insn), __BIT (18));
+ irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA18S1_RELA);
+ break;
+ case (N32_OP6_MEM << 8) | N32_MEM_SH:
+ insn = N32_TYPE1 (HWGP, N32_RT5 (insn), __BIT (19));
+ irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA18S1_RELA);
+ break;
+ case (N32_OP6_MEM << 8) | N32_MEM_LB:
+ /* 1-byte aligned. */
+ insn = N32_TYPE1 (LBGP, N32_RT5 (insn), 0);
+ irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA19S0_RELA);
+ break;
+ case (N32_OP6_MEM << 8) | N32_MEM_LBS:
+ insn = N32_TYPE1 (LBGP, N32_RT5 (insn), __BIT (19));
+ irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA19S0_RELA);
+ break;
+ case (N32_OP6_MEM << 8) | N32_MEM_SB:
+ insn = N32_TYPE1 (SBGP, N32_RT5 (insn), 0);
+ irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA19S0_RELA);
+ break;
+ case (N32_OP6_ALU1 << 8) | N32_ALU1_ADD:
+ insn = N32_TYPE1 (SBGP, N32_RT5 (insn), __BIT (19));
+ irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_SDA19S0_RELA);
+ break;
+ default:
+ return;
+ }
+
+ bfd_putb32 (insn, contents + laddr);
+ if (i1_irelfn != irelend)
+ {
+ i1_irelfn->r_addend |= 1;
+ *again = TRUE;
+ }
+ if ((i2_irelfn = find_relocs_at_address (irel, internal_relocs, irelend,
+ R_NDS32_INSN16)) != irelend)
+ i2_irelfn->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
+
+}
+
+static bfd_boolean
+nds32_relax_adjust_label (bfd *abfd, asection *sec,
+ Elf_Internal_Rela *internal_relocs,
+ bfd_byte *contents,
+ nds32_elf_blank_t **relax_blank_list,
+ int optimize, int opt_size)
+{
+ /* This code block is used to adjust 4-byte alignment by relax a pair
+ of instruction a time.
+
+ It recognizes three types of relocations.
+ 1. R_NDS32_LABEL - a alignment.
+ 2. R_NDS32_INSN16 - relax a 32-bit instruction to 16-bit.
+ 3. is_16bit_NOP () - remove a 16-bit instruction. */
+
+ /* TODO: It seems currently implementation only support 4-byte alignment.
+ We should handle any-alignment. */
+
+ Elf_Internal_Rela *insn_rel = NULL, *label_rel = NULL, *irel;
+ Elf_Internal_Rela *tmp_rel, *tmp2_rel = NULL;
+ Elf_Internal_Rela rel_temp;
+ Elf_Internal_Rela *irelend;
+ bfd_vma address;
+ uint16_t insn16;
+
+ /* Checking for branch relaxation relies on the relocations to
+ be sorted on 'r_offset'. This is not guaranteed so we must sort. */
+ nds32_insertion_sort (internal_relocs, sec->reloc_count,
+ sizeof (Elf_Internal_Rela), compar_reloc);
+
+ irelend = internal_relocs + sec->reloc_count;
+
+ /* Force R_NDS32_LABEL before R_NDS32_INSN16. */
+ /* FIXME: Can we generate the right order in assembler?
+ So we don't have to swapping them here. */
+
+ for (label_rel = internal_relocs, insn_rel = internal_relocs;
+ label_rel < irelend; label_rel++)
+ {
+ if (ELF32_R_TYPE (label_rel->r_info) != R_NDS32_LABEL)
+ continue;
+
+ /* Find the first reloc has the same offset with label_rel. */
+ while (insn_rel < irelend && insn_rel->r_offset < label_rel->r_offset)
+ insn_rel++;
+
+ for (;insn_rel < irelend && insn_rel->r_offset == label_rel->r_offset;
+ insn_rel++)
+ /* Check if there were R_NDS32_INSN16 and R_NDS32_LABEL at the same
+ address. */
+ if (ELF32_R_TYPE (insn_rel->r_info) == R_NDS32_INSN16)
+ break;
+
+ if (insn_rel < irelend && insn_rel->r_offset == label_rel->r_offset
+ && insn_rel < label_rel)
+ {
+ /* Swap the two reloc if the R_NDS32_INSN16 is
+ before R_NDS32_LABEL. */
+ memcpy (&rel_temp, insn_rel, sizeof (Elf_Internal_Rela));
+ memcpy (insn_rel, label_rel, sizeof (Elf_Internal_Rela));
+ memcpy (label_rel, &rel_temp, sizeof (Elf_Internal_Rela));
+ }
+ }
+
+ label_rel = NULL;
+ insn_rel = NULL;
+ /* If there were a sequence of R_NDS32_LABEL end up with .align 2
+ or higher, remove other R_NDS32_LABEL with lower alignment.
+ If an R_NDS32_INSN16 in between R_NDS32_LABELs must be converted,
+ then the R_NDS32_LABEL sequence is broke. */
+ for (tmp_rel = internal_relocs; tmp_rel < irelend; tmp_rel++)
+ {
+ if (ELF32_R_TYPE (tmp_rel->r_info) == R_NDS32_LABEL)
+ {
+ if (label_rel == NULL)
+ {
+ if (tmp_rel->r_addend < 2)
+ label_rel = tmp_rel;
+ continue;
+ }
+ else if (tmp_rel->r_addend > 1)
+ {
+ /* Remove all LABEL relocation from label_rel to tmp_rel
+ including relocations with same offset as tmp_rel. */
+ for (tmp2_rel = label_rel; tmp2_rel < tmp_rel; tmp2_rel++)
+ {
+ if (tmp2_rel->r_offset == tmp_rel->r_offset)
+ break;
+
+ if (ELF32_R_TYPE (tmp2_rel->r_info) == R_NDS32_LABEL
+ && tmp2_rel->r_addend < 2)
+ tmp2_rel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (tmp2_rel->r_info),
+ R_NDS32_NONE);
+ }
+ label_rel = NULL;
+ }
+ }
+ else if (ELF32_R_TYPE (tmp_rel->r_info) == R_NDS32_INSN16 && label_rel)
+ {
+ /* A new INSN16 which can be converted, so clear label_rel. */
+ if (is_convert_32_to_16 (abfd, sec, tmp_rel, internal_relocs,
+ irelend, &insn16)
+ || is_16bit_NOP (abfd, sec, tmp_rel))
+ label_rel = NULL;
+ }
+ }
+
+ label_rel = NULL;
+ insn_rel = NULL;
+ /* Optimized for speed and nothing has not been relaxed.
+ It's time to align labels.
+ We may convert a 16-bit instruction right before a label to
+ 32-bit, in order to align the label if necessary
+ all reloc entries has been sorted by r_offset. */
+ for (irel = internal_relocs;
+ irel < irelend && irel->r_offset < sec->size; irel++)
+ {
+ if (ELF32_R_TYPE (irel->r_info) != R_NDS32_INSN16
+ && ELF32_R_TYPE (irel->r_info) != R_NDS32_LABEL)
+ continue;
+
+ if (ELF32_R_TYPE (irel->r_info) == R_NDS32_INSN16)
+ {
+ /* A new INSN16 found, resize the old one. */
+ if (is_convert_32_to_16
+ (abfd, sec, irel, internal_relocs, irelend, &insn16)
+ || is_16bit_NOP (abfd, sec, irel))
+ {
+ if (insn_rel)
+ {
+ /* Previous INSN16 reloc exists, reduce its
+ size to 16-bit. */
+ if (is_convert_32_to_16 (abfd, sec, insn_rel, internal_relocs,
+ irelend, &insn16))
+ {
+ nds32_elf_write_16 (abfd, contents, insn_rel,
+ internal_relocs, irelend, insn16);
+
+ if (!insert_nds32_elf_blank_recalc_total
+ (relax_blank_list, insn_rel->r_offset + 2, 2))
+ return FALSE;
+ }
+ else if (is_16bit_NOP (abfd, sec, insn_rel))
+ {
+ if (!insert_nds32_elf_blank_recalc_total
+ (relax_blank_list, insn_rel->r_offset, 2))
+ return FALSE;
+ }
+ insn_rel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (insn_rel->r_info), R_NDS32_NONE);
+ }
+ /* Save the new one for later use. */
+ insn_rel = irel;
+ }
+ else
+ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
+ R_NDS32_NONE);
+ }
+ else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL)
+ {
+ /* Search for label. */
+ int force_relax = 0;
+
+ /* Label on 16-bit instruction or optimization
+ needless, just reset this reloc. */
+ insn16 = bfd_getb16 (contents + irel->r_offset);
+ if ((irel->r_addend & 0x1f) < 2 && (!optimize || (insn16 & 0x8000)))
+ {
+ irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_NDS32_NONE);
+ continue;
+ }
+
+ address =
+ irel->r_offset - get_nds32_elf_blank_total (relax_blank_list,
+ irel->r_offset, 1);
+
+ if (!insn_rel)
+ {
+ /* Check if there is case which can not be aligned. */
+ if (irel->r_addend == 2 && address & 0x2)
+ return FALSE;
+ continue;
+ }
+
+ /* Try to align this label. */
+
+ if ((irel->r_addend & 0x1f) < 2)
+ {
+ /* Check if there is a INSN16 at the same address.
+ Label_rel always seats before insn_rel after
+ our sort. */
+
+ /* Search for INSN16 at LABEL location. If INSN16 is at
+ same location and this LABEL alignment is lower than 2,
+ the INSN16 can be converted to 2-byte. */
+ for (tmp_rel = irel;
+ tmp_rel < irelend && tmp_rel->r_offset == irel->r_offset;
+ tmp_rel++)
+ {
+ if (ELF32_R_TYPE (tmp_rel->r_info) == R_NDS32_INSN16
+ && (is_convert_32_to_16
+ (abfd, sec, tmp_rel, internal_relocs,
+ irelend, &insn16)
+ || is_16bit_NOP (abfd, sec, tmp_rel)))
+ {
+ force_relax = 1;
+ break;
+ }
+ }
+ }
+
+ if (force_relax || irel->r_addend == 1 || address & 0x2)
+ {
+ /* Label not aligned. */
+ /* Previous reloc exists, reduce its size to 16-bit. */
+ if (is_convert_32_to_16 (abfd, sec, insn_rel,
+ internal_relocs, irelend, &insn16))
+ {
+ nds32_elf_write_16 (abfd, contents, insn_rel,
+ internal_relocs, irelend, insn16);
+
+ if (!insert_nds32_elf_blank_recalc_total
+ (relax_blank_list, insn_rel->r_offset + 2, 2))
+ return FALSE;
+ }
+ else if (is_16bit_NOP (abfd, sec, insn_rel))
+ {
+ if (!insert_nds32_elf_blank_recalc_total
+ (relax_blank_list, insn_rel->r_offset, 2))
+ return FALSE;
+ }
+
+ }
+ /* INSN16 reloc is used. */
+ insn_rel = NULL;
+ }
+ }
+
+ address =
+ sec->size - get_nds32_elf_blank_total (relax_blank_list, sec->size, 0);
+ if (insn_rel && (address & 0x2 || opt_size))
+ {
+ if (is_convert_32_to_16 (abfd, sec, insn_rel, internal_relocs,
+ irelend, &insn16))
+ {
+ nds32_elf_write_16 (abfd, contents, insn_rel, internal_relocs,
+ irelend, insn16);
+ if (!insert_nds32_elf_blank_recalc_total
+ (relax_blank_list, insn_rel->r_offset + 2, 2))
+ return FALSE;
+ insn_rel->r_info = ELF32_R_INFO (ELF32_R_SYM (insn_rel->r_info),
+ R_NDS32_NONE);
+ }
+ else if (is_16bit_NOP (abfd, sec, insn_rel))
+ {
+ if (!insert_nds32_elf_blank_recalc_total
+ (relax_blank_list, insn_rel->r_offset, 2))
+ return FALSE;
+ insn_rel->r_info = ELF32_R_INFO (ELF32_R_SYM (insn_rel->r_info),
+ R_NDS32_NONE);
+ }
+ }
+ insn_rel = NULL;
+ return TRUE;
+}
+
+/* Pick relaxation round. */
+
+static int
+nds32_elf_pick_relax (bfd_boolean init, asection *sec, bfd_boolean *again,
+ struct elf_nds32_link_hash_table *table,
+ struct bfd_link_info *link_info)
+{
+ static asection *final_sec, *first_sec = NULL;
+ static bfd_boolean normal_again = FALSE;
+ static bfd_boolean set = FALSE;
+ static bfd_boolean first = TRUE;
+ int round_table[] = {
+ NDS32_RELAX_IFC_ROUND,
+ NDS32_RELAX_NORMAL_ROUND,
+ NDS32_RELAX_JUMP_IFC_ROUND,
+ NDS32_RELAX_EX9_BUILD_ROUND,
+ NDS32_RELAX_EX9_REPLACE_ROUND,
+ };
+ static int pass = 0;
+ static int relax_round;
+
+ /* The new round. */
+ if (init && first_sec == sec)
+ {
+ set = TRUE;
+ normal_again = FALSE;
+ }
+
+ if (first)
+ {
+ /* Run an empty run to get the final section. */
+ relax_round = NDS32_RELAX_EMPTY_ROUND;
+
+ /* We have to do ifc optimization before general relax.
+ Decide the first round here. */
+ if (table->target_optimize & NDS32_RELAX_IFC_ON)
+ pass = 0;
+ else
+ pass = 1;
+
+ /* It has to enter relax again because we can
+ not make sure what the final turn is. */
+ *again = TRUE;
+
+ first = FALSE;
+ first_sec = sec;
+ }
+
+ if (!set)
+ {
+ /* Not reenter yet. */
+ final_sec = sec;
+ return relax_round;
+ }
+
+ relax_round = round_table[pass];
+
+ if (!init && relax_round == NDS32_RELAX_NORMAL_ROUND && *again)
+ normal_again = TRUE;
+
+ if (!init && final_sec == sec)
+ {
+ switch (relax_round)
+ {
+ case NDS32_RELAX_IFC_ROUND:
+ nds32_elf_ifc_cse_algo (link_info);
+ *again = TRUE;
+ pass++;
+ break;
+ case NDS32_RELAX_NORMAL_ROUND:
+ if (!normal_again)
+ {
+ /* Normal relaxation done. */
+ if (table->target_optimize & NDS32_RELAX_IFC_ON)
+ {
+ pass++;
+ *again = TRUE;
+ }
+ else if (table->target_optimize & NDS32_RELAX_EX9_ON)
+ {
+ pass += 2; /* NDS32_RELAX_EX9_BUILD_ROUND */
+ *again = TRUE;
+ }
+ else if (table->ex9_import_file)
+ {
+ /* Import ex9 table. */
+ if (table->update_ex9_table)
+ pass += 2; /* NDS32_RELAX_EX9_BUILD_ROUND */
+ else
+ pass += 3; /* NDS32_RELAX_EX9_REPLACE_ROUND */
+ nds32_elf_ex9_import_table (link_info);
+ *again = TRUE;
+ }
+ }
+ break;
+ case NDS32_RELAX_JUMP_IFC_ROUND:
+ if (!nds32_elf_ifc_finish (link_info))
+ (*_bfd_error_handler) (_("error: Jump IFC Fail."));
+ if (table->target_optimize & NDS32_RELAX_EX9_ON)
+ {
+ pass++;
+ *again = TRUE;
+ }
+ break;
+ case NDS32_RELAX_EX9_BUILD_ROUND:
+ nds32_elf_ex9_finish (link_info);
+ pass++;
+ *again = TRUE;
+ break;
+ case NDS32_RELAX_EX9_REPLACE_ROUND:
+ if (table->target_optimize & NDS32_RELAX_IFC_ON)
+ {
+ /* Do jump IFC optimization again. */
+ if (!nds32_elf_ifc_finish (link_info))
+ (*_bfd_error_handler) (_("error: Jump IFC Fail."));
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ return relax_round;
+}
+
+static bfd_boolean
+nds32_elf_relax_section (bfd *abfd, asection *sec,
+ struct bfd_link_info *link_info, bfd_boolean *again)
+{
+ nds32_elf_blank_t *relax_blank_list = NULL;
+ Elf_Internal_Shdr *symtab_hdr;
+ Elf_Internal_Rela *internal_relocs;
+ Elf_Internal_Rela *irel;
+ Elf_Internal_Rela *irelend;
+ Elf_Internal_Sym *isymbuf = NULL;
+ bfd_byte *contents = NULL;
+ bfd_boolean result = TRUE;
+ int optimize = 0;
+ int opt_size = 0;
+ uint32_t insn;
+ uint16_t insn16;
+
+ /* Target dependent option. */
+ struct elf_nds32_link_hash_table *table;
+ int load_store_relax;
+ int relax_round;
+
+ relax_blank_list = NULL;
+ *again = FALSE;
+
+ /* Nothing to do for
+ relocatable link or
+ non-relocatable section or
+ non-code section or
+ empty content or
+ no reloc entry. */
+ if (link_info->relocatable
+ || (sec->flags & SEC_RELOC) == 0
+ || (sec->flags & SEC_EXCLUDE) == 1
+ || (sec->flags & SEC_CODE) == 0
+ || sec->size == 0
+ || sec->reloc_count == 0)
+ return TRUE;
+
+ /* 09.12.11 Workaround. */
+ /* We have to adjust align for R_NDS32_LABEL if needed.
+ The adjust approach only can fix 2-byte align once. */
+ if (sec->alignment_power > 2)
+ return TRUE;
+
+#ifdef NDS32_LINUX_TOOLCHAIN
+ /* Do TLS model conversion once at first. */
+ nds32_elf_unify_tls_model (abfd, sec, contents, link_info);
+#endif
+
+ /* The optimization type to do. */
+
+ table = nds32_elf_hash_table (link_info);
+ relax_round = nds32_elf_pick_relax (TRUE, sec, again, table, link_info);
+
+ switch (relax_round)
+ {
+ case NDS32_RELAX_JUMP_IFC_ROUND:
+ /* Here is the entrance of ifc jump relaxation. */
+ if (!nds32_elf_ifc_calc (link_info, abfd, sec))
+ return FALSE;
+ nds32_elf_pick_relax (FALSE, sec, again, table, link_info);
+ return TRUE;
+
+ case NDS32_RELAX_EX9_BUILD_ROUND:
+ /* Here is the entrance of ex9 relaxation. There are two pass of
+ ex9 relaxation. The one is to traverse all instructions and build
+ the hash table. The other one is to compare instructions and replace
+ it by ex9.it. */
+ if (!nds32_elf_ex9_build_hash_table (abfd, sec, link_info))
+ return FALSE;
+ nds32_elf_pick_relax (FALSE, sec, again, table, link_info);
+ return TRUE;
+
+ case NDS32_RELAX_EX9_REPLACE_ROUND:
+ if (!nds32_elf_ex9_replace_instruction (link_info, abfd, sec))
+ return FALSE;
+ return TRUE;
+
+ case NDS32_RELAX_IFC_ROUND:
+ /* The entrance of link time ifc. We must to do it before all relaxation
+ beginging, because it may magnify size. */
+ if (!nds32_elf_ifc_trace_code (link_info, abfd, sec))
+ return FALSE;
+ nds32_elf_pick_relax (FALSE, sec, again, table, link_info);
+ return TRUE;
+
+ case NDS32_RELAX_EMPTY_ROUND:
+ nds32_elf_pick_relax (FALSE, sec, again, table, link_info);
+ return TRUE;
+
+ case NDS32_RELAX_NORMAL_ROUND:
+ /* Save the first section for abs symbol relaxation. */
+ nds32_elf_relax_guard (NULL, 0, sec, NULL, again, TRUE,
+ table, NULL, NULL);
+ default:
+ if (sec->reloc_count == 0)
+ return TRUE;
+ break;
+ }
+
+ /* The begining of general relaxation. */
+
+ if (is_SDA_BASE_set == 0)
+ {
+ bfd_vma gp;
+ is_SDA_BASE_set = 1;
+ nds32_elf_final_sda_base (sec->output_section->owner, link_info,
+ &gp, FALSE);
+ relax_range_measurement (abfd);
+ }
+
+ if (is_ITB_BASE_set == 0)
+ {
+ /* Set the _ITB_BASE_. */
+ if (!nds32_elf_ex9_itb_base (link_info))
+ {
+ (*_bfd_error_handler) (_("%B: error: Cannot set _ITB_BASE_"), abfd);
+ bfd_set_error (bfd_error_bad_value);
+ }
+ }
+
+ symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
+ /* Relocations MUST be kept in memory, because relaxation adjust them. */
+ internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
+ TRUE /* keep_memory */);
+ if (internal_relocs == NULL)
+ goto error_return;
+
+ irelend = internal_relocs + sec->reloc_count;
+ irel = find_relocs_at_address (internal_relocs, internal_relocs,
+ irelend, R_NDS32_RELAX_ENTRY);
+
+ if (irel == irelend)
+ return TRUE;
+
+ if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_ENTRY)
+ {
+ if (irel->r_addend & R_NDS32_RELAX_ENTRY_DISABLE_RELAX_FLAG)
+ {
+ nds32_elf_pick_relax (FALSE, sec, again, table, link_info);
+ return TRUE;
+ }
+
+ if (irel->r_addend & R_NDS32_RELAX_ENTRY_OPTIMIZE_FLAG)
+ optimize = 1;
+
+ if (irel->r_addend & R_NDS32_RELAX_ENTRY_OPTIMIZE_FOR_SPACE_FLAG)
+ opt_size = 1;
+ }
+
+ load_store_relax = table->load_store_relax;
+
+ /* Get symbol table and section content. */
+ if (!nds32_get_section_contents (abfd, sec, &contents, TRUE)
+ || !nds32_get_local_syms (abfd, sec, &isymbuf))
+ goto error_return;
+
+ /* Do relax loop only when finalize is not done.
+ Take care of relaxable relocs except INSN16. */
+ for (irel = internal_relocs; irel < irelend; irel++)
+ {
+ int seq_len; /* Original length of instruction sequence. */
+ int insn_len = 0; /* Final length of instruction sequence. */
+ bfd_boolean removed;
+
+ insn = 0;
+ if (ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL
+ && (irel->r_addend & 0x1f) >= 2)
+ optimize = 1;
+
+ /* Relocation Types
+ R_NDS32_LONGCALL1 53
+ R_NDS32_LONGCALL2 54
+ R_NDS32_LONGCALL3 55
+ R_NDS32_LONGJUMP1 56
+ R_NDS32_LONGJUMP2 57
+ R_NDS32_LONGJUMP3 58
+ R_NDS32_LOADSTORE 59 */
+ if (ELF32_R_TYPE (irel->r_info) >= R_NDS32_LONGCALL1
+ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_LOADSTORE)
+ seq_len = GET_SEQ_LEN (irel->r_addend);
+
+ /* Relocation Types
+ R_NDS32_LONGCALL4 107
+ R_NDS32_LONGCALL5 108
+ R_NDS32_LONGCALL6 109
+ R_NDS32_LONGJUMP4 110
+ R_NDS32_LONGJUMP5 111
+ R_NDS32_LONGJUMP6 112
+ R_NDS32_LONGJUMP7 113 */
+ else if (ELF32_R_TYPE (irel->r_info) >= R_NDS32_LONGCALL4
+ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_LONGJUMP7)
+ seq_len = 4;
+
+ /* Relocation Types
+ R_NDS32_LO12S0_RELA 30
+ R_NDS32_LO12S1_RELA 29
+ R_NDS32_LO12S2_RELA 28
+ R_NDS32_LO12S2_SP_RELA 71
+ R_NDS32_LO12S2_DP_RELA 70
+ R_NDS32_GOT_LO12 46
+ R_NDS32_GOTOFF_LO12 50
+ R_NDS32_PLTREL_LO12 65
+ R_NDS32_PLT_GOTREL_LO12 67
+ R_NDS32_17IFC_PCREL_RELA 96
+ R_NDS32_GOT_SUFF 193
+ R_NDS32_GOTOFF_SUFF 194
+ R_NDS32_PLT_GOT_SUFF 195
+ R_NDS32_MULCALL_SUFF 196
+ R_NDS32_PTR 197 */
+ else if ((ELF32_R_TYPE (irel->r_info) <= R_NDS32_LO12S0_RELA
+ && ELF32_R_TYPE (irel->r_info) >= R_NDS32_LO12S2_RELA)
+ || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S2_SP_RELA
+ || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S2_DP_RELA
+ || ELF32_R_TYPE (irel->r_info) == R_NDS32_GOT_LO12
+ || ELF32_R_TYPE (irel->r_info) == R_NDS32_GOTOFF_LO12
+ || ELF32_R_TYPE (irel->r_info) == R_NDS32_GOTPC_LO12
+ || ELF32_R_TYPE (irel->r_info) == R_NDS32_PLTREL_LO12
+ || ELF32_R_TYPE (irel->r_info) == R_NDS32_PLT_GOTREL_LO12
+ || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_GOT_SUFF
+ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_PTR)
+ || ELF32_R_TYPE (irel->r_info) == R_NDS32_17IFC_PCREL_RELA
+ || ELF32_R_TYPE (irel->r_info) == R_NDS32_TLS_LE_LO12
+ || ELF32_R_TYPE (irel->r_info) == R_NDS32_TLS_LE_ADD
+ || ELF32_R_TYPE (irel->r_info) == R_NDS32_TLS_LE_LS)
+ seq_len = 0;
+ else
+ continue;
+
+ insn_len = seq_len;
+ removed = FALSE;
+
+ switch (ELF32_R_TYPE (irel->r_info))
+ {
+ case R_NDS32_LONGCALL1:
+ removed = nds32_elf_relax_longcall1 (abfd, sec, irel, internal_relocs,
+ &insn_len, contents, isymbuf,
+ symtab_hdr);
+ break;
+ case R_NDS32_LONGCALL2:
+ removed = nds32_elf_relax_longcall2 (abfd, sec, irel, internal_relocs,
+ &insn_len, contents, isymbuf,
+ symtab_hdr);
+ break;
+ case R_NDS32_LONGCALL3:
+ removed = nds32_elf_relax_longcall3 (abfd, sec, irel, internal_relocs,
+ &insn_len, contents, isymbuf,
+ symtab_hdr);
+ break;
+ case R_NDS32_LONGJUMP1:
+ removed = nds32_elf_relax_longjump1 (abfd, sec, irel, internal_relocs,
+ &insn_len, contents, isymbuf,
+ symtab_hdr);
+ break;
+ case R_NDS32_LONGJUMP2:
+ removed = nds32_elf_relax_longjump2 (abfd, sec, irel, internal_relocs,
+ &insn_len, contents, isymbuf,
+ symtab_hdr);
+ break;
+ case R_NDS32_LONGJUMP3:
+ removed = nds32_elf_relax_longjump3 (abfd, sec, irel, internal_relocs,
+ &insn_len, contents, isymbuf,
+ symtab_hdr);
+ break;
+ case R_NDS32_LONGCALL4:
+ removed = nds32_elf_relax_longcall4 (abfd, sec, irel, internal_relocs,
+ &insn_len, contents, isymbuf,
+ symtab_hdr);
+ break;
+ case R_NDS32_LONGCALL5:
+ removed = nds32_elf_relax_longcall5 (abfd, sec, irel, internal_relocs,
+ &insn_len, contents, isymbuf,
+ symtab_hdr);
+ break;
+ case R_NDS32_LONGCALL6:
+ removed = nds32_elf_relax_longcall6 (abfd, sec, irel, internal_relocs,
+ &insn_len, contents, isymbuf,
+ symtab_hdr);
+ break;
+ case R_NDS32_LONGJUMP4:
+ removed = nds32_elf_relax_longjump4 (abfd, sec, irel, internal_relocs,
+ &insn_len, contents, isymbuf,
+ symtab_hdr);
+ break;
+ case R_NDS32_LONGJUMP5:
+ removed = nds32_elf_relax_longjump5 (abfd, sec, irel, internal_relocs,
+ &insn_len, &seq_len, contents,
+ isymbuf, symtab_hdr);
+ break;
+ case R_NDS32_LONGJUMP6:
+ removed = nds32_elf_relax_longjump6 (abfd, sec, irel, internal_relocs,
+ &insn_len, &seq_len, contents,
+ isymbuf, symtab_hdr);
+ break;
+ case R_NDS32_LONGJUMP7:
+ removed = nds32_elf_relax_longjump7 (abfd, sec, irel, internal_relocs,
+ &insn_len, &seq_len, contents,
+ isymbuf, symtab_hdr);
+ break;
+ case R_NDS32_LOADSTORE:
+ removed = nds32_elf_relax_loadstore (link_info, abfd, sec, irel,
+ internal_relocs, &insn_len,
+ contents, isymbuf, symtab_hdr,
+ load_store_relax, table);
+ break;
+ case R_NDS32_LO12S0_RELA:
+ case R_NDS32_LO12S1_RELA:
+ case R_NDS32_LO12S2_RELA:
+ case R_NDS32_LO12S2_DP_RELA:
+ case R_NDS32_LO12S2_SP_RELA:
+ /* Relax for low part. */
+ nds32_elf_relax_lo12 (link_info, abfd, sec, irel, internal_relocs,
+ contents, isymbuf, symtab_hdr, table);
+
+ /* It is impossible to delete blank, so just continue. */
+ continue;
+ case R_NDS32_GOT_LO12:
+ case R_NDS32_GOTOFF_LO12:
+ case R_NDS32_PLTREL_LO12:
+ case R_NDS32_PLT_GOTREL_LO12:
+ case R_NDS32_GOTPC_LO12:
+ /* Relax for PIC gp-relative low part. */
+ nds32_elf_relax_piclo12 (link_info, abfd, sec, irel, contents,
+ isymbuf, symtab_hdr);
+
+ /* It is impossible to delete blank, so just continue. */
+ continue;
+ case R_NDS32_TLS_LE_LO12:
+ /* Relax for LE TLS low part. */
+ nds32_elf_relax_letlslo12 (link_info, abfd, irel, contents,
+ isymbuf, symtab_hdr);
+
+ /* It is impossible to delete blank, so just continue. */
+ continue;
+ case R_NDS32_TLS_LE_ADD:
+ nds32_elf_relax_letlsadd (link_info, abfd, sec, irel, internal_relocs,
+ contents, isymbuf, symtab_hdr, again);
+ /* It is impossible to delete blank, so just continue. */
+ continue;
+ case R_NDS32_TLS_LE_LS:
+ nds32_elf_relax_letlsls (link_info, abfd, sec, irel, internal_relocs,
+ contents, isymbuf, symtab_hdr, again);
+ continue;
+ case R_NDS32_PTR:
+ removed = nds32_elf_relax_ptr (abfd, sec, irel, internal_relocs,
+ &insn_len, &seq_len, contents);
+ break;
+ case R_NDS32_PLT_GOT_SUFF:
+ nds32_elf_relax_pltgot_suff (link_info, abfd, sec, irel,
+ internal_relocs, contents,
+ isymbuf, symtab_hdr, again);
+ /* It is impossible to delete blank, so just continue. */
+ continue;
+ case R_NDS32_GOT_SUFF:
+ nds32_elf_relax_got_suff (link_info, abfd, sec, irel,
+ internal_relocs, contents,
+ symtab_hdr, again);
+ /* It is impossible to delete blank, so just continue. */
+ continue;
+ case R_NDS32_GOTOFF_SUFF:
+ nds32_elf_relax_gotoff_suff (link_info, abfd, sec, irel,
+ internal_relocs, contents,
+ isymbuf, symtab_hdr, again);
+ /* It is impossible to delete blank, so just continue. */
+ continue;
+ default:
+ continue;
+
+ }
+ if (removed && seq_len - insn_len > 0)
+ {
+ if (!insert_nds32_elf_blank
+ (&relax_blank_list, irel->r_offset + insn_len,
+ seq_len - insn_len))
+ goto error_return;
+ *again = TRUE;
+ }
+ }
+
+ calc_nds32_blank_total (relax_blank_list);
+
+ if (table->relax_fp_as_gp)
+ {
+ if (!nds32_relax_fp_as_gp (link_info, abfd, sec, internal_relocs,
+ irelend, isymbuf))
+ goto error_return;
+
+ if (*again == FALSE)
+ {
+ if (!nds32_fag_remove_unused_fpbase (abfd, sec, internal_relocs,
+ irelend))
+ goto error_return;
+ }
+ }
+
+ nds32_elf_pick_relax (FALSE, sec, again, table, link_info);
+
+ if (*again == FALSE)
+ {
+ if (!nds32_relax_adjust_label (abfd, sec, internal_relocs, contents,
+ &relax_blank_list, optimize, opt_size))
+ goto error_return;
+ }
+
+ /* It doesn't matter optimize_for_space_no_align anymore.
+ If object file is assembled with flag '-Os',
+ the we don't adjust jump-destination on 4-byte boundary. */
+
+ if (relax_blank_list)
+ {
+ nds32_elf_relax_delete_blanks (abfd, sec, relax_blank_list);
+ relax_blank_list = NULL;
+ }
+
+ if (*again == FALSE)
+ {
+ /* Closing the section, so we don't relax it anymore. */
+ bfd_vma sec_size_align;
+ Elf_Internal_Rela *tmp_rel;
+
+ /* Pad to alignment boundary. Only handle current section alignment. */
+ sec_size_align = (sec->size + (~((bfd_vma)(-1) << sec->alignment_power)))
+ & ((bfd_vma)(-1) << sec->alignment_power);
+ if ((sec_size_align - sec->size) & 0x2)
+ {
+ insn16 = NDS32_NOP16;
+ bfd_putb16 (insn16, contents + sec->size);
+ sec->size += 2;
+ }
+
+ while (sec_size_align != sec->size)
+ {
+ insn = NDS32_NOP32;
+ bfd_putb32 (insn, contents + sec->size);
+ sec->size += 4;
+ }
+
+ tmp_rel = find_relocs_at_address (internal_relocs, internal_relocs,
+ irelend, R_NDS32_RELAX_ENTRY);
+ if (tmp_rel != irelend)
+ tmp_rel->r_addend |= R_NDS32_RELAX_ENTRY_DISABLE_RELAX_FLAG;
+
+ clean_nds32_elf_blank ();
+ }
+
+finish:
+ if (internal_relocs != NULL
+ && elf_section_data (sec)->relocs != internal_relocs)
+ free (internal_relocs);
+
+ if (contents != NULL
+ && elf_section_data (sec)->this_hdr.contents != contents)
+ free (contents);
+
+ if (isymbuf != NULL && symtab_hdr->contents != (bfd_byte *) isymbuf)
+ free (isymbuf);
+
+ return result;
+
+error_return:
+ result = FALSE;
+ goto finish;
+}
+
+static struct bfd_elf_special_section const nds32_elf_special_sections[] = {
+ {".sdata", 6, -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE},
+ {".sbss", 5, -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE},
+ {NULL, 0, 0, 0, 0}
+};
+
+static bfd_boolean
+nds32_elf_output_arch_syms (bfd *output_bfd ATTRIBUTE_UNUSED,
+ struct bfd_link_info *info,
+ void *finfo ATTRIBUTE_UNUSED,
+ bfd_boolean (*func) (void *, const char *,
+ Elf_Internal_Sym *,
+ asection *,
+ struct elf_link_hash_entry *)
+ ATTRIBUTE_UNUSED)
+{
+ FILE *sym_ld_script = NULL;
+ struct elf_nds32_link_hash_table *table;
+
+ table = nds32_elf_hash_table (info);
+ sym_ld_script = table->sym_ld_script;
+
+ if (check_start_export_sym)
+ fprintf (sym_ld_script, "}\n");
+
+ return TRUE;
+}
+
+static enum elf_reloc_type_class
+nds32_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
+ const asection *rel_sec ATTRIBUTE_UNUSED,
+ const Elf_Internal_Rela *rela)
+{
+ switch ((int) ELF32_R_TYPE (rela->r_info))
+ {
+ case R_NDS32_RELATIVE:
+ return reloc_class_relative;
+ case R_NDS32_JMP_SLOT:
+ return reloc_class_plt;
+ case R_NDS32_COPY:
+ return reloc_class_copy;
+ default:
+ return reloc_class_normal;
+ }
+}
+
+/* Put target dependent option into info hash table. */
+void
+bfd_elf32_nds32_set_target_option (struct bfd_link_info *link_info,
+ int relax_fp_as_gp,
+ int eliminate_gc_relocs,
+ FILE * sym_ld_script, int load_store_relax,
+ int target_optimize, int relax_status,
+ int relax_round, FILE * ex9_export_file,
+ FILE * ex9_import_file,
+ int update_ex9_table, int ex9_limit,
+ bfd_boolean ex9_loop_aware,
+ bfd_boolean ifc_loop_aware,
+ int hyper_relax)
+{
+ struct elf_nds32_link_hash_table *table;
+
+ /* Initialize indirect call hash table. */
+ nds32_elf_ict_hash_init ();
+
+ table = nds32_elf_hash_table (link_info);
+ if (table == NULL)
+ return;
+
+ table->relax_fp_as_gp = relax_fp_as_gp;
+ table->eliminate_gc_relocs = eliminate_gc_relocs;
+ table->sym_ld_script = sym_ld_script;
+ table ->load_store_relax = load_store_relax;
+ table->target_optimize = target_optimize;
+ table->relax_status = relax_status;
+ table->relax_round = relax_round;
+ table->ex9_export_file = ex9_export_file;
+ table->ex9_import_file = ex9_import_file;
+ table->update_ex9_table = update_ex9_table;
+ table->ex9_limit = ex9_limit;
+ table->ex9_loop_aware = ex9_loop_aware;
+ table->ifc_loop_aware = ifc_loop_aware;
+ table->hyper_relax = hyper_relax;
+
+ /* We have to do ifc optimization before general relax. */
+ if (target_optimize & NDS32_RELAX_IFC_ON)
+ {
+ /* Initialize ifc hash table. */
+ if (!nds32_elf_ifc_init ())
+ return;
+ }
+ if (target_optimize & NDS32_RELAX_EX9_ON
+ || (ex9_import_file != NULL && update_ex9_table == 1))
+ {
+ /* Initialize ex9 hash table. */
+ if (!nds32_elf_ex9_init ())
+ return;
+ }
+}
+
+void
+bfd_elf32_nds32_append_section (struct bfd_link_info *link_info,
+ bfd *abfd, int target_optimize)
+{
+ asection *itable;
+ struct bfd_link_hash_entry *h;
+ unsigned int i, count = 0;
+
+ /* Insert section ".ex9.itable". */
+ if (target_optimize & NDS32_RELAX_EX9_ON)
+ {
+ itable = bfd_make_section_with_flags (abfd, ".ex9.itable",
+ SEC_CODE | SEC_ALLOC | SEC_LOAD
+ | SEC_HAS_CONTENTS | SEC_READONLY
+ | SEC_IN_MEMORY | SEC_KEEP
+ | SEC_RELOC);
+ if (itable)
+ {
+ itable->gc_mark = 1;
+ itable->alignment_power = 2;
+ itable->size = 0x1000;
+ itable->contents = bfd_zalloc (abfd, itable->size);
+
+ /* Add a symbol in the head of ex9.itable to objdump clearly. */
+ h = bfd_link_hash_lookup (link_info->hash, "_EX9_BASE_",
+ FALSE, FALSE, FALSE);
+ _bfd_generic_link_add_one_symbol
+ (link_info, link_info->output_bfd, "_EX9_BASE_",
+ BSF_GLOBAL | BSF_WEAK, itable, 0, (const char *) NULL, FALSE,
+ get_elf_backend_data (link_info->output_bfd)->collect, &h);
+ }
+ }
+
+ /* Count number of indirect call function. */
+ indirect_call_table.frozen = 1;
+ for (i = 0; i < indirect_call_table.size; i++)
+ {
+ struct bfd_hash_entry *p;
+ struct elf_nds32_ict_hash_entry *entry;
+
+ for (p = indirect_call_table.table[i]; p != NULL; p = p->next)
+ {
+ entry = (struct elf_nds32_ict_hash_entry *) p;
+ entry->order = count;
+ count++;
+ }
+ }
+ indirect_call_table.frozen = 0;
+
+ if (count)
+ {
+ h = bfd_link_hash_lookup (link_info->hash, "_INDIRECT_CALL_TABLE_BASE_",
+ FALSE, FALSE, FALSE);
+ if (h && (h->type == bfd_link_hash_defined
+ || h->type == bfd_link_hash_defweak
+ || h->type == bfd_link_hash_common))
+ {
+ (*_bfd_error_handler) (_("Warning: _INDIRECT_CALL_TABLE_BASE_ has already"
+ "be defined. All ICT suffix is ignored."));
+ ignore_indirect_call = TRUE;
+ return;
+ }
+
+ itable = bfd_make_section_with_flags (abfd, NDS32_ICT_SECTION,
+ SEC_CODE | SEC_ALLOC | SEC_LOAD
+ | SEC_HAS_CONTENTS | SEC_READONLY
+ | SEC_IN_MEMORY | SEC_KEEP
+ | SEC_RELOC);
+ if (itable)
+ {
+ itable->gc_mark = 1;
+ itable->alignment_power = 2;
+ itable->size = count * 4;
+ itable->contents = bfd_zalloc (abfd, itable->size);
+
+ /* Add a symbol in the head of .nds32.ict to objdump clearly. */
+ h = bfd_link_hash_lookup (link_info->hash,
+ "_INDIRECT_CALL_TABLE_BASE_",
+ FALSE, FALSE, FALSE);
+ _bfd_generic_link_add_one_symbol
+ (link_info, link_info->output_bfd, "_INDIRECT_CALL_TABLE_BASE_",
+ BSF_GLOBAL | BSF_WEAK, itable, 0, (const char *) NULL, FALSE,
+ get_elf_backend_data (link_info->output_bfd)->collect, &h);
+ }
+
+ ict_file = fopen ("nds32_ict.s", FOPEN_WT);
+ if(ict_file == NULL)
+ (*_bfd_error_handler) (_("Warning: Fail to build nds32_ict.s."));
+ }
+}
+
+/* These functions and data-structures are used for fp-as-gp
+ optimization. */
+
+#define FAG_THRESHOLD 3 /* At least 3 gp-access. */
+/* lwi37.fp covers 508 bytes, but there may be 32-byte padding between
+ the read-only section and read-write section. */
+#define FAG_WINDOW (508 - 32)
+
+/* An nds32_fag represent a gp-relative access.
+ We find best fp-base by using a sliding window
+ to find a base address which can cover most gp-access. */
+struct nds32_fag
+{
+ struct nds32_fag *next; /* NULL-teminated linked list. */
+ bfd_vma addr; /* The address of this fag. */
+ Elf_Internal_Rela **relas; /* The relocations associated with this fag.
+ It is used for applying FP7U2_FLAG. */
+ int count; /* How many times this address is referred.
+ There should be exactly `count' relocations
+ in relas. */
+ int relas_capcity; /* The buffer size of relas.
+ We use an array instead of linked-list,
+ and realloc is used to adjust buffer size. */
+};
+
+static void
+nds32_fag_init (struct nds32_fag *head)
+{
+ memset (head, 0, sizeof (struct nds32_fag));
+}
+
+static void
+nds32_fag_verify (struct nds32_fag *head)
+{
+ struct nds32_fag *iter;
+ struct nds32_fag *prev;
+
+ prev = NULL;
+ iter = head->next;
+ while (iter)
+ {
+ if (prev && prev->addr >= iter->addr)
+ puts ("Bug in fp-as-gp insertion.");
+ prev = iter;
+ iter = iter->next;
+ }
+}
+
+/* Insert a fag in ascending order.
+ If a fag of the same address already exists,
+ they are chained by relas array. */
+
+static void
+nds32_fag_insert (struct nds32_fag *head, bfd_vma addr,
+ Elf_Internal_Rela * rel)
+{
+ struct nds32_fag *iter;
+ struct nds32_fag *new_fag;
+ const int INIT_RELAS_CAP = 4;
+
+ for (iter = head;
+ iter->next && iter->next->addr <= addr;
+ iter = iter->next)
+ /* Find somewhere to insert. */ ;
+
+ /* `iter' will be equal to `head' if the list is empty. */
+ if (iter != head && iter->addr == addr)
+ {
+ /* The address exists in the list.
+ Insert `rel' into relocation list, relas. */
+
+ /* Check whether relas is big enough. */
+ if (iter->count >= iter->relas_capcity)
+ {
+ iter->relas_capcity *= 2;
+ iter->relas = bfd_realloc
+ (iter->relas, iter->relas_capcity * sizeof (void *));
+ }
+ iter->relas[iter->count++] = rel;
+ return;
+ }
+
+ /* This is a new address. Create a fag node for it. */
+ new_fag = bfd_malloc (sizeof (struct nds32_fag));
+ memset (new_fag, 0, sizeof (*new_fag));
+ new_fag->addr = addr;
+ new_fag->count = 1;
+ new_fag->next = iter->next;
+ new_fag->relas_capcity = INIT_RELAS_CAP;
+ new_fag->relas = (Elf_Internal_Rela **)
+ bfd_malloc (new_fag->relas_capcity * sizeof (void *));
+ new_fag->relas[0] = rel;
+ iter->next = new_fag;
+
+ nds32_fag_verify (head);
+}
+
+static void
+nds32_fag_free_list (struct nds32_fag *head)
+{
+ struct nds32_fag *iter;
+
+ iter = head->next;
+ while (iter)
+ {
+ struct nds32_fag *tmp = iter;
+ iter = iter->next;
+ free (tmp->relas);
+ tmp->relas = NULL;
+ free (tmp);
+ }
+}
+
+/* Find the best fp-base address.
+ The relocation associated with that address is returned,
+ so we can track the symbol instead of a fixed address.
+
+ When relaxation, the address of an datum may change,
+ because a text section is shrinked, so the data section
+ moves forward. If the aligments of text and data section
+ are different, their distance may change too.
+ Therefore, tracking a fixed address is not appriate. */
+
+static int
+nds32_fag_find_base (struct nds32_fag *head, struct nds32_fag **bestpp)
+{
+ struct nds32_fag *base; /* First fag in the window. */
+ struct nds32_fag *last; /* First fag outside the window. */
+ int accu = 0; /* Usage accumulation. */
+ struct nds32_fag *best; /* Best fag. */
+ int baccu = 0; /* Best accumulation. */
+
+ /* Use first fag for initial, and find the last fag in the window.
+
+ In each iteration, we could simply subtract previous fag
+ and accumulate following fags which are inside the window,
+ untill we each the end. */
+
+ if (head->next == NULL)
+ {
+ *bestpp = NULL;
+ return 0;
+ }
+
+ /* Initialize base. */
+ base = head->next;
+ best = base;
+ for (last = base;
+ last && last->addr < base->addr + FAG_WINDOW;
+ last = last->next)
+ accu += last->count;
+
+ baccu = accu;
+
+ /* Record the best base in each iteration. */
+ while (base->next)
+ {
+ accu -= base->count;
+ base = base->next;
+ /* Account fags in window. */
+ for (/* Nothing. */;
+ last && last->addr < base->addr + FAG_WINDOW;
+ last = last->next)
+ accu += last->count;
+
+ /* A better fp-base? */
+ if (accu > baccu)
+ {
+ best = base;
+ baccu = accu;
+ }
+ }
+
+ if (bestpp)
+ *bestpp = best;
+ return baccu;
+}
+
+/* Apply R_NDS32_INSN16_FP7U2_FLAG on gp-relative accesses,
+ so we can convert it fo fp-relative access later.
+ `best_fag' is the best fp-base. Only those inside the window
+ of best_fag is applied the flag. */
+
+static bfd_boolean
+nds32_fag_mark_relax (struct bfd_link_info *link_info,
+ asection *sec, struct nds32_fag *best_fag,
+ Elf_Internal_Rela *internal_relocs,
+ Elf_Internal_Rela *irelend)
+{
+ struct nds32_fag *ifag;
+ bfd_vma best_fpbase, gp;
+ bfd *output_bfd;
+
+ output_bfd = sec->output_section->owner;
+ nds32_elf_final_sda_base (output_bfd, link_info, &gp, FALSE);
+ best_fpbase = best_fag->addr;
+
+ if (best_fpbase > gp + sdata_range[1][1]
+ || best_fpbase < gp - sdata_range[1][0])
+ return FALSE;
+
+ /* Mark these inside the window R_NDS32_INSN16_FP7U2_FLAG flag,
+ so we know they can be converted to lwi37.fp. */
+ for (ifag = best_fag;
+ ifag && ifag->addr < best_fpbase + FAG_WINDOW; ifag = ifag->next)
+ {
+ int i;
+
+ for (i = 0; i < ifag->count; i++)
+ {
+ Elf_Internal_Rela *insn16_rel;
+ Elf_Internal_Rela *fag_rel;
+
+ fag_rel = ifag->relas[i];
+
+ /* Only if this is within the WINDOWS, FP7U2_FLAG
+ is applied. */
+
+ insn16_rel = find_relocs_at_address
+ (fag_rel, internal_relocs, irelend, R_NDS32_INSN16);
+
+ if (insn16_rel != irelend)
+ insn16_rel->r_addend = R_NDS32_INSN16_FP7U2_FLAG;
+ }
+ }
+ return TRUE;
+}
+
+/* Reset INSN16 to clean fp as gp. */
+
+static void
+nds32_fag_unmark_relax (struct nds32_fag *fag,
+ Elf_Internal_Rela *internal_relocs,
+ Elf_Internal_Rela *irelend)
+{
+ struct nds32_fag *ifag;
+ int i;
+ Elf_Internal_Rela *insn16_rel;
+ Elf_Internal_Rela *fag_rel;
+
+ for (ifag = fag; ifag; ifag = ifag->next)
+ {
+ for (i = 0; i < ifag->count; i++)
+ {
+ fag_rel = ifag->relas[i];
+
+ /* Restore the INSN16 relocation. */
+ insn16_rel = find_relocs_at_address
+ (fag_rel, internal_relocs, irelend, R_NDS32_INSN16);
+
+ if (insn16_rel != irelend)
+ insn16_rel->r_addend &= ~R_NDS32_INSN16_FP7U2_FLAG;
+ }
+ }
+}
+
+/* This is the main function of fp-as-gp optimization.
+ It should be called by relax_section. */
+
+static bfd_boolean
+nds32_relax_fp_as_gp (struct bfd_link_info *link_info,
+ bfd *abfd, asection *sec,
+ Elf_Internal_Rela *internal_relocs,
+ Elf_Internal_Rela *irelend,
+ Elf_Internal_Sym *isymbuf)
+{
+ Elf_Internal_Rela *begin_rel = NULL;
+ Elf_Internal_Rela *irel;
+ struct nds32_fag fag_head;
+ Elf_Internal_Shdr *symtab_hdr;
+ bfd_byte *contents;
+ bfd_boolean ifc_inside = FALSE;
+
+ /* FIXME: Can we bfd_elf_link_read_relocs for the relocs? */
+
+ /* Per-function fp-base selection.
+ 1. Create a list for all the gp-relative access.
+ 2. Base on those gp-relative address,
+ find a fp-base which can cover most access.
+ 3. Use the fp-base for fp-as-gp relaxation.
+
+ NOTE: If fp-as-gp is not worth to do, (e.g., less than 3 times),
+ we should
+ 1. delete the `la $fp, _FP_BASE_' instruction and
+ 2. not convert lwi.gp to lwi37.fp.
+
+ To delete the _FP_BASE_ instruction, we simply apply
+ R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG flag in the r_addend to disable it.
+
+ To suppress the conversion, we simply NOT to apply
+ R_NDS32_INSN16_FP7U2_FLAG flag. */
+
+ symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
+
+ if (!nds32_get_section_contents (abfd, sec, &contents, TRUE)
+ || !nds32_get_local_syms (abfd, sec, &isymbuf))
+ return FALSE;
+
+ /* Check whether it is worth for fp-as-gp optimization,
+ i.e., at least 3 gp-load.
+
+ Set R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG if we should NOT
+ apply this optimization. */
+
+ for (irel = internal_relocs; irel < irelend; irel++)
+ {
+ /* We recognize R_NDS32_RELAX_REGION_BEGIN/_END for the region.
+ One we enter the begin of the region, we track all the LW/ST
+ instructions, so when we leave the region, we try to find
+ the best fp-base address for those LW/ST instructions. */
+
+ if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_BEGIN
+ && (irel->r_addend & R_NDS32_RELAX_REGION_OMIT_FP_FLAG))
+ {
+ /* Begin of the region. */
+ if (begin_rel)
+ (*_bfd_error_handler) (_("%B: Nested OMIT_FP in %A."), abfd, sec);
+
+ begin_rel = irel;
+ nds32_fag_init (&fag_head);
+ ifc_inside = FALSE;
+ }
+ else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_END
+ && (irel->r_addend & R_NDS32_RELAX_REGION_OMIT_FP_FLAG))
+ {
+ int accu;
+ struct nds32_fag *best_fag, *tmp_fag;
+ int dist;
+
+ /* End of the region.
+ Check whether it is worth to do fp-as-gp. */
+
+ if (begin_rel == NULL)
+ {
+ (*_bfd_error_handler) (_("%B: Unmatched OMIT_FP in %A."), abfd, sec);
+ continue;
+ }
+
+ accu = nds32_fag_find_base (&fag_head, &best_fag);
+
+ /* Clean FP7U2_FLAG because they may set ever. */
+ tmp_fag = fag_head.next;
+ nds32_fag_unmark_relax (tmp_fag, internal_relocs, irelend);
+
+ /* Check if it is worth, and FP_BASE is near enough to SDA_BASE. */
+ if (accu < FAG_THRESHOLD
+ || !nds32_fag_mark_relax (link_info, sec, best_fag,
+ internal_relocs, irelend))
+ {
+ /* Not worth to do fp-as-gp. */
+ begin_rel->r_addend |= R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG;
+ begin_rel->r_addend &= ~R_NDS32_RELAX_REGION_OMIT_FP_FLAG;
+ irel->r_addend |= R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG;
+ irel->r_addend &= ~R_NDS32_RELAX_REGION_OMIT_FP_FLAG;
+ nds32_fag_free_list (&fag_head);
+ begin_rel = NULL;
+ continue;
+ }
+
+ /* R_SYM of R_NDS32_RELAX_REGION_BEGIN is not used by assembler,
+ so we use it to record the distance to the reloction of best
+ fp-base. */
+ dist = best_fag->relas[0] - begin_rel;
+ BFD_ASSERT (dist > 0 && dist < 0xffffff);
+ /* Use high 16 bits of addend to record the _FP_BASE_ matched
+ relocation. And get the base value when relocating. */
+ begin_rel->r_addend &= (0x1 << 16) - 1;
+ begin_rel->r_addend |= dist << 16;
+
+ nds32_fag_free_list (&fag_head);
+ begin_rel = NULL;
+ }
+
+ if (begin_rel == NULL || ifc_inside)
+ /* Skip if we are not in the region of fp-as-gp. */
+ continue;
+
+ if (ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA15S2_RELA
+ || ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA17S2_RELA)
+ {
+ bfd_vma addr;
+ uint32_t insn;
+
+ /* A gp-relative access is found. Insert it to the fag-list. */
+
+ /* Rt is necessary an RT3, so it can be converted to lwi37.fp. */
+ insn = bfd_getb32 (contents + irel->r_offset);
+ if (!N32_IS_RT3 (insn))
+ continue;
+
+ addr = calculate_memory_address (abfd, irel, isymbuf, symtab_hdr);
+ nds32_fag_insert (&fag_head, addr, irel);
+ }
+ else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA_FP7U2_RELA)
+ {
+ begin_rel = NULL;
+ }
+ else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_17IFC_PCREL_RELA
+ || ELF32_R_TYPE (irel->r_info) == R_NDS32_10IFCU_PCREL_RELA)
+ {
+ /* Suppress fp as gp when encounter ifc. */
+ ifc_inside = TRUE;
+ }
+ }
+
+ return TRUE;
+}
+
+/* Remove unused `la $fp, _FD_BASE_' instruction. */
+
+static bfd_boolean
+nds32_fag_remove_unused_fpbase (bfd *abfd, asection *sec,
+ Elf_Internal_Rela *internal_relocs,
+ Elf_Internal_Rela *irelend)
+{
+ Elf_Internal_Rela *irel;
+ Elf_Internal_Shdr *symtab_hdr;
+ bfd_byte *contents = NULL;
+ nds32_elf_blank_t *relax_blank_list = NULL;
+ bfd_boolean result = TRUE;
+ bfd_boolean unused_region = FALSE;
+
+ /*
+ NOTE: Disable fp-as-gp if we encounter ifcall relocations.
+ * R_NDS32_17IFC_PCREL_RELA
+ * R_NDS32_10IFCU_PCREL_RELA
+
+ CASE??????????????
+ */
+
+ symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
+ nds32_get_section_contents (abfd, sec, &contents, TRUE);
+
+ for (irel = internal_relocs; irel < irelend; irel++)
+ {
+ /* To remove unused fp-base, we simply find the REGION_NOT_OMIT_FP
+ we marked to in previous pass.
+ DO NOT scan relocations again, since we've alreadly decided it
+ and set the flag. */
+ const char *syname;
+ int syndx;
+ uint32_t insn;
+
+ if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_BEGIN
+ && (irel->r_addend & R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG))
+ unused_region = TRUE;
+ else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_REGION_END
+ && (irel->r_addend & R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG))
+ unused_region = FALSE;
+
+ /* We're not in the region. */
+ if (!unused_region)
+ continue;
+
+ /* _FP_BASE_ must be a GLOBAL symbol. */
+ syndx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
+ if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
+ continue;
+
+ /* The symbol name must be _FP_BASE_. */
+ syname = elf_sym_hashes (abfd)[syndx]->root.root.string;
+ if (strcmp (syname, FP_BASE_NAME) != 0)
+ continue;
+
+ if (ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA19S0_RELA)
+ {
+ /* addi.gp $fp, -256 */
+ insn = bfd_getb32 (contents + irel->r_offset);
+ if (insn != INSN_ADDIGP_TO_FP)
+ continue;
+ }
+ else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_SDA15S0_RELA)
+ {
+ /* addi $fp, $gp, -256 */
+ insn = bfd_getb32 (contents + irel->r_offset);
+ if (insn != INSN_ADDI_GP_TO_FP)
+ continue;
+ }
+ else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_20_RELA)
+ {
+ /* movi $fp, FP_BASE */
+ insn = bfd_getb32 (contents + irel->r_offset);
+ if (insn != INSN_MOVI_TO_FP)
+ continue;
+ }
+ else
+ continue;
+
+ /* We got here because a FP_BASE instruction is found. */
+ if (!insert_nds32_elf_blank_recalc_total
+ (&relax_blank_list, irel->r_offset, 4))
+ goto error_return;
+ }
+
+finish:
+ if (relax_blank_list)
+ {
+ nds32_elf_relax_delete_blanks (abfd, sec, relax_blank_list);
+ relax_blank_list = NULL;
+ }
+ return result;
+
+error_return:
+ result = FALSE;
+ goto finish;
+}
+
+/* This is a version of bfd_generic_get_relocated_section_contents.
+ We need this variety because relaxation will modify the dwarf
+ infomation. When there is undefined symbol reference error mesage,
+ linker need to dump line number where the symbol be used. However
+ the address is be relaxed, it can not get the original dwarf contents.
+ The variety only modify function call for reading in the section. */
+
+static bfd_byte *
+nds32_elf_get_relocated_section_contents (bfd *abfd,
+ struct bfd_link_info *link_info,
+ struct bfd_link_order *link_order,
+ bfd_byte *data,
+ bfd_boolean relocatable,
+ asymbol **symbols)
+{
+ bfd *input_bfd = link_order->u.indirect.section->owner;
+ asection *input_section = link_order->u.indirect.section;
+ long reloc_size;
+ arelent **reloc_vector;
+ long reloc_count;
+
+ reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section);
+ if (reloc_size < 0)
+ return NULL;
+
+ /* Read in the section. */
+ if (!nds32_get_section_contents (input_bfd, input_section, &data, FALSE))
+ return NULL;
+
+ if (reloc_size == 0)
+ return data;
+
+ reloc_vector = (arelent **) bfd_malloc (reloc_size);
+ if (reloc_vector == NULL)
+ return NULL;
+
+ reloc_count = bfd_canonicalize_reloc (input_bfd, input_section,
+ reloc_vector, symbols);
+ if (reloc_count < 0)
+ goto error_return;
+
+ if (reloc_count > 0)
+ {
+ arelent **parent;
+ for (parent = reloc_vector; *parent != NULL; parent++)
+ {
+ char *error_message = NULL;
+ asymbol *symbol;
+ bfd_reloc_status_type r;
+
+ symbol = *(*parent)->sym_ptr_ptr;
+ if (symbol->section && discarded_section (symbol->section))
+ {
+ bfd_byte *p;
+ static reloc_howto_type none_howto
+ = HOWTO (0, 0, 0, 0, FALSE, 0, complain_overflow_dont, NULL,
+ "unused", FALSE, 0, 0, FALSE);
+
+ p = data + (*parent)->address * bfd_octets_per_byte (input_bfd);
+ _bfd_clear_contents ((*parent)->howto, input_bfd, input_section,
+ p);
+ (*parent)->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
+ (*parent)->addend = 0;
+ (*parent)->howto = &none_howto;
+ r = bfd_reloc_ok;
+ }
+ else
+ r = bfd_perform_relocation (input_bfd, *parent, data,
+ input_section,
+ relocatable ? abfd : NULL,
+ &error_message);
+
+ if (relocatable)
+ {
+ asection *os = input_section->output_section;
+
+ /* A partial link, so keep the relocs. */
+ os->orelocation[os->reloc_count] = *parent;
+ os->reloc_count++;
+ }
+
+ if (r != bfd_reloc_ok)
+ {
+ switch (r)
+ {
+ case bfd_reloc_undefined:
+ if (!((*link_info->callbacks->undefined_symbol)
+ (link_info, bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
+ input_bfd, input_section, (*parent)->address, TRUE)))
+ goto error_return;
+ break;
+ case bfd_reloc_dangerous:
+ BFD_ASSERT (error_message != NULL);
+ if (!((*link_info->callbacks->reloc_dangerous)
+ (link_info, error_message, input_bfd, input_section,
+ (*parent)->address)))
+ goto error_return;
+ break;
+ case bfd_reloc_overflow:
+ if (!((*link_info->callbacks->reloc_overflow)
+ (link_info, NULL,
+ bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
+ (*parent)->howto->name, (*parent)->addend,
+ input_bfd, input_section, (*parent)->address)))
+ goto error_return;
+ break;
+ case bfd_reloc_outofrange:
+ /* PR ld/13730:
+ This error can result when processing some partially
+ complete binaries. Do not abort, but issue an error
+ message instead. */
+ link_info->callbacks->einfo
+ (_("%X%P: %B(%A): relocation \"%R\" goes out of range\n"),
+ abfd, input_section, * parent);
+ goto error_return;
+
+ default:
+ abort ();
+ break;
+ }
+ }
+ }
+ }
+
+ free (reloc_vector);
+ return data;
+
+error_return:
+ free (reloc_vector);
+ return NULL;
+}
+
+/* Check target symbol. */
+
+static bfd_boolean
+nds32_elf_is_target_special_symbol (bfd *abfd ATTRIBUTE_UNUSED, asymbol *sym)
+{
+ if (!sym || !sym->name || sym->name[0] != '$')
+ return FALSE;
+ return TRUE;
+}
+
+/* nds32 find maybe function sym. Ignore target special symbol
+ first, and then go the general function. */
+
+static bfd_size_type
+nds32_elf_maybe_function_sym (const asymbol *sym, asection *sec,
+ bfd_vma *code_off)
+{
+ if (nds32_elf_is_target_special_symbol (NULL, (asymbol *) sym))
+ return 0;
+
+ return _bfd_elf_maybe_function_sym (sym, sec, code_off);
+}
+
+
+/* Link-time IFC relaxation.
+ In this optimization, we chains jump instructions
+ of the same destination with ifcall. */
+
+
+/* List to save jal and j relocation. */
+struct elf_nds32_ifc_symbol_entry
+{
+ asection *sec;
+ struct elf_link_hash_entry *h;
+ struct elf_nds32_ifc_irel_list *irel_head;
+ unsigned long insn;
+ int times;
+ int enable; /* Apply ifc. */
+ int ex9_enable; /* Apply ifc after ex9. */
+ struct elf_nds32_ifc_symbol_entry *next;
+};
+
+struct elf_nds32_ifc_irel_list
+{
+ Elf_Internal_Rela *irel;
+ asection *sec;
+ bfd_vma addr;
+ /* If this is set, then it is the last instruction for
+ ifc-chain, so it must be keep for the actual branching. */
+ int keep;
+ struct elf_nds32_ifc_irel_list *next;
+};
+
+static struct elf_nds32_ifc_symbol_entry *ifc_symbol_head = NULL;
+
+/* Insert symbol of jal and j for ifc. */
+
+static void
+nds32_elf_ifc_insert_symbol (asection *sec,
+ struct elf_link_hash_entry *h,
+ Elf_Internal_Rela *irel,
+ unsigned long insn)
+{
+ struct elf_nds32_ifc_symbol_entry *ptr = ifc_symbol_head;
+
+ /* Check there is target of existing entry the same as the new one. */
+ while (ptr != NULL)
+ {
+ if (((h == NULL && ptr->sec == sec
+ && ELF32_R_SYM (ptr->irel_head->irel->r_info) == ELF32_R_SYM (irel->r_info)
+ && ptr->irel_head->irel->r_addend == irel->r_addend)
+ || h != NULL)
+ && ptr->h == h
+ && ptr->insn == insn)
+ {
+ /* The same target exist, so insert into list. */
+ struct elf_nds32_ifc_irel_list *irel_list = ptr->irel_head;
+
+ while (irel_list->next != NULL)
+ irel_list = irel_list->next;
+ irel_list->next = bfd_malloc (sizeof (struct elf_nds32_ifc_irel_list));
+ irel_list = irel_list->next;
+ irel_list->irel = irel;
+ irel_list->keep = 1;
+
+ if (h == NULL)
+ irel_list->sec = NULL;
+ else
+ irel_list->sec = sec;
+ irel_list->next = NULL;
+ return;
+ }
+ if (ptr->next == NULL)
+ break;
+ ptr = ptr->next;
+ }
+
+ /* There is no same target entry, so build a new one. */
+ if (ifc_symbol_head == NULL)
+ {
+ ifc_symbol_head = bfd_malloc (sizeof (struct elf_nds32_ifc_symbol_entry));
+ ptr = ifc_symbol_head;
+ }
+ else
+ {
+ ptr->next = bfd_malloc (sizeof (struct elf_nds32_ifc_symbol_entry));
+ ptr = ptr->next;
+ }
+
+ ptr->h = h;
+ ptr->irel_head = bfd_malloc (sizeof (struct elf_nds32_ifc_irel_list));
+ ptr->irel_head->irel = irel;
+ ptr->insn = insn;
+ ptr->irel_head->keep = 1;
+
+ if (h == NULL)
+ {
+ /* Local symbols. */
+ ptr->sec = sec;
+ ptr->irel_head->sec = NULL;
+ }
+ else
+ {
+ /* Global symbol. */
+ ptr->sec = NULL;
+ ptr->irel_head->sec = sec;
+ }
+
+ ptr->irel_head->next = NULL;
+ ptr->times = 0;
+ ptr->enable = 0;
+ ptr->ex9_enable = 0;
+ ptr->next = NULL;
+}
+
+/* Check if ignoring ifc. */
+
+static bfd_boolean
+nds32_elf_ifc_check_region (Elf_Internal_Rela **irel,
+ Elf_Internal_Rela *irelend,
+ struct bfd_link_info *info)
+{
+ struct elf_nds32_link_hash_table *table;
+ int nest = 0;
+ bfd_boolean ifc_loop_aware;
+ bfd_boolean security = FALSE;
+
+ table = nds32_elf_hash_table (info);
+ ifc_loop_aware = table->ifc_loop_aware;
+
+ if ((ELF32_R_TYPE ((*irel)->r_info) == R_NDS32_RELAX_REGION_BEGIN
+ && ((*irel)->r_addend & R_NDS32_RELAX_REGION_NO_IFC_FLAG
+ || (ifc_loop_aware == 1
+ && ((*irel)->r_addend & R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG))
+ || (*irel)->r_addend & R_NDS32_RELAX_REGION_OMIT_FP_FLAG))
+ || (ELF32_R_TYPE ((*irel)->r_info) == R_NDS32_SECURITY_16))
+ {
+ /* Check the region if loop, no_ifc, or security. If it is true,
+ ignore the region till region end. */
+ if (ELF32_R_TYPE ((*irel)->r_info) == R_NDS32_SECURITY_16)
+ security = TRUE;
+ else
+ nest++;
+
+ (*irel)++;
+ while ((*irel) != NULL && (*irel) < irelend)
+ {
+ if (ELF32_R_TYPE ((*irel)->r_info) == R_NDS32_RELAX_REGION_BEGIN
+ && ((*irel)->r_addend & R_NDS32_RELAX_REGION_NO_IFC_FLAG
+ || (ifc_loop_aware == 1
+ && ((*irel)->r_addend & R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG))
+ || (*irel)->r_addend & R_NDS32_RELAX_REGION_OMIT_FP_FLAG))
+ nest++;
+
+ else if (ELF32_R_TYPE ((*irel)->r_info) == R_NDS32_SECURITY_16
+ && (*irel)->r_addend != NDS32_SECURITY_END)
+ security = TRUE;
+
+ if (ELF32_R_TYPE ((*irel)->r_info) == R_NDS32_RELAX_REGION_END
+ && ((*irel)->r_addend & R_NDS32_RELAX_REGION_NO_IFC_FLAG
+ || (ifc_loop_aware == 1
+ && ((*irel)->r_addend & R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG))
+ || (*irel)->r_addend & R_NDS32_RELAX_REGION_OMIT_FP_FLAG))
+ {
+ if (nest > 0)
+ nest--;
+ }
+ else if (ELF32_R_TYPE ((*irel)->r_info) == R_NDS32_SECURITY_16
+ && (*irel)->r_addend == NDS32_SECURITY_END)
+ security = FALSE;
+
+ if (nest <= 0 && !security)
+ break;
+
+ (*irel)++;
+ }
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+/* Gather all jal and j instructions. */
+
+static bfd_boolean
+nds32_elf_ifc_calc (struct bfd_link_info *info,
+ bfd *abfd, asection *sec)
+{
+ Elf_Internal_Rela *internal_relocs;
+ Elf_Internal_Rela *irelend;
+ Elf_Internal_Rela *irel;
+ Elf_Internal_Shdr *symtab_hdr;
+ bfd_byte *contents = NULL;
+ uint32_t insn, insn_with_reg;
+ unsigned long r_symndx;
+ struct elf_link_hash_entry *h;
+ struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (abfd);
+
+ internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
+ TRUE /* keep_memory */);
+ irelend = internal_relocs + sec->reloc_count;
+ symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
+
+ /* Check if the object enable ifc. */
+ irel = find_relocs_at_address (internal_relocs, internal_relocs, irelend,
+ R_NDS32_RELAX_ENTRY);
+
+ if (irel == NULL
+ || irel >= irelend
+ || ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_ENTRY
+ || (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_ENTRY
+ && !(irel->r_addend & R_NDS32_RELAX_ENTRY_IFC_FLAG)))
+ return TRUE;
+
+ if (!nds32_get_section_contents (abfd, sec, &contents, TRUE))
+ return FALSE;
+
+ while (irel != NULL && irel < irelend)
+ {
+ /* Traverse all relocation and gather all of them to build the list. */
+
+ if (nds32_elf_ifc_check_region (&irel, irelend, info))
+ if (irel == NULL || irel >= irelend)
+ return TRUE;
+
+
+ if (ELF32_R_TYPE (irel->r_info) == R_NDS32_25_PCREL_RELA)
+ {
+ insn = bfd_getb32 (contents + irel->r_offset);
+ nds32_elf_get_insn_with_reg (irel, insn, &insn_with_reg);
+ r_symndx = ELF32_R_SYM (irel->r_info);
+ if (r_symndx < symtab_hdr->sh_info)
+ {
+ /* Local symbol. */
+ nds32_elf_ifc_insert_symbol (sec, NULL, irel, insn_with_reg);
+ }
+ else
+ {
+ /* External symbol. */
+ h = sym_hashes[r_symndx - symtab_hdr->sh_info];
+ nds32_elf_ifc_insert_symbol (sec, h, irel, insn_with_reg);
+ }
+ }
+ irel++;
+ }
+ return TRUE;
+}
+
+/* Determine whether j and jal should be substituted. */
+
+static void
+nds32_elf_ifc_filter (struct bfd_link_info *info)
+{
+ struct elf_nds32_ifc_symbol_entry *ptr = ifc_symbol_head;
+ struct elf_nds32_ifc_irel_list *irel_ptr = NULL;
+ struct elf_nds32_ifc_irel_list *irel_keeper = NULL;
+ struct elf_nds32_link_hash_table *table;
+ int target_optimize;
+ bfd_vma address;
+
+ table = nds32_elf_hash_table (info);
+ target_optimize = table->target_optimize;
+ while (ptr)
+ {
+ irel_ptr = ptr->irel_head;
+ if (ptr->h == NULL)
+ {
+ /* Local symbol. */
+ irel_keeper = irel_ptr;
+ while (irel_ptr && irel_ptr->next)
+ {
+ /* Check there is jump target can be used. */
+ if ((irel_ptr->next->irel->r_offset
+ - irel_keeper->irel->r_offset) > 1022)
+ irel_keeper = irel_ptr->next;
+ else
+ {
+ ptr->enable = 1;
+ irel_ptr->keep = 0;
+ }
+ irel_ptr = irel_ptr->next;
+ }
+ }
+ else
+ {
+ /* Global symbol. */
+ /* We have to get the absolute address and decide
+ whether to keep it or not.*/
+ while (irel_ptr)
+ {
+ address = (irel_ptr->irel->r_offset
+ + irel_ptr->sec->output_section->vma
+ + irel_ptr->sec->output_offset);
+ irel_ptr->addr = address;
+ irel_ptr = irel_ptr->next;
+ }
+
+ irel_ptr = ptr->irel_head;
+ while (irel_ptr)
+ {
+ /* Sort by address. */
+ struct elf_nds32_ifc_irel_list *irel_dest = irel_ptr;
+ struct elf_nds32_ifc_irel_list *irel_temp = irel_ptr;
+ struct elf_nds32_ifc_irel_list *irel_ptr_prev = NULL;
+ struct elf_nds32_ifc_irel_list *irel_dest_prev = NULL;
+
+ /* Get the smallest one. */
+ while (irel_temp->next)
+ {
+ if (irel_temp->next->addr < irel_dest->addr)
+ {
+ irel_dest_prev = irel_temp;
+ irel_dest = irel_temp->next;
+ }
+ irel_temp = irel_temp->next;
+ }
+
+ if (irel_dest != irel_ptr)
+ {
+ if (irel_ptr_prev)
+ irel_ptr_prev->next = irel_dest;
+ if (irel_dest_prev)
+ irel_dest_prev->next = irel_ptr;
+ irel_temp = irel_ptr->next;
+ irel_ptr->next = irel_dest->next;
+ irel_dest->next = irel_temp;
+ }
+ irel_ptr_prev = irel_ptr;
+ irel_ptr = irel_ptr->next;
+ }
+
+ irel_ptr = ptr->irel_head;
+ irel_keeper = irel_ptr;
+ while (irel_ptr && irel_ptr->next)
+ {
+ if ((irel_ptr->next->addr - irel_keeper->addr) > 1022)
+ irel_keeper = irel_ptr->next;
+ else
+ {
+ ptr->enable = 1;
+ irel_ptr->keep = 0;
+ }
+ irel_ptr = irel_ptr->next;
+ }
+ }
+
+ /* Ex9 enable. Reserve it for ex9. */
+ if ((target_optimize & NDS32_RELAX_EX9_ON)
+ && ptr->irel_head != irel_keeper)
+ ptr->enable = 0;
+ ptr = ptr->next;
+ }
+}
+
+/* Determine whether j and jal should be substituted after ex9 done. */
+
+static void
+nds32_elf_ifc_filter_after_ex9 (void)
+{
+ struct elf_nds32_ifc_symbol_entry *ptr = ifc_symbol_head;
+ struct elf_nds32_ifc_irel_list *irel_ptr = NULL;
+
+ while (ptr)
+ {
+ if (ptr->enable == 0)
+ {
+ /* Check whether ifc is applied or not. */
+ irel_ptr = ptr->irel_head;
+ ptr->ex9_enable = 1;
+ while (irel_ptr)
+ {
+ if (ELF32_R_TYPE (irel_ptr->irel->r_info) == R_NDS32_TRAN)
+ {
+ /* Ex9 already. */
+ ptr->ex9_enable = 0;
+ break;
+ }
+ irel_ptr = irel_ptr->next;
+ }
+ }
+ ptr = ptr->next;
+ }
+}
+
+/* Wrapper to do ifc relaxation. */
+
+bfd_boolean
+nds32_elf_ifc_finish (struct bfd_link_info *info)
+{
+ int relax_status;
+ struct elf_nds32_link_hash_table *table;
+
+ table = nds32_elf_hash_table (info);
+ relax_status = table->relax_status;
+
+ if (!(relax_status & NDS32_RELAX_JUMP_IFC_DONE))
+ nds32_elf_ifc_filter (info);
+ else
+ nds32_elf_ifc_filter_after_ex9 ();
+
+ if (!nds32_elf_ifc_replace (info))
+ return FALSE;
+
+ if (table)
+ table->relax_status |= NDS32_RELAX_JUMP_IFC_DONE;
+ return TRUE;
+}
+
+/* Traverse the result of ifc filter and replace it with ifcall9. */
+
+static bfd_boolean
+nds32_elf_ifc_replace (struct bfd_link_info *info)
+{
+ struct elf_nds32_ifc_symbol_entry *ptr = ifc_symbol_head;
+ struct elf_nds32_ifc_irel_list *irel_ptr = NULL;
+ nds32_elf_blank_t *relax_blank_list = NULL;
+ bfd_byte *contents = NULL;
+ Elf_Internal_Rela *internal_relocs;
+ Elf_Internal_Rela *irel;
+ Elf_Internal_Rela *irelend;
+ unsigned short insn16 = INSN_IFCALL9;
+ struct elf_nds32_link_hash_table *table;
+ int relax_status;
+
+ table = nds32_elf_hash_table (info);
+ relax_status = table->relax_status;
+
+ while (ptr)
+ {
+ /* Traverse the ifc gather list, and replace the
+ filter entries by ifcall9. */
+ if ((!(relax_status & NDS32_RELAX_JUMP_IFC_DONE)
+ && ptr->enable == 1)
+ || ((relax_status & NDS32_RELAX_JUMP_IFC_DONE)
+ && ptr->ex9_enable == 1))
+ {
+ irel_ptr = ptr->irel_head;
+ if (ptr->h == NULL)
+ {
+ /* Local symbol. */
+ internal_relocs = _bfd_elf_link_read_relocs
+ (ptr->sec->owner, ptr->sec, NULL, NULL, TRUE /* keep_memory */);
+ irelend = internal_relocs + ptr->sec->reloc_count;
+
+ if (!nds32_get_section_contents (ptr->sec->owner, ptr->sec,
+ &contents, TRUE))
+ return FALSE;
+
+ while (irel_ptr)
+ {
+ if (irel_ptr->keep == 0 && irel_ptr->next)
+ {
+ /* The one can be replaced. We have to check whether
+ there is any alignment point in the region. */
+ irel = irel_ptr->irel;
+ while (((irel_ptr->next->keep == 0
+ && irel < irel_ptr->next->irel)
+ || (irel_ptr->next->keep == 1 && irel < irelend))
+ && !(ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL
+ && (irel->r_addend & 0x1f) == 2))
+ irel++;
+ if (irel >= irelend
+ || !(ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL
+ && (irel->r_addend & 0x1f) == 2
+ && ((irel->r_offset - get_nds32_elf_blank_total
+ (&relax_blank_list, irel->r_offset, 1))
+ & 0x02) == 0))
+ {
+ /* Replace by ifcall9. */
+ bfd_putb16 (insn16, contents + irel_ptr->irel->r_offset);
+ if (!insert_nds32_elf_blank_recalc_total
+ (&relax_blank_list, irel_ptr->irel->r_offset + 2, 2))
+ return FALSE;
+ irel_ptr->irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (irel_ptr->irel->r_info),
+ R_NDS32_10IFCU_PCREL_RELA);
+ }
+ }
+ irel_ptr = irel_ptr->next;
+ }
+
+ /* Delete the redundant code. */
+ if (relax_blank_list)
+ {
+ nds32_elf_relax_delete_blanks (ptr->sec->owner, ptr->sec,
+ relax_blank_list);
+ relax_blank_list = NULL;
+ }
+ }
+ else
+ {
+ /* Global symbol. */
+ while (irel_ptr)
+ {
+ if (irel_ptr->keep == 0 && irel_ptr->next)
+ {
+ /* The one can be replaced, and we have to check
+ whether there is any alignment point in the region. */
+ internal_relocs = _bfd_elf_link_read_relocs
+ (irel_ptr->sec->owner, irel_ptr->sec, NULL, NULL,
+ TRUE /* keep_memory */);
+ irelend = internal_relocs + irel_ptr->sec->reloc_count;
+ if (!nds32_get_section_contents (irel_ptr->sec->owner,
+ irel_ptr->sec, &contents,
+ TRUE))
+ return FALSE;
+
+ irel = irel_ptr->irel;
+ while (((irel_ptr->sec == irel_ptr->next->sec
+ && irel_ptr->next->keep == 0
+ && irel < irel_ptr->next->irel)
+ || ((irel_ptr->sec != irel_ptr->next->sec
+ || irel_ptr->next->keep == 1)
+ && irel < irelend))
+ && !(ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL
+ && (irel->r_addend & 0x1f) == 2))
+ irel++;
+ if (irel >= irelend
+ || !(ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL
+ && (irel->r_addend & 0x1f) == 2
+ && ((irel->r_offset
+ - get_nds32_elf_blank_total (&relax_blank_list,
+ irel->r_offset, 1)) & 0x02) == 0))
+ {
+ /* Replace by ifcall9. */
+ bfd_putb16 (insn16, contents + irel_ptr->irel->r_offset);
+ if (!insert_nds32_elf_blank_recalc_total
+ (&relax_blank_list, irel_ptr->irel->r_offset + 2, 2))
+ return FALSE;
+
+ /* Delete the redundant code, and clear the relocation. */
+ nds32_elf_relax_delete_blanks (irel_ptr->sec->owner,
+ irel_ptr->sec,
+ relax_blank_list);
+ irel_ptr->irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (irel_ptr->irel->r_info),
+ R_NDS32_10IFCU_PCREL_RELA);
+ relax_blank_list = NULL;
+ }
+ }
+
+ irel_ptr = irel_ptr->next;
+ }
+ }
+ }
+ ptr = ptr->next;
+ }
+
+ return TRUE;
+}
+
+/* Relocate ifcall. */
+
+static bfd_boolean
+nds32_elf_ifc_reloc (void)
+{
+ struct elf_nds32_ifc_symbol_entry *ptr = ifc_symbol_head;
+ struct elf_nds32_ifc_irel_list *irel_ptr = NULL;
+ struct elf_nds32_ifc_irel_list *irel_keeper = NULL;
+ bfd_vma relocation, address;
+ unsigned short insn16;
+ static bfd_boolean done = FALSE;
+
+ if (done)
+ return TRUE;
+
+ done = TRUE;
+
+ bfd_byte *contents = NULL;
+
+ while (ptr)
+ {
+ /* Check the entry is enable ifcall. */
+ if (ptr->enable == 1 || ptr->ex9_enable == 1)
+ {
+ /* Get the reserve jump. */
+ irel_ptr = ptr->irel_head;
+ while (irel_ptr)
+ {
+ if (irel_ptr->keep == 1)
+ {
+ irel_keeper = irel_ptr;
+ break;
+ }
+ irel_ptr = irel_ptr->next;
+ }
+
+ irel_ptr = ptr->irel_head;
+ if (ptr->h == NULL)
+ {
+ /* Local symbol. */
+ if (!nds32_get_section_contents (ptr->sec->owner, ptr->sec,
+ &contents, TRUE))
+ return FALSE;
+
+ while (irel_ptr)
+ {
+ if (irel_ptr->keep == 0
+ && ELF32_R_TYPE (irel_ptr->irel->r_info) == R_NDS32_10IFCU_PCREL_RELA)
+ {
+ relocation = irel_keeper->irel->r_offset;
+ relocation = relocation - irel_ptr->irel->r_offset;
+ while (irel_keeper && relocation > 1022)
+ {
+ irel_keeper = irel_keeper->next;
+ if (irel_keeper && irel_keeper->keep == 1)
+ {
+ relocation = irel_keeper->irel->r_offset;
+ relocation = relocation - irel_ptr->irel->r_offset;
+ }
+ }
+ if (relocation > 1022)
+ {
+ /* Double check. */
+ irel_keeper = ptr->irel_head;
+ while (irel_keeper)
+ {
+ if (irel_keeper->keep == 1)
+ {
+ relocation = irel_keeper->irel->r_offset;
+ relocation = relocation - irel_ptr->irel->r_offset;
+ }
+ if (relocation <= 1022)
+ break;
+ irel_keeper = irel_keeper->next;
+ }
+ if (!irel_keeper)
+ return FALSE;
+ }
+ irel_ptr->irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (irel_ptr->irel->r_info),
+ R_NDS32_NONE);
+ insn16 = INSN_IFCALL9 | (relocation >> 1);
+ bfd_putb16 (insn16, contents + irel_ptr->irel->r_offset);
+ }
+ irel_ptr = irel_ptr->next;
+ }
+ }
+ else
+ {
+ /* Global symbol. */
+ while (irel_ptr)
+ {
+ if (irel_ptr->keep == 0
+ && ELF32_R_TYPE (irel_ptr->irel->r_info) == R_NDS32_10IFCU_PCREL_RELA)
+ {
+ /* Get the distance between ifcall and jump. */
+ relocation = (irel_keeper->irel->r_offset
+ + irel_keeper->sec->output_section->vma
+ + irel_keeper->sec->output_offset);
+ address = (irel_ptr->irel->r_offset
+ + irel_ptr->sec->output_section->vma
+ + irel_ptr->sec->output_offset);
+ relocation = relocation - address;
+
+ /* The distance is over ragne, find callee again. */
+ while (irel_keeper && relocation > 1022)
+ {
+ irel_keeper = irel_keeper->next;
+ if (irel_keeper && irel_keeper->keep ==1)
+ {
+ relocation = (irel_keeper->irel->r_offset
+ + irel_keeper->sec->output_section->vma
+ + irel_keeper->sec->output_offset);
+ relocation = relocation - address;
+ }
+ }
+
+ if (relocation > 1022)
+ {
+ /* Double check. */
+ irel_keeper = ptr->irel_head;
+ while (irel_keeper)
+ {
+ if (irel_keeper->keep == 1)
+ {
+
+ relocation = (irel_keeper->irel->r_offset
+ + irel_keeper->sec->output_section->vma
+ + irel_keeper->sec->output_offset);
+ relocation = relocation - address;
+ }
+ if (relocation <= 1022)
+ break;
+ irel_keeper = irel_keeper->next;
+ }
+ if (!irel_keeper)
+ return FALSE;
+ }
+ if (!nds32_get_section_contents
+ (irel_ptr->sec->owner, irel_ptr->sec, &contents, TRUE))
+ return FALSE;
+ insn16 = INSN_IFCALL9 | (relocation >> 1);
+ bfd_putb16 (insn16, contents + irel_ptr->irel->r_offset);
+ irel_ptr->irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (irel_ptr->irel->r_info),
+ R_NDS32_NONE);
+ }
+ irel_ptr =irel_ptr->next;
+ }
+ }
+ }
+ ptr = ptr->next;
+ }
+
+ return TRUE;
+}
+
+/* End of IFC relaxation. */
+
+/* EX9 Instruction Table Relaxation. */
+#define EX9_SECTION ".ex9.itable"
+
+/* Global hash list. */
+struct elf_link_hash_entry_list
+{
+ struct elf_link_hash_entry *h;
+ struct elf_link_hash_entry_list *next;
+};
+
+/* Save different destination but same insn. */
+struct elf_link_hash_entry_mul_list
+{
+ /* Global symbol times. */
+ int times;
+ /* Save relocation for each global symbol but useful?? */
+ Elf_Internal_Rela *irel;
+ /* For sethi, two sethi may have the same high-part but different low-parts. */
+ Elf_Internal_Rela rel_backup;
+ struct elf_link_hash_entry_list *h_list;
+ struct elf_link_hash_entry_mul_list *next;
+};
+
+/* Instruction hash table. */
+struct elf_nds32_code_hash_entry
+{
+ struct bfd_hash_entry root;
+ int times;
+ /* For insn that can use relocation or constant ex: sethi. */
+ int const_insn;
+ asection *sec;
+ struct elf_link_hash_entry_mul_list *m_list;
+ /* Using r_addend. */
+ Elf_Internal_Rela *irel;
+ /* Using r_info. */
+ Elf_Internal_Rela rel_backup;
+};
+
+/* Instruction count list. */
+struct elf_nds32_insn_times_entry
+{
+ const char *string;
+ int times;
+ int order;
+ asection *sec;
+ struct elf_link_hash_entry_mul_list *m_list;
+ Elf_Internal_Rela *irel;
+ Elf_Internal_Rela rel_backup;
+ struct elf_nds32_insn_times_entry *next;
+};
+
+/* J and JAL symbol list. */
+struct elf_nds32_symbol_entry
+{
+ char *string;
+ unsigned long insn;
+ struct elf_nds32_symbol_entry *next;
+};
+
+/* Relocation list. */
+struct elf_nds32_irel_entry
+{
+ Elf_Internal_Rela *irel;
+ struct elf_nds32_irel_entry *next;
+};
+
+/* ex9.it insn need to be fixed. */
+struct elf_nds32_ex9_refix
+{
+ Elf_Internal_Rela *irel;
+ asection *sec;
+ struct elf_link_hash_entry *h;
+ int order;
+ struct elf_nds32_ex9_refix *next;
+};
+
+static struct bfd_hash_table ex9_code_table;
+static struct elf_nds32_insn_times_entry *ex9_insn_head = NULL;
+static struct elf_nds32_ex9_refix *ex9_refix_head = NULL;
+
+/* EX9 hash function. */
+
+static struct bfd_hash_entry *
+nds32_elf_code_hash_newfunc (struct bfd_hash_entry *entry,
+ struct bfd_hash_table *table,
+ const char *string)
+{
+ struct elf_nds32_code_hash_entry *ret;
+
+ /* Allocate the structure if it has not already been allocated by a
+ subclass. */
+ if (entry == NULL)
+ {
+ entry = (struct bfd_hash_entry *)
+ bfd_hash_allocate (table, sizeof (*ret));
+ if (entry == NULL)
+ return entry;
+ }
+
+ /* Call the allocation method of the superclass. */
+ entry = bfd_hash_newfunc (entry, table, string);
+ if (entry == NULL)
+ return entry;
+
+ ret = (struct elf_nds32_code_hash_entry*) entry;
+ ret->times = 0;
+ ret->const_insn = 0;
+ ret->m_list = NULL;
+ ret->sec = NULL;
+ ret->irel = NULL;
+ return &ret->root;
+}
+
+/* Insert ex9 entry
+ this insert must be stable sorted by times. */
+
+static void
+nds32_elf_ex9_insert_entry (struct elf_nds32_insn_times_entry *ptr)
+{
+ struct elf_nds32_insn_times_entry *temp;
+ struct elf_nds32_insn_times_entry *temp2;
+
+ if (ex9_insn_head == NULL)
+ {
+ ex9_insn_head = ptr;
+ ptr->next = NULL;
+ }
+ else
+ {
+ temp = ex9_insn_head;
+ temp2 = ex9_insn_head;
+ while (temp->next &&
+ (temp->next->times >= ptr->times
+ || temp->times == -1))
+ {
+ if (temp->times == -1)
+ temp2 = temp;
+ temp = temp->next;
+ }
+ if (ptr->times > temp->times && temp->times != -1)
+ {
+ ptr->next = temp;
+ if (temp2->times == -1)
+ temp2->next = ptr;
+ else
+ ex9_insn_head = ptr;
+ }
+ else if (temp->next == NULL)
+ {
+ temp->next = ptr;
+ ptr->next = NULL;
+ }
+ else
+ {
+ ptr->next = temp->next;
+ temp->next = ptr;
+ }
+ }
+}
+
+/* Examine each insn times in hash table.
+ Handle multi-link hash entry.
+
+ TODO: This function doesn't assign so much info since it is fake. */
+
+static int
+nds32_elf_examine_insn_times (struct elf_nds32_code_hash_entry *h)
+{
+ struct elf_nds32_insn_times_entry *ptr;
+ int times;
+
+ if (h->m_list == NULL)
+ {
+ /* Local symbol insn or insn without relocation. */
+ if (h->times < 3)
+ return TRUE;
+
+ ptr = (struct elf_nds32_insn_times_entry *)
+ bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
+ ptr->times = h->times;
+ ptr->string = h->root.string;
+ ptr->m_list = NULL;
+ ptr->sec = h->sec;
+ ptr->irel = h->irel;
+ ptr->rel_backup = h->rel_backup;
+ nds32_elf_ex9_insert_entry (ptr);
+ }
+ else
+ {
+ /* Global symbol insn. */
+ /* Only sethi insn has multiple m_list. */
+ struct elf_link_hash_entry_mul_list *m_list = h->m_list;
+
+ times = 0;
+ while (m_list)
+ {
+ times += m_list->times;
+ m_list = m_list->next;
+ }
+ if (times >= 3)
+ {
+ m_list = h->m_list;
+ ptr = (struct elf_nds32_insn_times_entry *)
+ bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
+ ptr->times = times; /* Use the total times. */
+ ptr->string = h->root.string;
+ ptr->m_list = m_list;
+ ptr->sec = h->sec;
+ ptr->irel = m_list->irel;
+ ptr->rel_backup = m_list->rel_backup;
+ nds32_elf_ex9_insert_entry (ptr);
+ }
+ if (h->const_insn == 1)
+ {
+ /* sethi with constant value. */
+ if (h->times < 3)
+ return TRUE;
+
+ ptr = (struct elf_nds32_insn_times_entry *)
+ bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
+ ptr->times = h->times;
+ ptr->string = h->root.string;
+ ptr->m_list = NULL;
+ ptr->sec = NULL;
+ ptr->irel = NULL;
+ ptr->rel_backup = h->rel_backup;
+ nds32_elf_ex9_insert_entry (ptr);
+ }
+ }
+ return TRUE;
+}
+
+/* Count each insn times in hash table.
+ Handle multi-link hash entry. */
+
+static int
+nds32_elf_count_insn_times (struct elf_nds32_code_hash_entry *h)
+{
+ int reservation, times;
+ unsigned long relocation, min_relocation;
+ struct elf_nds32_insn_times_entry *ptr;
+
+ if (h->m_list == NULL)
+ {
+ /* Local symbol insn or insn without relocation. */
+ if (h->times < 3)
+ return TRUE;
+ ptr = (struct elf_nds32_insn_times_entry *)
+ bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
+ ptr->times = h->times;
+ ptr->string = h->root.string;
+ ptr->m_list = NULL;
+ ptr->sec = h->sec;
+ ptr->irel = h->irel;
+ ptr->rel_backup = h->rel_backup;
+ nds32_elf_ex9_insert_entry (ptr);
+ }
+ else
+ {
+ /* Global symbol insn. */
+ /* Only sethi insn has multiple m_list. */
+ struct elf_link_hash_entry_mul_list *m_list = h->m_list;
+
+ if (ELF32_R_TYPE (m_list->rel_backup.r_info) == R_NDS32_HI20_RELA
+ && m_list->next != NULL)
+ {
+ /* Sethi insn has different symbol or addend but has same hi20. */
+ times = 0;
+ reservation = 1;
+ relocation = 0;
+ min_relocation = 0xffffffff;
+ while (m_list)
+ {
+ /* Get the minimum sethi address
+ and calculate how many entry the sethi-list have to use. */
+ if ((m_list->h_list->h->root.type == bfd_link_hash_defined
+ || m_list->h_list->h->root.type == bfd_link_hash_defweak)
+ && (m_list->h_list->h->root.u.def.section != NULL
+ && m_list->h_list->h->root.u.def.section->output_section != NULL))
+ {
+ relocation = (m_list->h_list->h->root.u.def.value +
+ m_list->h_list->h->root.u.def.section->output_section->vma +
+ m_list->h_list->h->root.u.def.section->output_offset);
+ relocation += m_list->irel->r_addend;
+ }
+ else
+ relocation = 0;
+ if (relocation < min_relocation)
+ min_relocation = relocation;
+ times += m_list->times;
+ m_list = m_list->next;
+ }
+ if (min_relocation < ex9_relax_size)
+ reservation = (min_relocation >> 12) + 1;
+ else
+ reservation = (min_relocation >> 12)
+ - ((min_relocation - ex9_relax_size) >> 12) + 1;
+ if ((reservation * 3) <= times)
+ {
+ /* Efficient enough to use ex9. */
+ int i;
+
+ for (i = reservation ; i > 0; i--)
+ {
+ /* Allocate number of reservation ex9 entry. */
+ ptr = (struct elf_nds32_insn_times_entry *)
+ bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
+ ptr->times = h->m_list->times / reservation;
+ ptr->string = h->root.string;
+ ptr->m_list = h->m_list;
+ ptr->sec = h->sec;
+ ptr->irel = h->m_list->irel;
+ ptr->rel_backup = h->m_list->rel_backup;
+ nds32_elf_ex9_insert_entry (ptr);
+ }
+ }
+ }
+ else
+ {
+ /* Normal global symbol that means no different address symbol
+ using same ex9 entry. */
+ if (m_list->times >= 3)
+ {
+ ptr = (struct elf_nds32_insn_times_entry *)
+ bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
+ ptr->times = m_list->times;
+ ptr->string = h->root.string;
+ ptr->m_list = h->m_list;
+ ptr->sec = h->sec;
+ ptr->irel = h->m_list->irel;
+ ptr->rel_backup = h->m_list->rel_backup;
+ nds32_elf_ex9_insert_entry (ptr);
+ }
+ }
+
+ if (h->const_insn == 1)
+ {
+ /* sethi with constant value. */
+ if (h->times < 3)
+ return TRUE;
+
+ ptr = (struct elf_nds32_insn_times_entry *)
+ bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
+ ptr->times = h->times;
+ ptr->string = h->root.string;
+ ptr->m_list = NULL;
+ ptr->sec = NULL;
+ ptr->irel = NULL;
+ ptr->rel_backup = h->rel_backup;
+ nds32_elf_ex9_insert_entry (ptr);
+ }
+ }
+
+ return TRUE;
+}
+
+/* Hash table traverse function. */
+
+static void
+nds32_elf_code_hash_traverse (int (*func) (struct elf_nds32_code_hash_entry*))
+{
+ unsigned int i;
+
+ ex9_code_table.frozen = 1;
+ for (i = 0; i < ex9_code_table.size; i++)
+ {
+ struct bfd_hash_entry *p;
+
+ for (p = ex9_code_table.table[i]; p != NULL; p = p->next)
+ if (!func ((struct elf_nds32_code_hash_entry *) p))
+ goto out;
+ }
+out:
+ ex9_code_table.frozen = 0;
+}
+
+
+/* Give order number to insn list. */
+
+static void
+nds32_elf_order_insn_times (struct bfd_link_info *info)
+{
+ struct elf_nds32_insn_times_entry *ex9_insn;
+ struct elf_nds32_insn_times_entry *temp = NULL;
+ struct elf_nds32_link_hash_table *table;
+ int ex9_limit;
+ int number = 0;
+
+ if (ex9_insn_head == NULL)
+ return;
+
+/* The max number of entries is 512. */
+ ex9_insn = ex9_insn_head;
+ table = nds32_elf_hash_table (info);
+ ex9_limit = table->ex9_limit;
+
+ ex9_insn = ex9_insn_head;
+
+ while (ex9_insn != NULL && number < ex9_limit)
+ {
+ ex9_insn->order = number;
+ number++;
+ temp = ex9_insn;
+ ex9_insn = ex9_insn->next;
+ }
+
+ if (ex9_insn && temp)
+ temp->next = NULL;
+
+ while (ex9_insn != NULL)
+ {
+ /* Free useless entry. */
+ temp = ex9_insn;
+ ex9_insn = ex9_insn->next;
+ free (temp);
+ }
+}
+
+/* Get section .ex9.itable. */
+
+static asection*
+nds32_elf_ex9_get_section (bfd *input_bfds)
+{
+ asection *sec = NULL;
+ bfd *abfd;
+
+ if (ex9_section != NULL)
+ return ex9_section;
+
+ for (abfd = input_bfds; abfd != NULL; abfd = abfd->link_next)
+ {
+ sec = bfd_get_section_by_name (abfd, EX9_SECTION);
+ if (sec != NULL)
+ break;
+ }
+
+ ex9_section = sec;
+ return sec;
+}
+
+/* Build .ex9.itable section. */
+
+static void
+nds32_elf_ex9_build_itable (struct bfd_link_info *link_info)
+{
+ asection *table_sec;
+ struct elf_nds32_insn_times_entry *ptr;
+ int number = 0;
+ bfd_byte *contents = NULL;
+ struct elf_nds32_link_hash_table *table;
+
+ table = nds32_elf_hash_table (link_info);
+
+ /* Find the section .ex9.itable, and put all entries into it. */
+ table_sec = nds32_elf_ex9_get_section (link_info->input_bfds);
+
+ if (table_sec != NULL)
+ {
+ if (!nds32_get_section_contents (table_sec->owner, table_sec,
+ &contents, TRUE))
+ return;
+
+ for (ptr = ex9_insn_head; ptr !=NULL ; ptr = ptr->next)
+ number++;
+
+ table_sec->size = number * 4;
+
+ if (number == 0)
+ return;
+
+ /* Check $itb register if set. */
+ if (!table->ex9_import_file
+ && !bfd_link_hash_lookup (link_info->hash, "_ITB_BASE_",
+ FALSE, FALSE, TRUE))
+ {
+ (*_bfd_error_handler)
+ (_("\nError: Instruction Table(IT) is used, but Instruction "
+ "Table Base($ITB) isn't set.\nPlease add the following "
+ "instructions in _start of crt0.S:\n"
+ "\"la $r0,_ITB_BASE_;mtusr $r0,$ITB\""));
+ exit (1);
+ }
+
+ elf_elfheader (link_info->output_bfd)->e_flags |= E_NDS32_HAS_EX9_INST;
+ number = 0;
+ for (ptr = ex9_insn_head; ptr !=NULL ; ptr = ptr->next)
+ {
+ long val;
+
+ val = strtol (ptr->string, NULL, 16);
+ bfd_putb32 ((bfd_vma) val, (char *) contents + (number * 4));
+ number++;
+ }
+ }
+}
+
+/* Get insn with regs according to relocation type. */
+
+static void
+nds32_elf_get_insn_with_reg (Elf_Internal_Rela *irel,
+ uint32_t insn, uint32_t *insn_with_reg)
+{
+ reloc_howto_type *howto = NULL;
+
+ if (irel == NULL
+ || (ELF32_R_TYPE (irel->r_info) >= (int) ARRAY_SIZE (nds32_elf_howto_table)
+ && (ELF32_R_TYPE (irel->r_info) - R_NDS32_RELAX_ENTRY)
+ >= (int) ARRAY_SIZE (nds32_elf_relax_howto_table)))
+ {
+ *insn_with_reg = insn;
+ return;
+ }
+
+ howto = bfd_elf32_bfd_reloc_type_table_lookup (ELF32_R_TYPE (irel->r_info));
+ *insn_with_reg = insn & (0xffffffff ^ howto->dst_mask);
+}
+
+/* Mask number of address bits according to relocation. */
+
+static unsigned long
+nds32_elf_irel_mask (Elf_Internal_Rela *irel)
+{
+ reloc_howto_type *howto = NULL;
+
+ if (irel == NULL
+ || (ELF32_R_TYPE (irel->r_info) >= (int) ARRAY_SIZE (nds32_elf_howto_table)
+ && (ELF32_R_TYPE (irel->r_info) - R_NDS32_RELAX_ENTRY)
+ >= (int) ARRAY_SIZE (nds32_elf_relax_howto_table)))
+ return 0;
+
+ howto = bfd_elf32_bfd_reloc_type_table_lookup (ELF32_R_TYPE (irel->r_info));
+ return howto->dst_mask;
+}
+
+static void
+nds32_elf_insert_irel_entry (struct elf_nds32_irel_entry **irel_list,
+ struct elf_nds32_irel_entry *irel_ptr)
+{
+ if (*irel_list == NULL)
+ {
+ *irel_list = irel_ptr;
+ irel_ptr->next = NULL;
+ }
+ else
+ {
+ irel_ptr->next = *irel_list;
+ *irel_list = irel_ptr;
+ }
+}
+
+static void
+nds32_elf_ex9_insert_fix (asection * sec, Elf_Internal_Rela * irel,
+ struct elf_link_hash_entry *h, int order)
+{
+ struct elf_nds32_ex9_refix *ptr;
+
+ ptr = bfd_malloc (sizeof (struct elf_nds32_ex9_refix));
+ ptr->sec = sec;
+ ptr->irel = irel;
+ ptr->h = h;
+ ptr->order = order;
+ ptr->next = NULL;
+
+ if (ex9_refix_head == NULL)
+ ex9_refix_head = ptr;
+ else
+ {
+ struct elf_nds32_ex9_refix *temp = ex9_refix_head;
+
+ while (temp->next != NULL)
+ temp = temp->next;
+ temp->next = ptr;
+ }
+}
+
+enum
+{
+ DATA_EXIST = 1,
+ CLEAN_PRE = 1 << 1,
+ PUSH_PRE = 1 << 2
+};
+
+/* Check relocation type if supporting for ex9. */
+
+static int
+nds32_elf_ex9_relocation_check (struct bfd_link_info *info,
+ Elf_Internal_Rela **irel,
+ Elf_Internal_Rela *irelend,
+ nds32_elf_blank_t *relax_blank_list,
+ asection *sec, bfd_vma *off,
+ bfd_byte *contents)
+{
+ /* Suppress ex9 if `.no_relax ex9' or inner loop. */
+ bfd_boolean nested_ex9, nested_loop;
+ bfd_boolean ex9_loop_aware;
+ /* We use the highest 1 byte of result to record
+ how many bytes location counter has to move. */
+ int result = 0;
+ Elf_Internal_Rela *irel_save = NULL;
+ struct elf_nds32_link_hash_table *table;
+
+ table = nds32_elf_hash_table (info);
+ ex9_loop_aware = table->ex9_loop_aware;
+
+ while ((*irel) != NULL && (*irel) < irelend && *off == (*irel)->r_offset)
+ {
+ switch (ELF32_R_TYPE ((*irel)->r_info))
+ {
+ case R_NDS32_RELAX_REGION_BEGIN:
+ /* Ignore code block. */
+ nested_ex9 = FALSE;
+ nested_loop = FALSE;
+ if (((*irel)->r_addend & R_NDS32_RELAX_REGION_NO_EX9_FLAG)
+ || (ex9_loop_aware
+ && ((*irel)->r_addend & R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG)))
+ {
+ /* Check the region if loop or not. If it is true and
+ ex9-loop-aware is true, ignore the region till region end. */
+ /* To save the status for in .no_relax ex9 region and
+ loop region to conform the block can do ex9 relaxation. */
+ nested_ex9 = ((*irel)->r_addend & R_NDS32_RELAX_REGION_NO_EX9_FLAG);
+ nested_loop = (ex9_loop_aware
+ && ((*irel)->r_addend & R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG));
+ while ((*irel) && (*irel) < irelend && (nested_ex9 || nested_loop))
+ {
+ (*irel)++;
+ if (ELF32_R_TYPE ((*irel)->r_info) == R_NDS32_RELAX_REGION_BEGIN)
+ {
+ /* There may be nested region. */
+ if (((*irel)->r_addend & R_NDS32_RELAX_REGION_NO_EX9_FLAG) != 0)
+ nested_ex9 = TRUE;
+ else if (ex9_loop_aware
+ && ((*irel)->r_addend & R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG))
+ nested_loop = TRUE;
+ }
+ else if (ELF32_R_TYPE ((*irel)->r_info) == R_NDS32_RELAX_REGION_END)
+ {
+ /* The end of region. */
+ if (((*irel)->r_addend & R_NDS32_RELAX_REGION_NO_EX9_FLAG) != 0)
+ nested_ex9 = FALSE;
+ else if (ex9_loop_aware
+ && ((*irel)->r_addend & R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG))
+ nested_loop = FALSE;
+ }
+ else if (ELF32_R_TYPE ((*irel)->r_info) == R_NDS32_LABEL
+ && ((*irel)->r_addend & 0x1f) == 2)
+ {
+ /* Alignment exist in the region. */
+ result |= CLEAN_PRE;
+ if (((*irel)->r_offset -
+ get_nds32_elf_blank_total (&relax_blank_list,
+ (*irel)->r_offset, 0)) & 0x02)
+ result |= PUSH_PRE;
+ }
+ }
+ if ((*irel) >= irelend)
+ *off = sec->size;
+ else
+ *off = (*irel)->r_offset;
+
+ /* The final instruction in the region, regard this one as data to ignore it. */
+ result |= DATA_EXIST;
+ return result;
+ }
+ break;
+
+ case R_NDS32_LABEL:
+ if (((*irel)->r_addend & 0x1f) == 2)
+ {
+ /* Check this point is align and decide to do ex9 or not. */
+ result |= CLEAN_PRE;
+ if (((*irel)->r_offset -
+ get_nds32_elf_blank_total (&relax_blank_list,
+ (*irel)->r_offset, 0)) & 0x02)
+ result |= PUSH_PRE;
+ }
+ break;
+ case R_NDS32_32_RELA:
+ /* Data. */
+ result |= (4 << 24);
+ result |= DATA_EXIST;
+ break;
+ case R_NDS32_16_RELA:
+ /* Data. */
+ result |= (2 << 24);
+ result |= DATA_EXIST;
+ break;
+ case R_NDS32_DATA:
+ /* Data. */
+ /* The least code alignment is 2. If the data is only one byte,
+ we have to shift one more byte. */
+ if ((*irel)->r_addend == 1)
+ result |= ((*irel)->r_addend << 25) ;
+ else
+ result |= ((*irel)->r_addend << 24) ;
+
+ result |= DATA_EXIST;
+ break;
+
+ case R_NDS32_25_PCREL_RELA:
+ case R_NDS32_SDA16S3_RELA:
+ case R_NDS32_SDA15S3_RELA:
+ case R_NDS32_SDA15S3:
+ case R_NDS32_SDA17S2_RELA:
+ case R_NDS32_SDA15S2_RELA:
+ case R_NDS32_SDA12S2_SP_RELA:
+ case R_NDS32_SDA12S2_DP_RELA:
+ case R_NDS32_SDA15S2:
+ case R_NDS32_SDA18S1_RELA:
+ case R_NDS32_SDA15S1_RELA:
+ case R_NDS32_SDA15S1:
+ case R_NDS32_SDA19S0_RELA:
+ case R_NDS32_SDA15S0_RELA:
+ case R_NDS32_SDA15S0:
+ case R_NDS32_HI20_RELA:
+ case R_NDS32_LO12S0_ORI_RELA:
+ case R_NDS32_LO12S0_RELA:
+ case R_NDS32_LO12S1_RELA:
+ case R_NDS32_LO12S2_RELA:
+ case R_NDS32_20_RELA:
+ /* These relocation is supported ex9 relaxation currently. */
+ /* We have to save the relocation for using later, since we have
+ to check there is any alignment in the same address. */
+ irel_save = *irel;
+ break;
+ default:
+ /* Not support relocations. */
+ if (ELF32_R_TYPE ((*irel)->r_info) < ARRAY_SIZE (nds32_elf_howto_table)
+ && ELF32_R_TYPE ((*irel)->r_info) != R_NDS32_NONE
+ && ELF32_R_TYPE ((*irel)->r_info) != R_NDS32_INSN16
+ && ELF32_R_TYPE ((*irel)->r_info) != R_NDS32_LOADSTORE)
+ {
+ /* Note: To optimize aggressively, it maybe can ignore
+ R_NDS32_INSN16 here. But we have to consider
+ if there is any side-effect. */
+ if (!(result & DATA_EXIST))
+ {
+ /* We have to confirm there is no data relocation in the
+ same address. In general case, this won't happen. */
+ /* We have to do ex9 conservative, for those relocation not
+ considerd we ignore instruction. */
+ result |= DATA_EXIST;
+ if (*(contents + *off) & 0x80)
+ result |= (2 << 24);
+ else
+ result |= (4 << 24);
+ break;
+ }
+ }
+ }
+ if ((*irel) < irelend
+ && ((*irel) + 1) < irelend
+ && (*irel)->r_offset == ((*irel) + 1)->r_offset)
+ /* There are relocations pointing to the same address, we have to
+ check all of them. */
+ (*irel)++;
+ else
+ {
+ if (irel_save)
+ *irel = irel_save;
+ return result;
+ }
+ }
+ return result;
+}
+
+/* Replace with ex9 instruction. */
+static bfd_boolean
+nds32_elf_ex9_push_insn (uint16_t insn16, bfd_byte *contents, bfd_vma pre_off,
+ nds32_elf_blank_t **relax_blank_list,
+ struct elf_nds32_irel_entry *pre_irel_ptr,
+ struct elf_nds32_irel_entry **irel_list)
+{
+ if (insn16 != 0)
+ {
+ /* Implement the ex9 relaxation. */
+ bfd_putb16 (insn16, contents + pre_off);
+ if (!insert_nds32_elf_blank_recalc_total (relax_blank_list,
+ pre_off + 2, 2))
+ return FALSE;
+ if (pre_irel_ptr != NULL)
+ nds32_elf_insert_irel_entry (irel_list, pre_irel_ptr);
+ }
+ return TRUE;
+}
+
+/* Replace input file instruction which is in ex9 itable. */
+
+static bfd_boolean
+nds32_elf_ex9_replace_instruction (struct bfd_link_info *info, bfd *abfd, asection *sec)
+{
+ struct elf_nds32_insn_times_entry *ex9_insn = ex9_insn_head;
+ bfd_byte *contents = NULL;
+ bfd_vma off;
+ uint16_t insn16, insn_ex9;
+ /* `pre_*' are used to track previous instruction that can use ex9.it. */
+ bfd_vma pre_off = -1;
+ uint16_t pre_insn16 = 0;
+ struct elf_nds32_irel_entry *pre_irel_ptr = NULL;
+ Elf_Internal_Rela *internal_relocs;
+ Elf_Internal_Rela *irel;
+ Elf_Internal_Rela *irelend;
+ Elf_Internal_Shdr *symtab_hdr;
+ Elf_Internal_Sym *isym = NULL;
+ nds32_elf_blank_t *relax_blank_list = NULL;
+ uint32_t insn = 0;
+ uint32_t insn_with_reg = 0;
+ uint32_t it_insn;
+ uint32_t it_insn_with_reg;
+ unsigned long r_symndx;
+ asection *isec;
+ struct elf_nds32_irel_entry *irel_list = NULL;
+ struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (abfd);
+ int data_flag, do_replace, save_irel;
+ struct elf_link_hash_entry_list *h_list;
+
+
+ /* Load section instructions, relocations, and symbol table. */
+ if (!nds32_get_section_contents (abfd, sec, &contents, TRUE)
+ || !nds32_get_local_syms (abfd, sec, &isym))
+ return FALSE;
+ internal_relocs =
+ _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL, TRUE /* keep_memory */);
+ irelend = internal_relocs + sec->reloc_count;
+ symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
+
+ off = 0;
+
+ /* Check if the object enable ex9. */
+ irel = find_relocs_at_address (internal_relocs, internal_relocs,
+ irelend, R_NDS32_RELAX_ENTRY);
+
+ /* Check this section trigger ex9 relaxation. */
+ if (irel == NULL
+ || irel >= irelend
+ || ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_ENTRY
+ || (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_ENTRY
+ && !(irel->r_addend & R_NDS32_RELAX_ENTRY_EX9_FLAG)))
+ return TRUE;
+
+ irel = internal_relocs;
+
+ /* Check alignment and fetch proper relocation. */
+ while (off < sec->size)
+ {
+ struct elf_link_hash_entry *h = NULL;
+ struct elf_nds32_irel_entry *irel_ptr = NULL;
+
+ /* Syn the instruction and the relocation. */
+ while (irel != NULL && irel < irelend && irel->r_offset < off)
+ irel++;
+
+ data_flag = nds32_elf_ex9_relocation_check (info, &irel, irelend,
+ relax_blank_list, sec,
+ &off, contents);
+ if (data_flag & PUSH_PRE)
+ if (!nds32_elf_ex9_push_insn (pre_insn16, contents, pre_off,
+ &relax_blank_list, pre_irel_ptr,
+ &irel_list))
+ return FALSE;
+
+ if (data_flag & CLEAN_PRE)
+ {
+ pre_off = 0;
+ pre_insn16 = 0;
+ pre_irel_ptr = NULL;
+ }
+ if (data_flag & DATA_EXIST)
+ {
+ /* We save the move offset in the highest byte. */
+ off += (data_flag >> 24);
+ continue;
+ }
+
+ if (*(contents + off) & 0x80)
+ {
+ /* 2-byte instruction. */
+ off += 2;
+ continue;
+ }
+
+ /* Load the instruction and its opcode with register for comparing. */
+ ex9_insn = ex9_insn_head;
+ insn = bfd_getb32 (contents + off);
+ insn_with_reg = 0;
+ /* Insn with relocation. Mask instruction. */
+ if (irel != NULL && irel < irelend && irel->r_offset == off)
+ nds32_elf_get_insn_with_reg (irel, insn, &insn_with_reg);
+
+ while (ex9_insn)
+ {
+ it_insn = strtol (ex9_insn->string, NULL, 16);
+ it_insn_with_reg = 0;
+ do_replace = 0;
+ save_irel = 0;
+
+ if (irel != NULL && irel < irelend && irel->r_offset == off
+ && ex9_insn->irel != NULL)
+ nds32_elf_get_insn_with_reg (ex9_insn->irel, it_insn,
+ &it_insn_with_reg);
+
+ /* Instruction and ex9 both have relocation. */
+ if (insn_with_reg != 0 && it_insn_with_reg != 0
+ && (ELF32_R_TYPE (irel->r_info) ==
+ ELF32_R_TYPE (ex9_insn->irel->r_info))
+ && (insn_with_reg == it_insn_with_reg))
+ {
+ /* Insn relocation and format is the same as table entry. */
+
+ if (ELF32_R_TYPE (irel->r_info) == R_NDS32_25_PCREL_RELA
+ || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S0_ORI_RELA
+ || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S0_RELA
+ || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S1_RELA
+ || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S2_RELA
+ || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3
+ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0)
+ || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3_RELA
+ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0_RELA)
+ || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA12S2_DP_RELA
+ && ELF32_R_TYPE (irel->r_info) <=
+ R_NDS32_SDA12S2_SP_RELA)
+ || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA16S3_RELA
+ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA19S0_RELA)
+ || ELF32_R_TYPE (irel->r_info) == R_NDS32_20_RELA)
+ {
+ r_symndx = ELF32_R_SYM (irel->r_info);
+ if (r_symndx < symtab_hdr->sh_info)
+ {
+ /* Local symbol. */
+ int shndx = isym[r_symndx].st_shndx;
+
+ isec = elf_elfsections (abfd)[shndx]->bfd_section;
+ if (ex9_insn->sec == isec
+ && ex9_insn->irel->r_addend == irel->r_addend
+ && ex9_insn->irel->r_info == irel->r_info)
+ {
+ do_replace = 1;
+ save_irel = 1;
+ }
+ }
+ else if (ex9_insn->m_list)
+ {
+ /* External symbol. */
+ h = sym_hashes[r_symndx - symtab_hdr->sh_info];
+ h_list = ex9_insn->m_list->h_list;
+ while (h_list)
+ {
+ if (ex9_insn->m_list->irel->r_addend == irel->r_addend
+ && h == h_list->h)
+ {
+ do_replace = 1;
+ save_irel = 1;
+ break;
+ }
+ h_list = h_list->next;
+ }
+ }
+ }
+ else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_HI20_RELA)
+ {
+ r_symndx = ELF32_R_SYM (irel->r_info);
+ if (r_symndx < symtab_hdr->sh_info)
+ {
+ /* Local symbols. Compare its base symbol
+ and offset. */
+ int shndx = isym[r_symndx].st_shndx;
+
+ isec = elf_elfsections (abfd)[shndx]->bfd_section;
+ if (ex9_insn->sec == isec
+ && ex9_insn->irel->r_addend == irel->r_addend
+ && ex9_insn->irel->r_info == irel->r_info)
+ {
+ do_replace = 1;
+ save_irel = 1;
+ }
+ }
+ else
+ {
+ /* External symbol. */
+ struct elf_link_hash_entry_mul_list *m_list;
+
+ h = sym_hashes[r_symndx - symtab_hdr->sh_info];
+ m_list = ex9_insn->m_list;
+
+ while (m_list && !do_replace)
+ {
+ h_list = m_list->h_list;
+ while (h_list)
+ {
+ if (h == h_list->h
+ && m_list->irel->r_addend == irel->r_addend)
+ {
+ do_replace = 1;
+ save_irel = 1;
+ /* sethi multiple entry must be fixed. */
+ if (ex9_insn->next && ex9_insn->m_list
+ && ex9_insn->m_list == ex9_insn->next->m_list)
+ nds32_elf_ex9_insert_fix (sec, irel, h,
+ ex9_insn->order);
+ break;
+ }
+ h_list = h_list->next;
+ }
+ m_list = m_list->next;
+ }
+ }
+ }
+ }
+ /* Import table: Check the symbol hash table and the
+ jump target. Only R_NDS32_25_PCREL_RELA now. */
+ else if (insn_with_reg != 0 && ex9_insn->times == -1
+ && ELF32_R_TYPE (irel->r_info) == R_NDS32_25_PCREL_RELA)
+ {
+ nds32_elf_get_insn_with_reg (irel, it_insn, &it_insn_with_reg);
+ if (insn_with_reg == it_insn_with_reg)
+ {
+ char code[10];
+ bfd_vma relocation;
+
+ r_symndx = ELF32_R_SYM (irel->r_info);
+ if (r_symndx >= symtab_hdr->sh_info)
+ {
+ h = sym_hashes[r_symndx - symtab_hdr->sh_info];
+ if ((h->root.type == bfd_link_hash_defined
+ || h->root.type == bfd_link_hash_defweak)
+ && h->root.u.def.section != NULL
+ && h->root.u.def.section->output_section != NULL
+ && h->root.u.def.section->gc_mark == 1
+ && bfd_is_abs_section (h->root.u.def.section)
+ && h->root.u.def.value > sec->size)
+ {
+ relocation = h->root.u.def.value +
+ h->root.u.def.section->output_section->vma +
+ h->root.u.def.section->output_offset;
+ relocation += irel->r_addend;
+ insn = insn_with_reg
+ | ((relocation >> 1) & 0xffffff);
+ snprintf (code, sizeof (code), "%08x", insn);
+ if (strcmp (code, ex9_insn->string) == 0)
+ {
+ do_replace = 1;
+ save_irel = 1;
+ }
+ }
+ }
+ }
+ }
+ else if ((irel == NULL || irel >= irelend || irel->r_offset != off)
+ && insn == it_insn && ex9_insn->irel == NULL)
+ {
+ /* Instruction without relocation, we only
+ have to compare their byte code. */
+ do_replace = 1;
+ }
+
+ /* Insntruction match so replacing the code here. */
+ if (do_replace == 1)
+ {
+ /* There are two formats of ex9 instruction. */
+ if (ex9_insn->order < 32)
+ insn_ex9 = INSN_EX9_IT_2;
+ else
+ insn_ex9 = INSN_EX9_IT_1;
+ insn16 = insn_ex9 | ex9_insn->order;
+
+ /* Insert ex9 instruction. */
+ nds32_elf_ex9_push_insn (pre_insn16, contents, pre_off,
+ &relax_blank_list, pre_irel_ptr,
+ &irel_list);
+ pre_off = off;
+ pre_insn16 = insn16;
+
+ if (save_irel)
+ {
+ /* For instuction with relocation do relax. */
+ irel_ptr = (struct elf_nds32_irel_entry *)
+ bfd_malloc (sizeof (struct elf_nds32_irel_entry));
+ irel_ptr->irel = irel;
+ irel_ptr->next = NULL;
+ pre_irel_ptr = irel_ptr;
+ }
+ else
+ pre_irel_ptr = NULL;
+ break;
+ }
+ ex9_insn = ex9_insn->next;
+ }
+ off += 4;
+ }
+
+ /* Insert ex9 instruction. */
+ nds32_elf_ex9_push_insn (pre_insn16, contents, pre_off,
+ &relax_blank_list, pre_irel_ptr,
+ &irel_list);
+
+ /* Delete the redundant code. */
+ if (relax_blank_list)
+ {
+ nds32_elf_relax_delete_blanks (abfd, sec, relax_blank_list);
+ relax_blank_list = NULL;
+ }
+
+ /* Clear the relocation that is replaced by ex9. */
+ while (irel_list)
+ {
+ struct elf_nds32_irel_entry *irel_ptr;
+
+ irel_ptr = irel_list;
+ irel_list = irel_ptr->next;
+ irel_ptr->irel->r_info =
+ ELF32_R_INFO (ELF32_R_SYM (irel_ptr->irel->r_info), R_NDS32_TRAN);
+ free (irel_ptr);
+ }
+ return TRUE;
+}
+
+/* Initialize ex9 hash table. */
+
+static int
+nds32_elf_ex9_init (void)
+{
+ if (!bfd_hash_table_init_n (&ex9_code_table, nds32_elf_code_hash_newfunc,
+ sizeof (struct elf_nds32_code_hash_entry),
+ 1023))
+ {
+ (*_bfd_error_handler) (_("Linker: cannot init ex9 hash table error \n"));
+ return FALSE;
+ }
+ return TRUE;
+}
+
+/* Predict how many bytes will be relaxed with ex9 and ifc. */
+
+static void
+nds32_elf_ex9_total_relax (struct bfd_link_info *info)
+{
+ struct elf_nds32_insn_times_entry *ex9_insn;
+ struct elf_nds32_insn_times_entry *temp;
+ int target_optimize;
+ struct elf_nds32_link_hash_table *table;
+
+ if (ex9_insn_head == NULL)
+ return;
+
+ table = nds32_elf_hash_table (info);
+ target_optimize = table->target_optimize;
+ ex9_insn = ex9_insn_head;
+ while (ex9_insn)
+ {
+ ex9_relax_size = ex9_insn->times * 2 + ex9_relax_size;
+ temp = ex9_insn;
+ ex9_insn = ex9_insn->next;
+ free (temp);
+ }
+ ex9_insn_head = NULL;
+
+ if ((target_optimize & NDS32_RELAX_IFC_ON))
+ {
+ /* Examine the potential of ifc reduce size. */
+ struct elf_nds32_ifc_symbol_entry *ifc_ent = ifc_symbol_head;
+ struct elf_nds32_ifc_irel_list *irel_ptr = NULL;
+ int size = 0;
+
+ while (ifc_ent)
+ {
+ if (ifc_ent->enable == 0)
+ {
+ /* Not ifc yet. */
+ irel_ptr = ifc_ent->irel_head;
+ while (irel_ptr)
+ {
+ size += 2;
+ irel_ptr = irel_ptr->next;
+ }
+ }
+ size -= 2;
+ ifc_ent = ifc_ent->next;
+ }
+ ex9_relax_size += size;
+ }
+}
+
+/* Finish ex9 table. */
+
+void
+nds32_elf_ex9_finish (struct bfd_link_info *link_info)
+{
+ nds32_elf_code_hash_traverse (nds32_elf_examine_insn_times);
+ nds32_elf_order_insn_times (link_info);
+ nds32_elf_ex9_total_relax (link_info);
+ /* Traverse the hash table and count its times. */
+ nds32_elf_code_hash_traverse (nds32_elf_count_insn_times);
+ nds32_elf_order_insn_times (link_info);
+ nds32_elf_ex9_build_itable (link_info);
+}
+
+/* Relocate the entries in ex9 table. */
+
+static bfd_vma
+nds32_elf_ex9_reloc_insn (struct elf_nds32_insn_times_entry *ptr,
+ struct bfd_link_info *link_info)
+{
+ Elf_Internal_Sym *isym = NULL;
+ bfd_vma relocation = -1;
+ struct elf_link_hash_entry *h;
+
+ if (ptr->m_list != NULL)
+ {
+ /* Global symbol. */
+ h = ptr->m_list->h_list->h;
+ if ((h->root.type == bfd_link_hash_defined
+ || h->root.type == bfd_link_hash_defweak)
+ && h->root.u.def.section != NULL
+ && h->root.u.def.section->output_section != NULL)
+ {
+
+ relocation = h->root.u.def.value +
+ h->root.u.def.section->output_section->vma +
+ h->root.u.def.section->output_offset;
+ relocation += ptr->m_list->irel->r_addend;
+ }
+ else
+ relocation = 0;
+ }
+ else if (ptr->sec !=NULL)
+ {
+ /* Local symbol. */
+ Elf_Internal_Sym sym;
+ asection *sec = NULL;
+ asection isec;
+ asection *isec_ptr = &isec;
+ Elf_Internal_Rela irel_backup = *(ptr->irel);
+ asection *sec_backup = ptr->sec;
+ bfd *abfd = ptr->sec->owner;
+
+ if (!nds32_get_local_syms (abfd, sec, &isym))
+ return FALSE;
+ isym = isym + ELF32_R_SYM (ptr->irel->r_info);
+
+ sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
+ if (sec != NULL)
+ *isec_ptr = *sec;
+ sym = *isym;
+
+ /* The purpose is same as elf_link_input_bfd. */
+ if (isec_ptr != NULL
+ && isec_ptr->sec_info_type == SEC_INFO_TYPE_MERGE
+ && ELF_ST_TYPE (isym->st_info) != STT_SECTION)
+ {
+ sym.st_value =
+ _bfd_merged_section_offset (ptr->sec->output_section->owner, &isec_ptr,
+ elf_section_data (isec_ptr)->sec_info,
+ isym->st_value);
+ }
+ relocation = _bfd_elf_rela_local_sym (link_info->output_bfd, &sym,
+ &ptr->sec, ptr->irel);
+ if (ptr->irel != NULL)
+ relocation += ptr->irel->r_addend;
+
+ /* Restore origin value since there may be some insntructions that
+ could not be replaced with ex9.it. */
+ *(ptr->irel) = irel_backup;
+ ptr->sec = sec_backup;
+ }
+
+ return relocation;
+}
+
+/* Import ex9 table and build list. */
+
+void
+nds32_elf_ex9_import_table (struct bfd_link_info *info)
+{
+ int num = 0;
+ bfd_byte *contents;
+ unsigned long insn;
+ FILE *ex9_import_file;
+ int update_ex9_table;
+ struct elf_nds32_link_hash_table *table;
+
+ table = nds32_elf_hash_table (info);
+ ex9_import_file = table->ex9_import_file;
+ rewind (table->ex9_import_file);
+
+ contents = bfd_malloc (sizeof (bfd_byte) * 4);
+
+ /* Read instructions from the input file and build the list. */
+ while (!feof (ex9_import_file))
+ {
+ char *code;
+ struct elf_nds32_insn_times_entry *ptr;
+ size_t nread;
+
+ nread = fread (contents, sizeof (bfd_byte) * 4, 1, ex9_import_file);
+ /* Ignore the final byte 0x0a. */
+ if (nread < 1)
+ break;
+ insn = bfd_getb32 (contents);
+ code = bfd_malloc (sizeof (char) * 9);
+ snprintf (code, 9, "%08lx", insn);
+ ptr = bfd_malloc (sizeof (struct elf_nds32_insn_times_entry));
+ ptr->string = code;
+ ptr->order = num;
+ ptr->times = -1;
+ ptr->sec = NULL;
+ ptr->m_list = NULL;
+ ptr->rel_backup.r_offset = 0;
+ ptr->rel_backup.r_info = 0;
+ ptr->rel_backup.r_addend = 0;
+ ptr->irel = NULL;
+ ptr->next = NULL;
+ nds32_elf_ex9_insert_entry (ptr);
+ num++;
+ }
+
+ update_ex9_table = table->update_ex9_table;
+ if (update_ex9_table == 1)
+ {
+ /* It has to consider of sethi need to use multiple page
+ but it not be done yet. */
+ nds32_elf_code_hash_traverse (nds32_elf_examine_insn_times);
+ nds32_elf_order_insn_times (info);
+ }
+}
+
+/* Export ex9 table. */
+
+static void
+nds32_elf_ex9_export (struct bfd_link_info *info,
+ bfd_byte *contents, int size)
+{
+ FILE *ex9_export_file;
+ struct elf_nds32_link_hash_table *table;
+
+ table = nds32_elf_hash_table (info);
+ ex9_export_file = table->ex9_export_file;
+ fwrite (contents, sizeof (bfd_byte), size, ex9_export_file);
+ fclose (ex9_export_file);
+}
+
+/* Adjust relocations of J and JAL in ex9.itable.
+ Export ex9 table. */
+
+static void
+nds32_elf_ex9_reloc_jmp (struct bfd_link_info *link_info)
+{
+ asection *table_sec = NULL;
+ struct elf_nds32_insn_times_entry *ex9_insn = ex9_insn_head;
+ struct elf_nds32_insn_times_entry *temp_ptr, *temp_ptr2;
+ uint32_t insn, insn_with_reg, source_insn;
+ bfd_byte *contents = NULL, *source_contents = NULL;
+ int size = 0;
+ bfd_vma gp;
+ int shift, update_ex9_table, offset = 0;
+ reloc_howto_type *howto = NULL;
+ Elf_Internal_Rela rel_backup;
+ unsigned short insn_ex9;
+ struct elf_nds32_link_hash_table *table;
+ FILE *ex9_export_file;
+ static bfd_boolean done = FALSE;
+
+ if (done)
+ return;
+
+ done = TRUE;
+
+ table = nds32_elf_hash_table (link_info);
+ if (table)
+ table->relax_status |= NDS32_RELAX_EX9_DONE;
+
+ update_ex9_table = table->update_ex9_table;
+
+ /* Generated ex9.itable exactly. */
+ if (update_ex9_table == 0)
+ {
+ bfd *output_bfd;
+ table_sec = nds32_elf_ex9_get_section (link_info->input_bfds);
+
+ if (table_sec == NULL)
+ {
+ (*_bfd_error_handler) (_("ld: error cannot find ex9 section.\n"));
+ return;
+ }
+
+ output_bfd = table_sec->output_section->owner;
+ nds32_elf_final_sda_base (output_bfd, link_info, &gp, FALSE);
+ if (table_sec->size == 0)
+ return;
+
+ if (!nds32_get_section_contents (table_sec->owner, table_sec,
+ &contents, TRUE))
+ return;
+ }
+ else
+ {
+ /* Set gp. */
+ bfd *output_bfd;
+
+ output_bfd = link_info->input_bfds->sections->output_section->owner;
+ nds32_elf_final_sda_base (output_bfd, link_info, &gp, FALSE);
+ contents = bfd_malloc (sizeof (bfd_byte) * 2048);
+ }
+
+ /* Relocate instruction. */
+ while (ex9_insn)
+ {
+ bfd_vma relocation, min_relocation = 0xffffffff;
+
+ insn = strtol (ex9_insn->string, NULL, 16);
+ insn_with_reg = 0;
+ if (ex9_insn->m_list != NULL || ex9_insn->sec != NULL)
+ {
+ if (ex9_insn->m_list)
+ rel_backup = ex9_insn->m_list->rel_backup;
+ else
+ rel_backup = ex9_insn->rel_backup;
+
+ nds32_elf_get_insn_with_reg (&rel_backup, insn, &insn_with_reg);
+ howto =
+ bfd_elf32_bfd_reloc_type_table_lookup (ELF32_R_TYPE
+ (rel_backup.r_info));
+ shift = howto->rightshift;
+ if (ELF32_R_TYPE (rel_backup.r_info) == R_NDS32_25_PCREL_RELA
+ || ELF32_R_TYPE (rel_backup.r_info) == R_NDS32_LO12S0_ORI_RELA
+ || ELF32_R_TYPE (rel_backup.r_info) == R_NDS32_LO12S0_RELA
+ || ELF32_R_TYPE (rel_backup.r_info) == R_NDS32_LO12S1_RELA
+ || ELF32_R_TYPE (rel_backup.r_info) == R_NDS32_LO12S2_RELA
+ || ELF32_R_TYPE (rel_backup.r_info) == R_NDS32_20_RELA)
+ {
+ relocation = nds32_elf_ex9_reloc_insn (ex9_insn, link_info);
+ insn =
+ insn_with_reg | ((relocation >> shift) &
+ nds32_elf_irel_mask (&rel_backup));
+ bfd_putb32 (insn, contents + (ex9_insn->order) * 4);
+ }
+ else if ((ELF32_R_TYPE (rel_backup.r_info) >= R_NDS32_SDA15S3
+ && ELF32_R_TYPE (rel_backup.r_info) <= R_NDS32_SDA15S0)
+ || (ELF32_R_TYPE (rel_backup.r_info) >= R_NDS32_SDA15S3_RELA
+ && ELF32_R_TYPE (rel_backup.r_info) <= R_NDS32_SDA15S0_RELA)
+ || (ELF32_R_TYPE (rel_backup.r_info) >= R_NDS32_SDA12S2_DP_RELA
+ && ELF32_R_TYPE (rel_backup.r_info) <= R_NDS32_SDA12S2_SP_RELA)
+ || (ELF32_R_TYPE (rel_backup.r_info) >= R_NDS32_SDA16S3_RELA
+ && ELF32_R_TYPE (rel_backup.r_info) <= R_NDS32_SDA19S0_RELA))
+ {
+ relocation = nds32_elf_ex9_reloc_insn (ex9_insn, link_info);
+ insn =
+ insn_with_reg | (((relocation - gp) >> shift) &
+ nds32_elf_irel_mask (&rel_backup));
+ bfd_putb32 (insn, contents + (ex9_insn->order) * 4);
+ }
+ else if (ELF32_R_TYPE (rel_backup.r_info) == R_NDS32_HI20_RELA)
+ {
+ /* Sethi may be multiple entry for one insn. */
+ if (ex9_insn->next && ex9_insn->m_list
+ && ex9_insn->m_list == ex9_insn->next->m_list)
+ {
+ struct elf_link_hash_entry_mul_list *m_list;
+ struct elf_nds32_ex9_refix *fix_ptr;
+ struct elf_link_hash_entry *h;
+
+ temp_ptr = ex9_insn;
+ temp_ptr2 = ex9_insn;
+ m_list = ex9_insn->m_list;
+ while (m_list)
+ {
+ h = m_list->h_list->h;
+ relocation = h->root.u.def.value +
+ h->root.u.def.section->output_section->vma +
+ h->root.u.def.section->output_offset;
+ relocation += m_list->irel->r_addend;
+
+ if (relocation < min_relocation)
+ min_relocation = relocation;
+ m_list = m_list->next;
+ }
+ relocation = min_relocation;
+
+ /* Put insntruction into ex9 table. */
+ insn = insn_with_reg
+ | ((relocation >> shift) & nds32_elf_irel_mask (&rel_backup));
+ bfd_putb32 (insn, contents + (ex9_insn->order) * 4);
+ relocation = relocation + 0x1000; /* hi20 */
+
+ while (ex9_insn->next && ex9_insn->m_list
+ && ex9_insn->m_list == ex9_insn->next->m_list)
+ {
+ /* Multiple sethi. */
+ ex9_insn = ex9_insn->next;
+ size += 4;
+ insn =
+ insn_with_reg | ((relocation >> shift) &
+ nds32_elf_irel_mask (&rel_backup));
+ bfd_putb32 (insn, contents + (ex9_insn->order) * 4);
+ relocation = relocation + 0x1000; /* hi20 */
+ }
+
+ fix_ptr = ex9_refix_head;
+ while (fix_ptr)
+ {
+ /* Fix ex9 insn. */
+ /* temp_ptr2 points to the head of multiple sethi. */
+ temp_ptr = temp_ptr2;
+ while (fix_ptr->order != temp_ptr->order && fix_ptr->next)
+ {
+ fix_ptr = fix_ptr->next;
+ }
+ if (fix_ptr->order != temp_ptr->order)
+ break;
+
+ /* Set source insn. */
+ relocation =
+ fix_ptr->h->root.u.def.value +
+ fix_ptr->h->root.u.def.section->output_section->vma +
+ fix_ptr->h->root.u.def.section->output_offset;
+ relocation += fix_ptr->irel->r_addend;
+ /* sethi imm is imm20s. */
+ source_insn = insn_with_reg | ((relocation >> shift) & 0xfffff);
+
+ while (temp_ptr)
+ {
+ /* Match entry and source code. */
+ insn = bfd_getb32 (contents + (temp_ptr->order) * 4 + offset);
+ if (insn == source_insn)
+ {
+ /* Fix the ex9 insn. */
+ if (temp_ptr->order != fix_ptr->order)
+ {
+ if (!nds32_get_section_contents
+ (fix_ptr->sec->owner, fix_ptr->sec,
+ &source_contents, TRUE))
+ (*_bfd_error_handler)
+ (_("Linker: error cannot fixed ex9 relocation \n"));
+ if (temp_ptr->order < 32)
+ insn_ex9 = INSN_EX9_IT_2;
+ else
+ insn_ex9 = INSN_EX9_IT_1;
+ insn_ex9 = insn_ex9 | temp_ptr->order;
+ bfd_putb16 (insn_ex9, source_contents + fix_ptr->irel->r_offset);
+ }
+ break;
+ }
+ else
+ {
+ if (!temp_ptr->next || temp_ptr->m_list != temp_ptr->next->m_list)
+ (*_bfd_error_handler)
+ (_("Linker: error cannot fixed ex9 relocation \n"));
+ else
+ temp_ptr = temp_ptr->next;
+ }
+ }
+ fix_ptr = fix_ptr->next;
+ }
+ }
+ else
+ {
+ relocation = nds32_elf_ex9_reloc_insn (ex9_insn, link_info);
+ insn = insn_with_reg
+ | ((relocation >> shift) & nds32_elf_irel_mask (&rel_backup));
+ bfd_putb32 (insn, contents + (ex9_insn->order) * 4);
+ }
+ }
+ }
+ else
+ {
+ /* Insn without relocation does not have to be fixed
+ if need to update export table. */
+ if (update_ex9_table == 1)
+ bfd_putb32 (insn, contents + (ex9_insn->order) * 4);
+ }
+ ex9_insn = ex9_insn->next;
+ size += 4;
+ }
+
+ ex9_export_file = table->ex9_export_file;
+ if (ex9_export_file != NULL)
+ nds32_elf_ex9_export (link_info, contents, table_sec->size);
+ else if (update_ex9_table == 1)
+ {
+ table->ex9_export_file = table->ex9_import_file;
+ rewind (table->ex9_export_file);
+ nds32_elf_ex9_export (link_info, contents, size);
+ }
+}
+
+/* Check this instruction is convertable to ex9. */
+static bfd_boolean
+nds32_elf_ex9_check_available (uint32_t insn)
+{
+ if (N32_OP6 (insn) == N32_OP6_MISC
+ && (N32_SUB5 (insn) == N32_MISC_SYSCALL
+ || N32_SUB5 (insn) == N32_MISC_BREAK
+ || N32_SUB5 (insn) == N32_MISC_TEQZ
+ || N32_SUB5 (insn) == N32_MISC_TNEZ
+ || N32_SUB5 (insn) == N32_MISC_TRAP))
+ return FALSE;
+ return TRUE;
+}
+
+/* Generate ex9 hash table. */
+
+static bfd_boolean
+nds32_elf_ex9_build_hash_table (bfd *abfd, asection *sec,
+ struct bfd_link_info *link_info)
+{
+ Elf_Internal_Rela *internal_relocs;
+ Elf_Internal_Rela *irelend;
+ Elf_Internal_Rela *irel;
+ Elf_Internal_Rela *jrel;
+ Elf_Internal_Rela rel_backup;
+ Elf_Internal_Shdr *symtab_hdr;
+ Elf_Internal_Sym *isym = NULL;
+ asection *isec;
+ struct elf_link_hash_entry **sym_hashes;
+ bfd_byte *contents = NULL;
+ bfd_vma off = 0;
+ unsigned long r_symndx;
+ uint32_t insn, insn_with_reg;
+ struct elf_link_hash_entry *h;
+ int data_flag, shift, align;
+ bfd_vma relocation;
+ /* Suppress ex9 if `.no_relax ex9' or inner loop. */
+ reloc_howto_type *howto = NULL;
+
+ sym_hashes = elf_sym_hashes (abfd);
+ /* Load section instructions, relocations, and symbol table. */
+ if (!nds32_get_section_contents (abfd, sec, &contents, TRUE))
+ return FALSE;
+
+ internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
+ TRUE /* keep_memory */);
+ irelend = internal_relocs + sec->reloc_count;
+ symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
+ if (!nds32_get_local_syms (abfd, sec, &isym))
+ return FALSE;
+
+ /* Check the object if enable ex9. */
+ irel = find_relocs_at_address (internal_relocs, internal_relocs, irelend,
+ R_NDS32_RELAX_ENTRY);
+
+ /* Check this section trigger ex9 relaxation. */
+ if (irel == NULL
+ || irel >= irelend
+ || ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_ENTRY
+ || (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_ENTRY
+ && !(irel->r_addend & R_NDS32_RELAX_ENTRY_EX9_FLAG)))
+ return TRUE;
+
+ irel = internal_relocs;
+
+ /* Push each insn into hash table. */
+ while (off < sec->size)
+ {
+ char code[10];
+ struct elf_nds32_code_hash_entry *entry;
+
+ while (irel != NULL && irel < irelend && irel->r_offset < off)
+ irel++;
+
+ data_flag = nds32_elf_ex9_relocation_check (link_info, &irel, irelend,
+ NULL, sec, &off, contents);
+ if (data_flag & DATA_EXIST)
+ {
+ /* We save the move offset in the highest byte. */
+ off += (data_flag >> 24);
+ continue;
+ }
+
+ /* Ignore 2-byte instruction. */
+ if (*(contents + off) & 0x80)
+ {
+ off += 2;
+ continue;
+ }
+
+ insn = bfd_getb32 (contents + off);
+ if (!nds32_elf_ex9_check_available (insn))
+ {
+ off += 4;
+ continue;
+ }
+
+ h = NULL;
+ isec = NULL;
+ jrel = NULL;
+ rel_backup.r_info = 0;
+ rel_backup.r_offset = 0;
+ rel_backup.r_addend = 0;
+ /* Load the instruction and its opcode with register for comparing. */
+ insn_with_reg = 0;
+ if (irel != NULL && irel < irelend && irel->r_offset == off)
+ {
+ nds32_elf_get_insn_with_reg (irel, insn, &insn_with_reg);
+ howto = bfd_elf32_bfd_reloc_type_table_lookup (ELF32_R_TYPE (irel->r_info));
+ shift = howto->rightshift;
+ align = (1 << shift) - 1;
+ if (ELF32_R_TYPE (irel->r_info) == R_NDS32_25_PCREL_RELA
+ || ELF32_R_TYPE (irel->r_info) == R_NDS32_HI20_RELA
+ || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S0_ORI_RELA
+ || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S0_RELA
+ || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S1_RELA
+ || ELF32_R_TYPE (irel->r_info) == R_NDS32_LO12S2_RELA
+ || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3
+ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0)
+ || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3_RELA
+ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0_RELA)
+ || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA12S2_DP_RELA
+ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA12S2_SP_RELA)
+ || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA16S3_RELA
+ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA19S0_RELA)
+ || ELF32_R_TYPE (irel->r_info) == R_NDS32_20_RELA)
+ {
+ r_symndx = ELF32_R_SYM (irel->r_info);
+ jrel = irel;
+ rel_backup = *irel;
+ if (r_symndx < symtab_hdr->sh_info)
+ {
+ /* Local symbol. */
+ int shndx = isym[r_symndx].st_shndx;
+
+ bfd_vma st_value = (isym + r_symndx)->st_value;
+ isec = elf_elfsections (abfd)[shndx]->bfd_section;
+ relocation = (isec->output_section->vma + isec->output_offset
+ + st_value + irel->r_addend);
+ }
+ else
+ {
+ /* External symbol. */
+ bfd_boolean warned ATTRIBUTE_UNUSED;
+ bfd_boolean unresolved_reloc ATTRIBUTE_UNUSED;
+ asection *sym_sec;
+
+ /* Maybe there is a better way to get h and relocation */
+ RELOC_FOR_GLOBAL_SYMBOL (link_info, abfd, sec, irel,
+ r_symndx, symtab_hdr, sym_hashes,
+ h, sym_sec, relocation,
+ unresolved_reloc, warned);
+ relocation += irel->r_addend;
+ if ((h->root.type != bfd_link_hash_defined
+ && h->root.type != bfd_link_hash_defweak)
+ || strcmp (h->root.root.string, "_FP_BASE_") == 0)
+ {
+ off += 4;
+ continue;
+ }
+ }
+
+ /* Check for gp relative instruction alignment. */
+ if ((ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3
+ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0)
+ || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3_RELA
+ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0_RELA)
+ || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA12S2_DP_RELA
+ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA12S2_SP_RELA)
+ || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA16S3_RELA
+ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA19S0_RELA))
+ {
+ bfd_vma gp;
+ bfd *output_bfd = sec->output_section->owner;
+ bfd_reloc_status_type r;
+
+ /* If the symbol is in the abs section, the out_bfd will be
+ null. This happens when the relocation has a
+ symbol@GOTOFF. */
+ r = nds32_elf_final_sda_base (output_bfd, link_info,
+ &gp, FALSE);
+ if (r != bfd_reloc_ok)
+ {
+ off += 4;
+ continue;
+ }
+
+ relocation -= gp;
+
+ /* Make sure alignment is correct. */
+ if (relocation & align)
+ {
+ /* Incorrect alignment. */
+ (*_bfd_error_handler)
+ (_("%s: warning: unaligned small data access. "
+ "For entry: {%d, %d, %d}, addr = 0x%x, align = 0x%x."),
+ bfd_get_filename (abfd), irel->r_offset,
+ irel->r_info, irel->r_addend, relocation, align);
+ off += 4;
+ continue;
+ }
+ }
+
+ insn = insn_with_reg
+ | ((relocation >> shift) & nds32_elf_irel_mask (irel));
+ }
+ else
+ {
+ off += 4;
+ continue;
+ }
+ }
+
+ snprintf (code, sizeof (code), "%08x", insn);
+ /* Copy "code". */
+ entry = (struct elf_nds32_code_hash_entry*)
+ bfd_hash_lookup (&ex9_code_table, code, TRUE, TRUE);
+ if (entry == NULL)
+ {
+ (*_bfd_error_handler)
+ (_("%P%F: failed creating ex9.it %s hash table: %E\n"), code);
+ return FALSE;
+ }
+ if (h)
+ {
+ if (h->root.type == bfd_link_hash_undefined)
+ return TRUE;
+ /* Global symbol. */
+ /* In order to do sethi with different symbol but same value. */
+ if (entry->m_list == NULL)
+ {
+ struct elf_link_hash_entry_mul_list *m_list_new;
+ struct elf_link_hash_entry_list *h_list_new;
+
+ m_list_new = (struct elf_link_hash_entry_mul_list *)
+ bfd_malloc (sizeof (struct elf_link_hash_entry_mul_list));
+ h_list_new = (struct elf_link_hash_entry_list *)
+ bfd_malloc (sizeof (struct elf_link_hash_entry_list));
+ entry->m_list = m_list_new;
+ m_list_new->h_list = h_list_new;
+ m_list_new->rel_backup = rel_backup;
+ m_list_new->times = 1;
+ m_list_new->irel = jrel;
+ m_list_new->next = NULL;
+ h_list_new->h = h;
+ h_list_new->next = NULL;
+ }
+ else
+ {
+ struct elf_link_hash_entry_mul_list *m_list = entry->m_list;
+ struct elf_link_hash_entry_list *h_list;
+
+ while (m_list)
+ {
+ /* Build the different symbols that point to the same address. */
+ h_list = m_list->h_list;
+ if (h_list->h->root.u.def.value == h->root.u.def.value
+ && h_list->h->root.u.def.section->output_section->vma
+ == h->root.u.def.section->output_section->vma
+ && h_list->h->root.u.def.section->output_offset
+ == h->root.u.def.section->output_offset
+ && m_list->rel_backup.r_addend == rel_backup.r_addend)
+ {
+ m_list->times++;
+ m_list->irel = jrel;
+ while (h_list->h != h && h_list->next)
+ h_list = h_list->next;
+ if (h_list->h != h)
+ {
+ struct elf_link_hash_entry_list *h_list_new;
+
+ h_list_new = (struct elf_link_hash_entry_list *)
+ bfd_malloc (sizeof (struct elf_link_hash_entry_list));
+ h_list->next = h_list_new;
+ h_list_new->h = h;
+ h_list_new->next = NULL;
+ }
+ break;
+ }
+ /* The sethi case may have different address but the
+ hi20 is the same. */
+ else if (ELF32_R_TYPE (jrel->r_info) == R_NDS32_HI20_RELA
+ && m_list->next == NULL)
+ {
+ struct elf_link_hash_entry_mul_list *m_list_new;
+ struct elf_link_hash_entry_list *h_list_new;
+
+ m_list_new = (struct elf_link_hash_entry_mul_list *)
+ bfd_malloc (sizeof (struct elf_link_hash_entry_mul_list));
+ h_list_new = (struct elf_link_hash_entry_list *)
+ bfd_malloc (sizeof (struct elf_link_hash_entry_list));
+ m_list->next = m_list_new;
+ m_list_new->h_list = h_list_new;
+ m_list_new->rel_backup = rel_backup;
+ m_list_new->times = 1;
+ m_list_new->irel = jrel;
+ m_list_new->next = NULL;
+ h_list_new->h = h;
+ h_list_new->next = NULL;
+ break;
+ }
+ m_list = m_list->next;
+ }
+ if (!m_list)
+ {
+ off += 4;
+ continue;
+ }
+ }
+ }
+ else
+ {
+ /* Local symbol and insn without relocation*/
+ entry->times++;
+ entry->rel_backup = rel_backup;
+ }
+
+ /* Use in sethi insn with constant and global symbol in same format. */
+ if (!jrel)
+ entry->const_insn = 1;
+ else
+ entry->irel = jrel;
+ entry->sec = isec;
+ off += 4;
+ }
+ return TRUE;
+}
+
+/* Set the _ITB_BASE_, and point it to ex9 table. */
+
+bfd_boolean
+nds32_elf_ex9_itb_base (struct bfd_link_info *link_info)
+{
+ asection *sec;
+ bfd *output_bfd = NULL;
+ struct bfd_link_hash_entry *bh = NULL;
+
+ if (is_ITB_BASE_set == 1)
+ return TRUE;
+
+ is_ITB_BASE_set = 1;
+
+ sec = nds32_elf_ex9_get_section (link_info->input_bfds);
+ if (sec != NULL)
+ output_bfd = sec->output_section->owner;
+
+ if (output_bfd == NULL)
+ {
+ output_bfd = link_info->output_bfd;
+ if (output_bfd->sections == NULL)
+ return TRUE;
+ else
+ sec = bfd_abs_section_ptr;
+ }
+
+ /* Do not define _ITB_BASE_ if it is not used.
+ And remain user to set it if needed. */
+
+ bh = bfd_link_hash_lookup (link_info->hash, "_ITB_BASE_",
+ FALSE, FALSE, TRUE);
+ if (!bh)
+ return TRUE;
+
+ return (_bfd_generic_link_add_one_symbol
+ (link_info, output_bfd, "_ITB_BASE_", BSF_GLOBAL | BSF_WEAK,
+ sec, 0, (const char *) NULL, FALSE,
+ get_elf_backend_data (output_bfd)->collect, &bh));
+}
+/* End EX9.IT */
+
+
+/* Begining IFC. This is common code ifc optimization. */
+
+struct elf_nds32_ifc_code_hash_entry;
+struct elf_nds32_ifc_unit;
+
+/* Save the offset and section. */
+
+struct elf_nds32_ifc_member
+{
+ unsigned long int offset;
+ asection *sec;
+
+ /* Link to its unit. */
+ struct elf_nds32_ifc_unit *unit_p;
+
+ /* Link to its previous entry. */
+ struct elf_nds32_ifc_code_hash_entry *pre_entry;
+
+ /* Save next insnstrution member to find group quickly. */
+ struct elf_nds32_ifc_member *next_member;
+ struct elf_nds32_ifc_member *pre_member;
+ /* Save the jump target for the previous instruction. */
+ struct bfd_link_hash_entry *bh;
+ bfd_boolean dead;
+ struct elf_nds32_ifc_member *next;
+};
+
+/* The unit of elf_nds32_ifc_code_hash_entry. */
+
+struct elf_nds32_ifc_unit
+{
+ int times;
+ int done;
+ struct elf_nds32_ifc_member *member;
+
+ /* Link to its entry. */
+ struct elf_nds32_ifc_code_hash_entry *entry_p;
+
+ /* Save next insnstruction entry. */
+ struct elf_nds32_ifc_code_hash_entry *hash;
+ struct elf_nds32_ifc_unit *next;
+};
+
+/* Instruction hash table. */
+
+struct elf_nds32_ifc_code_hash_entry
+{
+ struct bfd_hash_entry root;
+ int times;
+ int size;
+ struct elf_nds32_ifc_unit *unit;
+ struct elf_link_hash_entry *h;
+
+ /* Save the max times unit in this entry. */
+ struct elf_nds32_ifc_unit *max_unit;
+ struct elf_nds32_ifc_code_hash_entry *next; /* For sort times. */
+ int round; /* Save round of nds32_elf_ifc_find_cse to avoid reentrance. */
+ struct elf_nds32_ifc_code_hash_entry *max_next;
+ bfd_boolean end; /* This is instruction can break ifc block. */
+ int max_times;
+};
+
+/* Structure for replace using. */
+
+struct elf_nds32_ifc_insn_member
+{
+ struct elf_nds32_ifc_member *member;
+ struct elf_nds32_ifc_insn_member *next;
+};
+
+struct elf_nds32_ifc_insn_stack
+{
+ int live;
+ int extend;
+ int choose;
+ struct elf_nds32_ifc_insn_member *imember;
+ struct elf_nds32_ifc_insn_stack *next;
+};
+
+/* Save members in the same section. */
+
+struct elf_nds32_ifc_sec_member
+{
+ struct elf_nds32_ifc_member *member;
+ struct elf_nds32_ifc_sec_member *next;
+};
+
+struct elf_nds32_ifc_sec_block
+{
+ asection *sec;
+ struct elf_nds32_ifc_sec_member *smember;
+ struct elf_nds32_ifc_sec_block *next;
+};
+
+struct elf_nds32_ifc_barrier
+{
+ bfd_vma offset;
+ struct elf_nds32_ifc_barrier *next;
+};
+
+/* Ifc global symbol. */
+struct bfd_hash_table ifc_code_table;
+struct elf_nds32_ifc_code_hash_entry *ifc_insn_head = NULL;
+struct elf_nds32_ifc_sec_block *ifc_block_head = NULL;
+
+/* IFC hash function. */
+
+static struct bfd_hash_entry *
+nds32_elf_ifc_code_hash_newfunc (struct bfd_hash_entry *entry,
+ struct bfd_hash_table *table,
+ const char *string)
+{
+ struct elf_nds32_ifc_code_hash_entry *ret;
+
+ /* Allocate the structure if it has not already been allocated by a
+ subclass. */
+ if (entry == NULL)
+ {
+ entry = (struct bfd_hash_entry *)
+ bfd_hash_allocate (table, sizeof (*ret));
+ if (entry == NULL)
+ return entry;
+ }
+
+ /* Call the allocation method of the superclass. */
+ entry = bfd_hash_newfunc (entry, table, string);
+ if (entry == NULL)
+ return entry;
+
+ ret = (struct elf_nds32_ifc_code_hash_entry*) entry;
+ ret->times = 0;
+ ret->unit = NULL;
+ ret->next = NULL;
+ ret->size = 0;
+ ret->h = NULL;
+ ret->max_unit = NULL;
+ ret->round = 0;
+ ret->max_next = NULL;
+ ret->max_times = 0;
+ ret->end = FALSE;
+ return &ret->root;
+}
+
+/* Do TLS model conversion. */
+
+typedef struct relax_group_list_t
+{
+ Elf_Internal_Rela *relo;
+ struct relax_group_list_t *next;
+ struct relax_group_list_t *next_sibling;
+ int id;
+} relax_group_list_t;
+
+int
+list_insert (relax_group_list_t *pHead, Elf_Internal_Rela *pElem);
+
+int
+list_insert_sibling (relax_group_list_t *pNode, Elf_Internal_Rela *pElem);
+
+void
+dump_chain (relax_group_list_t *pHead);
+
+int
+list_insert (relax_group_list_t *pHead, Elf_Internal_Rela *pElem)
+{
+ relax_group_list_t *pNext = pHead;
+
+ /* find place */
+ while (pNext->next)
+ {
+ if (pNext->next->id > (int) pElem->r_addend)
+ break;
+
+ pNext = pNext->next;
+ }
+
+ /* insert node */
+ relax_group_list_t *pNew = bfd_malloc (sizeof (relax_group_list_t));
+ if (!pNew)
+ return FALSE;
+
+ relax_group_list_t *tmp = pNext->next;
+ pNext->next = pNew;
+
+ pNew->id = pElem->r_addend;
+ pNew->relo = pElem;
+ pNew->next = tmp;
+ pNew->next_sibling = NULL;
+
+ return TRUE;
+}
+
+int
+list_insert_sibling (relax_group_list_t *pNode, Elf_Internal_Rela *pElem)
+{
+ relax_group_list_t *pNext = pNode;
+
+ /* find place */
+ while (pNext->next_sibling)
+ {
+ pNext = pNext->next_sibling;
+ }
+
+ /* insert node */
+ relax_group_list_t *pNew = bfd_malloc (sizeof (relax_group_list_t));
+ if (!pNew)
+ return FALSE;
+
+ relax_group_list_t *tmp = pNext->next_sibling;
+ pNext->next_sibling = pNew;
+
+ pNew->id = -1;
+ pNew->relo = pElem;
+ pNew->next = NULL;
+ pNew->next_sibling = tmp;
+
+ return TRUE;
+}
+
+void
+dump_chain (relax_group_list_t *pHead)
+{
+ relax_group_list_t *pNext = pHead->next;
+ while (pNext)
+ {
+ printf("group %d @ 0x%08x", pNext->id, (unsigned)pNext->relo->r_offset);
+ relax_group_list_t *pNextSib = pNext->next_sibling;
+ while (pNextSib)
+ {
+ printf(", %d", (unsigned) ELF32_R_TYPE (pNextSib->relo->r_info));
+ pNextSib = pNextSib->next_sibling;
+ }
+ pNext = pNext->next;
+ printf("\n");
+ }
+}
+
+/* check R_NDS32_RELAX_GROUP of each section.
+ * there might be multiple sections in one object file.
+ */
+int
+elf32_nds32_check_relax_group (bfd *abfd, asection *asec)
+{
+ elf32_nds32_relax_group_t *relax_group_ptr =
+ elf32_nds32_relax_group_ptr (abfd);
+
+ int min_id = relax_group_ptr->min_id;
+ int max_id = relax_group_ptr->max_id;
+
+ Elf_Internal_Rela *rel;
+ Elf_Internal_Rela *relend;
+ Elf_Internal_Rela *relocs;
+ enum elf_nds32_reloc_type rtype;
+
+ do
+ {
+ /* Relocations MUST be kept in memory, because relaxation adjust them. */
+ relocs = _bfd_elf_link_read_relocs (abfd, asec, NULL, NULL,
+ TRUE /* keep_memory */);
+ if (relocs == NULL)
+ break;
+
+ /* check R_NDS32_RELAX_GROUP */
+ relend = relocs + asec->reloc_count;
+ for (rel = relocs; rel < relend; rel++)
+ {
+ int id;
+ rtype = ELF32_R_TYPE (rel->r_info);
+ if (rtype != R_NDS32_RELAX_GROUP)
+ continue;
+
+ id = rel->r_addend;
+ if (id < min_id)
+ min_id = id;
+ else if (id > max_id)
+ max_id = id;
+ }
+ }
+ while (FALSE);
+
+ if ((relocs != NULL) && (elf_section_data (asec)->relocs != relocs))
+ free (relocs);
+
+ if ((min_id != relax_group_ptr->min_id)
+ || (max_id != relax_group_ptr->max_id))
+ {
+ relax_group_ptr->count = max_id - min_id + 1;
+ BFD_ASSERT(min_id <= relax_group_ptr->min_id);
+ relax_group_ptr->min_id = min_id;
+ BFD_ASSERT(max_id >= relax_group_ptr->max_id);
+ relax_group_ptr->max_id = max_id;
+ }
+
+ return relax_group_ptr->count;
+}
+
+/* reorder RELAX_GROUP ID when command line option '-r' is applied */
+/* TODO: find a way to free me. */
+struct section_id_list_t *relax_group_section_id_list = NULL;
+
+struct section_id_list_t *
+elf32_nds32_lookup_section_id (int id, struct section_id_list_t **lst_ptr)
+{
+ struct section_id_list_t *result = NULL;
+ struct section_id_list_t *lst = *lst_ptr;
+
+ if (NULL == lst)
+ {
+ result = (struct section_id_list_t *) calloc (
+ 1, sizeof (struct section_id_list_t));
+ BFD_ASSERT (result); /* feed me */
+ result->id = id;
+ *lst_ptr = result;
+ }
+ else
+ {
+ struct section_id_list_t *cur = lst;
+ struct section_id_list_t *prv = NULL;
+ struct section_id_list_t *sec = NULL;
+ while (cur)
+ {
+ if (cur->id < id)
+ {
+ prv = cur;
+ cur = cur->next;
+ continue;
+ }
+
+ if (cur->id > id)
+ {
+ cur = NULL; /* to insert after prv */
+ sec = cur; /* in case prv == NULL */
+ }
+
+ break;
+ }
+
+ if (NULL == cur)
+ {
+ /* insert after prv */
+ result = (struct section_id_list_t *) calloc (
+ 1, sizeof (struct section_id_list_t));
+ BFD_ASSERT (result); /* feed me */
+ result->id = id;
+ if (NULL != prv)
+ {
+ result->next = prv->next;
+ prv->next = result;
+ }
+ else
+ {
+ *lst_ptr = result;
+ result->next = sec;
+ }
+ }
+ }
+
+ return result;
+}
+
+int
+elf32_nds32_unify_relax_group (bfd *abfd, asection *asec)
+{
+ static int next_relax_group_bias = 0;
+
+ elf32_nds32_relax_group_t *relax_group_ptr =
+ elf32_nds32_relax_group_ptr (abfd);
+
+ bfd_boolean result = TRUE;
+ Elf_Internal_Rela *rel;
+ Elf_Internal_Rela *relend;
+ Elf_Internal_Rela *relocs = NULL;
+ enum elf_nds32_reloc_type rtype;
+ struct section_id_list_t *node = NULL;
+ int count = 0;
+
+ do
+ {
+ if (0 == relax_group_ptr->count)
+ break;
+
+ /* check if this section has handled */
+ node = elf32_nds32_lookup_section_id (asec->id, &relax_group_section_id_list);
+ if (NULL == node)
+ break; /* hit, the section id has handled. */
+
+ /* Relocations MUST be kept in memory, because relaxation adjust them. */
+ relocs = _bfd_elf_link_read_relocs (abfd, asec, NULL, NULL,
+ TRUE /* keep_memory */);
+ if (relocs == NULL)
+ {
+ BFD_ASSERT (0); /* feed me */
+ break;
+ }
+
+ /* allocate group id bias for this bfd! */
+ if (0 == relax_group_ptr->init)
+ {
+ relax_group_ptr->bias = next_relax_group_bias;
+ next_relax_group_bias += relax_group_ptr->count;
+ relax_group_ptr->init = 1;
+ }
+
+ /* reorder relax group groups */
+ relend = relocs + asec->reloc_count;
+ for (rel = relocs; rel < relend; rel++)
+ {
+ rtype = ELF32_R_TYPE(rel->r_info);
+ if (rtype != R_NDS32_RELAX_GROUP)
+ continue;
+
+ /* change it */
+ rel->r_addend += relax_group_ptr->bias;
+ /* debugging count */
+ count++;
+ }
+ }
+ while (FALSE);
+
+ if (relocs != NULL && elf_section_data (asec)->relocs != relocs)
+ free (relocs);
+
+ return result;
+}
+
+int
+nds32_elf_unify_tls_model (bfd *inbfd, asection *insec, bfd_byte *incontents,
+ struct bfd_link_info *lnkinfo)
+{
+ bfd_boolean result = TRUE;
+ Elf_Internal_Rela *irel;
+ Elf_Internal_Rela *irelend;
+ Elf_Internal_Rela *internal_relocs;
+ unsigned long r_symndx;
+ enum elf_nds32_reloc_type r_type;
+
+ Elf_Internal_Sym *local_syms = NULL;
+ bfd_byte *contents = NULL;
+
+ relax_group_list_t chain = { .id = -1, .next = NULL, .next_sibling = NULL };
+
+ Elf_Internal_Shdr *symtab_hdr = &elf_tdata (inbfd)->symtab_hdr;
+ struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
+ sym_hashes = elf_sym_hashes (inbfd);
+ sym_hashes_end =
+ sym_hashes + symtab_hdr->sh_size / sizeof (Elf32_External_Sym);
+ if (!elf_bad_symtab (inbfd))
+ sym_hashes_end -= symtab_hdr->sh_info;
+
+ /* reorder RELAX_GROUP when command line option '-r' is applied */
+ if (lnkinfo->relocatable)
+ {
+ elf32_nds32_unify_relax_group (inbfd, insec);
+ /* goto finish; */
+ return result;
+ }
+
+ /* Relocations MUST be kept in memory, because relaxation adjust them. */
+ internal_relocs = _bfd_elf_link_read_relocs (inbfd, insec, NULL, NULL,
+ TRUE /* keep_memory */);
+ if (internal_relocs == NULL)
+ goto error_return;
+
+ irelend = internal_relocs + insec->reloc_count;
+ irel = find_relocs_at_address (internal_relocs, internal_relocs,
+ irelend, R_NDS32_RELAX_ENTRY);
+ if (irel == irelend)
+ goto finish;
+
+ /* chain/remove groups */
+ for (irel = internal_relocs; irel < irelend; irel++)
+ {
+ r_symndx = ELF32_R_SYM (irel->r_info);
+ r_type = ELF32_R_TYPE (irel->r_info);
+ if (r_type != R_NDS32_RELAX_GROUP)
+ continue;
+
+ /* remove it */
+ irel->r_info = ELF32_R_INFO (r_symndx, R_NDS32_NONE);
+ /* chain it now */
+ if (!list_insert (&chain, irel))
+ goto error_return;
+ }
+
+ /* collect group relocations */
+ /* presume relocations are sorted */
+ relax_group_list_t *pNext = chain.next;
+ if (pNext)
+ {
+ for (irel = internal_relocs; irel < irelend; irel++)
+ {
+ if (irel->r_offset == pNext->relo->r_offset)
+ {
+ /* ignore Non-TLS relocation types */
+ r_type = ELF32_R_TYPE (irel->r_info);
+ if ((R_NDS32_TLS_TPOFF > r_type)
+ || (R_NDS32_RELAX_ENTRY == r_type))
+ continue;
+
+ if (!list_insert_sibling (pNext, irel))
+ goto error_return;
+ }
+ else if (irel->r_offset > pNext->relo->r_offset)
+ {
+ pNext = pNext->next;
+ if (!pNext)
+ break;
+
+ bfd_vma current_offset = pNext->relo->r_offset;
+ if (irel->r_offset > current_offset)
+ irel = internal_relocs; /* restart from head */
+ else
+ --irel; /* check current irel again */
+ continue;
+ }
+ else
+ {
+ //printf("irel->off = 0x%08x, pNext->relo->off = 0x%08x (0x%08x)\n", (unsigned)irel->r_offset, (unsigned)pNext->relo->r_offset, (unsigned)first_offset);
+ }
+ }
+ }
+
+#ifdef DUBUG_VERBOSE
+ dump_chain(&chain);
+#endif
+
+ /* Get symbol table and section content. */
+ if (incontents)
+ contents = incontents;
+ else if (!nds32_get_section_contents (inbfd, insec, &contents, TRUE)
+ || !nds32_get_local_syms (inbfd, insec, &local_syms))
+ goto error_return;
+
+ char *local_got_tls_type = elf32_nds32_local_got_tls_type (inbfd);
+
+ /* convert TLS model each group if necessary */
+ pNext = chain.next;
+ int cur_grp_id = -1;
+ int sethi_rt = -1;
+ int add_rt = -1;
+ enum elf_nds32_tls_type tls_type, org_tls_type, eff_tls_type;
+ tls_type = org_tls_type = eff_tls_type = 0;
+ while (pNext)
+ {
+ relax_group_list_t *pNextSig = pNext->next_sibling;
+ while (pNextSig)
+ {
+ struct elf_link_hash_entry *h = NULL;
+ irel = pNextSig->relo;
+ r_symndx = ELF32_R_SYM(irel->r_info);
+ r_type = ELF32_R_TYPE(irel->r_info);
+
+ if (pNext->id != cur_grp_id)
+ {
+ cur_grp_id = pNext->id;
+ org_tls_type = get_tls_type (r_type, NULL);
+ if (r_symndx >= symtab_hdr->sh_info)
+ {
+ h = sym_hashes[r_symndx - symtab_hdr->sh_info];
+ while (h->root.type == bfd_link_hash_indirect
+ || h->root.type == bfd_link_hash_warning)
+ h = (struct elf_link_hash_entry *) h->root.u.i.link;
+ tls_type = ((struct elf_nds32_link_hash_entry *) h)->tls_type;
+ }
+ else
+ {
+ /* TODO: find local symbol hash if necessary? */
+ tls_type = local_got_tls_type ? local_got_tls_type[r_symndx] : GOT_NORMAL;
+ }
+
+ eff_tls_type = 1 << (fls (tls_type) - 1);
+ sethi_rt = N32_RT5(bfd_getb32 (contents + irel->r_offset));
+ }
+
+ if (eff_tls_type != org_tls_type)
+ {
+ switch (org_tls_type)
+ {
+ case GOT_TLS_DESC:
+ switch (eff_tls_type)
+ {
+ case GOT_TLS_IE:
+ switch (r_type)
+ {
+ case R_NDS32_TLS_DESC_HI20:
+ irel->r_info = ELF32_R_INFO(r_symndx,
+ R_NDS32_TLS_IE_HI20);
+ break;
+ case R_NDS32_TLS_DESC_LO12:
+ irel->r_info = ELF32_R_INFO(r_symndx,
+ R_NDS32_TLS_IE_LO12);
+ break;
+ case R_NDS32_TLS_DESC_ADD:
+ {
+ uint32_t insn = bfd_getb32 (
+ contents + irel->r_offset);
+ add_rt = N32_RT5 (insn);
+ insn = N32_TYPE2 (LWI, add_rt, sethi_rt, 0);
+ bfd_putb32 (insn, contents + irel->r_offset);
+
+ irel->r_info = ELF32_R_INFO(r_symndx, R_NDS32_NONE);
+/* irel->r_info = ELF32_R_INFO (r_symndx, R_NDS32_TLS_IE_LW);
+*/
+ }
+ break;
+ case R_NDS32_TLS_DESC_FUNC:
+ bfd_putb32 (INSN_NOP, contents + irel->r_offset);
+ irel->r_info = ELF32_R_INFO(r_symndx,
+ R_NDS32_RELAX_REMOVE);
+ break;
+ case R_NDS32_TLS_DESC_CALL:
+ {
+ uint32_t insn = N32_ALU1(ADD, REG_R0, add_rt,
+ REG_TP);
+ bfd_putb32 (insn, contents + irel->r_offset);
+
+ irel->r_info = ELF32_R_INFO(r_symndx, R_NDS32_NONE);
+ }
+ break;
+ case R_NDS32_LOADSTORE:
+ case R_NDS32_PTR:
+ case R_NDS32_PTR_RESOLVED:
+ case R_NDS32_NONE:
+ case R_NDS32_LABEL:
+ break;
+ default:
+ BFD_ASSERT(0);
+ break;
+ }
+ break;
+ case GOT_TLS_IEGP:
+ switch (r_type)
+ {
+ case R_NDS32_TLS_DESC_HI20:
+ irel->r_info = ELF32_R_INFO(r_symndx,
+ R_NDS32_TLS_IEGP_HI20);
+ break;
+ case R_NDS32_TLS_DESC_LO12:
+ irel->r_info = ELF32_R_INFO(r_symndx,
+ R_NDS32_TLS_IEGP_LO12);
+ break;
+ case R_NDS32_TLS_DESC_ADD:
+ {
+ uint32_t insn = bfd_getb32 (
+ contents + irel->r_offset);
+ add_rt = N32_RT5 (insn);
+ insn = N32_MEM(LW, add_rt, sethi_rt, REG_GP, 0);
+ bfd_putb32 (insn, contents + irel->r_offset);
+
+ irel->r_info = ELF32_R_INFO(r_symndx, R_NDS32_NONE);
+/* irel->r_info = ELF32_R_INFO (r_symndx, R_NDS32_TLS_IEGP_LW);
+*/
+ }
+ break;
+ case R_NDS32_TLS_DESC_FUNC:
+ bfd_putb32 (INSN_NOP, contents + irel->r_offset);
+ irel->r_info = ELF32_R_INFO(r_symndx,
+ R_NDS32_RELAX_REMOVE);
+ break;
+ case R_NDS32_TLS_DESC_CALL:
+ {
+ uint32_t insn = N32_ALU1(ADD, REG_R0, add_rt,
+ REG_TP);
+ bfd_putb32 (insn, contents + irel->r_offset);
+
+ irel->r_info = ELF32_R_INFO(r_symndx, R_NDS32_NONE);
+ }
+ break;
+ case R_NDS32_LOADSTORE:
+ case R_NDS32_PTR:
+ case R_NDS32_PTR_RESOLVED:
+ case R_NDS32_NONE:
+ case R_NDS32_LABEL:
+ break;
+ default:
+ BFD_ASSERT(0);
+ break;
+ }
+ break;
+ default:
+#ifdef DEBUG_VERBOSE
+ printf (
+ "SKIP: %s: %s @ 0x%08x tls_type = 0x%08x, eff_tls_type = 0x%08x, org_tls_type = 0x%08x\n",
+ inbfd->filename, h ? h->root.root.string : "local",
+ (unsigned) irel->r_offset, tls_type, eff_tls_type,
+ org_tls_type);
+#endif
+ break;
+ }
+ break;
+ case GOT_TLS_IEGP:
+ switch (eff_tls_type)
+ {
+ case GOT_TLS_IE:
+ switch (r_type)
+ {
+ case R_NDS32_TLS_IEGP_HI20:
+ irel->r_info = ELF32_R_INFO(r_symndx,
+ R_NDS32_TLS_IE_HI20);
+ break;
+ case R_NDS32_TLS_IEGP_LO12:
+ irel->r_info = ELF32_R_INFO(r_symndx,
+ R_NDS32_TLS_IE_LO12);
+ break;
+ case R_NDS32_PTR_RESOLVED:
+ {
+ uint32_t insn = bfd_getb32 (
+ contents + irel->r_offset);
+ add_rt = N32_RT5 (insn);
+ insn = N32_TYPE2 (LWI, add_rt, sethi_rt, 0);
+ bfd_putb32 (insn, contents + irel->r_offset);
+ }
+ break;
+ case R_NDS32_LOADSTORE:
+ case R_NDS32_PTR:
+ case R_NDS32_NONE:
+ case R_NDS32_LABEL:
+ break;
+ default:
+ BFD_ASSERT(0);
+ break;
+ }
+ break;
+ default:
+#ifdef DEBUG_VERBOSE
+ printf (
+ "SKIP: %s: %s @ 0x%08x tls_type = 0x%08x, eff_tls_type = 0x%08x, org_tls_type = 0x%08x\n",
+ inbfd->filename, h ? h->root.root.string : "local",
+ (unsigned) irel->r_offset, tls_type, eff_tls_type,
+ org_tls_type);
+#endif
+ break;
+ }
+ break;
+ default:
+#ifdef DEBUG_VERBOSE
+ printf (
+ "SKIP: %s: %s @ 0x%08x tls_type = 0x%08x, eff_tls_type = 0x%08x, org_tls_type = 0x%08x\n",
+ inbfd->filename, h ? h->root.root.string : "local",
+ (unsigned) irel->r_offset, tls_type, eff_tls_type,
+ org_tls_type);
+#endif
+ break;
+ }
+ }
+ pNextSig = pNextSig->next_sibling;
+ }
+
+#if 1
+ pNext = pNext->next;
+#else
+ while (pNext)
+ {
+ if (pNext->id != cur_grp_id)
+ break;
+ pNext = pNext->next;
+ }
+#endif
+ }
+
+finish:
+ if (incontents)
+ contents = NULL;
+
+ if (internal_relocs != NULL
+ && elf_section_data (insec)->relocs != internal_relocs)
+ free (internal_relocs);
+
+ if (contents != NULL
+ && elf_section_data (insec)->this_hdr.contents != contents)
+ free (contents);
+
+ if (local_syms != NULL && symtab_hdr->contents != (bfd_byte *) local_syms)
+ free (local_syms);
+
+ if (chain.next)
+ {
+ pNext = chain.next;
+ relax_group_list_t *pDel;
+ while (pNext)
+ {
+ pDel = pNext;
+ pNext = pNext->next;
+ free (pDel);
+ }
+ }
+
+ return result;
+
+error_return:
+ result = FALSE;
+ goto finish;
+}
+
+/* Initialize ifc hash table. */
+
+static int
+nds32_elf_ifc_init (void)
+{
+ static bfd_boolean done = FALSE;
+ if (done)
+ return TRUE;
+
+ done = TRUE;
+ if (!bfd_hash_table_init (&ifc_code_table, nds32_elf_ifc_code_hash_newfunc,
+ sizeof (struct elf_nds32_ifc_code_hash_entry)))
+ {
+ (*_bfd_error_handler) (_("Ld error: cannot init ifc hash table\n"));
+ return FALSE;
+ }
+ return TRUE;
+}
+
+/* New a unit and insert ifc hash entry. */
+
+static void
+nds32_elf_ifc_new_ifc_unit (struct elf_nds32_ifc_code_hash_entry *entry,
+ struct elf_nds32_ifc_code_hash_entry *pre_entry,
+ struct elf_nds32_ifc_member *child,
+ struct elf_nds32_ifc_member *pre_child)
+{
+ struct elf_nds32_ifc_unit *ptr_unit, *temp_unit;
+ struct elf_nds32_ifc_member *ptr_member;
+
+ if (!pre_entry || !pre_child)
+ return;
+
+ /* Find unit in entry. */
+ ptr_unit = pre_entry->unit;
+ temp_unit = ptr_unit;
+ while (ptr_unit && ptr_unit->hash != entry)
+ {
+ temp_unit = ptr_unit;
+ ptr_unit = ptr_unit->next;
+ }
+ if (!ptr_unit)
+ {
+ ptr_unit = bfd_malloc (sizeof (struct elf_nds32_ifc_unit));
+ if (!pre_entry->unit)
+ pre_entry->unit = ptr_unit;
+ else
+ temp_unit->next = ptr_unit;
+ ptr_unit->times = 0;
+ ptr_unit->member = NULL;
+ ptr_unit->hash = entry;
+ ptr_unit->next = NULL;
+ ptr_unit->entry_p = pre_entry;
+ ptr_unit->done = 0;
+ }
+ pre_child->next_member = child;
+ pre_child->unit_p = ptr_unit;
+ ptr_unit->times++;
+ if (!pre_entry->max_unit
+ || pre_entry->max_unit->times < ptr_unit->times)
+ pre_entry->max_unit = ptr_unit;
+
+ /* Insert member into unit. */
+ ptr_member = ptr_unit->member;
+ while (ptr_member && ptr_member->next)
+ ptr_member = ptr_member->next;
+
+ if (!ptr_member)
+ ptr_unit->member = pre_child;
+ else
+ ptr_member->next = pre_child;
+}
+
+/* Insert the symbol and relocation barrier list. */
+
+static void
+nds32_elf_ifc_insert_barrier (int offset,
+ struct elf_nds32_ifc_barrier ** barrier)
+{
+ struct elf_nds32_ifc_barrier *new_barrier;
+ struct elf_nds32_ifc_barrier *last_barrier;
+
+ /* The symbol is in this section. */
+ new_barrier = malloc (sizeof (struct elf_nds32_ifc_barrier));
+ new_barrier->offset = offset;
+ new_barrier->next = NULL;
+ if (*barrier == NULL)
+ *barrier = new_barrier;
+ else
+ {
+ if (new_barrier->offset < (*barrier)->offset)
+ {
+ new_barrier->next = *barrier;
+ *barrier = new_barrier;
+ }
+ else
+ {
+ last_barrier = *barrier;
+ while (last_barrier->next
+ && last_barrier->next->offset < new_barrier->offset)
+ last_barrier = last_barrier->next;
+ new_barrier->next = last_barrier->next;
+ last_barrier->next = new_barrier;
+ }
+ }
+}
+
+/* Build barrier list. */
+
+static bfd_boolean
+nds32_elf_ifc_build_barrier (bfd *abfd, asection *sec,
+ struct elf_nds32_ifc_barrier **barrier)
+{
+ const struct elf_backend_data *bed = get_elf_backend_data (abfd);
+ struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (abfd);
+ Elf_Internal_Shdr *hdr;
+ bfd_size_type symcount;
+ bfd_size_type extsymcount;
+ struct bfd_link_hash_entry *bh;
+ Elf_Internal_Rela *internal_relocs, *irelend, *irel;
+ unsigned int sec_shndx;
+ Elf_Internal_Shdr *symtab_hdr;
+ Elf_Internal_Sym *isym = NULL;
+ unsigned int i;
+
+ /* Scan global symbol. */
+ if (sym_hashes)
+ {
+ if (!(abfd->flags & DYNAMIC) || elf_dynsymtab (abfd) == 0)
+ hdr = &elf_tdata (abfd)->symtab_hdr;
+ else
+ return FALSE;
+
+ /* Check for the symbol existence. */
+ symcount = hdr->sh_size / bed->s->sizeof_sym;
+ extsymcount = symcount - hdr->sh_info;
+ for (i = 0; i < extsymcount; i++)
+ {
+ bh = (struct bfd_link_hash_entry *) *(sym_hashes + i);
+ if (bh->u.def.section == sec)
+ nds32_elf_ifc_insert_barrier (bh->u.def.value, barrier);
+ }
+ }
+
+ /* Scan relocations to get the local target. */
+ internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
+ TRUE /* keep_memory */);
+ irelend = internal_relocs + sec->reloc_count;
+ sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
+ symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
+ if (!nds32_get_local_syms (abfd, sec, &isym))
+ return FALSE;
+
+ for (i = 0; i < symtab_hdr->sh_info; i++)
+ {
+ if ((isym + i)->st_value > 0
+ && (isym + i)->st_shndx == sec_shndx
+ && (isym + i)->st_value <= sec->size
+ && ELF32_ST_TYPE ((isym + i)->st_info) == STT_FUNC)
+ {
+ nds32_elf_ifc_insert_barrier ((isym + i)->st_value, barrier);
+ }
+ }
+
+ for (irel = internal_relocs; irel < irelend; irel++)
+ {
+ if (ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_ENTRY
+ && ELF32_R_TYPE (irel->r_info) != R_NDS32_LABEL
+ && ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info
+ && isym[ELF32_R_SYM (irel->r_info)].st_shndx == sec_shndx)
+ {
+ /* FIXME: DIFFxx relcoations have to be do something more. */
+ nds32_elf_ifc_insert_barrier (irel->r_addend, barrier);
+ }
+ }
+ return TRUE;
+}
+
+/* Trace all section and build the instruction list. */
+/* We collect all instruction here, and put each same insntruction in
+ the same hash entry. Each entry has to save all appearance section
+ and offset. */
+
+static bfd_boolean
+nds32_elf_ifc_trace_code (struct bfd_link_info *link_info,
+ bfd *abfd, asection *sec)
+{
+ Elf_Internal_Rela *internal_relocs, *irelend, *irel;
+ bfd_byte *contents = NULL;
+ unsigned int off = 0, insn_size;
+ unsigned long insn;
+ struct elf_nds32_ifc_code_hash_entry *entry, *pre_entry;
+ struct elf_nds32_ifc_member *pre_child, *child;
+ struct elf_nds32_ifc_sec_block *block;
+ struct elf_nds32_ifc_sec_member *smember, *cur_smember;;
+ char code[20];
+ struct elf_nds32_ifc_barrier *barrier = NULL, *ptr_barrier;
+ bfd_boolean ignore, end;
+ struct elf_link_hash_entry **sym_hashes;
+ unsigned long r_symndx;
+ Elf_Internal_Shdr *symtab_hdr;
+ struct elf_link_hash_entry *h;
+ Elf_Internal_Sym *isymbuf = NULL;
+
+ pre_entry = NULL;
+ pre_child = NULL;
+ internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
+ TRUE /* keep_memory */);
+ irelend = internal_relocs + sec->reloc_count;
+
+ /* Check the object if enable ifc. */
+ irel = find_relocs_at_address (internal_relocs, internal_relocs, irelend,
+ R_NDS32_RELAX_ENTRY);
+
+ /* Check this section trigger ifc relaxation. */
+ if (irel == NULL
+ || irel >= irelend
+ || ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_ENTRY
+ || (ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_ENTRY
+ && !(irel->r_addend & R_NDS32_RELAX_ENTRY_IFC_FLAG)))
+ return TRUE;
+
+ if (!nds32_get_section_contents (abfd, sec, &contents, TRUE))
+ return FALSE;
+
+ elf_section_data (sec)->relocs = internal_relocs;
+ sym_hashes = elf_sym_hashes (abfd);
+ symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
+ nds32_get_local_syms (abfd, sec, &isymbuf);
+ /* Backup header size and restore it after relocation because ifc
+ optimization may modify this value. */
+ elf_nds32_tdata (abfd)->hdr_size = symtab_hdr->sh_size;
+
+ /* Build barrier list. If there is any label or target in somewhere,
+ this instruction can not be delete. It has to traverse global symbol
+ hash table and relocations to get all possible label. */
+ nds32_elf_ifc_build_barrier (abfd, sec, &barrier);
+
+ /* Start to traverse content. */
+ irel = internal_relocs;
+ ptr_barrier = barrier;
+
+ block = malloc (sizeof (struct elf_nds32_ifc_sec_block));
+ block->sec = sec;
+ block->smember = NULL;
+ block->next = ifc_block_head;
+ ifc_block_head = block;
+ cur_smember = NULL;
+
+ while (off < sec->size)
+ {
+ h = NULL;
+ ignore = FALSE;
+ end = FALSE;
+
+ while (irel != NULL && irel < irelend && irel->r_offset < off)
+ irel++;
+ while (ptr_barrier && ptr_barrier->offset < off)
+ ptr_barrier = ptr_barrier->next;
+
+ /* Get binary code. */
+ if (*(contents + off) & 0x80)
+ {
+ /* 16-bit instuction. */
+ insn = bfd_getb16 (contents + off);
+ snprintf (code, sizeof (code), "%04lx", insn);
+ insn_size = 2;
+
+ /* Clean insntruction regiter for jr5 and jral5. */
+ switch (insn & 0xff00)
+ {
+ /* Because there is no relocation for jr5 and jral5 in case
+ longjump and longcall, it has to ignore it for ifc. */
+ /* jr5 ret5 jral5 add5.pc ex9.it. */
+ case INSN_JR5:
+ ignore = TRUE;
+ break;
+ default:
+ break;
+ }
+ }
+ else
+ {
+ /* 32-bit instuction. */
+ insn = bfd_getb32 (contents + off);
+ snprintf (code, sizeof (code), "%08lx", insn);
+ insn_size = 4;
+ switch (N32_OP6 (insn))
+ {
+ case N32_OP6_JREG:
+ /* jr and jral. */
+ ignore = TRUE;
+ break;
+ case N32_OP6_MISC:
+ if (N32_SUB5 (insn) == N32_MISC_MTSR
+ || N32_SUB5 (insn) == N32_MISC_MFSR)
+ ignore = TRUE;
+ break;
+ case N32_OP6_ALU2:
+ if (N32_SUB6 (insn) == N32_ALU2_MTUSR
+ || N32_SUB6 (insn) == N32_ALU2_MFUSR)
+ ignore = TRUE;
+ break;
+ default:
+ break;
+ }
+ }
+
+ /* Check the IFC ignored region. */
+ if (irel && irel < irelend
+ && nds32_elf_ifc_check_region (&irel, irelend, link_info))
+ {
+ if (irel == NULL || irel >= irelend)
+ return TRUE;
+ off = irel->r_offset;
+ off += ((*(contents + off) & 0x80) != 0 ? 2 : 4);
+ pre_entry = NULL;
+ pre_child = NULL;
+ continue;
+ }
+ /* Ignore instruction with relocation. */
+ /* It can add instruction with relocation to ifc in the future.
+ I think only the global target can do. We may try to compare
+ post and link ifc to know what kinds of relocation are most needed
+ being done first. */
+ else if (ignore == TRUE)
+ {
+ /* Set a new basic block. */
+ off += insn_size;
+ pre_entry = NULL;
+ pre_child = NULL;
+ continue;
+ }
+ else if (irel < irelend && irel->r_offset == off
+ && (ELF32_R_TYPE (irel->r_info) == R_NDS32_25_PCREL_RELA
+ || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3
+ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0)
+ || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA15S3_RELA
+ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA15S0_RELA)
+ || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA12S2_DP_RELA
+ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA12S2_SP_RELA)
+ || (ELF32_R_TYPE (irel->r_info) >= R_NDS32_SDA16S3_RELA
+ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_SDA19S0_RELA)))
+ {
+ r_symndx = ELF32_R_SYM (irel->r_info);
+ if (r_symndx < symtab_hdr->sh_info)
+ {
+ /* Ignore local symbol, so set a new basic block. */
+ off += insn_size;
+ pre_entry = NULL;
+ pre_child = NULL;
+ continue;
+ }
+ else
+ {
+ /* Global jump target, keep going. */
+ bfd_boolean warned ATTRIBUTE_UNUSED;
+ bfd_boolean unresolved_reloc ATTRIBUTE_UNUSED;
+ bfd_vma relocation;
+ asection *sym_sec;
+
+ RELOC_FOR_GLOBAL_SYMBOL (link_info, abfd, sec, irel,
+ r_symndx, symtab_hdr, sym_hashes,
+ h, sym_sec, relocation,
+ unresolved_reloc, warned);
+ relocation += irel->r_addend;
+ /* J and JAL has to shift one bit. Here, we use absolute addresss
+ to build hash entry. */
+ snprintf (code, sizeof (code), "%08lx%08lx", relocation, insn);
+ }
+
+ if ((ELF32_R_TYPE (irel->r_info) == R_NDS32_25_PCREL_RELA
+ && (insn == INSN_JAL || insn == INSN_J)))
+ end = TRUE;
+ }
+ else if (irel < irelend && irel->r_offset == off
+ && ELF32_R_TYPE (irel->r_info) >= R_NDS32_9_PCREL_RELA
+ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_17_PCREL_RELA)
+ {
+ r_symndx = ELF32_R_SYM (irel->r_info);
+ if (r_symndx < symtab_hdr->sh_info)
+ {
+ /* Local symbol. */
+ bfd_vma relocation;
+ int shndx = isymbuf[r_symndx].st_shndx;
+
+ bfd_vma st_value = (isymbuf + r_symndx)->st_value;
+ asection *isec = elf_elfsections (abfd)[shndx]->bfd_section;
+ relocation = isec->output_section->vma + isec->output_offset
+ + st_value + irel->r_addend;
+ snprintf (code, sizeof (code), "%08lx%08lx", relocation,
+ (insn_size == 4) ? insn : insn << 16);
+ }
+ else
+ {
+ /* Ignore global condition branch target. */
+ off += insn_size;
+ pre_entry = NULL;
+ pre_child = NULL;
+ continue;
+ }
+
+ if (ELF32_R_TYPE (irel->r_info) == R_NDS32_9_PCREL_RELA
+ && (insn == INSN_J8))
+ end = TRUE;
+ }
+ else if (irel < irelend && irel->r_offset == off)
+ {
+ while (irel < irelend && irel->r_offset == off)
+ {
+ switch (ELF32_R_TYPE (irel->r_info))
+ {
+ case R_NDS32_32_RELA:
+ /* Data. */
+ insn_size = 4;
+ break;
+ case R_NDS32_16_RELA:
+ /* Data. */
+ insn_size = 2;
+ break;
+ case R_NDS32_DATA:
+ /* Data. */
+ /* The least code alignment is 2. If the data is only one byte,
+ we have to shift one more byte. */
+ if (irel->r_addend == 1)
+ insn_size = 2;
+ else
+ insn_size = irel->r_addend;
+ break;
+ default:
+ break;
+ }
+ irel++;
+ }
+ /* Set a new basic block. */
+ off += insn_size;
+ pre_entry = NULL;
+ pre_child = NULL;
+ continue;
+ }
+
+ if (ptr_barrier && ptr_barrier->offset == off)
+ {
+ /* If there is symbol at the instruction, this one only can be the
+ begining of basic block. We have to promise there is no jump
+ target or label in the common block, because if the block be
+ converted ifcall the label will disapear. */
+ pre_entry = NULL;
+ pre_child = NULL;
+ }
+
+ off += insn_size;
+ /* Hash and copy "code". */
+ entry = (struct elf_nds32_ifc_code_hash_entry *)
+ bfd_hash_lookup (&ifc_code_table, code, TRUE, TRUE);
+ if (entry == NULL)
+ {
+ (*_bfd_error_handler)
+ (_("%P%F: failed creating ifc %s hash table: %E\n"), code);
+ return FALSE;
+ }
+
+ entry->size = insn_size;
+
+ /* It is hard to do ifc, when the sequence instructions are the same. */
+ if (entry == pre_entry
+ || (h && entry->h && entry->h != h))
+ {
+ pre_entry = NULL;
+ pre_child = NULL;
+ continue;
+ }
+
+ entry->times++;
+ entry->h = h;
+ entry->end = end;
+
+ /* Build list between current and previous instruction.
+ First round: generate entry A and member B. */
+ /* List: code_hash_entry->unit->member.
+ Example: ABCAB
+ 12345
+ {entry} [unit] (member)
+ {A} -> [B] -> (1) -> (4) */
+
+ child = bfd_malloc (sizeof (struct elf_nds32_ifc_member));
+ child->offset = off;
+ child->sec = sec;
+ /* For B member, its pre_entry is null.
+ For C member, its pre_entry is A. */
+ child->pre_entry = pre_entry;
+ child->unit_p = NULL;
+ child->next = NULL;
+ child->next_member = NULL;
+ child->pre_member = pre_child;
+ child->dead = FALSE;
+ child->bh = NULL;
+
+ /* Build section instruction list to adjust offset
+ when increasing or decreasing later. */
+ smember = malloc (sizeof (struct elf_nds32_ifc_sec_member)) ;
+ smember->member = child;
+ smember->next = NULL;
+ if (!cur_smember)
+ {
+ block->smember = smember;
+ cur_smember = smember;
+ }
+ else
+ {
+ cur_smember->next = smember;
+ cur_smember = smember;
+ }
+
+ nds32_elf_ifc_new_ifc_unit (entry, pre_entry, child, pre_child);
+ if (end)
+ {
+ pre_child = NULL;
+ pre_entry = NULL;
+ }
+ else
+ {
+ pre_child = child;
+ pre_entry = entry;
+ }
+ }
+ return TRUE;
+}
+
+/* Insert the entry in sort by its times. */
+
+static void
+nds32_elf_ifc_order_insn_times (struct elf_nds32_ifc_code_hash_entry *entry)
+{
+ struct elf_nds32_ifc_code_hash_entry *ptr = ifc_insn_head;
+
+ /* First entry. */
+ if (!ifc_insn_head)
+ ifc_insn_head = entry;
+ else if (!entry->max_unit)
+ {
+ /* There is no max_unit in current list. */
+ while (ptr->next)
+ ptr = ptr->next;
+ entry->next = ptr->next;
+ ptr->next = entry;
+ }
+ else
+ {
+ entry->max_times = entry->max_unit->times;
+ if (!ptr->max_unit
+ || ptr->max_unit->times < entry->max_unit->times)
+ {
+ /* The new one is the bigest one. */
+ entry->next = ptr;
+ ifc_insn_head = entry;
+ return;
+ }
+ while (ptr->next && ptr->next->unit
+ && ptr->next->unit->times > entry->unit->times)
+ ptr = ptr->next;
+ entry->next = ptr->next;
+ ptr->next = entry;
+ }
+}
+
+/* IFC hash table traverse function. */
+
+static void
+nds32_elf_ifc_code_hash_traverse (void (*func) (struct elf_nds32_ifc_code_hash_entry*))
+{
+ unsigned int i;
+
+ ifc_code_table.frozen = 1;
+ for (i = 0; i < ifc_code_table.size; i++)
+ {
+ struct bfd_hash_entry *p;
+
+ for (p = ifc_code_table.table[i]; p != NULL; p = p->next)
+ func ((struct elf_nds32_ifc_code_hash_entry *) p);
+ }
+ ifc_code_table.frozen = 0;
+}
+
+/* Push common subexpression. */
+
+static void
+nds32_elf_ifc_push_stack (struct elf_nds32_ifc_insn_stack **stack,
+ struct elf_nds32_ifc_unit *unit)
+{
+ struct elf_nds32_ifc_member *member;
+ struct elf_nds32_ifc_insn_stack *ptr;
+ struct elf_nds32_ifc_insn_member *imember, *ptr_imember;
+
+ /* Get the first member in the same unit. */
+ member = unit->member->unit_p->member;
+
+ if (!*stack)
+ {
+ /* The first instruction in common subexpression. */
+ while (member)
+ {
+ /* The newest one stack is as the head. */
+ if (!member->dead)
+ {
+ ptr = bfd_malloc (sizeof (struct elf_nds32_ifc_insn_stack));
+ imember = bfd_malloc (sizeof (struct elf_nds32_ifc_insn_member));
+ imember->member = member;
+ imember->next = NULL;
+ ptr->imember = imember;
+ ptr->next = *stack;
+ ptr->live = 1;
+ ptr->extend = 0;
+ *stack = ptr;
+ }
+ member = member->next;
+ }
+ }
+ else
+ {
+ /* Initial stack state, because we have to trigger them after
+ matching new member. */
+ ptr = *stack;
+ while (ptr)
+ {
+ ptr->choose = ptr->live;
+ ptr->live = 0;
+ ptr = ptr->next;
+ }
+
+ while (member)
+ {
+ /* Find the same common subexpression stack and push. */
+ ptr = *stack;
+ while (!member->dead && ptr)
+ {
+ if (ptr->live == 0 && ptr->choose == 1)
+ {
+ ptr_imember = ptr->imember;
+ /* Go to the final imember. */
+ while (ptr_imember && ptr_imember->next)
+ ptr_imember = ptr_imember->next;
+
+ if (ptr_imember->member->next_member == member)
+ {
+ /* When the final member next one match the new member,
+ insert it into list. */
+ imember = bfd_malloc (sizeof (struct elf_nds32_ifc_insn_member));
+ imember->member = member;
+ imember->next = NULL;
+ ptr->live = 1;
+ ptr_imember->next = imember;
+ break;
+ }
+ }
+ ptr = ptr->next;
+ }
+ member = member->next;
+ }
+ }
+}
+
+/* Pop common subexpression. */
+
+static void
+nds32_elf_ifc_pop_stack (struct elf_nds32_ifc_insn_stack **stack,
+ struct elf_nds32_ifc_unit *unit)
+{
+ if (!*stack)
+ return;
+
+ struct elf_nds32_ifc_insn_stack *ptr;
+ struct elf_nds32_ifc_insn_member *imember, *temp_member;
+ struct elf_nds32_ifc_member *member;
+
+ ptr = *stack;
+ while (ptr)
+ {
+ ptr->live = 0;
+ ptr = ptr->next;
+ }
+
+ ptr = *stack;
+ while (ptr)
+ {
+ /* Get the first member in the same unit. */
+ member = unit->member->unit_p->member;
+ while (member)
+ {
+ imember = ptr->imember;
+ while (imember)
+ {
+ if (imember->member == member)
+ {
+ ptr->live = 1;
+ temp_member = imember->next;
+ imember->next = NULL;
+ imember = temp_member;
+ break;
+ }
+ imember = imember->next;
+ }
+ while (imember)
+ {
+ temp_member = imember;
+ imember = imember->next;
+ free (temp_member);
+ }
+ if (ptr->live)
+ break;
+ member = member->next;
+ }
+ ptr = ptr->next;
+ }
+}
+
+/* Find the common down. */
+
+static int
+nds32_elf_ifc_find_cse_recur (struct elf_nds32_ifc_unit *ptr,
+ struct elf_nds32_ifc_insn_stack **stack,
+ int total)
+{
+ struct elf_nds32_ifc_member *member = ptr->member;
+ struct elf_nds32_ifc_unit *unit_head, *unit_current, *unit_pre = NULL;
+ struct elf_nds32_ifc_insn_stack *stack_ptr;
+ struct elf_nds32_ifc_insn_member *imember;
+ unit_head = NULL;
+ int gain, gc_size;
+ int abandon;
+
+ /* Push current member into stack. */
+ nds32_elf_ifc_push_stack (stack, ptr);
+
+ if (!*stack)
+ return 0;
+
+ /* The instruction will close ifc state. */
+ if (ptr->hash->end)
+ return ptr->times * ptr->hash->size;
+
+ /* Find the unit its max next instruction. */
+ stack_ptr = *stack;
+ while (stack_ptr)
+ {
+ if (stack_ptr->live)
+ {
+ /* Get the final instruction. */
+ imember = stack_ptr->imember;
+ while (imember->next)
+ imember = imember->next;
+ member = imember->member;
+ if (!member->next_member->dead)
+ {
+ unit_current = unit_head;
+ while (unit_current)
+ {
+ /* Check if the hash entry exist. */
+ unit_pre = unit_current;
+ if (member->next_member->unit_p
+ && member->next_member->unit_p->hash
+ == unit_current->hash
+ && (!unit_current->hash->h
+ || unit_current->hash->h
+ == member->next_member->unit_p->hash->h))
+ {
+ unit_current->times++;
+ break;
+ }
+ unit_current = unit_current->next;
+ }
+ /* New a unit group. */
+ if (member->next_member->unit_p
+ && !member->next_member->unit_p->hash->round
+ && !unit_current)
+ {
+ unit_current = bfd_malloc (sizeof (struct elf_nds32_ifc_unit));
+ unit_current->hash = member->next_member->unit_p->hash;
+ unit_current->times = 1;
+ unit_current->next = NULL;
+ unit_current->member = member->next_member;
+ unit_current->entry_p = member->next_member->unit_p->entry_p;
+ if (!unit_head)
+ unit_head = unit_current;
+ else
+ unit_pre->next = unit_current;
+ }
+ }
+ }
+ stack_ptr = stack_ptr->next;
+ }
+
+ /* Find the max next instruction unit. */
+ unit_current = unit_head;
+ unit_pre = unit_head;
+ while (unit_current)
+ {
+ if (unit_current->times > unit_pre->times)
+ unit_pre = unit_current;
+ unit_current = unit_current->next;
+ }
+
+ if (!unit_pre || unit_pre->times < 2)
+ {
+ unit_current = unit_head;
+ while (unit_current)
+ {
+ unit_current = unit_current->next;
+ free (unit_head);
+ unit_head = unit_current;
+ }
+ return ptr->times * ptr->hash->size;
+ }
+
+ /* Total code size and abandoned unit size. */
+ total = total + ptr->hash->size;
+ abandon = unit_pre->times;
+ gc_size = total * (ptr->times - abandon);
+
+ /* It have to estimate the longer common subexpression is profit.
+ Example: ABC ABC ABD.
+ We have to calculate ABC or AB is profit. */
+
+ ptr->hash->round = 1;
+ gain = nds32_elf_ifc_find_cse_recur (unit_pre, stack, total);
+ ptr->hash->round = 0;
+
+ /* Free memory. */
+ unit_current = unit_head;
+ while (unit_current)
+ {
+ unit_current = unit_current->next;
+ free (unit_head);
+ unit_head = unit_current;
+ }
+
+ if (gain > gc_size
+ || gain == 0)
+ {
+ /* Return total gain if adapt this edge. */
+ return (ptr->times - abandon) * ptr->hash->size + gain;
+ }
+ else
+ {
+ /* It is not more benifit to link deeper, and pop it. */
+ nds32_elf_ifc_pop_stack (stack, ptr);
+ return 0;
+ }
+}
+
+/* Reallocate section contents. */
+
+static void
+nds32_elf_ifc_reallocate_contents (asection *sec, int modify,
+ bfd_byte **contents)
+{
+ /* This function is highly dangerous, but I have to implement it. */
+ sec->size += modify;
+ bfd_byte *p = bfd_malloc (sec->size * sizeof (bfd_byte));
+ memset (p, 0, sec->size * sizeof (bfd_byte));
+ memcpy (p, *contents, sec->size - modify);
+ free (*contents);
+ *contents = p;
+ elf_section_data (sec)->this_hdr.contents = p;
+}
+
+/* Insert a symbol in symbol table. */
+
+static int
+nds32_elf_ifc_insert_sym_hash (bfd *abfd,
+ struct bfd_link_hash_entry *bh)
+{
+ const struct elf_backend_data *bed = get_elf_backend_data (abfd);
+ struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (abfd);
+ struct elf_link_hash_entry **sym_hash;
+ bfd_size_type amt;
+ Elf_Internal_Shdr *hdr;
+ bfd_size_type symcount;
+ bfd_size_type extsymcount;
+ bfd_size_type i;
+
+ /* No symbol hash exsitence. */
+ if (!sym_hashes)
+ return -1;
+
+ if (!(abfd->flags & DYNAMIC) || elf_dynsymtab (abfd) == 0)
+ hdr = &elf_tdata (abfd)->symtab_hdr;
+ else
+ return -1;
+
+ /* Check for the symbol existance. */
+ symcount = hdr->sh_size / bed->s->sizeof_sym;
+ extsymcount = symcount - hdr->sh_info;
+ for (i = 0; i < extsymcount; i++)
+ {
+ if ((struct bfd_link_hash_entry *) *(sym_hashes + i) == bh)
+ return i + hdr->sh_info;
+ }
+
+ /* Add one more entry. */
+ hdr->sh_size += bed->s->sizeof_sym;
+
+ symcount = hdr->sh_size / bed->s->sizeof_sym;
+ if (elf_bad_symtab (abfd))
+ extsymcount = symcount;
+ else
+ extsymcount = symcount - hdr->sh_info;
+
+ sym_hash = NULL;
+ if (extsymcount != 0)
+ {
+ /* We store a pointer to the hash table entry for each external
+ symbol. */
+ amt = extsymcount * sizeof (struct elf_link_hash_entry *);
+ sym_hash = bfd_malloc (amt);
+ memset (sym_hash, 0, amt);
+ if (sym_hash == NULL)
+ return -1;
+ memcpy (sym_hash, sym_hashes,
+ amt - sizeof (struct elf_link_hash_entry *));
+ memcpy (sym_hash + extsymcount -1, &bh,
+ sizeof (struct elf_link_hash_entry *));
+ elf_sym_hashes (abfd) = sym_hash;
+ /* TODO: Since sym_hashes is allocated by bfd_zalloc, it can not
+ be free directly. We have to record the memory allocated by
+ ourselves and free it. */
+ return (symcount - 1);
+ }
+ else
+ return -1;
+}
+
+/* Insert relocation. */
+
+static void
+nds32_elf_ifc_insert_relocation (struct bfd_link_info *info,
+ bfd *abfd, asection *sec,
+ struct bfd_link_hash_entry *bh,
+ bfd_vma offset,
+ bfd_boolean align,
+ bfd_vma clean_off)
+{
+ /* Insert a new relocation into section rela, and this is very force
+ implementation. It may cause unknown problem. */
+
+ Elf_Internal_Rela *relocs, *internal_relocs, *irelend;
+ long unsigned int size, extsymcount;
+ const struct elf_backend_data *bed = get_elf_backend_data (abfd);
+ unsigned int count = 0;
+ int num = 2;
+
+ /* If the reduction size is not 4 bytes aligment, it has to insert
+ one more relocation. */
+ if (!align)
+ num = 3;
+
+ /* Insert the jump target in symbol hash. */
+ extsymcount = nds32_elf_ifc_insert_sym_hash (abfd, bh);
+ if (extsymcount <= 0)
+ return;
+
+ internal_relocs = _bfd_elf_link_read_relocs (abfd, sec,
+ NULL, NULL, FALSE);
+ irelend = internal_relocs + sec->reloc_count;
+
+ /* The common block including relocation, it has to been cleaned. */
+ relocs = internal_relocs;
+ while (relocs && relocs < irelend)
+ {
+ if (relocs->r_offset >= offset && relocs->r_offset <= clean_off)
+ relocs->r_info = ELF32_R_INFO (ELF32_R_SYM (relocs->r_info),
+ R_NDS32_NONE);
+ relocs++;
+ }
+
+ /* We have to insert two relocations; one for ifc and
+ another is for alignment.*/
+ sec->reloc_count += num;
+ size = sec->reloc_count;
+ size *= bed->s->int_rels_per_ext_rel * sizeof (Elf_Internal_Rela);
+ relocs = (Elf_Internal_Rela *) bfd_malloc (size);
+ memset (relocs, 0, size);
+ elf_section_data (sec)->relocs = relocs;
+ while ((internal_relocs + count) < irelend
+ && (internal_relocs + count)->r_offset <= offset)
+ count++;
+
+ /* Copy the front part where the offset is smaller. */
+ memcpy (relocs, internal_relocs,
+ (bed->s->int_rels_per_ext_rel * sizeof (Elf_Internal_Rela) * count));
+
+ /* Insert new relocations. */
+ irelend = relocs + count;
+ /* Set relocation. */
+ irelend->r_offset = offset;
+ irelend->r_info =
+ ELF32_R_INFO (extsymcount, R_NDS32_17IFC_PCREL_RELA);
+ irelend->r_addend = 0;
+
+ irelend++;
+ /* Set relocation. */
+ irelend->r_offset = offset;
+ irelend->r_info = ELF32_R_INFO (0, R_NDS32_INSN16);
+ irelend->r_addend = 0;
+
+ /* One more relocation for alignment. */
+ if (!align)
+ {
+ irelend++;
+ irelend->r_offset = offset + 4;
+ irelend->r_info = ELF32_R_INFO (0, R_NDS32_INSN16);
+ irelend->r_addend = 1;
+ /* Put offset. */
+ }
+
+ /* Copy the rest part. */
+ irelend++;
+ memcpy (irelend, internal_relocs + count,
+ size - (bed->s->int_rels_per_ext_rel *
+ sizeof (Elf_Internal_Rela) * (count + num)));
+ if (!info->keep_memory)
+ free (internal_relocs);
+}
+
+/* Adjust insntruction map offset. Variable "adjust" is recorded the size
+ after relaxing. */
+
+static void
+nds32_elf_ifc_adjust_block (asection *sec, bfd_vma offset, int size, int adjust)
+{
+ struct elf_nds32_ifc_sec_block *block;
+ struct elf_nds32_ifc_sec_member *smember;
+
+ block = ifc_block_head;
+ while (block->sec != sec)
+ block = block->next;
+
+ smember = block->smember;
+ while (smember->member->offset < offset)
+ smember = smember->next;
+
+ while (size < 0
+ && smember
+ && smember->member->offset < offset - size + adjust)
+ {
+ /* The offset result may smaller than zero, so we set its value as the
+ ifcall. */
+ smember->member->offset = offset;
+ smember = smember->next;
+ }
+ while (smember)
+ {
+ smember->member->offset += size;
+ smember = smember->next;
+ }
+}
+
+/* Adjust relocation and symbol. */
+
+static void
+nds32_elf_ifc_enlarge (bfd *abfd, asection *sec, bfd_vma off, int size)
+{
+ unsigned int sec_shndx; /* The section the be relaxed. */
+ Elf_Internal_Shdr *symtab_hdr; /* Symbol table header of this bfd. */
+ Elf_Internal_Sym *isym; /* Symbol table of this bfd. */
+ Elf_Internal_Sym *isymend; /* Symbol entry iterator. */
+ Elf_Internal_Rela *internal_relocs;
+ Elf_Internal_Rela *irel;
+ Elf_Internal_Rela *irelend;
+ unsigned int symcount;
+ struct elf_link_hash_entry **sym_hashes;
+ struct elf_link_hash_entry **end_hashes;
+ asection *sect;
+ bfd_byte *contents;
+
+ sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
+ symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
+ isym = (Elf_Internal_Sym *) symtab_hdr->contents;
+ if (isym == NULL)
+ {
+ isym = bfd_elf_get_elf_syms (abfd, symtab_hdr,
+ symtab_hdr->sh_info, 0, NULL, NULL, NULL);
+ symtab_hdr->contents = (bfd_byte *) isym;
+ }
+
+ if (isym == NULL || symtab_hdr->sh_info == 0)
+ return;
+
+ for (sect = abfd->sections; sect != NULL; sect = sect->next)
+ {
+ /* Adjust all the relocs. */
+
+ if ((sect->flags & SEC_RELOC) == 0)
+ continue;
+
+ /* Relocations MUST be kept in memory, because relaxation adjust them. */
+ internal_relocs = _bfd_elf_link_read_relocs (abfd, sect, NULL, NULL,
+ TRUE /* keep_memory */);
+ irelend = internal_relocs + sect->reloc_count;
+
+ if (!nds32_get_section_contents (abfd, sect, &contents, TRUE))
+ continue;
+
+ for (irel = internal_relocs; irel < irelend; irel++)
+ {
+ if (ELF32_R_TYPE (irel->r_info) >= R_NDS32_DIFF8
+ && ELF32_R_TYPE (irel->r_info) <= R_NDS32_DIFF32
+ && isym[ELF32_R_SYM (irel->r_info)].st_shndx == sec_shndx)
+ {
+ unsigned long val, mask;
+
+ switch (ELF32_R_TYPE (irel->r_info))
+ {
+ case R_NDS32_DIFF8:
+ val = bfd_get_8 (abfd, contents + irel->r_offset);
+ break;
+ case R_NDS32_DIFF16:
+ val = bfd_get_16 (abfd, contents + irel->r_offset);
+ break;
+ case R_NDS32_DIFF32:
+ val = bfd_get_32 (abfd, contents + irel->r_offset);
+ mask = 0 - (val >> 31);
+ if (mask)
+ val = (val | (mask - 0xffffffff));
+ break;
+ default:
+ BFD_ASSERT (0);
+ }
+
+ if ((off > irel->r_addend && off <= irel->r_addend + val)
+ || (off <= irel->r_addend && off > irel->r_addend + val))
+ {
+ /* The offset is incresed. */
+ switch (ELF32_R_TYPE (irel->r_info))
+ {
+ /* It may overflow. */
+ case R_NDS32_DIFF8:
+ bfd_put_8 (abfd, val + size, contents + irel->r_offset);
+ break;
+ case R_NDS32_DIFF16:
+ bfd_put_16 (abfd, val + size, contents + irel->r_offset);
+ break;
+ case R_NDS32_DIFF32:
+ bfd_put_32 (abfd, val + size, contents + irel->r_offset);
+ break;
+ }
+ }
+ }
+ else if (ELF32_R_TYPE (irel->r_info) == R_NDS32_DIFF_ULEB128
+ && isym[ELF32_R_SYM (irel->r_info)].st_shndx == sec_shndx)
+ {
+ bfd_vma val = 0;
+ unsigned int len = 0;
+ bfd_byte *endp, *p;
+
+ val = read_unsigned_leb128 (abfd, contents + irel->r_offset, &len);
+
+ if (off >= irel->r_addend
+ && off < irel->r_addend + val)
+ {
+ /* The offset is incresed. */
+ p = contents + irel->r_offset;
+ endp = p + len -1;
+ memset (p, 0x80, len);
+ *(endp) = 0;
+ /* It may overflow. */
+ p = write_uleb128 (p, val + size) - 1;
+ if (p < endp)
+ *p |= 0x80;
+ }
+ }
+
+ if (sec == sect)
+ {
+ if (irel->r_offset >= off)
+ irel->r_offset += size;
+ }
+
+ if (ELF32_R_TYPE (irel->r_info) == R_NDS32_NONE
+ || ELF32_R_TYPE (irel->r_info) == R_NDS32_LABEL
+ || ELF32_R_TYPE (irel->r_info) == R_NDS32_RELAX_ENTRY)
+ continue;
+
+ if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info
+ && isym[ELF32_R_SYM (irel->r_info)].st_shndx == sec_shndx
+ && ELF_ST_TYPE (isym[ELF32_R_SYM (irel->r_info)].st_info) == STT_SECTION)
+ {
+ if (irel->r_addend <= sec->size
+ && irel->r_addend >= off)
+ irel->r_addend += size;
+ }
+ }
+ }
+
+ /* Adjust the local symbols defined in this section. */
+ for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
+ {
+ if (isym->st_shndx == sec_shndx)
+ {
+ if (isym->st_value <= sec->size)
+ {
+ if (isym->st_value >= off)
+ isym->st_value += size;
+ /* Adjust function size. */
+ else if (ELF32_ST_TYPE (isym->st_info) == STT_FUNC && isym->st_size > 0
+ && (isym->st_value + isym->st_size) >= off)
+ isym->st_size += size;
+ }
+ }
+ }
+ /* Now adjust the global symbols defined in this section. */
+ symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
+ - symtab_hdr->sh_info);
+ sym_hashes = elf_sym_hashes (abfd);
+ end_hashes = sym_hashes + symcount;
+ for (; sym_hashes < end_hashes; sym_hashes++)
+ {
+ struct elf_link_hash_entry *sym_hash = *sym_hashes;
+
+ if ((sym_hash->root.type == bfd_link_hash_defined
+ || sym_hash->root.type == bfd_link_hash_defweak)
+ && sym_hash->root.u.def.section == sec)
+ {
+ if (sym_hash->root.u.def.value <= sec->size)
+ {
+ if (sym_hash->root.u.def.value >= off)
+ sym_hash->root.u.def.value += size;
+
+ /* Adjust function size. */
+ else if (sym_hash->type == STT_FUNC
+ && (sym_hash->root.u.def.value + sym_hash->size) >= off)
+ sym_hash->size += size;
+
+ }
+ }
+ }
+ nds32_elf_ifc_adjust_block (sec, off, size, 0);
+}
+
+/* Check distance between branch become farer if it
+ cause relocation overfolw. */
+
+static bfd_boolean
+nds32_elf_ifc_check_overflow (struct elf_nds32_ifc_insn_stack *ptr)
+{
+ struct elf_nds32_ifc_insn_member *imember;
+ struct elf_nds32_ifc_member *member;
+ asection *sec;
+ bfd_vma offset;
+ Elf_Internal_Rela *irel, *internal_relocs, *irelend;
+ unsigned int sec_shndx;
+ bfd *abfd;
+ Elf_Internal_Sym *isym = NULL; /* Symbol table of this bfd. */
+ Elf_Internal_Shdr *symtab_hdr;
+
+ /* Get the common block final instruction address. */
+ imember = ptr->imember;
+ while (imember->next)
+ imember = imember->next;
+ member = imember->member;
+ /* Add the final instruction and its instruction size to get
+ the address inserted the ifret16. */
+ offset = member->offset + member->unit_p->hash->size;
+
+ sec = member->sec;
+ abfd = sec->owner;
+ sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
+
+ symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
+
+ if (!nds32_get_local_syms (abfd, sec, &isym))
+ return FALSE;
+ internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
+ TRUE /* keep_memory */);
+ irelend = internal_relocs + sec->reloc_count;
+
+ for (irel = internal_relocs; irel < irelend; irel++)
+ {
+ if (ELF32_R_TYPE (irel->r_info) != R_NDS32_RELAX_ENTRY
+ && ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info
+ && isym[ELF32_R_SYM (irel->r_info)].st_shndx == sec_shndx)
+ {
+ /* Get the distance between caller and callee. */
+ unsigned int distance;
+ if (irel->r_offset < offset && irel->r_addend > offset)
+ distance = irel->r_addend - irel->r_offset;
+ else if (irel->r_offset > offset && irel->r_addend < offset)
+ distance = irel->r_offset - irel->r_addend;
+ else
+ continue;
+
+ /* In current, just check pc relative jump here. It may has to
+ check more relocation in the feature. */
+ switch (ELF32_R_TYPE (irel->r_info))
+ {
+ /* It has to subtruct 5 since it has to
+ consider the 4 bytes for ifret. */
+ case R_NDS32_9_PCREL_RELA:
+ if (distance > ((1 << 8) - 5))
+ return FALSE;
+ break;
+ case R_NDS32_15_PCREL_RELA:
+ if (distance > ((1 << 14) - 5))
+ return FALSE;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ return TRUE;
+}
+
+
+/* Insert a INSN16 relocation for relaxing ifret. */
+
+static void
+nds32_elf_ifc_insert_insn16_reloc (struct bfd_link_info *info,
+ bfd *abfd, asection *sec,
+ unsigned long int offset)
+{
+ /* Insert a new relocation into section rela, and this is very force
+ implementation. It may cause unknown problem. */
+
+ Elf_Internal_Rela *relocs, *internal_relocs, *irelend;
+ long unsigned int size;
+ const struct elf_backend_data *bed = get_elf_backend_data (abfd);
+ unsigned int count = 0;
+
+ internal_relocs = _bfd_elf_link_read_relocs (abfd, sec,
+ NULL, NULL, FALSE);
+ irelend = internal_relocs + sec->reloc_count;
+
+ /* We have to insert two relocations; one for ifc and
+ another is for alignment.*/
+ sec->reloc_count += 1;
+ size = sec->reloc_count;
+ size *= bed->s->int_rels_per_ext_rel * sizeof (Elf_Internal_Rela);
+ relocs = (Elf_Internal_Rela *) bfd_malloc (size);
+ memset (relocs, 0, size);
+ elf_section_data (sec)->relocs = relocs;
+ while ((internal_relocs + count) < irelend
+ && (internal_relocs + count)->r_offset <= offset)
+ count++;
+
+ /* Copy the front part where the offset is smaller. */
+ memcpy (relocs, internal_relocs,
+ (bed->s->int_rels_per_ext_rel * sizeof (Elf_Internal_Rela) * count));
+
+ /* Insert new relocations. */
+ irelend = relocs + count;
+
+ /* Set relocation. */
+ irelend->r_offset = offset;
+ irelend->r_info = ELF32_R_INFO (0, R_NDS32_INSN16);
+ irelend->r_addend = 0;
+
+ irelend++;
+ /* Copy the rest part. */
+ memcpy (irelend, internal_relocs + count,
+ size - (bed->s->int_rels_per_ext_rel *
+ sizeof (Elf_Internal_Rela) * (count + 1)));
+ if (!info->keep_memory)
+ free (internal_relocs);
+}
+
+/* Push new element into the head of stack. */
+
+static void
+nds32_elf_ifc_extend_stack (struct elf_nds32_ifc_insn_stack *stack,
+ struct elf_nds32_ifc_unit *unit)
+{
+ struct elf_nds32_ifc_insn_stack *stackP = stack;
+ struct elf_nds32_ifc_member *pre_member;
+ struct elf_nds32_ifc_insn_member *imember;
+ struct elf_nds32_ifc_code_hash_entry *hash;
+
+ while (stackP)
+ {
+ stackP->choose = stackP->extend;
+ stackP->extend = 0;
+ stackP= stackP->next;
+ }
+
+ hash = unit->entry_p;
+ stackP = stack;
+ while (stackP)
+ {
+ if (stackP->choose && stackP->extend == 0)
+ {
+ pre_member = stackP->imember->member->pre_member;
+ if (pre_member && !pre_member->dead
+ && pre_member->unit_p->entry_p == hash)
+ {
+ stackP->extend = 1;
+ imember = malloc (sizeof (struct elf_nds32_ifc_insn_member));
+ imember->member = pre_member;
+ imember->next = stackP->imember;
+ stackP->imember = imember;
+ }
+ }
+ stackP = stackP->next;
+ }
+}
+
+/* Search stack extend up. */
+
+static bfd_boolean
+nds32_elf_ifc_extend_up (struct elf_nds32_ifc_insn_stack *stack)
+{
+ struct elf_nds32_ifc_insn_stack *stackP = stack;
+ struct elf_nds32_ifc_member *memberP;
+ struct elf_nds32_ifc_insn_member *imember;
+ struct elf_nds32_ifc_unit *unitP, *unit_head = NULL, *unit_tail = NULL;
+
+ while (stackP)
+ {
+ if (stackP->extend
+ && nds32_elf_ifc_check_overflow (stackP))
+ {
+ /* Get previos member. */
+ unitP = unit_head;
+ memberP = stackP->imember->member->pre_member;
+ if (memberP && !memberP->dead)
+ {
+ while (unitP)
+ {
+ unit_tail = unitP;
+ if (memberP && memberP->unit_p->entry_p == unitP->entry_p
+ && (!unitP->entry_p->h
+ || unitP->entry_p->h == memberP->unit_p->entry_p->h))
+ {
+ unitP->times++;
+ break;
+ }
+ unitP = unitP->next;
+ }
+
+ /* Can't find matched unit so new one. */
+ if (!unitP)
+ {
+ /* Check this instruction is not in stack. I can't find a
+ better way currently. */
+ imember = stackP->imember;
+ while (imember)
+ {
+ if (imember->member->unit_p->hash
+ == memberP->unit_p->entry_p)
+ break;
+ imember = imember->next;
+ }
+ if (!imember)
+ {
+ unitP = malloc (sizeof (struct elf_nds32_ifc_unit));
+ unitP->times = 1;
+ unitP->member = memberP;
+ unitP->entry_p = memberP->unit_p->entry_p;
+ unitP->hash = memberP->unit_p->hash;
+ unitP->next = NULL;
+ if (!unit_head)
+ unit_head = unitP;
+ else
+ unit_tail->next = unitP;
+ }
+ }
+ }
+ }
+ stackP = stackP->next;
+ }
+
+ /* Find a max one unit. */
+ unitP = unit_head;
+ unit_tail = unit_head;
+ while (unitP)
+ {
+ if (unitP->times > unit_tail->times)
+ unit_tail = unitP;
+ unitP = unitP->next;
+ }
+ if (!unit_tail || unit_tail->times < 2)
+ return FALSE;
+ else
+ {
+ nds32_elf_ifc_extend_stack (stack, unit_tail);
+ unit_tail->hash->round = 1;
+ nds32_elf_ifc_extend_up (stack);
+ unit_tail->hash->round = 0;
+ return TRUE;
+ }
+}
+
+/* Check this stack is worth to be used. */
+
+static bfd_boolean
+nds32_elf_ifc_check (struct elf_nds32_ifc_insn_stack *stack,
+ struct elf_nds32_ifc_insn_stack **base,
+ bfd_boolean extend)
+{
+ struct elf_nds32_ifc_insn_stack *ptr;
+ struct elf_nds32_ifc_insn_member *imember;
+ bfd_vma insn_sz;
+
+ ptr = stack;
+ while (ptr)
+ {
+ if ((extend && ptr->extend)
+ || (!extend && ptr->live
+ && nds32_elf_ifc_check_overflow (ptr)))
+ break;
+ ptr = ptr->next;
+ }
+ *base = ptr;
+
+ if (!*base)
+ return FALSE;
+
+ /* Conform the code size can be reduced. */
+ ptr = stack;
+ while (ptr)
+ {
+ if (ptr->live && ptr != *base)
+ break;
+ ptr = ptr->next;
+ }
+ if (!ptr)
+ return FALSE;
+
+ /* Get the end offset of common. */
+ imember = (*base)->imember;
+ insn_sz = imember->member->unit_p->entry_p->size;
+ insn_sz += imember->member->unit_p->hash->size;
+ while (imember->next)
+ {
+ imember = imember->next;
+ insn_sz += imember->member->unit_p->hash->size;
+ }
+ /* The ifc does not trigger, clear all stack. */
+ if (insn_sz < 8)
+ return FALSE;
+
+ return TRUE;
+}
+
+/* Insert a new ifc target symbol. */
+
+#define IFC_TARGET_NAME 10
+static void
+nds32_elf_ifc_insert_target (struct elf_nds32_ifc_insn_stack *base,
+ bfd_vma off,
+ struct bfd_link_info *info,
+ struct bfd_link_hash_entry **bh)
+{
+ static char name[45] = "$nds32ifc_a"; /* Is this enough? */
+ int temp_num;
+ static int hash_num = IFC_TARGET_NAME;
+ asection *sec = base->imember->member->sec;
+ bfd *abfd = sec->owner;
+
+ *bh = bfd_link_hash_lookup (info->hash, name,
+ FALSE, FALSE, TRUE);
+ /* Insert a global symbol for ifc target. */
+ _bfd_generic_link_add_one_symbol
+ (info, info->output_bfd, name, BSF_GLOBAL,
+ sec, off, (const char *) NULL, TRUE, /* copy */
+ get_elf_backend_data (info->output_bfd)->collect,
+ bh);
+
+
+ /* Adjust ifc target name for next time. */
+ temp_num = hash_num;
+ while (name[temp_num] >= 'z' && temp_num >= IFC_TARGET_NAME)
+ {
+ temp_num--;
+ }
+
+ if (temp_num < IFC_TARGET_NAME)
+ {
+ /* Add one more bit and reset all bits. */
+ hash_num++;
+ temp_num = hash_num;
+ while (temp_num >= IFC_TARGET_NAME)
+ {
+ name[temp_num] = 'a';
+ temp_num--;
+ }
+ name[hash_num + 1] = '\0';
+ }
+ else if (temp_num == hash_num)
+ {
+ /* Add latest one bit. */
+ name[temp_num]++;
+ }
+ else
+ {
+ /* Add carry bit and reset low significant bits. */
+ name[temp_num]++;
+ while (temp_num < hash_num)
+ {
+ temp_num++;
+ name[temp_num] = 'a';
+ }
+ }
+ /* Insert the global symbol into branch target bfd to adjust
+ when relaxing. */
+ if (nds32_elf_ifc_insert_sym_hash (abfd, *bh) < 0)
+ return;
+}
+
+/* Replace common code with ifc. In this functionm, it has to check
+ whether relocation is overflow after insert ifret16. If it is fine,
+ insert ifret16 into one common block, and replace other common with
+ ifcall and insert relocation for it. */
+
+static void
+nds32_elf_ifc_replace_common (struct elf_nds32_ifc_insn_stack *stack,
+ struct bfd_link_info *info)
+{
+ struct elf_nds32_ifc_insn_stack *ptr, *base;
+ struct elf_nds32_ifc_insn_member *imember, *base_imember;
+ struct elf_nds32_ifc_member *member;
+ bfd_byte *contents = NULL;
+ bfd_vma off, insn_sz, relocation, clean_off, base_off;
+ nds32_elf_blank_t *relax_blank_list = NULL;
+ struct bfd_link_hash_entry *bh;
+ asection *sec;
+ bfd *abfd;
+ bfd_boolean align_mask, extend;
+
+ if (!stack)
+ return;
+
+ /* Set extend for all live stack. */
+ ptr = stack;
+ while (ptr)
+ {
+ ptr->extend = ptr->live;
+ ptr = ptr->next;
+ }
+ extend = nds32_elf_ifc_extend_up (stack);
+
+ if (!nds32_elf_ifc_check (stack, &base, extend))
+ {
+ ptr = stack;
+ while (ptr)
+ {
+ ptr->live = 0;
+ ptr = ptr->next;
+ }
+ return;
+ }
+
+ /* Get the total block size. */
+ imember = base->imember;
+ while (imember->next)
+ {
+ imember = imember->next;
+ insn_sz += imember->member->unit_p->hash->size;
+ }
+ /* Find the base block. */
+ member = imember->member;
+ /* Final instruction offset. */
+ off = member->offset;
+ /* Final instruction size. */
+ insn_sz = member->unit_p->hash->size;
+ sec = member->sec;
+ abfd = member->sec->owner;
+
+ if (!member->unit_p->hash->end)
+ {
+ /* Stack is the ifc base. Insert ifret16 into the block. */
+ if (!nds32_get_section_contents (abfd, sec, &contents, TRUE))
+ return;
+
+ /* Adjust contents. */
+ nds32_elf_ifc_reallocate_contents (sec, 4, &contents);
+ memmove (contents + off + 4 + insn_sz,
+ contents + off + insn_sz,
+ sec->size - off - insn_sz - 4);
+
+ /* Adjust relocation and symbols. */
+ nds32_elf_ifc_enlarge (abfd, sec, off + insn_sz, 4);
+
+ /* Put ifret. It insert 32-bits ret since it has to consider alignment
+ in the future. */
+ bfd_putb32 (INSN_IFRET, contents + off + insn_sz);
+
+ /* Insert relocation for convert to 16-bits if possible. */
+ nds32_elf_ifc_insert_insn16_reloc (info, abfd, sec, off + insn_sz);
+ }
+
+
+ off = base->imember->member->offset
+ - base->imember->member->unit_p->entry_p->size;
+
+ /* The common block address. */
+ relocation = off + sec->output_offset + sec->output_section->vma;
+
+ /* Others has to exchange to ifcall, and insert relocation. */
+ ptr = stack;
+ while (ptr)
+ {
+ if (ptr->live && ptr != base)
+ {
+ insn_sz = 0;
+ imember = ptr->imember;
+ member = imember->member;
+ sec = member->sec;
+ abfd = member->sec->owner;
+
+ /* Check the range enough for ifcall. */
+ off = member->offset - member->unit_p->entry_p->size
+ + sec->output_offset + sec->output_section->vma;
+ /* The larget range 16s and right shift one bit. Do it conservatively,
+ so pick range 0xf000. */
+ if ((off > relocation && (off - relocation) > 0xf000)
+ || (off < relocation && (relocation - off) > 0xf000))
+ {
+ ptr = ptr->next;
+ continue;
+ }
+
+ /* The first insntruction offset. */
+ off = member->offset - member->unit_p->entry_p->size;
+
+ /* Get the total insntruntion size of the common subexpression. */
+ insn_sz += member->unit_p->entry_p->size;
+ while (imember && member->unit_p)
+ {
+ member = imember->member;
+ insn_sz += member->unit_p->hash->size;
+ imember = imember->next;
+ }
+
+ if (!nds32_get_section_contents (abfd, sec, &contents, TRUE))
+ {
+ (*_bfd_error_handler)
+ (_("Linker: relax for ifc get section contents error.\n"));
+ return;
+ }
+
+ /* Check the total size of common if 4 bytes multiple or not. */
+ align_mask = ((insn_sz % 4) == 0) ? TRUE : FALSE;
+ clean_off = off + insn_sz - 2;
+
+ /* Find the member match to base block. */
+ base_imember = base->imember;
+ imember = ptr->imember;
+ while (imember->member->unit_p != base_imember->member->unit_p)
+ base_imember = base_imember->next;
+ if (!imember)
+ {
+ (*_bfd_error_handler)
+ (_("Linker: relax for ifc error.\n"));
+ return;
+ }
+ bh = base_imember->member->bh;
+ if (!bh)
+ {
+ base_off = base_imember->member->offset
+ - base_imember->member->unit_p->entry_p->size;
+ /* Insert a global symbol for ifc target. */
+ nds32_elf_ifc_insert_target (base, base_off, info, &bh);
+ base_imember->member->bh = bh;
+ }
+
+ /* Insert two relocations IFCALL and INSN16. */
+ nds32_elf_ifc_insert_relocation (info, abfd, sec, bh, off,
+ align_mask, clean_off);
+
+ bfd_putb32 (INSN_IFCALL, contents + off);
+
+ if (!align_mask)
+ bfd_putb16 (INSN_NOP16, contents + off + 4);
+
+ if (align_mask && !insert_nds32_elf_blank_recalc_total
+ (&relax_blank_list, off + 4, insn_sz - 4))
+ return;
+ else if (!align_mask && !insert_nds32_elf_blank_recalc_total
+ (&relax_blank_list, off + 6, insn_sz - 6))
+ return;
+ if (relax_blank_list)
+ {
+ nds32_elf_relax_delete_blanks (abfd, sec, relax_blank_list);
+ relax_blank_list = NULL;
+ }
+ nds32_elf_ifc_adjust_block (sec, off, ((align_mask) ? 4 : 6) - insn_sz,
+ (align_mask) ? 4 : 6);
+ }
+ ptr = ptr->next;
+ }
+}
+
+/* Free heap and set dead member. */
+
+static void
+nds32_elf_ifc_release_member (struct elf_nds32_ifc_insn_stack *stack)
+{
+ struct elf_nds32_ifc_insn_stack *ptr, *temp_ptr;
+ struct elf_nds32_ifc_insn_member *imember, *temp;
+
+ ptr = stack;
+ while (ptr)
+ {
+ if (ptr->live)
+ {
+ imember = ptr->imember;
+ while (imember)
+ {
+ /* Set edge dead. */
+ imember->member->dead = TRUE;
+ imember->member->unit_p->times--;
+ /* Since the previous insntruction is used,
+ set the edge dead, too. */
+ imember->member->next_member->dead = TRUE;
+ if (imember->member->pre_member)
+ imember->member->pre_member->dead = TRUE;
+ temp = imember;
+ imember = imember->next;
+ free (temp);
+ }
+ }
+ temp_ptr = ptr;
+ ptr = ptr->next;
+ free (temp_ptr);
+ }
+}
+
+/* Get the new max_unit for entry. */
+
+static bfd_boolean
+nds32_elf_ifc_next_max (struct elf_nds32_ifc_code_hash_entry *entry)
+{
+ struct elf_nds32_ifc_unit *unitP, *max_unit;
+
+ unitP = entry->unit;
+ max_unit = entry->unit;
+ while (unitP)
+ {
+ if (unitP->times > max_unit->times
+ && !unitP->done)
+ max_unit = unitP;
+ unitP = unitP->next;
+ }
+ if (!max_unit->done && max_unit->times >= 2)
+ {
+ entry->max_unit = max_unit;
+ entry->max_times = max_unit->times;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/* Find cse block here. */
+
+static void
+nds32_elf_ifc_find_cse (struct bfd_link_info *info)
+{
+ /* Example: insntruction ABCABCB. In the first round we will choose B,
+ and find its next possible insntruction. In the end of this round,
+ we will know the max appearance times is 2, and the insntruction is C. */
+ struct elf_nds32_ifc_code_hash_entry *ptr = ifc_insn_head;
+ struct elf_nds32_ifc_insn_stack *stack;
+
+ while (ptr)
+ {
+ stack = NULL;
+ if (ptr->max_unit && ptr->max_times >= 2)
+ {
+ /* We save some infomation for ifc search back, but not
+ implement yet. It may can be done hear. */
+ ptr->max_unit->done = 1;
+ ptr->round = 1;
+ nds32_elf_ifc_find_cse_recur (ptr->max_unit, &stack, ptr->size);
+ nds32_elf_ifc_replace_common (stack, info);
+ ptr->round = 0;
+ nds32_elf_ifc_release_member (stack);
+ if (nds32_elf_ifc_next_max (ptr))
+ continue;
+ }
+ ptr = ptr->next;
+ }
+}
+
+/* To find the cse and relax it. */
+
+static void
+nds32_elf_ifc_cse_algo (struct bfd_link_info *info)
+{
+ /* Order the insntruction by max_unit times. */
+ nds32_elf_ifc_code_hash_traverse (nds32_elf_ifc_order_insn_times);
+
+ /* Find common subexpression. */
+ nds32_elf_ifc_find_cse (info);
+}
+/* End IFC. */
+
+
+/* Rom-patch table hash function. */
+
+static struct bfd_hash_entry *
+nds32_elf_ict_hash_newfunc (struct bfd_hash_entry *entry,
+ struct bfd_hash_table *table,
+ const char *string)
+{
+ struct elf_nds32_ict_hash_entry *ret;
+
+ /* Allocate the structure if it has not already been allocated by a
+ subclass. */
+ if (entry == NULL)
+ {
+ entry = (struct bfd_hash_entry *)
+ bfd_hash_allocate (table, sizeof (*ret));
+ if (entry == NULL)
+ return entry;
+ }
+
+ /* Call the allocation method of the superclass. */
+ entry = bfd_hash_newfunc (entry, table, string);
+ if (entry == NULL)
+ return entry;
+
+ ret = (struct elf_nds32_ict_hash_entry*) entry;
+ ret->order = 0;
+ return &ret->root;
+}
+
+static void
+nds32_elf_ict_hash_init (void)
+{
+ if (!bfd_hash_table_init_n (&indirect_call_table, nds32_elf_ict_hash_newfunc,
+ sizeof (struct elf_nds32_ict_hash_entry),
+ 1023))
+ (*_bfd_error_handler) (_("ld error: cannot init rom patch hash table\n"));
+ return;
+}
+
+/* Relocate for NDS32_ICT_SECTION. */
+static void
+nds32_elf_ict_relocate (struct bfd_link_info *info)
+{
+ static bfd_boolean done = FALSE;
+ asection *sec;
+ bfd_byte *contents = NULL;
+ uint32_t insn;
+ unsigned int i;
+ struct elf_link_hash_entry *h;
+ struct bfd_link_hash_entry *h2;
+ bfd_vma relocation, base;
+
+ if (done)
+ return;
+
+ done = TRUE;
+
+ sec = nds32_elf_get_target_section (info, NDS32_ICT_SECTION);
+ h2 = bfd_link_hash_lookup (info->hash, "_INDIRECT_CALL_TABLE_BASE_",
+ FALSE, FALSE, FALSE);
+ base = ((h2->u.def.value
+ + h2->u.def.section->output_section->vma
+ + h2->u.def.section->output_offset));
+
+ if (!nds32_get_section_contents (sec->owner, sec, &contents, TRUE))
+ return;
+
+ indirect_call_table.frozen = 1;
+ for (i = 0; i < indirect_call_table.size; i++)
+ {
+ struct bfd_hash_entry *p;
+ struct elf_nds32_ict_hash_entry *entry;
+
+ for (p = indirect_call_table.table[i]; p != NULL; p = p->next)
+ {
+ entry = (struct elf_nds32_ict_hash_entry *) p;
+ insn = INSN_J;
+ h = entry->h;
+ if ((h->root.type == bfd_link_hash_defined
+ || h->root.type == bfd_link_hash_defweak)
+ && h->root.u.def.section != NULL
+ && h->root.u.def.section->output_section != NULL)
+ {
+
+ relocation = h->root.u.def.value +
+ h->root.u.def.section->output_section->vma +
+ h->root.u.def.section->output_offset;
+ insn |= ((relocation - base - entry->order * 4) >> 1) & 0xffffff;
+ }
+ else
+ relocation = 0;
+
+ bfd_putb32 (insn, contents + (entry->order) * 4);
+ }
+ }
+ indirect_call_table.frozen = 0;
+}
+
+static asection*
+nds32_elf_get_target_section (struct bfd_link_info *info, char *name)
+{
+ asection *sec = NULL;
+ bfd *abfd;
+
+ for (abfd = info->input_bfds; abfd != NULL; abfd = abfd->link_next)
+ {
+ sec = bfd_get_section_by_name (abfd, name);
+ if (sec != NULL)
+ break;
+ }
+
+ return sec;
+}
+
+
+#define ELF_ARCH bfd_arch_nds32
+#define ELF_MACHINE_CODE EM_NDS32
+#define ELF_MAXPAGESIZE 0x1000
+#define ELF_TARGET_ID NDS32_ELF_DATA
+
+#define TARGET_BIG_SYM bfd_elf32_nds32be_vec
+#define TARGET_BIG_NAME "elf32-nds32be"
+#define TARGET_LITTLE_SYM bfd_elf32_nds32le_vec
+#define TARGET_LITTLE_NAME "elf32-nds32le"
+
+#define elf_info_to_howto nds32_info_to_howto
+#define elf_info_to_howto_rel nds32_info_to_howto_rel
+
+#define bfd_elf32_bfd_link_hash_table_create nds32_elf_link_hash_table_create
+#define bfd_elf32_bfd_merge_private_bfd_data nds32_elf_merge_private_bfd_data
+#define bfd_elf32_bfd_print_private_bfd_data nds32_elf_print_private_bfd_data
+#define bfd_elf32_bfd_relax_section nds32_elf_relax_section
+#define bfd_elf32_bfd_set_private_flags nds32_elf_set_private_flags
+
+#define bfd_elf32_mkobject nds32_elf_mkobject
+#define elf_backend_action_discarded nds32_elf_action_discarded
+#define elf_backend_add_symbol_hook nds32_elf_add_symbol_hook
+#define elf_backend_check_relocs nds32_elf_check_relocs
+#define elf_backend_adjust_dynamic_symbol nds32_elf_adjust_dynamic_symbol
+#define elf_backend_create_dynamic_sections nds32_elf_create_dynamic_sections
+#define elf_backend_finish_dynamic_sections nds32_elf_finish_dynamic_sections
+#define elf_backend_finish_dynamic_symbol nds32_elf_finish_dynamic_symbol
+#define elf_backend_size_dynamic_sections nds32_elf_size_dynamic_sections
+#define elf_backend_relocate_section nds32_elf_relocate_section
+#define elf_backend_gc_mark_hook nds32_elf_gc_mark_hook
+#define elf_backend_gc_sweep_hook nds32_elf_gc_sweep_hook
+#define elf_backend_grok_prstatus nds32_elf_grok_prstatus
+#define elf_backend_grok_psinfo nds32_elf_grok_psinfo
+#define elf_backend_reloc_type_class nds32_elf_reloc_type_class
+#define elf_backend_copy_indirect_symbol nds32_elf_copy_indirect_symbol
+#define elf_backend_link_output_symbol_hook nds32_elf_output_symbol_hook
+#define elf_backend_output_arch_syms nds32_elf_output_arch_syms
+#define elf_backend_object_p nds32_elf_object_p
+#define elf_backend_final_write_processing nds32_elf_final_write_processing
+#define elf_backend_special_sections nds32_elf_special_sections
+#define bfd_elf32_bfd_get_relocated_section_contents \
+ nds32_elf_get_relocated_section_contents
+#define bfd_elf32_bfd_is_target_special_symbol nds32_elf_is_target_special_symbol
+#define elf_backend_maybe_function_sym nds32_elf_maybe_function_sym
+
+#define elf_backend_can_gc_sections 1
+#define elf_backend_can_refcount 1
+#define elf_backend_want_got_plt 1
+#define elf_backend_plt_readonly 1
+#define elf_backend_want_plt_sym 0
+#define elf_backend_got_header_size 12
+#define elf_backend_may_use_rel_p 1
+#define elf_backend_default_use_rela_p 1
+#define elf_backend_may_use_rela_p 1
+
+#include "elf32-target.h"
+
+#undef ELF_MAXPAGESIZE
+#define ELF_MAXPAGESIZE 0x2000
+
+#undef TARGET_BIG_SYM
+#define TARGET_BIG_SYM bfd_elf32_nds32belin_vec
+#undef TARGET_BIG_NAME
+#define TARGET_BIG_NAME "elf32-nds32be-linux"
+#undef TARGET_LITTLE_SYM
+#define TARGET_LITTLE_SYM bfd_elf32_nds32lelin_vec
+#undef TARGET_LITTLE_NAME
+#define TARGET_LITTLE_NAME "elf32-nds32le-linux"
+#undef elf32_bed
+#define elf32_bed elf32_nds32_lin_bed
+
+#include "elf32-target.h"
diff -Nur binutils-2.24.orig/bfd/elf32-nds32.h binutils-2.24/bfd/elf32-nds32.h
--- binutils-2.24.orig/bfd/elf32-nds32.h 1970-01-01 01:00:00.000000000 +0100
+++ binutils-2.24/bfd/elf32-nds32.h 2024-05-17 16:15:38.979344751 +0200
@@ -0,0 +1,215 @@
+/* NDS32-specific support for 32-bit ELF.
+ Copyright (C) 2012-2013 Free Software Foundation, Inc.
+ Contributed by Andes Technology Corporation.
+
+ This file is part of BFD, the Binary File Descriptor library.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+ 02110-1301, USA.*/
+
+#ifndef ELF32_NDS32_H
+#define ELF32_NDS32_H
+
+/*
+ * Relocation flags encoded in r_addend.
+ */
+
+/* Relocation flags for R_NDS32_ERLAX_ENTRY. */
+
+/* Set if relax on this section is done or disabled. */
+#define R_NDS32_RELAX_ENTRY_DISABLE_RELAX_FLAG (1 << 31)
+/* Optimize for performance. */
+#define R_NDS32_RELAX_ENTRY_OPTIMIZE_FLAG (1 << 30)
+/* Optimize for size. Branch destination 4-byte adjustment
+ may be disabled. */
+#define R_NDS32_RELAX_ENTRY_OPTIMIZE_FOR_SPACE_FLAG (1 << 29)
+/* To distinguish the assembly code generated by compiler
+ or written manually. */
+#define R_NDS32_RELAX_ENTRY_VERBATIM_FLAG (1 << 28)
+/* EX9 and link-time IFC must be explicitly enabled, so we
+ won't mess up handcraft assembly code. */
+/* Enable EX9 optimization for this section. */
+#define R_NDS32_RELAX_ENTRY_EX9_FLAG (1 << 2)
+/* Enable IFC optimization for this section. */
+#define R_NDS32_RELAX_ENTRY_IFC_FLAG (1 << 3)
+
+
+/* Relocation flags for R_NDS32_INSN16. */
+
+/* Tag the nop16 can be removed. */
+#define R_NDS32_INSN16_CONVERT_FLAG (1 << 0)
+/* Convert a gp-relative access (e.g., lwi.gp)
+ to fp-as-gp access (lwi37.fp).
+ This value is used by linker internally only.
+ It's fine to change the vlaue. */
+#define R_NDS32_INSN16_FP7U2_FLAG (1 << 1)
+
+/* Relocation flags for R_NDS32_RELAX_REGION_OMIT_FP_START/END. */
+
+/* OMIT_FP_FLAG marks the region for applying fp-as-gp
+ optimization. */
+#define R_NDS32_RELAX_REGION_OMIT_FP_FLAG (1 << 0)
+/* NOT_OMIT_FP_FLAG is set if this region is not worth
+ for fp-as-gp. */
+#define R_NDS32_RELAX_REGION_NOT_OMIT_FP_FLAG (1 << 1)
+/* Suppress EX9 optimization in the region. */
+#define R_NDS32_RELAX_REGION_NO_EX9_FLAG (1 << 2)
+/* A Innermost loop region. Some optimizations is suppressed
+ in this region due to performance drop. */
+#define R_NDS32_RELAX_REGION_INNERMOST_LOOP_FLAG (1 << 4)
+/* Suppress IFC optimization in the region. */
+#define R_NDS32_RELAX_REGION_NO_IFC_FLAG (1 << 5)
+
+/* Tag range for LOADSTORE relocation. */
+enum
+{
+ NDS32_LOADSTORE_NONE = 0x0,
+ NDS32_LOADSTORE_BYTE = 0x1,
+ NDS32_LOADSTORE_HALF = 0x2,
+ NDS32_LOADSTORE_WORD = 0x4,
+ NDS32_LOADSTORE_FLOAT_S = 0x8,
+ NDS32_LOADSTORE_FLOAT_D = 0x10,
+ NDS32_LOADSTORE_IMM = 0x20
+};
+
+/* Relax tag for nds32_elf_relax_section, we have to specify which
+ optimization do in this round. */
+enum
+{
+ NDS32_RELAX_NONE_ROUND = 0,
+ NDS32_RELAX_NORMAL_ROUND,
+ NDS32_RELAX_JUMP_IFC_ROUND,
+ NDS32_RELAX_IFC_ROUND,
+ NDS32_RELAX_EX9_BUILD_ROUND,
+ NDS32_RELAX_EX9_REPLACE_ROUND,
+ NDS32_RELAX_EMPTY_ROUND
+};
+
+/* Security tag. */
+enum
+{
+ NDS32_SECURITY_NONE = 0,
+ NDS32_SECURITY_START,
+ NDS32_SECURITY_RESTART,
+ NDS32_SECURITY_END
+};
+
+/* There are two state in IFC optimization including general ifc (post-opt)
+ and jump ifc (j and jal). Therefore, we have to use two different mask to
+ distinguish them. */
+/* Optimization status mask. */
+#define NDS32_RELAX_JUMP_IFC_DONE (1 << 0)
+#define NDS32_RELAX_EX9_DONE (1 << 1)
+#define NDS32_RELAX_IFC_DONE (1 << 2)
+
+/* Optimization turn on mask. */
+#define NDS32_RELAX_IFC_ON (1 << 0)
+#define NDS32_RELAX_EX9_ON (1 << 1)
+
+void nds32_insertion_sort
+ (void *base, size_t nmemb, size_t size,
+ int (*compar) (const void *lhs, const void *rhs));
+
+struct section_id_list_t
+{
+ int id;
+ struct section_id_list_t *next;
+};
+
+struct section_id_list_t *
+ elf32_nds32_lookup_section_id (int id, struct section_id_list_t **lst_ptr);
+int elf32_nds32_check_relax_group (bfd *bfd, asection *sec);
+int elf32_nds32_unify_relax_group (bfd *abfd, asection *asec);
+int nds32_elf_unify_tls_model (bfd *inbfd, asection *insec,
+ bfd_byte *incontents,
+ struct bfd_link_info *lnkinfo);
+
+void bfd_elf32_nds32_set_target_option (struct bfd_link_info *, int, int,
+ FILE *, int, int, int, int, FILE *,
+ FILE *, int, int, bfd_boolean,
+ bfd_boolean, bfd_boolean);
+void bfd_elf32_nds32_append_section (struct bfd_link_info*, bfd *, int);
+int nds32_convert_32_to_16
+ (bfd *abfd, uint32_t insn, uint16_t *pinsn16, int *pinsn_type);
+int nds32_convert_16_to_32 (bfd *abfd, uint16_t insn16, uint32_t *pinsn);
+
+#define nds32_elf_hash_table(info) \
+ (elf_hash_table_id ((struct elf_link_hash_table *) ((info)->hash)) \
+ == NDS32_ELF_DATA ? ((struct elf_nds32_link_hash_table *) ((info)->hash)) : NULL)
+
+#define elf32_nds32_compute_jump_table_size(htab) \
+ ((htab)->next_tls_desc_index * 4)
+
+#define elf32_nds32_local_tlsdesc_gotent(bfd) \
+ (elf_nds32_tdata (bfd)->local_tlsdesc_gotent)
+
+/* Hash table structure for target nds32. There are some members to
+ save target options passed from nds32elf.em to bfd. */
+
+struct elf_nds32_link_hash_table
+{
+ struct elf_link_hash_table root;
+
+ /* ?? Short-cuts to get to dynamic linker sections. */
+ asection *sdynbss;
+ asection *srelbss;
+
+ /* Small local sym to section mapping cache. */
+ struct sym_cache sym_cache;
+
+ /* Target dependent options. */
+ int relax_fp_as_gp; /* --mrelax-omit-fp */
+ int eliminate_gc_relocs; /* --meliminate-gc-relocs */
+ FILE *sym_ld_script; /* --mgen-symbol-ld-script= */
+ /* Disable if linking a dynamically linked executable. */
+ int load_store_relax;
+ int target_optimize; /* Switch optimization. */
+ int relax_status; /* Finished optimization. */
+ int relax_round; /* Going optimization. */
+ FILE *ex9_export_file; /* --mexport-ex9= */
+ FILE *ex9_import_file; /* --mimport-ex9= */
+ int update_ex9_table; /* --mupdate-ex9. */
+ int ex9_limit;
+ bfd_boolean ex9_loop_aware; /* Ignore ex9 if inside a loop. */
+ bfd_boolean ifc_loop_aware; /* Ignore ifc if inside a loop. */
+ bfd_boolean hyper_relax; /* Relax for symbol not in RW sections. */
+
+ /* The offset into splt of the PLT entry for the TLS descriptor
+ resolver. Special values are 0, if not necessary (or not found
+ to be necessary yet), and -1 if needed but not determined
+ yet. */
+ bfd_vma dt_tlsdesc_plt;
+
+ /* The offset into sgot of the GOT entry used by the PLT entry
+ above. */
+ bfd_vma dt_tlsdesc_got;
+
+ /* Offset in .plt section of tls_nds32_trampoline. */
+ bfd_vma tls_trampoline;
+
+ /* The index of the next unused R_NDS32_TLS_DESC slot in .rel.plt. */
+ bfd_vma next_tls_desc_index;
+
+ /* How many R_NDS32_TLS_DESC relocations were generated so far. */
+ bfd_vma num_tls_desc;
+
+ /* The amount of space used by the reserved portion of the sgotplt
+ section, plus whatever space is used by the jump slots. */
+ bfd_vma sgotplt_jump_table_size;
+
+ /* True if the target uses REL relocations. */
+ int use_rel;
+};
+#endif
diff -Nur binutils-2.24.orig/bfd/elf-bfd.h binutils-2.24/bfd/elf-bfd.h
--- binutils-2.24.orig/bfd/elf-bfd.h 2013-11-08 11:13:48.000000000 +0100
+++ binutils-2.24/bfd/elf-bfd.h 2024-05-17 16:15:38.963344419 +0200
@@ -419,6 +419,7 @@
MICROBLAZE_ELF_DATA,
MIPS_ELF_DATA,
MN10300_ELF_DATA,
+ NDS32_ELF_DATA,
NIOS2_ELF_DATA,
PPC32_ELF_DATA,
PPC64_ELF_DATA,
diff -Nur binutils-2.24.orig/bfd/libbfd.c binutils-2.24/bfd/libbfd.c
--- binutils-2.24.orig/bfd/libbfd.c 2013-11-04 16:33:37.000000000 +0100
+++ binutils-2.24/bfd/libbfd.c 2024-05-17 16:15:38.979344751 +0200
@@ -550,11 +550,10 @@
.*/
/* Sign extension to bfd_signed_vma. */
-#define COERCE16(x) (((bfd_signed_vma) (x) ^ 0x8000) - 0x8000)
-#define COERCE32(x) (((bfd_signed_vma) (x) ^ 0x80000000) - 0x80000000)
-#define EIGHT_GAZILLION ((bfd_int64_t) 1 << 63)
+#define COERCE16(x) (((bfd_vma) (x) ^ 0x8000) - 0x8000)
+#define COERCE32(x) (((bfd_vma) (x) ^ 0x80000000) - 0x80000000)
#define COERCE64(x) \
- (((bfd_int64_t) (x) ^ EIGHT_GAZILLION) - EIGHT_GAZILLION)
+ (((bfd_uint64_t) (x) ^ ((bfd_uint64_t) 1 << 63)) - ((bfd_uint64_t) 1 << 63))
bfd_vma
bfd_getb16 (const void *p)
diff -Nur binutils-2.24.orig/bfd/libbfd.h binutils-2.24/bfd/libbfd.h
--- binutils-2.24.orig/bfd/libbfd.h 2013-11-18 09:40:15.000000000 +0100
+++ binutils-2.24/bfd/libbfd.h 2024-05-17 16:15:38.979344751 +0200
@@ -1746,6 +1746,141 @@
"BFD_RELOC_M32R_GOTPC_HI_ULO",
"BFD_RELOC_M32R_GOTPC_HI_SLO",
"BFD_RELOC_M32R_GOTPC_LO",
+ "BFD_RELOC_NDS32_20",
+ "BFD_RELOC_NDS32_9_PCREL",
+ "BFD_RELOC_NDS32_WORD_9_PCREL",
+ "BFD_RELOC_NDS32_15_PCREL",
+ "BFD_RELOC_NDS32_17_PCREL",
+ "BFD_RELOC_NDS32_25_PCREL",
+ "BFD_RELOC_NDS32_HI20",
+ "BFD_RELOC_NDS32_LO12S3",
+ "BFD_RELOC_NDS32_LO12S2",
+ "BFD_RELOC_NDS32_LO12S1",
+ "BFD_RELOC_NDS32_LO12S0",
+ "BFD_RELOC_NDS32_LO12S0_ORI",
+ "BFD_RELOC_NDS32_SDA15S3",
+ "BFD_RELOC_NDS32_SDA15S2",
+ "BFD_RELOC_NDS32_SDA15S1",
+ "BFD_RELOC_NDS32_SDA15S0",
+ "BFD_RELOC_NDS32_SDA16S3",
+ "BFD_RELOC_NDS32_SDA17S2",
+ "BFD_RELOC_NDS32_SDA18S1",
+ "BFD_RELOC_NDS32_SDA19S0",
+ "BFD_RELOC_NDS32_SECURITY_16",
+ "BFD_RELOC_NDS32_GOT20",
+ "BFD_RELOC_NDS32_9_PLTREL",
+ "BFD_RELOC_NDS32_25_PLTREL",
+ "BFD_RELOC_NDS32_COPY",
+ "BFD_RELOC_NDS32_GLOB_DAT",
+ "BFD_RELOC_NDS32_JMP_SLOT",
+ "BFD_RELOC_NDS32_RELATIVE",
+ "BFD_RELOC_NDS32_GOTOFF",
+ "BFD_RELOC_NDS32_GOTOFF_HI20",
+ "BFD_RELOC_NDS32_GOTOFF_LO12",
+ "BFD_RELOC_NDS32_GOTPC20",
+ "BFD_RELOC_NDS32_GOT_HI20",
+ "BFD_RELOC_NDS32_GOT_LO12",
+ "BFD_RELOC_NDS32_GOTPC_HI20",
+ "BFD_RELOC_NDS32_GOTPC_LO12",
+ "BFD_RELOC_NDS32_INSN16",
+ "BFD_RELOC_NDS32_LABEL",
+ "BFD_RELOC_NDS32_LONGCALL1",
+ "BFD_RELOC_NDS32_LONGCALL2",
+ "BFD_RELOC_NDS32_LONGCALL3",
+ "BFD_RELOC_NDS32_LONGJUMP1",
+ "BFD_RELOC_NDS32_LONGJUMP2",
+ "BFD_RELOC_NDS32_LONGJUMP3",
+ "BFD_RELOC_NDS32_LOADSTORE",
+ "BFD_RELOC_NDS32_9_FIXED",
+ "BFD_RELOC_NDS32_15_FIXED",
+ "BFD_RELOC_NDS32_17_FIXED",
+ "BFD_RELOC_NDS32_25_FIXED",
+ "BFD_RELOC_NDS32_LONGCALL4",
+ "BFD_RELOC_NDS32_LONGCALL5",
+ "BFD_RELOC_NDS32_LONGCALL6",
+ "BFD_RELOC_NDS32_LONGJUMP4",
+ "BFD_RELOC_NDS32_LONGJUMP5",
+ "BFD_RELOC_NDS32_LONGJUMP6",
+ "BFD_RELOC_NDS32_LONGJUMP7",
+ "BFD_RELOC_NDS32_PLTREL_HI20",
+ "BFD_RELOC_NDS32_PLTREL_LO12",
+ "BFD_RELOC_NDS32_PLT_GOTREL_HI20",
+ "BFD_RELOC_NDS32_PLT_GOTREL_LO12",
+ "BFD_RELOC_NDS32_SDA12S2_DP",
+ "BFD_RELOC_NDS32_SDA12S2_SP",
+ "BFD_RELOC_NDS32_LO12S2_DP",
+ "BFD_RELOC_NDS32_LO12S2_SP",
+ "BFD_RELOC_NDS32_DWARF2_OP1",
+ "BFD_RELOC_NDS32_DWARF2_OP2",
+ "BFD_RELOC_NDS32_DWARF2_LEB",
+ "BFD_RELOC_NDS32_UPDATE_TA",
+ "BFD_RELOC_NDS32_PLT_GOTREL_LO20",
+ "BFD_RELOC_NDS32_PLT_GOTREL_LO15",
+ "BFD_RELOC_NDS32_PLT_GOTREL_LO19",
+ "BFD_RELOC_NDS32_GOT_LO15",
+ "BFD_RELOC_NDS32_GOT_LO19",
+ "BFD_RELOC_NDS32_GOTOFF_LO15",
+ "BFD_RELOC_NDS32_GOTOFF_LO19",
+ "BFD_RELOC_NDS32_GOT15S2",
+ "BFD_RELOC_NDS32_GOT17S2",
+ "BFD_RELOC_NDS32_5",
+ "BFD_RELOC_NDS32_10_UPCREL",
+ "BFD_RELOC_NDS32_SDA_FP7U2_RELA",
+ "BFD_RELOC_NDS32_RELAX_ENTRY",
+ "BFD_RELOC_NDS32_GOT_SUFF",
+ "BFD_RELOC_NDS32_GOTOFF_SUFF",
+ "BFD_RELOC_NDS32_PLT_GOT_SUFF",
+ "BFD_RELOC_NDS32_MULCALL_SUFF",
+ "BFD_RELOC_NDS32_PTR",
+ "BFD_RELOC_NDS32_PTR_COUNT",
+ "BFD_RELOC_NDS32_PTR_RESOLVED",
+ "BFD_RELOC_NDS32_PLTBLOCK",
+ "BFD_RELOC_NDS32_RELAX_REGION_BEGIN",
+ "BFD_RELOC_NDS32_RELAX_REGION_END",
+ "BFD_RELOC_NDS32_MINUEND",
+ "BFD_RELOC_NDS32_SUBTRAHEND",
+ "BFD_RELOC_NDS32_DIFF8",
+ "BFD_RELOC_NDS32_DIFF16",
+ "BFD_RELOC_NDS32_DIFF32",
+ "BFD_RELOC_NDS32_DIFF_ULEB128",
+ "BFD_RELOC_NDS32_EMPTY",
+ "BFD_RELOC_NDS32_25_ABS",
+ "BFD_RELOC_NDS32_DATA",
+ "BFD_RELOC_NDS32_TRAN",
+ "BFD_RELOC_NDS32_17IFC_PCREL",
+ "BFD_RELOC_NDS32_10IFCU_PCREL",
+ "BFD_RELOC_NDS32_TPOFF",
+ "BFD_RELOC_NDS32_GOTTPOFF",
+ "BFD_RELOC_NDS32_TLS_LE_HI20",
+ "BFD_RELOC_NDS32_TLS_LE_LO12",
+ "BFD_RELOC_NDS32_TLS_LE_20",
+ "BFD_RELOC_NDS32_TLS_LE_15S0",
+ "BFD_RELOC_NDS32_TLS_LE_15S1",
+ "BFD_RELOC_NDS32_TLS_LE_15S2",
+ "BFD_RELOC_NDS32_TLS_LE_ADD",
+ "BFD_RELOC_NDS32_TLS_LE_LS",
+ "BFD_RELOC_NDS32_TLS_IE_HI20",
+ "BFD_RELOC_NDS32_TLS_IE_LO12",
+ "BFD_RELOC_NDS32_TLS_IE_LO12S2",
+ "BFD_RELOC_NDS32_TLS_IEGP_HI20",
+ "BFD_RELOC_NDS32_TLS_IEGP_LO12",
+ "BFD_RELOC_NDS32_TLS_IEGP_LO12S2",
+ "BFD_RELOC_NDS32_TLS_IEGP_LW",
+ "BFD_RELOC_NDS32_TLS_DESC",
+ "BFD_RELOC_NDS32_TLS_DESC_HI20",
+ "BFD_RELOC_NDS32_TLS_DESC_LO12",
+ "BFD_RELOC_NDS32_TLS_DESC_20",
+ "BFD_RELOC_NDS32_TLS_DESC_SDA17S2",
+ "BFD_RELOC_NDS32_TLS_DESC_ADD",
+ "BFD_RELOC_NDS32_TLS_DESC_FUNC",
+ "BFD_RELOC_NDS32_TLS_DESC_CALL",
+ "BFD_RELOC_NDS32_TLS_DESC_MEM",
+ "BFD_RELOC_NDS32_REMOVE",
+ "BFD_RELOC_NDS32_GROUP",
+ "BFD_RELOC_NDS32_ICT",
+ "BFD_RELOC_NDS32_ICT_HI20",
+ "BFD_RELOC_NDS32_ICT_LO12",
+ "BFD_RELOC_NDS32_ICT_25PC",
"BFD_RELOC_V850_9_PCREL",
"BFD_RELOC_V850_22_PCREL",
"BFD_RELOC_V850_SDA_16_16_OFFSET",
diff -Nur binutils-2.24.orig/bfd/Makefile.am binutils-2.24/bfd/Makefile.am
--- binutils-2.24.orig/bfd/Makefile.am 2013-12-02 10:30:28.000000000 +0100
+++ binutils-2.24/bfd/Makefile.am 2024-05-17 16:15:38.907343262 +0200
@@ -136,6 +136,7 @@
cpu-moxie.lo \
cpu-msp430.lo \
cpu-mt.lo \
+ cpu-nds32.lo \
cpu-nios2.lo \
cpu-ns32k.lo \
cpu-openrisc.lo \
@@ -220,6 +221,7 @@
cpu-moxie.c \
cpu-msp430.c \
cpu-mt.c \
+ cpu-nds32.c \
cpu-ns32k.c \
cpu-nios2.c \
cpu-openrisc.c \
@@ -349,6 +351,7 @@
elf32-moxie.lo \
elf32-msp430.lo \
elf32-mt.lo \
+ elf32-nds32.lo \
elf32-nios2.lo \
elf32-openrisc.lo \
elf32-or32.lo \
@@ -537,6 +540,7 @@
elf32-moxie.c \
elf32-msp430.c \
elf32-mt.c \
+ elf32-nds32.c \
elf32-nios2.c \
elf32-openrisc.c \
elf32-or32.c \
diff -Nur binutils-2.24.orig/bfd/Makefile.in binutils-2.24/bfd/Makefile.in
--- binutils-2.24.orig/bfd/Makefile.in 2013-12-02 10:30:30.000000000 +0100
+++ binutils-2.24/bfd/Makefile.in 2024-05-17 16:15:38.911343345 +0200
@@ -437,6 +437,7 @@
cpu-moxie.lo \
cpu-msp430.lo \
cpu-mt.lo \
+ cpu-nds32.lo \
cpu-nios2.lo \
cpu-ns32k.lo \
cpu-openrisc.lo \
@@ -521,6 +522,7 @@
cpu-moxie.c \
cpu-msp430.c \
cpu-mt.c \
+ cpu-nds32.c \
cpu-ns32k.c \
cpu-nios2.c \
cpu-openrisc.c \
@@ -651,6 +653,7 @@
elf32-moxie.lo \
elf32-msp430.lo \
elf32-mt.lo \
+ elf32-nds32.lo \
elf32-nios2.lo \
elf32-openrisc.lo \
elf32-or32.lo \
@@ -839,6 +842,7 @@
elf32-moxie.c \
elf32-msp430.c \
elf32-mt.c \
+ elf32-nds32.c \
elf32-nios2.c \
elf32-openrisc.c \
elf32-or32.c \
@@ -1352,6 +1356,7 @@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-moxie.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-msp430.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-mt.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-nds32.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-nios2.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-ns32k.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-openrisc.Plo@am__quote@
@@ -1442,6 +1447,7 @@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-moxie.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-msp430.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-mt.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-nds32.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-nios2.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-openrisc.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-or32.Plo@am__quote@
diff -Nur binutils-2.24.orig/bfd/po/.cvsignore binutils-2.24/bfd/po/.cvsignore
--- binutils-2.24.orig/bfd/po/.cvsignore 1970-01-01 01:00:00.000000000 +0100
+++ binutils-2.24/bfd/po/.cvsignore 2024-05-17 16:15:38.979344751 +0200
@@ -0,0 +1 @@
+*.gmo
diff -Nur binutils-2.24.orig/bfd/reloc.c binutils-2.24/bfd/reloc.c
--- binutils-2.24.orig/bfd/reloc.c 2013-11-18 09:40:15.000000000 +0100
+++ binutils-2.24/bfd/reloc.c 2024-05-17 16:15:38.983344833 +0200
@@ -3839,6 +3839,366 @@
ENUM
+ BFD_RELOC_NDS32_20
+ENUMDOC
+ NDS32 relocs.
+ This is a 20 bit absolute address.
+ENUM
+ BFD_RELOC_NDS32_9_PCREL
+ENUMDOC
+ This is a 9-bit pc-relative reloc with the right 1 bit assumed to be 0.
+ENUM
+ BFD_RELOC_NDS32_WORD_9_PCREL
+ENUMDOC
+ This is a 9-bit pc-relative reloc with the right 1 bit assumed to be 0.
+ENUM
+ BFD_RELOC_NDS32_15_PCREL
+ENUMDOC
+ This is an 15-bit reloc with the right 1 bit assumed to be 0.
+ENUM
+ BFD_RELOC_NDS32_17_PCREL
+ENUMDOC
+ This is an 17-bit reloc with the right 1 bit assumed to be 0.
+ENUM
+ BFD_RELOC_NDS32_25_PCREL
+ENUMDOC
+ This is a 25-bit reloc with the right 1 bit assumed to be 0.
+ENUM
+ BFD_RELOC_NDS32_HI20
+ENUMDOC
+ This is a 20-bit reloc containing the high 20 bits of an address
+ used with the lower 12 bits
+ENUM
+ BFD_RELOC_NDS32_LO12S3
+ENUMDOC
+ This is a 12-bit reloc containing the lower 12 bits of an address
+ then shift right by 3. This is used with ldi,sdi...
+ENUM
+ BFD_RELOC_NDS32_LO12S2
+ENUMDOC
+ This is a 12-bit reloc containing the lower 12 bits of an address
+ then shift left by 2. This is used with lwi,swi...
+ENUM
+ BFD_RELOC_NDS32_LO12S1
+ENUMDOC
+ This is a 12-bit reloc containing the lower 12 bits of an address
+ then shift left by 1. This is used with lhi,shi...
+ENUM
+ BFD_RELOC_NDS32_LO12S0
+ENUMDOC
+ This is a 12-bit reloc containing the lower 12 bits of an address
+ then shift left by 0. This is used with lbisbi...
+ENUM
+ BFD_RELOC_NDS32_LO12S0_ORI
+ENUMDOC
+ This is a 12-bit reloc containing the lower 12 bits of an address
+ then shift left by 0. This is only used with branch relaxations
+ENUM
+ BFD_RELOC_NDS32_SDA15S3
+ENUMDOC
+ This is a 15-bit reloc containing the small data area 18-bit signed offset
+ and shift left by 3 for use in ldi, sdi...
+ENUM
+ BFD_RELOC_NDS32_SDA15S2
+ENUMDOC
+ This is a 15-bit reloc containing the small data area 17-bit signed offset
+ and shift left by 2 for use in lwi, swi...
+ENUM
+ BFD_RELOC_NDS32_SDA15S1
+ENUMDOC
+ This is a 15-bit reloc containing the small data area 16-bit signed offset
+ and shift left by 1 for use in lhi, shi...
+ENUM
+ BFD_RELOC_NDS32_SDA15S0
+ENUMDOC
+ This is a 15-bit reloc containing the small data area 15-bit signed offset
+ and shift left by 0 for use in lbi, sbi...
+ENUM
+ BFD_RELOC_NDS32_SDA16S3
+ENUMDOC
+ This is a 16-bit reloc containing the small data area 16-bit signed offset
+ and shift left by 3
+ENUM
+ BFD_RELOC_NDS32_SDA17S2
+ENUMDOC
+ This is a 17-bit reloc containing the small data area 17-bit signed offset
+ and shift left by 2 for use in lwi.gp, swi.gp...
+ENUM
+ BFD_RELOC_NDS32_SDA18S1
+ENUMDOC
+ This is a 18-bit reloc containing the small data area 18-bit signed offset
+ and shift left by 1 for use in lhi.gp, shi.gp...
+ENUM
+ BFD_RELOC_NDS32_SDA19S0
+ENUMDOC
+ This is a 19-bit reloc containing the small data area 19-bit signed offset
+ and shift left by 0 for use in lbi.gp, sbi.gp...
+ENUM
+ BFD_RELOC_NDS32_SECURITY_16
+ENUMDOC
+ This is a 24-bit reloc for security check sum.
+ENUM
+ BFD_RELOC_NDS32_GOT20
+ENUMX
+ BFD_RELOC_NDS32_9_PLTREL
+ENUMX
+ BFD_RELOC_NDS32_25_PLTREL
+ENUMX
+ BFD_RELOC_NDS32_COPY
+ENUMX
+ BFD_RELOC_NDS32_GLOB_DAT
+ENUMX
+ BFD_RELOC_NDS32_JMP_SLOT
+ENUMX
+ BFD_RELOC_NDS32_RELATIVE
+ENUMX
+ BFD_RELOC_NDS32_GOTOFF
+ENUMX
+ BFD_RELOC_NDS32_GOTOFF_HI20
+ENUMX
+ BFD_RELOC_NDS32_GOTOFF_LO12
+ENUMX
+ BFD_RELOC_NDS32_GOTPC20
+ENUMX
+ BFD_RELOC_NDS32_GOT_HI20
+ENUMX
+ BFD_RELOC_NDS32_GOT_LO12
+ENUMX
+ BFD_RELOC_NDS32_GOTPC_HI20
+ENUMX
+ BFD_RELOC_NDS32_GOTPC_LO12
+ENUMDOC
+ for PIC
+ENUM
+ BFD_RELOC_NDS32_INSN16
+ENUMX
+ BFD_RELOC_NDS32_LABEL
+ENUMX
+ BFD_RELOC_NDS32_LONGCALL1
+ENUMX
+ BFD_RELOC_NDS32_LONGCALL2
+ENUMX
+ BFD_RELOC_NDS32_LONGCALL3
+ENUMX
+ BFD_RELOC_NDS32_LONGJUMP1
+ENUMX
+ BFD_RELOC_NDS32_LONGJUMP2
+ENUMX
+ BFD_RELOC_NDS32_LONGJUMP3
+ENUMX
+ BFD_RELOC_NDS32_LOADSTORE
+ENUMX
+ BFD_RELOC_NDS32_9_FIXED
+ENUMX
+ BFD_RELOC_NDS32_15_FIXED
+ENUMX
+ BFD_RELOC_NDS32_17_FIXED
+ENUMX
+ BFD_RELOC_NDS32_25_FIXED
+ENUMX
+ BFD_RELOC_NDS32_LONGCALL4
+ENUMX
+ BFD_RELOC_NDS32_LONGCALL5
+ENUMX
+ BFD_RELOC_NDS32_LONGCALL6
+ENUMX
+ BFD_RELOC_NDS32_LONGJUMP4
+ENUMX
+ BFD_RELOC_NDS32_LONGJUMP5
+ENUMX
+ BFD_RELOC_NDS32_LONGJUMP6
+ENUMX
+ BFD_RELOC_NDS32_LONGJUMP7
+ENUMDOC
+ for relax
+ENUM
+ BFD_RELOC_NDS32_PLTREL_HI20
+ENUMX
+ BFD_RELOC_NDS32_PLTREL_LO12
+ENUMX
+ BFD_RELOC_NDS32_PLT_GOTREL_HI20
+ENUMX
+ BFD_RELOC_NDS32_PLT_GOTREL_LO12
+ENUMDOC
+ for PIC
+ENUM
+ BFD_RELOC_NDS32_SDA12S2_DP
+ENUMX
+ BFD_RELOC_NDS32_SDA12S2_SP
+ENUMX
+ BFD_RELOC_NDS32_LO12S2_DP
+ENUMX
+ BFD_RELOC_NDS32_LO12S2_SP
+ENUMDOC
+ for floating point
+ENUM
+ BFD_RELOC_NDS32_DWARF2_OP1
+ENUMX
+ BFD_RELOC_NDS32_DWARF2_OP2
+ENUMX
+ BFD_RELOC_NDS32_DWARF2_LEB
+ENUMDOC
+ for dwarf2 debug_line.
+ENUM
+ BFD_RELOC_NDS32_UPDATE_TA
+ENUMDOC
+ for eliminate 16-bit instructions
+ENUM
+ BFD_RELOC_NDS32_PLT_GOTREL_LO20
+ENUMX
+ BFD_RELOC_NDS32_PLT_GOTREL_LO15
+ENUMX
+ BFD_RELOC_NDS32_PLT_GOTREL_LO19
+ENUMX
+ BFD_RELOC_NDS32_GOT_LO15
+ENUMX
+ BFD_RELOC_NDS32_GOT_LO19
+ENUMX
+ BFD_RELOC_NDS32_GOTOFF_LO15
+ENUMX
+ BFD_RELOC_NDS32_GOTOFF_LO19
+ENUMX
+ BFD_RELOC_NDS32_GOT15S2
+ENUMX
+ BFD_RELOC_NDS32_GOT17S2
+ENUMDOC
+ for PIC object relaxation
+ENUM
+ BFD_RELOC_NDS32_5
+ENUMDOC
+ NDS32 relocs.
+ This is a 5 bit absolute address.
+ENUM
+ BFD_RELOC_NDS32_10_UPCREL
+ENUMDOC
+ This is a 10-bit unsigned pc-relative reloc with the right 1 bit assumed to be 0.
+ENUM
+ BFD_RELOC_NDS32_SDA_FP7U2_RELA
+ENUMDOC
+ If fp were omitted, fp can used as another gp.
+ENUM
+ BFD_RELOC_NDS32_RELAX_ENTRY
+ENUMX
+ BFD_RELOC_NDS32_GOT_SUFF
+ENUMX
+ BFD_RELOC_NDS32_GOTOFF_SUFF
+ENUMX
+ BFD_RELOC_NDS32_PLT_GOT_SUFF
+ENUMX
+ BFD_RELOC_NDS32_MULCALL_SUFF
+ENUMX
+ BFD_RELOC_NDS32_PTR
+ENUMX
+ BFD_RELOC_NDS32_PTR_COUNT
+ENUMX
+ BFD_RELOC_NDS32_PTR_RESOLVED
+ENUMX
+ BFD_RELOC_NDS32_PLTBLOCK
+ENUMX
+ BFD_RELOC_NDS32_RELAX_REGION_BEGIN
+ENUMX
+ BFD_RELOC_NDS32_RELAX_REGION_END
+ENUMX
+ BFD_RELOC_NDS32_MINUEND
+ENUMX
+ BFD_RELOC_NDS32_SUBTRAHEND
+ENUMX
+ BFD_RELOC_NDS32_DIFF8
+ENUMX
+ BFD_RELOC_NDS32_DIFF16
+ENUMX
+ BFD_RELOC_NDS32_DIFF32
+ENUMX
+ BFD_RELOC_NDS32_DIFF_ULEB128
+ENUMX
+ BFD_RELOC_NDS32_EMPTY
+ENUMDOC
+ relaxation relative relocation types
+ENUM
+ BFD_RELOC_NDS32_25_ABS
+ENUMDOC
+ This is a 25 bit absolute address.
+ENUM
+ BFD_RELOC_NDS32_DATA
+ENUMX
+ BFD_RELOC_NDS32_TRAN
+ENUMX
+ BFD_RELOC_NDS32_17IFC_PCREL
+ENUMX
+ BFD_RELOC_NDS32_10IFCU_PCREL
+ENUMDOC
+ For ex9 and ifc using.
+ENUM
+ BFD_RELOC_NDS32_TPOFF
+ENUMX
+ BFD_RELOC_NDS32_GOTTPOFF
+ENUMX
+ BFD_RELOC_NDS32_TLS_LE_HI20
+ENUMX
+ BFD_RELOC_NDS32_TLS_LE_LO12
+ENUMX
+ BFD_RELOC_NDS32_TLS_LE_20
+ENUMX
+ BFD_RELOC_NDS32_TLS_LE_15S0
+ENUMX
+ BFD_RELOC_NDS32_TLS_LE_15S1
+ENUMX
+ BFD_RELOC_NDS32_TLS_LE_15S2
+ENUMX
+ BFD_RELOC_NDS32_TLS_LE_ADD
+ENUMX
+ BFD_RELOC_NDS32_TLS_LE_LS
+ENUMX
+ BFD_RELOC_NDS32_TLS_IE_HI20
+ENUMX
+ BFD_RELOC_NDS32_TLS_IE_LO12
+ENUMX
+ BFD_RELOC_NDS32_TLS_IE_LO12S2
+ENUMX
+ BFD_RELOC_NDS32_TLS_IEGP_HI20
+ENUMX
+ BFD_RELOC_NDS32_TLS_IEGP_LO12
+ENUMX
+ BFD_RELOC_NDS32_TLS_IEGP_LO12S2
+ENUMX
+ BFD_RELOC_NDS32_TLS_IEGP_LW
+ENUMX
+ BFD_RELOC_NDS32_TLS_DESC
+ENUMX
+ BFD_RELOC_NDS32_TLS_DESC_HI20
+ENUMX
+ BFD_RELOC_NDS32_TLS_DESC_LO12
+ENUMX
+ BFD_RELOC_NDS32_TLS_DESC_20
+ENUMX
+ BFD_RELOC_NDS32_TLS_DESC_SDA17S2
+ENUMX
+ BFD_RELOC_NDS32_TLS_DESC_ADD
+ENUMX
+ BFD_RELOC_NDS32_TLS_DESC_FUNC
+ENUMX
+ BFD_RELOC_NDS32_TLS_DESC_CALL
+ENUMX
+ BFD_RELOC_NDS32_TLS_DESC_MEM
+ENUMX
+ BFD_RELOC_NDS32_REMOVE
+ENUMX
+ BFD_RELOC_NDS32_GROUP
+ENUMDOC
+ For TLS.
+
+ENUM
+ BFD_RELOC_NDS32_ICT
+ENUMX
+ BFD_RELOC_NDS32_ICT_HI20
+ENUMX
+ BFD_RELOC_NDS32_ICT_LO12
+ENUMX
+ BFD_RELOC_NDS32_ICT_25PC
+ENUMDOC
+ Jump-patch table relative relocations.
+
+ENUM
BFD_RELOC_V850_9_PCREL
ENUMDOC
This is a 9-bit reloc
diff -Nur binutils-2.24.orig/bfd/section.c binutils-2.24/bfd/section.c
--- binutils-2.24.orig/bfd/section.c 2013-11-04 16:33:37.000000000 +0100
+++ binutils-2.24/bfd/section.c 2024-05-17 16:15:38.983344833 +0200
@@ -542,6 +542,32 @@
. int size;
.};
.
+.{* Note: the following are provided as inline functions rather than macros
+. because not all callers use the return value. A macro implementation
+. would use a comma expression, eg: "((ptr)->foo = val, TRUE)" and some
+. compilers will complain about comma expressions that have no effect. *}
+.static inline bfd_boolean
+.bfd_set_section_userdata (bfd * abfd ATTRIBUTE_UNUSED, asection * ptr, void * val)
+.{
+. ptr->userdata = val;
+. return TRUE;
+.}
+.
+.static inline bfd_boolean
+.bfd_set_section_vma (bfd * abfd ATTRIBUTE_UNUSED, asection * ptr, bfd_vma val)
+.{
+. ptr->vma = ptr->lma = val;
+. ptr->user_set_vma = TRUE;
+. return TRUE;
+.}
+.
+.static inline bfd_boolean
+.bfd_set_section_alignment (bfd * abfd ATTRIBUTE_UNUSED, asection * ptr, unsigned int val)
+.{
+. ptr->alignment_power = val;
+. return TRUE;
+.}
+.
.{* These sections are global, and are managed by BFD. The application
. and target back end are not permitted to change the values in
. these sections. *}
diff -Nur binutils-2.24.orig/bfd/targets.c binutils-2.24/bfd/targets.c
--- binutils-2.24.orig/bfd/targets.c 2013-11-04 16:33:37.000000000 +0100
+++ binutils-2.24/bfd/targets.c 2024-05-17 16:15:38.987344917 +0200
@@ -673,6 +673,10 @@
extern const bfd_target bfd_elf32_ntradlittlemips_vec;
extern const bfd_target bfd_elf32_ntradbigmips_freebsd_vec;
extern const bfd_target bfd_elf32_ntradlittlemips_freebsd_vec;
+extern const bfd_target bfd_elf32_nds32be_vec;
+extern const bfd_target bfd_elf32_nds32le_vec;
+extern const bfd_target bfd_elf32_nds32belin_vec;
+extern const bfd_target bfd_elf32_nds32lelin_vec;
extern const bfd_target bfd_elf32_openrisc_vec;
extern const bfd_target bfd_elf32_or32_big_vec;
extern const bfd_target bfd_elf32_pj_vec;
@@ -1061,6 +1065,10 @@
&bfd_elf32_ntradbigmips_freebsd_vec,
&bfd_elf32_ntradlittlemips_freebsd_vec,
#endif
+ &bfd_elf32_nds32be_vec,
+ &bfd_elf32_nds32le_vec,
+ &bfd_elf32_nds32belin_vec,
+ &bfd_elf32_nds32lelin_vec,
&bfd_elf32_openrisc_vec,
&bfd_elf32_or32_big_vec,
&bfd_elf32_pj_vec,
diff -Nur binutils-2.24.orig/binutils/arlex.c binutils-2.24/binutils/arlex.c
--- binutils-2.24.orig/binutils/arlex.c 2013-11-18 09:49:30.000000000 +0100
+++ binutils-2.24/binutils/arlex.c 1970-01-01 01:00:00.000000000 +0100
@@ -1,2036 +0,0 @@
-
-#line 3 "arlex.c"
-
-#define YY_INT_ALIGNED short int
-
-/* A lexical scanner generated by flex */
-
-#define FLEX_SCANNER
-#define YY_FLEX_MAJOR_VERSION 2
-#define YY_FLEX_MINOR_VERSION 5
-#define YY_FLEX_SUBMINOR_VERSION 35
-#if YY_FLEX_SUBMINOR_VERSION > 0
-#define FLEX_BETA
-#endif
-
-/* First, we deal with platform-specific or compiler-specific issues. */
-
-/* begin standard C headers. */
-#include
-#include
-#include
-#include
-
-/* end standard C headers. */
-
-/* flex integer type definitions */
-
-#ifndef FLEXINT_H
-#define FLEXINT_H
-
-/* C99 systems have . Non-C99 systems may or may not. */
-
-#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
-
-/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
- * if you want the limit (max/min) macros for int types.
- */
-#ifndef __STDC_LIMIT_MACROS
-#define __STDC_LIMIT_MACROS 1
-#endif
-
-#include
-typedef int8_t flex_int8_t;
-typedef uint8_t flex_uint8_t;
-typedef int16_t flex_int16_t;
-typedef uint16_t flex_uint16_t;
-typedef int32_t flex_int32_t;
-typedef uint32_t flex_uint32_t;
-typedef uint64_t flex_uint64_t;
-#else
-typedef signed char flex_int8_t;
-typedef short int flex_int16_t;
-typedef int flex_int32_t;
-typedef unsigned char flex_uint8_t;
-typedef unsigned short int flex_uint16_t;
-typedef unsigned int flex_uint32_t;
-#endif /* ! C99 */
-
-/* Limits of integral types. */
-#ifndef INT8_MIN
-#define INT8_MIN (-128)
-#endif
-#ifndef INT16_MIN
-#define INT16_MIN (-32767-1)
-#endif
-#ifndef INT32_MIN
-#define INT32_MIN (-2147483647-1)
-#endif
-#ifndef INT8_MAX
-#define INT8_MAX (127)
-#endif
-#ifndef INT16_MAX
-#define INT16_MAX (32767)
-#endif
-#ifndef INT32_MAX
-#define INT32_MAX (2147483647)
-#endif
-#ifndef UINT8_MAX
-#define UINT8_MAX (255U)
-#endif
-#ifndef UINT16_MAX
-#define UINT16_MAX (65535U)
-#endif
-#ifndef UINT32_MAX
-#define UINT32_MAX (4294967295U)
-#endif
-
-#endif /* ! FLEXINT_H */
-
-#ifdef __cplusplus
-
-/* The "const" storage-class-modifier is valid. */
-#define YY_USE_CONST
-
-#else /* ! __cplusplus */
-
-/* C99 requires __STDC__ to be defined as 1. */
-#if defined (__STDC__)
-
-#define YY_USE_CONST
-
-#endif /* defined (__STDC__) */
-#endif /* ! __cplusplus */
-
-#ifdef YY_USE_CONST
-#define yyconst const
-#else
-#define yyconst
-#endif
-
-/* Returned upon end-of-file. */
-#define YY_NULL 0
-
-/* Promotes a possibly negative, possibly signed char to an unsigned
- * integer for use as an array index. If the signed char is negative,
- * we want to instead treat it as an 8-bit unsigned char, hence the
- * double cast.
- */
-#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
-
-/* Enter a start condition. This macro really ought to take a parameter,
- * but we do it the disgusting crufty way forced on us by the ()-less
- * definition of BEGIN.
- */
-#define BEGIN (yy_start) = 1 + 2 *
-
-/* Translate the current start state into a value that can be later handed
- * to BEGIN to return to the state. The YYSTATE alias is for lex
- * compatibility.
- */
-#define YY_START (((yy_start) - 1) / 2)
-#define YYSTATE YY_START
-
-/* Action number for EOF rule of a given start state. */
-#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
-
-/* Special action meaning "start processing a new file". */
-#define YY_NEW_FILE yyrestart(yyin )
-
-#define YY_END_OF_BUFFER_CHAR 0
-
-/* Size of default input buffer. */
-#ifndef YY_BUF_SIZE
-#define YY_BUF_SIZE 16384
-#endif
-
-/* The state buf must be large enough to hold one state per character in the main buffer.
- */
-#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
-
-#ifndef YY_TYPEDEF_YY_BUFFER_STATE
-#define YY_TYPEDEF_YY_BUFFER_STATE
-typedef struct yy_buffer_state *YY_BUFFER_STATE;
-#endif
-
-#ifndef YY_TYPEDEF_YY_SIZE_T
-#define YY_TYPEDEF_YY_SIZE_T
-typedef size_t yy_size_t;
-#endif
-
-extern yy_size_t yyleng;
-
-extern FILE *yyin, *yyout;
-
-#define EOB_ACT_CONTINUE_SCAN 0
-#define EOB_ACT_END_OF_FILE 1
-#define EOB_ACT_LAST_MATCH 2
-
- #define YY_LESS_LINENO(n)
-
-/* Return all but the first "n" matched characters back to the input stream. */
-#define yyless(n) \
- do \
- { \
- /* Undo effects of setting up yytext. */ \
- int yyless_macro_arg = (n); \
- YY_LESS_LINENO(yyless_macro_arg);\
- *yy_cp = (yy_hold_char); \
- YY_RESTORE_YY_MORE_OFFSET \
- (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
- YY_DO_BEFORE_ACTION; /* set up yytext again */ \
- } \
- while ( 0 )
-
-#define unput(c) yyunput( c, (yytext_ptr) )
-
-#ifndef YY_STRUCT_YY_BUFFER_STATE
-#define YY_STRUCT_YY_BUFFER_STATE
-struct yy_buffer_state
- {
- FILE *yy_input_file;
-
- char *yy_ch_buf; /* input buffer */
- char *yy_buf_pos; /* current position in input buffer */
-
- /* Size of input buffer in bytes, not including room for EOB
- * characters.
- */
- yy_size_t yy_buf_size;
-
- /* Number of characters read into yy_ch_buf, not including EOB
- * characters.
- */
- yy_size_t yy_n_chars;
-
- /* Whether we "own" the buffer - i.e., we know we created it,
- * and can realloc() it to grow it, and should free() it to
- * delete it.
- */
- int yy_is_our_buffer;
-
- /* Whether this is an "interactive" input source; if so, and
- * if we're using stdio for input, then we want to use getc()
- * instead of fread(), to make sure we stop fetching input after
- * each newline.
- */
- int yy_is_interactive;
-
- /* Whether we're considered to be at the beginning of a line.
- * If so, '^' rules will be active on the next match, otherwise
- * not.
- */
- int yy_at_bol;
-
- int yy_bs_lineno; /**< The line count. */
- int yy_bs_column; /**< The column count. */
-
- /* Whether to try to fill the input buffer when we reach the
- * end of it.
- */
- int yy_fill_buffer;
-
- int yy_buffer_status;
-
-#define YY_BUFFER_NEW 0
-#define YY_BUFFER_NORMAL 1
- /* When an EOF's been seen but there's still some text to process
- * then we mark the buffer as YY_EOF_PENDING, to indicate that we
- * shouldn't try reading from the input source any more. We might
- * still have a bunch of tokens to match, though, because of
- * possible backing-up.
- *
- * When we actually see the EOF, we change the status to "new"
- * (via yyrestart()), so that the user can continue scanning by
- * just pointing yyin at a new input file.
- */
-#define YY_BUFFER_EOF_PENDING 2
-
- };
-#endif /* !YY_STRUCT_YY_BUFFER_STATE */
-
-/* Stack of input buffers. */
-static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
-static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
-static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
-
-/* We provide macros for accessing buffer states in case in the
- * future we want to put the buffer states in a more general
- * "scanner state".
- *
- * Returns the top of the stack, or NULL.
- */
-#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
- ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
- : NULL)
-
-/* Same as previous macro, but useful when we know that the buffer stack is not
- * NULL or when we need an lvalue. For internal use only.
- */
-#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
-
-/* yy_hold_char holds the character lost when yytext is formed. */
-static char yy_hold_char;
-static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */
-yy_size_t yyleng;
-
-/* Points to current character in buffer. */
-static char *yy_c_buf_p = (char *) 0;
-static int yy_init = 0; /* whether we need to initialize */
-static int yy_start = 0; /* start state number */
-
-/* Flag which is used to allow yywrap()'s to do buffer switches
- * instead of setting up a fresh yyin. A bit of a hack ...
- */
-static int yy_did_buffer_switch_on_eof;
-
-void yyrestart (FILE *input_file );
-void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer );
-YY_BUFFER_STATE yy_create_buffer (FILE *file,int size );
-void yy_delete_buffer (YY_BUFFER_STATE b );
-void yy_flush_buffer (YY_BUFFER_STATE b );
-void yypush_buffer_state (YY_BUFFER_STATE new_buffer );
-void yypop_buffer_state (void );
-
-static void yyensure_buffer_stack (void );
-static void yy_load_buffer_state (void );
-static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file );
-
-#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER )
-
-YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size );
-YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str );
-YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,yy_size_t len );
-
-void *yyalloc (yy_size_t );
-void *yyrealloc (void *,yy_size_t );
-void yyfree (void * );
-
-#define yy_new_buffer yy_create_buffer
-
-#define yy_set_interactive(is_interactive) \
- { \
- if ( ! YY_CURRENT_BUFFER ){ \
- yyensure_buffer_stack (); \
- YY_CURRENT_BUFFER_LVALUE = \
- yy_create_buffer(yyin,YY_BUF_SIZE ); \
- } \
- YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
- }
-
-#define yy_set_bol(at_bol) \
- { \
- if ( ! YY_CURRENT_BUFFER ){\
- yyensure_buffer_stack (); \
- YY_CURRENT_BUFFER_LVALUE = \
- yy_create_buffer(yyin,YY_BUF_SIZE ); \
- } \
- YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
- }
-
-#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
-
-/* Begin user sect3 */
-
-typedef unsigned char YY_CHAR;
-
-FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
-
-typedef int yy_state_type;
-
-extern int yylineno;
-
-int yylineno = 1;
-
-extern char *yytext;
-#define yytext_ptr yytext
-
-static yy_state_type yy_get_previous_state (void );
-static yy_state_type yy_try_NUL_trans (yy_state_type current_state );
-static int yy_get_next_buffer (void );
-static void yy_fatal_error (yyconst char msg[] );
-
-/* Done after the current pattern has been matched and before the
- * corresponding action - sets up yytext.
- */
-#define YY_DO_BEFORE_ACTION \
- (yytext_ptr) = yy_bp; \
- yyleng = (yy_size_t) (yy_cp - yy_bp); \
- (yy_hold_char) = *yy_cp; \
- *yy_cp = '\0'; \
- (yy_c_buf_p) = yy_cp;
-
-#define YY_NUM_RULES 40
-#define YY_END_OF_BUFFER 41
-/* This struct is not used in this scanner,
- but its presence is necessary. */
-struct yy_trans_info
- {
- flex_int32_t yy_verify;
- flex_int32_t yy_nxt;
- };
-static yyconst flex_int16_t yy_accept[177] =
- { 0,
- 0, 0, 41, 40, 39, 38, 35, 32, 33, 36,
- 40, 34, 37, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 36, 31, 37, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 7, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 22, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-
- 35, 35, 35, 10, 11, 12, 35, 15, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 25, 26, 27,
- 35, 30, 35, 35, 35, 3, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 18, 35, 35, 35, 35,
- 35, 35, 35, 1, 2, 4, 5, 35, 35, 35,
- 35, 35, 16, 17, 19, 20, 35, 35, 35, 35,
- 35, 35, 8, 9, 13, 14, 35, 23, 24, 28,
- 29, 35, 35, 6, 21, 0
- } ;
-
-static yyconst flex_int32_t yy_ec[256] =
- { 0,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 3, 1, 1, 1, 4, 1, 1, 1, 5,
- 6, 7, 8, 9, 4, 4, 4, 4, 4, 4,
- 4, 4, 4, 4, 4, 4, 4, 4, 10, 1,
- 1, 1, 1, 1, 11, 12, 13, 14, 15, 16,
- 4, 17, 18, 4, 4, 19, 20, 21, 22, 23,
- 4, 24, 25, 26, 27, 28, 4, 29, 30, 4,
- 1, 4, 1, 1, 4, 1, 31, 32, 33, 34,
-
- 35, 36, 4, 37, 38, 4, 4, 39, 40, 41,
- 42, 43, 4, 44, 45, 46, 47, 48, 4, 49,
- 50, 4, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1
- } ;
-
-static yyconst flex_int32_t yy_meta[51] =
- { 0,
- 1, 2, 1, 3, 1, 1, 1, 1, 1, 1,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
- } ;
-
-static yyconst flex_int16_t yy_base[180] =
- { 0,
- 0, 0, 193, 194, 194, 194, 0, 194, 194, 0,
- 190, 194, 0, 177, 32, 37, 32, 163, 174, 170,
- 164, 171, 174, 169, 149, 15, 22, 17, 135, 146,
- 142, 136, 143, 146, 141, 0, 0, 194, 0, 161,
- 159, 158, 153, 147, 156, 143, 149, 148, 141, 150,
- 141, 135, 138, 127, 125, 124, 119, 113, 122, 109,
- 115, 114, 107, 116, 107, 101, 104, 43, 136, 135,
- 130, 129, 0, 119, 123, 118, 114, 118, 119, 122,
- 124, 25, 104, 103, 98, 97, 0, 87, 91, 86,
- 82, 86, 87, 90, 92, 105, 100, 97, 94, 93,
-
- 105, 106, 102, 0, 0, 0, 104, 0, 92, 75,
- 70, 67, 64, 63, 75, 76, 72, 0, 0, 0,
- 74, 0, 62, 91, 88, 0, 86, 85, 73, 85,
- 79, 83, 70, 62, 59, 0, 57, 56, 44, 56,
- 50, 54, 41, 0, 0, 0, 0, 63, 58, 59,
- 67, 66, 0, 0, 0, 0, 38, 33, 34, 42,
- 41, 51, 0, 0, 0, 0, 30, 0, 0, 0,
- 0, 43, 21, 0, 0, 194, 65, 66, 69
- } ;
-
-static yyconst flex_int16_t yy_def[180] =
- { 0,
- 176, 1, 176, 176, 176, 176, 177, 176, 176, 178,
- 176, 176, 179, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 178, 176, 179, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
-
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
- 177, 177, 177, 177, 177, 0, 176, 176, 176
- } ;
-
-static yyconst flex_int16_t yy_nxt[245] =
- { 0,
- 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
- 14, 7, 15, 16, 17, 18, 19, 7, 20, 7,
- 7, 21, 7, 22, 23, 7, 7, 24, 7, 7,
- 25, 7, 26, 27, 28, 29, 30, 7, 31, 7,
- 7, 32, 7, 33, 34, 7, 7, 35, 7, 7,
- 41, 43, 45, 55, 44, 42, 57, 59, 56, 58,
- 46, 96, 97, 110, 111, 60, 37, 36, 37, 39,
- 175, 39, 174, 173, 172, 171, 170, 169, 168, 167,
- 166, 165, 164, 163, 162, 161, 160, 159, 158, 157,
- 156, 155, 154, 153, 152, 151, 150, 149, 148, 147,
-
- 146, 145, 144, 143, 142, 141, 140, 139, 138, 137,
- 136, 135, 134, 133, 132, 131, 130, 129, 128, 127,
- 126, 125, 124, 123, 122, 121, 120, 119, 118, 117,
- 116, 115, 114, 113, 112, 109, 108, 107, 106, 105,
- 104, 103, 102, 101, 100, 99, 98, 95, 94, 93,
- 92, 91, 90, 89, 88, 87, 86, 85, 84, 83,
- 82, 81, 80, 79, 78, 77, 76, 75, 74, 73,
- 72, 71, 70, 69, 68, 67, 66, 65, 64, 63,
- 62, 61, 54, 53, 52, 51, 50, 49, 48, 47,
- 40, 38, 176, 3, 176, 176, 176, 176, 176, 176,
-
- 176, 176, 176, 176, 176, 176, 176, 176, 176, 176,
- 176, 176, 176, 176, 176, 176, 176, 176, 176, 176,
- 176, 176, 176, 176, 176, 176, 176, 176, 176, 176,
- 176, 176, 176, 176, 176, 176, 176, 176, 176, 176,
- 176, 176, 176, 176
- } ;
-
-static yyconst flex_int16_t yy_chk[245] =
- { 0,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 15, 16, 17, 26, 16, 15, 27, 28, 26, 27,
- 17, 68, 68, 82, 82, 28, 178, 177, 178, 179,
- 173, 179, 172, 167, 162, 161, 160, 159, 158, 157,
- 152, 151, 150, 149, 148, 143, 142, 141, 140, 139,
- 138, 137, 135, 134, 133, 132, 131, 130, 129, 128,
-
- 127, 125, 124, 123, 121, 117, 116, 115, 114, 113,
- 112, 111, 110, 109, 107, 103, 102, 101, 100, 99,
- 98, 97, 96, 95, 94, 93, 92, 91, 90, 89,
- 88, 86, 85, 84, 83, 81, 80, 79, 78, 77,
- 76, 75, 74, 72, 71, 70, 69, 67, 66, 65,
- 64, 63, 62, 61, 60, 59, 58, 57, 56, 55,
- 54, 53, 52, 51, 50, 49, 48, 47, 46, 45,
- 44, 43, 42, 41, 40, 35, 34, 33, 32, 31,
- 30, 29, 25, 24, 23, 22, 21, 20, 19, 18,
- 14, 11, 3, 176, 176, 176, 176, 176, 176, 176,
-
- 176, 176, 176, 176, 176, 176, 176, 176, 176, 176,
- 176, 176, 176, 176, 176, 176, 176, 176, 176, 176,
- 176, 176, 176, 176, 176, 176, 176, 176, 176, 176,
- 176, 176, 176, 176, 176, 176, 176, 176, 176, 176,
- 176, 176, 176, 176
- } ;
-
-static yy_state_type yy_last_accepting_state;
-static char *yy_last_accepting_cpos;
-
-extern int yy_flex_debug;
-int yy_flex_debug = 0;
-
-/* The intent behind this definition is that it'll catch
- * any uses of REJECT which flex missed.
- */
-#define REJECT reject_used_but_not_detected
-#define yymore() yymore_used_but_not_detected
-#define YY_MORE_ADJ 0
-#define YY_RESTORE_YY_MORE_OFFSET
-char *yytext;
-#line 1 "arlex.l"
-#define YY_NO_INPUT 1
-#line 4 "arlex.l"
-/* arlex.l - Strange script language lexer */
-
-/* Copyright 1992, 1997, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2011
- Free Software Foundation, Inc.
-
- This file is part of GNU Binutils.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
- MA 02110-1301, USA. */
-
-
-/* Contributed by Steve Chamberlain . */
-
-#define DONTDECLARE_MALLOC
-#include "ansidecl.h"
-#include "libiberty.h"
-#include "arparse.h"
-
-#ifndef YY_NO_UNPUT
-#define YY_NO_UNPUT
-#endif
-
-extern int yylex (void);
-
-int linenumber;
-#line 599 "arlex.c"
-
-#define INITIAL 0
-
-#ifndef YY_NO_UNISTD_H
-/* Special case for "unistd.h", since it is non-ANSI. We include it way
- * down here because we want the user's section 1 to have been scanned first.
- * The user has a chance to override it with an option.
- */
-#include
-#endif
-
-#ifndef YY_EXTRA_TYPE
-#define YY_EXTRA_TYPE void *
-#endif
-
-static int yy_init_globals (void );
-
-/* Accessor methods to globals.
- These are made visible to non-reentrant scanners for convenience. */
-
-int yylex_destroy (void );
-
-int yyget_debug (void );
-
-void yyset_debug (int debug_flag );
-
-YY_EXTRA_TYPE yyget_extra (void );
-
-void yyset_extra (YY_EXTRA_TYPE user_defined );
-
-FILE *yyget_in (void );
-
-void yyset_in (FILE * in_str );
-
-FILE *yyget_out (void );
-
-void yyset_out (FILE * out_str );
-
-yy_size_t yyget_leng (void );
-
-char *yyget_text (void );
-
-int yyget_lineno (void );
-
-void yyset_lineno (int line_number );
-
-/* Macros after this point can all be overridden by user definitions in
- * section 1.
- */
-
-#ifndef YY_SKIP_YYWRAP
-#ifdef __cplusplus
-extern "C" int yywrap (void );
-#else
-extern int yywrap (void );
-#endif
-#endif
-
-#ifndef yytext_ptr
-static void yy_flex_strncpy (char *,yyconst char *,int );
-#endif
-
-#ifdef YY_NEED_STRLEN
-static int yy_flex_strlen (yyconst char * );
-#endif
-
-#ifndef YY_NO_INPUT
-
-#ifdef __cplusplus
-static int yyinput (void );
-#else
-static int input (void );
-#endif
-
-#endif
-
-/* Amount of stuff to slurp up with each read. */
-#ifndef YY_READ_BUF_SIZE
-#define YY_READ_BUF_SIZE 8192
-#endif
-
-/* Copy whatever the last rule matched to the standard output. */
-#ifndef ECHO
-/* This used to be an fputs(), but since the string might contain NUL's,
- * we now use fwrite().
- */
-#define ECHO fwrite( yytext, yyleng, 1, yyout )
-#endif
-
-/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
- * is returned in "result".
- */
-#ifndef YY_INPUT
-#define YY_INPUT(buf,result,max_size) \
- if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
- { \
- int c = '*'; \
- yy_size_t n; \
- for ( n = 0; n < max_size && \
- (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
- buf[n] = (char) c; \
- if ( c == '\n' ) \
- buf[n++] = (char) c; \
- if ( c == EOF && ferror( yyin ) ) \
- YY_FATAL_ERROR( "input in flex scanner failed" ); \
- result = n; \
- } \
- else \
- { \
- errno=0; \
- while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
- { \
- if( errno != EINTR) \
- { \
- YY_FATAL_ERROR( "input in flex scanner failed" ); \
- break; \
- } \
- errno=0; \
- clearerr(yyin); \
- } \
- }\
-\
-
-#endif
-
-/* No semi-colon after return; correct usage is to write "yyterminate();" -
- * we don't want an extra ';' after the "return" because that will cause
- * some compilers to complain about unreachable statements.
- */
-#ifndef yyterminate
-#define yyterminate() return YY_NULL
-#endif
-
-/* Number of entries by which start-condition stack grows. */
-#ifndef YY_START_STACK_INCR
-#define YY_START_STACK_INCR 25
-#endif
-
-/* Report a fatal error. */
-#ifndef YY_FATAL_ERROR
-#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
-#endif
-
-/* end tables serialization structures and prototypes */
-
-/* Default declaration of generated scanner - a define so the user can
- * easily add parameters.
- */
-#ifndef YY_DECL
-#define YY_DECL_IS_OURS 1
-
-extern int yylex (void);
-
-#define YY_DECL int yylex (void)
-#endif /* !YY_DECL */
-
-/* Code executed at the beginning of each rule, after yytext and yyleng
- * have been set up.
- */
-#ifndef YY_USER_ACTION
-#define YY_USER_ACTION
-#endif
-
-/* Code executed at the end of each rule. */
-#ifndef YY_BREAK
-#define YY_BREAK break;
-#endif
-
-#define YY_RULE_SETUP \
- YY_USER_ACTION
-
-/** The main scanner function which does all the work.
- */
-YY_DECL
-{
- register yy_state_type yy_current_state;
- register char *yy_cp, *yy_bp;
- register int yy_act;
-
-#line 46 "arlex.l"
-
-
-#line 782 "arlex.c"
-
- if ( !(yy_init) )
- {
- (yy_init) = 1;
-
-#ifdef YY_USER_INIT
- YY_USER_INIT;
-#endif
-
- if ( ! (yy_start) )
- (yy_start) = 1; /* first start state */
-
- if ( ! yyin )
- yyin = stdin;
-
- if ( ! yyout )
- yyout = stdout;
-
- if ( ! YY_CURRENT_BUFFER ) {
- yyensure_buffer_stack ();
- YY_CURRENT_BUFFER_LVALUE =
- yy_create_buffer(yyin,YY_BUF_SIZE );
- }
-
- yy_load_buffer_state( );
- }
-
- while ( 1 ) /* loops until end-of-file is reached */
- {
- yy_cp = (yy_c_buf_p);
-
- /* Support of yytext. */
- *yy_cp = (yy_hold_char);
-
- /* yy_bp points to the position in yy_ch_buf of the start of
- * the current run.
- */
- yy_bp = yy_cp;
-
- yy_current_state = (yy_start);
-yy_match:
- do
- {
- register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
- if ( yy_accept[yy_current_state] )
- {
- (yy_last_accepting_state) = yy_current_state;
- (yy_last_accepting_cpos) = yy_cp;
- }
- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
- {
- yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 177 )
- yy_c = yy_meta[(unsigned int) yy_c];
- }
- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
- ++yy_cp;
- }
- while ( yy_base[yy_current_state] != 194 );
-
-yy_find_action:
- yy_act = yy_accept[yy_current_state];
- if ( yy_act == 0 )
- { /* have to back up */
- yy_cp = (yy_last_accepting_cpos);
- yy_current_state = (yy_last_accepting_state);
- yy_act = yy_accept[yy_current_state];
- }
-
- YY_DO_BEFORE_ACTION;
-
-do_action: /* This label is used only to access EOF actions. */
-
- switch ( yy_act )
- { /* beginning of action switch */
- case 0: /* must back up */
- /* undo the effects of YY_DO_BEFORE_ACTION */
- *yy_cp = (yy_hold_char);
- yy_cp = (yy_last_accepting_cpos);
- yy_current_state = (yy_last_accepting_state);
- goto yy_find_action;
-
-case 1:
-YY_RULE_SETUP
-#line 48 "arlex.l"
-{ return ADDLIB; }
- YY_BREAK
-case 2:
-YY_RULE_SETUP
-#line 49 "arlex.l"
-{ return ADDMOD; }
- YY_BREAK
-case 3:
-YY_RULE_SETUP
-#line 50 "arlex.l"
-{ return CLEAR; }
- YY_BREAK
-case 4:
-YY_RULE_SETUP
-#line 51 "arlex.l"
-{ return CREATE; }
- YY_BREAK
-case 5:
-YY_RULE_SETUP
-#line 52 "arlex.l"
-{ return DELETE; }
- YY_BREAK
-case 6:
-YY_RULE_SETUP
-#line 53 "arlex.l"
-{ return DIRECTORY; }
- YY_BREAK
-case 7:
-YY_RULE_SETUP
-#line 54 "arlex.l"
-{ return END; }
- YY_BREAK
-case 8:
-YY_RULE_SETUP
-#line 55 "arlex.l"
-{ return EXTRACT; }
- YY_BREAK
-case 9:
-YY_RULE_SETUP
-#line 56 "arlex.l"
-{ return FULLDIR; }
- YY_BREAK
-case 10:
-YY_RULE_SETUP
-#line 57 "arlex.l"
-{ return HELP; }
- YY_BREAK
-case 11:
-YY_RULE_SETUP
-#line 58 "arlex.l"
-{ return LIST; }
- YY_BREAK
-case 12:
-YY_RULE_SETUP
-#line 59 "arlex.l"
-{ return OPEN; }
- YY_BREAK
-case 13:
-YY_RULE_SETUP
-#line 60 "arlex.l"
-{ return REPLACE; }
- YY_BREAK
-case 14:
-YY_RULE_SETUP
-#line 61 "arlex.l"
-{ return VERBOSE; }
- YY_BREAK
-case 15:
-YY_RULE_SETUP
-#line 62 "arlex.l"
-{ return SAVE; }
- YY_BREAK
-case 16:
-YY_RULE_SETUP
-#line 63 "arlex.l"
-{ return ADDLIB; }
- YY_BREAK
-case 17:
-YY_RULE_SETUP
-#line 64 "arlex.l"
-{ return ADDMOD; }
- YY_BREAK
-case 18:
-YY_RULE_SETUP
-#line 65 "arlex.l"
-{ return CLEAR; }
- YY_BREAK
-case 19:
-YY_RULE_SETUP
-#line 66 "arlex.l"
-{ return CREATE; }
- YY_BREAK
-case 20:
-YY_RULE_SETUP
-#line 67 "arlex.l"
-{ return DELETE; }
- YY_BREAK
-case 21:
-YY_RULE_SETUP
-#line 68 "arlex.l"
-{ return DIRECTORY; }
- YY_BREAK
-case 22:
-YY_RULE_SETUP
-#line 69 "arlex.l"
-{ return END; }
- YY_BREAK
-case 23:
-YY_RULE_SETUP
-#line 70 "arlex.l"
-{ return EXTRACT; }
- YY_BREAK
-case 24:
-YY_RULE_SETUP
-#line 71 "arlex.l"
-{ return FULLDIR; }
- YY_BREAK
-case 25:
-YY_RULE_SETUP
-#line 72 "arlex.l"
-{ return HELP; }
- YY_BREAK
-case 26:
-YY_RULE_SETUP
-#line 73 "arlex.l"
-{ return LIST; }
- YY_BREAK
-case 27:
-YY_RULE_SETUP
-#line 74 "arlex.l"
-{ return OPEN; }
- YY_BREAK
-case 28:
-YY_RULE_SETUP
-#line 75 "arlex.l"
-{ return REPLACE; }
- YY_BREAK
-case 29:
-YY_RULE_SETUP
-#line 76 "arlex.l"
-{ return VERBOSE; }
- YY_BREAK
-case 30:
-YY_RULE_SETUP
-#line 77 "arlex.l"
-{ return SAVE; }
- YY_BREAK
-case 31:
-/* rule 31 can match eol */
-YY_RULE_SETUP
-#line 78 "arlex.l"
-{ linenumber ++; }
- YY_BREAK
-case 32:
-YY_RULE_SETUP
-#line 79 "arlex.l"
-{ return '('; }
- YY_BREAK
-case 33:
-YY_RULE_SETUP
-#line 80 "arlex.l"
-{ return ')'; }
- YY_BREAK
-case 34:
-YY_RULE_SETUP
-#line 81 "arlex.l"
-{ return ','; }
- YY_BREAK
-case 35:
-YY_RULE_SETUP
-#line 82 "arlex.l"
-{
- yylval.name = xstrdup (yytext);
- return FILENAME;
- }
- YY_BREAK
-case 36:
-YY_RULE_SETUP
-#line 86 "arlex.l"
-{ }
- YY_BREAK
-case 37:
-YY_RULE_SETUP
-#line 87 "arlex.l"
-{ }
- YY_BREAK
-case 38:
-YY_RULE_SETUP
-#line 88 "arlex.l"
-{ }
- YY_BREAK
-case 39:
-/* rule 39 can match eol */
-YY_RULE_SETUP
-#line 89 "arlex.l"
-{ linenumber ++; return NEWLINE; }
- YY_BREAK
-case 40:
-YY_RULE_SETUP
-#line 91 "arlex.l"
-ECHO;
- YY_BREAK
-#line 1070 "arlex.c"
-case YY_STATE_EOF(INITIAL):
- yyterminate();
-
- case YY_END_OF_BUFFER:
- {
- /* Amount of text matched not including the EOB char. */
- int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
-
- /* Undo the effects of YY_DO_BEFORE_ACTION. */
- *yy_cp = (yy_hold_char);
- YY_RESTORE_YY_MORE_OFFSET
-
- if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
- {
- /* We're scanning a new file or input source. It's
- * possible that this happened because the user
- * just pointed yyin at a new source and called
- * yylex(). If so, then we have to assure
- * consistency between YY_CURRENT_BUFFER and our
- * globals. Here is the right place to do so, because
- * this is the first action (other than possibly a
- * back-up) that will match for the new input source.
- */
- (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
- YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
- YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
- }
-
- /* Note that here we test for yy_c_buf_p "<=" to the position
- * of the first EOB in the buffer, since yy_c_buf_p will
- * already have been incremented past the NUL character
- * (since all states make transitions on EOB to the
- * end-of-buffer state). Contrast this with the test
- * in input().
- */
- if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
- { /* This was really a NUL. */
- yy_state_type yy_next_state;
-
- (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
-
- yy_current_state = yy_get_previous_state( );
-
- /* Okay, we're now positioned to make the NUL
- * transition. We couldn't have
- * yy_get_previous_state() go ahead and do it
- * for us because it doesn't know how to deal
- * with the possibility of jamming (and we don't
- * want to build jamming into it because then it
- * will run more slowly).
- */
-
- yy_next_state = yy_try_NUL_trans( yy_current_state );
-
- yy_bp = (yytext_ptr) + YY_MORE_ADJ;
-
- if ( yy_next_state )
- {
- /* Consume the NUL. */
- yy_cp = ++(yy_c_buf_p);
- yy_current_state = yy_next_state;
- goto yy_match;
- }
-
- else
- {
- yy_cp = (yy_c_buf_p);
- goto yy_find_action;
- }
- }
-
- else switch ( yy_get_next_buffer( ) )
- {
- case EOB_ACT_END_OF_FILE:
- {
- (yy_did_buffer_switch_on_eof) = 0;
-
- if ( yywrap( ) )
- {
- /* Note: because we've taken care in
- * yy_get_next_buffer() to have set up
- * yytext, we can now set up
- * yy_c_buf_p so that if some total
- * hoser (like flex itself) wants to
- * call the scanner after we return the
- * YY_NULL, it'll still work - another
- * YY_NULL will get returned.
- */
- (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
-
- yy_act = YY_STATE_EOF(YY_START);
- goto do_action;
- }
-
- else
- {
- if ( ! (yy_did_buffer_switch_on_eof) )
- YY_NEW_FILE;
- }
- break;
- }
-
- case EOB_ACT_CONTINUE_SCAN:
- (yy_c_buf_p) =
- (yytext_ptr) + yy_amount_of_matched_text;
-
- yy_current_state = yy_get_previous_state( );
-
- yy_cp = (yy_c_buf_p);
- yy_bp = (yytext_ptr) + YY_MORE_ADJ;
- goto yy_match;
-
- case EOB_ACT_LAST_MATCH:
- (yy_c_buf_p) =
- &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
-
- yy_current_state = yy_get_previous_state( );
-
- yy_cp = (yy_c_buf_p);
- yy_bp = (yytext_ptr) + YY_MORE_ADJ;
- goto yy_find_action;
- }
- break;
- }
-
- default:
- YY_FATAL_ERROR(
- "fatal flex scanner internal error--no action found" );
- } /* end of action switch */
- } /* end of scanning one token */
-} /* end of yylex */
-
-/* yy_get_next_buffer - try to read in a new buffer
- *
- * Returns a code representing an action:
- * EOB_ACT_LAST_MATCH -
- * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
- * EOB_ACT_END_OF_FILE - end of file
- */
-static int yy_get_next_buffer (void)
-{
- register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
- register char *source = (yytext_ptr);
- register int number_to_move, i;
- int ret_val;
-
- if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
- YY_FATAL_ERROR(
- "fatal flex scanner internal error--end of buffer missed" );
-
- if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
- { /* Don't try to fill the buffer, so this is an EOF. */
- if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
- {
- /* We matched a single character, the EOB, so
- * treat this as a final EOF.
- */
- return EOB_ACT_END_OF_FILE;
- }
-
- else
- {
- /* We matched some text prior to the EOB, first
- * process it.
- */
- return EOB_ACT_LAST_MATCH;
- }
- }
-
- /* Try to read more data. */
-
- /* First move last chars to start of buffer. */
- number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
-
- for ( i = 0; i < number_to_move; ++i )
- *(dest++) = *(source++);
-
- if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
- /* don't do the read, it's not guaranteed to return an EOF,
- * just force an EOF
- */
- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
-
- else
- {
- yy_size_t num_to_read =
- YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
-
- while ( num_to_read <= 0 )
- { /* Not enough room in the buffer - grow it. */
-
- /* just a shorter name for the current buffer */
- YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
-
- int yy_c_buf_p_offset =
- (int) ((yy_c_buf_p) - b->yy_ch_buf);
-
- if ( b->yy_is_our_buffer )
- {
- yy_size_t new_size = b->yy_buf_size * 2;
-
- if ( new_size <= 0 )
- b->yy_buf_size += b->yy_buf_size / 8;
- else
- b->yy_buf_size *= 2;
-
- b->yy_ch_buf = (char *)
- /* Include room in for 2 EOB chars. */
- yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 );
- }
- else
- /* Can't grow it, we don't own it. */
- b->yy_ch_buf = 0;
-
- if ( ! b->yy_ch_buf )
- YY_FATAL_ERROR(
- "fatal error - scanner input buffer overflow" );
-
- (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
-
- num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
- number_to_move - 1;
-
- }
-
- if ( num_to_read > YY_READ_BUF_SIZE )
- num_to_read = YY_READ_BUF_SIZE;
-
- /* Read in more data. */
- YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
- (yy_n_chars), num_to_read );
-
- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
- }
-
- if ( (yy_n_chars) == 0 )
- {
- if ( number_to_move == YY_MORE_ADJ )
- {
- ret_val = EOB_ACT_END_OF_FILE;
- yyrestart(yyin );
- }
-
- else
- {
- ret_val = EOB_ACT_LAST_MATCH;
- YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
- YY_BUFFER_EOF_PENDING;
- }
- }
-
- else
- ret_val = EOB_ACT_CONTINUE_SCAN;
-
- if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
- /* Extend the array by 50%, plus the number we really need. */
- yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size );
- if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
- YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
- }
-
- (yy_n_chars) += number_to_move;
- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
-
- (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
-
- return ret_val;
-}
-
-/* yy_get_previous_state - get the state just before the EOB char was reached */
-
- static yy_state_type yy_get_previous_state (void)
-{
- register yy_state_type yy_current_state;
- register char *yy_cp;
-
- yy_current_state = (yy_start);
-
- for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
- {
- register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
- if ( yy_accept[yy_current_state] )
- {
- (yy_last_accepting_state) = yy_current_state;
- (yy_last_accepting_cpos) = yy_cp;
- }
- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
- {
- yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 177 )
- yy_c = yy_meta[(unsigned int) yy_c];
- }
- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
- }
-
- return yy_current_state;
-}
-
-/* yy_try_NUL_trans - try to make a transition on the NUL character
- *
- * synopsis
- * next_state = yy_try_NUL_trans( current_state );
- */
- static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
-{
- register int yy_is_jam;
- register char *yy_cp = (yy_c_buf_p);
-
- register YY_CHAR yy_c = 1;
- if ( yy_accept[yy_current_state] )
- {
- (yy_last_accepting_state) = yy_current_state;
- (yy_last_accepting_cpos) = yy_cp;
- }
- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
- {
- yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 177 )
- yy_c = yy_meta[(unsigned int) yy_c];
- }
- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
- yy_is_jam = (yy_current_state == 176);
-
- return yy_is_jam ? 0 : yy_current_state;
-}
-
-#ifndef YY_NO_INPUT
-#ifdef __cplusplus
- static int yyinput (void)
-#else
- static int input (void)
-#endif
-
-{
- int c;
-
- *(yy_c_buf_p) = (yy_hold_char);
-
- if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
- {
- /* yy_c_buf_p now points to the character we want to return.
- * If this occurs *before* the EOB characters, then it's a
- * valid NUL; if not, then we've hit the end of the buffer.
- */
- if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
- /* This was really a NUL. */
- *(yy_c_buf_p) = '\0';
-
- else
- { /* need more input */
- yy_size_t offset = (yy_c_buf_p) - (yytext_ptr);
- ++(yy_c_buf_p);
-
- switch ( yy_get_next_buffer( ) )
- {
- case EOB_ACT_LAST_MATCH:
- /* This happens because yy_g_n_b()
- * sees that we've accumulated a
- * token and flags that we need to
- * try matching the token before
- * proceeding. But for input(),
- * there's no matching to consider.
- * So convert the EOB_ACT_LAST_MATCH
- * to EOB_ACT_END_OF_FILE.
- */
-
- /* Reset buffer status. */
- yyrestart(yyin );
-
- /*FALLTHROUGH*/
-
- case EOB_ACT_END_OF_FILE:
- {
- if ( yywrap( ) )
- return 0;
-
- if ( ! (yy_did_buffer_switch_on_eof) )
- YY_NEW_FILE;
-#ifdef __cplusplus
- return yyinput();
-#else
- return input();
-#endif
- }
-
- case EOB_ACT_CONTINUE_SCAN:
- (yy_c_buf_p) = (yytext_ptr) + offset;
- break;
- }
- }
- }
-
- c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */
- *(yy_c_buf_p) = '\0'; /* preserve yytext */
- (yy_hold_char) = *++(yy_c_buf_p);
-
- return c;
-}
-#endif /* ifndef YY_NO_INPUT */
-
-/** Immediately switch to a different input stream.
- * @param input_file A readable stream.
- *
- * @note This function does not reset the start condition to @c INITIAL .
- */
- void yyrestart (FILE * input_file )
-{
-
- if ( ! YY_CURRENT_BUFFER ){
- yyensure_buffer_stack ();
- YY_CURRENT_BUFFER_LVALUE =
- yy_create_buffer(yyin,YY_BUF_SIZE );
- }
-
- yy_init_buffer(YY_CURRENT_BUFFER,input_file );
- yy_load_buffer_state( );
-}
-
-/** Switch to a different input buffer.
- * @param new_buffer The new input buffer.
- *
- */
- void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer )
-{
-
- /* TODO. We should be able to replace this entire function body
- * with
- * yypop_buffer_state();
- * yypush_buffer_state(new_buffer);
- */
- yyensure_buffer_stack ();
- if ( YY_CURRENT_BUFFER == new_buffer )
- return;
-
- if ( YY_CURRENT_BUFFER )
- {
- /* Flush out information for old buffer. */
- *(yy_c_buf_p) = (yy_hold_char);
- YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
- }
-
- YY_CURRENT_BUFFER_LVALUE = new_buffer;
- yy_load_buffer_state( );
-
- /* We don't actually know whether we did this switch during
- * EOF (yywrap()) processing, but the only time this flag
- * is looked at is after yywrap() is called, so it's safe
- * to go ahead and always set it.
- */
- (yy_did_buffer_switch_on_eof) = 1;
-}
-
-static void yy_load_buffer_state (void)
-{
- (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
- (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
- yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
- (yy_hold_char) = *(yy_c_buf_p);
-}
-
-/** Allocate and initialize an input buffer state.
- * @param file A readable stream.
- * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
- *
- * @return the allocated buffer state.
- */
- YY_BUFFER_STATE yy_create_buffer (FILE * file, int size )
-{
- YY_BUFFER_STATE b;
-
- b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) );
- if ( ! b )
- YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
-
- b->yy_buf_size = size;
-
- /* yy_ch_buf has to be 2 characters longer than the size given because
- * we need to put in 2 end-of-buffer characters.
- */
- b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 );
- if ( ! b->yy_ch_buf )
- YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
-
- b->yy_is_our_buffer = 1;
-
- yy_init_buffer(b,file );
-
- return b;
-}
-
-/** Destroy the buffer.
- * @param b a buffer created with yy_create_buffer()
- *
- */
- void yy_delete_buffer (YY_BUFFER_STATE b )
-{
-
- if ( ! b )
- return;
-
- if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
- YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
-
- if ( b->yy_is_our_buffer )
- yyfree((void *) b->yy_ch_buf );
-
- yyfree((void *) b );
-}
-
-#ifndef __cplusplus
-extern int isatty (int );
-#endif /* __cplusplus */
-
-/* Initializes or reinitializes a buffer.
- * This function is sometimes called more than once on the same buffer,
- * such as during a yyrestart() or at EOF.
- */
- static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file )
-
-{
- int oerrno = errno;
-
- yy_flush_buffer(b );
-
- b->yy_input_file = file;
- b->yy_fill_buffer = 1;
-
- /* If b is the current buffer, then yy_init_buffer was _probably_
- * called from yyrestart() or through yy_get_next_buffer.
- * In that case, we don't want to reset the lineno or column.
- */
- if (b != YY_CURRENT_BUFFER){
- b->yy_bs_lineno = 1;
- b->yy_bs_column = 0;
- }
-
- b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
-
- errno = oerrno;
-}
-
-/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
- * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
- *
- */
- void yy_flush_buffer (YY_BUFFER_STATE b )
-{
- if ( ! b )
- return;
-
- b->yy_n_chars = 0;
-
- /* We always need two end-of-buffer characters. The first causes
- * a transition to the end-of-buffer state. The second causes
- * a jam in that state.
- */
- b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
- b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
-
- b->yy_buf_pos = &b->yy_ch_buf[0];
-
- b->yy_at_bol = 1;
- b->yy_buffer_status = YY_BUFFER_NEW;
-
- if ( b == YY_CURRENT_BUFFER )
- yy_load_buffer_state( );
-}
-
-/** Pushes the new state onto the stack. The new state becomes
- * the current state. This function will allocate the stack
- * if necessary.
- * @param new_buffer The new state.
- *
- */
-void yypush_buffer_state (YY_BUFFER_STATE new_buffer )
-{
- if (new_buffer == NULL)
- return;
-
- yyensure_buffer_stack();
-
- /* This block is copied from yy_switch_to_buffer. */
- if ( YY_CURRENT_BUFFER )
- {
- /* Flush out information for old buffer. */
- *(yy_c_buf_p) = (yy_hold_char);
- YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
- }
-
- /* Only push if top exists. Otherwise, replace top. */
- if (YY_CURRENT_BUFFER)
- (yy_buffer_stack_top)++;
- YY_CURRENT_BUFFER_LVALUE = new_buffer;
-
- /* copied from yy_switch_to_buffer. */
- yy_load_buffer_state( );
- (yy_did_buffer_switch_on_eof) = 1;
-}
-
-/** Removes and deletes the top of the stack, if present.
- * The next element becomes the new top.
- *
- */
-void yypop_buffer_state (void)
-{
- if (!YY_CURRENT_BUFFER)
- return;
-
- yy_delete_buffer(YY_CURRENT_BUFFER );
- YY_CURRENT_BUFFER_LVALUE = NULL;
- if ((yy_buffer_stack_top) > 0)
- --(yy_buffer_stack_top);
-
- if (YY_CURRENT_BUFFER) {
- yy_load_buffer_state( );
- (yy_did_buffer_switch_on_eof) = 1;
- }
-}
-
-/* Allocates the stack if it does not exist.
- * Guarantees space for at least one push.
- */
-static void yyensure_buffer_stack (void)
-{
- yy_size_t num_to_alloc;
-
- if (!(yy_buffer_stack)) {
-
- /* First allocation is just for 2 elements, since we don't know if this
- * scanner will even need a stack. We use 2 instead of 1 to avoid an
- * immediate realloc on the next call.
- */
- num_to_alloc = 1;
- (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc
- (num_to_alloc * sizeof(struct yy_buffer_state*)
- );
- if ( ! (yy_buffer_stack) )
- YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
-
- memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
-
- (yy_buffer_stack_max) = num_to_alloc;
- (yy_buffer_stack_top) = 0;
- return;
- }
-
- if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
-
- /* Increase the buffer to prepare for a possible push. */
- int grow_size = 8 /* arbitrary grow size */;
-
- num_to_alloc = (yy_buffer_stack_max) + grow_size;
- (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc
- ((yy_buffer_stack),
- num_to_alloc * sizeof(struct yy_buffer_state*)
- );
- if ( ! (yy_buffer_stack) )
- YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
-
- /* zero only the new slots.*/
- memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
- (yy_buffer_stack_max) = num_to_alloc;
- }
-}
-
-/** Setup the input buffer state to scan directly from a user-specified character buffer.
- * @param base the character buffer
- * @param size the size in bytes of the character buffer
- *
- * @return the newly allocated buffer state object.
- */
-YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size )
-{
- YY_BUFFER_STATE b;
-
- if ( size < 2 ||
- base[size-2] != YY_END_OF_BUFFER_CHAR ||
- base[size-1] != YY_END_OF_BUFFER_CHAR )
- /* They forgot to leave room for the EOB's. */
- return 0;
-
- b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) );
- if ( ! b )
- YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
-
- b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
- b->yy_buf_pos = b->yy_ch_buf = base;
- b->yy_is_our_buffer = 0;
- b->yy_input_file = 0;
- b->yy_n_chars = b->yy_buf_size;
- b->yy_is_interactive = 0;
- b->yy_at_bol = 1;
- b->yy_fill_buffer = 0;
- b->yy_buffer_status = YY_BUFFER_NEW;
-
- yy_switch_to_buffer(b );
-
- return b;
-}
-
-/** Setup the input buffer state to scan a string. The next call to yylex() will
- * scan from a @e copy of @a str.
- * @param yystr a NUL-terminated string to scan
- *
- * @return the newly allocated buffer state object.
- * @note If you want to scan bytes that may contain NUL values, then use
- * yy_scan_bytes() instead.
- */
-YY_BUFFER_STATE yy_scan_string (yyconst char * yystr )
-{
-
- return yy_scan_bytes(yystr,strlen(yystr) );
-}
-
-/** Setup the input buffer state to scan the given bytes. The next call to yylex() will
- * scan from a @e copy of @a bytes.
- * @param bytes the byte buffer to scan
- * @param len the number of bytes in the buffer pointed to by @a bytes.
- *
- * @return the newly allocated buffer state object.
- */
-YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len )
-{
- YY_BUFFER_STATE b;
- char *buf;
- yy_size_t n, i;
-
- /* Get memory for full buffer, including space for trailing EOB's. */
- n = _yybytes_len + 2;
- buf = (char *) yyalloc(n );
- if ( ! buf )
- YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
-
- for ( i = 0; i < _yybytes_len; ++i )
- buf[i] = yybytes[i];
-
- buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
-
- b = yy_scan_buffer(buf,n );
- if ( ! b )
- YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
-
- /* It's okay to grow etc. this buffer, and we should throw it
- * away when we're done.
- */
- b->yy_is_our_buffer = 1;
-
- return b;
-}
-
-#ifndef YY_EXIT_FAILURE
-#define YY_EXIT_FAILURE 2
-#endif
-
-static void yy_fatal_error (yyconst char* msg )
-{
- (void) fprintf( stderr, "%s\n", msg );
- exit( YY_EXIT_FAILURE );
-}
-
-/* Redefine yyless() so it works in section 3 code. */
-
-#undef yyless
-#define yyless(n) \
- do \
- { \
- /* Undo effects of setting up yytext. */ \
- int yyless_macro_arg = (n); \
- YY_LESS_LINENO(yyless_macro_arg);\
- yytext[yyleng] = (yy_hold_char); \
- (yy_c_buf_p) = yytext + yyless_macro_arg; \
- (yy_hold_char) = *(yy_c_buf_p); \
- *(yy_c_buf_p) = '\0'; \
- yyleng = yyless_macro_arg; \
- } \
- while ( 0 )
-
-/* Accessor methods (get/set functions) to struct members. */
-
-/** Get the current line number.
- *
- */
-int yyget_lineno (void)
-{
-
- return yylineno;
-}
-
-/** Get the input stream.
- *
- */
-FILE *yyget_in (void)
-{
- return yyin;
-}
-
-/** Get the output stream.
- *
- */
-FILE *yyget_out (void)
-{
- return yyout;
-}
-
-/** Get the length of the current token.
- *
- */
-yy_size_t yyget_leng (void)
-{
- return yyleng;
-}
-
-/** Get the current token.
- *
- */
-
-char *yyget_text (void)
-{
- return yytext;
-}
-
-/** Set the current line number.
- * @param line_number
- *
- */
-void yyset_lineno (int line_number )
-{
-
- yylineno = line_number;
-}
-
-/** Set the input stream. This does not discard the current
- * input buffer.
- * @param in_str A readable stream.
- *
- * @see yy_switch_to_buffer
- */
-void yyset_in (FILE * in_str )
-{
- yyin = in_str ;
-}
-
-void yyset_out (FILE * out_str )
-{
- yyout = out_str ;
-}
-
-int yyget_debug (void)
-{
- return yy_flex_debug;
-}
-
-void yyset_debug (int bdebug )
-{
- yy_flex_debug = bdebug ;
-}
-
-static int yy_init_globals (void)
-{
- /* Initialization is the same as for the non-reentrant scanner.
- * This function is called from yylex_destroy(), so don't allocate here.
- */
-
- (yy_buffer_stack) = 0;
- (yy_buffer_stack_top) = 0;
- (yy_buffer_stack_max) = 0;
- (yy_c_buf_p) = (char *) 0;
- (yy_init) = 0;
- (yy_start) = 0;
-
-/* Defined in main.c */
-#ifdef YY_STDINIT
- yyin = stdin;
- yyout = stdout;
-#else
- yyin = (FILE *) 0;
- yyout = (FILE *) 0;
-#endif
-
- /* For future reference: Set errno on error, since we are called by
- * yylex_init()
- */
- return 0;
-}
-
-/* yylex_destroy is for both reentrant and non-reentrant scanners. */
-int yylex_destroy (void)
-{
-
- /* Pop the buffer stack, destroying each element. */
- while(YY_CURRENT_BUFFER){
- yy_delete_buffer(YY_CURRENT_BUFFER );
- YY_CURRENT_BUFFER_LVALUE = NULL;
- yypop_buffer_state();
- }
-
- /* Destroy the stack itself. */
- yyfree((yy_buffer_stack) );
- (yy_buffer_stack) = NULL;
-
- /* Reset the globals. This is important in a non-reentrant scanner so the next time
- * yylex() is called, initialization will occur. */
- yy_init_globals( );
-
- return 0;
-}
-
-/*
- * Internal utility routines.
- */
-
-#ifndef yytext_ptr
-static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
-{
- register int i;
- for ( i = 0; i < n; ++i )
- s1[i] = s2[i];
-}
-#endif
-
-#ifdef YY_NEED_STRLEN
-static int yy_flex_strlen (yyconst char * s )
-{
- register int n;
- for ( n = 0; s[n]; ++n )
- ;
-
- return n;
-}
-#endif
-
-void *yyalloc (yy_size_t size )
-{
- return (void *) malloc( size );
-}
-
-void *yyrealloc (void * ptr, yy_size_t size )
-{
- /* The cast to (char *) in the following accommodates both
- * implementations that use char* generic pointers, and those
- * that use void* generic pointers. It works with the latter
- * because both ANSI C and C++ allow castless assignment from
- * any pointer type to void*, and deal with argument conversions
- * as though doing an assignment.
- */
- return (void *) realloc( (char *) ptr, size );
-}
-
-void yyfree (void * ptr )
-{
- free( (char *) ptr ); /* see yyrealloc() for (char *) cast */
-}
-
-#define YYTABLES_NAME "yytables"
-
-#line 91 "arlex.l"
-
-
-#ifndef yywrap
-/* Needed for lex, though not flex. */
-int yywrap(void) { return 1; }
-#endif
-
diff -Nur binutils-2.24.orig/binutils/arparse.c binutils-2.24/binutils/arparse.c
--- binutils-2.24.orig/binutils/arparse.c 2013-11-18 09:49:30.000000000 +0100
+++ binutils-2.24/binutils/arparse.c 1970-01-01 01:00:00.000000000 +0100
@@ -1,1770 +0,0 @@
-/* A Bison parser, made by GNU Bison 2.3. */
-
-/* Skeleton implementation for Bison's Yacc-like parsers in C
-
- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
- Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA. */
-
-/* As a special exception, you may create a larger work that contains
- part or all of the Bison parser skeleton and distribute that work
- under terms of your choice, so long as that work isn't itself a
- parser generator using the skeleton or a modified version thereof
- as a parser skeleton. Alternatively, if you modify or redistribute
- the parser skeleton itself, you may (at your option) remove this
- special exception, which will cause the skeleton and the resulting
- Bison output files to be licensed under the GNU General Public
- License without this special exception.
-
- This special exception was added by the Free Software Foundation in
- version 2.2 of Bison. */
-
-/* C LALR(1) parser skeleton written by Richard Stallman, by
- simplifying the original so-called "semantic" parser. */
-
-/* All symbols defined below should begin with yy or YY, to avoid
- infringing on user name space. This should be done even for local
- variables, as they might otherwise be expanded by user macros.
- There are some unavoidable exceptions within include files to
- define necessary library symbols; they are noted "INFRINGES ON
- USER NAME SPACE" below. */
-
-/* Identify Bison output. */
-#define YYBISON 1
-
-/* Bison version. */
-#define YYBISON_VERSION "2.3"
-
-/* Skeleton name. */
-#define YYSKELETON_NAME "yacc.c"
-
-/* Pure parsers. */
-#define YYPURE 0
-
-/* Using locations. */
-#define YYLSP_NEEDED 0
-
-
-
-/* Tokens. */
-#ifndef YYTOKENTYPE
-# define YYTOKENTYPE
- /* Put the tokens into the symbol table, so that GDB and other debuggers
- know about them. */
- enum yytokentype {
- NEWLINE = 258,
- VERBOSE = 259,
- FILENAME = 260,
- ADDLIB = 261,
- LIST = 262,
- ADDMOD = 263,
- CLEAR = 264,
- CREATE = 265,
- DELETE = 266,
- DIRECTORY = 267,
- END = 268,
- EXTRACT = 269,
- FULLDIR = 270,
- HELP = 271,
- QUIT = 272,
- REPLACE = 273,
- SAVE = 274,
- OPEN = 275
- };
-#endif
-/* Tokens. */
-#define NEWLINE 258
-#define VERBOSE 259
-#define FILENAME 260
-#define ADDLIB 261
-#define LIST 262
-#define ADDMOD 263
-#define CLEAR 264
-#define CREATE 265
-#define DELETE 266
-#define DIRECTORY 267
-#define END 268
-#define EXTRACT 269
-#define FULLDIR 270
-#define HELP 271
-#define QUIT 272
-#define REPLACE 273
-#define SAVE 274
-#define OPEN 275
-
-
-
-
-/* Copy the first part of user declarations. */
-#line 1 "arparse.y"
-
-/* arparse.y - Stange script language parser */
-
-/* Copyright 1992, 1993, 1995, 1997, 1999, 2002, 2003, 2005, 2007
- Free Software Foundation, Inc.
-
- This file is part of GNU Binutils.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
- MA 02110-1301, USA. */
-
-
-/* Contributed by Steve Chamberlain
- sac@cygnus.com
-
-*/
-#define DONTDECLARE_MALLOC
-#include "sysdep.h"
-#include "bfd.h"
-#include "arsup.h"
-extern int verbose;
-extern int yylex (void);
-static int yyerror (const char *);
-
-
-/* Enabling traces. */
-#ifndef YYDEBUG
-# define YYDEBUG 0
-#endif
-
-/* Enabling verbose error messages. */
-#ifdef YYERROR_VERBOSE
-# undef YYERROR_VERBOSE
-# define YYERROR_VERBOSE 1
-#else
-# define YYERROR_VERBOSE 0
-#endif
-
-/* Enabling the token table. */
-#ifndef YYTOKEN_TABLE
-# define YYTOKEN_TABLE 0
-#endif
-
-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-typedef union YYSTYPE
-#line 38 "arparse.y"
-{
- char *name;
-struct list *list ;
-
-}
-/* Line 193 of yacc.c. */
-#line 179 "arparse.c"
- YYSTYPE;
-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
-# define YYSTYPE_IS_DECLARED 1
-# define YYSTYPE_IS_TRIVIAL 1
-#endif
-
-
-
-/* Copy the second part of user declarations. */
-
-
-/* Line 216 of yacc.c. */
-#line 192 "arparse.c"
-
-#ifdef short
-# undef short
-#endif
-
-#ifdef YYTYPE_UINT8
-typedef YYTYPE_UINT8 yytype_uint8;
-#else
-typedef unsigned char yytype_uint8;
-#endif
-
-#ifdef YYTYPE_INT8
-typedef YYTYPE_INT8 yytype_int8;
-#elif (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-typedef signed char yytype_int8;
-#else
-typedef short int yytype_int8;
-#endif
-
-#ifdef YYTYPE_UINT16
-typedef YYTYPE_UINT16 yytype_uint16;
-#else
-typedef unsigned short int yytype_uint16;
-#endif
-
-#ifdef YYTYPE_INT16
-typedef YYTYPE_INT16 yytype_int16;
-#else
-typedef short int yytype_int16;
-#endif
-
-#ifndef YYSIZE_T
-# ifdef __SIZE_TYPE__
-# define YYSIZE_T __SIZE_TYPE__
-# elif defined size_t
-# define YYSIZE_T size_t
-# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-# include /* INFRINGES ON USER NAME SPACE */
-# define YYSIZE_T size_t
-# else
-# define YYSIZE_T unsigned int
-# endif
-#endif
-
-#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
-
-#ifndef YY_
-# if defined YYENABLE_NLS && YYENABLE_NLS
-# if ENABLE_NLS
-# include /* INFRINGES ON USER NAME SPACE */
-# define YY_(msgid) dgettext ("bison-runtime", msgid)
-# endif
-# endif
-# ifndef YY_
-# define YY_(msgid) msgid
-# endif
-#endif
-
-/* Suppress unused-variable warnings by "using" E. */
-#if ! defined lint || defined __GNUC__
-# define YYUSE(e) ((void) (e))
-#else
-# define YYUSE(e) /* empty */
-#endif
-
-/* Identity function, used to suppress warnings about constant conditions. */
-#ifndef lint
-# define YYID(n) (n)
-#else
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static int
-YYID (int i)
-#else
-static int
-YYID (i)
- int i;
-#endif
-{
- return i;
-}
-#endif
-
-#if ! defined yyoverflow || YYERROR_VERBOSE
-
-/* The parser invokes alloca or malloc; define the necessary symbols. */
-
-# ifdef YYSTACK_USE_ALLOCA
-# if YYSTACK_USE_ALLOCA
-# ifdef __GNUC__
-# define YYSTACK_ALLOC __builtin_alloca
-# elif defined __BUILTIN_VA_ARG_INCR
-# include /* INFRINGES ON USER NAME SPACE */
-# elif defined _AIX
-# define YYSTACK_ALLOC __alloca
-# elif defined _MSC_VER
-# include /* INFRINGES ON USER NAME SPACE */
-# define alloca _alloca
-# else
-# define YYSTACK_ALLOC alloca
-# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-# include /* INFRINGES ON USER NAME SPACE */
-# ifndef _STDLIB_H
-# define _STDLIB_H 1
-# endif
-# endif
-# endif
-# endif
-# endif
-
-# ifdef YYSTACK_ALLOC
- /* Pacify GCC's `empty if-body' warning. */
-# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
-# ifndef YYSTACK_ALLOC_MAXIMUM
- /* The OS might guarantee only one guard page at the bottom of the stack,
- and a page size can be as small as 4096 bytes. So we cannot safely
- invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
- to allow for a few compiler-allocated temporary stack slots. */
-# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
-# endif
-# else
-# define YYSTACK_ALLOC YYMALLOC
-# define YYSTACK_FREE YYFREE
-# ifndef YYSTACK_ALLOC_MAXIMUM
-# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
-# endif
-# if (defined __cplusplus && ! defined _STDLIB_H \
- && ! ((defined YYMALLOC || defined malloc) \
- && (defined YYFREE || defined free)))
-# include /* INFRINGES ON USER NAME SPACE */
-# ifndef _STDLIB_H
-# define _STDLIB_H 1
-# endif
-# endif
-# ifndef YYMALLOC
-# define YYMALLOC malloc
-# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
-# endif
-# endif
-# ifndef YYFREE
-# define YYFREE free
-# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-void free (void *); /* INFRINGES ON USER NAME SPACE */
-# endif
-# endif
-# endif
-#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
-
-
-#if (! defined yyoverflow \
- && (! defined __cplusplus \
- || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
-
-/* A type that is properly aligned for any stack member. */
-union yyalloc
-{
- yytype_int16 yyss;
- YYSTYPE yyvs;
- };
-
-/* The size of the maximum gap between one aligned stack and the next. */
-# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
-
-/* The size of an array large to enough to hold all stacks, each with
- N elements. */
-# define YYSTACK_BYTES(N) \
- ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
- + YYSTACK_GAP_MAXIMUM)
-
-/* Copy COUNT objects from FROM to TO. The source and destination do
- not overlap. */
-# ifndef YYCOPY
-# if defined __GNUC__ && 1 < __GNUC__
-# define YYCOPY(To, From, Count) \
- __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
-# else
-# define YYCOPY(To, From, Count) \
- do \
- { \
- YYSIZE_T yyi; \
- for (yyi = 0; yyi < (Count); yyi++) \
- (To)[yyi] = (From)[yyi]; \
- } \
- while (YYID (0))
-# endif
-# endif
-
-/* Relocate STACK from its old location to the new one. The
- local variables YYSIZE and YYSTACKSIZE give the old and new number of
- elements in the stack, and YYPTR gives the new location of the
- stack. Advance YYPTR to a properly aligned location for the next
- stack. */
-# define YYSTACK_RELOCATE(Stack) \
- do \
- { \
- YYSIZE_T yynewbytes; \
- YYCOPY (&yyptr->Stack, Stack, yysize); \
- Stack = &yyptr->Stack; \
- yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
- yyptr += yynewbytes / sizeof (*yyptr); \
- } \
- while (YYID (0))
-
-#endif
-
-/* YYFINAL -- State number of the termination state. */
-#define YYFINAL 3
-/* YYLAST -- Last index in YYTABLE. */
-#define YYLAST 34
-
-/* YYNTOKENS -- Number of terminals. */
-#define YYNTOKENS 24
-/* YYNNTS -- Number of nonterminals. */
-#define YYNNTS 22
-/* YYNRULES -- Number of rules. */
-#define YYNRULES 42
-/* YYNRULES -- Number of states. */
-#define YYNSTATES 53
-
-/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
-#define YYUNDEFTOK 2
-#define YYMAXUTOK 275
-
-#define YYTRANSLATE(YYX) \
- ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
-
-/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */
-static const yytype_uint8 yytranslate[] =
-{
- 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 21, 22, 2, 2, 23, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
- 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
- 15, 16, 17, 18, 19, 20
-};
-
-#if YYDEBUG
-/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
- YYRHS. */
-static const yytype_uint8 yyprhs[] =
-{
- 0, 0, 3, 4, 7, 10, 11, 14, 16, 18,
- 20, 22, 24, 26, 28, 30, 32, 34, 36, 38,
- 40, 42, 44, 45, 48, 51, 53, 56, 59, 61,
- 63, 66, 69, 73, 78, 80, 81, 85, 86, 90,
- 91, 93, 94
-};
-
-/* YYRHS -- A `-1'-separated list of the rules' RHS. */
-static const yytype_int8 yyrhs[] =
-{
- 25, 0, -1, -1, 26, 27, -1, 27, 28, -1,
- -1, 29, 3, -1, 37, -1, 38, -1, 45, -1,
- 40, -1, 39, -1, 32, -1, 34, -1, 36, -1,
- 30, -1, 31, -1, 33, -1, 35, -1, 13, -1,
- 1, -1, 5, -1, -1, 14, 43, -1, 18, 43,
- -1, 9, -1, 11, 43, -1, 8, 43, -1, 7,
- -1, 19, -1, 20, 5, -1, 10, 5, -1, 6,
- 5, 42, -1, 12, 5, 42, 41, -1, 5, -1,
- -1, 21, 43, 22, -1, -1, 43, 44, 5, -1,
- -1, 23, -1, -1, 4, -1
-};
-
-/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
-static const yytype_uint8 yyrline[] =
-{
- 0, 69, 69, 69, 73, 74, 78, 82, 83, 84,
- 85, 86, 87, 88, 89, 90, 91, 92, 93, 94,
- 95, 96, 97, 102, 107, 112, 117, 121, 126, 131,
- 138, 143, 149, 153, 160, 162, 166, 169, 173, 179,
- 184, 185, 190
-};
-#endif
-
-#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
-/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
- First, the terminals, then, starting at YYNTOKENS, nonterminals. */
-static const char *const yytname[] =
-{
- "$end", "error", "$undefined", "NEWLINE", "VERBOSE", "FILENAME",
- "ADDLIB", "LIST", "ADDMOD", "CLEAR", "CREATE", "DELETE", "DIRECTORY",
- "END", "EXTRACT", "FULLDIR", "HELP", "QUIT", "REPLACE", "SAVE", "OPEN",
- "'('", "')'", "','", "$accept", "start", "@1", "session", "command_line",
- "command", "extract_command", "replace_command", "clear_command",
- "delete_command", "addmod_command", "list_command", "save_command",
- "open_command", "create_command", "addlib_command", "directory_command",
- "optional_filename", "modulelist", "modulename", "optcomma",
- "verbose_command", 0
-};
-#endif
-
-# ifdef YYPRINT
-/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
- token YYLEX-NUM. */
-static const yytype_uint16 yytoknum[] =
-{
- 0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
- 265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
- 275, 40, 41, 44
-};
-# endif
-
-/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
-static const yytype_uint8 yyr1[] =
-{
- 0, 24, 26, 25, 27, 27, 28, 29, 29, 29,
- 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
- 29, 29, 29, 30, 31, 32, 33, 34, 35, 36,
- 37, 38, 39, 40, 41, 41, 42, 42, 43, 43,
- 44, 44, 45
-};
-
-/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
-static const yytype_uint8 yyr2[] =
-{
- 0, 2, 0, 2, 2, 0, 2, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 0, 2, 2, 1, 2, 2, 1, 1,
- 2, 2, 3, 4, 1, 0, 3, 0, 3, 0,
- 1, 0, 1
-};
-
-/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
- STATE-NUM when YYTABLE doesn't specify something else to do. Zero
- means the default is an error. */
-static const yytype_uint8 yydefact[] =
-{
- 2, 0, 5, 1, 0, 20, 42, 21, 0, 28,
- 39, 25, 0, 39, 0, 19, 39, 39, 29, 0,
- 4, 0, 15, 16, 12, 17, 13, 18, 14, 7,
- 8, 11, 10, 9, 37, 27, 31, 26, 37, 23,
- 24, 30, 6, 39, 32, 40, 0, 35, 41, 38,
- 34, 33, 36
-};
-
-/* YYDEFGOTO[NTERM-NUM]. */
-static const yytype_int8 yydefgoto[] =
-{
- -1, 1, 2, 4, 20, 21, 22, 23, 24, 25,
- 26, 27, 28, 29, 30, 31, 32, 51, 44, 35,
- 46, 33
-};
-
-/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
- STATE-NUM. */
-#define YYPACT_NINF -14
-static const yytype_int8 yypact[] =
-{
- -14, 1, -14, -14, 5, -14, -14, -14, 2, -14,
- -14, -14, 21, -14, 22, -14, -14, -14, -14, 23,
- -14, 26, -14, -14, -14, -14, -14, -14, -14, -14,
- -14, -14, -14, -14, 10, -3, -14, -3, 10, -3,
- -3, -14, -14, -14, -14, -14, 27, 28, -1, -14,
- -14, -14, -14
-};
-
-/* YYPGOTO[NTERM-NUM]. */
-static const yytype_int8 yypgoto[] =
-{
- -14, -14, -14, -14, -14, -14, -14, -14, -14, -14,
- -14, -14, -14, -14, -14, -14, -14, -14, -4, -13,
- -14, -14
-};
-
-/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
- positive, shift that token. If negative, reduce the rule which
- number is the opposite. If zero, do what YYDEFACT says.
- If YYTABLE_NINF, syntax error. */
-#define YYTABLE_NINF -42
-static const yytype_int8 yytable[] =
-{
- 37, 3, -41, 39, 40, -3, 5, 34, -22, 6,
- 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
- 45, 52, 45, 17, 18, 19, 36, 38, 41, 42,
- 48, 43, 49, 50, 47
-};
-
-static const yytype_uint8 yycheck[] =
-{
- 13, 0, 5, 16, 17, 0, 1, 5, 3, 4,
- 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
- 23, 22, 23, 18, 19, 20, 5, 5, 5, 3,
- 43, 21, 5, 5, 38
-};
-
-/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
- symbol of state STATE-NUM. */
-static const yytype_uint8 yystos[] =
-{
- 0, 25, 26, 0, 27, 1, 4, 5, 6, 7,
- 8, 9, 10, 11, 12, 13, 14, 18, 19, 20,
- 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
- 38, 39, 40, 45, 5, 43, 5, 43, 5, 43,
- 43, 5, 3, 21, 42, 23, 44, 42, 43, 5,
- 5, 41, 22
-};
-
-#define yyerrok (yyerrstatus = 0)
-#define yyclearin (yychar = YYEMPTY)
-#define YYEMPTY (-2)
-#define YYEOF 0
-
-#define YYACCEPT goto yyacceptlab
-#define YYABORT goto yyabortlab
-#define YYERROR goto yyerrorlab
-
-
-/* Like YYERROR except do call yyerror. This remains here temporarily
- to ease the transition to the new meaning of YYERROR, for GCC.
- Once GCC version 2 has supplanted version 1, this can go. */
-
-#define YYFAIL goto yyerrlab
-
-#define YYRECOVERING() (!!yyerrstatus)
-
-#define YYBACKUP(Token, Value) \
-do \
- if (yychar == YYEMPTY && yylen == 1) \
- { \
- yychar = (Token); \
- yylval = (Value); \
- yytoken = YYTRANSLATE (yychar); \
- YYPOPSTACK (1); \
- goto yybackup; \
- } \
- else \
- { \
- yyerror (YY_("syntax error: cannot back up")); \
- YYERROR; \
- } \
-while (YYID (0))
-
-
-#define YYTERROR 1
-#define YYERRCODE 256
-
-
-/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
- If N is 0, then set CURRENT to the empty location which ends
- the previous symbol: RHS[0] (always defined). */
-
-#define YYRHSLOC(Rhs, K) ((Rhs)[K])
-#ifndef YYLLOC_DEFAULT
-# define YYLLOC_DEFAULT(Current, Rhs, N) \
- do \
- if (YYID (N)) \
- { \
- (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \
- (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
- (Current).last_line = YYRHSLOC (Rhs, N).last_line; \
- (Current).last_column = YYRHSLOC (Rhs, N).last_column; \
- } \
- else \
- { \
- (Current).first_line = (Current).last_line = \
- YYRHSLOC (Rhs, 0).last_line; \
- (Current).first_column = (Current).last_column = \
- YYRHSLOC (Rhs, 0).last_column; \
- } \
- while (YYID (0))
-#endif
-
-
-/* YY_LOCATION_PRINT -- Print the location on the stream.
- This macro was not mandated originally: define only if we know
- we won't break user code: when these are the locations we know. */
-
-#ifndef YY_LOCATION_PRINT
-# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL
-# define YY_LOCATION_PRINT(File, Loc) \
- fprintf (File, "%d.%d-%d.%d", \
- (Loc).first_line, (Loc).first_column, \
- (Loc).last_line, (Loc).last_column)
-# else
-# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
-# endif
-#endif
-
-
-/* YYLEX -- calling `yylex' with the right arguments. */
-
-#ifdef YYLEX_PARAM
-# define YYLEX yylex (YYLEX_PARAM)
-#else
-# define YYLEX yylex ()
-#endif
-
-/* Enable debugging if requested. */
-#if YYDEBUG
-
-# ifndef YYFPRINTF
-# include /* INFRINGES ON USER NAME SPACE */
-# define YYFPRINTF fprintf
-# endif
-
-# define YYDPRINTF(Args) \
-do { \
- if (yydebug) \
- YYFPRINTF Args; \
-} while (YYID (0))
-
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
-do { \
- if (yydebug) \
- { \
- YYFPRINTF (stderr, "%s ", Title); \
- yy_symbol_print (stderr, \
- Type, Value); \
- YYFPRINTF (stderr, "\n"); \
- } \
-} while (YYID (0))
-
-
-/*--------------------------------.
-| Print this symbol on YYOUTPUT. |
-`--------------------------------*/
-
-/*ARGSUSED*/
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static void
-yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
-#else
-static void
-yy_symbol_value_print (yyoutput, yytype, yyvaluep)
- FILE *yyoutput;
- int yytype;
- YYSTYPE const * const yyvaluep;
-#endif
-{
- if (!yyvaluep)
- return;
-# ifdef YYPRINT
- if (yytype < YYNTOKENS)
- YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
-# else
- YYUSE (yyoutput);
-# endif
- switch (yytype)
- {
- default:
- break;
- }
-}
-
-
-/*--------------------------------.
-| Print this symbol on YYOUTPUT. |
-`--------------------------------*/
-
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static void
-yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
-#else
-static void
-yy_symbol_print (yyoutput, yytype, yyvaluep)
- FILE *yyoutput;
- int yytype;
- YYSTYPE const * const yyvaluep;
-#endif
-{
- if (yytype < YYNTOKENS)
- YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
- else
- YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
-
- yy_symbol_value_print (yyoutput, yytype, yyvaluep);
- YYFPRINTF (yyoutput, ")");
-}
-
-/*------------------------------------------------------------------.
-| yy_stack_print -- Print the state stack from its BOTTOM up to its |
-| TOP (included). |
-`------------------------------------------------------------------*/
-
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static void
-yy_stack_print (yytype_int16 *bottom, yytype_int16 *top)
-#else
-static void
-yy_stack_print (bottom, top)
- yytype_int16 *bottom;
- yytype_int16 *top;
-#endif
-{
- YYFPRINTF (stderr, "Stack now");
- for (; bottom <= top; ++bottom)
- YYFPRINTF (stderr, " %d", *bottom);
- YYFPRINTF (stderr, "\n");
-}
-
-# define YY_STACK_PRINT(Bottom, Top) \
-do { \
- if (yydebug) \
- yy_stack_print ((Bottom), (Top)); \
-} while (YYID (0))
-
-
-/*------------------------------------------------.
-| Report that the YYRULE is going to be reduced. |
-`------------------------------------------------*/
-
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static void
-yy_reduce_print (YYSTYPE *yyvsp, int yyrule)
-#else
-static void
-yy_reduce_print (yyvsp, yyrule)
- YYSTYPE *yyvsp;
- int yyrule;
-#endif
-{
- int yynrhs = yyr2[yyrule];
- int yyi;
- unsigned long int yylno = yyrline[yyrule];
- YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
- yyrule - 1, yylno);
- /* The symbols being reduced. */
- for (yyi = 0; yyi < yynrhs; yyi++)
- {
- fprintf (stderr, " $%d = ", yyi + 1);
- yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
- &(yyvsp[(yyi + 1) - (yynrhs)])
- );
- fprintf (stderr, "\n");
- }
-}
-
-# define YY_REDUCE_PRINT(Rule) \
-do { \
- if (yydebug) \
- yy_reduce_print (yyvsp, Rule); \
-} while (YYID (0))
-
-/* Nonzero means print parse trace. It is left uninitialized so that
- multiple parsers can coexist. */
-int yydebug;
-#else /* !YYDEBUG */
-# define YYDPRINTF(Args)
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
-# define YY_STACK_PRINT(Bottom, Top)
-# define YY_REDUCE_PRINT(Rule)
-#endif /* !YYDEBUG */
-
-
-/* YYINITDEPTH -- initial size of the parser's stacks. */
-#ifndef YYINITDEPTH
-# define YYINITDEPTH 200
-#endif
-
-/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
- if the built-in stack extension method is used).
-
- Do not make this value too large; the results are undefined if
- YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
- evaluated with infinite-precision integer arithmetic. */
-
-#ifndef YYMAXDEPTH
-# define YYMAXDEPTH 10000
-#endif
-
-
-
-#if YYERROR_VERBOSE
-
-# ifndef yystrlen
-# if defined __GLIBC__ && defined _STRING_H
-# define yystrlen strlen
-# else
-/* Return the length of YYSTR. */
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static YYSIZE_T
-yystrlen (const char *yystr)
-#else
-static YYSIZE_T
-yystrlen (yystr)
- const char *yystr;
-#endif
-{
- YYSIZE_T yylen;
- for (yylen = 0; yystr[yylen]; yylen++)
- continue;
- return yylen;
-}
-# endif
-# endif
-
-# ifndef yystpcpy
-# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
-# define yystpcpy stpcpy
-# else
-/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
- YYDEST. */
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static char *
-yystpcpy (char *yydest, const char *yysrc)
-#else
-static char *
-yystpcpy (yydest, yysrc)
- char *yydest;
- const char *yysrc;
-#endif
-{
- char *yyd = yydest;
- const char *yys = yysrc;
-
- while ((*yyd++ = *yys++) != '\0')
- continue;
-
- return yyd - 1;
-}
-# endif
-# endif
-
-# ifndef yytnamerr
-/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
- quotes and backslashes, so that it's suitable for yyerror. The
- heuristic is that double-quoting is unnecessary unless the string
- contains an apostrophe, a comma, or backslash (other than
- backslash-backslash). YYSTR is taken from yytname. If YYRES is
- null, do not copy; instead, return the length of what the result
- would have been. */
-static YYSIZE_T
-yytnamerr (char *yyres, const char *yystr)
-{
- if (*yystr == '"')
- {
- YYSIZE_T yyn = 0;
- char const *yyp = yystr;
-
- for (;;)
- switch (*++yyp)
- {
- case '\'':
- case ',':
- goto do_not_strip_quotes;
-
- case '\\':
- if (*++yyp != '\\')
- goto do_not_strip_quotes;
- /* Fall through. */
- default:
- if (yyres)
- yyres[yyn] = *yyp;
- yyn++;
- break;
-
- case '"':
- if (yyres)
- yyres[yyn] = '\0';
- return yyn;
- }
- do_not_strip_quotes: ;
- }
-
- if (! yyres)
- return yystrlen (yystr);
-
- return yystpcpy (yyres, yystr) - yyres;
-}
-# endif
-
-/* Copy into YYRESULT an error message about the unexpected token
- YYCHAR while in state YYSTATE. Return the number of bytes copied,
- including the terminating null byte. If YYRESULT is null, do not
- copy anything; just return the number of bytes that would be
- copied. As a special case, return 0 if an ordinary "syntax error"
- message will do. Return YYSIZE_MAXIMUM if overflow occurs during
- size calculation. */
-static YYSIZE_T
-yysyntax_error (char *yyresult, int yystate, int yychar)
-{
- int yyn = yypact[yystate];
-
- if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
- return 0;
- else
- {
- int yytype = YYTRANSLATE (yychar);
- YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
- YYSIZE_T yysize = yysize0;
- YYSIZE_T yysize1;
- int yysize_overflow = 0;
- enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
- char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
- int yyx;
-
-# if 0
- /* This is so xgettext sees the translatable formats that are
- constructed on the fly. */
- YY_("syntax error, unexpected %s");
- YY_("syntax error, unexpected %s, expecting %s");
- YY_("syntax error, unexpected %s, expecting %s or %s");
- YY_("syntax error, unexpected %s, expecting %s or %s or %s");
- YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
-# endif
- char *yyfmt;
- char const *yyf;
- static char const yyunexpected[] = "syntax error, unexpected %s";
- static char const yyexpecting[] = ", expecting %s";
- static char const yyor[] = " or %s";
- char yyformat[sizeof yyunexpected
- + sizeof yyexpecting - 1
- + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
- * (sizeof yyor - 1))];
- char const *yyprefix = yyexpecting;
-
- /* Start YYX at -YYN if negative to avoid negative indexes in
- YYCHECK. */
- int yyxbegin = yyn < 0 ? -yyn : 0;
-
- /* Stay within bounds of both yycheck and yytname. */
- int yychecklim = YYLAST - yyn + 1;
- int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
- int yycount = 1;
-
- yyarg[0] = yytname[yytype];
- yyfmt = yystpcpy (yyformat, yyunexpected);
-
- for (yyx = yyxbegin; yyx < yyxend; ++yyx)
- if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
- {
- if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
- {
- yycount = 1;
- yysize = yysize0;
- yyformat[sizeof yyunexpected - 1] = '\0';
- break;
- }
- yyarg[yycount++] = yytname[yyx];
- yysize1 = yysize + yytnamerr (0, yytname[yyx]);
- yysize_overflow |= (yysize1 < yysize);
- yysize = yysize1;
- yyfmt = yystpcpy (yyfmt, yyprefix);
- yyprefix = yyor;
- }
-
- yyf = YY_(yyformat);
- yysize1 = yysize + yystrlen (yyf);
- yysize_overflow |= (yysize1 < yysize);
- yysize = yysize1;
-
- if (yysize_overflow)
- return YYSIZE_MAXIMUM;
-
- if (yyresult)
- {
- /* Avoid sprintf, as that infringes on the user's name space.
- Don't have undefined behavior even if the translation
- produced a string with the wrong number of "%s"s. */
- char *yyp = yyresult;
- int yyi = 0;
- while ((*yyp = *yyf) != '\0')
- {
- if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
- {
- yyp += yytnamerr (yyp, yyarg[yyi++]);
- yyf += 2;
- }
- else
- {
- yyp++;
- yyf++;
- }
- }
- }
- return yysize;
- }
-}
-#endif /* YYERROR_VERBOSE */
-
-
-/*-----------------------------------------------.
-| Release the memory associated to this symbol. |
-`-----------------------------------------------*/
-
-/*ARGSUSED*/
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static void
-yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
-#else
-static void
-yydestruct (yymsg, yytype, yyvaluep)
- const char *yymsg;
- int yytype;
- YYSTYPE *yyvaluep;
-#endif
-{
- YYUSE (yyvaluep);
-
- if (!yymsg)
- yymsg = "Deleting";
- YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
-
- switch (yytype)
- {
-
- default:
- break;
- }
-}
-
-
-/* Prevent warnings from -Wmissing-prototypes. */
-
-#ifdef YYPARSE_PARAM
-#if defined __STDC__ || defined __cplusplus
-int yyparse (void *YYPARSE_PARAM);
-#else
-int yyparse ();
-#endif
-#else /* ! YYPARSE_PARAM */
-#if defined __STDC__ || defined __cplusplus
-int yyparse (void);
-#else
-int yyparse ();
-#endif
-#endif /* ! YYPARSE_PARAM */
-
-
-
-/* The look-ahead symbol. */
-int yychar;
-
-/* The semantic value of the look-ahead symbol. */
-YYSTYPE yylval;
-
-/* Number of syntax errors so far. */
-int yynerrs;
-
-
-
-/*----------.
-| yyparse. |
-`----------*/
-
-#ifdef YYPARSE_PARAM
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-int
-yyparse (void *YYPARSE_PARAM)
-#else
-int
-yyparse (YYPARSE_PARAM)
- void *YYPARSE_PARAM;
-#endif
-#else /* ! YYPARSE_PARAM */
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-int
-yyparse (void)
-#else
-int
-yyparse ()
-
-#endif
-#endif
-{
-
- int yystate;
- int yyn;
- int yyresult;
- /* Number of tokens to shift before error messages enabled. */
- int yyerrstatus;
- /* Look-ahead token as an internal (translated) token number. */
- int yytoken = 0;
-#if YYERROR_VERBOSE
- /* Buffer for error messages, and its allocated size. */
- char yymsgbuf[128];
- char *yymsg = yymsgbuf;
- YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
-#endif
-
- /* Three stacks and their tools:
- `yyss': related to states,
- `yyvs': related to semantic values,
- `yyls': related to locations.
-
- Refer to the stacks thru separate pointers, to allow yyoverflow
- to reallocate them elsewhere. */
-
- /* The state stack. */
- yytype_int16 yyssa[YYINITDEPTH];
- yytype_int16 *yyss = yyssa;
- yytype_int16 *yyssp;
-
- /* The semantic value stack. */
- YYSTYPE yyvsa[YYINITDEPTH];
- YYSTYPE *yyvs = yyvsa;
- YYSTYPE *yyvsp;
-
-
-
-#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
-
- YYSIZE_T yystacksize = YYINITDEPTH;
-
- /* The variables used to return semantic value and location from the
- action routines. */
- YYSTYPE yyval;
-
-
- /* The number of symbols on the RHS of the reduced rule.
- Keep to zero when no symbol should be popped. */
- int yylen = 0;
-
- YYDPRINTF ((stderr, "Starting parse\n"));
-
- yystate = 0;
- yyerrstatus = 0;
- yynerrs = 0;
- yychar = YYEMPTY; /* Cause a token to be read. */
-
- /* Initialize stack pointers.
- Waste one element of value and location stack
- so that they stay on the same level as the state stack.
- The wasted elements are never initialized. */
-
- yyssp = yyss;
- yyvsp = yyvs;
-
- goto yysetstate;
-
-/*------------------------------------------------------------.
-| yynewstate -- Push a new state, which is found in yystate. |
-`------------------------------------------------------------*/
- yynewstate:
- /* In all cases, when you get here, the value and location stacks
- have just been pushed. So pushing a state here evens the stacks. */
- yyssp++;
-
- yysetstate:
- *yyssp = yystate;
-
- if (yyss + yystacksize - 1 <= yyssp)
- {
- /* Get the current used size of the three stacks, in elements. */
- YYSIZE_T yysize = yyssp - yyss + 1;
-
-#ifdef yyoverflow
- {
- /* Give user a chance to reallocate the stack. Use copies of
- these so that the &'s don't force the real ones into
- memory. */
- YYSTYPE *yyvs1 = yyvs;
- yytype_int16 *yyss1 = yyss;
-
-
- /* Each stack pointer address is followed by the size of the
- data in use in that stack, in bytes. This used to be a
- conditional around just the two extra args, but that might
- be undefined if yyoverflow is a macro. */
- yyoverflow (YY_("memory exhausted"),
- &yyss1, yysize * sizeof (*yyssp),
- &yyvs1, yysize * sizeof (*yyvsp),
-
- &yystacksize);
-
- yyss = yyss1;
- yyvs = yyvs1;
- }
-#else /* no yyoverflow */
-# ifndef YYSTACK_RELOCATE
- goto yyexhaustedlab;
-# else
- /* Extend the stack our own way. */
- if (YYMAXDEPTH <= yystacksize)
- goto yyexhaustedlab;
- yystacksize *= 2;
- if (YYMAXDEPTH < yystacksize)
- yystacksize = YYMAXDEPTH;
-
- {
- yytype_int16 *yyss1 = yyss;
- union yyalloc *yyptr =
- (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
- if (! yyptr)
- goto yyexhaustedlab;
- YYSTACK_RELOCATE (yyss);
- YYSTACK_RELOCATE (yyvs);
-
-# undef YYSTACK_RELOCATE
- if (yyss1 != yyssa)
- YYSTACK_FREE (yyss1);
- }
-# endif
-#endif /* no yyoverflow */
-
- yyssp = yyss + yysize - 1;
- yyvsp = yyvs + yysize - 1;
-
-
- YYDPRINTF ((stderr, "Stack size increased to %lu\n",
- (unsigned long int) yystacksize));
-
- if (yyss + yystacksize - 1 <= yyssp)
- YYABORT;
- }
-
- YYDPRINTF ((stderr, "Entering state %d\n", yystate));
-
- goto yybackup;
-
-/*-----------.
-| yybackup. |
-`-----------*/
-yybackup:
-
- /* Do appropriate processing given the current state. Read a
- look-ahead token if we need one and don't already have one. */
-
- /* First try to decide what to do without reference to look-ahead token. */
- yyn = yypact[yystate];
- if (yyn == YYPACT_NINF)
- goto yydefault;
-
- /* Not known => get a look-ahead token if don't already have one. */
-
- /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */
- if (yychar == YYEMPTY)
- {
- YYDPRINTF ((stderr, "Reading a token: "));
- yychar = YYLEX;
- }
-
- if (yychar <= YYEOF)
- {
- yychar = yytoken = YYEOF;
- YYDPRINTF ((stderr, "Now at end of input.\n"));
- }
- else
- {
- yytoken = YYTRANSLATE (yychar);
- YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
- }
-
- /* If the proper action on seeing token YYTOKEN is to reduce or to
- detect an error, take that action. */
- yyn += yytoken;
- if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
- goto yydefault;
- yyn = yytable[yyn];
- if (yyn <= 0)
- {
- if (yyn == 0 || yyn == YYTABLE_NINF)
- goto yyerrlab;
- yyn = -yyn;
- goto yyreduce;
- }
-
- if (yyn == YYFINAL)
- YYACCEPT;
-
- /* Count tokens shifted since error; after three, turn off error
- status. */
- if (yyerrstatus)
- yyerrstatus--;
-
- /* Shift the look-ahead token. */
- YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
-
- /* Discard the shifted token unless it is eof. */
- if (yychar != YYEOF)
- yychar = YYEMPTY;
-
- yystate = yyn;
- *++yyvsp = yylval;
-
- goto yynewstate;
-
-
-/*-----------------------------------------------------------.
-| yydefault -- do the default action for the current state. |
-`-----------------------------------------------------------*/
-yydefault:
- yyn = yydefact[yystate];
- if (yyn == 0)
- goto yyerrlab;
- goto yyreduce;
-
-
-/*-----------------------------.
-| yyreduce -- Do a reduction. |
-`-----------------------------*/
-yyreduce:
- /* yyn is the number of a rule to reduce with. */
- yylen = yyr2[yyn];
-
- /* If YYLEN is nonzero, implement the default value of the action:
- `$$ = $1'.
-
- Otherwise, the following line sets YYVAL to garbage.
- This behavior is undocumented and Bison
- users should not rely upon it. Assigning to YYVAL
- unconditionally makes the parser a bit smaller, and it avoids a
- GCC warning that YYVAL may be used uninitialized. */
- yyval = yyvsp[1-yylen];
-
-
- YY_REDUCE_PRINT (yyn);
- switch (yyn)
- {
- case 2:
-#line 69 "arparse.y"
- { prompt(); }
- break;
-
- case 6:
-#line 78 "arparse.y"
- { prompt(); }
- break;
-
- case 19:
-#line 94 "arparse.y"
- { ar_end(); return 0; }
- break;
-
- case 21:
-#line 96 "arparse.y"
- { yyerror("foo"); }
- break;
-
- case 23:
-#line 103 "arparse.y"
- { ar_extract((yyvsp[(2) - (2)].list)); }
- break;
-
- case 24:
-#line 108 "arparse.y"
- { ar_replace((yyvsp[(2) - (2)].list)); }
- break;
-
- case 25:
-#line 113 "arparse.y"
- { ar_clear(); }
- break;
-
- case 26:
-#line 118 "arparse.y"
- { ar_delete((yyvsp[(2) - (2)].list)); }
- break;
-
- case 27:
-#line 122 "arparse.y"
- { ar_addmod((yyvsp[(2) - (2)].list)); }
- break;
-
- case 28:
-#line 127 "arparse.y"
- { ar_list(); }
- break;
-
- case 29:
-#line 132 "arparse.y"
- { ar_save(); }
- break;
-
- case 30:
-#line 139 "arparse.y"
- { ar_open((yyvsp[(2) - (2)].name),0); }
- break;
-
- case 31:
-#line 144 "arparse.y"
- { ar_open((yyvsp[(2) - (2)].name),1); }
- break;
-
- case 32:
-#line 150 "arparse.y"
- { ar_addlib((yyvsp[(2) - (3)].name),(yyvsp[(3) - (3)].list)); }
- break;
-
- case 33:
-#line 154 "arparse.y"
- { ar_directory((yyvsp[(2) - (4)].name), (yyvsp[(3) - (4)].list), (yyvsp[(4) - (4)].name)); }
- break;
-
- case 34:
-#line 161 "arparse.y"
- { (yyval.name) = (yyvsp[(1) - (1)].name); }
- break;
-
- case 35:
-#line 162 "arparse.y"
- { (yyval.name) = 0; }
- break;
-
- case 36:
-#line 167 "arparse.y"
- { (yyval.list) = (yyvsp[(2) - (3)].list); }
- break;
-
- case 37:
-#line 169 "arparse.y"
- { (yyval.list) = 0; }
- break;
-
- case 38:
-#line 174 "arparse.y"
- { struct list *n = (struct list *) malloc(sizeof(struct list));
- n->next = (yyvsp[(1) - (3)].list);
- n->name = (yyvsp[(3) - (3)].name);
- (yyval.list) = n;
- }
- break;
-
- case 39:
-#line 179 "arparse.y"
- { (yyval.list) = 0; }
- break;
-
- case 42:
-#line 191 "arparse.y"
- { verbose = !verbose; }
- break;
-
-
-/* Line 1267 of yacc.c. */
-#line 1546 "arparse.c"
- default: break;
- }
- YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
-
- YYPOPSTACK (yylen);
- yylen = 0;
- YY_STACK_PRINT (yyss, yyssp);
-
- *++yyvsp = yyval;
-
-
- /* Now `shift' the result of the reduction. Determine what state
- that goes to, based on the state we popped back to and the rule
- number reduced by. */
-
- yyn = yyr1[yyn];
-
- yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
- if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
- yystate = yytable[yystate];
- else
- yystate = yydefgoto[yyn - YYNTOKENS];
-
- goto yynewstate;
-
-
-/*------------------------------------.
-| yyerrlab -- here on detecting error |
-`------------------------------------*/
-yyerrlab:
- /* If not already recovering from an error, report this error. */
- if (!yyerrstatus)
- {
- ++yynerrs;
-#if ! YYERROR_VERBOSE
- yyerror (YY_("syntax error"));
-#else
- {
- YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
- if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
- {
- YYSIZE_T yyalloc = 2 * yysize;
- if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
- yyalloc = YYSTACK_ALLOC_MAXIMUM;
- if (yymsg != yymsgbuf)
- YYSTACK_FREE (yymsg);
- yymsg = (char *) YYSTACK_ALLOC (yyalloc);
- if (yymsg)
- yymsg_alloc = yyalloc;
- else
- {
- yymsg = yymsgbuf;
- yymsg_alloc = sizeof yymsgbuf;
- }
- }
-
- if (0 < yysize && yysize <= yymsg_alloc)
- {
- (void) yysyntax_error (yymsg, yystate, yychar);
- yyerror (yymsg);
- }
- else
- {
- yyerror (YY_("syntax error"));
- if (yysize != 0)
- goto yyexhaustedlab;
- }
- }
-#endif
- }
-
-
-
- if (yyerrstatus == 3)
- {
- /* If just tried and failed to reuse look-ahead token after an
- error, discard it. */
-
- if (yychar <= YYEOF)
- {
- /* Return failure if at end of input. */
- if (yychar == YYEOF)
- YYABORT;
- }
- else
- {
- yydestruct ("Error: discarding",
- yytoken, &yylval);
- yychar = YYEMPTY;
- }
- }
-
- /* Else will try to reuse look-ahead token after shifting the error
- token. */
- goto yyerrlab1;
-
-
-/*---------------------------------------------------.
-| yyerrorlab -- error raised explicitly by YYERROR. |
-`---------------------------------------------------*/
-yyerrorlab:
-
- /* Pacify compilers like GCC when the user code never invokes
- YYERROR and the label yyerrorlab therefore never appears in user
- code. */
- if (/*CONSTCOND*/ 0)
- goto yyerrorlab;
-
- /* Do not reclaim the symbols of the rule which action triggered
- this YYERROR. */
- YYPOPSTACK (yylen);
- yylen = 0;
- YY_STACK_PRINT (yyss, yyssp);
- yystate = *yyssp;
- goto yyerrlab1;
-
-
-/*-------------------------------------------------------------.
-| yyerrlab1 -- common code for both syntax error and YYERROR. |
-`-------------------------------------------------------------*/
-yyerrlab1:
- yyerrstatus = 3; /* Each real token shifted decrements this. */
-
- for (;;)
- {
- yyn = yypact[yystate];
- if (yyn != YYPACT_NINF)
- {
- yyn += YYTERROR;
- if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
- {
- yyn = yytable[yyn];
- if (0 < yyn)
- break;
- }
- }
-
- /* Pop the current state because it cannot handle the error token. */
- if (yyssp == yyss)
- YYABORT;
-
-
- yydestruct ("Error: popping",
- yystos[yystate], yyvsp);
- YYPOPSTACK (1);
- yystate = *yyssp;
- YY_STACK_PRINT (yyss, yyssp);
- }
-
- if (yyn == YYFINAL)
- YYACCEPT;
-
- *++yyvsp = yylval;
-
-
- /* Shift the error token. */
- YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
-
- yystate = yyn;
- goto yynewstate;
-
-
-/*-------------------------------------.
-| yyacceptlab -- YYACCEPT comes here. |
-`-------------------------------------*/
-yyacceptlab:
- yyresult = 0;
- goto yyreturn;
-
-/*-----------------------------------.
-| yyabortlab -- YYABORT comes here. |
-`-----------------------------------*/
-yyabortlab:
- yyresult = 1;
- goto yyreturn;
-
-#ifndef yyoverflow
-/*-------------------------------------------------.
-| yyexhaustedlab -- memory exhaustion comes here. |
-`-------------------------------------------------*/
-yyexhaustedlab:
- yyerror (YY_("memory exhausted"));
- yyresult = 2;
- /* Fall through. */
-#endif
-
-yyreturn:
- if (yychar != YYEOF && yychar != YYEMPTY)
- yydestruct ("Cleanup: discarding lookahead",
- yytoken, &yylval);
- /* Do not reclaim the symbols of the rule which action triggered
- this YYABORT or YYACCEPT. */
- YYPOPSTACK (yylen);
- YY_STACK_PRINT (yyss, yyssp);
- while (yyssp != yyss)
- {
- yydestruct ("Cleanup: popping",
- yystos[*yyssp], yyvsp);
- YYPOPSTACK (1);
- }
-#ifndef yyoverflow
- if (yyss != yyssa)
- YYSTACK_FREE (yyss);
-#endif
-#if YYERROR_VERBOSE
- if (yymsg != yymsgbuf)
- YYSTACK_FREE (yymsg);
-#endif
- /* Make sure YYID is used. */
- return YYID (yyresult);
-}
-
-
-#line 195 "arparse.y"
-
-
-static int
-yyerror (const char *x ATTRIBUTE_UNUSED)
-{
- extern int linenumber;
-
- printf (_("Syntax error in archive script, line %d\n"), linenumber + 1);
- return 0;
-}
-
diff -Nur binutils-2.24.orig/binutils/arparse.h binutils-2.24/binutils/arparse.h
--- binutils-2.24.orig/binutils/arparse.h 2013-11-18 09:49:30.000000000 +0100
+++ binutils-2.24/binutils/arparse.h 1970-01-01 01:00:00.000000000 +0100
@@ -1,102 +0,0 @@
-/* A Bison parser, made by GNU Bison 2.3. */
-
-/* Skeleton interface for Bison's Yacc-like parsers in C
-
- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
- Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA. */
-
-/* As a special exception, you may create a larger work that contains
- part or all of the Bison parser skeleton and distribute that work
- under terms of your choice, so long as that work isn't itself a
- parser generator using the skeleton or a modified version thereof
- as a parser skeleton. Alternatively, if you modify or redistribute
- the parser skeleton itself, you may (at your option) remove this
- special exception, which will cause the skeleton and the resulting
- Bison output files to be licensed under the GNU General Public
- License without this special exception.
-
- This special exception was added by the Free Software Foundation in
- version 2.2 of Bison. */
-
-/* Tokens. */
-#ifndef YYTOKENTYPE
-# define YYTOKENTYPE
- /* Put the tokens into the symbol table, so that GDB and other debuggers
- know about them. */
- enum yytokentype {
- NEWLINE = 258,
- VERBOSE = 259,
- FILENAME = 260,
- ADDLIB = 261,
- LIST = 262,
- ADDMOD = 263,
- CLEAR = 264,
- CREATE = 265,
- DELETE = 266,
- DIRECTORY = 267,
- END = 268,
- EXTRACT = 269,
- FULLDIR = 270,
- HELP = 271,
- QUIT = 272,
- REPLACE = 273,
- SAVE = 274,
- OPEN = 275
- };
-#endif
-/* Tokens. */
-#define NEWLINE 258
-#define VERBOSE 259
-#define FILENAME 260
-#define ADDLIB 261
-#define LIST 262
-#define ADDMOD 263
-#define CLEAR 264
-#define CREATE 265
-#define DELETE 266
-#define DIRECTORY 267
-#define END 268
-#define EXTRACT 269
-#define FULLDIR 270
-#define HELP 271
-#define QUIT 272
-#define REPLACE 273
-#define SAVE 274
-#define OPEN 275
-
-
-
-
-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-typedef union YYSTYPE
-#line 38 "arparse.y"
-{
- char *name;
-struct list *list ;
-
-}
-/* Line 1529 of yacc.c. */
-#line 95 "arparse.h"
- YYSTYPE;
-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
-# define YYSTYPE_IS_DECLARED 1
-# define YYSTYPE_IS_TRIVIAL 1
-#endif
-
-extern YYSTYPE yylval;
-
diff -Nur binutils-2.24.orig/binutils/deflex.c binutils-2.24/binutils/deflex.c
--- binutils-2.24.orig/binutils/deflex.c 2013-11-18 09:49:30.000000000 +0100
+++ binutils-2.24/binutils/deflex.c 1970-01-01 01:00:00.000000000 +0100
@@ -1,2105 +0,0 @@
-
-#line 3 "deflex.c"
-
-#define YY_INT_ALIGNED short int
-
-/* A lexical scanner generated by flex */
-
-#define FLEX_SCANNER
-#define YY_FLEX_MAJOR_VERSION 2
-#define YY_FLEX_MINOR_VERSION 5
-#define YY_FLEX_SUBMINOR_VERSION 35
-#if YY_FLEX_SUBMINOR_VERSION > 0
-#define FLEX_BETA
-#endif
-
-/* First, we deal with platform-specific or compiler-specific issues. */
-
-/* begin standard C headers. */
-#include
-#include
-#include
-#include
-
-/* end standard C headers. */
-
-/* flex integer type definitions */
-
-#ifndef FLEXINT_H
-#define FLEXINT_H
-
-/* C99 systems have . Non-C99 systems may or may not. */
-
-#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
-
-/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
- * if you want the limit (max/min) macros for int types.
- */
-#ifndef __STDC_LIMIT_MACROS
-#define __STDC_LIMIT_MACROS 1
-#endif
-
-#include
-typedef int8_t flex_int8_t;
-typedef uint8_t flex_uint8_t;
-typedef int16_t flex_int16_t;
-typedef uint16_t flex_uint16_t;
-typedef int32_t flex_int32_t;
-typedef uint32_t flex_uint32_t;
-typedef uint64_t flex_uint64_t;
-#else
-typedef signed char flex_int8_t;
-typedef short int flex_int16_t;
-typedef int flex_int32_t;
-typedef unsigned char flex_uint8_t;
-typedef unsigned short int flex_uint16_t;
-typedef unsigned int flex_uint32_t;
-#endif /* ! C99 */
-
-/* Limits of integral types. */
-#ifndef INT8_MIN
-#define INT8_MIN (-128)
-#endif
-#ifndef INT16_MIN
-#define INT16_MIN (-32767-1)
-#endif
-#ifndef INT32_MIN
-#define INT32_MIN (-2147483647-1)
-#endif
-#ifndef INT8_MAX
-#define INT8_MAX (127)
-#endif
-#ifndef INT16_MAX
-#define INT16_MAX (32767)
-#endif
-#ifndef INT32_MAX
-#define INT32_MAX (2147483647)
-#endif
-#ifndef UINT8_MAX
-#define UINT8_MAX (255U)
-#endif
-#ifndef UINT16_MAX
-#define UINT16_MAX (65535U)
-#endif
-#ifndef UINT32_MAX
-#define UINT32_MAX (4294967295U)
-#endif
-
-#endif /* ! FLEXINT_H */
-
-#ifdef __cplusplus
-
-/* The "const" storage-class-modifier is valid. */
-#define YY_USE_CONST
-
-#else /* ! __cplusplus */
-
-/* C99 requires __STDC__ to be defined as 1. */
-#if defined (__STDC__)
-
-#define YY_USE_CONST
-
-#endif /* defined (__STDC__) */
-#endif /* ! __cplusplus */
-
-#ifdef YY_USE_CONST
-#define yyconst const
-#else
-#define yyconst
-#endif
-
-/* Returned upon end-of-file. */
-#define YY_NULL 0
-
-/* Promotes a possibly negative, possibly signed char to an unsigned
- * integer for use as an array index. If the signed char is negative,
- * we want to instead treat it as an 8-bit unsigned char, hence the
- * double cast.
- */
-#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
-
-/* Enter a start condition. This macro really ought to take a parameter,
- * but we do it the disgusting crufty way forced on us by the ()-less
- * definition of BEGIN.
- */
-#define BEGIN (yy_start) = 1 + 2 *
-
-/* Translate the current start state into a value that can be later handed
- * to BEGIN to return to the state. The YYSTATE alias is for lex
- * compatibility.
- */
-#define YY_START (((yy_start) - 1) / 2)
-#define YYSTATE YY_START
-
-/* Action number for EOF rule of a given start state. */
-#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
-
-/* Special action meaning "start processing a new file". */
-#define YY_NEW_FILE yyrestart(yyin )
-
-#define YY_END_OF_BUFFER_CHAR 0
-
-/* Size of default input buffer. */
-#ifndef YY_BUF_SIZE
-#define YY_BUF_SIZE 16384
-#endif
-
-/* The state buf must be large enough to hold one state per character in the main buffer.
- */
-#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
-
-#ifndef YY_TYPEDEF_YY_BUFFER_STATE
-#define YY_TYPEDEF_YY_BUFFER_STATE
-typedef struct yy_buffer_state *YY_BUFFER_STATE;
-#endif
-
-#ifndef YY_TYPEDEF_YY_SIZE_T
-#define YY_TYPEDEF_YY_SIZE_T
-typedef size_t yy_size_t;
-#endif
-
-extern yy_size_t yyleng;
-
-extern FILE *yyin, *yyout;
-
-#define EOB_ACT_CONTINUE_SCAN 0
-#define EOB_ACT_END_OF_FILE 1
-#define EOB_ACT_LAST_MATCH 2
-
- #define YY_LESS_LINENO(n)
-
-/* Return all but the first "n" matched characters back to the input stream. */
-#define yyless(n) \
- do \
- { \
- /* Undo effects of setting up yytext. */ \
- int yyless_macro_arg = (n); \
- YY_LESS_LINENO(yyless_macro_arg);\
- *yy_cp = (yy_hold_char); \
- YY_RESTORE_YY_MORE_OFFSET \
- (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
- YY_DO_BEFORE_ACTION; /* set up yytext again */ \
- } \
- while ( 0 )
-
-#define unput(c) yyunput( c, (yytext_ptr) )
-
-#ifndef YY_STRUCT_YY_BUFFER_STATE
-#define YY_STRUCT_YY_BUFFER_STATE
-struct yy_buffer_state
- {
- FILE *yy_input_file;
-
- char *yy_ch_buf; /* input buffer */
- char *yy_buf_pos; /* current position in input buffer */
-
- /* Size of input buffer in bytes, not including room for EOB
- * characters.
- */
- yy_size_t yy_buf_size;
-
- /* Number of characters read into yy_ch_buf, not including EOB
- * characters.
- */
- yy_size_t yy_n_chars;
-
- /* Whether we "own" the buffer - i.e., we know we created it,
- * and can realloc() it to grow it, and should free() it to
- * delete it.
- */
- int yy_is_our_buffer;
-
- /* Whether this is an "interactive" input source; if so, and
- * if we're using stdio for input, then we want to use getc()
- * instead of fread(), to make sure we stop fetching input after
- * each newline.
- */
- int yy_is_interactive;
-
- /* Whether we're considered to be at the beginning of a line.
- * If so, '^' rules will be active on the next match, otherwise
- * not.
- */
- int yy_at_bol;
-
- int yy_bs_lineno; /**< The line count. */
- int yy_bs_column; /**< The column count. */
-
- /* Whether to try to fill the input buffer when we reach the
- * end of it.
- */
- int yy_fill_buffer;
-
- int yy_buffer_status;
-
-#define YY_BUFFER_NEW 0
-#define YY_BUFFER_NORMAL 1
- /* When an EOF's been seen but there's still some text to process
- * then we mark the buffer as YY_EOF_PENDING, to indicate that we
- * shouldn't try reading from the input source any more. We might
- * still have a bunch of tokens to match, though, because of
- * possible backing-up.
- *
- * When we actually see the EOF, we change the status to "new"
- * (via yyrestart()), so that the user can continue scanning by
- * just pointing yyin at a new input file.
- */
-#define YY_BUFFER_EOF_PENDING 2
-
- };
-#endif /* !YY_STRUCT_YY_BUFFER_STATE */
-
-/* Stack of input buffers. */
-static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
-static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
-static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
-
-/* We provide macros for accessing buffer states in case in the
- * future we want to put the buffer states in a more general
- * "scanner state".
- *
- * Returns the top of the stack, or NULL.
- */
-#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
- ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
- : NULL)
-
-/* Same as previous macro, but useful when we know that the buffer stack is not
- * NULL or when we need an lvalue. For internal use only.
- */
-#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
-
-/* yy_hold_char holds the character lost when yytext is formed. */
-static char yy_hold_char;
-static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */
-yy_size_t yyleng;
-
-/* Points to current character in buffer. */
-static char *yy_c_buf_p = (char *) 0;
-static int yy_init = 0; /* whether we need to initialize */
-static int yy_start = 0; /* start state number */
-
-/* Flag which is used to allow yywrap()'s to do buffer switches
- * instead of setting up a fresh yyin. A bit of a hack ...
- */
-static int yy_did_buffer_switch_on_eof;
-
-void yyrestart (FILE *input_file );
-void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer );
-YY_BUFFER_STATE yy_create_buffer (FILE *file,int size );
-void yy_delete_buffer (YY_BUFFER_STATE b );
-void yy_flush_buffer (YY_BUFFER_STATE b );
-void yypush_buffer_state (YY_BUFFER_STATE new_buffer );
-void yypop_buffer_state (void );
-
-static void yyensure_buffer_stack (void );
-static void yy_load_buffer_state (void );
-static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file );
-
-#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER )
-
-YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size );
-YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str );
-YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,yy_size_t len );
-
-void *yyalloc (yy_size_t );
-void *yyrealloc (void *,yy_size_t );
-void yyfree (void * );
-
-#define yy_new_buffer yy_create_buffer
-
-#define yy_set_interactive(is_interactive) \
- { \
- if ( ! YY_CURRENT_BUFFER ){ \
- yyensure_buffer_stack (); \
- YY_CURRENT_BUFFER_LVALUE = \
- yy_create_buffer(yyin,YY_BUF_SIZE ); \
- } \
- YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
- }
-
-#define yy_set_bol(at_bol) \
- { \
- if ( ! YY_CURRENT_BUFFER ){\
- yyensure_buffer_stack (); \
- YY_CURRENT_BUFFER_LVALUE = \
- yy_create_buffer(yyin,YY_BUF_SIZE ); \
- } \
- YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
- }
-
-#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
-
-/* Begin user sect3 */
-
-typedef unsigned char YY_CHAR;
-
-FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
-
-typedef int yy_state_type;
-
-extern int yylineno;
-
-int yylineno = 1;
-
-extern char *yytext;
-#define yytext_ptr yytext
-
-static yy_state_type yy_get_previous_state (void );
-static yy_state_type yy_try_NUL_trans (yy_state_type current_state );
-static int yy_get_next_buffer (void );
-static void yy_fatal_error (yyconst char msg[] );
-
-/* Done after the current pattern has been matched and before the
- * corresponding action - sets up yytext.
- */
-#define YY_DO_BEFORE_ACTION \
- (yytext_ptr) = yy_bp; \
- yyleng = (yy_size_t) (yy_cp - yy_bp); \
- (yy_hold_char) = *yy_cp; \
- *yy_cp = '\0'; \
- (yy_c_buf_p) = yy_cp;
-
-#define YY_NUM_RULES 42
-#define YY_END_OF_BUFFER 43
-/* This struct is not used in this scanner,
- but its presence is necessary. */
-struct yy_trans_info
- {
- flex_int32_t yy_verify;
- flex_int32_t yy_nxt;
- };
-static yyconst flex_int16_t yy_accept[199] =
- { 0,
- 0, 0, 43, 42, 34, 36, 35, 33, 42, 28,
- 42, 31, 41, 39, 27, 32, 38, 40, 28, 28,
- 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
- 28, 28, 28, 0, 29, 28, 0, 30, 31, 27,
- 32, 37, 28, 28, 28, 28, 28, 28, 28, 28,
- 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
- 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
- 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
- 28, 28, 28, 28, 28, 28, 28, 12, 6, 28,
- 7, 28, 28, 28, 28, 28, 28, 28, 28, 1,
-
- 28, 28, 28, 16, 28, 28, 28, 28, 28, 28,
- 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
- 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
- 28, 17, 28, 28, 28, 28, 28, 28, 28, 28,
- 28, 28, 14, 28, 28, 28, 19, 21, 28, 28,
- 28, 28, 28, 28, 18, 9, 28, 10, 28, 28,
- 2, 28, 28, 15, 28, 28, 28, 28, 11, 13,
- 28, 5, 28, 28, 22, 28, 8, 28, 28, 28,
- 28, 28, 28, 20, 4, 28, 28, 28, 24, 28,
- 26, 28, 3, 28, 28, 23, 25, 0
-
- } ;
-
-static yyconst flex_int32_t yy_ec[256] =
- { 0,
- 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
- 1, 1, 4, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 5, 1, 6, 1, 7, 1, 1, 8, 1,
- 1, 9, 1, 10, 7, 11, 12, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 7, 14, 12,
- 15, 12, 7, 16, 17, 18, 19, 20, 21, 22,
- 23, 24, 25, 7, 26, 27, 28, 29, 30, 31,
- 7, 32, 33, 34, 35, 36, 37, 38, 39, 40,
- 1, 1, 1, 1, 7, 1, 22, 22, 22, 22,
-
- 22, 22, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 22,
- 7, 7, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1
- } ;
-
-static yyconst flex_int32_t yy_meta[41] =
- { 0,
- 1, 1, 2, 1, 1, 1, 3, 1, 1, 1,
- 1, 4, 5, 1, 1, 4, 6, 6, 6, 6,
- 6, 6, 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
- } ;
-
-static yyconst flex_int16_t yy_base[206] =
- { 0,
- 0, 0, 230, 231, 231, 231, 231, 231, 223, 0,
- 220, 0, 231, 231, 0, 0, 212, 0, 209, 195,
- 24, 186, 202, 14, 197, 186, 27, 188, 198, 25,
- 197, 196, 184, 209, 231, 0, 206, 231, 0, 0,
- 0, 231, 0, 180, 27, 178, 178, 27, 193, 178,
- 183, 189, 179, 177, 175, 178, 185, 182, 183, 170,
- 181, 165, 164, 170, 173, 172, 159, 174, 171, 170,
- 158, 156, 156, 151, 152, 149, 161, 34, 145, 160,
- 145, 146, 154, 157, 147, 141, 139, 0, 0, 138,
- 0, 139, 135, 137, 135, 135, 29, 149, 140, 0,
-
- 136, 139, 145, 0, 136, 139, 132, 132, 30, 132,
- 135, 138, 129, 119, 118, 126, 116, 122, 119, 115,
- 115, 124, 127, 109, 112, 121, 119, 106, 111, 108,
- 106, 0, 106, 103, 112, 99, 91, 97, 99, 95,
- 88, 99, 0, 93, 103, 94, 0, 0, 97, 91,
- 87, 90, 84, 83, 0, 0, 95, 0, 97, 80,
- 0, 92, 91, 0, 78, 70, 91, 74, 0, 0,
- 82, 0, 89, 88, 0, 84, 0, 82, 85, 83,
- 69, 66, 56, 0, 0, 39, 36, 35, 0, 44,
- 0, 43, 0, 40, 39, 0, 0, 231, 67, 71,
-
- 77, 83, 85, 91, 95
- } ;
-
-static yyconst flex_int16_t yy_def[206] =
- { 0,
- 198, 1, 198, 198, 198, 198, 198, 198, 199, 200,
- 201, 202, 198, 198, 203, 204, 198, 205, 200, 200,
- 200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
- 200, 200, 200, 199, 198, 200, 201, 198, 202, 203,
- 204, 198, 200, 200, 200, 200, 200, 200, 200, 200,
- 200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
- 200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
- 200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
- 200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
- 200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
-
- 200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
- 200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
- 200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
- 200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
- 200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
- 200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
- 200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
- 200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
- 200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
- 200, 200, 200, 200, 200, 200, 200, 0, 198, 198,
-
- 198, 198, 198, 198, 198
- } ;
-
-static yyconst flex_int16_t yy_nxt[272] =
- { 0,
- 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
- 14, 4, 15, 16, 17, 18, 10, 19, 20, 21,
- 22, 10, 10, 23, 24, 10, 25, 26, 27, 10,
- 28, 29, 30, 31, 10, 32, 33, 10, 10, 10,
- 46, 50, 51, 54, 47, 58, 66, 70, 59, 60,
- 101, 118, 129, 119, 130, 67, 55, 71, 61, 197,
- 196, 195, 194, 193, 192, 191, 102, 34, 34, 34,
- 34, 34, 34, 36, 36, 36, 36, 37, 37, 37,
- 37, 37, 37, 39, 190, 39, 39, 39, 39, 40,
- 40, 41, 189, 41, 41, 41, 41, 43, 188, 187,
-
- 43, 186, 185, 184, 183, 182, 181, 180, 179, 178,
- 177, 176, 175, 174, 173, 172, 171, 170, 169, 168,
- 167, 166, 165, 164, 163, 162, 161, 160, 159, 158,
- 157, 156, 155, 154, 153, 152, 151, 150, 149, 148,
- 147, 146, 145, 144, 143, 142, 141, 140, 139, 138,
- 137, 136, 135, 134, 133, 132, 131, 128, 127, 126,
- 125, 124, 123, 122, 121, 120, 117, 116, 115, 114,
- 113, 112, 111, 110, 109, 108, 107, 106, 105, 104,
- 103, 100, 99, 98, 97, 96, 95, 94, 93, 92,
- 91, 90, 89, 88, 87, 86, 85, 84, 83, 82,
-
- 81, 80, 79, 78, 77, 76, 75, 74, 73, 72,
- 69, 68, 65, 38, 35, 64, 63, 62, 57, 56,
- 53, 52, 49, 48, 45, 44, 42, 38, 35, 198,
- 3, 198, 198, 198, 198, 198, 198, 198, 198, 198,
- 198, 198, 198, 198, 198, 198, 198, 198, 198, 198,
- 198, 198, 198, 198, 198, 198, 198, 198, 198, 198,
- 198, 198, 198, 198, 198, 198, 198, 198, 198, 198,
- 198
- } ;
-
-static yyconst flex_int16_t yy_chk[272] =
- { 0,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 21, 24, 24, 27, 21, 30, 45, 48, 30, 30,
- 78, 97, 109, 97, 109, 45, 27, 48, 30, 195,
- 194, 192, 190, 188, 187, 186, 78, 199, 199, 199,
- 199, 199, 199, 200, 200, 200, 200, 201, 201, 201,
- 201, 201, 201, 202, 183, 202, 202, 202, 202, 203,
- 203, 204, 182, 204, 204, 204, 204, 205, 181, 180,
-
- 205, 179, 178, 176, 174, 173, 171, 168, 167, 166,
- 165, 163, 162, 160, 159, 157, 154, 153, 152, 151,
- 150, 149, 146, 145, 144, 142, 141, 140, 139, 138,
- 137, 136, 135, 134, 133, 131, 130, 129, 128, 127,
- 126, 125, 124, 123, 122, 121, 120, 119, 118, 117,
- 116, 115, 114, 113, 112, 111, 110, 108, 107, 106,
- 105, 103, 102, 101, 99, 98, 96, 95, 94, 93,
- 92, 90, 87, 86, 85, 84, 83, 82, 81, 80,
- 79, 77, 76, 75, 74, 73, 72, 71, 70, 69,
- 68, 67, 66, 65, 64, 63, 62, 61, 60, 59,
-
- 58, 57, 56, 55, 54, 53, 52, 51, 50, 49,
- 47, 46, 44, 37, 34, 33, 32, 31, 29, 28,
- 26, 25, 23, 22, 20, 19, 17, 11, 9, 3,
- 198, 198, 198, 198, 198, 198, 198, 198, 198, 198,
- 198, 198, 198, 198, 198, 198, 198, 198, 198, 198,
- 198, 198, 198, 198, 198, 198, 198, 198, 198, 198,
- 198, 198, 198, 198, 198, 198, 198, 198, 198, 198,
- 198
- } ;
-
-static yy_state_type yy_last_accepting_state;
-static char *yy_last_accepting_cpos;
-
-extern int yy_flex_debug;
-int yy_flex_debug = 0;
-
-/* The intent behind this definition is that it'll catch
- * any uses of REJECT which flex missed.
- */
-#define REJECT reject_used_but_not_detected
-#define yymore() yymore_used_but_not_detected
-#define YY_MORE_ADJ 0
-#define YY_RESTORE_YY_MORE_OFFSET
-char *yytext;
-#line 1 "deflex.l"
-#line 2 "deflex.l"
-
-/* Copyright 1995, 1997, 1998, 1999, 2002, 2003, 2004, 2005, 2007
- Free Software Foundation, Inc.
-
- This file is part of GNU Binutils.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
- MA 02110-1301, USA. */
-
-
-/* Contributed by Steve Chamberlain: sac@cygnus.com */
-
-#define DONTDECLARE_MALLOC
-#include "libiberty.h"
-#include "defparse.h"
-#include "dlltool.h"
-
-#define YY_NO_UNPUT
-
-int linenumber;
-
-#line 610 "deflex.c"
-
-#define INITIAL 0
-
-#ifndef YY_NO_UNISTD_H
-/* Special case for "unistd.h", since it is non-ANSI. We include it way
- * down here because we want the user's section 1 to have been scanned first.
- * The user has a chance to override it with an option.
- */
-#include
-#endif
-
-#ifndef YY_EXTRA_TYPE
-#define YY_EXTRA_TYPE void *
-#endif
-
-static int yy_init_globals (void );
-
-/* Accessor methods to globals.
- These are made visible to non-reentrant scanners for convenience. */
-
-int yylex_destroy (void );
-
-int yyget_debug (void );
-
-void yyset_debug (int debug_flag );
-
-YY_EXTRA_TYPE yyget_extra (void );
-
-void yyset_extra (YY_EXTRA_TYPE user_defined );
-
-FILE *yyget_in (void );
-
-void yyset_in (FILE * in_str );
-
-FILE *yyget_out (void );
-
-void yyset_out (FILE * out_str );
-
-yy_size_t yyget_leng (void );
-
-char *yyget_text (void );
-
-int yyget_lineno (void );
-
-void yyset_lineno (int line_number );
-
-/* Macros after this point can all be overridden by user definitions in
- * section 1.
- */
-
-#ifndef YY_SKIP_YYWRAP
-#ifdef __cplusplus
-extern "C" int yywrap (void );
-#else
-extern int yywrap (void );
-#endif
-#endif
-
- static void yyunput (int c,char *buf_ptr );
-
-#ifndef yytext_ptr
-static void yy_flex_strncpy (char *,yyconst char *,int );
-#endif
-
-#ifdef YY_NEED_STRLEN
-static int yy_flex_strlen (yyconst char * );
-#endif
-
-#ifndef YY_NO_INPUT
-
-#ifdef __cplusplus
-static int yyinput (void );
-#else
-static int input (void );
-#endif
-
-#endif
-
-/* Amount of stuff to slurp up with each read. */
-#ifndef YY_READ_BUF_SIZE
-#define YY_READ_BUF_SIZE 8192
-#endif
-
-/* Copy whatever the last rule matched to the standard output. */
-#ifndef ECHO
-/* This used to be an fputs(), but since the string might contain NUL's,
- * we now use fwrite().
- */
-#define ECHO fwrite( yytext, yyleng, 1, yyout )
-#endif
-
-/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
- * is returned in "result".
- */
-#ifndef YY_INPUT
-#define YY_INPUT(buf,result,max_size) \
- if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
- { \
- int c = '*'; \
- yy_size_t n; \
- for ( n = 0; n < max_size && \
- (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
- buf[n] = (char) c; \
- if ( c == '\n' ) \
- buf[n++] = (char) c; \
- if ( c == EOF && ferror( yyin ) ) \
- YY_FATAL_ERROR( "input in flex scanner failed" ); \
- result = n; \
- } \
- else \
- { \
- errno=0; \
- while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
- { \
- if( errno != EINTR) \
- { \
- YY_FATAL_ERROR( "input in flex scanner failed" ); \
- break; \
- } \
- errno=0; \
- clearerr(yyin); \
- } \
- }\
-\
-
-#endif
-
-/* No semi-colon after return; correct usage is to write "yyterminate();" -
- * we don't want an extra ';' after the "return" because that will cause
- * some compilers to complain about unreachable statements.
- */
-#ifndef yyterminate
-#define yyterminate() return YY_NULL
-#endif
-
-/* Number of entries by which start-condition stack grows. */
-#ifndef YY_START_STACK_INCR
-#define YY_START_STACK_INCR 25
-#endif
-
-/* Report a fatal error. */
-#ifndef YY_FATAL_ERROR
-#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
-#endif
-
-/* end tables serialization structures and prototypes */
-
-/* Default declaration of generated scanner - a define so the user can
- * easily add parameters.
- */
-#ifndef YY_DECL
-#define YY_DECL_IS_OURS 1
-
-extern int yylex (void);
-
-#define YY_DECL int yylex (void)
-#endif /* !YY_DECL */
-
-/* Code executed at the beginning of each rule, after yytext and yyleng
- * have been set up.
- */
-#ifndef YY_USER_ACTION
-#define YY_USER_ACTION
-#endif
-
-/* Code executed at the end of each rule. */
-#ifndef YY_BREAK
-#define YY_BREAK break;
-#endif
-
-#define YY_RULE_SETUP \
- YY_USER_ACTION
-
-/** The main scanner function which does all the work.
- */
-YY_DECL
-{
- register yy_state_type yy_current_state;
- register char *yy_cp, *yy_bp;
- register int yy_act;
-
-#line 36 "deflex.l"
-
-#line 794 "deflex.c"
-
- if ( !(yy_init) )
- {
- (yy_init) = 1;
-
-#ifdef YY_USER_INIT
- YY_USER_INIT;
-#endif
-
- if ( ! (yy_start) )
- (yy_start) = 1; /* first start state */
-
- if ( ! yyin )
- yyin = stdin;
-
- if ( ! yyout )
- yyout = stdout;
-
- if ( ! YY_CURRENT_BUFFER ) {
- yyensure_buffer_stack ();
- YY_CURRENT_BUFFER_LVALUE =
- yy_create_buffer(yyin,YY_BUF_SIZE );
- }
-
- yy_load_buffer_state( );
- }
-
- while ( 1 ) /* loops until end-of-file is reached */
- {
- yy_cp = (yy_c_buf_p);
-
- /* Support of yytext. */
- *yy_cp = (yy_hold_char);
-
- /* yy_bp points to the position in yy_ch_buf of the start of
- * the current run.
- */
- yy_bp = yy_cp;
-
- yy_current_state = (yy_start);
-yy_match:
- do
- {
- register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
- if ( yy_accept[yy_current_state] )
- {
- (yy_last_accepting_state) = yy_current_state;
- (yy_last_accepting_cpos) = yy_cp;
- }
- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
- {
- yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 199 )
- yy_c = yy_meta[(unsigned int) yy_c];
- }
- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
- ++yy_cp;
- }
- while ( yy_base[yy_current_state] != 231 );
-
-yy_find_action:
- yy_act = yy_accept[yy_current_state];
- if ( yy_act == 0 )
- { /* have to back up */
- yy_cp = (yy_last_accepting_cpos);
- yy_current_state = (yy_last_accepting_state);
- yy_act = yy_accept[yy_current_state];
- }
-
- YY_DO_BEFORE_ACTION;
-
-do_action: /* This label is used only to access EOF actions. */
-
- switch ( yy_act )
- { /* beginning of action switch */
- case 0: /* must back up */
- /* undo the effects of YY_DO_BEFORE_ACTION */
- *yy_cp = (yy_hold_char);
- yy_cp = (yy_last_accepting_cpos);
- yy_current_state = (yy_last_accepting_state);
- goto yy_find_action;
-
-case 1:
-YY_RULE_SETUP
-#line 37 "deflex.l"
-{ return NAME;}
- YY_BREAK
-case 2:
-YY_RULE_SETUP
-#line 38 "deflex.l"
-{ return LIBRARY;}
- YY_BREAK
-case 3:
-YY_RULE_SETUP
-#line 39 "deflex.l"
-{ return DESCRIPTION;}
- YY_BREAK
-case 4:
-YY_RULE_SETUP
-#line 40 "deflex.l"
-{ return STACKSIZE;}
- YY_BREAK
-case 5:
-YY_RULE_SETUP
-#line 41 "deflex.l"
-{ return HEAPSIZE;}
- YY_BREAK
-case 6:
-YY_RULE_SETUP
-#line 42 "deflex.l"
-{ return CODE;}
- YY_BREAK
-case 7:
-YY_RULE_SETUP
-#line 43 "deflex.l"
-{ return DATA;}
- YY_BREAK
-case 8:
-YY_RULE_SETUP
-#line 44 "deflex.l"
-{ return SECTIONS;}
- YY_BREAK
-case 9:
-YY_RULE_SETUP
-#line 45 "deflex.l"
-{ return EXPORTS;}
- YY_BREAK
-case 10:
-YY_RULE_SETUP
-#line 46 "deflex.l"
-{ return IMPORTS;}
- YY_BREAK
-case 11:
-YY_RULE_SETUP
-#line 47 "deflex.l"
-{ return VERSIONK;}
- YY_BREAK
-case 12:
-YY_RULE_SETUP
-#line 48 "deflex.l"
-{ return BASE;}
- YY_BREAK
-case 13:
-YY_RULE_SETUP
-#line 49 "deflex.l"
-{ return CONSTANT; }
- YY_BREAK
-case 14:
-YY_RULE_SETUP
-#line 50 "deflex.l"
-{ return NONAME; }
- YY_BREAK
-case 15:
-YY_RULE_SETUP
-#line 51 "deflex.l"
-{ return PRIVATE; }
- YY_BREAK
-case 16:
-YY_RULE_SETUP
-#line 52 "deflex.l"
-{ return READ;}
- YY_BREAK
-case 17:
-YY_RULE_SETUP
-#line 53 "deflex.l"
-{ return WRITE;}
- YY_BREAK
-case 18:
-YY_RULE_SETUP
-#line 54 "deflex.l"
-{ return EXECUTE;}
- YY_BREAK
-case 19:
-YY_RULE_SETUP
-#line 55 "deflex.l"
-{ return SHARED;}
- YY_BREAK
-case 20:
-YY_RULE_SETUP
-#line 56 "deflex.l"
-{ return NONSHARED;}
- YY_BREAK
-case 21:
-YY_RULE_SETUP
-#line 57 "deflex.l"
-{ return SINGLE;}
- YY_BREAK
-case 22:
-YY_RULE_SETUP
-#line 58 "deflex.l"
-{ return MULTIPLE;}
- YY_BREAK
-case 23:
-YY_RULE_SETUP
-#line 59 "deflex.l"
-{ return INITINSTANCE;}
- YY_BREAK
-case 24:
-YY_RULE_SETUP
-#line 60 "deflex.l"
-{ return INITGLOBAL;}
- YY_BREAK
-case 25:
-YY_RULE_SETUP
-#line 61 "deflex.l"
-{ return TERMINSTANCE;}
- YY_BREAK
-case 26:
-YY_RULE_SETUP
-#line 62 "deflex.l"
-{ return TERMGLOBAL;}
- YY_BREAK
-case 27:
-YY_RULE_SETUP
-#line 64 "deflex.l"
-{ yylval.number = strtol (yytext,0,0);
- return NUMBER; }
- YY_BREAK
-case 28:
-YY_RULE_SETUP
-#line 67 "deflex.l"
-{
- yylval.id = xstrdup (yytext);
- return ID;
- }
- YY_BREAK
-case 29:
-/* rule 29 can match eol */
-YY_RULE_SETUP
-#line 72 "deflex.l"
-{
- yylval.id = xstrdup (yytext+1);
- yylval.id[yyleng-2] = 0;
- return ID;
- }
- YY_BREAK
-case 30:
-/* rule 30 can match eol */
-YY_RULE_SETUP
-#line 78 "deflex.l"
-{
- yylval.id = xstrdup (yytext+1);
- yylval.id[yyleng-2] = 0;
- return ID;
- }
- YY_BREAK
-case 31:
-YY_RULE_SETUP
-#line 83 "deflex.l"
-{ }
- YY_BREAK
-case 32:
-YY_RULE_SETUP
-#line 84 "deflex.l"
-{ }
- YY_BREAK
-case 33:
-YY_RULE_SETUP
-#line 85 "deflex.l"
-{ }
- YY_BREAK
-case 34:
-YY_RULE_SETUP
-#line 86 "deflex.l"
-{ }
- YY_BREAK
-case 35:
-YY_RULE_SETUP
-#line 87 "deflex.l"
-{ }
- YY_BREAK
-case 36:
-/* rule 36 can match eol */
-YY_RULE_SETUP
-#line 88 "deflex.l"
-{ linenumber ++ ;}
- YY_BREAK
-case 37:
-YY_RULE_SETUP
-#line 89 "deflex.l"
-{ return EQUAL;}
- YY_BREAK
-case 38:
-YY_RULE_SETUP
-#line 90 "deflex.l"
-{ return '=';}
- YY_BREAK
-case 39:
-YY_RULE_SETUP
-#line 91 "deflex.l"
-{ return '.';}
- YY_BREAK
-case 40:
-YY_RULE_SETUP
-#line 92 "deflex.l"
-{ return '@';}
- YY_BREAK
-case 41:
-YY_RULE_SETUP
-#line 93 "deflex.l"
-{ return ',';}
- YY_BREAK
-case 42:
-YY_RULE_SETUP
-#line 94 "deflex.l"
-ECHO;
- YY_BREAK
-#line 1102 "deflex.c"
-case YY_STATE_EOF(INITIAL):
- yyterminate();
-
- case YY_END_OF_BUFFER:
- {
- /* Amount of text matched not including the EOB char. */
- int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
-
- /* Undo the effects of YY_DO_BEFORE_ACTION. */
- *yy_cp = (yy_hold_char);
- YY_RESTORE_YY_MORE_OFFSET
-
- if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
- {
- /* We're scanning a new file or input source. It's
- * possible that this happened because the user
- * just pointed yyin at a new source and called
- * yylex(). If so, then we have to assure
- * consistency between YY_CURRENT_BUFFER and our
- * globals. Here is the right place to do so, because
- * this is the first action (other than possibly a
- * back-up) that will match for the new input source.
- */
- (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
- YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
- YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
- }
-
- /* Note that here we test for yy_c_buf_p "<=" to the position
- * of the first EOB in the buffer, since yy_c_buf_p will
- * already have been incremented past the NUL character
- * (since all states make transitions on EOB to the
- * end-of-buffer state). Contrast this with the test
- * in input().
- */
- if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
- { /* This was really a NUL. */
- yy_state_type yy_next_state;
-
- (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
-
- yy_current_state = yy_get_previous_state( );
-
- /* Okay, we're now positioned to make the NUL
- * transition. We couldn't have
- * yy_get_previous_state() go ahead and do it
- * for us because it doesn't know how to deal
- * with the possibility of jamming (and we don't
- * want to build jamming into it because then it
- * will run more slowly).
- */
-
- yy_next_state = yy_try_NUL_trans( yy_current_state );
-
- yy_bp = (yytext_ptr) + YY_MORE_ADJ;
-
- if ( yy_next_state )
- {
- /* Consume the NUL. */
- yy_cp = ++(yy_c_buf_p);
- yy_current_state = yy_next_state;
- goto yy_match;
- }
-
- else
- {
- yy_cp = (yy_c_buf_p);
- goto yy_find_action;
- }
- }
-
- else switch ( yy_get_next_buffer( ) )
- {
- case EOB_ACT_END_OF_FILE:
- {
- (yy_did_buffer_switch_on_eof) = 0;
-
- if ( yywrap( ) )
- {
- /* Note: because we've taken care in
- * yy_get_next_buffer() to have set up
- * yytext, we can now set up
- * yy_c_buf_p so that if some total
- * hoser (like flex itself) wants to
- * call the scanner after we return the
- * YY_NULL, it'll still work - another
- * YY_NULL will get returned.
- */
- (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
-
- yy_act = YY_STATE_EOF(YY_START);
- goto do_action;
- }
-
- else
- {
- if ( ! (yy_did_buffer_switch_on_eof) )
- YY_NEW_FILE;
- }
- break;
- }
-
- case EOB_ACT_CONTINUE_SCAN:
- (yy_c_buf_p) =
- (yytext_ptr) + yy_amount_of_matched_text;
-
- yy_current_state = yy_get_previous_state( );
-
- yy_cp = (yy_c_buf_p);
- yy_bp = (yytext_ptr) + YY_MORE_ADJ;
- goto yy_match;
-
- case EOB_ACT_LAST_MATCH:
- (yy_c_buf_p) =
- &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
-
- yy_current_state = yy_get_previous_state( );
-
- yy_cp = (yy_c_buf_p);
- yy_bp = (yytext_ptr) + YY_MORE_ADJ;
- goto yy_find_action;
- }
- break;
- }
-
- default:
- YY_FATAL_ERROR(
- "fatal flex scanner internal error--no action found" );
- } /* end of action switch */
- } /* end of scanning one token */
-} /* end of yylex */
-
-/* yy_get_next_buffer - try to read in a new buffer
- *
- * Returns a code representing an action:
- * EOB_ACT_LAST_MATCH -
- * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
- * EOB_ACT_END_OF_FILE - end of file
- */
-static int yy_get_next_buffer (void)
-{
- register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
- register char *source = (yytext_ptr);
- register int number_to_move, i;
- int ret_val;
-
- if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
- YY_FATAL_ERROR(
- "fatal flex scanner internal error--end of buffer missed" );
-
- if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
- { /* Don't try to fill the buffer, so this is an EOF. */
- if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
- {
- /* We matched a single character, the EOB, so
- * treat this as a final EOF.
- */
- return EOB_ACT_END_OF_FILE;
- }
-
- else
- {
- /* We matched some text prior to the EOB, first
- * process it.
- */
- return EOB_ACT_LAST_MATCH;
- }
- }
-
- /* Try to read more data. */
-
- /* First move last chars to start of buffer. */
- number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
-
- for ( i = 0; i < number_to_move; ++i )
- *(dest++) = *(source++);
-
- if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
- /* don't do the read, it's not guaranteed to return an EOF,
- * just force an EOF
- */
- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
-
- else
- {
- yy_size_t num_to_read =
- YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
-
- while ( num_to_read <= 0 )
- { /* Not enough room in the buffer - grow it. */
-
- /* just a shorter name for the current buffer */
- YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
-
- int yy_c_buf_p_offset =
- (int) ((yy_c_buf_p) - b->yy_ch_buf);
-
- if ( b->yy_is_our_buffer )
- {
- yy_size_t new_size = b->yy_buf_size * 2;
-
- if ( new_size <= 0 )
- b->yy_buf_size += b->yy_buf_size / 8;
- else
- b->yy_buf_size *= 2;
-
- b->yy_ch_buf = (char *)
- /* Include room in for 2 EOB chars. */
- yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 );
- }
- else
- /* Can't grow it, we don't own it. */
- b->yy_ch_buf = 0;
-
- if ( ! b->yy_ch_buf )
- YY_FATAL_ERROR(
- "fatal error - scanner input buffer overflow" );
-
- (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
-
- num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
- number_to_move - 1;
-
- }
-
- if ( num_to_read > YY_READ_BUF_SIZE )
- num_to_read = YY_READ_BUF_SIZE;
-
- /* Read in more data. */
- YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
- (yy_n_chars), num_to_read );
-
- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
- }
-
- if ( (yy_n_chars) == 0 )
- {
- if ( number_to_move == YY_MORE_ADJ )
- {
- ret_val = EOB_ACT_END_OF_FILE;
- yyrestart(yyin );
- }
-
- else
- {
- ret_val = EOB_ACT_LAST_MATCH;
- YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
- YY_BUFFER_EOF_PENDING;
- }
- }
-
- else
- ret_val = EOB_ACT_CONTINUE_SCAN;
-
- if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
- /* Extend the array by 50%, plus the number we really need. */
- yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size );
- if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
- YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
- }
-
- (yy_n_chars) += number_to_move;
- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
-
- (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
-
- return ret_val;
-}
-
-/* yy_get_previous_state - get the state just before the EOB char was reached */
-
- static yy_state_type yy_get_previous_state (void)
-{
- register yy_state_type yy_current_state;
- register char *yy_cp;
-
- yy_current_state = (yy_start);
-
- for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
- {
- register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
- if ( yy_accept[yy_current_state] )
- {
- (yy_last_accepting_state) = yy_current_state;
- (yy_last_accepting_cpos) = yy_cp;
- }
- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
- {
- yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 199 )
- yy_c = yy_meta[(unsigned int) yy_c];
- }
- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
- }
-
- return yy_current_state;
-}
-
-/* yy_try_NUL_trans - try to make a transition on the NUL character
- *
- * synopsis
- * next_state = yy_try_NUL_trans( current_state );
- */
- static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
-{
- register int yy_is_jam;
- register char *yy_cp = (yy_c_buf_p);
-
- register YY_CHAR yy_c = 1;
- if ( yy_accept[yy_current_state] )
- {
- (yy_last_accepting_state) = yy_current_state;
- (yy_last_accepting_cpos) = yy_cp;
- }
- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
- {
- yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 199 )
- yy_c = yy_meta[(unsigned int) yy_c];
- }
- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
- yy_is_jam = (yy_current_state == 198);
-
- return yy_is_jam ? 0 : yy_current_state;
-}
-
- static void yyunput (int c, register char * yy_bp )
-{
- register char *yy_cp;
-
- yy_cp = (yy_c_buf_p);
-
- /* undo effects of setting up yytext */
- *yy_cp = (yy_hold_char);
-
- if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
- { /* need to shift things up to make room */
- /* +2 for EOB chars. */
- register yy_size_t number_to_move = (yy_n_chars) + 2;
- register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
- YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
- register char *source =
- &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
-
- while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
- *--dest = *--source;
-
- yy_cp += (int) (dest - source);
- yy_bp += (int) (dest - source);
- YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
- (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
-
- if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
- YY_FATAL_ERROR( "flex scanner push-back overflow" );
- }
-
- *--yy_cp = (char) c;
-
- (yytext_ptr) = yy_bp;
- (yy_hold_char) = *yy_cp;
- (yy_c_buf_p) = yy_cp;
-}
-
-#ifndef YY_NO_INPUT
-#ifdef __cplusplus
- static int yyinput (void)
-#else
- static int input (void)
-#endif
-
-{
- int c;
-
- *(yy_c_buf_p) = (yy_hold_char);
-
- if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
- {
- /* yy_c_buf_p now points to the character we want to return.
- * If this occurs *before* the EOB characters, then it's a
- * valid NUL; if not, then we've hit the end of the buffer.
- */
- if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
- /* This was really a NUL. */
- *(yy_c_buf_p) = '\0';
-
- else
- { /* need more input */
- yy_size_t offset = (yy_c_buf_p) - (yytext_ptr);
- ++(yy_c_buf_p);
-
- switch ( yy_get_next_buffer( ) )
- {
- case EOB_ACT_LAST_MATCH:
- /* This happens because yy_g_n_b()
- * sees that we've accumulated a
- * token and flags that we need to
- * try matching the token before
- * proceeding. But for input(),
- * there's no matching to consider.
- * So convert the EOB_ACT_LAST_MATCH
- * to EOB_ACT_END_OF_FILE.
- */
-
- /* Reset buffer status. */
- yyrestart(yyin );
-
- /*FALLTHROUGH*/
-
- case EOB_ACT_END_OF_FILE:
- {
- if ( yywrap( ) )
- return 0;
-
- if ( ! (yy_did_buffer_switch_on_eof) )
- YY_NEW_FILE;
-#ifdef __cplusplus
- return yyinput();
-#else
- return input();
-#endif
- }
-
- case EOB_ACT_CONTINUE_SCAN:
- (yy_c_buf_p) = (yytext_ptr) + offset;
- break;
- }
- }
- }
-
- c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */
- *(yy_c_buf_p) = '\0'; /* preserve yytext */
- (yy_hold_char) = *++(yy_c_buf_p);
-
- return c;
-}
-#endif /* ifndef YY_NO_INPUT */
-
-/** Immediately switch to a different input stream.
- * @param input_file A readable stream.
- *
- * @note This function does not reset the start condition to @c INITIAL .
- */
- void yyrestart (FILE * input_file )
-{
-
- if ( ! YY_CURRENT_BUFFER ){
- yyensure_buffer_stack ();
- YY_CURRENT_BUFFER_LVALUE =
- yy_create_buffer(yyin,YY_BUF_SIZE );
- }
-
- yy_init_buffer(YY_CURRENT_BUFFER,input_file );
- yy_load_buffer_state( );
-}
-
-/** Switch to a different input buffer.
- * @param new_buffer The new input buffer.
- *
- */
- void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer )
-{
-
- /* TODO. We should be able to replace this entire function body
- * with
- * yypop_buffer_state();
- * yypush_buffer_state(new_buffer);
- */
- yyensure_buffer_stack ();
- if ( YY_CURRENT_BUFFER == new_buffer )
- return;
-
- if ( YY_CURRENT_BUFFER )
- {
- /* Flush out information for old buffer. */
- *(yy_c_buf_p) = (yy_hold_char);
- YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
- }
-
- YY_CURRENT_BUFFER_LVALUE = new_buffer;
- yy_load_buffer_state( );
-
- /* We don't actually know whether we did this switch during
- * EOF (yywrap()) processing, but the only time this flag
- * is looked at is after yywrap() is called, so it's safe
- * to go ahead and always set it.
- */
- (yy_did_buffer_switch_on_eof) = 1;
-}
-
-static void yy_load_buffer_state (void)
-{
- (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
- (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
- yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
- (yy_hold_char) = *(yy_c_buf_p);
-}
-
-/** Allocate and initialize an input buffer state.
- * @param file A readable stream.
- * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
- *
- * @return the allocated buffer state.
- */
- YY_BUFFER_STATE yy_create_buffer (FILE * file, int size )
-{
- YY_BUFFER_STATE b;
-
- b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) );
- if ( ! b )
- YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
-
- b->yy_buf_size = size;
-
- /* yy_ch_buf has to be 2 characters longer than the size given because
- * we need to put in 2 end-of-buffer characters.
- */
- b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 );
- if ( ! b->yy_ch_buf )
- YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
-
- b->yy_is_our_buffer = 1;
-
- yy_init_buffer(b,file );
-
- return b;
-}
-
-/** Destroy the buffer.
- * @param b a buffer created with yy_create_buffer()
- *
- */
- void yy_delete_buffer (YY_BUFFER_STATE b )
-{
-
- if ( ! b )
- return;
-
- if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
- YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
-
- if ( b->yy_is_our_buffer )
- yyfree((void *) b->yy_ch_buf );
-
- yyfree((void *) b );
-}
-
-#ifndef __cplusplus
-extern int isatty (int );
-#endif /* __cplusplus */
-
-/* Initializes or reinitializes a buffer.
- * This function is sometimes called more than once on the same buffer,
- * such as during a yyrestart() or at EOF.
- */
- static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file )
-
-{
- int oerrno = errno;
-
- yy_flush_buffer(b );
-
- b->yy_input_file = file;
- b->yy_fill_buffer = 1;
-
- /* If b is the current buffer, then yy_init_buffer was _probably_
- * called from yyrestart() or through yy_get_next_buffer.
- * In that case, we don't want to reset the lineno or column.
- */
- if (b != YY_CURRENT_BUFFER){
- b->yy_bs_lineno = 1;
- b->yy_bs_column = 0;
- }
-
- b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
-
- errno = oerrno;
-}
-
-/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
- * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
- *
- */
- void yy_flush_buffer (YY_BUFFER_STATE b )
-{
- if ( ! b )
- return;
-
- b->yy_n_chars = 0;
-
- /* We always need two end-of-buffer characters. The first causes
- * a transition to the end-of-buffer state. The second causes
- * a jam in that state.
- */
- b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
- b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
-
- b->yy_buf_pos = &b->yy_ch_buf[0];
-
- b->yy_at_bol = 1;
- b->yy_buffer_status = YY_BUFFER_NEW;
-
- if ( b == YY_CURRENT_BUFFER )
- yy_load_buffer_state( );
-}
-
-/** Pushes the new state onto the stack. The new state becomes
- * the current state. This function will allocate the stack
- * if necessary.
- * @param new_buffer The new state.
- *
- */
-void yypush_buffer_state (YY_BUFFER_STATE new_buffer )
-{
- if (new_buffer == NULL)
- return;
-
- yyensure_buffer_stack();
-
- /* This block is copied from yy_switch_to_buffer. */
- if ( YY_CURRENT_BUFFER )
- {
- /* Flush out information for old buffer. */
- *(yy_c_buf_p) = (yy_hold_char);
- YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
- }
-
- /* Only push if top exists. Otherwise, replace top. */
- if (YY_CURRENT_BUFFER)
- (yy_buffer_stack_top)++;
- YY_CURRENT_BUFFER_LVALUE = new_buffer;
-
- /* copied from yy_switch_to_buffer. */
- yy_load_buffer_state( );
- (yy_did_buffer_switch_on_eof) = 1;
-}
-
-/** Removes and deletes the top of the stack, if present.
- * The next element becomes the new top.
- *
- */
-void yypop_buffer_state (void)
-{
- if (!YY_CURRENT_BUFFER)
- return;
-
- yy_delete_buffer(YY_CURRENT_BUFFER );
- YY_CURRENT_BUFFER_LVALUE = NULL;
- if ((yy_buffer_stack_top) > 0)
- --(yy_buffer_stack_top);
-
- if (YY_CURRENT_BUFFER) {
- yy_load_buffer_state( );
- (yy_did_buffer_switch_on_eof) = 1;
- }
-}
-
-/* Allocates the stack if it does not exist.
- * Guarantees space for at least one push.
- */
-static void yyensure_buffer_stack (void)
-{
- yy_size_t num_to_alloc;
-
- if (!(yy_buffer_stack)) {
-
- /* First allocation is just for 2 elements, since we don't know if this
- * scanner will even need a stack. We use 2 instead of 1 to avoid an
- * immediate realloc on the next call.
- */
- num_to_alloc = 1;
- (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc
- (num_to_alloc * sizeof(struct yy_buffer_state*)
- );
- if ( ! (yy_buffer_stack) )
- YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
-
- memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
-
- (yy_buffer_stack_max) = num_to_alloc;
- (yy_buffer_stack_top) = 0;
- return;
- }
-
- if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
-
- /* Increase the buffer to prepare for a possible push. */
- int grow_size = 8 /* arbitrary grow size */;
-
- num_to_alloc = (yy_buffer_stack_max) + grow_size;
- (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc
- ((yy_buffer_stack),
- num_to_alloc * sizeof(struct yy_buffer_state*)
- );
- if ( ! (yy_buffer_stack) )
- YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
-
- /* zero only the new slots.*/
- memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
- (yy_buffer_stack_max) = num_to_alloc;
- }
-}
-
-/** Setup the input buffer state to scan directly from a user-specified character buffer.
- * @param base the character buffer
- * @param size the size in bytes of the character buffer
- *
- * @return the newly allocated buffer state object.
- */
-YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size )
-{
- YY_BUFFER_STATE b;
-
- if ( size < 2 ||
- base[size-2] != YY_END_OF_BUFFER_CHAR ||
- base[size-1] != YY_END_OF_BUFFER_CHAR )
- /* They forgot to leave room for the EOB's. */
- return 0;
-
- b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) );
- if ( ! b )
- YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
-
- b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
- b->yy_buf_pos = b->yy_ch_buf = base;
- b->yy_is_our_buffer = 0;
- b->yy_input_file = 0;
- b->yy_n_chars = b->yy_buf_size;
- b->yy_is_interactive = 0;
- b->yy_at_bol = 1;
- b->yy_fill_buffer = 0;
- b->yy_buffer_status = YY_BUFFER_NEW;
-
- yy_switch_to_buffer(b );
-
- return b;
-}
-
-/** Setup the input buffer state to scan a string. The next call to yylex() will
- * scan from a @e copy of @a str.
- * @param yystr a NUL-terminated string to scan
- *
- * @return the newly allocated buffer state object.
- * @note If you want to scan bytes that may contain NUL values, then use
- * yy_scan_bytes() instead.
- */
-YY_BUFFER_STATE yy_scan_string (yyconst char * yystr )
-{
-
- return yy_scan_bytes(yystr,strlen(yystr) );
-}
-
-/** Setup the input buffer state to scan the given bytes. The next call to yylex() will
- * scan from a @e copy of @a bytes.
- * @param bytes the byte buffer to scan
- * @param len the number of bytes in the buffer pointed to by @a bytes.
- *
- * @return the newly allocated buffer state object.
- */
-YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len )
-{
- YY_BUFFER_STATE b;
- char *buf;
- yy_size_t n, i;
-
- /* Get memory for full buffer, including space for trailing EOB's. */
- n = _yybytes_len + 2;
- buf = (char *) yyalloc(n );
- if ( ! buf )
- YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
-
- for ( i = 0; i < _yybytes_len; ++i )
- buf[i] = yybytes[i];
-
- buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
-
- b = yy_scan_buffer(buf,n );
- if ( ! b )
- YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
-
- /* It's okay to grow etc. this buffer, and we should throw it
- * away when we're done.
- */
- b->yy_is_our_buffer = 1;
-
- return b;
-}
-
-#ifndef YY_EXIT_FAILURE
-#define YY_EXIT_FAILURE 2
-#endif
-
-static void yy_fatal_error (yyconst char* msg )
-{
- (void) fprintf( stderr, "%s\n", msg );
- exit( YY_EXIT_FAILURE );
-}
-
-/* Redefine yyless() so it works in section 3 code. */
-
-#undef yyless
-#define yyless(n) \
- do \
- { \
- /* Undo effects of setting up yytext. */ \
- int yyless_macro_arg = (n); \
- YY_LESS_LINENO(yyless_macro_arg);\
- yytext[yyleng] = (yy_hold_char); \
- (yy_c_buf_p) = yytext + yyless_macro_arg; \
- (yy_hold_char) = *(yy_c_buf_p); \
- *(yy_c_buf_p) = '\0'; \
- yyleng = yyless_macro_arg; \
- } \
- while ( 0 )
-
-/* Accessor methods (get/set functions) to struct members. */
-
-/** Get the current line number.
- *
- */
-int yyget_lineno (void)
-{
-
- return yylineno;
-}
-
-/** Get the input stream.
- *
- */
-FILE *yyget_in (void)
-{
- return yyin;
-}
-
-/** Get the output stream.
- *
- */
-FILE *yyget_out (void)
-{
- return yyout;
-}
-
-/** Get the length of the current token.
- *
- */
-yy_size_t yyget_leng (void)
-{
- return yyleng;
-}
-
-/** Get the current token.
- *
- */
-
-char *yyget_text (void)
-{
- return yytext;
-}
-
-/** Set the current line number.
- * @param line_number
- *
- */
-void yyset_lineno (int line_number )
-{
-
- yylineno = line_number;
-}
-
-/** Set the input stream. This does not discard the current
- * input buffer.
- * @param in_str A readable stream.
- *
- * @see yy_switch_to_buffer
- */
-void yyset_in (FILE * in_str )
-{
- yyin = in_str ;
-}
-
-void yyset_out (FILE * out_str )
-{
- yyout = out_str ;
-}
-
-int yyget_debug (void)
-{
- return yy_flex_debug;
-}
-
-void yyset_debug (int bdebug )
-{
- yy_flex_debug = bdebug ;
-}
-
-static int yy_init_globals (void)
-{
- /* Initialization is the same as for the non-reentrant scanner.
- * This function is called from yylex_destroy(), so don't allocate here.
- */
-
- (yy_buffer_stack) = 0;
- (yy_buffer_stack_top) = 0;
- (yy_buffer_stack_max) = 0;
- (yy_c_buf_p) = (char *) 0;
- (yy_init) = 0;
- (yy_start) = 0;
-
-/* Defined in main.c */
-#ifdef YY_STDINIT
- yyin = stdin;
- yyout = stdout;
-#else
- yyin = (FILE *) 0;
- yyout = (FILE *) 0;
-#endif
-
- /* For future reference: Set errno on error, since we are called by
- * yylex_init()
- */
- return 0;
-}
-
-/* yylex_destroy is for both reentrant and non-reentrant scanners. */
-int yylex_destroy (void)
-{
-
- /* Pop the buffer stack, destroying each element. */
- while(YY_CURRENT_BUFFER){
- yy_delete_buffer(YY_CURRENT_BUFFER );
- YY_CURRENT_BUFFER_LVALUE = NULL;
- yypop_buffer_state();
- }
-
- /* Destroy the stack itself. */
- yyfree((yy_buffer_stack) );
- (yy_buffer_stack) = NULL;
-
- /* Reset the globals. This is important in a non-reentrant scanner so the next time
- * yylex() is called, initialization will occur. */
- yy_init_globals( );
-
- return 0;
-}
-
-/*
- * Internal utility routines.
- */
-
-#ifndef yytext_ptr
-static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
-{
- register int i;
- for ( i = 0; i < n; ++i )
- s1[i] = s2[i];
-}
-#endif
-
-#ifdef YY_NEED_STRLEN
-static int yy_flex_strlen (yyconst char * s )
-{
- register int n;
- for ( n = 0; s[n]; ++n )
- ;
-
- return n;
-}
-#endif
-
-void *yyalloc (yy_size_t size )
-{
- return (void *) malloc( size );
-}
-
-void *yyrealloc (void * ptr, yy_size_t size )
-{
- /* The cast to (char *) in the following accommodates both
- * implementations that use char* generic pointers, and those
- * that use void* generic pointers. It works with the latter
- * because both ANSI C and C++ allow castless assignment from
- * any pointer type to void*, and deal with argument conversions
- * as though doing an assignment.
- */
- return (void *) realloc( (char *) ptr, size );
-}
-
-void yyfree (void * ptr )
-{
- free( (char *) ptr ); /* see yyrealloc() for (char *) cast */
-}
-
-#define YYTABLES_NAME "yytables"
-
-#line 94 "deflex.l"
-
-
-#ifndef yywrap
-/* Needed for lex, though not flex. */
-int yywrap(void) { return 1; }
-#endif
-
diff -Nur binutils-2.24.orig/binutils/defparse.c binutils-2.24/binutils/defparse.c
--- binutils-2.24.orig/binutils/defparse.c 2013-11-18 09:49:30.000000000 +0100
+++ binutils-2.24/binutils/defparse.c 1970-01-01 01:00:00.000000000 +0100
@@ -1,2142 +0,0 @@
-/* A Bison parser, made by GNU Bison 2.3. */
-
-/* Skeleton implementation for Bison's Yacc-like parsers in C
-
- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
- Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA. */
-
-/* As a special exception, you may create a larger work that contains
- part or all of the Bison parser skeleton and distribute that work
- under terms of your choice, so long as that work isn't itself a
- parser generator using the skeleton or a modified version thereof
- as a parser skeleton. Alternatively, if you modify or redistribute
- the parser skeleton itself, you may (at your option) remove this
- special exception, which will cause the skeleton and the resulting
- Bison output files to be licensed under the GNU General Public
- License without this special exception.
-
- This special exception was added by the Free Software Foundation in
- version 2.2 of Bison. */
-
-/* C LALR(1) parser skeleton written by Richard Stallman, by
- simplifying the original so-called "semantic" parser. */
-
-/* All symbols defined below should begin with yy or YY, to avoid
- infringing on user name space. This should be done even for local
- variables, as they might otherwise be expanded by user macros.
- There are some unavoidable exceptions within include files to
- define necessary library symbols; they are noted "INFRINGES ON
- USER NAME SPACE" below. */
-
-/* Identify Bison output. */
-#define YYBISON 1
-
-/* Bison version. */
-#define YYBISON_VERSION "2.3"
-
-/* Skeleton name. */
-#define YYSKELETON_NAME "yacc.c"
-
-/* Pure parsers. */
-#define YYPURE 0
-
-/* Using locations. */
-#define YYLSP_NEEDED 0
-
-
-
-/* Tokens. */
-#ifndef YYTOKENTYPE
-# define YYTOKENTYPE
- /* Put the tokens into the symbol table, so that GDB and other debuggers
- know about them. */
- enum yytokentype {
- NAME = 258,
- LIBRARY = 259,
- DESCRIPTION = 260,
- STACKSIZE = 261,
- HEAPSIZE = 262,
- CODE = 263,
- DATA = 264,
- SECTIONS = 265,
- EXPORTS = 266,
- IMPORTS = 267,
- VERSIONK = 268,
- BASE = 269,
- CONSTANT = 270,
- READ = 271,
- WRITE = 272,
- EXECUTE = 273,
- SHARED = 274,
- NONSHARED = 275,
- NONAME = 276,
- PRIVATE = 277,
- SINGLE = 278,
- MULTIPLE = 279,
- INITINSTANCE = 280,
- INITGLOBAL = 281,
- TERMINSTANCE = 282,
- TERMGLOBAL = 283,
- EQUAL = 284,
- ID = 285,
- NUMBER = 286
- };
-#endif
-/* Tokens. */
-#define NAME 258
-#define LIBRARY 259
-#define DESCRIPTION 260
-#define STACKSIZE 261
-#define HEAPSIZE 262
-#define CODE 263
-#define DATA 264
-#define SECTIONS 265
-#define EXPORTS 266
-#define IMPORTS 267
-#define VERSIONK 268
-#define BASE 269
-#define CONSTANT 270
-#define READ 271
-#define WRITE 272
-#define EXECUTE 273
-#define SHARED 274
-#define NONSHARED 275
-#define NONAME 276
-#define PRIVATE 277
-#define SINGLE 278
-#define MULTIPLE 279
-#define INITINSTANCE 280
-#define INITGLOBAL 281
-#define TERMINSTANCE 282
-#define TERMGLOBAL 283
-#define EQUAL 284
-#define ID 285
-#define NUMBER 286
-
-
-
-
-/* Copy the first part of user declarations. */
-#line 1 "defparse.y"
- /* defparse.y - parser for .def files */
-
-/* Copyright 1995, 1997, 1998, 1999, 2001, 2004, 2005, 2007
- Free Software Foundation, Inc.
-
- This file is part of GNU Binutils.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
- MA 02110-1301, USA. */
-
-#include "sysdep.h"
-#include "bfd.h"
-#include "libiberty.h"
-#include "dlltool.h"
-
-
-/* Enabling traces. */
-#ifndef YYDEBUG
-# define YYDEBUG 0
-#endif
-
-/* Enabling verbose error messages. */
-#ifdef YYERROR_VERBOSE
-# undef YYERROR_VERBOSE
-# define YYERROR_VERBOSE 1
-#else
-# define YYERROR_VERBOSE 0
-#endif
-
-/* Enabling the token table. */
-#ifndef YYTOKEN_TABLE
-# define YYTOKEN_TABLE 0
-#endif
-
-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-typedef union YYSTYPE
-#line 29 "defparse.y"
-{
- char *id;
- const char *id_const;
- int number;
-}
-/* Line 193 of yacc.c. */
-#line 192 "defparse.c"
- YYSTYPE;
-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
-# define YYSTYPE_IS_DECLARED 1
-# define YYSTYPE_IS_TRIVIAL 1
-#endif
-
-
-
-/* Copy the second part of user declarations. */
-
-
-/* Line 216 of yacc.c. */
-#line 205 "defparse.c"
-
-#ifdef short
-# undef short
-#endif
-
-#ifdef YYTYPE_UINT8
-typedef YYTYPE_UINT8 yytype_uint8;
-#else
-typedef unsigned char yytype_uint8;
-#endif
-
-#ifdef YYTYPE_INT8
-typedef YYTYPE_INT8 yytype_int8;
-#elif (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-typedef signed char yytype_int8;
-#else
-typedef short int yytype_int8;
-#endif
-
-#ifdef YYTYPE_UINT16
-typedef YYTYPE_UINT16 yytype_uint16;
-#else
-typedef unsigned short int yytype_uint16;
-#endif
-
-#ifdef YYTYPE_INT16
-typedef YYTYPE_INT16 yytype_int16;
-#else
-typedef short int yytype_int16;
-#endif
-
-#ifndef YYSIZE_T
-# ifdef __SIZE_TYPE__
-# define YYSIZE_T __SIZE_TYPE__
-# elif defined size_t
-# define YYSIZE_T size_t
-# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-# include /* INFRINGES ON USER NAME SPACE */
-# define YYSIZE_T size_t
-# else
-# define YYSIZE_T unsigned int
-# endif
-#endif
-
-#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
-
-#ifndef YY_
-# if defined YYENABLE_NLS && YYENABLE_NLS
-# if ENABLE_NLS
-# include /* INFRINGES ON USER NAME SPACE */
-# define YY_(msgid) dgettext ("bison-runtime", msgid)
-# endif
-# endif
-# ifndef YY_
-# define YY_(msgid) msgid
-# endif
-#endif
-
-/* Suppress unused-variable warnings by "using" E. */
-#if ! defined lint || defined __GNUC__
-# define YYUSE(e) ((void) (e))
-#else
-# define YYUSE(e) /* empty */
-#endif
-
-/* Identity function, used to suppress warnings about constant conditions. */
-#ifndef lint
-# define YYID(n) (n)
-#else
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static int
-YYID (int i)
-#else
-static int
-YYID (i)
- int i;
-#endif
-{
- return i;
-}
-#endif
-
-#if ! defined yyoverflow || YYERROR_VERBOSE
-
-/* The parser invokes alloca or malloc; define the necessary symbols. */
-
-# ifdef YYSTACK_USE_ALLOCA
-# if YYSTACK_USE_ALLOCA
-# ifdef __GNUC__
-# define YYSTACK_ALLOC __builtin_alloca
-# elif defined __BUILTIN_VA_ARG_INCR
-# include /* INFRINGES ON USER NAME SPACE */
-# elif defined _AIX
-# define YYSTACK_ALLOC __alloca
-# elif defined _MSC_VER
-# include /* INFRINGES ON USER NAME SPACE */
-# define alloca _alloca
-# else
-# define YYSTACK_ALLOC alloca
-# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-# include /* INFRINGES ON USER NAME SPACE */
-# ifndef _STDLIB_H
-# define _STDLIB_H 1
-# endif
-# endif
-# endif
-# endif
-# endif
-
-# ifdef YYSTACK_ALLOC
- /* Pacify GCC's `empty if-body' warning. */
-# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
-# ifndef YYSTACK_ALLOC_MAXIMUM
- /* The OS might guarantee only one guard page at the bottom of the stack,
- and a page size can be as small as 4096 bytes. So we cannot safely
- invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
- to allow for a few compiler-allocated temporary stack slots. */
-# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
-# endif
-# else
-# define YYSTACK_ALLOC YYMALLOC
-# define YYSTACK_FREE YYFREE
-# ifndef YYSTACK_ALLOC_MAXIMUM
-# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
-# endif
-# if (defined __cplusplus && ! defined _STDLIB_H \
- && ! ((defined YYMALLOC || defined malloc) \
- && (defined YYFREE || defined free)))
-# include /* INFRINGES ON USER NAME SPACE */
-# ifndef _STDLIB_H
-# define _STDLIB_H 1
-# endif
-# endif
-# ifndef YYMALLOC
-# define YYMALLOC malloc
-# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
-# endif
-# endif
-# ifndef YYFREE
-# define YYFREE free
-# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-void free (void *); /* INFRINGES ON USER NAME SPACE */
-# endif
-# endif
-# endif
-#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
-
-
-#if (! defined yyoverflow \
- && (! defined __cplusplus \
- || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
-
-/* A type that is properly aligned for any stack member. */
-union yyalloc
-{
- yytype_int16 yyss;
- YYSTYPE yyvs;
- };
-
-/* The size of the maximum gap between one aligned stack and the next. */
-# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
-
-/* The size of an array large to enough to hold all stacks, each with
- N elements. */
-# define YYSTACK_BYTES(N) \
- ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
- + YYSTACK_GAP_MAXIMUM)
-
-/* Copy COUNT objects from FROM to TO. The source and destination do
- not overlap. */
-# ifndef YYCOPY
-# if defined __GNUC__ && 1 < __GNUC__
-# define YYCOPY(To, From, Count) \
- __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
-# else
-# define YYCOPY(To, From, Count) \
- do \
- { \
- YYSIZE_T yyi; \
- for (yyi = 0; yyi < (Count); yyi++) \
- (To)[yyi] = (From)[yyi]; \
- } \
- while (YYID (0))
-# endif
-# endif
-
-/* Relocate STACK from its old location to the new one. The
- local variables YYSIZE and YYSTACKSIZE give the old and new number of
- elements in the stack, and YYPTR gives the new location of the
- stack. Advance YYPTR to a properly aligned location for the next
- stack. */
-# define YYSTACK_RELOCATE(Stack) \
- do \
- { \
- YYSIZE_T yynewbytes; \
- YYCOPY (&yyptr->Stack, Stack, yysize); \
- Stack = &yyptr->Stack; \
- yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
- yyptr += yynewbytes / sizeof (*yyptr); \
- } \
- while (YYID (0))
-
-#endif
-
-/* YYFINAL -- State number of the termination state. */
-#define YYFINAL 66
-/* YYLAST -- Last index in YYTABLE. */
-#define YYLAST 141
-
-/* YYNTOKENS -- Number of terminals. */
-#define YYNTOKENS 36
-/* YYNNTS -- Number of nonterminals. */
-#define YYNNTS 26
-/* YYNRULES -- Number of rules. */
-#define YYNRULES 98
-/* YYNRULES -- Number of states. */
-#define YYNSTATES 139
-
-/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
-#define YYUNDEFTOK 2
-#define YYMAXUTOK 286
-
-#define YYTRANSLATE(YYX) \
- ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
-
-/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */
-static const yytype_uint8 yytranslate[] =
-{
- 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 34, 2, 32, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 33, 2, 2, 35, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
- 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
- 25, 26, 27, 28, 29, 30, 31
-};
-
-#if YYDEBUG
-/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
- YYRHS. */
-static const yytype_uint16 yyprhs[] =
-{
- 0, 0, 3, 6, 8, 12, 17, 20, 23, 27,
- 31, 34, 37, 40, 43, 46, 51, 52, 55, 64,
- 67, 69, 78, 87, 94, 101, 108, 115, 120, 125,
- 128, 130, 133, 137, 139, 141, 142, 145, 146, 148,
- 150, 152, 154, 156, 158, 160, 162, 163, 165, 166,
- 168, 169, 171, 172, 174, 176, 178, 180, 182, 184,
- 186, 188, 190, 192, 194, 196, 198, 200, 202, 204,
- 206, 208, 210, 212, 214, 216, 218, 220, 222, 224,
- 227, 230, 234, 238, 240, 241, 244, 245, 248, 249,
- 252, 253, 257, 258, 259, 263, 265, 267, 269
-};
-
-/* YYRHS -- A `-1'-separated list of the rules' RHS. */
-static const yytype_int8 yyrhs[] =
-{
- 37, 0, -1, 37, 38, -1, 38, -1, 3, 55,
- 59, -1, 4, 55, 59, 60, -1, 11, 39, -1,
- 5, 30, -1, 6, 31, 47, -1, 7, 31, 47,
- -1, 8, 45, -1, 9, 45, -1, 10, 43, -1,
- 12, 41, -1, 13, 31, -1, 13, 31, 32, 31,
- -1, -1, 39, 40, -1, 30, 58, 56, 50, 49,
- 51, 52, 57, -1, 41, 42, -1, 42, -1, 30,
- 33, 30, 32, 30, 32, 30, 57, -1, 30, 33,
- 30, 32, 30, 32, 31, 57, -1, 30, 33, 30,
- 32, 30, 57, -1, 30, 33, 30, 32, 31, 57,
- -1, 30, 32, 30, 32, 30, 57, -1, 30, 32,
- 30, 32, 31, 57, -1, 30, 32, 30, 57, -1,
- 30, 32, 31, 57, -1, 43, 44, -1, 44, -1,
- 30, 45, -1, 45, 46, 48, -1, 48, -1, 34,
- -1, -1, 34, 31, -1, -1, 16, -1, 17, -1,
- 18, -1, 19, -1, 20, -1, 23, -1, 24, -1,
- 15, -1, -1, 21, -1, -1, 9, -1, -1, 22,
- -1, -1, 3, -1, 5, -1, 6, -1, 7, -1,
- 8, -1, 9, -1, 10, -1, 11, -1, 12, -1,
- 13, -1, 14, -1, 15, -1, 21, -1, 22, -1,
- 16, -1, 17, -1, 18, -1, 19, -1, 20, -1,
- 23, -1, 24, -1, 25, -1, 26, -1, 27, -1,
- 28, -1, 30, -1, 32, 53, -1, 32, 54, -1,
- 53, 32, 54, -1, 30, 32, 54, -1, 54, -1,
- -1, 35, 31, -1, -1, 29, 54, -1, -1, 33,
- 54, -1, -1, 14, 33, 31, -1, -1, -1, 60,
- 46, 61, -1, 25, -1, 26, -1, 27, -1, 28,
- -1
-};
-
-/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
-static const yytype_uint8 yyrline[] =
-{
- 0, 49, 49, 50, 54, 55, 56, 57, 58, 59,
- 60, 61, 62, 63, 64, 65, 69, 71, 75, 80,
- 81, 85, 87, 89, 91, 93, 95, 97, 99, 104,
- 105, 109, 113, 114, 118, 119, 121, 122, 126, 127,
- 128, 129, 130, 131, 132, 136, 137, 141, 142, 146,
- 147, 151, 152, 155, 160, 161, 162, 163, 164, 165,
- 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
- 176, 177, 178, 179, 180, 181, 182, 183, 186, 187,
- 193, 199, 205, 212, 213, 217, 218, 222, 223, 227,
- 228, 231, 232, 235, 237, 241, 242, 243, 244
-};
-#endif
-
-#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
-/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
- First, the terminals, then, starting at YYNTOKENS, nonterminals. */
-static const char *const yytname[] =
-{
- "$end", "error", "$undefined", "NAME", "LIBRARY", "DESCRIPTION",
- "STACKSIZE", "HEAPSIZE", "CODE", "DATA", "SECTIONS", "EXPORTS",
- "IMPORTS", "VERSIONK", "BASE", "CONSTANT", "READ", "WRITE", "EXECUTE",
- "SHARED", "NONSHARED", "NONAME", "PRIVATE", "SINGLE", "MULTIPLE",
- "INITINSTANCE", "INITGLOBAL", "TERMINSTANCE", "TERMGLOBAL", "EQUAL",
- "ID", "NUMBER", "'.'", "'='", "','", "'@'", "$accept", "start",
- "command", "explist", "expline", "implist", "impline", "seclist",
- "secline", "attr_list", "opt_comma", "opt_number", "attr",
- "opt_CONSTANT", "opt_NONAME", "opt_DATA", "opt_PRIVATE",
- "keyword_as_name", "opt_name2", "opt_name", "opt_ordinal",
- "opt_import_name", "opt_equal_name", "opt_base", "option_list", "option", 0
-};
-#endif
-
-# ifdef YYPRINT
-/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
- token YYLEX-NUM. */
-static const yytype_uint16 yytoknum[] =
-{
- 0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
- 265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
- 275, 276, 277, 278, 279, 280, 281, 282, 283, 284,
- 285, 286, 46, 61, 44, 64
-};
-# endif
-
-/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
-static const yytype_uint8 yyr1[] =
-{
- 0, 36, 37, 37, 38, 38, 38, 38, 38, 38,
- 38, 38, 38, 38, 38, 38, 39, 39, 40, 41,
- 41, 42, 42, 42, 42, 42, 42, 42, 42, 43,
- 43, 44, 45, 45, 46, 46, 47, 47, 48, 48,
- 48, 48, 48, 48, 48, 49, 49, 50, 50, 51,
- 51, 52, 52, 53, 53, 53, 53, 53, 53, 53,
- 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
- 53, 53, 53, 53, 53, 53, 53, 53, 54, 54,
- 54, 54, 54, 55, 55, 56, 56, 57, 57, 58,
- 58, 59, 59, 60, 60, 61, 61, 61, 61
-};
-
-/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
-static const yytype_uint8 yyr2[] =
-{
- 0, 2, 2, 1, 3, 4, 2, 2, 3, 3,
- 2, 2, 2, 2, 2, 4, 0, 2, 8, 2,
- 1, 8, 8, 6, 6, 6, 6, 4, 4, 2,
- 1, 2, 3, 1, 1, 0, 2, 0, 1, 1,
- 1, 1, 1, 1, 1, 1, 0, 1, 0, 1,
- 0, 1, 0, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
- 2, 3, 3, 1, 0, 2, 0, 2, 0, 2,
- 0, 3, 0, 0, 3, 1, 1, 1, 1
-};
-
-/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
- STATE-NUM when YYTABLE doesn't specify something else to do. Zero
- means the default is an error. */
-static const yytype_uint8 yydefact[] =
-{
- 0, 84, 84, 0, 0, 0, 0, 0, 0, 16,
- 0, 0, 0, 3, 53, 54, 55, 56, 57, 58,
- 59, 60, 61, 62, 63, 64, 67, 68, 69, 70,
- 71, 65, 66, 72, 73, 74, 75, 76, 77, 78,
- 0, 0, 83, 92, 92, 7, 37, 37, 38, 39,
- 40, 41, 42, 43, 44, 10, 33, 11, 0, 12,
- 30, 6, 0, 13, 20, 14, 1, 2, 0, 79,
- 80, 0, 0, 4, 93, 0, 8, 9, 34, 0,
- 31, 29, 90, 17, 0, 0, 19, 0, 82, 81,
- 0, 5, 36, 32, 0, 86, 88, 88, 0, 15,
- 91, 0, 89, 0, 48, 0, 0, 27, 28, 0,
- 95, 96, 97, 98, 94, 85, 47, 46, 87, 88,
- 88, 88, 88, 45, 50, 25, 26, 0, 23, 24,
- 49, 52, 88, 88, 51, 88, 21, 22, 18
-};
-
-/* YYDEFGOTO[NTERM-NUM]. */
-static const yytype_int16 yydefgoto[] =
-{
- -1, 12, 13, 61, 83, 63, 64, 59, 60, 55,
- 79, 76, 56, 124, 117, 131, 135, 41, 42, 43,
- 104, 107, 95, 73, 91, 114
-};
-
-/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
- STATE-NUM. */
-#define YYPACT_NINF -96
-static const yytype_int8 yypact[] =
-{
- 38, 61, 61, -22, -1, 8, 39, 39, -7, -96,
- 23, 59, 92, -96, -96, -96, -96, -96, -96, -96,
- -96, -96, -96, -96, -96, -96, -96, -96, -96, -96,
- -96, -96, -96, -96, -96, -96, -96, -96, -96, 62,
- 61, 79, -96, 96, 96, -96, 80, 80, -96, -96,
- -96, -96, -96, -96, -96, -13, -96, -13, 39, -7,
- -96, 82, 1, 23, -96, 81, -96, -96, 61, 79,
- -96, 61, 83, -96, -96, 84, -96, -96, -96, 39,
- -13, -96, 85, -96, 5, 87, -96, 88, -96, -96,
- 89, -12, -96, -96, 61, 86, -20, 93, 91, -96,
- -96, -8, -96, 94, 103, 61, 30, -96, -96, 76,
- -96, -96, -96, -96, -96, -96, -96, 111, -96, 93,
- 93, 0, 93, -96, 118, -96, -96, 78, -96, -96,
- -96, 106, 93, 93, -96, 93, -96, -96, -96
-};
-
-/* YYPGOTO[NTERM-NUM]. */
-static const yytype_int16 yypgoto[] =
-{
- -96, -96, 117, -96, -96, -96, 67, -96, 72, -6,
- 41, 90, 54, -96, -96, -96, -96, 95, -40, 132,
- -96, -95, -96, 97, -96, -96
-};
-
-/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
- positive, shift that token. If negative, reduce the rule which
- number is the opposite. If zero, do what YYDEFACT says.
- If YYTABLE_NINF, syntax error. */
-#define YYTABLE_NINF -36
-static const yytype_int16 yytable[] =
-{
- 70, 57, 108, -35, -35, -35, -35, -35, 45, 105,
- -35, -35, 106, -35, -35, -35, -35, 110, 111, 112,
- 113, 78, 78, 58, 125, 126, 128, 129, 88, 105,
- 46, 89, 127, 84, 85, 96, 97, 136, 137, 47,
- 138, 1, 2, 3, 4, 5, 6, 7, 8, 9,
- 10, 11, 80, 62, 102, 48, 49, 50, 51, 52,
- 119, 120, 53, 54, 14, 118, 15, 16, 17, 18,
- 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
- 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
- 65, 39, 66, 40, 68, 1, 2, 3, 4, 5,
- 6, 7, 8, 9, 10, 11, 121, 122, 132, 133,
- 72, 71, 82, 87, 75, 92, 90, 98, 94, 99,
- 100, 103, 105, 109, 116, 115, 123, 130, 134, 67,
- 86, 81, 101, 93, 44, 69, 0, 77, 0, 0,
- 0, 74
-};
-
-static const yytype_int16 yycheck[] =
-{
- 40, 7, 97, 16, 17, 18, 19, 20, 30, 29,
- 23, 24, 32, 25, 26, 27, 28, 25, 26, 27,
- 28, 34, 34, 30, 119, 120, 121, 122, 68, 29,
- 31, 71, 32, 32, 33, 30, 31, 132, 133, 31,
- 135, 3, 4, 5, 6, 7, 8, 9, 10, 11,
- 12, 13, 58, 30, 94, 16, 17, 18, 19, 20,
- 30, 31, 23, 24, 3, 105, 5, 6, 7, 8,
- 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
- 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
- 31, 30, 0, 32, 32, 3, 4, 5, 6, 7,
- 8, 9, 10, 11, 12, 13, 30, 31, 30, 31,
- 14, 32, 30, 32, 34, 31, 33, 30, 33, 31,
- 31, 35, 29, 32, 21, 31, 15, 9, 22, 12,
- 63, 59, 91, 79, 2, 40, -1, 47, -1, -1,
- -1, 44
-};
-
-/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
- symbol of state STATE-NUM. */
-static const yytype_uint8 yystos[] =
-{
- 0, 3, 4, 5, 6, 7, 8, 9, 10, 11,
- 12, 13, 37, 38, 3, 5, 6, 7, 8, 9,
- 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
- 20, 21, 22, 23, 24, 25, 26, 27, 28, 30,
- 32, 53, 54, 55, 55, 30, 31, 31, 16, 17,
- 18, 19, 20, 23, 24, 45, 48, 45, 30, 43,
- 44, 39, 30, 41, 42, 31, 0, 38, 32, 53,
- 54, 32, 14, 59, 59, 34, 47, 47, 34, 46,
- 45, 44, 30, 40, 32, 33, 42, 32, 54, 54,
- 33, 60, 31, 48, 33, 58, 30, 31, 30, 31,
- 31, 46, 54, 35, 56, 29, 32, 57, 57, 32,
- 25, 26, 27, 28, 61, 31, 21, 50, 54, 30,
- 31, 30, 31, 15, 49, 57, 57, 32, 57, 57,
- 9, 51, 30, 31, 22, 52, 57, 57, 57
-};
-
-#define yyerrok (yyerrstatus = 0)
-#define yyclearin (yychar = YYEMPTY)
-#define YYEMPTY (-2)
-#define YYEOF 0
-
-#define YYACCEPT goto yyacceptlab
-#define YYABORT goto yyabortlab
-#define YYERROR goto yyerrorlab
-
-
-/* Like YYERROR except do call yyerror. This remains here temporarily
- to ease the transition to the new meaning of YYERROR, for GCC.
- Once GCC version 2 has supplanted version 1, this can go. */
-
-#define YYFAIL goto yyerrlab
-
-#define YYRECOVERING() (!!yyerrstatus)
-
-#define YYBACKUP(Token, Value) \
-do \
- if (yychar == YYEMPTY && yylen == 1) \
- { \
- yychar = (Token); \
- yylval = (Value); \
- yytoken = YYTRANSLATE (yychar); \
- YYPOPSTACK (1); \
- goto yybackup; \
- } \
- else \
- { \
- yyerror (YY_("syntax error: cannot back up")); \
- YYERROR; \
- } \
-while (YYID (0))
-
-
-#define YYTERROR 1
-#define YYERRCODE 256
-
-
-/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
- If N is 0, then set CURRENT to the empty location which ends
- the previous symbol: RHS[0] (always defined). */
-
-#define YYRHSLOC(Rhs, K) ((Rhs)[K])
-#ifndef YYLLOC_DEFAULT
-# define YYLLOC_DEFAULT(Current, Rhs, N) \
- do \
- if (YYID (N)) \
- { \
- (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \
- (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
- (Current).last_line = YYRHSLOC (Rhs, N).last_line; \
- (Current).last_column = YYRHSLOC (Rhs, N).last_column; \
- } \
- else \
- { \
- (Current).first_line = (Current).last_line = \
- YYRHSLOC (Rhs, 0).last_line; \
- (Current).first_column = (Current).last_column = \
- YYRHSLOC (Rhs, 0).last_column; \
- } \
- while (YYID (0))
-#endif
-
-
-/* YY_LOCATION_PRINT -- Print the location on the stream.
- This macro was not mandated originally: define only if we know
- we won't break user code: when these are the locations we know. */
-
-#ifndef YY_LOCATION_PRINT
-# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL
-# define YY_LOCATION_PRINT(File, Loc) \
- fprintf (File, "%d.%d-%d.%d", \
- (Loc).first_line, (Loc).first_column, \
- (Loc).last_line, (Loc).last_column)
-# else
-# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
-# endif
-#endif
-
-
-/* YYLEX -- calling `yylex' with the right arguments. */
-
-#ifdef YYLEX_PARAM
-# define YYLEX yylex (YYLEX_PARAM)
-#else
-# define YYLEX yylex ()
-#endif
-
-/* Enable debugging if requested. */
-#if YYDEBUG
-
-# ifndef YYFPRINTF
-# include /* INFRINGES ON USER NAME SPACE */
-# define YYFPRINTF fprintf
-# endif
-
-# define YYDPRINTF(Args) \
-do { \
- if (yydebug) \
- YYFPRINTF Args; \
-} while (YYID (0))
-
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
-do { \
- if (yydebug) \
- { \
- YYFPRINTF (stderr, "%s ", Title); \
- yy_symbol_print (stderr, \
- Type, Value); \
- YYFPRINTF (stderr, "\n"); \
- } \
-} while (YYID (0))
-
-
-/*--------------------------------.
-| Print this symbol on YYOUTPUT. |
-`--------------------------------*/
-
-/*ARGSUSED*/
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static void
-yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
-#else
-static void
-yy_symbol_value_print (yyoutput, yytype, yyvaluep)
- FILE *yyoutput;
- int yytype;
- YYSTYPE const * const yyvaluep;
-#endif
-{
- if (!yyvaluep)
- return;
-# ifdef YYPRINT
- if (yytype < YYNTOKENS)
- YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
-# else
- YYUSE (yyoutput);
-# endif
- switch (yytype)
- {
- default:
- break;
- }
-}
-
-
-/*--------------------------------.
-| Print this symbol on YYOUTPUT. |
-`--------------------------------*/
-
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static void
-yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
-#else
-static void
-yy_symbol_print (yyoutput, yytype, yyvaluep)
- FILE *yyoutput;
- int yytype;
- YYSTYPE const * const yyvaluep;
-#endif
-{
- if (yytype < YYNTOKENS)
- YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
- else
- YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
-
- yy_symbol_value_print (yyoutput, yytype, yyvaluep);
- YYFPRINTF (yyoutput, ")");
-}
-
-/*------------------------------------------------------------------.
-| yy_stack_print -- Print the state stack from its BOTTOM up to its |
-| TOP (included). |
-`------------------------------------------------------------------*/
-
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static void
-yy_stack_print (yytype_int16 *bottom, yytype_int16 *top)
-#else
-static void
-yy_stack_print (bottom, top)
- yytype_int16 *bottom;
- yytype_int16 *top;
-#endif
-{
- YYFPRINTF (stderr, "Stack now");
- for (; bottom <= top; ++bottom)
- YYFPRINTF (stderr, " %d", *bottom);
- YYFPRINTF (stderr, "\n");
-}
-
-# define YY_STACK_PRINT(Bottom, Top) \
-do { \
- if (yydebug) \
- yy_stack_print ((Bottom), (Top)); \
-} while (YYID (0))
-
-
-/*------------------------------------------------.
-| Report that the YYRULE is going to be reduced. |
-`------------------------------------------------*/
-
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static void
-yy_reduce_print (YYSTYPE *yyvsp, int yyrule)
-#else
-static void
-yy_reduce_print (yyvsp, yyrule)
- YYSTYPE *yyvsp;
- int yyrule;
-#endif
-{
- int yynrhs = yyr2[yyrule];
- int yyi;
- unsigned long int yylno = yyrline[yyrule];
- YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
- yyrule - 1, yylno);
- /* The symbols being reduced. */
- for (yyi = 0; yyi < yynrhs; yyi++)
- {
- fprintf (stderr, " $%d = ", yyi + 1);
- yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
- &(yyvsp[(yyi + 1) - (yynrhs)])
- );
- fprintf (stderr, "\n");
- }
-}
-
-# define YY_REDUCE_PRINT(Rule) \
-do { \
- if (yydebug) \
- yy_reduce_print (yyvsp, Rule); \
-} while (YYID (0))
-
-/* Nonzero means print parse trace. It is left uninitialized so that
- multiple parsers can coexist. */
-int yydebug;
-#else /* !YYDEBUG */
-# define YYDPRINTF(Args)
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
-# define YY_STACK_PRINT(Bottom, Top)
-# define YY_REDUCE_PRINT(Rule)
-#endif /* !YYDEBUG */
-
-
-/* YYINITDEPTH -- initial size of the parser's stacks. */
-#ifndef YYINITDEPTH
-# define YYINITDEPTH 200
-#endif
-
-/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
- if the built-in stack extension method is used).
-
- Do not make this value too large; the results are undefined if
- YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
- evaluated with infinite-precision integer arithmetic. */
-
-#ifndef YYMAXDEPTH
-# define YYMAXDEPTH 10000
-#endif
-
-
-
-#if YYERROR_VERBOSE
-
-# ifndef yystrlen
-# if defined __GLIBC__ && defined _STRING_H
-# define yystrlen strlen
-# else
-/* Return the length of YYSTR. */
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static YYSIZE_T
-yystrlen (const char *yystr)
-#else
-static YYSIZE_T
-yystrlen (yystr)
- const char *yystr;
-#endif
-{
- YYSIZE_T yylen;
- for (yylen = 0; yystr[yylen]; yylen++)
- continue;
- return yylen;
-}
-# endif
-# endif
-
-# ifndef yystpcpy
-# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
-# define yystpcpy stpcpy
-# else
-/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
- YYDEST. */
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static char *
-yystpcpy (char *yydest, const char *yysrc)
-#else
-static char *
-yystpcpy (yydest, yysrc)
- char *yydest;
- const char *yysrc;
-#endif
-{
- char *yyd = yydest;
- const char *yys = yysrc;
-
- while ((*yyd++ = *yys++) != '\0')
- continue;
-
- return yyd - 1;
-}
-# endif
-# endif
-
-# ifndef yytnamerr
-/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
- quotes and backslashes, so that it's suitable for yyerror. The
- heuristic is that double-quoting is unnecessary unless the string
- contains an apostrophe, a comma, or backslash (other than
- backslash-backslash). YYSTR is taken from yytname. If YYRES is
- null, do not copy; instead, return the length of what the result
- would have been. */
-static YYSIZE_T
-yytnamerr (char *yyres, const char *yystr)
-{
- if (*yystr == '"')
- {
- YYSIZE_T yyn = 0;
- char const *yyp = yystr;
-
- for (;;)
- switch (*++yyp)
- {
- case '\'':
- case ',':
- goto do_not_strip_quotes;
-
- case '\\':
- if (*++yyp != '\\')
- goto do_not_strip_quotes;
- /* Fall through. */
- default:
- if (yyres)
- yyres[yyn] = *yyp;
- yyn++;
- break;
-
- case '"':
- if (yyres)
- yyres[yyn] = '\0';
- return yyn;
- }
- do_not_strip_quotes: ;
- }
-
- if (! yyres)
- return yystrlen (yystr);
-
- return yystpcpy (yyres, yystr) - yyres;
-}
-# endif
-
-/* Copy into YYRESULT an error message about the unexpected token
- YYCHAR while in state YYSTATE. Return the number of bytes copied,
- including the terminating null byte. If YYRESULT is null, do not
- copy anything; just return the number of bytes that would be
- copied. As a special case, return 0 if an ordinary "syntax error"
- message will do. Return YYSIZE_MAXIMUM if overflow occurs during
- size calculation. */
-static YYSIZE_T
-yysyntax_error (char *yyresult, int yystate, int yychar)
-{
- int yyn = yypact[yystate];
-
- if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
- return 0;
- else
- {
- int yytype = YYTRANSLATE (yychar);
- YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
- YYSIZE_T yysize = yysize0;
- YYSIZE_T yysize1;
- int yysize_overflow = 0;
- enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
- char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
- int yyx;
-
-# if 0
- /* This is so xgettext sees the translatable formats that are
- constructed on the fly. */
- YY_("syntax error, unexpected %s");
- YY_("syntax error, unexpected %s, expecting %s");
- YY_("syntax error, unexpected %s, expecting %s or %s");
- YY_("syntax error, unexpected %s, expecting %s or %s or %s");
- YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
-# endif
- char *yyfmt;
- char const *yyf;
- static char const yyunexpected[] = "syntax error, unexpected %s";
- static char const yyexpecting[] = ", expecting %s";
- static char const yyor[] = " or %s";
- char yyformat[sizeof yyunexpected
- + sizeof yyexpecting - 1
- + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
- * (sizeof yyor - 1))];
- char const *yyprefix = yyexpecting;
-
- /* Start YYX at -YYN if negative to avoid negative indexes in
- YYCHECK. */
- int yyxbegin = yyn < 0 ? -yyn : 0;
-
- /* Stay within bounds of both yycheck and yytname. */
- int yychecklim = YYLAST - yyn + 1;
- int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
- int yycount = 1;
-
- yyarg[0] = yytname[yytype];
- yyfmt = yystpcpy (yyformat, yyunexpected);
-
- for (yyx = yyxbegin; yyx < yyxend; ++yyx)
- if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
- {
- if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
- {
- yycount = 1;
- yysize = yysize0;
- yyformat[sizeof yyunexpected - 1] = '\0';
- break;
- }
- yyarg[yycount++] = yytname[yyx];
- yysize1 = yysize + yytnamerr (0, yytname[yyx]);
- yysize_overflow |= (yysize1 < yysize);
- yysize = yysize1;
- yyfmt = yystpcpy (yyfmt, yyprefix);
- yyprefix = yyor;
- }
-
- yyf = YY_(yyformat);
- yysize1 = yysize + yystrlen (yyf);
- yysize_overflow |= (yysize1 < yysize);
- yysize = yysize1;
-
- if (yysize_overflow)
- return YYSIZE_MAXIMUM;
-
- if (yyresult)
- {
- /* Avoid sprintf, as that infringes on the user's name space.
- Don't have undefined behavior even if the translation
- produced a string with the wrong number of "%s"s. */
- char *yyp = yyresult;
- int yyi = 0;
- while ((*yyp = *yyf) != '\0')
- {
- if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
- {
- yyp += yytnamerr (yyp, yyarg[yyi++]);
- yyf += 2;
- }
- else
- {
- yyp++;
- yyf++;
- }
- }
- }
- return yysize;
- }
-}
-#endif /* YYERROR_VERBOSE */
-
-
-/*-----------------------------------------------.
-| Release the memory associated to this symbol. |
-`-----------------------------------------------*/
-
-/*ARGSUSED*/
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static void
-yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
-#else
-static void
-yydestruct (yymsg, yytype, yyvaluep)
- const char *yymsg;
- int yytype;
- YYSTYPE *yyvaluep;
-#endif
-{
- YYUSE (yyvaluep);
-
- if (!yymsg)
- yymsg = "Deleting";
- YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
-
- switch (yytype)
- {
-
- default:
- break;
- }
-}
-
-
-/* Prevent warnings from -Wmissing-prototypes. */
-
-#ifdef YYPARSE_PARAM
-#if defined __STDC__ || defined __cplusplus
-int yyparse (void *YYPARSE_PARAM);
-#else
-int yyparse ();
-#endif
-#else /* ! YYPARSE_PARAM */
-#if defined __STDC__ || defined __cplusplus
-int yyparse (void);
-#else
-int yyparse ();
-#endif
-#endif /* ! YYPARSE_PARAM */
-
-
-
-/* The look-ahead symbol. */
-int yychar;
-
-/* The semantic value of the look-ahead symbol. */
-YYSTYPE yylval;
-
-/* Number of syntax errors so far. */
-int yynerrs;
-
-
-
-/*----------.
-| yyparse. |
-`----------*/
-
-#ifdef YYPARSE_PARAM
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-int
-yyparse (void *YYPARSE_PARAM)
-#else
-int
-yyparse (YYPARSE_PARAM)
- void *YYPARSE_PARAM;
-#endif
-#else /* ! YYPARSE_PARAM */
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-int
-yyparse (void)
-#else
-int
-yyparse ()
-
-#endif
-#endif
-{
-
- int yystate;
- int yyn;
- int yyresult;
- /* Number of tokens to shift before error messages enabled. */
- int yyerrstatus;
- /* Look-ahead token as an internal (translated) token number. */
- int yytoken = 0;
-#if YYERROR_VERBOSE
- /* Buffer for error messages, and its allocated size. */
- char yymsgbuf[128];
- char *yymsg = yymsgbuf;
- YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
-#endif
-
- /* Three stacks and their tools:
- `yyss': related to states,
- `yyvs': related to semantic values,
- `yyls': related to locations.
-
- Refer to the stacks thru separate pointers, to allow yyoverflow
- to reallocate them elsewhere. */
-
- /* The state stack. */
- yytype_int16 yyssa[YYINITDEPTH];
- yytype_int16 *yyss = yyssa;
- yytype_int16 *yyssp;
-
- /* The semantic value stack. */
- YYSTYPE yyvsa[YYINITDEPTH];
- YYSTYPE *yyvs = yyvsa;
- YYSTYPE *yyvsp;
-
-
-
-#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
-
- YYSIZE_T yystacksize = YYINITDEPTH;
-
- /* The variables used to return semantic value and location from the
- action routines. */
- YYSTYPE yyval;
-
-
- /* The number of symbols on the RHS of the reduced rule.
- Keep to zero when no symbol should be popped. */
- int yylen = 0;
-
- YYDPRINTF ((stderr, "Starting parse\n"));
-
- yystate = 0;
- yyerrstatus = 0;
- yynerrs = 0;
- yychar = YYEMPTY; /* Cause a token to be read. */
-
- /* Initialize stack pointers.
- Waste one element of value and location stack
- so that they stay on the same level as the state stack.
- The wasted elements are never initialized. */
-
- yyssp = yyss;
- yyvsp = yyvs;
-
- goto yysetstate;
-
-/*------------------------------------------------------------.
-| yynewstate -- Push a new state, which is found in yystate. |
-`------------------------------------------------------------*/
- yynewstate:
- /* In all cases, when you get here, the value and location stacks
- have just been pushed. So pushing a state here evens the stacks. */
- yyssp++;
-
- yysetstate:
- *yyssp = yystate;
-
- if (yyss + yystacksize - 1 <= yyssp)
- {
- /* Get the current used size of the three stacks, in elements. */
- YYSIZE_T yysize = yyssp - yyss + 1;
-
-#ifdef yyoverflow
- {
- /* Give user a chance to reallocate the stack. Use copies of
- these so that the &'s don't force the real ones into
- memory. */
- YYSTYPE *yyvs1 = yyvs;
- yytype_int16 *yyss1 = yyss;
-
-
- /* Each stack pointer address is followed by the size of the
- data in use in that stack, in bytes. This used to be a
- conditional around just the two extra args, but that might
- be undefined if yyoverflow is a macro. */
- yyoverflow (YY_("memory exhausted"),
- &yyss1, yysize * sizeof (*yyssp),
- &yyvs1, yysize * sizeof (*yyvsp),
-
- &yystacksize);
-
- yyss = yyss1;
- yyvs = yyvs1;
- }
-#else /* no yyoverflow */
-# ifndef YYSTACK_RELOCATE
- goto yyexhaustedlab;
-# else
- /* Extend the stack our own way. */
- if (YYMAXDEPTH <= yystacksize)
- goto yyexhaustedlab;
- yystacksize *= 2;
- if (YYMAXDEPTH < yystacksize)
- yystacksize = YYMAXDEPTH;
-
- {
- yytype_int16 *yyss1 = yyss;
- union yyalloc *yyptr =
- (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
- if (! yyptr)
- goto yyexhaustedlab;
- YYSTACK_RELOCATE (yyss);
- YYSTACK_RELOCATE (yyvs);
-
-# undef YYSTACK_RELOCATE
- if (yyss1 != yyssa)
- YYSTACK_FREE (yyss1);
- }
-# endif
-#endif /* no yyoverflow */
-
- yyssp = yyss + yysize - 1;
- yyvsp = yyvs + yysize - 1;
-
-
- YYDPRINTF ((stderr, "Stack size increased to %lu\n",
- (unsigned long int) yystacksize));
-
- if (yyss + yystacksize - 1 <= yyssp)
- YYABORT;
- }
-
- YYDPRINTF ((stderr, "Entering state %d\n", yystate));
-
- goto yybackup;
-
-/*-----------.
-| yybackup. |
-`-----------*/
-yybackup:
-
- /* Do appropriate processing given the current state. Read a
- look-ahead token if we need one and don't already have one. */
-
- /* First try to decide what to do without reference to look-ahead token. */
- yyn = yypact[yystate];
- if (yyn == YYPACT_NINF)
- goto yydefault;
-
- /* Not known => get a look-ahead token if don't already have one. */
-
- /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */
- if (yychar == YYEMPTY)
- {
- YYDPRINTF ((stderr, "Reading a token: "));
- yychar = YYLEX;
- }
-
- if (yychar <= YYEOF)
- {
- yychar = yytoken = YYEOF;
- YYDPRINTF ((stderr, "Now at end of input.\n"));
- }
- else
- {
- yytoken = YYTRANSLATE (yychar);
- YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
- }
-
- /* If the proper action on seeing token YYTOKEN is to reduce or to
- detect an error, take that action. */
- yyn += yytoken;
- if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
- goto yydefault;
- yyn = yytable[yyn];
- if (yyn <= 0)
- {
- if (yyn == 0 || yyn == YYTABLE_NINF)
- goto yyerrlab;
- yyn = -yyn;
- goto yyreduce;
- }
-
- if (yyn == YYFINAL)
- YYACCEPT;
-
- /* Count tokens shifted since error; after three, turn off error
- status. */
- if (yyerrstatus)
- yyerrstatus--;
-
- /* Shift the look-ahead token. */
- YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
-
- /* Discard the shifted token unless it is eof. */
- if (yychar != YYEOF)
- yychar = YYEMPTY;
-
- yystate = yyn;
- *++yyvsp = yylval;
-
- goto yynewstate;
-
-
-/*-----------------------------------------------------------.
-| yydefault -- do the default action for the current state. |
-`-----------------------------------------------------------*/
-yydefault:
- yyn = yydefact[yystate];
- if (yyn == 0)
- goto yyerrlab;
- goto yyreduce;
-
-
-/*-----------------------------.
-| yyreduce -- Do a reduction. |
-`-----------------------------*/
-yyreduce:
- /* yyn is the number of a rule to reduce with. */
- yylen = yyr2[yyn];
-
- /* If YYLEN is nonzero, implement the default value of the action:
- `$$ = $1'.
-
- Otherwise, the following line sets YYVAL to garbage.
- This behavior is undocumented and Bison
- users should not rely upon it. Assigning to YYVAL
- unconditionally makes the parser a bit smaller, and it avoids a
- GCC warning that YYVAL may be used uninitialized. */
- yyval = yyvsp[1-yylen];
-
-
- YY_REDUCE_PRINT (yyn);
- switch (yyn)
- {
- case 4:
-#line 54 "defparse.y"
- { def_name ((yyvsp[(2) - (3)].id), (yyvsp[(3) - (3)].number)); }
- break;
-
- case 5:
-#line 55 "defparse.y"
- { def_library ((yyvsp[(2) - (4)].id), (yyvsp[(3) - (4)].number)); }
- break;
-
- case 7:
-#line 57 "defparse.y"
- { def_description ((yyvsp[(2) - (2)].id));}
- break;
-
- case 8:
-#line 58 "defparse.y"
- { def_stacksize ((yyvsp[(2) - (3)].number), (yyvsp[(3) - (3)].number));}
- break;
-
- case 9:
-#line 59 "defparse.y"
- { def_heapsize ((yyvsp[(2) - (3)].number), (yyvsp[(3) - (3)].number));}
- break;
-
- case 10:
-#line 60 "defparse.y"
- { def_code ((yyvsp[(2) - (2)].number));}
- break;
-
- case 11:
-#line 61 "defparse.y"
- { def_data ((yyvsp[(2) - (2)].number));}
- break;
-
- case 14:
-#line 64 "defparse.y"
- { def_version ((yyvsp[(2) - (2)].number),0);}
- break;
-
- case 15:
-#line 65 "defparse.y"
- { def_version ((yyvsp[(2) - (4)].number),(yyvsp[(4) - (4)].number));}
- break;
-
- case 18:
-#line 77 "defparse.y"
- { def_exports ((yyvsp[(1) - (8)].id), (yyvsp[(2) - (8)].id), (yyvsp[(3) - (8)].number), (yyvsp[(4) - (8)].number), (yyvsp[(5) - (8)].number), (yyvsp[(6) - (8)].number), (yyvsp[(7) - (8)].number), (yyvsp[(8) - (8)].id));}
- break;
-
- case 21:
-#line 86 "defparse.y"
- { def_import ((yyvsp[(1) - (8)].id),(yyvsp[(3) - (8)].id),(yyvsp[(5) - (8)].id),(yyvsp[(7) - (8)].id), 0, (yyvsp[(8) - (8)].id)); }
- break;
-
- case 22:
-#line 88 "defparse.y"
- { def_import ((yyvsp[(1) - (8)].id),(yyvsp[(3) - (8)].id),(yyvsp[(5) - (8)].id), 0,(yyvsp[(7) - (8)].number), (yyvsp[(8) - (8)].id)); }
- break;
-
- case 23:
-#line 90 "defparse.y"
- { def_import ((yyvsp[(1) - (6)].id),(yyvsp[(3) - (6)].id), 0,(yyvsp[(5) - (6)].id), 0, (yyvsp[(6) - (6)].id)); }
- break;
-
- case 24:
-#line 92 "defparse.y"
- { def_import ((yyvsp[(1) - (6)].id),(yyvsp[(3) - (6)].id), 0, 0,(yyvsp[(5) - (6)].number), (yyvsp[(6) - (6)].id)); }
- break;
-
- case 25:
-#line 94 "defparse.y"
- { def_import ( 0,(yyvsp[(1) - (6)].id),(yyvsp[(3) - (6)].id),(yyvsp[(5) - (6)].id), 0, (yyvsp[(6) - (6)].id)); }
- break;
-
- case 26:
-#line 96 "defparse.y"
- { def_import ( 0,(yyvsp[(1) - (6)].id),(yyvsp[(3) - (6)].id), 0,(yyvsp[(5) - (6)].number), (yyvsp[(6) - (6)].id)); }
- break;
-
- case 27:
-#line 98 "defparse.y"
- { def_import ( 0,(yyvsp[(1) - (4)].id), 0,(yyvsp[(3) - (4)].id), 0, (yyvsp[(4) - (4)].id)); }
- break;
-
- case 28:
-#line 100 "defparse.y"
- { def_import ( 0,(yyvsp[(1) - (4)].id), 0, 0,(yyvsp[(3) - (4)].number), (yyvsp[(4) - (4)].id)); }
- break;
-
- case 31:
-#line 109 "defparse.y"
- { def_section ((yyvsp[(1) - (2)].id),(yyvsp[(2) - (2)].number));}
- break;
-
- case 36:
-#line 121 "defparse.y"
- { (yyval.number)=(yyvsp[(2) - (2)].number);}
- break;
-
- case 37:
-#line 122 "defparse.y"
- { (yyval.number)=-1;}
- break;
-
- case 38:
-#line 126 "defparse.y"
- { (yyval.number) = 1; }
- break;
-
- case 39:
-#line 127 "defparse.y"
- { (yyval.number) = 2; }
- break;
-
- case 40:
-#line 128 "defparse.y"
- { (yyval.number) = 4; }
- break;
-
- case 41:
-#line 129 "defparse.y"
- { (yyval.number) = 8; }
- break;
-
- case 42:
-#line 130 "defparse.y"
- { (yyval.number) = 0; }
- break;
-
- case 43:
-#line 131 "defparse.y"
- { (yyval.number) = 0; }
- break;
-
- case 44:
-#line 132 "defparse.y"
- { (yyval.number) = 0; }
- break;
-
- case 45:
-#line 136 "defparse.y"
- {(yyval.number)=1;}
- break;
-
- case 46:
-#line 137 "defparse.y"
- {(yyval.number)=0;}
- break;
-
- case 47:
-#line 141 "defparse.y"
- {(yyval.number)=1;}
- break;
-
- case 48:
-#line 142 "defparse.y"
- {(yyval.number)=0;}
- break;
-
- case 49:
-#line 146 "defparse.y"
- { (yyval.number) = 1; }
- break;
-
- case 50:
-#line 147 "defparse.y"
- { (yyval.number) = 0; }
- break;
-
- case 51:
-#line 151 "defparse.y"
- { (yyval.number) = 1; }
- break;
-
- case 52:
-#line 152 "defparse.y"
- { (yyval.number) = 0; }
- break;
-
- case 53:
-#line 155 "defparse.y"
- { (yyval.id_const) = "NAME"; }
- break;
-
- case 54:
-#line 160 "defparse.y"
- { (yyval.id_const) = "DESCRIPTION"; }
- break;
-
- case 55:
-#line 161 "defparse.y"
- { (yyval.id_const) = "STACKSIZE"; }
- break;
-
- case 56:
-#line 162 "defparse.y"
- { (yyval.id_const) = "HEAPSIZE"; }
- break;
-
- case 57:
-#line 163 "defparse.y"
- { (yyval.id_const) = "CODE"; }
- break;
-
- case 58:
-#line 164 "defparse.y"
- { (yyval.id_const) = "DATA"; }
- break;
-
- case 59:
-#line 165 "defparse.y"
- { (yyval.id_const) = "SECTIONS"; }
- break;
-
- case 60:
-#line 166 "defparse.y"
- { (yyval.id_const) = "EXPORTS"; }
- break;
-
- case 61:
-#line 167 "defparse.y"
- { (yyval.id_const) = "IMPORTS"; }
- break;
-
- case 62:
-#line 168 "defparse.y"
- { (yyval.id_const) = "VERSION"; }
- break;
-
- case 63:
-#line 169 "defparse.y"
- { (yyval.id_const) = "BASE"; }
- break;
-
- case 64:
-#line 170 "defparse.y"
- { (yyval.id_const) = "CONSTANT"; }
- break;
-
- case 65:
-#line 171 "defparse.y"
- { (yyval.id_const) = "NONAME"; }
- break;
-
- case 66:
-#line 172 "defparse.y"
- { (yyval.id_const) = "PRIVATE"; }
- break;
-
- case 67:
-#line 173 "defparse.y"
- { (yyval.id_const) = "READ"; }
- break;
-
- case 68:
-#line 174 "defparse.y"
- { (yyval.id_const) = "WRITE"; }
- break;
-
- case 69:
-#line 175 "defparse.y"
- { (yyval.id_const) = "EXECUTE"; }
- break;
-
- case 70:
-#line 176 "defparse.y"
- { (yyval.id_const) = "SHARED"; }
- break;
-
- case 71:
-#line 177 "defparse.y"
- { (yyval.id_const) = "NONSHARED"; }
- break;
-
- case 72:
-#line 178 "defparse.y"
- { (yyval.id_const) = "SINGLE"; }
- break;
-
- case 73:
-#line 179 "defparse.y"
- { (yyval.id_const) = "MULTIPLE"; }
- break;
-
- case 74:
-#line 180 "defparse.y"
- { (yyval.id_const) = "INITINSTANCE"; }
- break;
-
- case 75:
-#line 181 "defparse.y"
- { (yyval.id_const) = "INITGLOBAL"; }
- break;
-
- case 76:
-#line 182 "defparse.y"
- { (yyval.id_const) = "TERMINSTANCE"; }
- break;
-
- case 77:
-#line 183 "defparse.y"
- { (yyval.id_const) = "TERMGLOBAL"; }
- break;
-
- case 78:
-#line 186 "defparse.y"
- { (yyval.id) = (yyvsp[(1) - (1)].id); }
- break;
-
- case 79:
-#line 188 "defparse.y"
- {
- char *name = xmalloc (strlen ((yyvsp[(2) - (2)].id_const)) + 2);
- sprintf (name, ".%s", (yyvsp[(2) - (2)].id_const));
- (yyval.id) = name;
- }
- break;
-
- case 80:
-#line 194 "defparse.y"
- {
- char *name = xmalloc (strlen ((yyvsp[(2) - (2)].id)) + 2);
- sprintf (name, ".%s", (yyvsp[(2) - (2)].id));
- (yyval.id) = name;
- }
- break;
-
- case 81:
-#line 200 "defparse.y"
- {
- char *name = xmalloc (strlen ((yyvsp[(1) - (3)].id_const)) + 1 + strlen ((yyvsp[(3) - (3)].id)) + 1);
- sprintf (name, "%s.%s", (yyvsp[(1) - (3)].id_const), (yyvsp[(3) - (3)].id));
- (yyval.id) = name;
- }
- break;
-
- case 82:
-#line 206 "defparse.y"
- {
- char *name = xmalloc (strlen ((yyvsp[(1) - (3)].id)) + 1 + strlen ((yyvsp[(3) - (3)].id)) + 1);
- sprintf (name, "%s.%s", (yyvsp[(1) - (3)].id), (yyvsp[(3) - (3)].id));
- (yyval.id) = name;
- }
- break;
-
- case 83:
-#line 212 "defparse.y"
- { (yyval.id) =(yyvsp[(1) - (1)].id); }
- break;
-
- case 84:
-#line 213 "defparse.y"
- { (yyval.id)=""; }
- break;
-
- case 85:
-#line 217 "defparse.y"
- { (yyval.number)=(yyvsp[(2) - (2)].number);}
- break;
-
- case 86:
-#line 218 "defparse.y"
- { (yyval.number)=-1;}
- break;
-
- case 87:
-#line 222 "defparse.y"
- { (yyval.id) = (yyvsp[(2) - (2)].id); }
- break;
-
- case 88:
-#line 223 "defparse.y"
- { (yyval.id) = 0; }
- break;
-
- case 89:
-#line 227 "defparse.y"
- { (yyval.id) = (yyvsp[(2) - (2)].id); }
- break;
-
- case 90:
-#line 228 "defparse.y"
- { (yyval.id) = 0; }
- break;
-
- case 91:
-#line 231 "defparse.y"
- { (yyval.number)= (yyvsp[(3) - (3)].number);}
- break;
-
- case 92:
-#line 232 "defparse.y"
- { (yyval.number)=-1;}
- break;
-
-
-/* Line 1267 of yacc.c. */
-#line 1929 "defparse.c"
- default: break;
- }
- YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
-
- YYPOPSTACK (yylen);
- yylen = 0;
- YY_STACK_PRINT (yyss, yyssp);
-
- *++yyvsp = yyval;
-
-
- /* Now `shift' the result of the reduction. Determine what state
- that goes to, based on the state we popped back to and the rule
- number reduced by. */
-
- yyn = yyr1[yyn];
-
- yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
- if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
- yystate = yytable[yystate];
- else
- yystate = yydefgoto[yyn - YYNTOKENS];
-
- goto yynewstate;
-
-
-/*------------------------------------.
-| yyerrlab -- here on detecting error |
-`------------------------------------*/
-yyerrlab:
- /* If not already recovering from an error, report this error. */
- if (!yyerrstatus)
- {
- ++yynerrs;
-#if ! YYERROR_VERBOSE
- yyerror (YY_("syntax error"));
-#else
- {
- YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
- if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
- {
- YYSIZE_T yyalloc = 2 * yysize;
- if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
- yyalloc = YYSTACK_ALLOC_MAXIMUM;
- if (yymsg != yymsgbuf)
- YYSTACK_FREE (yymsg);
- yymsg = (char *) YYSTACK_ALLOC (yyalloc);
- if (yymsg)
- yymsg_alloc = yyalloc;
- else
- {
- yymsg = yymsgbuf;
- yymsg_alloc = sizeof yymsgbuf;
- }
- }
-
- if (0 < yysize && yysize <= yymsg_alloc)
- {
- (void) yysyntax_error (yymsg, yystate, yychar);
- yyerror (yymsg);
- }
- else
- {
- yyerror (YY_("syntax error"));
- if (yysize != 0)
- goto yyexhaustedlab;
- }
- }
-#endif
- }
-
-
-
- if (yyerrstatus == 3)
- {
- /* If just tried and failed to reuse look-ahead token after an
- error, discard it. */
-
- if (yychar <= YYEOF)
- {
- /* Return failure if at end of input. */
- if (yychar == YYEOF)
- YYABORT;
- }
- else
- {
- yydestruct ("Error: discarding",
- yytoken, &yylval);
- yychar = YYEMPTY;
- }
- }
-
- /* Else will try to reuse look-ahead token after shifting the error
- token. */
- goto yyerrlab1;
-
-
-/*---------------------------------------------------.
-| yyerrorlab -- error raised explicitly by YYERROR. |
-`---------------------------------------------------*/
-yyerrorlab:
-
- /* Pacify compilers like GCC when the user code never invokes
- YYERROR and the label yyerrorlab therefore never appears in user
- code. */
- if (/*CONSTCOND*/ 0)
- goto yyerrorlab;
-
- /* Do not reclaim the symbols of the rule which action triggered
- this YYERROR. */
- YYPOPSTACK (yylen);
- yylen = 0;
- YY_STACK_PRINT (yyss, yyssp);
- yystate = *yyssp;
- goto yyerrlab1;
-
-
-/*-------------------------------------------------------------.
-| yyerrlab1 -- common code for both syntax error and YYERROR. |
-`-------------------------------------------------------------*/
-yyerrlab1:
- yyerrstatus = 3; /* Each real token shifted decrements this. */
-
- for (;;)
- {
- yyn = yypact[yystate];
- if (yyn != YYPACT_NINF)
- {
- yyn += YYTERROR;
- if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
- {
- yyn = yytable[yyn];
- if (0 < yyn)
- break;
- }
- }
-
- /* Pop the current state because it cannot handle the error token. */
- if (yyssp == yyss)
- YYABORT;
-
-
- yydestruct ("Error: popping",
- yystos[yystate], yyvsp);
- YYPOPSTACK (1);
- yystate = *yyssp;
- YY_STACK_PRINT (yyss, yyssp);
- }
-
- if (yyn == YYFINAL)
- YYACCEPT;
-
- *++yyvsp = yylval;
-
-
- /* Shift the error token. */
- YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
-
- yystate = yyn;
- goto yynewstate;
-
-
-/*-------------------------------------.
-| yyacceptlab -- YYACCEPT comes here. |
-`-------------------------------------*/
-yyacceptlab:
- yyresult = 0;
- goto yyreturn;
-
-/*-----------------------------------.
-| yyabortlab -- YYABORT comes here. |
-`-----------------------------------*/
-yyabortlab:
- yyresult = 1;
- goto yyreturn;
-
-#ifndef yyoverflow
-/*-------------------------------------------------.
-| yyexhaustedlab -- memory exhaustion comes here. |
-`-------------------------------------------------*/
-yyexhaustedlab:
- yyerror (YY_("memory exhausted"));
- yyresult = 2;
- /* Fall through. */
-#endif
-
-yyreturn:
- if (yychar != YYEOF && yychar != YYEMPTY)
- yydestruct ("Cleanup: discarding lookahead",
- yytoken, &yylval);
- /* Do not reclaim the symbols of the rule which action triggered
- this YYABORT or YYACCEPT. */
- YYPOPSTACK (yylen);
- YY_STACK_PRINT (yyss, yyssp);
- while (yyssp != yyss)
- {
- yydestruct ("Cleanup: popping",
- yystos[*yyssp], yyvsp);
- YYPOPSTACK (1);
- }
-#ifndef yyoverflow
- if (yyss != yyssa)
- YYSTACK_FREE (yyss);
-#endif
-#if YYERROR_VERBOSE
- if (yymsg != yymsgbuf)
- YYSTACK_FREE (yymsg);
-#endif
- /* Make sure YYID is used. */
- return YYID (yyresult);
-}
-
-
-
diff -Nur binutils-2.24.orig/binutils/defparse.h binutils-2.24/binutils/defparse.h
--- binutils-2.24.orig/binutils/defparse.h 2013-11-18 09:49:30.000000000 +0100
+++ binutils-2.24/binutils/defparse.h 1970-01-01 01:00:00.000000000 +0100
@@ -1,124 +0,0 @@
-/* A Bison parser, made by GNU Bison 2.3. */
-
-/* Skeleton interface for Bison's Yacc-like parsers in C
-
- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
- Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA. */
-
-/* As a special exception, you may create a larger work that contains
- part or all of the Bison parser skeleton and distribute that work
- under terms of your choice, so long as that work isn't itself a
- parser generator using the skeleton or a modified version thereof
- as a parser skeleton. Alternatively, if you modify or redistribute
- the parser skeleton itself, you may (at your option) remove this
- special exception, which will cause the skeleton and the resulting
- Bison output files to be licensed under the GNU General Public
- License without this special exception.
-
- This special exception was added by the Free Software Foundation in
- version 2.2 of Bison. */
-
-/* Tokens. */
-#ifndef YYTOKENTYPE
-# define YYTOKENTYPE
- /* Put the tokens into the symbol table, so that GDB and other debuggers
- know about them. */
- enum yytokentype {
- NAME = 258,
- LIBRARY = 259,
- DESCRIPTION = 260,
- STACKSIZE = 261,
- HEAPSIZE = 262,
- CODE = 263,
- DATA = 264,
- SECTIONS = 265,
- EXPORTS = 266,
- IMPORTS = 267,
- VERSIONK = 268,
- BASE = 269,
- CONSTANT = 270,
- READ = 271,
- WRITE = 272,
- EXECUTE = 273,
- SHARED = 274,
- NONSHARED = 275,
- NONAME = 276,
- PRIVATE = 277,
- SINGLE = 278,
- MULTIPLE = 279,
- INITINSTANCE = 280,
- INITGLOBAL = 281,
- TERMINSTANCE = 282,
- TERMGLOBAL = 283,
- EQUAL = 284,
- ID = 285,
- NUMBER = 286
- };
-#endif
-/* Tokens. */
-#define NAME 258
-#define LIBRARY 259
-#define DESCRIPTION 260
-#define STACKSIZE 261
-#define HEAPSIZE 262
-#define CODE 263
-#define DATA 264
-#define SECTIONS 265
-#define EXPORTS 266
-#define IMPORTS 267
-#define VERSIONK 268
-#define BASE 269
-#define CONSTANT 270
-#define READ 271
-#define WRITE 272
-#define EXECUTE 273
-#define SHARED 274
-#define NONSHARED 275
-#define NONAME 276
-#define PRIVATE 277
-#define SINGLE 278
-#define MULTIPLE 279
-#define INITINSTANCE 280
-#define INITGLOBAL 281
-#define TERMINSTANCE 282
-#define TERMGLOBAL 283
-#define EQUAL 284
-#define ID 285
-#define NUMBER 286
-
-
-
-
-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-typedef union YYSTYPE
-#line 29 "defparse.y"
-{
- char *id;
- const char *id_const;
- int number;
-}
-/* Line 1529 of yacc.c. */
-#line 117 "defparse.h"
- YYSTYPE;
-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
-# define YYSTYPE_IS_DECLARED 1
-# define YYSTYPE_IS_TRIVIAL 1
-#endif
-
-extern YYSTYPE yylval;
-
diff -Nur binutils-2.24.orig/binutils/doc/addr2line.1 binutils-2.24/binutils/doc/addr2line.1
--- binutils-2.24.orig/binutils/doc/addr2line.1 2013-11-18 09:49:30.000000000 +0100
+++ binutils-2.24/binutils/doc/addr2line.1 1970-01-01 01:00:00.000000000 +0100
@@ -1,299 +0,0 @@
-.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings. \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote. \*(C+ will
-.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-. ds -- \(*W-
-. ds PI pi
-. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
-. ds L" ""
-. ds R" ""
-. ds C` ""
-. ds C' ""
-'br\}
-.el\{\
-. ds -- \|\(em\|
-. ds PI \(*p
-. ds L" ``
-. ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD. Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-. de IX
-. tm Index:\\$1\t\\n%\t"\\$2"
-..
-. nr % 0
-. rr F
-.\}
-.el \{\
-. de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear. Run. Save yourself. No user-serviceable parts.
-. \" fudge factors for nroff and troff
-.if n \{\
-. ds #H 0
-. ds #V .8m
-. ds #F .3m
-. ds #[ \f1
-. ds #] \fP
-.\}
-.if t \{\
-. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-. ds #V .6m
-. ds #F 0
-. ds #[ \&
-. ds #] \&
-.\}
-. \" simple accents for nroff and troff
-.if n \{\
-. ds ' \&
-. ds ` \&
-. ds ^ \&
-. ds , \&
-. ds ~ ~
-. ds /
-.\}
-.if t \{\
-. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-. \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-. \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-. \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-. ds : e
-. ds 8 ss
-. ds o a
-. ds d- d\h'-1'\(ga
-. ds D- D\h'-1'\(hy
-. ds th \o'bp'
-. ds Th \o'LP'
-. ds ae ae
-. ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "ADDR2LINE 1"
-.TH ADDR2LINE 1 "2013-11-18" "binutils-2.23.91" "GNU Development Tools"
-.\" For nroff, turn off justification. Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-addr2line \- convert addresses into file names and line numbers.
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-addr2line [\fB\-a\fR|\fB\-\-addresses\fR]
- [\fB\-b\fR \fIbfdname\fR|\fB\-\-target=\fR\fIbfdname\fR]
- [\fB\-C\fR|\fB\-\-demangle\fR[=\fIstyle\fR]]
- [\fB\-e\fR \fIfilename\fR|\fB\-\-exe=\fR\fIfilename\fR]
- [\fB\-f\fR|\fB\-\-functions\fR] [\fB\-s\fR|\fB\-\-basename\fR]
- [\fB\-i\fR|\fB\-\-inlines\fR]
- [\fB\-p\fR|\fB\-\-pretty\-print\fR]
- [\fB\-j\fR|\fB\-\-section=\fR\fIname\fR]
- [\fB\-H\fR|\fB\-\-help\fR] [\fB\-V\fR|\fB\-\-version\fR]
- [addr addr ...]
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-\&\fBaddr2line\fR translates addresses into file names and line numbers.
-Given an address in an executable or an offset in a section of a relocatable
-object, it uses the debugging information to figure out which file name and
-line number are associated with it.
-.PP
-The executable or relocatable object to use is specified with the \fB\-e\fR
-option. The default is the file \fIa.out\fR. The section in the relocatable
-object to use is specified with the \fB\-j\fR option.
-.PP
-\&\fBaddr2line\fR has two modes of operation.
-.PP
-In the first, hexadecimal addresses are specified on the command line,
-and \fBaddr2line\fR displays the file name and line number for each
-address.
-.PP
-In the second, \fBaddr2line\fR reads hexadecimal addresses from
-standard input, and prints the file name and line number for each
-address on standard output. In this mode, \fBaddr2line\fR may be used
-in a pipe to convert dynamically chosen addresses.
-.PP
-The format of the output is \fB\s-1FILENAME:LINENO\s0\fR. The file name and
-line number for each input address is printed on separate lines.
-.PP
-If the \fB\-f\fR option is used, then each \fB\s-1FILENAME:LINENO\s0\fR
-line is preceded by \fB\s-1FUNCTIONNAME\s0\fR which is the name of the
-function containing the address.
-.PP
-If the \fB\-i\fR option is used and the code at the given address is
-present there because of inlining by the compiler then the
-\&\fB{\s-1FUNCTIONNAME\s0} \s-1FILENAME:LINENO\s0\fR information for the inlining
-function will be displayed afterwards. This continues recursively
-until there is no more inlining to report.
-.PP
-If the \fB\-a\fR option is used then the output is prefixed by the
-input address.
-.PP
-If the \fB\-p\fR option is used then the output for each input
-address is displayed on one, possibly quite long, line. If
-\&\fB\-p\fR is not used then the output is broken up into multiple
-lines, based on the paragraphs above.
-.PP
-If the file name or function name can not be determined,
-\&\fBaddr2line\fR will print two question marks in their place. If the
-line number can not be determined, \fBaddr2line\fR will print 0.
-.SH "OPTIONS"
-.IX Header "OPTIONS"
-The long and short forms of options, shown here as alternatives, are
-equivalent.
-.IP "\fB\-a\fR" 4
-.IX Item "-a"
-.PD 0
-.IP "\fB\-\-addresses\fR" 4
-.IX Item "--addresses"
-.PD
-Display the address before the function name, file and line number
-information. The address is printed with a \fB0x\fR prefix to easily
-identify it.
-.IP "\fB\-b\fR \fIbfdname\fR" 4
-.IX Item "-b bfdname"
-.PD 0
-.IP "\fB\-\-target=\fR\fIbfdname\fR" 4
-.IX Item "--target=bfdname"
-.PD
-Specify that the object-code format for the object files is
-\&\fIbfdname\fR.
-.IP "\fB\-C\fR" 4
-.IX Item "-C"
-.PD 0
-.IP "\fB\-\-demangle[=\fR\fIstyle\fR\fB]\fR" 4
-.IX Item "--demangle[=style]"
-.PD
-Decode (\fIdemangle\fR) low-level symbol names into user-level names.
-Besides removing any initial underscore prepended by the system, this
-makes \*(C+ function names readable. Different compilers have different
-mangling styles. The optional demangling style argument can be used to
-choose an appropriate demangling style for your compiler.
-.IP "\fB\-e\fR \fIfilename\fR" 4
-.IX Item "-e filename"
-.PD 0
-.IP "\fB\-\-exe=\fR\fIfilename\fR" 4
-.IX Item "--exe=filename"
-.PD
-Specify the name of the executable for which addresses should be
-translated. The default file is \fIa.out\fR.
-.IP "\fB\-f\fR" 4
-.IX Item "-f"
-.PD 0
-.IP "\fB\-\-functions\fR" 4
-.IX Item "--functions"
-.PD
-Display function names as well as file and line number information.
-.IP "\fB\-s\fR" 4
-.IX Item "-s"
-.PD 0
-.IP "\fB\-\-basenames\fR" 4
-.IX Item "--basenames"
-.PD
-Display only the base of each file name.
-.IP "\fB\-i\fR" 4
-.IX Item "-i"
-.PD 0
-.IP "\fB\-\-inlines\fR" 4
-.IX Item "--inlines"
-.PD
-If the address belongs to a function that was inlined, the source
-information for all enclosing scopes back to the first non-inlined
-function will also be printed. For example, if \f(CW\*(C`main\*(C'\fR inlines
-\&\f(CW\*(C`callee1\*(C'\fR which inlines \f(CW\*(C`callee2\*(C'\fR, and address is from
-\&\f(CW\*(C`callee2\*(C'\fR, the source information for \f(CW\*(C`callee1\*(C'\fR and \f(CW\*(C`main\*(C'\fR
-will also be printed.
-.IP "\fB\-j\fR" 4
-.IX Item "-j"
-.PD 0
-.IP "\fB\-\-section\fR" 4
-.IX Item "--section"
-.PD
-Read offsets relative to the specified section instead of absolute addresses.
-.IP "\fB\-p\fR" 4
-.IX Item "-p"
-.PD 0
-.IP "\fB\-\-pretty\-print\fR" 4
-.IX Item "--pretty-print"
-.PD
-Make the output more human friendly: each location are printed on one line.
-If option \fB\-i\fR is specified, lines for all enclosing scopes are
-prefixed with \fB(inlined by)\fR.
-.IP "\fB@\fR\fIfile\fR" 4
-.IX Item "@file"
-Read command-line options from \fIfile\fR. The options read are
-inserted in place of the original @\fIfile\fR option. If \fIfile\fR
-does not exist, or cannot be read, then the option will be treated
-literally, and not removed.
-.Sp
-Options in \fIfile\fR are separated by whitespace. A whitespace
-character may be included in an option by surrounding the entire
-option in either single or double quotes. Any character (including a
-backslash) may be included by prefixing the character to be included
-with a backslash. The \fIfile\fR may itself contain additional
-@\fIfile\fR options; any such options will be processed recursively.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-Info entries for \fIbinutils\fR.
-.SH "COPYRIGHT"
-.IX Header "COPYRIGHT"
-Copyright (c) 1991\-2013 Free Software Foundation, Inc.
-.PP
-Permission is granted to copy, distribute and/or modify this document
-under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.3
-or any later version published by the Free Software Foundation;
-with no Invariant Sections, with no Front-Cover Texts, and with no
-Back-Cover Texts. A copy of the license is included in the
-section entitled \*(L"\s-1GNU\s0 Free Documentation License\*(R".
diff -Nur binutils-2.24.orig/binutils/doc/ar.1 binutils-2.24/binutils/doc/ar.1
--- binutils-2.24.orig/binutils/doc/ar.1 2013-11-18 09:49:30.000000000 +0100
+++ binutils-2.24/binutils/doc/ar.1 1970-01-01 01:00:00.000000000 +0100
@@ -1,461 +0,0 @@
-.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings. \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote. \*(C+ will
-.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-. ds -- \(*W-
-. ds PI pi
-. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
-. ds L" ""
-. ds R" ""
-. ds C` ""
-. ds C' ""
-'br\}
-.el\{\
-. ds -- \|\(em\|
-. ds PI \(*p
-. ds L" ``
-. ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD. Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-. de IX
-. tm Index:\\$1\t\\n%\t"\\$2"
-..
-. nr % 0
-. rr F
-.\}
-.el \{\
-. de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear. Run. Save yourself. No user-serviceable parts.
-. \" fudge factors for nroff and troff
-.if n \{\
-. ds #H 0
-. ds #V .8m
-. ds #F .3m
-. ds #[ \f1
-. ds #] \fP
-.\}
-.if t \{\
-. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-. ds #V .6m
-. ds #F 0
-. ds #[ \&
-. ds #] \&
-.\}
-. \" simple accents for nroff and troff
-.if n \{\
-. ds ' \&
-. ds ` \&
-. ds ^ \&
-. ds , \&
-. ds ~ ~
-. ds /
-.\}
-.if t \{\
-. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-. \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-. \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-. \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-. ds : e
-. ds 8 ss
-. ds o a
-. ds d- d\h'-1'\(ga
-. ds D- D\h'-1'\(hy
-. ds th \o'bp'
-. ds Th \o'LP'
-. ds ae ae
-. ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "AR 1"
-.TH AR 1 "2013-11-18" "binutils-2.23.91" "GNU Development Tools"
-.\" For nroff, turn off justification. Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-ar \- create, modify, and extract from archives
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-ar [\fB\-\-plugin\fR \fIname\fR] [\fB\-X32_64\fR] [\fB\-\fR]\fIp\fR[\fImod\fR [\fIrelpos\fR] [\fIcount\fR]] [\fB\-\-target\fR \fIbfdname\fR] \fIarchive\fR [\fImember\fR...]
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-The \s-1GNU\s0 \fBar\fR program creates, modifies, and extracts from
-archives. An \fIarchive\fR is a single file holding a collection of
-other files in a structure that makes it possible to retrieve
-the original individual files (called \fImembers\fR of the archive).
-.PP
-The original files' contents, mode (permissions), timestamp, owner, and
-group are preserved in the archive, and can be restored on
-extraction.
-.PP
-\&\s-1GNU\s0 \fBar\fR can maintain archives whose members have names of any
-length; however, depending on how \fBar\fR is configured on your
-system, a limit on member-name length may be imposed for compatibility
-with archive formats maintained with other tools. If it exists, the
-limit is often 15 characters (typical of formats related to a.out) or 16
-characters (typical of formats related to coff).
-.PP
-\&\fBar\fR is considered a binary utility because archives of this sort
-are most often used as \fIlibraries\fR holding commonly needed
-subroutines.
-.PP
-\&\fBar\fR creates an index to the symbols defined in relocatable
-object modules in the archive when you specify the modifier \fBs\fR.
-Once created, this index is updated in the archive whenever \fBar\fR
-makes a change to its contents (save for the \fBq\fR update operation).
-An archive with such an index speeds up linking to the library, and
-allows routines in the library to call each other without regard to
-their placement in the archive.
-.PP
-You may use \fBnm \-s\fR or \fBnm \-\-print\-armap\fR to list this index
-table. If an archive lacks the table, another form of \fBar\fR called
-\&\fBranlib\fR can be used to add just the table.
-.PP
-\&\s-1GNU\s0 \fBar\fR can optionally create a \fIthin\fR archive,
-which contains a symbol index and references to the original copies
-of the member files of the archive. This is useful for building
-libraries for use within a local build tree, where the relocatable
-objects are expected to remain available, and copying the contents of
-each object would only waste time and space.
-.PP
-An archive can either be \fIthin\fR or it can be normal. It cannot
-be both at the same time. Once an archive is created its format
-cannot be changed without first deleting it and then creating a new
-archive in its place.
-.PP
-Thin archives are also \fIflattened\fR, so that adding one thin
-archive to another thin archive does not nest it, as would happen with
-a normal archive. Instead the elements of the first archive are added
-individually to the second archive.
-.PP
-The paths to the elements of the archive are stored relative to the
-archive itself.
-.PP
-\&\s-1GNU\s0 \fBar\fR is designed to be compatible with two different
-facilities. You can control its activity using command-line options,
-like the different varieties of \fBar\fR on Unix systems; or, if you
-specify the single command-line option \fB\-M\fR, you can control it
-with a script supplied via standard input, like the \s-1MRI\s0 \*(L"librarian\*(R"
-program.
-.SH "OPTIONS"
-.IX Header "OPTIONS"
-\&\s-1GNU\s0 \fBar\fR allows you to mix the operation code \fIp\fR and modifier
-flags \fImod\fR in any order, within the first command-line argument.
-.PP
-If you wish, you may begin the first command-line argument with a
-dash.
-.PP
-The \fIp\fR keyletter specifies what operation to execute; it may be
-any of the following, but you must specify only one of them:
-.IP "\fBd\fR" 4
-.IX Item "d"
-\&\fIDelete\fR modules from the archive. Specify the names of modules to
-be deleted as \fImember\fR...; the archive is untouched if you
-specify no files to delete.
-.Sp
-If you specify the \fBv\fR modifier, \fBar\fR lists each module
-as it is deleted.
-.IP "\fBm\fR" 4
-.IX Item "m"
-Use this operation to \fImove\fR members in an archive.
-.Sp
-The ordering of members in an archive can make a difference in how
-programs are linked using the library, if a symbol is defined in more
-than one member.
-.Sp
-If no modifiers are used with \f(CW\*(C`m\*(C'\fR, any members you name in the
-\&\fImember\fR arguments are moved to the \fIend\fR of the archive;
-you can use the \fBa\fR, \fBb\fR, or \fBi\fR modifiers to move them to a
-specified place instead.
-.IP "\fBp\fR" 4
-.IX Item "p"
-\&\fIPrint\fR the specified members of the archive, to the standard
-output file. If the \fBv\fR modifier is specified, show the member
-name before copying its contents to standard output.
-.Sp
-If you specify no \fImember\fR arguments, all the files in the archive are
-printed.
-.IP "\fBq\fR" 4
-.IX Item "q"
-\&\fIQuick append\fR; Historically, add the files \fImember\fR... to the end of
-\&\fIarchive\fR, without checking for replacement.
-.Sp
-The modifiers \fBa\fR, \fBb\fR, and \fBi\fR do \fInot\fR affect this
-operation; new members are always placed at the end of the archive.
-.Sp
-The modifier \fBv\fR makes \fBar\fR list each file as it is appended.
-.Sp
-Since the point of this operation is speed, implementations of
-\&\fBar\fR have the option of not updating the archive's symbol
-table if one exists. Too many different systems however assume that
-symbol tables are always up-to-date, so \s-1GNU\s0 \fBar\fR will
-rebuild the table even with a quick append.
-.Sp
-Note \- \s-1GNU\s0 \fBar\fR treats the command \fBqs\fR as a
-synonym for \fBr\fR \- replacing already existing files in the
-archive and appending new ones at the end.
-.IP "\fBr\fR" 4
-.IX Item "r"
-Insert the files \fImember\fR... into \fIarchive\fR (with
-\&\fIreplacement\fR). This operation differs from \fBq\fR in that any
-previously existing members are deleted if their names match those being
-added.
-.Sp
-If one of the files named in \fImember\fR... does not exist, \fBar\fR
-displays an error message, and leaves undisturbed any existing members
-of the archive matching that name.
-.Sp
-By default, new members are added at the end of the file; but you may
-use one of the modifiers \fBa\fR, \fBb\fR, or \fBi\fR to request
-placement relative to some existing member.
-.Sp
-The modifier \fBv\fR used with this operation elicits a line of
-output for each file inserted, along with one of the letters \fBa\fR or
-\&\fBr\fR to indicate whether the file was appended (no old member
-deleted) or replaced.
-.IP "\fBs\fR" 4
-.IX Item "s"
-Add an index to the archive, or update it if it already exists. Note
-this command is an exception to the rule that there can only be one
-command letter, as it is possible to use it as either a command or a
-modifier. In either case it does the same thing.
-.IP "\fBt\fR" 4
-.IX Item "t"
-Display a \fItable\fR listing the contents of \fIarchive\fR, or those
-of the files listed in \fImember\fR... that are present in the
-archive. Normally only the member name is shown; if you also want to
-see the modes (permissions), timestamp, owner, group, and size, you can
-request that by also specifying the \fBv\fR modifier.
-.Sp
-If you do not specify a \fImember\fR, all files in the archive
-are listed.
-.Sp
-If there is more than one file with the same name (say, \fBfie\fR) in
-an archive (say \fBb.a\fR), \fBar t b.a fie\fR lists only the
-first instance; to see them all, you must ask for a complete
-listing\-\-\-in our example, \fBar t b.a\fR.
-.IP "\fBx\fR" 4
-.IX Item "x"
-\&\fIExtract\fR members (named \fImember\fR) from the archive. You can
-use the \fBv\fR modifier with this operation, to request that
-\&\fBar\fR list each name as it extracts it.
-.Sp
-If you do not specify a \fImember\fR, all files in the archive
-are extracted.
-.Sp
-Files cannot be extracted from a thin archive.
-.IP "\fB\-\-help\fR" 4
-.IX Item "--help"
-Displays the list of command line options supported by \fBar\fR
-and then exits.
-.IP "\fB\-\-version\fR" 4
-.IX Item "--version"
-Displays the version information of \fBar\fR and then exits.
-.PP
-A number of modifiers (\fImod\fR) may immediately follow the \fIp\fR
-keyletter, to specify variations on an operation's behavior:
-.IP "\fBa\fR" 4
-.IX Item "a"
-Add new files \fIafter\fR an existing member of the
-archive. If you use the modifier \fBa\fR, the name of an existing archive
-member must be present as the \fIrelpos\fR argument, before the
-\&\fIarchive\fR specification.
-.IP "\fBb\fR" 4
-.IX Item "b"
-Add new files \fIbefore\fR an existing member of the
-archive. If you use the modifier \fBb\fR, the name of an existing archive
-member must be present as the \fIrelpos\fR argument, before the
-\&\fIarchive\fR specification. (same as \fBi\fR).
-.IP "\fBc\fR" 4
-.IX Item "c"
-\&\fICreate\fR the archive. The specified \fIarchive\fR is always
-created if it did not exist, when you request an update. But a warning is
-issued unless you specify in advance that you expect to create it, by
-using this modifier.
-.IP "\fBD\fR" 4
-.IX Item "D"
-Operate in \fIdeterministic\fR mode. When adding files and the archive
-index use zero for UIDs, GIDs, timestamps, and use consistent file modes
-for all files. When this option is used, if \fBar\fR is used with
-identical options and identical input files, multiple runs will create
-identical output files regardless of the input files' owners, groups,
-file modes, or modification times.
-.Sp
-If \fIbinutils\fR was configured with
-\&\fB\-\-enable\-deterministic\-archives\fR, then this mode is on by default.
-It can be disabled with the \fBU\fR modifier, below.
-.IP "\fBf\fR" 4
-.IX Item "f"
-Truncate names in the archive. \s-1GNU\s0 \fBar\fR will normally permit file
-names of any length. This will cause it to create archives which are
-not compatible with the native \fBar\fR program on some systems. If
-this is a concern, the \fBf\fR modifier may be used to truncate file
-names when putting them in the archive.
-.IP "\fBi\fR" 4
-.IX Item "i"
-Insert new files \fIbefore\fR an existing member of the
-archive. If you use the modifier \fBi\fR, the name of an existing archive
-member must be present as the \fIrelpos\fR argument, before the
-\&\fIarchive\fR specification. (same as \fBb\fR).
-.IP "\fBl\fR" 4
-.IX Item "l"
-This modifier is accepted but not used.
-.IP "\fBN\fR" 4
-.IX Item "N"
-Uses the \fIcount\fR parameter. This is used if there are multiple
-entries in the archive with the same name. Extract or delete instance
-\&\fIcount\fR of the given name from the archive.
-.IP "\fBo\fR" 4
-.IX Item "o"
-Preserve the \fIoriginal\fR dates of members when extracting them. If
-you do not specify this modifier, files extracted from the archive
-are stamped with the time of extraction.
-.IP "\fBP\fR" 4
-.IX Item "P"
-Use the full path name when matching names in the archive. \s-1GNU\s0
-\&\fBar\fR can not create an archive with a full path name (such archives
-are not \s-1POSIX\s0 complaint), but other archive creators can. This option
-will cause \s-1GNU\s0 \fBar\fR to match file names using a complete path
-name, which can be convenient when extracting a single file from an
-archive created by another tool.
-.IP "\fBs\fR" 4
-.IX Item "s"
-Write an object-file index into the archive, or update an existing one,
-even if no other change is made to the archive. You may use this modifier
-flag either with any operation, or alone. Running \fBar s\fR on an
-archive is equivalent to running \fBranlib\fR on it.
-.IP "\fBS\fR" 4
-.IX Item "S"
-Do not generate an archive symbol table. This can speed up building a
-large library in several steps. The resulting archive can not be used
-with the linker. In order to build a symbol table, you must omit the
-\&\fBS\fR modifier on the last execution of \fBar\fR, or you must run
-\&\fBranlib\fR on the archive.
-.IP "\fBT\fR" 4
-.IX Item "T"
-Make the specified \fIarchive\fR a \fIthin\fR archive. If it already
-exists and is a regular archive, the existing members must be present
-in the same directory as \fIarchive\fR.
-.IP "\fBu\fR" 4
-.IX Item "u"
-Normally, \fBar r\fR... inserts all files
-listed into the archive. If you would like to insert \fIonly\fR those
-of the files you list that are newer than existing members of the same
-names, use this modifier. The \fBu\fR modifier is allowed only for the
-operation \fBr\fR (replace). In particular, the combination \fBqu\fR is
-not allowed, since checking the timestamps would lose any speed
-advantage from the operation \fBq\fR.
-.IP "\fBU\fR" 4
-.IX Item "U"
-Do \fInot\fR operate in \fIdeterministic\fR mode. This is the inverse
-of the \fBD\fR modifier, above: added files and the archive index will
-get their actual \s-1UID\s0, \s-1GID\s0, timestamp, and file mode values.
-.Sp
-This is the default unless \fIbinutils\fR was configured with
-\&\fB\-\-enable\-deterministic\-archives\fR.
-.IP "\fBv\fR" 4
-.IX Item "v"
-This modifier requests the \fIverbose\fR version of an operation. Many
-operations display additional information, such as filenames processed,
-when the modifier \fBv\fR is appended.
-.IP "\fBV\fR" 4
-.IX Item "V"
-This modifier shows the version number of \fBar\fR.
-.PP
-\&\fBar\fR ignores an initial option spelt \fB\-X32_64\fR, for
-compatibility with \s-1AIX\s0. The behaviour produced by this option is the
-default for \s-1GNU\s0 \fBar\fR. \fBar\fR does not support any of the other
-\&\fB\-X\fR options; in particular, it does not support \fB\-X32\fR
-which is the default for \s-1AIX\s0 \fBar\fR.
-.PP
-The optional command line switch \fB\-\-plugin\fR \fIname\fR causes
-\&\fBar\fR to load the plugin called \fIname\fR which adds support
-for more file formats. This option is only available if the toolchain
-has been built with plugin support enabled.
-.PP
-The optional command line switch \fB\-\-target\fR \fIbfdname\fR
-specifies that the archive members are in an object code format
-different from your system's default format. See
-.IP "\fB@\fR\fIfile\fR" 4
-.IX Item "@file"
-Read command-line options from \fIfile\fR. The options read are
-inserted in place of the original @\fIfile\fR option. If \fIfile\fR
-does not exist, or cannot be read, then the option will be treated
-literally, and not removed.
-.Sp
-Options in \fIfile\fR are separated by whitespace. A whitespace
-character may be included in an option by surrounding the entire
-option in either single or double quotes. Any character (including a
-backslash) may be included by prefixing the character to be included
-with a backslash. The \fIfile\fR may itself contain additional
-@\fIfile\fR options; any such options will be processed recursively.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-\&\fInm\fR\|(1), \fIranlib\fR\|(1), and the Info entries for \fIbinutils\fR.
-.SH "COPYRIGHT"
-.IX Header "COPYRIGHT"
-Copyright (c) 1991\-2013 Free Software Foundation, Inc.
-.PP
-Permission is granted to copy, distribute and/or modify this document
-under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.3
-or any later version published by the Free Software Foundation;
-with no Invariant Sections, with no Front-Cover Texts, and with no
-Back-Cover Texts. A copy of the license is included in the
-section entitled \*(L"\s-1GNU\s0 Free Documentation License\*(R".
diff -Nur binutils-2.24.orig/binutils/doc/binutils.info binutils-2.24/binutils/doc/binutils.info
--- binutils-2.24.orig/binutils/doc/binutils.info 2013-11-18 09:49:30.000000000 +0100
+++ binutils-2.24/binutils/doc/binutils.info 1970-01-01 01:00:00.000000000 +0100
@@ -1,4898 +0,0 @@
-This is binutils.info, produced by makeinfo version 4.8 from
-binutils.texi.
-
- Copyright (C) 1991-2013 Free Software Foundation, Inc.
-
- Permission is granted to copy, distribute and/or modify this document
-under the terms of the GNU Free Documentation License, Version 1.3 or
-any later version published by the Free Software Foundation; with no
-Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
-Texts. A copy of the license is included in the section entitled "GNU
-Free Documentation License".
-
-INFO-DIR-SECTION Software development
-START-INFO-DIR-ENTRY
-* Binutils: (binutils). The GNU binary utilities.
-END-INFO-DIR-ENTRY
-
-INFO-DIR-SECTION Individual utilities
-START-INFO-DIR-ENTRY
-* addr2line: (binutils)addr2line. Convert addresses to file and line.
-* ar: (binutils)ar. Create, modify, and extract from archives.
-* c++filt: (binutils)c++filt. Filter to demangle encoded C++ symbols.
-* cxxfilt: (binutils)c++filt. MS-DOS name for c++filt.
-* dlltool: (binutils)dlltool. Create files needed to build and use DLLs.
-* nlmconv: (binutils)nlmconv. Converts object code into an NLM.
-* nm: (binutils)nm. List symbols from object files.
-* objcopy: (binutils)objcopy. Copy and translate object files.
-* objdump: (binutils)objdump. Display information from object files.
-* ranlib: (binutils)ranlib. Generate index to archive contents.
-* readelf: (binutils)readelf. Display the contents of ELF format files.
-* size: (binutils)size. List section sizes and total size.
-* strings: (binutils)strings. List printable strings from files.
-* strip: (binutils)strip. Discard symbols.
-* elfedit: (binutils)elfedit. Update the ELF header of ELF files.
-* windmc: (binutils)windmc. Generator for Windows message resources.
-* windres: (binutils)windres. Manipulate Windows resources.
-END-INFO-DIR-ENTRY
-
-
-File: binutils.info, Node: Top, Next: ar, Up: (dir)
-
-Introduction
-************
-
-This brief manual contains documentation for the GNU binary utilities
-(GNU Binutils) version 2.23.91:
-
- This document is distributed under the terms of the GNU Free
-Documentation License version 1.3. A copy of the license is included
-in the section entitled "GNU Free Documentation License".
-
-* Menu:
-
-* ar:: Create, modify, and extract from archives
-* nm:: List symbols from object files
-* objcopy:: Copy and translate object files
-* objdump:: Display information from object files
-* ranlib:: Generate index to archive contents
-* size:: List section sizes and total size
-* strings:: List printable strings from files
-* strip:: Discard symbols
-* c++filt:: Filter to demangle encoded C++ symbols
-* cxxfilt: c++filt. MS-DOS name for c++filt
-* addr2line:: Convert addresses to file and line
-* nlmconv:: Converts object code into an NLM
-* windmc:: Generator for Windows message resources
-* windres:: Manipulate Windows resources
-* dlltool:: Create files needed to build and use DLLs
-* readelf:: Display the contents of ELF format files
-* elfedit:: Update the ELF header of ELF files
-* Common Options:: Command-line options for all utilities
-* Selecting the Target System:: How these utilities determine the target
-* Reporting Bugs:: Reporting Bugs
-* GNU Free Documentation License:: GNU Free Documentation License
-* Binutils Index:: Binutils Index
-
-
-File: binutils.info, Node: ar, Next: nm, Prev: Top, Up: Top
-
-1 ar
-****
-
- ar [`--plugin' NAME] [-]P[MOD [RELPOS] [COUNT]] [`--target' BFDNAME] ARCHIVE [MEMBER...]
- ar -M [ '), and continues executing even after errors. If you
-redirect standard input to a script file, no prompts are issued, and
-`ar' abandons execution (with a nonzero exit code) on any error.
-
- The `ar' command language is _not_ designed to be equivalent to the
-command-line options; in fact, it provides somewhat less control over
-archives. The only purpose of the command language is to ease the
-transition to GNU `ar' for developers who already have scripts written
-for the MRI "librarian" program.
-
- The syntax for the `ar' command language is straightforward:
- * commands are recognized in upper or lower case; for example, `LIST'
- is the same as `list'. In the following descriptions, commands are
- shown in upper case for clarity.
-
- * a single command may appear on each line; it is the first word on
- the line.
-
- * empty lines are allowed, and have no effect.
-
- * comments are allowed; text after either of the characters `*' or
- `;' is ignored.
-
- * Whenever you use a list of names as part of the argument to an `ar'
- command, you can separate the individual names with either commas
- or blanks. Commas are shown in the explanations below, for
- clarity.
-
- * `+' is used as a line continuation character; if `+' appears at
- the end of a line, the text on the following line is considered
- part of the current command.
-
- Here are the commands you can use in `ar' scripts, or when using
-`ar' interactively. Three of them have special significance:
-
- `OPEN' or `CREATE' specify a "current archive", which is a temporary
-file required for most of the other commands.
-
- `SAVE' commits the changes so far specified by the script. Prior to
-`SAVE', commands affect only the temporary copy of the current archive.
-
-`ADDLIB ARCHIVE'
-`ADDLIB ARCHIVE (MODULE, MODULE, ... MODULE)'
- Add all the contents of ARCHIVE (or, if specified, each named
- MODULE from ARCHIVE) to the current archive.
-
- Requires prior use of `OPEN' or `CREATE'.
-
-`ADDMOD MEMBER, MEMBER, ... MEMBER'
- Add each named MEMBER as a module in the current archive.
-
- Requires prior use of `OPEN' or `CREATE'.
-
-`CLEAR'
- Discard the contents of the current archive, canceling the effect
- of any operations since the last `SAVE'. May be executed (with no
- effect) even if no current archive is specified.
-
-`CREATE ARCHIVE'
- Creates an archive, and makes it the current archive (required for
- many other commands). The new archive is created with a temporary
- name; it is not actually saved as ARCHIVE until you use `SAVE'.
- You can overwrite existing archives; similarly, the contents of any
- existing file named ARCHIVE will not be destroyed until `SAVE'.
-
-`DELETE MODULE, MODULE, ... MODULE'
- Delete each listed MODULE from the current archive; equivalent to
- `ar -d ARCHIVE MODULE ... MODULE'.
-
- Requires prior use of `OPEN' or `CREATE'.
-
-`DIRECTORY ARCHIVE (MODULE, ... MODULE)'
-`DIRECTORY ARCHIVE (MODULE, ... MODULE) OUTPUTFILE'
- List each named MODULE present in ARCHIVE. The separate command
- `VERBOSE' specifies the form of the output: when verbose output is
- off, output is like that of `ar -t ARCHIVE MODULE...'. When
- verbose output is on, the listing is like `ar -tv ARCHIVE
- MODULE...'.
-
- Output normally goes to the standard output stream; however, if you
- specify OUTPUTFILE as a final argument, `ar' directs the output to
- that file.
-
-`END'
- Exit from `ar', with a `0' exit code to indicate successful
- completion. This command does not save the output file; if you
- have changed the current archive since the last `SAVE' command,
- those changes are lost.
-
-`EXTRACT MODULE, MODULE, ... MODULE'
- Extract each named MODULE from the current archive, writing them
- into the current directory as separate files. Equivalent to `ar -x
- ARCHIVE MODULE...'.
-
- Requires prior use of `OPEN' or `CREATE'.
-
-`LIST'
- Display full contents of the current archive, in "verbose" style
- regardless of the state of `VERBOSE'. The effect is like `ar tv
- ARCHIVE'. (This single command is a GNU `ar' enhancement, rather
- than present for MRI compatibility.)
-
- Requires prior use of `OPEN' or `CREATE'.
-
-`OPEN ARCHIVE'
- Opens an existing archive for use as the current archive (required
- for many other commands). Any changes as the result of subsequent
- commands will not actually affect ARCHIVE until you next use
- `SAVE'.
-
-`REPLACE MODULE, MODULE, ... MODULE'
- In the current archive, replace each existing MODULE (named in the
- `REPLACE' arguments) from files in the current working directory.
- To execute this command without errors, both the file, and the
- module in the current archive, must exist.
-
- Requires prior use of `OPEN' or `CREATE'.
-
-`VERBOSE'
- Toggle an internal flag governing the output from `DIRECTORY'.
- When the flag is on, `DIRECTORY' output matches output from `ar
- -tv '....
-
-`SAVE'
- Commit your changes to the current archive, and actually save it
- as a file with the name specified in the last `CREATE' or `OPEN'
- command.
-
- Requires prior use of `OPEN' or `CREATE'.
-
-
-
-File: binutils.info, Node: nm, Next: objcopy, Prev: ar, Up: Top
-
-2 nm
-****
-
- nm [`-A'|`-o'|`--print-file-name'] [`-a'|`--debug-syms']
- [`-B'|`--format=bsd'] [`-C'|`--demangle'[=STYLE]]
- [`-D'|`--dynamic'] [`-f'FORMAT|`--format='FORMAT]
- [`-g'|`--extern-only'] [`-h'|`--help']
- [`-l'|`--line-numbers'] [`-n'|`-v'|`--numeric-sort']
- [`-P'|`--portability'] [`-p'|`--no-sort']
- [`-r'|`--reverse-sort'] [`-S'|`--print-size']
- [`-s'|`--print-armap'] [`-t' RADIX|`--radix='RADIX]
- [`-u'|`--undefined-only'] [`-V'|`--version']
- [`-X 32_64'] [`--defined-only'] [`--no-demangle']
- [`--plugin' NAME] [`--size-sort'] [`--special-syms']
- [`--synthetic'] [`--target='BFDNAME]
- [OBJFILE...]
-
- GNU `nm' lists the symbols from object files OBJFILE.... If no
-object files are listed as arguments, `nm' assumes the file `a.out'.
-
- For each symbol, `nm' shows:
-
- * The symbol value, in the radix selected by options (see below), or
- hexadecimal by default.
-
- * The symbol type. At least the following types are used; others
- are, as well, depending on the object file format. If lowercase,
- the symbol is usually local; if uppercase, the symbol is global
- (external). There are however a few lowercase symbols that are
- shown for special global symbols (`u', `v' and `w').
-
- `A'
- The symbol's value is absolute, and will not be changed by
- further linking.
-
- `B'
- `b'
- The symbol is in the uninitialized data section (known as
- BSS).
-
- `C'
- The symbol is common. Common symbols are uninitialized data.
- When linking, multiple common symbols may appear with the
- same name. If the symbol is defined anywhere, the common
- symbols are treated as undefined references. For more
- details on common symbols, see the discussion of -warn-common
- in *Note Linker options: (ld.info)Options.
-
- `D'
- `d'
- The symbol is in the initialized data section.
-
- `G'
- `g'
- The symbol is in an initialized data section for small
- objects. Some object file formats permit more efficient
- access to small data objects, such as a global int variable
- as opposed to a large global array.
-
- `i'
- For PE format files this indicates that the symbol is in a
- section specific to the implementation of DLLs. For ELF
- format files this indicates that the symbol is an indirect
- function. This is a GNU extension to the standard set of ELF
- symbol types. It indicates a symbol which if referenced by a
- relocation does not evaluate to its address, but instead must
- be invoked at runtime. The runtime execution will then
- return the value to be used in the relocation.
-
- `I'
- The symbol is an indirect reference to another symbol.
-
- `N'
- The symbol is a debugging symbol.
-
- `p'
- The symbols is in a stack unwind section.
-
- `R'
- `r'
- The symbol is in a read only data section.
-
- `S'
- `s'
- The symbol is in an uninitialized data section for small
- objects.
-
- `T'
- `t'
- The symbol is in the text (code) section.
-
- `U'
- The symbol is undefined.
-
- `u'
- The symbol is a unique global symbol. This is a GNU
- extension to the standard set of ELF symbol bindings. For
- such a symbol the dynamic linker will make sure that in the
- entire process there is just one symbol with this name and
- type in use.
-
- `V'
- `v'
- The symbol is a weak object. When a weak defined symbol is
- linked with a normal defined symbol, the normal defined
- symbol is used with no error. When a weak undefined symbol
- is linked and the symbol is not defined, the value of the
- weak symbol becomes zero with no error. On some systems,
- uppercase indicates that a default value has been specified.
-
- `W'
- `w'
- The symbol is a weak symbol that has not been specifically
- tagged as a weak object symbol. When a weak defined symbol
- is linked with a normal defined symbol, the normal defined
- symbol is used with no error. When a weak undefined symbol
- is linked and the symbol is not defined, the value of the
- symbol is determined in a system-specific manner without
- error. On some systems, uppercase indicates that a default
- value has been specified.
-
- `-'
- The symbol is a stabs symbol in an a.out object file. In
- this case, the next values printed are the stabs other field,
- the stabs desc field, and the stab type. Stabs symbols are
- used to hold debugging information.
-
- `?'
- The symbol type is unknown, or object file format specific.
-
- * The symbol name.
-
- The long and short forms of options, shown here as alternatives, are
-equivalent.
-
-`-A'
-`-o'
-`--print-file-name'
- Precede each symbol by the name of the input file (or archive
- member) in which it was found, rather than identifying the input
- file once only, before all of its symbols.
-
-`-a'
-`--debug-syms'
- Display all symbols, even debugger-only symbols; normally these
- are not listed.
-
-`-B'
- The same as `--format=bsd' (for compatibility with the MIPS `nm').
-
-`-C'
-`--demangle[=STYLE]'
- Decode ("demangle") low-level symbol names into user-level names.
- Besides removing any initial underscore prepended by the system,
- this makes C++ function names readable. Different compilers have
- different mangling styles. The optional demangling style argument
- can be used to choose an appropriate demangling style for your
- compiler. *Note c++filt::, for more information on demangling.
-
-`--no-demangle'
- Do not demangle low-level symbol names. This is the default.
-
-`-D'
-`--dynamic'
- Display the dynamic symbols rather than the normal symbols. This
- is only meaningful for dynamic objects, such as certain types of
- shared libraries.
-
-`-f FORMAT'
-`--format=FORMAT'
- Use the output format FORMAT, which can be `bsd', `sysv', or
- `posix'. The default is `bsd'. Only the first character of
- FORMAT is significant; it can be either upper or lower case.
-
-`-g'
-`--extern-only'
- Display only external symbols.
-
-`-h'
-`--help'
- Show a summary of the options to `nm' and exit.
-
-`-l'
-`--line-numbers'
- For each symbol, use debugging information to try to find a
- filename and line number. For a defined symbol, look for the line
- number of the address of the symbol. For an undefined symbol,
- look for the line number of a relocation entry which refers to the
- symbol. If line number information can be found, print it after
- the other symbol information.
-
-`-n'
-`-v'
-`--numeric-sort'
- Sort symbols numerically by their addresses, rather than
- alphabetically by their names.
-
-`-p'
-`--no-sort'
- Do not bother to sort the symbols in any order; print them in the
- order encountered.
-
-`-P'
-`--portability'
- Use the POSIX.2 standard output format instead of the default
- format. Equivalent to `-f posix'.
-
-`-r'
-`--reverse-sort'
- Reverse the order of the sort (whether numeric or alphabetic); let
- the last come first.
-
-`-S'
-`--print-size'
- Print both value and size of defined symbols for the `bsd' output
- style. This option has no effect for object formats that do not
- record symbol sizes, unless `--size-sort' is also used in which
- case a calculated size is displayed.
-
-`-s'
-`--print-armap'
- When listing symbols from archive members, include the index: a
- mapping (stored in the archive by `ar' or `ranlib') of which
- modules contain definitions for which names.
-
-`-t RADIX'
-`--radix=RADIX'
- Use RADIX as the radix for printing the symbol values. It must be
- `d' for decimal, `o' for octal, or `x' for hexadecimal.
-
-`-u'
-`--undefined-only'
- Display only undefined symbols (those external to each object
- file).
-
-`-V'
-`--version'
- Show the version number of `nm' and exit.
-
-`-X'
- This option is ignored for compatibility with the AIX version of
- `nm'. It takes one parameter which must be the string `32_64'.
- The default mode of AIX `nm' corresponds to `-X 32', which is not
- supported by GNU `nm'.
-
-`--defined-only'
- Display only defined symbols for each object file.
-
-`--plugin NAME'
- Load the plugin called NAME to add support for extra target types.
- This option is only available if the toolchain has been built
- with plugin support enabled.
-
-`--size-sort'
- Sort symbols by size. The size is computed as the difference
- between the value of the symbol and the value of the symbol with
- the next higher value. If the `bsd' output format is used the
- size of the symbol is printed, rather than the value, and `-S'
- must be used in order both size and value to be printed.
-
-`--special-syms'
- Display symbols which have a target-specific special meaning.
- These symbols are usually used by the target for some special
- processing and are not normally helpful when included in the
- normal symbol lists. For example for ARM targets this option
- would skip the mapping symbols used to mark transitions between
- ARM code, THUMB code and data.
-
-`--synthetic'
- Include synthetic symbols in the output. These are special symbols
- created by the linker for various purposes. They are not shown by
- default since they are not part of the binary's original source
- code.
-
-`--target=BFDNAME'
- Specify an object code format other than your system's default
- format. *Note Target Selection::, for more information.
-
-
-
-File: binutils.info, Node: objcopy, Next: objdump, Prev: nm, Up: Top
-
-3 objcopy
-*********
-
- objcopy [`-F' BFDNAME|`--target='BFDNAME]
- [`-I' BFDNAME|`--input-target='BFDNAME]
- [`-O' BFDNAME|`--output-target='BFDNAME]
- [`-B' BFDARCH|`--binary-architecture='BFDARCH]
- [`-S'|`--strip-all']
- [`-g'|`--strip-debug']
- [`-K' SYMBOLNAME|`--keep-symbol='SYMBOLNAME]
- [`-N' SYMBOLNAME|`--strip-symbol='SYMBOLNAME]
- [`--strip-unneeded-symbol='SYMBOLNAME]
- [`-G' SYMBOLNAME|`--keep-global-symbol='SYMBOLNAME]
- [`--localize-hidden']
- [`-L' SYMBOLNAME|`--localize-symbol='SYMBOLNAME]
- [`--globalize-symbol='SYMBOLNAME]
- [`-W' SYMBOLNAME|`--weaken-symbol='SYMBOLNAME]
- [`-w'|`--wildcard']
- [`-x'|`--discard-all']
- [`-X'|`--discard-locals']
- [`-b' BYTE|`--byte='BYTE]
- [`-i' [BREADTH]|`--interleave'[=BREADTH]]
- [`--interleave-width='WIDTH]
- [`-j' SECTIONPATTERN|`--only-section='SECTIONPATTERN]
- [`-R' SECTIONPATTERN|`--remove-section='SECTIONPATTERN]
- [`-p'|`--preserve-dates']
- [`-D'|`--enable-deterministic-archives']
- [`-U'|`--disable-deterministic-archives']
- [`--debugging']
- [`--gap-fill='VAL]
- [`--pad-to='ADDRESS]
- [`--set-start='VAL]
- [`--adjust-start='INCR]
- [`--change-addresses='INCR]
- [`--change-section-address' SECTIONPATTERN{=,+,-}VAL]
- [`--change-section-lma' SECTIONPATTERN{=,+,-}VAL]
- [`--change-section-vma' SECTIONPATTERN{=,+,-}VAL]
- [`--change-warnings'] [`--no-change-warnings']
- [`--set-section-flags' SECTIONPATTERN=FLAGS]
- [`--add-section' SECTIONNAME=FILENAME]
- [`--rename-section' OLDNAME=NEWNAME[,FLAGS]]
- [`--long-section-names' {enable,disable,keep}]
- [`--change-leading-char'] [`--remove-leading-char']
- [`--reverse-bytes='NUM]
- [`--srec-len='IVAL] [`--srec-forceS3']
- [`--redefine-sym' OLD=NEW]
- [`--redefine-syms='FILENAME]
- [`--weaken']
- [`--keep-symbols='FILENAME]
- [`--strip-symbols='FILENAME]
- [`--strip-unneeded-symbols='FILENAME]
- [`--keep-global-symbols='FILENAME]
- [`--localize-symbols='FILENAME]
- [`--globalize-symbols='FILENAME]
- [`--weaken-symbols='FILENAME]
- [`--alt-machine-code='INDEX]
- [`--prefix-symbols='STRING]
- [`--prefix-sections='STRING]
- [`--prefix-alloc-sections='STRING]
- [`--add-gnu-debuglink='PATH-TO-FILE]
- [`--keep-file-symbols']
- [`--only-keep-debug']
- [`--strip-dwo']
- [`--extract-dwo']
- [`--extract-symbol']
- [`--writable-text']
- [`--readonly-text']
- [`--pure']
- [`--impure']
- [`--file-alignment='NUM]
- [`--heap='SIZE]
- [`--image-base='ADDRESS]
- [`--section-alignment='NUM]
- [`--stack='SIZE]
- [`--subsystem='WHICH:MAJOR.MINOR]
- [`--compress-debug-sections']
- [`--decompress-debug-sections']
- [`--dwarf-depth=N']
- [`--dwarf-start=N']
- [`-v'|`--verbose']
- [`-V'|`--version']
- [`--help'] [`--info']
- INFILE [OUTFILE]
-
- The GNU `objcopy' utility copies the contents of an object file to
-another. `objcopy' uses the GNU BFD Library to read and write the
-object files. It can write the destination object file in a format
-different from that of the source object file. The exact behavior of
-`objcopy' is controlled by command-line options. Note that `objcopy'
-should be able to copy a fully linked file between any two formats.
-However, copying a relocatable object file between any two formats may
-not work as expected.
-
- `objcopy' creates temporary files to do its translations and deletes
-them afterward. `objcopy' uses BFD to do all its translation work; it
-has access to all the formats described in BFD and thus is able to
-recognize most formats without being told explicitly. *Note BFD:
-(ld.info)BFD.
-
- `objcopy' can be used to generate S-records by using an output
-target of `srec' (e.g., use `-O srec').
-
- `objcopy' can be used to generate a raw binary file by using an
-output target of `binary' (e.g., use `-O binary'). When `objcopy'
-generates a raw binary file, it will essentially produce a memory dump
-of the contents of the input object file. All symbols and relocation
-information will be discarded. The memory dump will start at the load
-address of the lowest section copied into the output file.
-
- When generating an S-record or a raw binary file, it may be helpful
-to use `-S' to remove sections containing debugging information. In
-some cases `-R' will be useful to remove sections which contain
-information that is not needed by the binary file.
-
- Note--`objcopy' is not able to change the endianness of its input
-files. If the input format has an endianness (some formats do not),
-`objcopy' can only copy the inputs into file formats that have the same
-endianness or which have no endianness (e.g., `srec'). (However, see
-the `--reverse-bytes' option.)
-
-`INFILE'
-`OUTFILE'
- The input and output files, respectively. If you do not specify
- OUTFILE, `objcopy' creates a temporary file and destructively
- renames the result with the name of INFILE.
-
-`-I BFDNAME'
-`--input-target=BFDNAME'
- Consider the source file's object format to be BFDNAME, rather than
- attempting to deduce it. *Note Target Selection::, for more
- information.
-
-`-O BFDNAME'
-`--output-target=BFDNAME'
- Write the output file using the object format BFDNAME. *Note
- Target Selection::, for more information.
-
-`-F BFDNAME'
-`--target=BFDNAME'
- Use BFDNAME as the object format for both the input and the output
- file; i.e., simply transfer data from source to destination with no
- translation. *Note Target Selection::, for more information.
-
-`-B BFDARCH'
-`--binary-architecture=BFDARCH'
- Useful when transforming a architecture-less input file into an
- object file. In this case the output architecture can be set to
- BFDARCH. This option will be ignored if the input file has a
- known BFDARCH. You can access this binary data inside a program
- by referencing the special symbols that are created by the
- conversion process. These symbols are called
- _binary_OBJFILE_start, _binary_OBJFILE_end and
- _binary_OBJFILE_size. e.g. you can transform a picture file into
- an object file and then access it in your code using these symbols.
-
-`-j SECTIONPATTERN'
-`--only-section=SECTIONPATTERN'
- Copy only the indicated sections from the input file to the output
- file. This option may be given more than once. Note that using
- this option inappropriately may make the output file unusable.
- Wildcard characters are accepted in SECTIONPATTERN.
-
-`-R SECTIONPATTERN'
-`--remove-section=SECTIONPATTERN'
- Remove any section matching SECTIONPATTERN from the output file.
- This option may be given more than once. Note that using this
- option inappropriately may make the output file unusable. Wildcard
- characters are accepted in SECTIONPATTERN. Using both the `-j'
- and `-R' options together results in undefined behaviour.
-
-`-S'
-`--strip-all'
- Do not copy relocation and symbol information from the source file.
-
-`-g'
-`--strip-debug'
- Do not copy debugging symbols or sections from the source file.
-
-`--strip-unneeded'
- Strip all symbols that are not needed for relocation processing.
-
-`-K SYMBOLNAME'
-`--keep-symbol=SYMBOLNAME'
- When stripping symbols, keep symbol SYMBOLNAME even if it would
- normally be stripped. This option may be given more than once.
-
-`-N SYMBOLNAME'
-`--strip-symbol=SYMBOLNAME'
- Do not copy symbol SYMBOLNAME from the source file. This option
- may be given more than once.
-
-`--strip-unneeded-symbol=SYMBOLNAME'
- Do not copy symbol SYMBOLNAME from the source file unless it is
- needed by a relocation. This option may be given more than once.
-
-`-G SYMBOLNAME'
-`--keep-global-symbol=SYMBOLNAME'
- Keep only symbol SYMBOLNAME global. Make all other symbols local
- to the file, so that they are not visible externally. This option
- may be given more than once.
-
-`--localize-hidden'
- In an ELF object, mark all symbols that have hidden or internal
- visibility as local. This option applies on top of
- symbol-specific localization options such as `-L'.
-
-`-L SYMBOLNAME'
-`--localize-symbol=SYMBOLNAME'
- Make symbol SYMBOLNAME local to the file, so that it is not
- visible externally. This option may be given more than once.
-
-`-W SYMBOLNAME'
-`--weaken-symbol=SYMBOLNAME'
- Make symbol SYMBOLNAME weak. This option may be given more than
- once.
-
-`--globalize-symbol=SYMBOLNAME'
- Give symbol SYMBOLNAME global scoping so that it is visible
- outside of the file in which it is defined. This option may be
- given more than once.
-
-`-w'
-`--wildcard'
- Permit regular expressions in SYMBOLNAMEs used in other command
- line options. The question mark (?), asterisk (*), backslash (\)
- and square brackets ([]) operators can be used anywhere in the
- symbol name. If the first character of the symbol name is the
- exclamation point (!) then the sense of the switch is reversed for
- that symbol. For example:
-
- -w -W !foo -W fo*
-
- would cause objcopy to weaken all symbols that start with "fo"
- except for the symbol "foo".
-
-`-x'
-`--discard-all'
- Do not copy non-global symbols from the source file.
-
-`-X'
-`--discard-locals'
- Do not copy compiler-generated local symbols. (These usually
- start with `L' or `.'.)
-
-`-b BYTE'
-`--byte=BYTE'
- If interleaving has been enabled via the `--interleave' option
- then start the range of bytes to keep at the BYTEth byte. BYTE
- can be in the range from 0 to BREADTH-1, where BREADTH is the
- value given by the `--interleave' option.
-
-`-i [BREADTH]'
-`--interleave[=BREADTH]'
- Only copy a range out of every BREADTH bytes. (Header data is not
- affected). Select which byte in the range begins the copy with
- the `--byte' option. Select the width of the range with the
- `--interleave-width' option.
-
- This option is useful for creating files to program ROM. It is
- typically used with an `srec' output target. Note that `objcopy'
- will complain if you do not specify the `--byte' option as well.
-
- The default interleave breadth is 4, so with `--byte' set to 0,
- `objcopy' would copy the first byte out of every four bytes from
- the input to the output.
-
-`--interleave-width=WIDTH'
- When used with the `--interleave' option, copy WIDTH bytes at a
- time. The start of the range of bytes to be copied is set by the
- `--byte' option, and the extent of the range is set with the
- `--interleave' option.
-
- The default value for this option is 1. The value of WIDTH plus
- the BYTE value set by the `--byte' option must not exceed the
- interleave breadth set by the `--interleave' option.
-
- This option can be used to create images for two 16-bit flashes
- interleaved in a 32-bit bus by passing `-b 0 -i 4
- --interleave-width=2' and `-b 2 -i 4 --interleave-width=2' to two
- `objcopy' commands. If the input was '12345678' then the outputs
- would be '1256' and '3478' respectively.
-
-`-p'
-`--preserve-dates'
- Set the access and modification dates of the output file to be the
- same as those of the input file.
-
-`-D'
-`--enable-deterministic-archives'
- Operate in _deterministic_ mode. When copying archive members and
- writing the archive index, use zero for UIDs, GIDs, timestamps,
- and use consistent file modes for all files.
-
- If `binutils' was configured with
- `--enable-deterministic-archives', then this mode is on by default.
- It can be disabled with the `-U' option, below.
-
-`-U'
-`--disable-deterministic-archives'
- Do _not_ operate in _deterministic_ mode. This is the inverse of
- the `-D' option, above: when copying archive members and writing
- the archive index, use their actual UID, GID, timestamp, and file
- mode values.
-
- This is the default unless `binutils' was configured with
- `--enable-deterministic-archives'.
-
-`--debugging'
- Convert debugging information, if possible. This is not the
- default because only certain debugging formats are supported, and
- the conversion process can be time consuming.
-
-`--gap-fill VAL'
- Fill gaps between sections with VAL. This operation applies to
- the _load address_ (LMA) of the sections. It is done by increasing
- the size of the section with the lower address, and filling in the
- extra space created with VAL.
-
-`--pad-to ADDRESS'
- Pad the output file up to the load address ADDRESS. This is done
- by increasing the size of the last section. The extra space is
- filled in with the value specified by `--gap-fill' (default zero).
-
-`--set-start VAL'
- Set the start address of the new file to VAL. Not all object file
- formats support setting the start address.
-
-`--change-start INCR'
-`--adjust-start INCR'
- Change the start address by adding INCR. Not all object file
- formats support setting the start address.
-
-`--change-addresses INCR'
-`--adjust-vma INCR'
- Change the VMA and LMA addresses of all sections, as well as the
- start address, by adding INCR. Some object file formats do not
- permit section addresses to be changed arbitrarily. Note that
- this does not relocate the sections; if the program expects
- sections to be loaded at a certain address, and this option is
- used to change the sections such that they are loaded at a
- different address, the program may fail.
-
-`--change-section-address SECTIONPATTERN{=,+,-}VAL'
-`--adjust-section-vma SECTIONPATTERN{=,+,-}VAL'
- Set or change both the VMA address and the LMA address of any
- section matching SECTIONPATTERN. If `=' is used, the section
- address is set to VAL. Otherwise, VAL is added to or subtracted
- from the section address. See the comments under
- `--change-addresses', above. If SECTIONPATTERN does not match any
- sections in the input file, a warning will be issued, unless
- `--no-change-warnings' is used.
-
-`--change-section-lma SECTIONPATTERN{=,+,-}VAL'
- Set or change the LMA address of any sections matching
- SECTIONPATTERN. The LMA address is the address where the section
- will be loaded into memory at program load time. Normally this is
- the same as the VMA address, which is the address of the section
- at program run time, but on some systems, especially those where a
- program is held in ROM, the two can be different. If `=' is used,
- the section address is set to VAL. Otherwise, VAL is added to or
- subtracted from the section address. See the comments under
- `--change-addresses', above. If SECTIONPATTERN does not match any
- sections in the input file, a warning will be issued, unless
- `--no-change-warnings' is used.
-
-`--change-section-vma SECTIONPATTERN{=,+,-}VAL'
- Set or change the VMA address of any section matching
- SECTIONPATTERN. The VMA address is the address where the section
- will be located once the program has started executing. Normally
- this is the same as the LMA address, which is the address where
- the section will be loaded into memory, but on some systems,
- especially those where a program is held in ROM, the two can be
- different. If `=' is used, the section address is set to VAL.
- Otherwise, VAL is added to or subtracted from the section address.
- See the comments under `--change-addresses', above. If
- SECTIONPATTERN does not match any sections in the input file, a
- warning will be issued, unless `--no-change-warnings' is used.
-
-`--change-warnings'
-`--adjust-warnings'
- If `--change-section-address' or `--change-section-lma' or
- `--change-section-vma' is used, and the section pattern does not
- match any sections, issue a warning. This is the default.
-
-`--no-change-warnings'
-`--no-adjust-warnings'
- Do not issue a warning if `--change-section-address' or
- `--adjust-section-lma' or `--adjust-section-vma' is used, even if
- the section pattern does not match any sections.
-
-`--set-section-flags SECTIONPATTERN=FLAGS'
- Set the flags for any sections matching SECTIONPATTERN. The FLAGS
- argument is a comma separated string of flag names. The
- recognized names are `alloc', `contents', `load', `noload',
- `readonly', `code', `data', `rom', `share', and `debug'. You can
- set the `contents' flag for a section which does not have
- contents, but it is not meaningful to clear the `contents' flag of
- a section which does have contents-just remove the section
- instead. Not all flags are meaningful for all object file formats.
-
-`--add-section SECTIONNAME=FILENAME'
- Add a new section named SECTIONNAME while copying the file. The
- contents of the new section are taken from the file FILENAME. The
- size of the section will be the size of the file. This option only
- works on file formats which can support sections with arbitrary
- names.
-
-`--rename-section OLDNAME=NEWNAME[,FLAGS]'
- Rename a section from OLDNAME to NEWNAME, optionally changing the
- section's flags to FLAGS in the process. This has the advantage
- over usng a linker script to perform the rename in that the output
- stays as an object file and does not become a linked executable.
-
- This option is particularly helpful when the input format is
- binary, since this will always create a section called .data. If
- for example, you wanted instead to create a section called .rodata
- containing binary data you could use the following command line to
- achieve it:
-
- objcopy -I binary -O -B \
- --rename-section .data=.rodata,alloc,load,readonly,data,contents \
-
-
-`--long-section-names {enable,disable,keep}'
- Controls the handling of long section names when processing `COFF'
- and `PE-COFF' object formats. The default behaviour, `keep', is
- to preserve long section names if any are present in the input
- file. The `enable' and `disable' options forcibly enable or
- disable the use of long section names in the output object; when
- `disable' is in effect, any long section names in the input object
- will be truncated. The `enable' option will only emit long
- section names if any are present in the inputs; this is mostly the
- same as `keep', but it is left undefined whether the `enable'
- option might force the creation of an empty string table in the
- output file.
-
-`--change-leading-char'
- Some object file formats use special characters at the start of
- symbols. The most common such character is underscore, which
- compilers often add before every symbol. This option tells
- `objcopy' to change the leading character of every symbol when it
- converts between object file formats. If the object file formats
- use the same leading character, this option has no effect.
- Otherwise, it will add a character, or remove a character, or
- change a character, as appropriate.
-
-`--remove-leading-char'
- If the first character of a global symbol is a special symbol
- leading character used by the object file format, remove the
- character. The most common symbol leading character is
- underscore. This option will remove a leading underscore from all
- global symbols. This can be useful if you want to link together
- objects of different file formats with different conventions for
- symbol names. This is different from `--change-leading-char'
- because it always changes the symbol name when appropriate,
- regardless of the object file format of the output file.
-
-`--reverse-bytes=NUM'
- Reverse the bytes in a section with output contents. A section
- length must be evenly divisible by the value given in order for
- the swap to be able to take place. Reversing takes place before
- the interleaving is performed.
-
- This option is used typically in generating ROM images for
- problematic target systems. For example, on some target boards,
- the 32-bit words fetched from 8-bit ROMs are re-assembled in
- little-endian byte order regardless of the CPU byte order.
- Depending on the programming model, the endianness of the ROM may
- need to be modified.
-
- Consider a simple file with a section containing the following
- eight bytes: `12345678'.
-
- Using `--reverse-bytes=2' for the above example, the bytes in the
- output file would be ordered `21436587'.
-
- Using `--reverse-bytes=4' for the above example, the bytes in the
- output file would be ordered `43218765'.
-
- By using `--reverse-bytes=2' for the above example, followed by
- `--reverse-bytes=4' on the output file, the bytes in the second
- output file would be ordered `34127856'.
-
-`--srec-len=IVAL'
- Meaningful only for srec output. Set the maximum length of the
- Srecords being produced to IVAL. This length covers both address,
- data and crc fields.
-
-`--srec-forceS3'
- Meaningful only for srec output. Avoid generation of S1/S2
- records, creating S3-only record format.
-
-`--redefine-sym OLD=NEW'
- Change the name of a symbol OLD, to NEW. This can be useful when
- one is trying link two things together for which you have no
- source, and there are name collisions.
-
-`--redefine-syms=FILENAME'
- Apply `--redefine-sym' to each symbol pair "OLD NEW" listed in the
- file FILENAME. FILENAME is simply a flat file, with one symbol
- pair per line. Line comments may be introduced by the hash
- character. This option may be given more than once.
-
-`--weaken'
- Change all global symbols in the file to be weak. This can be
- useful when building an object which will be linked against other
- objects using the `-R' option to the linker. This option is only
- effective when using an object file format which supports weak
- symbols.
-
-`--keep-symbols=FILENAME'
- Apply `--keep-symbol' option to each symbol listed in the file
- FILENAME. FILENAME is simply a flat file, with one symbol name
- per line. Line comments may be introduced by the hash character.
- This option may be given more than once.
-
-`--strip-symbols=FILENAME'
- Apply `--strip-symbol' option to each symbol listed in the file
- FILENAME. FILENAME is simply a flat file, with one symbol name
- per line. Line comments may be introduced by the hash character.
- This option may be given more than once.
-
-`--strip-unneeded-symbols=FILENAME'
- Apply `--strip-unneeded-symbol' option to each symbol listed in
- the file FILENAME. FILENAME is simply a flat file, with one
- symbol name per line. Line comments may be introduced by the hash
- character. This option may be given more than once.
-
-`--keep-global-symbols=FILENAME'
- Apply `--keep-global-symbol' option to each symbol listed in the
- file FILENAME. FILENAME is simply a flat file, with one symbol
- name per line. Line comments may be introduced by the hash
- character. This option may be given more than once.
-
-`--localize-symbols=FILENAME'
- Apply `--localize-symbol' option to each symbol listed in the file
- FILENAME. FILENAME is simply a flat file, with one symbol name
- per line. Line comments may be introduced by the hash character.
- This option may be given more than once.
-
-`--globalize-symbols=FILENAME'
- Apply `--globalize-symbol' option to each symbol listed in the file
- FILENAME. FILENAME is simply a flat file, with one symbol name
- per line. Line comments may be introduced by the hash character.
- This option may be given more than once.
-
-`--weaken-symbols=FILENAME'
- Apply `--weaken-symbol' option to each symbol listed in the file
- FILENAME. FILENAME is simply a flat file, with one symbol name
- per line. Line comments may be introduced by the hash character.
- This option may be given more than once.
-
-`--alt-machine-code=INDEX'
- If the output architecture has alternate machine codes, use the
- INDEXth code instead of the default one. This is useful in case a
- machine is assigned an official code and the tool-chain adopts the
- new code, but other applications still depend on the original code
- being used. For ELF based architectures if the INDEX alternative
- does not exist then the value is treated as an absolute number to
- be stored in the e_machine field of the ELF header.
-
-`--writable-text'
- Mark the output text as writable. This option isn't meaningful
- for all object file formats.
-
-`--readonly-text'
- Make the output text write protected. This option isn't
- meaningful for all object file formats.
-
-`--pure'
- Mark the output file as demand paged. This option isn't
- meaningful for all object file formats.
-
-`--impure'
- Mark the output file as impure. This option isn't meaningful for
- all object file formats.
-
-`--prefix-symbols=STRING'
- Prefix all symbols in the output file with STRING.
-
-`--prefix-sections=STRING'
- Prefix all section names in the output file with STRING.
-
-`--prefix-alloc-sections=STRING'
- Prefix all the names of all allocated sections in the output file
- with STRING.
-
-`--add-gnu-debuglink=PATH-TO-FILE'
- Creates a .gnu_debuglink section which contains a reference to
- PATH-TO-FILE and adds it to the output file.
-
-`--keep-file-symbols'
- When stripping a file, perhaps with `--strip-debug' or
- `--strip-unneeded', retain any symbols specifying source file
- names, which would otherwise get stripped.
-
-`--only-keep-debug'
- Strip a file, removing contents of any sections that would not be
- stripped by `--strip-debug' and leaving the debugging sections
- intact. In ELF files, this preserves all note sections in the
- output.
-
- The intention is that this option will be used in conjunction with
- `--add-gnu-debuglink' to create a two part executable. One a
- stripped binary which will occupy less space in RAM and in a
- distribution and the second a debugging information file which is
- only needed if debugging abilities are required. The suggested
- procedure to create these files is as follows:
-
- 1. Link the executable as normal. Assuming that is is called
- `foo' then...
-
- 2. Run `objcopy --only-keep-debug foo foo.dbg' to create a file
- containing the debugging info.
-
- 3. Run `objcopy --strip-debug foo' to create a stripped
- executable.
-
- 4. Run `objcopy --add-gnu-debuglink=foo.dbg foo' to add a link
- to the debugging info into the stripped executable.
-
- Note--the choice of `.dbg' as an extension for the debug info file
- is arbitrary. Also the `--only-keep-debug' step is optional. You
- could instead do this:
-
- 1. Link the executable as normal.
-
- 2. Copy `foo' to `foo.full'
-
- 3. Run `objcopy --strip-debug foo'
-
- 4. Run `objcopy --add-gnu-debuglink=foo.full foo'
-
- i.e., the file pointed to by the `--add-gnu-debuglink' can be the
- full executable. It does not have to be a file created by the
- `--only-keep-debug' switch.
-
- Note--this switch is only intended for use on fully linked files.
- It does not make sense to use it on object files where the
- debugging information may be incomplete. Besides the
- gnu_debuglink feature currently only supports the presence of one
- filename containing debugging information, not multiple filenames
- on a one-per-object-file basis.
-
-`--strip-dwo'
- Remove the contents of all DWARF .dwo sections, leaving the
- remaining debugging sections and all symbols intact. This option
- is intended for use by the compiler as part of the `-gsplit-dwarf'
- option, which splits debug information between the .o file and a
- separate .dwo file. The compiler generates all debug information
- in the same file, then uses the `--extract-dwo' option to copy the
- .dwo sections to the .dwo file, then the `--strip-dwo' option to
- remove those sections from the original .o file.
-
-`--extract-dwo'
- Extract the contents of all DWARF .dwo sections. See the
- `--strip-dwo' option for more information.
-
-`--file-alignment NUM'
- Specify the file alignment. Sections in the file will always
- begin at file offsets which are multiples of this number. This
- defaults to 512. [This option is specific to PE targets.]
-
-`--heap RESERVE'
-`--heap RESERVE,COMMIT'
- Specify the number of bytes of memory to reserve (and optionally
- commit) to be used as heap for this program. [This option is
- specific to PE targets.]
-
-`--image-base VALUE'
- Use VALUE as the base address of your program or dll. This is the
- lowest memory location that will be used when your program or dll
- is loaded. To reduce the need to relocate and improve performance
- of your dlls, each should have a unique base address and not
- overlap any other dlls. The default is 0x400000 for executables,
- and 0x10000000 for dlls. [This option is specific to PE targets.]
-
-`--section-alignment NUM'
- Sets the section alignment. Sections in memory will always begin
- at addresses which are a multiple of this number. Defaults to
- 0x1000. [This option is specific to PE targets.]
-
-`--stack RESERVE'
-`--stack RESERVE,COMMIT'
- Specify the number of bytes of memory to reserve (and optionally
- commit) to be used as stack for this program. [This option is
- specific to PE targets.]
-
-`--subsystem WHICH'
-`--subsystem WHICH:MAJOR'
-`--subsystem WHICH:MAJOR.MINOR'
- Specifies the subsystem under which your program will execute. The
- legal values for WHICH are `native', `windows', `console',
- `posix', `efi-app', `efi-bsd', `efi-rtd', `sal-rtd', and `xbox'.
- You may optionally set the subsystem version also. Numeric values
- are also accepted for WHICH. [This option is specific to PE
- targets.]
-
-`--extract-symbol'
- Keep the file's section flags and symbols but remove all section
- data. Specifically, the option:
-
- * removes the contents of all sections;
-
- * sets the size of every section to zero; and
-
- * sets the file's start address to zero.
-
- This option is used to build a `.sym' file for a VxWorks kernel.
- It can also be a useful way of reducing the size of a
- `--just-symbols' linker input file.
-
-`--compress-debug-sections'
- Compress DWARF debug sections using zlib.
-
-`--decompress-debug-sections'
- Decompress DWARF debug sections using zlib.
-
-`-V'
-`--version'
- Show the version number of `objcopy'.
-
-`-v'
-`--verbose'
- Verbose output: list all object files modified. In the case of
- archives, `objcopy -V' lists all members of the archive.
-
-`--help'
- Show a summary of the options to `objcopy'.
-
-`--info'
- Display a list showing all architectures and object formats
- available.
-
-
-File: binutils.info, Node: objdump, Next: ranlib, Prev: objcopy, Up: Top
-
-4 objdump
-*********
-
- objdump [`-a'|`--archive-headers']
- [`-b' BFDNAME|`--target=BFDNAME']
- [`-C'|`--demangle'[=STYLE] ]
- [`-d'|`--disassemble']
- [`-D'|`--disassemble-all']
- [`-z'|`--disassemble-zeroes']
- [`-EB'|`-EL'|`--endian='{big | little }]
- [`-f'|`--file-headers']
- [`-F'|`--file-offsets']
- [`--file-start-context']
- [`-g'|`--debugging']
- [`-e'|`--debugging-tags']
- [`-h'|`--section-headers'|`--headers']
- [`-i'|`--info']
- [`-j' SECTION|`--section='SECTION]
- [`-l'|`--line-numbers']
- [`-S'|`--source']
- [`-m' MACHINE|`--architecture='MACHINE]
- [`-M' OPTIONS|`--disassembler-options='OPTIONS]
- [`-p'|`--private-headers']
- [`-P' OPTIONS|`--private='OPTIONS]
- [`-r'|`--reloc']
- [`-R'|`--dynamic-reloc']
- [`-s'|`--full-contents']
- [`-W[lLiaprmfFsoRt]'|
- `--dwarf'[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges,=pubtypes,=trace_info,=trace_abbrev,=trace_aranges,=gdb_index]]
- [`-G'|`--stabs']
- [`-t'|`--syms']
- [`-T'|`--dynamic-syms']
- [`-x'|`--all-headers']
- [`-w'|`--wide']
- [`--start-address='ADDRESS]
- [`--stop-address='ADDRESS]
- [`--prefix-addresses']
- [`--[no-]show-raw-insn']
- [`--adjust-vma='OFFSET]
- [`--special-syms']
- [`--prefix='PREFIX]
- [`--prefix-strip='LEVEL]
- [`--insn-width='WIDTH]
- [`-V'|`--version']
- [`-H'|`--help']
- OBJFILE...
-
- `objdump' displays information about one or more object files. The
-options control what particular information to display. This
-information is mostly useful to programmers who are working on the
-compilation tools, as opposed to programmers who just want their
-program to compile and work.
-
- OBJFILE... are the object files to be examined. When you specify
-archives, `objdump' shows information on each of the member object
-files.
-
- The long and short forms of options, shown here as alternatives, are
-equivalent. At least one option from the list
-`-a,-d,-D,-e,-f,-g,-G,-h,-H,-p,-P,-r,-R,-s,-S,-t,-T,-V,-x' must be
-given.
-
-`-a'
-`--archive-header'
- If any of the OBJFILE files are archives, display the archive
- header information (in a format similar to `ls -l'). Besides the
- information you could list with `ar tv', `objdump -a' shows the
- object file format of each archive member.
-
-`--adjust-vma=OFFSET'
- When dumping information, first add OFFSET to all the section
- addresses. This is useful if the section addresses do not
- correspond to the symbol table, which can happen when putting
- sections at particular addresses when using a format which can not
- represent section addresses, such as a.out.
-
-`-b BFDNAME'
-`--target=BFDNAME'
- Specify that the object-code format for the object files is
- BFDNAME. This option may not be necessary; OBJDUMP can
- automatically recognize many formats.
-
- For example,
- objdump -b oasys -m vax -h fu.o
- displays summary information from the section headers (`-h') of
- `fu.o', which is explicitly identified (`-m') as a VAX object file
- in the format produced by Oasys compilers. You can list the
- formats available with the `-i' option. *Note Target Selection::,
- for more information.
-
-`-C'
-`--demangle[=STYLE]'
- Decode ("demangle") low-level symbol names into user-level names.
- Besides removing any initial underscore prepended by the system,
- this makes C++ function names readable. Different compilers have
- different mangling styles. The optional demangling style argument
- can be used to choose an appropriate demangling style for your
- compiler. *Note c++filt::, for more information on demangling.
-
-`-g'
-`--debugging'
- Display debugging information. This attempts to parse STABS and
- IEEE debugging format information stored in the file and print it
- out using a C like syntax. If neither of these formats are found
- this option falls back on the `-W' option to print any DWARF
- information in the file.
-
-`-e'
-`--debugging-tags'
- Like `-g', but the information is generated in a format compatible
- with ctags tool.
-
-`-d'
-`--disassemble'
- Display the assembler mnemonics for the machine instructions from
- OBJFILE. This option only disassembles those sections which are
- expected to contain instructions.
-
-`-D'
-`--disassemble-all'
- Like `-d', but disassemble the contents of all sections, not just
- those expected to contain instructions.
-
- If the target is an ARM architecture this switch also has the
- effect of forcing the disassembler to decode pieces of data found
- in code sections as if they were instructions.
-
-`--prefix-addresses'
- When disassembling, print the complete address on each line. This
- is the older disassembly format.
-
-`-EB'
-`-EL'
-`--endian={big|little}'
- Specify the endianness of the object files. This only affects
- disassembly. This can be useful when disassembling a file format
- which does not describe endianness information, such as S-records.
-
-`-f'
-`--file-headers'
- Display summary information from the overall header of each of the
- OBJFILE files.
-
-`-F'
-`--file-offsets'
- When disassembling sections, whenever a symbol is displayed, also
- display the file offset of the region of data that is about to be
- dumped. If zeroes are being skipped, then when disassembly
- resumes, tell the user how many zeroes were skipped and the file
- offset of the location from where the disassembly resumes. When
- dumping sections, display the file offset of the location from
- where the dump starts.
-
-`--file-start-context'
- Specify that when displaying interlisted source code/disassembly
- (assumes `-S') from a file that has not yet been displayed, extend
- the context to the start of the file.
-
-`-h'
-`--section-headers'
-`--headers'
- Display summary information from the section headers of the object
- file.
-
- File segments may be relocated to nonstandard addresses, for
- example by using the `-Ttext', `-Tdata', or `-Tbss' options to
- `ld'. However, some object file formats, such as a.out, do not
- store the starting address of the file segments. In those
- situations, although `ld' relocates the sections correctly, using
- `objdump -h' to list the file section headers cannot show the
- correct addresses. Instead, it shows the usual addresses, which
- are implicit for the target.
-
-`-H'
-`--help'
- Print a summary of the options to `objdump' and exit.
-
-`-i'
-`--info'
- Display a list showing all architectures and object formats
- available for specification with `-b' or `-m'.
-
-`-j NAME'
-`--section=NAME'
- Display information only for section NAME.
-
-`-l'
-`--line-numbers'
- Label the display (using debugging information) with the filename
- and source line numbers corresponding to the object code or relocs
- shown. Only useful with `-d', `-D', or `-r'.
-
-`-m MACHINE'
-`--architecture=MACHINE'
- Specify the architecture to use when disassembling object files.
- This can be useful when disassembling object files which do not
- describe architecture information, such as S-records. You can
- list the available architectures with the `-i' option.
-
- If the target is an ARM architecture then this switch has an
- additional effect. It restricts the disassembly to only those
- instructions supported by the architecture specified by MACHINE.
- If it is necessary to use this switch because the input file does
- not contain any architecture information, but it is also desired to
- disassemble all the instructions use `-marm'.
-
-`-M OPTIONS'
-`--disassembler-options=OPTIONS'
- Pass target specific information to the disassembler. Only
- supported on some targets. If it is necessary to specify more
- than one disassembler option then multiple `-M' options can be
- used or can be placed together into a comma separated list.
-
- If the target is an ARM architecture then this switch can be used
- to select which register name set is used during disassembler.
- Specifying `-M reg-names-std' (the default) will select the
- register names as used in ARM's instruction set documentation, but
- with register 13 called 'sp', register 14 called 'lr' and register
- 15 called 'pc'. Specifying `-M reg-names-apcs' will select the
- name set used by the ARM Procedure Call Standard, whilst
- specifying `-M reg-names-raw' will just use `r' followed by the
- register number.
-
- There are also two variants on the APCS register naming scheme
- enabled by `-M reg-names-atpcs' and `-M reg-names-special-atpcs'
- which use the ARM/Thumb Procedure Call Standard naming
- conventions. (Either with the normal register names or the
- special register names).
-
- This option can also be used for ARM architectures to force the
- disassembler to interpret all instructions as Thumb instructions by
- using the switch `--disassembler-options=force-thumb'. This can be
- useful when attempting to disassemble thumb code produced by other
- compilers.
-
- For the x86, some of the options duplicate functions of the `-m'
- switch, but allow finer grained control. Multiple selections from
- the following may be specified as a comma separated string.
- `x86-64', `i386' and `i8086' select disassembly for the given
- architecture. `intel' and `att' select between intel syntax mode
- and AT&T syntax mode. `intel-mnemonic' and `att-mnemonic' select
- between intel mnemonic mode and AT&T mnemonic mode.
- `intel-mnemonic' implies `intel' and `att-mnemonic' implies `att'.
- `addr64', `addr32', `addr16', `data32' and `data16' specify the
- default address size and operand size. These four options will be
- overridden if `x86-64', `i386' or `i8086' appear later in the
- option string. Lastly, `suffix', when in AT&T mode, instructs the
- disassembler to print a mnemonic suffix even when the suffix could
- be inferred by the operands.
-
- For PowerPC, `booke' controls the disassembly of BookE
- instructions. `32' and `64' select PowerPC and PowerPC64
- disassembly, respectively. `e300' selects disassembly for the
- e300 family. `440' selects disassembly for the PowerPC 440.
- `ppcps' selects disassembly for the paired single instructions of
- the PPC750CL.
-
- For MIPS, this option controls the printing of instruction mnemonic
- names and register names in disassembled instructions. Multiple
- selections from the following may be specified as a comma separated
- string, and invalid options are ignored:
-
- `no-aliases'
- Print the 'raw' instruction mnemonic instead of some pseudo
- instruction mnemonic. I.e., print 'daddu' or 'or' instead of
- 'move', 'sll' instead of 'nop', etc.
-
- `virt'
- Disassemble the virtualization ASE instructions.
-
- `gpr-names=ABI'
- Print GPR (general-purpose register) names as appropriate for
- the specified ABI. By default, GPR names are selected
- according to the ABI of the binary being disassembled.
-
- `fpr-names=ABI'
- Print FPR (floating-point register) names as appropriate for
- the specified ABI. By default, FPR numbers are printed
- rather than names.
-
- `cp0-names=ARCH'
- Print CP0 (system control coprocessor; coprocessor 0)
- register names as appropriate for the CPU or architecture
- specified by ARCH. By default, CP0 register names are
- selected according to the architecture and CPU of the binary
- being disassembled.
-
- `hwr-names=ARCH'
- Print HWR (hardware register, used by the `rdhwr'
- instruction) names as appropriate for the CPU or architecture
- specified by ARCH. By default, HWR names are selected
- according to the architecture and CPU of the binary being
- disassembled.
-
- `reg-names=ABI'
- Print GPR and FPR names as appropriate for the selected ABI.
-
- `reg-names=ARCH'
- Print CPU-specific register names (CP0 register and HWR names)
- as appropriate for the selected CPU or architecture.
-
- For any of the options listed above, ABI or ARCH may be specified
- as `numeric' to have numbers printed rather than names, for the
- selected types of registers. You can list the available values of
- ABI and ARCH using the `--help' option.
-
- For VAX, you can specify function entry addresses with `-M
- entry:0xf00ba'. You can use this multiple times to properly
- disassemble VAX binary files that don't contain symbol tables (like
- ROM dumps). In these cases, the function entry mask would
- otherwise be decoded as VAX instructions, which would probably
- lead the rest of the function being wrongly disassembled.
-
-`-p'
-`--private-headers'
- Print information that is specific to the object file format. The
- exact information printed depends upon the object file format.
- For some object file formats, no additional information is printed.
-
-`-P OPTIONS'
-`--private=OPTIONS'
- Print information that is specific to the object file format. The
- argument OPTIONS is a comma separated list that depends on the
- format (the lists of options is displayed with the help).
-
- For XCOFF, the available options are: `header', `aout',
- `sections', `syms', `relocs', `lineno', `loader', `except',
- `typchk', `traceback', `toc' and `ldinfo'.
-
-`-r'
-`--reloc'
- Print the relocation entries of the file. If used with `-d' or
- `-D', the relocations are printed interspersed with the
- disassembly.
-
-`-R'
-`--dynamic-reloc'
- Print the dynamic relocation entries of the file. This is only
- meaningful for dynamic objects, such as certain types of shared
- libraries. As for `-r', if used with `-d' or `-D', the
- relocations are printed interspersed with the disassembly.
-
-`-s'
-`--full-contents'
- Display the full contents of any sections requested. By default
- all non-empty sections are displayed.
-
-`-S'
-`--source'
- Display source code intermixed with disassembly, if possible.
- Implies `-d'.
-
-`--prefix=PREFIX'
- Specify PREFIX to add to the absolute paths when used with `-S'.
-
-`--prefix-strip=LEVEL'
- Indicate how many initial directory names to strip off the
- hardwired absolute paths. It has no effect without
- `--prefix='PREFIX.
-
-`--show-raw-insn'
- When disassembling instructions, print the instruction in hex as
- well as in symbolic form. This is the default except when
- `--prefix-addresses' is used.
-
-`--no-show-raw-insn'
- When disassembling instructions, do not print the instruction
- bytes. This is the default when `--prefix-addresses' is used.
-
-`--insn-width=WIDTH'
- Display WIDTH bytes on a single line when disassembling
- instructions.
-
-`-W[lLiaprmfFsoRt]'
-`--dwarf[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges,=pubtypes,=trace_info,=trace_abbrev,=trace_aranges,=gdb_index]'
- Displays the contents of the debug sections in the file, if any are
- present. If one of the optional letters or words follows the
- switch then only data found in those specific sections will be
- dumped.
-
- Note that there is no single letter option to display the content
- of trace sections or .gdb_index.
-
- Note: the output from the `=info' option can also be affected by
- the options `--dwarf-depth', the `--dwarf-start' and the
- `--dwarf-check'.
-
-`--dwarf-depth=N'
- Limit the dump of the `.debug_info' section to N children. This
- is only useful with `--dwarf=info'. The default is to print all
- DIEs; the special value 0 for N will also have this effect.
-
- With a non-zero value for N, DIEs at or deeper than N levels will
- not be printed. The range for N is zero-based.
-
-`--dwarf-start=N'
- Print only DIEs beginning with the DIE numbered N. This is only
- useful with `--dwarf=info'.
-
- If specified, this option will suppress printing of any header
- information and all DIEs before the DIE numbered N. Only siblings
- and children of the specified DIE will be printed.
-
- This can be used in conjunction with `--dwarf-depth'.
-
-`--dwarf-check'
- Enable additional checks for consistency of Dwarf information.
-
-`-G'
-`--stabs'
- Display the full contents of any sections requested. Display the
- contents of the .stab and .stab.index and .stab.excl sections from
- an ELF file. This is only useful on systems (such as Solaris 2.0)
- in which `.stab' debugging symbol-table entries are carried in an
- ELF section. In most other file formats, debugging symbol-table
- entries are interleaved with linkage symbols, and are visible in
- the `--syms' output.
-
-`--start-address=ADDRESS'
- Start displaying data at the specified address. This affects the
- output of the `-d', `-r' and `-s' options.
-
-`--stop-address=ADDRESS'
- Stop displaying data at the specified address. This affects the
- output of the `-d', `-r' and `-s' options.
-
-`-t'
-`--syms'
- Print the symbol table entries of the file. This is similar to
- the information provided by the `nm' program, although the display
- format is different. The format of the output depends upon the
- format of the file being dumped, but there are two main types.
- One looks like this:
-
- [ 4](sec 3)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x00000000 .bss
- [ 6](sec 1)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000000 fred
-
- where the number inside the square brackets is the number of the
- entry in the symbol table, the SEC number is the section number,
- the FL value are the symbol's flag bits, the TY number is the
- symbol's type, the SCL number is the symbol's storage class and
- the NX value is the number of auxilary entries associated with the
- symbol. The last two fields are the symbol's value and its name.
-
- The other common output format, usually seen with ELF based files,
- looks like this:
-
- 00000000 l d .bss 00000000 .bss
- 00000000 g .text 00000000 fred
-
- Here the first number is the symbol's value (sometimes refered to
- as its address). The next field is actually a set of characters
- and spaces indicating the flag bits that are set on the symbol.
- These characters are described below. Next is the section with
- which the symbol is associated or _*ABS*_ if the section is
- absolute (ie not connected with any section), or _*UND*_ if the
- section is referenced in the file being dumped, but not defined
- there.
-
- After the section name comes another field, a number, which for
- common symbols is the alignment and for other symbol is the size.
- Finally the symbol's name is displayed.
-
- The flag characters are divided into 7 groups as follows:
- `l'
- `g'
- `u'
- `!'
- The symbol is a local (l), global (g), unique global (u),
- neither global nor local (a space) or both global and local
- (!). A symbol can be neither local or global for a variety
- of reasons, e.g., because it is used for debugging, but it is
- probably an indication of a bug if it is ever both local and
- global. Unique global symbols are a GNU extension to the
- standard set of ELF symbol bindings. For such a symbol the
- dynamic linker will make sure that in the entire process
- there is just one symbol with this name and type in use.
-
- `w'
- The symbol is weak (w) or strong (a space).
-
- `C'
- The symbol denotes a constructor (C) or an ordinary symbol (a
- space).
-
- `W'
- The symbol is a warning (W) or a normal symbol (a space). A
- warning symbol's name is a message to be displayed if the
- symbol following the warning symbol is ever referenced.
-
- `I'
-
- `i'
- The symbol is an indirect reference to another symbol (I), a
- function to be evaluated during reloc processing (i) or a
- normal symbol (a space).
-
- `d'
- `D'
- The symbol is a debugging symbol (d) or a dynamic symbol (D)
- or a normal symbol (a space).
-
- `F'
-
- `f'
-
- `O'
- The symbol is the name of a function (F) or a file (f) or an
- object (O) or just a normal symbol (a space).
-
-`-T'
-`--dynamic-syms'
- Print the dynamic symbol table entries of the file. This is only
- meaningful for dynamic objects, such as certain types of shared
- libraries. This is similar to the information provided by the `nm'
- program when given the `-D' (`--dynamic') option.
-
-`--special-syms'
- When displaying symbols include those which the target considers
- to be special in some way and which would not normally be of
- interest to the user.
-
-`-V'
-`--version'
- Print the version number of `objdump' and exit.
-
-`-x'
-`--all-headers'
- Display all available header information, including the symbol
- table and relocation entries. Using `-x' is equivalent to
- specifying all of `-a -f -h -p -r -t'.
-
-`-w'
-`--wide'
- Format some lines for output devices that have more than 80
- columns. Also do not truncate symbol names when they are
- displayed.
-
-`-z'
-`--disassemble-zeroes'
- Normally the disassembly output will skip blocks of zeroes. This
- option directs the disassembler to disassemble those blocks, just
- like any other data.
-
-
-File: binutils.info, Node: ranlib, Next: size, Prev: objdump, Up: Top
-
-5 ranlib
-********
-
- ranlib [`--plugin' NAME] [`-DhHvVt'] ARCHIVE
-
- `ranlib' generates an index to the contents of an archive and stores
-it in the archive. The index lists each symbol defined by a member of
-an archive that is a relocatable object file.
-
- You may use `nm -s' or `nm --print-armap' to list this index.
-
- An archive with such an index speeds up linking to the library and
-allows routines in the library to call each other without regard to
-their placement in the archive.
-
- The GNU `ranlib' program is another form of GNU `ar'; running
-`ranlib' is completely equivalent to executing `ar -s'. *Note ar::.
-
-`-h'
-`-H'
-`--help'
- Show usage information for `ranlib'.
-
-`-v'
-`-V'
-`--version'
- Show the version number of `ranlib'.
-
-`-D'
- Operate in _deterministic_ mode. The symbol map archive member's
- header will show zero for the UID, GID, and timestamp. When this
- option is used, multiple runs will produce identical output files.
-
- If `binutils' was configured with
- `--enable-deterministic-archives', then this mode is on by
- default. It can be disabled with the `-U' option, described below.
-
-`-t'
- Update the timestamp of the symbol map of an archive.
-
-`-U'
- Do _not_ operate in _deterministic_ mode. This is the inverse of
- the `-D' option, above: the archive index will get actual UID,
- GID, timestamp, and file mode values.
-
- If `binutils' was configured _without_
- `--enable-deterministic-archives', then this mode is on by default.
-
-
-
-File: binutils.info, Node: size, Next: strings, Prev: ranlib, Up: Top
-
-6 size
-******
-
- size [`-A'|`-B'|`--format='COMPATIBILITY]
- [`--help']
- [`-d'|`-o'|`-x'|`--radix='NUMBER]
- [`--common']
- [`-t'|`--totals']
- [`--target='BFDNAME] [`-V'|`--version']
- [OBJFILE...]
-
- The GNU `size' utility lists the section sizes--and the total
-size--for each of the object or archive files OBJFILE in its argument
-list. By default, one line of output is generated for each object file
-or each module in an archive.
-
- OBJFILE... are the object files to be examined. If none are
-specified, the file `a.out' will be used.
-
- The command line options have the following meanings:
-
-`-A'
-`-B'
-`--format=COMPATIBILITY'
- Using one of these options, you can choose whether the output from
- GNU `size' resembles output from System V `size' (using `-A', or
- `--format=sysv'), or Berkeley `size' (using `-B', or
- `--format=berkeley'). The default is the one-line format similar
- to Berkeley's.
-
- Here is an example of the Berkeley (default) format of output from
- `size':
- $ size --format=Berkeley ranlib size
- text data bss dec hex filename
- 294880 81920 11592 388392 5ed28 ranlib
- 294880 81920 11888 388688 5ee50 size
-
- This is the same data, but displayed closer to System V
- conventions:
-
- $ size --format=SysV ranlib size
- ranlib :
- section size addr
- .text 294880 8192
- .data 81920 303104
- .bss 11592 385024
- Total 388392
-
-
- size :
- section size addr
- .text 294880 8192
- .data 81920 303104
- .bss 11888 385024
- Total 388688
-
-`--help'
- Show a summary of acceptable arguments and options.
-
-`-d'
-`-o'
-`-x'
-`--radix=NUMBER'
- Using one of these options, you can control whether the size of
- each section is given in decimal (`-d', or `--radix=10'); octal
- (`-o', or `--radix=8'); or hexadecimal (`-x', or `--radix=16').
- In `--radix=NUMBER', only the three values (8, 10, 16) are
- supported. The total size is always given in two radices; decimal
- and hexadecimal for `-d' or `-x' output, or octal and hexadecimal
- if you're using `-o'.
-
-`--common'
- Print total size of common symbols in each file. When using
- Berkeley format these are included in the bss size.
-
-`-t'
-`--totals'
- Show totals of all objects listed (Berkeley format listing mode
- only).
-
-`--target=BFDNAME'
- Specify that the object-code format for OBJFILE is BFDNAME. This
- option may not be necessary; `size' can automatically recognize
- many formats. *Note Target Selection::, for more information.
-
-`-V'
-`--version'
- Display the version number of `size'.
-
-
-File: binutils.info, Node: strings, Next: strip, Prev: size, Up: Top
-
-7 strings
-*********
-
- strings [`-afovV'] [`-'MIN-LEN]
- [`-n' MIN-LEN] [`--bytes='MIN-LEN]
- [`-t' RADIX] [`--radix='RADIX]
- [`-e' ENCODING] [`--encoding='ENCODING]
- [`-'] [`--all'] [`--print-file-name']
- [`-T' BFDNAME] [`--target='BFDNAME]
- [`--help'] [`--version'] FILE...
-
- For each FILE given, GNU `strings' prints the printable character
-sequences that are at least 4 characters long (or the number given with
-the options below) and are followed by an unprintable character. By
-default, it only prints the strings from the initialized and loaded
-sections of object files; for other types of files, it prints the
-strings from the whole file.
-
- `strings' is mainly useful for determining the contents of non-text
-files.
-
-`-a'
-`--all'
-`-'
- Do not scan only the initialized and loaded sections of object
- files; scan the whole files.
-
-`-f'
-`--print-file-name'
- Print the name of the file before each string.
-
-`--help'
- Print a summary of the program usage on the standard output and
- exit.
-
-`-MIN-LEN'
-`-n MIN-LEN'
-`--bytes=MIN-LEN'
- Print sequences of characters that are at least MIN-LEN characters
- long, instead of the default 4.
-
-`-o'
- Like `-t o'. Some other versions of `strings' have `-o' act like
- `-t d' instead. Since we can not be compatible with both ways, we
- simply chose one.
-
-`-t RADIX'
-`--radix=RADIX'
- Print the offset within the file before each string. The single
- character argument specifies the radix of the offset--`o' for
- octal, `x' for hexadecimal, or `d' for decimal.
-
-`-e ENCODING'
-`--encoding=ENCODING'
- Select the character encoding of the strings that are to be found.
- Possible values for ENCODING are: `s' = single-7-bit-byte
- characters (ASCII, ISO 8859, etc., default), `S' =
- single-8-bit-byte characters, `b' = 16-bit bigendian, `l' = 16-bit
- littleendian, `B' = 32-bit bigendian, `L' = 32-bit littleendian.
- Useful for finding wide character strings. (`l' and `b' apply to,
- for example, Unicode UTF-16/UCS-2 encodings).
-
-`-T BFDNAME'
-`--target=BFDNAME'
- Specify an object code format other than your system's default
- format. *Note Target Selection::, for more information.
-
-`-v'
-`-V'
-`--version'
- Print the program version number on the standard output and exit.
-
-
-File: binutils.info, Node: strip, Next: c++filt, Prev: strings, Up: Top
-
-8 strip
-*******
-
- strip [`-F' BFDNAME |`--target='BFDNAME]
- [`-I' BFDNAME |`--input-target='BFDNAME]
- [`-O' BFDNAME |`--output-target='BFDNAME]
- [`-s'|`--strip-all']
- [`-S'|`-g'|`-d'|`--strip-debug']
- [`--strip-dwo']
- [`-K' SYMBOLNAME |`--keep-symbol='SYMBOLNAME]
- [`-N' SYMBOLNAME |`--strip-symbol='SYMBOLNAME]
- [`-w'|`--wildcard']
- [`-x'|`--discard-all'] [`-X' |`--discard-locals']
- [`-R' SECTIONNAME |`--remove-section='SECTIONNAME]
- [`-o' FILE] [`-p'|`--preserve-dates']
- [`-D'|`--enable-deterministic-archives']
- [`-U'|`--disable-deterministic-archives']
- [`--keep-file-symbols']
- [`--only-keep-debug']
- [`-v' |`--verbose'] [`-V'|`--version']
- [`--help'] [`--info']
- OBJFILE...
-
- GNU `strip' discards all symbols from object files OBJFILE. The
-list of object files may include archives. At least one object file
-must be given.
-
- `strip' modifies the files named in its argument, rather than
-writing modified copies under different names.
-
-`-F BFDNAME'
-`--target=BFDNAME'
- Treat the original OBJFILE as a file with the object code format
- BFDNAME, and rewrite it in the same format. *Note Target
- Selection::, for more information.
-
-`--help'
- Show a summary of the options to `strip' and exit.
-
-`--info'
- Display a list showing all architectures and object formats
- available.
-
-`-I BFDNAME'
-`--input-target=BFDNAME'
- Treat the original OBJFILE as a file with the object code format
- BFDNAME. *Note Target Selection::, for more information.
-
-`-O BFDNAME'
-`--output-target=BFDNAME'
- Replace OBJFILE with a file in the output format BFDNAME. *Note
- Target Selection::, for more information.
-
-`-R SECTIONNAME'
-`--remove-section=SECTIONNAME'
- Remove any section named SECTIONNAME from the output file. This
- option may be given more than once. Note that using this option
- inappropriately may make the output file unusable. The wildcard
- character `*' may be given at the end of SECTIONNAME. If so, then
- any section starting with SECTIONNAME will be removed.
-
-`-s'
-`--strip-all'
- Remove all symbols.
-
-`-g'
-`-S'
-`-d'
-`--strip-debug'
- Remove debugging symbols only.
-
-`--strip-dwo'
- Remove the contents of all DWARF .dwo sections, leaving the
- remaining debugging sections and all symbols intact. See the
- description of this option in the `objcopy' section for more
- information.
-
-`--strip-unneeded'
- Remove all symbols that are not needed for relocation processing.
-
-`-K SYMBOLNAME'
-`--keep-symbol=SYMBOLNAME'
- When stripping symbols, keep symbol SYMBOLNAME even if it would
- normally be stripped. This option may be given more than once.
-
-`-N SYMBOLNAME'
-`--strip-symbol=SYMBOLNAME'
- Remove symbol SYMBOLNAME from the source file. This option may be
- given more than once, and may be combined with strip options other
- than `-K'.
-
-`-o FILE'
- Put the stripped output in FILE, rather than replacing the
- existing file. When this argument is used, only one OBJFILE
- argument may be specified.
-
-`-p'
-`--preserve-dates'
- Preserve the access and modification dates of the file.
-
-`-D'
-`--enable-deterministic-archives'
- Operate in _deterministic_ mode. When copying archive members and
- writing the archive index, use zero for UIDs, GIDs, timestamps,
- and use consistent file modes for all files.
-
- If `binutils' was configured with
- `--enable-deterministic-archives', then this mode is on by default.
- It can be disabled with the `-U' option, below.
-
-`-U'
-`--disable-deterministic-archives'
- Do _not_ operate in _deterministic_ mode. This is the inverse of
- the `-D' option, above: when copying archive members and writing
- the archive index, use their actual UID, GID, timestamp, and file
- mode values.
-
- This is the default unless `binutils' was configured with
- `--enable-deterministic-archives'.
-
-`-w'
-`--wildcard'
- Permit regular expressions in SYMBOLNAMEs used in other command
- line options. The question mark (?), asterisk (*), backslash (\)
- and square brackets ([]) operators can be used anywhere in the
- symbol name. If the first character of the symbol name is the
- exclamation point (!) then the sense of the switch is reversed for
- that symbol. For example:
-
- -w -K !foo -K fo*
-
- would cause strip to only keep symbols that start with the letters
- "fo", but to discard the symbol "foo".
-
-`-x'
-`--discard-all'
- Remove non-global symbols.
-
-`-X'
-`--discard-locals'
- Remove compiler-generated local symbols. (These usually start
- with `L' or `.'.)
-
-`--keep-file-symbols'
- When stripping a file, perhaps with `--strip-debug' or
- `--strip-unneeded', retain any symbols specifying source file
- names, which would otherwise get stripped.
-
-`--only-keep-debug'
- Strip a file, removing contents of any sections that would not be
- stripped by `--strip-debug' and leaving the debugging sections
- intact. In ELF files, this preserves all note sections in the
- output.
-
- The intention is that this option will be used in conjunction with
- `--add-gnu-debuglink' to create a two part executable. One a
- stripped binary which will occupy less space in RAM and in a
- distribution and the second a debugging information file which is
- only needed if debugging abilities are required. The suggested
- procedure to create these files is as follows:
-
- 1. Link the executable as normal. Assuming that is is called
- `foo' then...
-
- 2. Run `objcopy --only-keep-debug foo foo.dbg' to create a file
- containing the debugging info.
-
- 3. Run `objcopy --strip-debug foo' to create a stripped
- executable.
-
- 4. Run `objcopy --add-gnu-debuglink=foo.dbg foo' to add a link
- to the debugging info into the stripped executable.
-
- Note--the choice of `.dbg' as an extension for the debug info file
- is arbitrary. Also the `--only-keep-debug' step is optional. You
- could instead do this:
-
- 1. Link the executable as normal.
-
- 2. Copy `foo' to `foo.full'
-
- 3. Run `strip --strip-debug foo'
-
- 4. Run `objcopy --add-gnu-debuglink=foo.full foo'
-
- i.e., the file pointed to by the `--add-gnu-debuglink' can be the
- full executable. It does not have to be a file created by the
- `--only-keep-debug' switch.
-
- Note--this switch is only intended for use on fully linked files.
- It does not make sense to use it on object files where the
- debugging information may be incomplete. Besides the
- gnu_debuglink feature currently only supports the presence of one
- filename containing debugging information, not multiple filenames
- on a one-per-object-file basis.
-
-`-V'
-`--version'
- Show the version number for `strip'.
-
-`-v'
-`--verbose'
- Verbose output: list all object files modified. In the case of
- archives, `strip -v' lists all members of the archive.
-
-
-File: binutils.info, Node: c++filt, Next: addr2line, Prev: strip, Up: Top
-
-9 c++filt
-*********
-
- c++filt [`-_'|`--strip-underscore']
- [`-n'|`--no-strip-underscore']
- [`-p'|`--no-params']
- [`-t'|`--types']
- [`-i'|`--no-verbose']
- [`-s' FORMAT|`--format='FORMAT]
- [`--help'] [`--version'] [SYMBOL...]
-
- The C++ and Java languages provide function overloading, which means
-that you can write many functions with the same name, providing that
-each function takes parameters of different types. In order to be able
-to distinguish these similarly named functions C++ and Java encode them
-into a low-level assembler name which uniquely identifies each
-different version. This process is known as "mangling". The `c++filt'
-(1) program does the inverse mapping: it decodes ("demangles") low-level
-names into user-level names so that they can be read.
-
- Every alphanumeric word (consisting of letters, digits, underscores,
-dollars, or periods) seen in the input is a potential mangled name. If
-the name decodes into a C++ name, the C++ name replaces the low-level
-name in the output, otherwise the original word is output. In this way
-you can pass an entire assembler source file, containing mangled names,
-through `c++filt' and see the same source file containing demangled
-names.
-
- You can also use `c++filt' to decipher individual symbols by passing
-them on the command line:
-
- c++filt SYMBOL
-
- If no SYMBOL arguments are given, `c++filt' reads symbol names from
-the standard input instead. All the results are printed on the
-standard output. The difference between reading names from the command
-line versus reading names from the standard input is that command line
-arguments are expected to be just mangled names and no checking is
-performed to separate them from surrounding text. Thus for example:
-
- c++filt -n _Z1fv
-
- will work and demangle the name to "f()" whereas:
-
- c++filt -n _Z1fv,
-
- will not work. (Note the extra comma at the end of the mangled name
-which makes it invalid). This command however will work:
-
- echo _Z1fv, | c++filt -n
-
- and will display "f(),", i.e., the demangled name followed by a
-trailing comma. This behaviour is because when the names are read from
-the standard input it is expected that they might be part of an
-assembler source file where there might be extra, extraneous characters
-trailing after a mangled name. For example:
-
- .type _Z1fv, @function
-
-`-_'
-`--strip-underscore'
- On some systems, both the C and C++ compilers put an underscore in
- front of every name. For example, the C name `foo' gets the
- low-level name `_foo'. This option removes the initial
- underscore. Whether `c++filt' removes the underscore by default
- is target dependent.
-
-`-n'
-`--no-strip-underscore'
- Do not remove the initial underscore.
-
-`-p'
-`--no-params'
- When demangling the name of a function, do not display the types of
- the function's parameters.
-
-`-t'
-`--types'
- Attempt to demangle types as well as function names. This is
- disabled by default since mangled types are normally only used
- internally in the compiler, and they can be confused with
- non-mangled names. For example, a function called "a" treated as
- a mangled type name would be demangled to "signed char".
-
-`-i'
-`--no-verbose'
- Do not include implementation details (if any) in the demangled
- output.
-
-`-s FORMAT'
-`--format=FORMAT'
- `c++filt' can decode various methods of mangling, used by
- different compilers. The argument to this option selects which
- method it uses:
-
- `auto'
- Automatic selection based on executable (the default method)
-
- `gnu'
- the one used by the GNU C++ compiler (g++)
-
- `lucid'
- the one used by the Lucid compiler (lcc)
-
- `arm'
- the one specified by the C++ Annotated Reference Manual
-
- `hp'
- the one used by the HP compiler (aCC)
-
- `edg'
- the one used by the EDG compiler
-
- `gnu-v3'
- the one used by the GNU C++ compiler (g++) with the V3 ABI.
-
- `java'
- the one used by the GNU Java compiler (gcj)
-
- `gnat'
- the one used by the GNU Ada compiler (GNAT).
-
-`--help'
- Print a summary of the options to `c++filt' and exit.
-
-`--version'
- Print the version number of `c++filt' and exit.
-
- _Warning:_ `c++filt' is a new utility, and the details of its user
- interface are subject to change in future releases. In particular,
- a command-line option may be required in the future to decode a
- name passed as an argument on the command line; in other words,
-
- c++filt SYMBOL
-
- may in a future release become
-
- c++filt OPTION SYMBOL
-
- ---------- Footnotes ----------
-
- (1) MS-DOS does not allow `+' characters in file names, so on MS-DOS
-this program is named `CXXFILT'.
-
-
-File: binutils.info, Node: addr2line, Next: nlmconv, Prev: c++filt, Up: Top
-
-10 addr2line
-************
-
- addr2line [`-a'|`--addresses']
- [`-b' BFDNAME|`--target='BFDNAME]
- [`-C'|`--demangle'[=STYLE]]
- [`-e' FILENAME|`--exe='FILENAME]
- [`-f'|`--functions'] [`-s'|`--basename']
- [`-i'|`--inlines']
- [`-p'|`--pretty-print']
- [`-j'|`--section='NAME]
- [`-H'|`--help'] [`-V'|`--version']
- [addr addr ...]
-
- `addr2line' translates addresses into file names and line numbers.
-Given an address in an executable or an offset in a section of a
-relocatable object, it uses the debugging information to figure out
-which file name and line number are associated with it.
-
- The executable or relocatable object to use is specified with the
-`-e' option. The default is the file `a.out'. The section in the
-relocatable object to use is specified with the `-j' option.
-
- `addr2line' has two modes of operation.
-
- In the first, hexadecimal addresses are specified on the command
-line, and `addr2line' displays the file name and line number for each
-address.
-
- In the second, `addr2line' reads hexadecimal addresses from standard
-input, and prints the file name and line number for each address on
-standard output. In this mode, `addr2line' may be used in a pipe to
-convert dynamically chosen addresses.
-
- The format of the output is `FILENAME:LINENO'. The file name and
-line number for each input address is printed on separate lines.
-
- If the `-f' option is used, then each `FILENAME:LINENO' line is
-preceded by `FUNCTIONNAME' which is the name of the function containing
-the address.
-
- If the `-i' option is used and the code at the given address is
-present there because of inlining by the compiler then the
-`{FUNCTIONNAME} FILENAME:LINENO' information for the inlining function
-will be displayed afterwards. This continues recursively until there
-is no more inlining to report.
-
- If the `-a' option is used then the output is prefixed by the input
-address.
-
- If the `-p' option is used then the output for each input address is
-displayed on one, possibly quite long, line. If `-p' is not used then
-the output is broken up into multiple lines, based on the paragraphs
-above.
-
- If the file name or function name can not be determined, `addr2line'
-will print two question marks in their place. If the line number can
-not be determined, `addr2line' will print 0.
-
- The long and short forms of options, shown here as alternatives, are
-equivalent.
-
-`-a'
-`--addresses'
- Display the address before the function name, file and line number
- information. The address is printed with a `0x' prefix to easily
- identify it.
-
-`-b BFDNAME'
-`--target=BFDNAME'
- Specify that the object-code format for the object files is
- BFDNAME.
-
-`-C'
-`--demangle[=STYLE]'
- Decode ("demangle") low-level symbol names into user-level names.
- Besides removing any initial underscore prepended by the system,
- this makes C++ function names readable. Different compilers have
- different mangling styles. The optional demangling style argument
- can be used to choose an appropriate demangling style for your
- compiler. *Note c++filt::, for more information on demangling.
-
-`-e FILENAME'
-`--exe=FILENAME'
- Specify the name of the executable for which addresses should be
- translated. The default file is `a.out'.
-
-`-f'
-`--functions'
- Display function names as well as file and line number information.
-
-`-s'
-`--basenames'
- Display only the base of each file name.
-
-`-i'
-`--inlines'
- If the address belongs to a function that was inlined, the source
- information for all enclosing scopes back to the first non-inlined
- function will also be printed. For example, if `main' inlines
- `callee1' which inlines `callee2', and address is from `callee2',
- the source information for `callee1' and `main' will also be
- printed.
-
-`-j'
-`--section'
- Read offsets relative to the specified section instead of absolute
- addresses.
-
-`-p'
-`--pretty-print'
- Make the output more human friendly: each location are printed on
- one line. If option `-i' is specified, lines for all enclosing
- scopes are prefixed with `(inlined by)'.
-
-
-File: binutils.info, Node: nlmconv, Next: windmc, Prev: addr2line, Up: Top
-
-11 nlmconv
-**********
-
-`nlmconv' converts a relocatable object file into a NetWare Loadable
-Module.
-
- _Warning:_ `nlmconv' is not always built as part of the binary
- utilities, since it is only useful for NLM targets.
-
- nlmconv [`-I' BFDNAME|`--input-target='BFDNAME]
- [`-O' BFDNAME|`--output-target='BFDNAME]
- [`-T' HEADERFILE|`--header-file='HEADERFILE]
- [`-d'|`--debug'] [`-l' LINKER|`--linker='LINKER]
- [`-h'|`--help'] [`-V'|`--version']
- INFILE OUTFILE
-
- `nlmconv' converts the relocatable `i386' object file INFILE into
-the NetWare Loadable Module OUTFILE, optionally reading HEADERFILE for
-NLM header information. For instructions on writing the NLM command
-file language used in header files, see the `linkers' section,
-`NLMLINK' in particular, of the `NLM Development and Tools Overview',
-which is part of the NLM Software Developer's Kit ("NLM SDK"),
-available from Novell, Inc. `nlmconv' uses the GNU Binary File
-Descriptor library to read INFILE; see *Note BFD: (ld.info)BFD, for
-more information.
-
- `nlmconv' can perform a link step. In other words, you can list
-more than one object file for input if you list them in the definitions
-file (rather than simply specifying one input file on the command line).
-In this case, `nlmconv' calls the linker for you.
-
-`-I BFDNAME'
-`--input-target=BFDNAME'
- Object format of the input file. `nlmconv' can usually determine
- the format of a given file (so no default is necessary). *Note
- Target Selection::, for more information.
-
-`-O BFDNAME'
-`--output-target=BFDNAME'
- Object format of the output file. `nlmconv' infers the output
- format based on the input format, e.g. for a `i386' input file the
- output format is `nlm32-i386'. *Note Target Selection::, for more
- information.
-
-`-T HEADERFILE'
-`--header-file=HEADERFILE'
- Reads HEADERFILE for NLM header information. For instructions on
- writing the NLM command file language used in header files, see
- see the `linkers' section, of the `NLM Development and Tools
- Overview', which is part of the NLM Software Developer's Kit,
- available from Novell, Inc.
-
-`-d'
-`--debug'
- Displays (on standard error) the linker command line used by
- `nlmconv'.
-
-`-l LINKER'
-`--linker=LINKER'
- Use LINKER for any linking. LINKER can be an absolute or a
- relative pathname.
-
-`-h'
-`--help'
- Prints a usage summary.
-
-`-V'
-`--version'
- Prints the version number for `nlmconv'.
-
-
-File: binutils.info, Node: windmc, Next: windres, Prev: nlmconv, Up: Top
-
-12 windmc
-*********
-
-`windmc' may be used to generator Windows message resources.
-
- _Warning:_ `windmc' is not always built as part of the binary
- utilities, since it is only useful for Windows targets.
-
- windmc [options] input-file
-
- `windmc' reads message definitions from an input file (.mc) and
-translate them into a set of output files. The output files may be of
-four kinds:
-
-`h'
- A C header file containing the message definitions.
-
-`rc'
- A resource file compilable by the `windres' tool.
-
-`bin'
- One or more binary files containing the resource data for a
- specific message language.
-
-`dbg'
- A C include file that maps message id's to their symbolic name.
-
- The exact description of these different formats is available in
-documentation from Microsoft.
-
- When `windmc' converts from the `mc' format to the `bin' format,
-`rc', `h', and optional `dbg' it is acting like the Windows Message
-Compiler.
-
-`-a'
-`--ascii_in'
- Specifies that the input file specified is ASCII. This is the
- default behaviour.
-
-`-A'
-`--ascii_out'
- Specifies that messages in the output `bin' files should be in
- ASCII format.
-
-`-b'
-`--binprefix'
- Specifies that `bin' filenames should have to be prefixed by the
- basename of the source file.
-
-`-c'
-`--customflag'
- Sets the customer bit in all message id's.
-
-`-C CODEPAGE'
-`--codepage_in CODEPAGE'
- Sets the default codepage to be used to convert input file to
- UTF16. The default is ocdepage 1252.
-
-`-d'
-`--decimal_values'
- Outputs the constants in the header file in decimal. Default is
- using hexadecimal output.
-
-`-e EXT'
-`--extension EXT'
- The extension for the header file. The default is .h extension.
-
-`-F TARGET'
-`--target TARGET'
- Specify the BFD format to use for a bin file as output. This is a
- BFD target name; you can use the `--help' option to see a list of
- supported targets. Normally `windmc' will use the default format,
- which is the first one listed by the `--help' option. *Note
- Target Selection::.
-
-`-h PATH'
-`--headerdir PATH'
- The target directory of the generated header file. The default is
- the current directory.
-
-`-H'
-`--help'
- Displays a list of command line options and then exits.
-
-`-m CHARACTERS'
-`--maxlength CHARACTERS'
- Instructs `windmc' to generate a warning if the length of any
- message exceeds the number specified.
-
-`-n'
-`--nullterminate'
- Terminate message text in `bin' files by zero. By default they are
- terminated by CR/LF.
-
-`-o'
-`--hresult_use'
- Not yet implemented. Instructs `windmc' to generate an OLE2 header
- file, using HRESULT definitions. Status codes are used if the flag
- is not specified.
-
-`-O CODEPAGE'
-`--codepage_out CODEPAGE'
- Sets the default codepage to be used to output text files. The
- default is ocdepage 1252.
-
-`-r PATH'
-`--rcdir PATH'
- The target directory for the generated `rc' script and the
- generated `bin' files that the resource compiler script includes.
- The default is the current directory.
-
-`-u'
-`--unicode_in'
- Specifies that the input file is UTF16.
-
-`-U'
-`--unicode_out'
- Specifies that messages in the output `bin' file should be in UTF16
- format. This is the default behaviour.
-
-`-v'
-
-`--verbose'
- Enable verbose mode.
-
-`-V'
-
-`--version'
- Prints the version number for `windmc'.
-
-`-x PATH'
-`--xdgb PATH'
- The path of the `dbg' C include file that maps message id's to the
- symbolic name. No such file is generated without specifying the
- switch.
-
-
-File: binutils.info, Node: windres, Next: dlltool, Prev: windmc, Up: Top
-
-13 windres
-**********
-
-`windres' may be used to manipulate Windows resources.
-
- _Warning:_ `windres' is not always built as part of the binary
- utilities, since it is only useful for Windows targets.
-
- windres [options] [input-file] [output-file]
-
- `windres' reads resources from an input file and copies them into an
-output file. Either file may be in one of three formats:
-
-`rc'
- A text format read by the Resource Compiler.
-
-`res'
- A binary format generated by the Resource Compiler.
-
-`coff'
- A COFF object or executable.
-
- The exact description of these different formats is available in
-documentation from Microsoft.
-
- When `windres' converts from the `rc' format to the `res' format, it
-is acting like the Windows Resource Compiler. When `windres' converts
-from the `res' format to the `coff' format, it is acting like the
-Windows `CVTRES' program.
-
- When `windres' generates an `rc' file, the output is similar but not
-identical to the format expected for the input. When an input `rc'
-file refers to an external filename, an output `rc' file will instead
-include the file contents.
-
- If the input or output format is not specified, `windres' will guess
-based on the file name, or, for the input file, the file contents. A
-file with an extension of `.rc' will be treated as an `rc' file, a file
-with an extension of `.res' will be treated as a `res' file, and a file
-with an extension of `.o' or `.exe' will be treated as a `coff' file.
-
- If no output file is specified, `windres' will print the resources
-in `rc' format to standard output.
-
- The normal use is for you to write an `rc' file, use `windres' to
-convert it to a COFF object file, and then link the COFF file into your
-application. This will make the resources described in the `rc' file
-available to Windows.
-
-`-i FILENAME'
-`--input FILENAME'
- The name of the input file. If this option is not used, then
- `windres' will use the first non-option argument as the input file
- name. If there are no non-option arguments, then `windres' will
- read from standard input. `windres' can not read a COFF file from
- standard input.
-
-`-o FILENAME'
-`--output FILENAME'
- The name of the output file. If this option is not used, then
- `windres' will use the first non-option argument, after any used
- for the input file name, as the output file name. If there is no
- non-option argument, then `windres' will write to standard output.
- `windres' can not write a COFF file to standard output. Note, for
- compatibility with `rc' the option `-fo' is also accepted, but its
- use is not recommended.
-
-`-J FORMAT'
-`--input-format FORMAT'
- The input format to read. FORMAT may be `res', `rc', or `coff'.
- If no input format is specified, `windres' will guess, as
- described above.
-
-`-O FORMAT'
-`--output-format FORMAT'
- The output format to generate. FORMAT may be `res', `rc', or
- `coff'. If no output format is specified, `windres' will guess,
- as described above.
-
-`-F TARGET'
-`--target TARGET'
- Specify the BFD format to use for a COFF file as input or output.
- This is a BFD target name; you can use the `--help' option to see
- a list of supported targets. Normally `windres' will use the
- default format, which is the first one listed by the `--help'
- option. *Note Target Selection::.
-
-`--preprocessor PROGRAM'
- When `windres' reads an `rc' file, it runs it through the C
- preprocessor first. This option may be used to specify the
- preprocessor to use, including any leading arguments. The default
- preprocessor argument is `gcc -E -xc-header -DRC_INVOKED'.
-
-`--preprocessor-arg OPTION'
- When `windres' reads an `rc' file, it runs it through the C
- preprocessor first. This option may be used to specify additional
- text to be passed to preprocessor on its command line. This
- option can be used multiple times to add multiple options to the
- preprocessor command line.
-
-`-I DIRECTORY'
-`--include-dir DIRECTORY'
- Specify an include directory to use when reading an `rc' file.
- `windres' will pass this to the preprocessor as an `-I' option.
- `windres' will also search this directory when looking for files
- named in the `rc' file. If the argument passed to this command
- matches any of the supported FORMATS (as described in the `-J'
- option), it will issue a deprecation warning, and behave just like
- the `-J' option. New programs should not use this behaviour. If a
- directory happens to match a FORMAT, simple prefix it with `./' to
- disable the backward compatibility.
-
-`-D TARGET'
-`--define SYM[=VAL]'
- Specify a `-D' option to pass to the preprocessor when reading an
- `rc' file.
-
-`-U TARGET'
-`--undefine SYM'
- Specify a `-U' option to pass to the preprocessor when reading an
- `rc' file.
-
-`-r'
- Ignored for compatibility with rc.
-
-`-v'
- Enable verbose mode. This tells you what the preprocessor is if
- you didn't specify one.
-
-`-c VAL'
-
-`--codepage VAL'
- Specify the default codepage to use when reading an `rc' file.
- VAL should be a hexadecimal prefixed by `0x' or decimal codepage
- code. The valid range is from zero up to 0xffff, but the validity
- of the codepage is host and configuration dependent.
-
-`-l VAL'
-
-`--language VAL'
- Specify the default language to use when reading an `rc' file.
- VAL should be a hexadecimal language code. The low eight bits are
- the language, and the high eight bits are the sublanguage.
-
-`--use-temp-file'
- Use a temporary file to instead of using popen to read the output
- of the preprocessor. Use this option if the popen implementation
- is buggy on the host (eg., certain non-English language versions
- of Windows 95 and Windows 98 are known to have buggy popen where
- the output will instead go the console).
-
-`--no-use-temp-file'
- Use popen, not a temporary file, to read the output of the
- preprocessor. This is the default behaviour.
-
-`-h'
-
-`--help'
- Prints a usage summary.
-
-`-V'
-
-`--version'
- Prints the version number for `windres'.
-
-`--yydebug'
- If `windres' is compiled with `YYDEBUG' defined as `1', this will
- turn on parser debugging.
-
-
-File: binutils.info, Node: dlltool, Next: readelf, Prev: windres, Up: Top
-
-14 dlltool
-**********
-
-`dlltool' is used to create the files needed to create dynamic link
-libraries (DLLs) on systems which understand PE format image files such
-as Windows. A DLL contains an export table which contains information
-that the runtime loader needs to resolve references from a referencing
-program.
-
- The export table is generated by this program by reading in a `.def'
-file or scanning the `.a' and `.o' files which will be in the DLL. A
-`.o' file can contain information in special `.drectve' sections with
-export information.
-
- _Note:_ `dlltool' is not always built as part of the binary
- utilities, since it is only useful for those targets which support
- DLLs.
-
- dlltool [`-d'|`--input-def' DEF-FILE-NAME]
- [`-b'|`--base-file' BASE-FILE-NAME]
- [`-e'|`--output-exp' EXPORTS-FILE-NAME]
- [`-z'|`--output-def' DEF-FILE-NAME]
- [`-l'|`--output-lib' LIBRARY-FILE-NAME]
- [`-y'|`--output-delaylib' LIBRARY-FILE-NAME]
- [`--export-all-symbols'] [`--no-export-all-symbols']
- [`--exclude-symbols' LIST]
- [`--no-default-excludes']
- [`-S'|`--as' PATH-TO-ASSEMBLER] [`-f'|`--as-flags' OPTIONS]
- [`-D'|`--dllname' NAME] [`-m'|`--machine' MACHINE]
- [`-a'|`--add-indirect']
- [`-U'|`--add-underscore'] [`--add-stdcall-underscore']
- [`-k'|`--kill-at'] [`-A'|`--add-stdcall-alias']
- [`-p'|`--ext-prefix-alias' PREFIX]
- [`-x'|`--no-idata4'] [`-c'|`--no-idata5']
- [`--use-nul-prefixed-import-tables']
- [`-I'|`--identify' LIBRARY-FILE-NAME] [`--identify-strict']
- [`-i'|`--interwork']
- [`-n'|`--nodelete'] [`-t'|`--temp-prefix' PREFIX]
- [`-v'|`--verbose']
- [`-h'|`--help'] [`-V'|`--version']
- [`--no-leading-underscore'] [`--leading-underscore']
- [object-file ...]
-
- `dlltool' reads its inputs, which can come from the `-d' and `-b'
-options as well as object files specified on the command line. It then
-processes these inputs and if the `-e' option has been specified it
-creates a exports file. If the `-l' option has been specified it
-creates a library file and if the `-z' option has been specified it
-creates a def file. Any or all of the `-e', `-l' and `-z' options can
-be present in one invocation of dlltool.
-
- When creating a DLL, along with the source for the DLL, it is
-necessary to have three other files. `dlltool' can help with the
-creation of these files.
-
- The first file is a `.def' file which specifies which functions are
-exported from the DLL, which functions the DLL imports, and so on. This
-is a text file and can be created by hand, or `dlltool' can be used to
-create it using the `-z' option. In this case `dlltool' will scan the
-object files specified on its command line looking for those functions
-which have been specially marked as being exported and put entries for
-them in the `.def' file it creates.
-
- In order to mark a function as being exported from a DLL, it needs to
-have an `-export:' entry in the `.drectve' section of
-the object file. This can be done in C by using the asm() operator:
-
- asm (".section .drectve");
- asm (".ascii \"-export:my_func\"");
-
- int my_func (void) { ... }
-
- The second file needed for DLL creation is an exports file. This
-file is linked with the object files that make up the body of the DLL
-and it handles the interface between the DLL and the outside world.
-This is a binary file and it can be created by giving the `-e' option to
-`dlltool' when it is creating or reading in a `.def' file.
-
- The third file needed for DLL creation is the library file that
-programs will link with in order to access the functions in the DLL (an
-`import library'). This file can be created by giving the `-l' option
-to dlltool when it is creating or reading in a `.def' file.
-
- If the `-y' option is specified, dlltool generates a delay-import
-library that can be used instead of the normal import library to allow
-a program to link to the dll only as soon as an imported function is
-called for the first time. The resulting executable will need to be
-linked to the static delayimp library containing __delayLoadHelper2(),
-which in turn will import LoadLibraryA and GetProcAddress from kernel32.
-
- `dlltool' builds the library file by hand, but it builds the exports
-file by creating temporary files containing assembler statements and
-then assembling these. The `-S' command line option can be used to
-specify the path to the assembler that dlltool will use, and the `-f'
-option can be used to pass specific flags to that assembler. The `-n'
-can be used to prevent dlltool from deleting these temporary assembler
-files when it is done, and if `-n' is specified twice then this will
-prevent dlltool from deleting the temporary object files it used to
-build the library.
-
- Here is an example of creating a DLL from a source file `dll.c' and
-also creating a program (from an object file called `program.o') that
-uses that DLL:
-
- gcc -c dll.c
- dlltool -e exports.o -l dll.lib dll.o
- gcc dll.o exports.o -o dll.dll
- gcc program.o dll.lib -o program
-
- `dlltool' may also be used to query an existing import library to
-determine the name of the DLL to which it is associated. See the
-description of the `-I' or `--identify' option.
-
- The command line options have the following meanings:
-
-`-d FILENAME'
-`--input-def FILENAME'
- Specifies the name of a `.def' file to be read in and processed.
-
-`-b FILENAME'
-`--base-file FILENAME'
- Specifies the name of a base file to be read in and processed. The
- contents of this file will be added to the relocation section in
- the exports file generated by dlltool.
-
-`-e FILENAME'
-`--output-exp FILENAME'
- Specifies the name of the export file to be created by dlltool.
-
-`-z FILENAME'
-`--output-def FILENAME'
- Specifies the name of the `.def' file to be created by dlltool.
-
-`-l FILENAME'
-`--output-lib FILENAME'
- Specifies the name of the library file to be created by dlltool.
-
-`-y FILENAME'
-`--output-delaylib FILENAME'
- Specifies the name of the delay-import library file to be created
- by dlltool.
-
-`--export-all-symbols'
- Treat all global and weak defined symbols found in the input object
- files as symbols to be exported. There is a small list of symbols
- which are not exported by default; see the `--no-default-excludes'
- option. You may add to the list of symbols to not export by using
- the `--exclude-symbols' option.
-
-`--no-export-all-symbols'
- Only export symbols explicitly listed in an input `.def' file or in
- `.drectve' sections in the input object files. This is the default
- behaviour. The `.drectve' sections are created by `dllexport'
- attributes in the source code.
-
-`--exclude-symbols LIST'
- Do not export the symbols in LIST. This is a list of symbol names
- separated by comma or colon characters. The symbol names should
- not contain a leading underscore. This is only meaningful when
- `--export-all-symbols' is used.
-
-`--no-default-excludes'
- When `--export-all-symbols' is used, it will by default avoid
- exporting certain special symbols. The current list of symbols to
- avoid exporting is `DllMain@12', `DllEntryPoint@0', `impure_ptr'.
- You may use the `--no-default-excludes' option to go ahead and
- export these special symbols. This is only meaningful when
- `--export-all-symbols' is used.
-
-`-S PATH'
-`--as PATH'
- Specifies the path, including the filename, of the assembler to be
- used to create the exports file.
-
-`-f OPTIONS'
-`--as-flags OPTIONS'
- Specifies any specific command line options to be passed to the
- assembler when building the exports file. This option will work
- even if the `-S' option is not used. This option only takes one
- argument, and if it occurs more than once on the command line,
- then later occurrences will override earlier occurrences. So if
- it is necessary to pass multiple options to the assembler they
- should be enclosed in double quotes.
-
-`-D NAME'
-`--dll-name NAME'
- Specifies the name to be stored in the `.def' file as the name of
- the DLL when the `-e' option is used. If this option is not
- present, then the filename given to the `-e' option will be used
- as the name of the DLL.
-
-`-m MACHINE'
-`-machine MACHINE'
- Specifies the type of machine for which the library file should be
- built. `dlltool' has a built in default type, depending upon how
- it was created, but this option can be used to override that.
- This is normally only useful when creating DLLs for an ARM
- processor, when the contents of the DLL are actually encode using
- Thumb instructions.
-
-`-a'
-`--add-indirect'
- Specifies that when `dlltool' is creating the exports file it
- should add a section which allows the exported functions to be
- referenced without using the import library. Whatever the hell
- that means!
-
-`-U'
-`--add-underscore'
- Specifies that when `dlltool' is creating the exports file it
- should prepend an underscore to the names of _all_ exported
- symbols.
-
-`--no-leading-underscore'
-
-`--leading-underscore'
- Specifies whether standard symbol should be forced to be prefixed,
- or not.
-
-`--add-stdcall-underscore'
- Specifies that when `dlltool' is creating the exports file it
- should prepend an underscore to the names of exported _stdcall_
- functions. Variable names and non-stdcall function names are not
- modified. This option is useful when creating GNU-compatible
- import libs for third party DLLs that were built with MS-Windows
- tools.
-
-`-k'
-`--kill-at'
- Specifies that when `dlltool' is creating the exports file it
- should not append the string `@ '. These numbers are
- called ordinal numbers and they represent another way of accessing
- the function in a DLL, other than by name.
-
-`-A'
-`--add-stdcall-alias'
- Specifies that when `dlltool' is creating the exports file it
- should add aliases for stdcall symbols without `@ ' in
- addition to the symbols with `@ '.
-
-`-p'
-`--ext-prefix-alias PREFIX'
- Causes `dlltool' to create external aliases for all DLL imports
- with the specified prefix. The aliases are created for both
- external and import symbols with no leading underscore.
-
-`-x'
-`--no-idata4'
- Specifies that when `dlltool' is creating the exports and library
- files it should omit the `.idata4' section. This is for
- compatibility with certain operating systems.
-
-`--use-nul-prefixed-import-tables'
- Specifies that when `dlltool' is creating the exports and library
- files it should prefix the `.idata4' and `.idata5' by zero an
- element. This emulates old gnu import library generation of
- `dlltool'. By default this option is turned off.
-
-`-c'
-`--no-idata5'
- Specifies that when `dlltool' is creating the exports and library
- files it should omit the `.idata5' section. This is for
- compatibility with certain operating systems.
-
-`-I FILENAME'
-`--identify FILENAME'
- Specifies that `dlltool' should inspect the import library
- indicated by FILENAME and report, on `stdout', the name(s) of the
- associated DLL(s). This can be performed in addition to any other
- operations indicated by the other options and arguments.
- `dlltool' fails if the import library does not exist or is not
- actually an import library. See also `--identify-strict'.
-
-`--identify-strict'
- Modifies the behavior of the `--identify' option, such that an
- error is reported if FILENAME is associated with more than one DLL.
-
-`-i'
-`--interwork'
- Specifies that `dlltool' should mark the objects in the library
- file and exports file that it produces as supporting interworking
- between ARM and Thumb code.
-
-`-n'
-`--nodelete'
- Makes `dlltool' preserve the temporary assembler files it used to
- create the exports file. If this option is repeated then dlltool
- will also preserve the temporary object files it uses to create
- the library file.
-
-`-t PREFIX'
-`--temp-prefix PREFIX'
- Makes `dlltool' use PREFIX when constructing the names of
- temporary assembler and object files. By default, the temp file
- prefix is generated from the pid.
-
-`-v'
-`--verbose'
- Make dlltool describe what it is doing.
-
-`-h'
-`--help'
- Displays a list of command line options and then exits.
-
-`-V'
-`--version'
- Displays dlltool's version number and then exits.
-
-
-* Menu:
-
-* def file format:: The format of the dlltool `.def' file
-
-
-File: binutils.info, Node: def file format, Up: dlltool
-
-14.1 The format of the `dlltool' `.def' file
-============================================
-
-A `.def' file contains any number of the following commands:
-
-`NAME' NAME `[ ,' BASE `]'
- The result is going to be named NAME`.exe'.
-
-`LIBRARY' NAME `[ ,' BASE `]'
- The result is going to be named NAME`.dll'. Note: If you want to
- use LIBRARY as name then you need to quote. Otherwise this will
- fail due a necessary hack for libtool (see PR binutils/13710 for
- more details).
-
-`EXPORTS ( ( (' NAME1 `[ = ' NAME2 `] ) | ( ' NAME1 `=' MODULE-NAME `.' EXTERNAL-NAME `) ) [ == ' ITS_NAME `]'
-
-`[' INTEGER `] [ NONAME ] [ CONSTANT ] [ DATA ] [ PRIVATE ] ) *'
- Declares NAME1 as an exported symbol from the DLL, with optional
- ordinal number INTEGER, or declares NAME1 as an alias (forward) of
- the function EXTERNAL-NAME in the DLL. If ITS_NAME is specified,
- this name is used as string in export table. MODULE-NAME. Note:
- The `EXPORTS' has to be the last command in .def file, as keywords
- are treated - beside `LIBRARY' - as simple name-identifiers. If
- you want to use LIBRARY as name then you need to quote it.
-
-`IMPORTS ( (' INTERNAL-NAME `=' MODULE-NAME `.' INTEGER `) | [' INTERNAL-NAME `= ]' MODULE-NAME `.' EXTERNAL-NAME `) [ == ) ITS_NAME `]' *'
- Declares that EXTERNAL-NAME or the exported function whose ordinal
- number is INTEGER is to be imported from the file MODULE-NAME. If
- INTERNAL-NAME is specified then this is the name that the imported
- function will be referred to in the body of the DLL. If ITS_NAME
- is specified, this name is used as string in import table. Note:
- The `IMPORTS' has to be the last command in .def file, as keywords
- are treated - beside `LIBRARY' - as simple name-identifiers. If
- you want to use LIBRARY as name then you need to quote it.
-
-`DESCRIPTION' STRING
- Puts STRING into the output `.exp' file in the `.rdata' section.
-
-`STACKSIZE' NUMBER-RESERVE `[, ' NUMBER-COMMIT `]'
-
-`HEAPSIZE' NUMBER-RESERVE `[, ' NUMBER-COMMIT `]'
- Generates `--stack' or `--heap' NUMBER-RESERVE,NUMBER-COMMIT in
- the output `.drectve' section. The linker will see this and act
- upon it.
-
-`CODE' ATTR `+'
-
-`DATA' ATTR `+'
-
-`SECTIONS (' SECTION-NAME ATTR` + ) *'
- Generates `--attr' SECTION-NAME ATTR in the output `.drectve'
- section, where ATTR is one of `READ', `WRITE', `EXECUTE' or
- `SHARED'. The linker will see this and act upon it.
-
-
-
-File: binutils.info, Node: readelf, Next: elfedit, Prev: dlltool, Up: Top
-
-15 readelf
-**********
-
- readelf [`-a'|`--all']
- [`-h'|`--file-header']
- [`-l'|`--program-headers'|`--segments']
- [`-S'|`--section-headers'|`--sections']
- [`-g'|`--section-groups']
- [`-t'|`--section-details']
- [`-e'|`--headers']
- [`-s'|`--syms'|`--symbols']
- [`--dyn-syms']
- [`-n'|`--notes']
- [`-r'|`--relocs']
- [`-u'|`--unwind']
- [`-d'|`--dynamic']
- [`-V'|`--version-info']
- [`-A'|`--arch-specific']
- [`-D'|`--use-dynamic']
- [`-x' |`--hex-dump=']
- [`-p' |`--string-dump=']
- [`-R' |`--relocated-dump=']
- [`-c'|`--archive-index']
- [`-w[lLiaprmfFsoRt]'|
- `--debug-dump'[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges,=pubtypes,=trace_info,=trace_abbrev,=trace_aranges,=gdb_index]]
- [`--dwarf-depth=N']
- [`--dwarf-start=N']
- [`-I'|`--histogram']
- [`-v'|`--version']
- [`-W'|`--wide']
- [`-H'|`--help']
- ELFFILE...
-
- `readelf' displays information about one or more ELF format object
-files. The options control what particular information to display.
-
- ELFFILE... are the object files to be examined. 32-bit and 64-bit
-ELF files are supported, as are archives containing ELF files.
-
- This program performs a similar function to `objdump' but it goes
-into more detail and it exists independently of the BFD library, so if
-there is a bug in BFD then readelf will not be affected.
-
- The long and short forms of options, shown here as alternatives, are
-equivalent. At least one option besides `-v' or `-H' must be given.
-
-`-a'
-`--all'
- Equivalent to specifying `--file-header', `--program-headers',
- `--sections', `--symbols', `--relocs', `--dynamic', `--notes' and
- `--version-info'.
-
-`-h'
-`--file-header'
- Displays the information contained in the ELF header at the start
- of the file.
-
-`-l'
-`--program-headers'
-`--segments'
- Displays the information contained in the file's segment headers,
- if it has any.
-
-`-S'
-`--sections'
-`--section-headers'
- Displays the information contained in the file's section headers,
- if it has any.
-
-`-g'
-`--section-groups'
- Displays the information contained in the file's section groups,
- if it has any.
-
-`-t'
-`--section-details'
- Displays the detailed section information. Implies `-S'.
-
-`-s'
-`--symbols'
-`--syms'
- Displays the entries in symbol table section of the file, if it
- has one.
-
-`--dyn-syms'
- Displays the entries in dynamic symbol table section of the file,
- if it has one.
-
-`-e'
-`--headers'
- Display all the headers in the file. Equivalent to `-h -l -S'.
-
-`-n'
-`--notes'
- Displays the contents of the NOTE segments and/or sections, if any.
-
-`-r'
-`--relocs'
- Displays the contents of the file's relocation section, if it has
- one.
-
-`-u'
-`--unwind'
- Displays the contents of the file's unwind section, if it has one.
- Only the unwind sections for IA64 ELF files, as well as ARM
- unwind tables (`.ARM.exidx' / `.ARM.extab') are currently
- supported.
-
-`-d'
-`--dynamic'
- Displays the contents of the file's dynamic section, if it has one.
-
-`-V'
-`--version-info'
- Displays the contents of the version sections in the file, it they
- exist.
-
-`-A'
-`--arch-specific'
- Displays architecture-specific information in the file, if there
- is any.
-
-`-D'
-`--use-dynamic'
- When displaying symbols, this option makes `readelf' use the
- symbol hash tables in the file's dynamic section, rather than the
- symbol table sections.
-
-`-x '
-`--hex-dump='
- Displays the contents of the indicated section as a hexadecimal
- bytes. A number identifies a particular section by index in the
- section table; any other string identifies all sections with that
- name in the object file.
-
-`-R '
-`--relocated-dump='
- Displays the contents of the indicated section as a hexadecimal
- bytes. A number identifies a particular section by index in the
- section table; any other string identifies all sections with that
- name in the object file. The contents of the section will be
- relocated before they are displayed.
-
-`-p '
-`--string-dump='
- Displays the contents of the indicated section as printable
- strings. A number identifies a particular section by index in the
- section table; any other string identifies all sections with that
- name in the object file.
-
-`-c'
-`--archive-index'
- Displays the file symbol index information contained in the header
- part of binary archives. Performs the same function as the `t'
- command to `ar', but without using the BFD library. *Note ar::.
-
-`-w[lLiaprmfFsoRt]'
-`--debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges,=pubtypes,=trace_info,=trace_abbrev,=trace_aranges,=gdb_index]'
- Displays the contents of the debug sections in the file, if any are
- present. If one of the optional letters or words follows the
- switch then only data found in those specific sections will be
- dumped.
-
- Note that there is no single letter option to display the content
- of trace sections or .gdb_index.
-
- Note: the `=decodedline' option will display the interpreted
- contents of a .debug_line section whereas the `=rawline' option
- dumps the contents in a raw format.
-
- Note: the `=frames-interp' option will display the interpreted
- contents of a .debug_frame section whereas the `=frames' option
- dumps the contents in a raw format.
-
- Note: the output from the `=info' option can also be affected by
- the options `--dwarf-depth' and `--dwarf-start'.
-
-`--dwarf-depth=N'
- Limit the dump of the `.debug_info' section to N children. This
- is only useful with `--debug-dump=info'. The default is to print
- all DIEs; the special value 0 for N will also have this effect.
-
- With a non-zero value for N, DIEs at or deeper than N levels will
- not be printed. The range for N is zero-based.
-
-`--dwarf-start=N'
- Print only DIEs beginning with the DIE numbered N. This is only
- useful with `--debug-dump=info'.
-
- If specified, this option will suppress printing of any header
- information and all DIEs before the DIE numbered N. Only siblings
- and children of the specified DIE will be printed.
-
- This can be used in conjunction with `--dwarf-depth'.
-
-`-I'
-`--histogram'
- Display a histogram of bucket list lengths when displaying the
- contents of the symbol tables.
-
-`-v'
-`--version'
- Display the version number of readelf.
-
-`-W'
-`--wide'
- Don't break output lines to fit into 80 columns. By default
- `readelf' breaks section header and segment listing lines for
- 64-bit ELF files, so that they fit into 80 columns. This option
- causes `readelf' to print each section header resp. each segment
- one a single line, which is far more readable on terminals wider
- than 80 columns.
-
-`-H'
-`--help'
- Display the command line options understood by `readelf'.
-
-
-
-File: binutils.info, Node: elfedit, Next: Common Options, Prev: readelf, Up: Top
-
-16 elfedit
-**********
-
- elfedit [`--input-mach='MACHINE]
- [`--input-type='TYPE]
- [`--input-osabi='OSABI]
- `--output-mach='MACHINE
- `--output-type='TYPE
- `--output-osabi='OSABI
- [`-v'|`--version']
- [`-h'|`--help']
- ELFFILE...
-
- `elfedit' updates the ELF header of ELF files which have the
-matching ELF machine and file types. The options control how and which
-fields in the ELF header should be updated.
-
- ELFFILE... are the ELF files to be updated. 32-bit and 64-bit ELF
-files are supported, as are archives containing ELF files.
-
- The long and short forms of options, shown here as alternatives, are
-equivalent. At least one of the `--output-mach', `--output-type' and
-`--output-osabi' options must be given.
-
-`--input-mach=MACHINE'
- Set the matching input ELF machine type to MACHINE. If
- `--input-mach' isn't specified, it will match any ELF machine
- types.
-
- The supported ELF machine types are, L1OM, K1OM and X86-64.
-
-`--output-mach=MACHINE'
- Change the ELF machine type in the ELF header to MACHINE. The
- supported ELF machine types are the same as `--input-mach'.
-
-`--input-type=TYPE'
- Set the matching input ELF file type to TYPE. If `--input-type'
- isn't specified, it will match any ELF file types.
-
- The supported ELF file types are, REL, EXEC and DYN.
-
-`--output-type=TYPE'
- Change the ELF file type in the ELF header to TYPE. The supported
- ELF types are the same as `--input-type'.
-
-`--input-osabi=OSABI'
- Set the matching input ELF file OSABI to OSABI. If
- `--input-osabi' isn't specified, it will match any ELF OSABIs.
-
- The supported ELF OSABIs are, NONE, HPUX, NETBSD, GNU, LINUX
- (alias for GNU), SOLARIS, AIX, IRIX, FREEBSD, TRU64, MODESTO,
- OPENBSD, OPENVMS, NSK, AROS and FENIXOS.
-
-`--output-osabi=OSABI'
- Change the ELF OSABI in the ELF header to OSABI. The supported
- ELF OSABI are the same as `--input-osabi'.
-
-`-v'
-`--version'
- Display the version number of `elfedit'.
-
-`-h'
-`--help'
- Display the command line options understood by `elfedit'.
-
-
-
-File: binutils.info, Node: Common Options, Next: Selecting the Target System, Prev: elfedit, Up: Top
-
-17 Common Options
-*****************
-
-The following command-line options are supported by all of the programs
-described in this manual.
-
-`@FILE'
- Read command-line options from FILE. The options read are
- inserted in place of the original @FILE option. If FILE does not
- exist, or cannot be read, then the option will be treated
- literally, and not removed.
-
- Options in FILE are separated by whitespace. A whitespace
- character may be included in an option by surrounding the entire
- option in either single or double quotes. Any character
- (including a backslash) may be included by prefixing the character
- to be included with a backslash. The FILE may itself contain
- additional @FILE options; any such options will be processed
- recursively.
-
-`--help'
- Display the command-line options supported by the program.
-
-`--version'
- Display the version number of the program.
-
-
-
-File: binutils.info, Node: Selecting the Target System, Next: Reporting Bugs, Prev: Common Options, Up: Top
-
-18 Selecting the Target System
-******************************
-
-You can specify two aspects of the target system to the GNU binary file
-utilities, each in several ways:
-
- * the target
-
- * the architecture
-
- In the following summaries, the lists of ways to specify values are
-in order of decreasing precedence. The ways listed first override those
-listed later.
-
- The commands to list valid values only list the values for which the
-programs you are running were configured. If they were configured with
-`--enable-targets=all', the commands list most of the available values,
-but a few are left out; not all targets can be configured in at once
-because some of them can only be configured "native" (on hosts with the
-same type as the target system).
-
-* Menu:
-
-* Target Selection::
-* Architecture Selection::
-
-
-File: binutils.info, Node: Target Selection, Next: Architecture Selection, Up: Selecting the Target System
-
-18.1 Target Selection
-=====================
-
-A "target" is an object file format. A given target may be supported
-for multiple architectures (*note Architecture Selection::). A target
-selection may also have variations for different operating systems or
-architectures.
-
- The command to list valid target values is `objdump -i' (the first
-column of output contains the relevant information).
-
- Some sample values are: `a.out-hp300bsd', `ecoff-littlemips',
-`a.out-sunos-big'.
-
- You can also specify a target using a configuration triplet. This is
-the same sort of name that is passed to `configure' to specify a
-target. When you use a configuration triplet as an argument, it must be
-fully canonicalized. You can see the canonical version of a triplet by
-running the shell script `config.sub' which is included with the
-sources.
-
- Some sample configuration triplets are: `m68k-hp-bsd',
-`mips-dec-ultrix', `sparc-sun-sunos'.
-
-`objdump' Target
-----------------
-
-Ways to specify:
-
- 1. command line option: `-b' or `--target'
-
- 2. environment variable `GNUTARGET'
-
- 3. deduced from the input file
-
-`objcopy' and `strip' Input Target
-----------------------------------
-
-Ways to specify:
-
- 1. command line options: `-I' or `--input-target', or `-F' or
- `--target'
-
- 2. environment variable `GNUTARGET'
-
- 3. deduced from the input file
-
-`objcopy' and `strip' Output Target
------------------------------------
-
-Ways to specify:
-
- 1. command line options: `-O' or `--output-target', or `-F' or
- `--target'
-
- 2. the input target (see "`objcopy' and `strip' Input Target" above)
-
- 3. environment variable `GNUTARGET'
-
- 4. deduced from the input file
-
-`nm', `size', and `strings' Target
-----------------------------------
-
-Ways to specify:
-
- 1. command line option: `--target'
-
- 2. environment variable `GNUTARGET'
-
- 3. deduced from the input file
-
-
-File: binutils.info, Node: Architecture Selection, Prev: Target Selection, Up: Selecting the Target System
-
-18.2 Architecture Selection
-===========================
-
-An "architecture" is a type of CPU on which an object file is to run.
-Its name may contain a colon, separating the name of the processor
-family from the name of the particular CPU.
-
- The command to list valid architecture values is `objdump -i' (the
-second column contains the relevant information).
-
- Sample values: `m68k:68020', `mips:3000', `sparc'.
-
-`objdump' Architecture
-----------------------
-
-Ways to specify:
-
- 1. command line option: `-m' or `--architecture'
-
- 2. deduced from the input file
-
-`objcopy', `nm', `size', `strings' Architecture
------------------------------------------------
-
-Ways to specify:
-
- 1. deduced from the input file
-
-
-File: binutils.info, Node: Reporting Bugs, Next: GNU Free Documentation License, Prev: Selecting the Target System, Up: Top
-
-19 Reporting Bugs
-*****************
-
-Your bug reports play an essential role in making the binary utilities
-reliable.
-
- Reporting a bug may help you by bringing a solution to your problem,
-or it may not. But in any case the principal function of a bug report
-is to help the entire community by making the next version of the binary
-utilities work better. Bug reports are your contribution to their
-maintenance.
-
- In order for a bug report to serve its purpose, you must include the
-information that enables us to fix the bug.
-
-* Menu:
-
-* Bug Criteria:: Have you found a bug?
-* Bug Reporting:: How to report bugs
-
-
-File: binutils.info, Node: Bug Criteria, Next: Bug Reporting, Up: Reporting Bugs
-
-19.1 Have You Found a Bug?
-==========================
-
-If you are not sure whether you have found a bug, here are some
-guidelines:
-
- * If a binary utility gets a fatal signal, for any input whatever,
- that is a bug. Reliable utilities never crash.
-
- * If a binary utility produces an error message for valid input,
- that is a bug.
-
- * If you are an experienced user of binary utilities, your
- suggestions for improvement are welcome in any case.
-
-
-File: binutils.info, Node: Bug Reporting, Prev: Bug Criteria, Up: Reporting Bugs
-
-19.2 How to Report Bugs
-=======================
-
-A number of companies and individuals offer support for GNU products.
-If you obtained the binary utilities from a support organization, we
-recommend you contact that organization first.
-
- You can find contact information for many support companies and
-individuals in the file `etc/SERVICE' in the GNU Emacs distribution.
-
- In any event, we also recommend that you send bug reports for the
-binary utilities to `http://www.sourceware.org/bugzilla/'.
-
- The fundamental principle of reporting bugs usefully is this:
-*report all the facts*. If you are not sure whether to state a fact or
-leave it out, state it!
-
- Often people omit facts because they think they know what causes the
-problem and assume that some details do not matter. Thus, you might
-assume that the name of a file you use in an example does not matter.
-Well, probably it does not, but one cannot be sure. Perhaps the bug is
-a stray memory reference which happens to fetch from the location where
-that pathname is stored in memory; perhaps, if the pathname were
-different, the contents of that location would fool the utility into
-doing the right thing despite the bug. Play it safe and give a
-specific, complete example. That is the easiest thing for you to do,
-and the most helpful.
-
- Keep in mind that the purpose of a bug report is to enable us to fix
-the bug if it is new to us. Therefore, always write your bug reports
-on the assumption that the bug has not been reported previously.
-
- Sometimes people give a few sketchy facts and ask, "Does this ring a
-bell?" This cannot help us fix a bug, so it is basically useless. We
-respond by asking for enough details to enable us to investigate. You
-might as well expedite matters by sending them to begin with.
-
- To enable us to fix the bug, you should include all these things:
-
- * The version of the utility. Each utility announces it if you
- start it with the `--version' argument.
-
- Without this, we will not know whether there is any point in
- looking for the bug in the current version of the binary utilities.
-
- * Any patches you may have applied to the source, including any
- patches made to the `BFD' library.
-
- * The type of machine you are using, and the operating system name
- and version number.
-
- * What compiler (and its version) was used to compile the
- utilities--e.g. "`gcc-2.7'".
-
- * The command arguments you gave the utility to observe the bug. To
- guarantee you will not omit something important, list them all. A
- copy of the Makefile (or the output from make) is sufficient.
-
- If we were to try to guess the arguments, we would probably guess
- wrong and then we might not encounter the bug.
-
- * A complete input file, or set of input files, that will reproduce
- the bug. If the utility is reading an object file or files, then
- it is generally most helpful to send the actual object files.
-
- If the source files were produced exclusively using GNU programs
- (e.g., `gcc', `gas', and/or the GNU `ld'), then it may be OK to
- send the source files rather than the object files. In this case,
- be sure to say exactly what version of `gcc', or whatever, was
- used to produce the object files. Also say how `gcc', or
- whatever, was configured.
-
- * A description of what behavior you observe that you believe is
- incorrect. For example, "It gets a fatal signal."
-
- Of course, if the bug is that the utility gets a fatal signal,
- then we will certainly notice it. But if the bug is incorrect
- output, we might not notice unless it is glaringly wrong. You
- might as well not give us a chance to make a mistake.
-
- Even if the problem you experience is a fatal signal, you should
- still say so explicitly. Suppose something strange is going on,
- such as your copy of the utility is out of sync, or you have
- encountered a bug in the C library on your system. (This has
- happened!) Your copy might crash and ours would not. If you told
- us to expect a crash, then when ours fails to crash, we would know
- that the bug was not happening for us. If you had not told us to
- expect a crash, then we would not be able to draw any conclusion
- from our observations.
-
- * If you wish to suggest changes to the source, send us context
- diffs, as generated by `diff' with the `-u', `-c', or `-p' option.
- Always send diffs from the old file to the new file. If you wish
- to discuss something in the `ld' source, refer to it by context,
- not by line number.
-
- The line numbers in our development sources will not match those
- in your sources. Your line numbers would convey no useful
- information to us.
-
- Here are some things that are not necessary:
-
- * A description of the envelope of the bug.
-
- Often people who encounter a bug spend a lot of time investigating
- which changes to the input file will make the bug go away and which
- changes will not affect it.
-
- This is often time consuming and not very useful, because the way
- we will find the bug is by running a single example under the
- debugger with breakpoints, not by pure deduction from a series of
- examples. We recommend that you save your time for something else.
-
- Of course, if you can find a simpler example to report _instead_
- of the original one, that is a convenience for us. Errors in the
- output will be easier to spot, running under the debugger will take
- less time, and so on.
-
- However, simplification is not vital; if you do not want to do
- this, report the bug anyway and send us the entire test case you
- used.
-
- * A patch for the bug.
-
- A patch for the bug does help us if it is a good one. But do not
- omit the necessary information, such as the test case, on the
- assumption that a patch is all we need. We might see problems
- with your patch and decide to fix the problem another way, or we
- might not understand it at all.
-
- Sometimes with programs as complicated as the binary utilities it
- is very hard to construct an example that will make the program
- follow a certain path through the code. If you do not send us the
- example, we will not be able to construct one, so we will not be
- able to verify that the bug is fixed.
-
- And if we cannot understand what bug you are trying to fix, or why
- your patch should be an improvement, we will not install it. A
- test case will help us to understand.
-
- * A guess about what the bug is or what it depends on.
-
- Such guesses are usually wrong. Even we cannot guess right about
- such things without first using the debugger to find the facts.
-
-
-File: binutils.info, Node: GNU Free Documentation License, Next: Binutils Index, Prev: Reporting Bugs, Up: Top
-
-Appendix A GNU Free Documentation License
-*****************************************
-
- Version 1.3, 3 November 2008
-
- Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
- `http://fsf.org/'
-
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- 0. PREAMBLE
-
- The purpose of this License is to make a manual, textbook, or other
- functional and useful document "free" in the sense of freedom: to
- assure everyone the effective freedom to copy and redistribute it,
- with or without modifying it, either commercially or
- noncommercially. Secondarily, this License preserves for the
- author and publisher a way to get credit for their work, while not
- being considered responsible for modifications made by others.
-
- This License is a kind of "copyleft", which means that derivative
- works of the document must themselves be free in the same sense.
- It complements the GNU General Public License, which is a copyleft
- license designed for free software.
-
- We have designed this License in order to use it for manuals for
- free software, because free software needs free documentation: a
- free program should come with manuals providing the same freedoms
- that the software does. But this License is not limited to
- software manuals; it can be used for any textual work, regardless
- of subject matter or whether it is published as a printed book.
- We recommend this License principally for works whose purpose is
- instruction or reference.
-
- 1. APPLICABILITY AND DEFINITIONS
-
- This License applies to any manual or other work, in any medium,
- that contains a notice placed by the copyright holder saying it
- can be distributed under the terms of this License. Such a notice
- grants a world-wide, royalty-free license, unlimited in duration,
- to use that work under the conditions stated herein. The
- "Document", below, refers to any such manual or work. Any member
- of the public is a licensee, and is addressed as "you". You
- accept the license if you copy, modify or distribute the work in a
- way requiring permission under copyright law.
-
- A "Modified Version" of the Document means any work containing the
- Document or a portion of it, either copied verbatim, or with
- modifications and/or translated into another language.
-
- A "Secondary Section" is a named appendix or a front-matter section
- of the Document that deals exclusively with the relationship of the
- publishers or authors of the Document to the Document's overall
- subject (or to related matters) and contains nothing that could
- fall directly within that overall subject. (Thus, if the Document
- is in part a textbook of mathematics, a Secondary Section may not
- explain any mathematics.) The relationship could be a matter of
- historical connection with the subject or with related matters, or
- of legal, commercial, philosophical, ethical or political position
- regarding them.
-
- The "Invariant Sections" are certain Secondary Sections whose
- titles are designated, as being those of Invariant Sections, in
- the notice that says that the Document is released under this
- License. If a section does not fit the above definition of
- Secondary then it is not allowed to be designated as Invariant.
- The Document may contain zero Invariant Sections. If the Document
- does not identify any Invariant Sections then there are none.
-
- The "Cover Texts" are certain short passages of text that are
- listed, as Front-Cover Texts or Back-Cover Texts, in the notice
- that says that the Document is released under this License. A
- Front-Cover Text may be at most 5 words, and a Back-Cover Text may
- be at most 25 words.
-
- A "Transparent" copy of the Document means a machine-readable copy,
- represented in a format whose specification is available to the
- general public, that is suitable for revising the document
- straightforwardly with generic text editors or (for images
- composed of pixels) generic paint programs or (for drawings) some
- widely available drawing editor, and that is suitable for input to
- text formatters or for automatic translation to a variety of
- formats suitable for input to text formatters. A copy made in an
- otherwise Transparent file format whose markup, or absence of
- markup, has been arranged to thwart or discourage subsequent
- modification by readers is not Transparent. An image format is
- not Transparent if used for any substantial amount of text. A
- copy that is not "Transparent" is called "Opaque".
-
- Examples of suitable formats for Transparent copies include plain
- ASCII without markup, Texinfo input format, LaTeX input format,
- SGML or XML using a publicly available DTD, and
- standard-conforming simple HTML, PostScript or PDF designed for
- human modification. Examples of transparent image formats include
- PNG, XCF and JPG. Opaque formats include proprietary formats that
- can be read and edited only by proprietary word processors, SGML or
- XML for which the DTD and/or processing tools are not generally
- available, and the machine-generated HTML, PostScript or PDF
- produced by some word processors for output purposes only.
-
- The "Title Page" means, for a printed book, the title page itself,
- plus such following pages as are needed to hold, legibly, the
- material this License requires to appear in the title page. For
- works in formats which do not have any title page as such, "Title
- Page" means the text near the most prominent appearance of the
- work's title, preceding the beginning of the body of the text.
-
- The "publisher" means any person or entity that distributes copies
- of the Document to the public.
-
- A section "Entitled XYZ" means a named subunit of the Document
- whose title either is precisely XYZ or contains XYZ in parentheses
- following text that translates XYZ in another language. (Here XYZ
- stands for a specific section name mentioned below, such as
- "Acknowledgements", "Dedications", "Endorsements", or "History".)
- To "Preserve the Title" of such a section when you modify the
- Document means that it remains a section "Entitled XYZ" according
- to this definition.
-
- The Document may include Warranty Disclaimers next to the notice
- which states that this License applies to the Document. These
- Warranty Disclaimers are considered to be included by reference in
- this License, but only as regards disclaiming warranties: any other
- implication that these Warranty Disclaimers may have is void and
- has no effect on the meaning of this License.
-
- 2. VERBATIM COPYING
-
- You may copy and distribute the Document in any medium, either
- commercially or noncommercially, provided that this License, the
- copyright notices, and the license notice saying this License
- applies to the Document are reproduced in all copies, and that you
- add no other conditions whatsoever to those of this License. You
- may not use technical measures to obstruct or control the reading
- or further copying of the copies you make or distribute. However,
- you may accept compensation in exchange for copies. If you
- distribute a large enough number of copies you must also follow
- the conditions in section 3.
-
- You may also lend copies, under the same conditions stated above,
- and you may publicly display copies.
-
- 3. COPYING IN QUANTITY
-
- If you publish printed copies (or copies in media that commonly
- have printed covers) of the Document, numbering more than 100, and
- the Document's license notice requires Cover Texts, you must
- enclose the copies in covers that carry, clearly and legibly, all
- these Cover Texts: Front-Cover Texts on the front cover, and
- Back-Cover Texts on the back cover. Both covers must also clearly
- and legibly identify you as the publisher of these copies. The
- front cover must present the full title with all words of the
- title equally prominent and visible. You may add other material
- on the covers in addition. Copying with changes limited to the
- covers, as long as they preserve the title of the Document and
- satisfy these conditions, can be treated as verbatim copying in
- other respects.
-
- If the required texts for either cover are too voluminous to fit
- legibly, you should put the first ones listed (as many as fit
- reasonably) on the actual cover, and continue the rest onto
- adjacent pages.
-
- If you publish or distribute Opaque copies of the Document
- numbering more than 100, you must either include a
- machine-readable Transparent copy along with each Opaque copy, or
- state in or with each Opaque copy a computer-network location from
- which the general network-using public has access to download
- using public-standard network protocols a complete Transparent
- copy of the Document, free of added material. If you use the
- latter option, you must take reasonably prudent steps, when you
- begin distribution of Opaque copies in quantity, to ensure that
- this Transparent copy will remain thus accessible at the stated
- location until at least one year after the last time you
- distribute an Opaque copy (directly or through your agents or
- retailers) of that edition to the public.
-
- It is requested, but not required, that you contact the authors of
- the Document well before redistributing any large number of
- copies, to give them a chance to provide you with an updated
- version of the Document.
-
- 4. MODIFICATIONS
-
- You may copy and distribute a Modified Version of the Document
- under the conditions of sections 2 and 3 above, provided that you
- release the Modified Version under precisely this License, with
- the Modified Version filling the role of the Document, thus
- licensing distribution and modification of the Modified Version to
- whoever possesses a copy of it. In addition, you must do these
- things in the Modified Version:
-
- A. Use in the Title Page (and on the covers, if any) a title
- distinct from that of the Document, and from those of
- previous versions (which should, if there were any, be listed
- in the History section of the Document). You may use the
- same title as a previous version if the original publisher of
- that version gives permission.
-
- B. List on the Title Page, as authors, one or more persons or
- entities responsible for authorship of the modifications in
- the Modified Version, together with at least five of the
- principal authors of the Document (all of its principal
- authors, if it has fewer than five), unless they release you
- from this requirement.
-
- C. State on the Title page the name of the publisher of the
- Modified Version, as the publisher.
-
- D. Preserve all the copyright notices of the Document.
-
- E. Add an appropriate copyright notice for your modifications
- adjacent to the other copyright notices.
-
- F. Include, immediately after the copyright notices, a license
- notice giving the public permission to use the Modified
- Version under the terms of this License, in the form shown in
- the Addendum below.
-
- G. Preserve in that license notice the full lists of Invariant
- Sections and required Cover Texts given in the Document's
- license notice.
-
- H. Include an unaltered copy of this License.
-
- I. Preserve the section Entitled "History", Preserve its Title,
- and add to it an item stating at least the title, year, new
- authors, and publisher of the Modified Version as given on
- the Title Page. If there is no section Entitled "History" in
- the Document, create one stating the title, year, authors,
- and publisher of the Document as given on its Title Page,
- then add an item describing the Modified Version as stated in
- the previous sentence.
-
- J. Preserve the network location, if any, given in the Document
- for public access to a Transparent copy of the Document, and
- likewise the network locations given in the Document for
- previous versions it was based on. These may be placed in
- the "History" section. You may omit a network location for a
- work that was published at least four years before the
- Document itself, or if the original publisher of the version
- it refers to gives permission.
-
- K. For any section Entitled "Acknowledgements" or "Dedications",
- Preserve the Title of the section, and preserve in the
- section all the substance and tone of each of the contributor
- acknowledgements and/or dedications given therein.
-
- L. Preserve all the Invariant Sections of the Document,
- unaltered in their text and in their titles. Section numbers
- or the equivalent are not considered part of the section
- titles.
-
- M. Delete any section Entitled "Endorsements". Such a section
- may not be included in the Modified Version.
-
- N. Do not retitle any existing section to be Entitled
- "Endorsements" or to conflict in title with any Invariant
- Section.
-
- O. Preserve any Warranty Disclaimers.
-
- If the Modified Version includes new front-matter sections or
- appendices that qualify as Secondary Sections and contain no
- material copied from the Document, you may at your option
- designate some or all of these sections as invariant. To do this,
- add their titles to the list of Invariant Sections in the Modified
- Version's license notice. These titles must be distinct from any
- other section titles.
-
- You may add a section Entitled "Endorsements", provided it contains
- nothing but endorsements of your Modified Version by various
- parties--for example, statements of peer review or that the text
- has been approved by an organization as the authoritative
- definition of a standard.
-
- You may add a passage of up to five words as a Front-Cover Text,
- and a passage of up to 25 words as a Back-Cover Text, to the end
- of the list of Cover Texts in the Modified Version. Only one
- passage of Front-Cover Text and one of Back-Cover Text may be
- added by (or through arrangements made by) any one entity. If the
- Document already includes a cover text for the same cover,
- previously added by you or by arrangement made by the same entity
- you are acting on behalf of, you may not add another; but you may
- replace the old one, on explicit permission from the previous
- publisher that added the old one.
-
- The author(s) and publisher(s) of the Document do not by this
- License give permission to use their names for publicity for or to
- assert or imply endorsement of any Modified Version.
-
- 5. COMBINING DOCUMENTS
-
- You may combine the Document with other documents released under
- this License, under the terms defined in section 4 above for
- modified versions, provided that you include in the combination
- all of the Invariant Sections of all of the original documents,
- unmodified, and list them all as Invariant Sections of your
- combined work in its license notice, and that you preserve all
- their Warranty Disclaimers.
-
- The combined work need only contain one copy of this License, and
- multiple identical Invariant Sections may be replaced with a single
- copy. If there are multiple Invariant Sections with the same name
- but different contents, make the title of each such section unique
- by adding at the end of it, in parentheses, the name of the
- original author or publisher of that section if known, or else a
- unique number. Make the same adjustment to the section titles in
- the list of Invariant Sections in the license notice of the
- combined work.
-
- In the combination, you must combine any sections Entitled
- "History" in the various original documents, forming one section
- Entitled "History"; likewise combine any sections Entitled
- "Acknowledgements", and any sections Entitled "Dedications". You
- must delete all sections Entitled "Endorsements."
-
- 6. COLLECTIONS OF DOCUMENTS
-
- You may make a collection consisting of the Document and other
- documents released under this License, and replace the individual
- copies of this License in the various documents with a single copy
- that is included in the collection, provided that you follow the
- rules of this License for verbatim copying of each of the
- documents in all other respects.
-
- You may extract a single document from such a collection, and
- distribute it individually under this License, provided you insert
- a copy of this License into the extracted document, and follow
- this License in all other respects regarding verbatim copying of
- that document.
-
- 7. AGGREGATION WITH INDEPENDENT WORKS
-
- A compilation of the Document or its derivatives with other
- separate and independent documents or works, in or on a volume of
- a storage or distribution medium, is called an "aggregate" if the
- copyright resulting from the compilation is not used to limit the
- legal rights of the compilation's users beyond what the individual
- works permit. When the Document is included in an aggregate, this
- License does not apply to the other works in the aggregate which
- are not themselves derivative works of the Document.
-
- If the Cover Text requirement of section 3 is applicable to these
- copies of the Document, then if the Document is less than one half
- of the entire aggregate, the Document's Cover Texts may be placed
- on covers that bracket the Document within the aggregate, or the
- electronic equivalent of covers if the Document is in electronic
- form. Otherwise they must appear on printed covers that bracket
- the whole aggregate.
-
- 8. TRANSLATION
-
- Translation is considered a kind of modification, so you may
- distribute translations of the Document under the terms of section
- 4. Replacing Invariant Sections with translations requires special
- permission from their copyright holders, but you may include
- translations of some or all Invariant Sections in addition to the
- original versions of these Invariant Sections. You may include a
- translation of this License, and all the license notices in the
- Document, and any Warranty Disclaimers, provided that you also
- include the original English version of this License and the
- original versions of those notices and disclaimers. In case of a
- disagreement between the translation and the original version of
- this License or a notice or disclaimer, the original version will
- prevail.
-
- If a section in the Document is Entitled "Acknowledgements",
- "Dedications", or "History", the requirement (section 4) to
- Preserve its Title (section 1) will typically require changing the
- actual title.
-
- 9. TERMINATION
-
- You may not copy, modify, sublicense, or distribute the Document
- except as expressly provided under this License. Any attempt
- otherwise to copy, modify, sublicense, or distribute it is void,
- and will automatically terminate your rights under this License.
-
- However, if you cease all violation of this License, then your
- license from a particular copyright holder is reinstated (a)
- provisionally, unless and until the copyright holder explicitly
- and finally terminates your license, and (b) permanently, if the
- copyright holder fails to notify you of the violation by some
- reasonable means prior to 60 days after the cessation.
-
- Moreover, your license from a particular copyright holder is
- reinstated permanently if the copyright holder notifies you of the
- violation by some reasonable means, this is the first time you have
- received notice of violation of this License (for any work) from
- that copyright holder, and you cure the violation prior to 30 days
- after your receipt of the notice.
-
- Termination of your rights under this section does not terminate
- the licenses of parties who have received copies or rights from
- you under this License. If your rights have been terminated and
- not permanently reinstated, receipt of a copy of some or all of
- the same material does not give you any rights to use it.
-
- 10. FUTURE REVISIONS OF THIS LICENSE
-
- The Free Software Foundation may publish new, revised versions of
- the GNU Free Documentation License from time to time. Such new
- versions will be similar in spirit to the present version, but may
- differ in detail to address new problems or concerns. See
- `http://www.gnu.org/copyleft/'.
-
- Each version of the License is given a distinguishing version
- number. If the Document specifies that a particular numbered
- version of this License "or any later version" applies to it, you
- have the option of following the terms and conditions either of
- that specified version or of any later version that has been
- published (not as a draft) by the Free Software Foundation. If
- the Document does not specify a version number of this License,
- you may choose any version ever published (not as a draft) by the
- Free Software Foundation. If the Document specifies that a proxy
- can decide which future versions of this License can be used, that
- proxy's public statement of acceptance of a version permanently
- authorizes you to choose that version for the Document.
-
- 11. RELICENSING
-
- "Massive Multiauthor Collaboration Site" (or "MMC Site") means any
- World Wide Web server that publishes copyrightable works and also
- provides prominent facilities for anybody to edit those works. A
- public wiki that anybody can edit is an example of such a server.
- A "Massive Multiauthor Collaboration" (or "MMC") contained in the
- site means any set of copyrightable works thus published on the MMC
- site.
-
- "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
- license published by Creative Commons Corporation, a not-for-profit
- corporation with a principal place of business in San Francisco,
- California, as well as future copyleft versions of that license
- published by that same organization.
-
- "Incorporate" means to publish or republish a Document, in whole or
- in part, as part of another Document.
-
- An MMC is "eligible for relicensing" if it is licensed under this
- License, and if all works that were first published under this
- License somewhere other than this MMC, and subsequently
- incorporated in whole or in part into the MMC, (1) had no cover
- texts or invariant sections, and (2) were thus incorporated prior
- to November 1, 2008.
-
- The operator of an MMC Site may republish an MMC contained in the
- site under CC-BY-SA on the same site at any time before August 1,
- 2009, provided the MMC is eligible for relicensing.
-
-
-ADDENDUM: How to use this License for your documents
-====================================================
-
-To use this License in a document you have written, include a copy of
-the License in the document and put the following copyright and license
-notices just after the title page:
-
- Copyright (C) YEAR YOUR NAME.
- Permission is granted to copy, distribute and/or modify this document
- under the terms of the GNU Free Documentation License, Version 1.3
- or any later version published by the Free Software Foundation;
- with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
- Texts. A copy of the license is included in the section entitled ``GNU
- Free Documentation License''.
-
- If you have Invariant Sections, Front-Cover Texts and Back-Cover
-Texts, replace the "with...Texts." line with this:
-
- with the Invariant Sections being LIST THEIR TITLES, with
- the Front-Cover Texts being LIST, and with the Back-Cover Texts
- being LIST.
-
- If you have Invariant Sections without Cover Texts, or some other
-combination of the three, merge those two alternatives to suit the
-situation.
-
- If your document contains nontrivial examples of program code, we
-recommend releasing these examples in parallel under your choice of
-free software license, such as the GNU General Public License, to
-permit their use in free software.
-
-
-File: binutils.info, Node: Binutils Index, Prev: GNU Free Documentation License, Up: Top
-
-Binutils Index
-**************
-
- [index ]
-* Menu:
-
-* --enable-deterministic-archives <1>: objcopy. (line 302)
-* --enable-deterministic-archives <2>: ranlib. (line 44)
-* --enable-deterministic-archives <3>: ar cmdline. (line 151)
-* --enable-deterministic-archives <4>: strip. (line 115)
-* --enable-deterministic-archives <5>: ar cmdline. (line 224)
-* --enable-deterministic-archives: objcopy. (line 292)
-* .stab: objdump. (line 413)
-* Add prefix to absolute paths: objdump. (line 356)
-* addr2line: addr2line. (line 6)
-* address to file name and line number: addr2line. (line 6)
-* all header information, object file: objdump. (line 531)
-* ar: ar. (line 6)
-* ar compatibility: ar. (line 60)
-* architecture: objdump. (line 197)
-* architectures available: objdump. (line 182)
-* archive contents: ranlib. (line 6)
-* Archive file symbol index information: readelf. (line 155)
-* archive headers: objdump. (line 67)
-* archives: ar. (line 6)
-* base files: dlltool. (line 124)
-* bug criteria: Bug Criteria. (line 6)
-* bug reports: Bug Reporting. (line 6)
-* bugs: Reporting Bugs. (line 6)
-* bugs, reporting: Bug Reporting. (line 6)
-* c++filt: c++filt. (line 6)
-* changing object addresses: objcopy. (line 337)
-* changing section address: objcopy. (line 347)
-* changing section LMA: objcopy. (line 356)
-* changing section VMA: objcopy. (line 369)
-* changing start address: objcopy. (line 332)
-* collections of files: ar. (line 6)
-* compatibility, ar: ar. (line 60)
-* contents of archive: ar cmdline. (line 97)
-* crash: Bug Criteria. (line 9)
-* creating archives: ar cmdline. (line 145)
-* creating thin archive: ar cmdline. (line 210)
-* cxxfilt: c++filt. (line 14)
-* dates in archive: ar cmdline. (line 184)
-* debug symbols: objdump. (line 413)
-* debugging symbols: nm. (line 147)
-* deleting from archive: ar cmdline. (line 26)
-* demangling C++ symbols: c++filt. (line 6)
-* demangling in nm: nm. (line 155)
-* demangling in objdump <1>: objdump. (line 95)
-* demangling in objdump: addr2line. (line 78)
-* deterministic archives <1>: ranlib. (line 32)
-* deterministic archives <2>: objcopy. (line 292)
-* deterministic archives <3>: ar cmdline. (line 224)
-* deterministic archives <4>: strip. (line 105)
-* deterministic archives <5>: ar cmdline. (line 151)
-* deterministic archives <6>: ranlib. (line 44)
-* deterministic archives: objcopy. (line 302)
-* disassembling object code: objdump. (line 117)
-* disassembly architecture: objdump. (line 197)
-* disassembly endianness: objdump. (line 137)
-* disassembly, with source: objdump. (line 352)
-* discarding symbols: strip. (line 6)
-* DLL: dlltool. (line 6)
-* dlltool: dlltool. (line 6)
-* DWARF: objdump. (line 378)
-* dynamic relocation entries, in object file: objdump. (line 340)
-* dynamic symbol table entries, printing: objdump. (line 515)
-* dynamic symbols: nm. (line 167)
-* ELF dynamic section information: readelf. (line 113)
-* ELF dynamic symbol table information: readelf. (line 88)
-* ELF file header information: readelf. (line 57)
-* ELF file information: readelf. (line 6)
-* ELF notes: readelf. (line 97)
-* ELF object file format: objdump. (line 413)
-* ELF program header information: readelf. (line 63)
-* ELF reloc information: readelf. (line 101)
-* ELF section group information: readelf. (line 74)
-* ELF section information: readelf. (line 79)
-* ELF segment information: readelf. (line 63)
-* ELF symbol table information: readelf. (line 84)
-* ELF version sections information: readelf. (line 117)
-* elfedit: elfedit. (line 6)
-* endianness: objdump. (line 137)
-* error on valid input: Bug Criteria. (line 12)
-* external symbols: nm. (line 179)
-* extract from archive: ar cmdline. (line 112)
-* fatal signal: Bug Criteria. (line 9)
-* file name: nm. (line 141)
-* header information, all: objdump. (line 531)
-* input .def file: dlltool. (line 120)
-* input file name: nm. (line 141)
-* Instruction width: objdump. (line 373)
-* libraries: ar. (line 25)
-* listings strings: strings. (line 6)
-* load plugin: nm. (line 252)
-* machine instructions: objdump. (line 117)
-* moving in archive: ar cmdline. (line 34)
-* MRI compatibility, ar: ar scripts. (line 8)
-* name duplication in archive: ar cmdline. (line 106)
-* name length: ar. (line 18)
-* nm: nm. (line 6)
-* nm compatibility: nm. (line 173)
-* nm format: nm. (line 173)
-* not writing archive index: ar cmdline. (line 203)
-* objdump: objdump. (line 6)
-* object code format <1>: strings. (line 67)
-* object code format <2>: nm. (line 278)
-* object code format <3>: addr2line. (line 73)
-* object code format <4>: objdump. (line 81)
-* object code format: size. (line 84)
-* object file header: objdump. (line 143)
-* object file information: objdump. (line 6)
-* object file offsets: objdump. (line 148)
-* object file sections: objdump. (line 347)
-* object formats available: objdump. (line 182)
-* operations on archive: ar cmdline. (line 22)
-* printing from archive: ar cmdline. (line 46)
-* printing strings: strings. (line 6)
-* quick append to archive: ar cmdline. (line 54)
-* radix for section sizes: size. (line 66)
-* ranlib <1>: ranlib. (line 6)
-* ranlib: ar cmdline. (line 91)
-* readelf: readelf. (line 6)
-* relative placement in archive: ar cmdline. (line 133)
-* relocation entries, in object file: objdump. (line 334)
-* removing symbols: strip. (line 6)
-* repeated names in archive: ar cmdline. (line 106)
-* replacement in archive: ar cmdline. (line 73)
-* reporting bugs: Reporting Bugs. (line 6)
-* scripts, ar: ar scripts. (line 8)
-* section addresses in objdump: objdump. (line 73)
-* section headers: objdump. (line 164)
-* section information: objdump. (line 187)
-* section sizes: size. (line 6)
-* sections, full contents: objdump. (line 347)
-* size: size. (line 6)
-* size display format: size. (line 27)
-* size number format: size. (line 66)
-* sorting symbols: nm. (line 202)
-* source code context: objdump. (line 157)
-* source disassembly: objdump. (line 352)
-* source file name: nm. (line 141)
-* source filenames for object files: objdump. (line 191)
-* stab: objdump. (line 413)
-* start-address: objdump. (line 422)
-* stop-address: objdump. (line 426)
-* strings: strings. (line 6)
-* strings, printing: strings. (line 6)
-* strip: strip. (line 6)
-* Strip absolute paths: objdump. (line 359)
-* symbol index <1>: ar. (line 28)
-* symbol index: ranlib. (line 6)
-* symbol index, listing: nm. (line 224)
-* symbol line numbers: nm. (line 187)
-* symbol table entries, printing: objdump. (line 431)
-* symbols: nm. (line 6)
-* symbols, discarding: strip. (line 6)
-* thin archives: ar. (line 40)
-* undefined symbols: nm. (line 235)
-* Unix compatibility, ar: ar cmdline. (line 8)
-* unwind information: readelf. (line 106)
-* Update ELF header: elfedit. (line 6)
-* updating an archive: ar cmdline. (line 215)
-* version: Top. (line 6)
-* VMA in objdump: objdump. (line 73)
-* wide output, printing: objdump. (line 537)
-* writing archive index: ar cmdline. (line 197)
-
-
-
-Tag Table:
-Node: Top1896
-Node: ar3609
-Node: ar cmdline6747
-Node: ar scripts17089
-Node: nm22777
-Node: objcopy32671
-Node: objdump64440
-Node: ranlib86571
-Node: size88176
-Node: strings91180
-Node: strip93638
-Node: c++filt100870
-Ref: c++filt-Footnote-1105711
-Node: addr2line105817
-Node: nlmconv110154
-Node: windmc112759
-Node: windres116408
-Node: dlltool122769
-Node: def file format135649
-Node: readelf138188
-Node: elfedit145743
-Node: Common Options147997
-Node: Selecting the Target System149037
-Node: Target Selection149969
-Node: Architecture Selection151951
-Node: Reporting Bugs152779
-Node: Bug Criteria153558
-Node: Bug Reporting154111
-Node: GNU Free Documentation License160981
-Node: Binutils Index186160
-
-End Tag Table
diff -Nur binutils-2.24.orig/binutils/doc/cxxfilt.man binutils-2.24/binutils/doc/cxxfilt.man
--- binutils-2.24.orig/binutils/doc/cxxfilt.man 2013-11-18 09:49:32.000000000 +0100
+++ binutils-2.24/binutils/doc/cxxfilt.man 1970-01-01 01:00:00.000000000 +0100
@@ -1,336 +0,0 @@
-.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings. \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote. \*(C+ will
-.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-. ds -- \(*W-
-. ds PI pi
-. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
-. ds L" ""
-. ds R" ""
-. ds C` ""
-. ds C' ""
-'br\}
-.el\{\
-. ds -- \|\(em\|
-. ds PI \(*p
-. ds L" ``
-. ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD. Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-. de IX
-. tm Index:\\$1\t\\n%\t"\\$2"
-..
-. nr % 0
-. rr F
-.\}
-.el \{\
-. de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear. Run. Save yourself. No user-serviceable parts.
-. \" fudge factors for nroff and troff
-.if n \{\
-. ds #H 0
-. ds #V .8m
-. ds #F .3m
-. ds #[ \f1
-. ds #] \fP
-.\}
-.if t \{\
-. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-. ds #V .6m
-. ds #F 0
-. ds #[ \&
-. ds #] \&
-.\}
-. \" simple accents for nroff and troff
-.if n \{\
-. ds ' \&
-. ds ` \&
-. ds ^ \&
-. ds , \&
-. ds ~ ~
-. ds /
-.\}
-.if t \{\
-. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-. \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-. \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-. \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-. ds : e
-. ds 8 ss
-. ds o a
-. ds d- d\h'-1'\(ga
-. ds D- D\h'-1'\(hy
-. ds th \o'bp'
-. ds Th \o'LP'
-. ds ae ae
-. ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "C++FILT 1"
-.TH C++FILT 1 "2013-11-18" "binutils-2.23.91" "GNU Development Tools"
-.\" For nroff, turn off justification. Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-cxxfilt \- Demangle C++ and Java symbols.
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-c++filt [\fB\-_\fR|\fB\-\-strip\-underscore\fR]
- [\fB\-n\fR|\fB\-\-no\-strip\-underscore\fR]
- [\fB\-p\fR|\fB\-\-no\-params\fR]
- [\fB\-t\fR|\fB\-\-types\fR]
- [\fB\-i\fR|\fB\-\-no\-verbose\fR]
- [\fB\-s\fR \fIformat\fR|\fB\-\-format=\fR\fIformat\fR]
- [\fB\-\-help\fR] [\fB\-\-version\fR] [\fIsymbol\fR...]
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-The \*(C+ and Java languages provide function overloading, which means
-that you can write many functions with the same name, providing that
-each function takes parameters of different types. In order to be
-able to distinguish these similarly named functions \*(C+ and Java
-encode them into a low-level assembler name which uniquely identifies
-each different version. This process is known as \fImangling\fR. The
-\&\fBc++filt\fR
-[1]
-program does the inverse mapping: it decodes (\fIdemangles\fR) low-level
-names into user-level names so that they can be read.
-.PP
-Every alphanumeric word (consisting of letters, digits, underscores,
-dollars, or periods) seen in the input is a potential mangled name.
-If the name decodes into a \*(C+ name, the \*(C+ name replaces the
-low-level name in the output, otherwise the original word is output.
-In this way you can pass an entire assembler source file, containing
-mangled names, through \fBc++filt\fR and see the same source file
-containing demangled names.
-.PP
-You can also use \fBc++filt\fR to decipher individual symbols by
-passing them on the command line:
-.PP
-.Vb 1
-\& c++filt
-.Ve
-.PP
-If no \fIsymbol\fR arguments are given, \fBc++filt\fR reads symbol
-names from the standard input instead. All the results are printed on
-the standard output. The difference between reading names from the
-command line versus reading names from the standard input is that
-command line arguments are expected to be just mangled names and no
-checking is performed to separate them from surrounding text. Thus
-for example:
-.PP
-.Vb 1
-\& c++filt \-n _Z1fv
-.Ve
-.PP
-will work and demangle the name to \*(L"f()\*(R" whereas:
-.PP
-.Vb 1
-\& c++filt \-n _Z1fv,
-.Ve
-.PP
-will not work. (Note the extra comma at the end of the mangled
-name which makes it invalid). This command however will work:
-.PP
-.Vb 1
-\& echo _Z1fv, | c++filt \-n
-.Ve
-.PP
-and will display \*(L"f(),\*(R", i.e., the demangled name followed by a
-trailing comma. This behaviour is because when the names are read
-from the standard input it is expected that they might be part of an
-assembler source file where there might be extra, extraneous
-characters trailing after a mangled name. For example:
-.PP
-.Vb 1
-\& .type _Z1fv, @function
-.Ve
-.SH "OPTIONS"
-.IX Header "OPTIONS"
-.IP "\fB\-_\fR" 4
-.IX Item "-_"
-.PD 0
-.IP "\fB\-\-strip\-underscore\fR" 4
-.IX Item "--strip-underscore"
-.PD
-On some systems, both the C and \*(C+ compilers put an underscore in front
-of every name. For example, the C name \f(CW\*(C`foo\*(C'\fR gets the low-level
-name \f(CW\*(C`_foo\*(C'\fR. This option removes the initial underscore. Whether
-\&\fBc++filt\fR removes the underscore by default is target dependent.
-.IP "\fB\-n\fR" 4
-.IX Item "-n"
-.PD 0
-.IP "\fB\-\-no\-strip\-underscore\fR" 4
-.IX Item "--no-strip-underscore"
-.PD
-Do not remove the initial underscore.
-.IP "\fB\-p\fR" 4
-.IX Item "-p"
-.PD 0
-.IP "\fB\-\-no\-params\fR" 4
-.IX Item "--no-params"
-.PD
-When demangling the name of a function, do not display the types of
-the function's parameters.
-.IP "\fB\-t\fR" 4
-.IX Item "-t"
-.PD 0
-.IP "\fB\-\-types\fR" 4
-.IX Item "--types"
-.PD
-Attempt to demangle types as well as function names. This is disabled
-by default since mangled types are normally only used internally in
-the compiler, and they can be confused with non-mangled names. For example,
-a function called \*(L"a\*(R" treated as a mangled type name would be
-demangled to \*(L"signed char\*(R".
-.IP "\fB\-i\fR" 4
-.IX Item "-i"
-.PD 0
-.IP "\fB\-\-no\-verbose\fR" 4
-.IX Item "--no-verbose"
-.PD
-Do not include implementation details (if any) in the demangled
-output.
-.IP "\fB\-s\fR \fIformat\fR" 4
-.IX Item "-s format"
-.PD 0
-.IP "\fB\-\-format=\fR\fIformat\fR" 4
-.IX Item "--format=format"
-.PD
-\&\fBc++filt\fR can decode various methods of mangling, used by
-different compilers. The argument to this option selects which
-method it uses:
-.RS 4
-.ie n .IP """auto""" 4
-.el .IP "\f(CWauto\fR" 4
-.IX Item "auto"
-Automatic selection based on executable (the default method)
-.ie n .IP """gnu""" 4
-.el .IP "\f(CWgnu\fR" 4
-.IX Item "gnu"
-the one used by the \s-1GNU\s0 \*(C+ compiler (g++)
-.ie n .IP """lucid""" 4
-.el .IP "\f(CWlucid\fR" 4
-.IX Item "lucid"
-the one used by the Lucid compiler (lcc)
-.ie n .IP """arm""" 4
-.el .IP "\f(CWarm\fR" 4
-.IX Item "arm"
-the one specified by the \*(C+ Annotated Reference Manual
-.ie n .IP """hp""" 4
-.el .IP "\f(CWhp\fR" 4
-.IX Item "hp"
-the one used by the \s-1HP\s0 compiler (aCC)
-.ie n .IP """edg""" 4
-.el .IP "\f(CWedg\fR" 4
-.IX Item "edg"
-the one used by the \s-1EDG\s0 compiler
-.ie n .IP """gnu\-v3""" 4
-.el .IP "\f(CWgnu\-v3\fR" 4
-.IX Item "gnu-v3"
-the one used by the \s-1GNU\s0 \*(C+ compiler (g++) with the V3 \s-1ABI\s0.
-.ie n .IP """java""" 4
-.el .IP "\f(CWjava\fR" 4
-.IX Item "java"
-the one used by the \s-1GNU\s0 Java compiler (gcj)
-.ie n .IP """gnat""" 4
-.el .IP "\f(CWgnat\fR" 4
-.IX Item "gnat"
-the one used by the \s-1GNU\s0 Ada compiler (\s-1GNAT\s0).
-.RE
-.RS 4
-.RE
-.IP "\fB\-\-help\fR" 4
-.IX Item "--help"
-Print a summary of the options to \fBc++filt\fR and exit.
-.IP "\fB\-\-version\fR" 4
-.IX Item "--version"
-Print the version number of \fBc++filt\fR and exit.
-.IP "\fB@\fR\fIfile\fR" 4
-.IX Item "@file"
-Read command-line options from \fIfile\fR. The options read are
-inserted in place of the original @\fIfile\fR option. If \fIfile\fR
-does not exist, or cannot be read, then the option will be treated
-literally, and not removed.
-.Sp
-Options in \fIfile\fR are separated by whitespace. A whitespace
-character may be included in an option by surrounding the entire
-option in either single or double quotes. Any character (including a
-backslash) may be included by prefixing the character to be included
-with a backslash. The \fIfile\fR may itself contain additional
-@\fIfile\fR options; any such options will be processed recursively.
-.SH "FOOTNOTES"
-.IX Header "FOOTNOTES"
-.IP "1." 4
-MS-DOS does not allow \f(CW\*(C`+\*(C'\fR characters in file names, so on
-MS-DOS this program is named \fB\s-1CXXFILT\s0\fR.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-the Info entries for \fIbinutils\fR.
-.SH "COPYRIGHT"
-.IX Header "COPYRIGHT"
-Copyright (c) 1991\-2013 Free Software Foundation, Inc.
-.PP
-Permission is granted to copy, distribute and/or modify this document
-under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.3
-or any later version published by the Free Software Foundation;
-with no Invariant Sections, with no Front-Cover Texts, and with no
-Back-Cover Texts. A copy of the license is included in the
-section entitled \*(L"\s-1GNU\s0 Free Documentation License\*(R".
diff -Nur binutils-2.24.orig/binutils/doc/dlltool.1 binutils-2.24/binutils/doc/dlltool.1
--- binutils-2.24.orig/binutils/doc/dlltool.1 2013-11-18 09:49:30.000000000 +0100
+++ binutils-2.24/binutils/doc/dlltool.1 1970-01-01 01:00:00.000000000 +0100
@@ -1,529 +0,0 @@
-.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings. \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote. \*(C+ will
-.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-. ds -- \(*W-
-. ds PI pi
-. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
-. ds L" ""
-. ds R" ""
-. ds C` ""
-. ds C' ""
-'br\}
-.el\{\
-. ds -- \|\(em\|
-. ds PI \(*p
-. ds L" ``
-. ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD. Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-. de IX
-. tm Index:\\$1\t\\n%\t"\\$2"
-..
-. nr % 0
-. rr F
-.\}
-.el \{\
-. de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear. Run. Save yourself. No user-serviceable parts.
-. \" fudge factors for nroff and troff
-.if n \{\
-. ds #H 0
-. ds #V .8m
-. ds #F .3m
-. ds #[ \f1
-. ds #] \fP
-.\}
-.if t \{\
-. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-. ds #V .6m
-. ds #F 0
-. ds #[ \&
-. ds #] \&
-.\}
-. \" simple accents for nroff and troff
-.if n \{\
-. ds ' \&
-. ds ` \&
-. ds ^ \&
-. ds , \&
-. ds ~ ~
-. ds /
-.\}
-.if t \{\
-. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-. \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-. \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-. \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-. ds : e
-. ds 8 ss
-. ds o a
-. ds d- d\h'-1'\(ga
-. ds D- D\h'-1'\(hy
-. ds th \o'bp'
-. ds Th \o'LP'
-. ds ae ae
-. ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "DLLTOOL 1"
-.TH DLLTOOL 1 "2013-11-18" "binutils-2.23.91" "GNU Development Tools"
-.\" For nroff, turn off justification. Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-dlltool \- Create files needed to build and use DLLs.
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-dlltool [\fB\-d\fR|\fB\-\-input\-def\fR \fIdef-file-name\fR]
- [\fB\-b\fR|\fB\-\-base\-file\fR \fIbase-file-name\fR]
- [\fB\-e\fR|\fB\-\-output\-exp\fR \fIexports-file-name\fR]
- [\fB\-z\fR|\fB\-\-output\-def\fR \fIdef-file-name\fR]
- [\fB\-l\fR|\fB\-\-output\-lib\fR \fIlibrary-file-name\fR]
- [\fB\-y\fR|\fB\-\-output\-delaylib\fR \fIlibrary-file-name\fR]
- [\fB\-\-export\-all\-symbols\fR] [\fB\-\-no\-export\-all\-symbols\fR]
- [\fB\-\-exclude\-symbols\fR \fIlist\fR]
- [\fB\-\-no\-default\-excludes\fR]
- [\fB\-S\fR|\fB\-\-as\fR \fIpath-to-assembler\fR] [\fB\-f\fR|\fB\-\-as\-flags\fR \fIoptions\fR]
- [\fB\-D\fR|\fB\-\-dllname\fR \fIname\fR] [\fB\-m\fR|\fB\-\-machine\fR \fImachine\fR]
- [\fB\-a\fR|\fB\-\-add\-indirect\fR]
- [\fB\-U\fR|\fB\-\-add\-underscore\fR] [\fB\-\-add\-stdcall\-underscore\fR]
- [\fB\-k\fR|\fB\-\-kill\-at\fR] [\fB\-A\fR|\fB\-\-add\-stdcall\-alias\fR]
- [\fB\-p\fR|\fB\-\-ext\-prefix\-alias\fR \fIprefix\fR]
- [\fB\-x\fR|\fB\-\-no\-idata4\fR] [\fB\-c\fR|\fB\-\-no\-idata5\fR]
- [\fB\-\-use\-nul\-prefixed\-import\-tables\fR]
- [\fB\-I\fR|\fB\-\-identify\fR \fIlibrary-file-name\fR] [\fB\-\-identify\-strict\fR]
- [\fB\-i\fR|\fB\-\-interwork\fR]
- [\fB\-n\fR|\fB\-\-nodelete\fR] [\fB\-t\fR|\fB\-\-temp\-prefix\fR \fIprefix\fR]
- [\fB\-v\fR|\fB\-\-verbose\fR]
- [\fB\-h\fR|\fB\-\-help\fR] [\fB\-V\fR|\fB\-\-version\fR]
- [\fB\-\-no\-leading\-underscore\fR] [\fB\-\-leading\-underscore\fR]
- [object\-file ...]
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-\&\fBdlltool\fR reads its inputs, which can come from the \fB\-d\fR and
-\&\fB\-b\fR options as well as object files specified on the command
-line. It then processes these inputs and if the \fB\-e\fR option has
-been specified it creates a exports file. If the \fB\-l\fR option
-has been specified it creates a library file and if the \fB\-z\fR option
-has been specified it creates a def file. Any or all of the \fB\-e\fR,
-\&\fB\-l\fR and \fB\-z\fR options can be present in one invocation of
-dlltool.
-.PP
-When creating a \s-1DLL\s0, along with the source for the \s-1DLL\s0, it is necessary
-to have three other files. \fBdlltool\fR can help with the creation of
-these files.
-.PP
-The first file is a \fI.def\fR file which specifies which functions are
-exported from the \s-1DLL\s0, which functions the \s-1DLL\s0 imports, and so on. This
-is a text file and can be created by hand, or \fBdlltool\fR can be used
-to create it using the \fB\-z\fR option. In this case \fBdlltool\fR
-will scan the object files specified on its command line looking for
-those functions which have been specially marked as being exported and
-put entries for them in the \fI.def\fR file it creates.
-.PP
-In order to mark a function as being exported from a \s-1DLL\s0, it needs to
-have an \fB\-export:\fR entry in the \fB.drectve\fR
-section of the object file. This can be done in C by using the
-\&\fIasm()\fR operator:
-.PP
-.Vb 2
-\& asm (".section .drectve");
-\& asm (".ascii \e"\-export:my_func\e"");
-\&
-\& int my_func (void) { ... }
-.Ve
-.PP
-The second file needed for \s-1DLL\s0 creation is an exports file. This file
-is linked with the object files that make up the body of the \s-1DLL\s0 and it
-handles the interface between the \s-1DLL\s0 and the outside world. This is a
-binary file and it can be created by giving the \fB\-e\fR option to
-\&\fBdlltool\fR when it is creating or reading in a \fI.def\fR file.
-.PP
-The third file needed for \s-1DLL\s0 creation is the library file that programs
-will link with in order to access the functions in the \s-1DLL\s0 (an `import
-library'). This file can be created by giving the \fB\-l\fR option to
-dlltool when it is creating or reading in a \fI.def\fR file.
-.PP
-If the \fB\-y\fR option is specified, dlltool generates a delay-import
-library that can be used instead of the normal import library to allow
-a program to link to the dll only as soon as an imported function is
-called for the first time. The resulting executable will need to be
-linked to the static delayimp library containing _\|\fI_delayLoadHelper2()\fR,
-which in turn will import LoadLibraryA and GetProcAddress from kernel32.
-.PP
-\&\fBdlltool\fR builds the library file by hand, but it builds the
-exports file by creating temporary files containing assembler statements
-and then assembling these. The \fB\-S\fR command line option can be
-used to specify the path to the assembler that dlltool will use,
-and the \fB\-f\fR option can be used to pass specific flags to that
-assembler. The \fB\-n\fR can be used to prevent dlltool from deleting
-these temporary assembler files when it is done, and if \fB\-n\fR is
-specified twice then this will prevent dlltool from deleting the
-temporary object files it used to build the library.
-.PP
-Here is an example of creating a \s-1DLL\s0 from a source file \fBdll.c\fR and
-also creating a program (from an object file called \fBprogram.o\fR)
-that uses that \s-1DLL:\s0
-.PP
-.Vb 4
-\& gcc \-c dll.c
-\& dlltool \-e exports.o \-l dll.lib dll.o
-\& gcc dll.o exports.o \-o dll.dll
-\& gcc program.o dll.lib \-o program
-.Ve
-.PP
-\&\fBdlltool\fR may also be used to query an existing import library
-to determine the name of the \s-1DLL\s0 to which it is associated. See the
-description of the \fB\-I\fR or \fB\-\-identify\fR option.
-.SH "OPTIONS"
-.IX Header "OPTIONS"
-The command line options have the following meanings:
-.IP "\fB\-d\fR \fIfilename\fR" 4
-.IX Item "-d filename"
-.PD 0
-.IP "\fB\-\-input\-def\fR \fIfilename\fR" 4
-.IX Item "--input-def filename"
-.PD
-Specifies the name of a \fI.def\fR file to be read in and processed.
-.IP "\fB\-b\fR \fIfilename\fR" 4
-.IX Item "-b filename"
-.PD 0
-.IP "\fB\-\-base\-file\fR \fIfilename\fR" 4
-.IX Item "--base-file filename"
-.PD
-Specifies the name of a base file to be read in and processed. The
-contents of this file will be added to the relocation section in the
-exports file generated by dlltool.
-.IP "\fB\-e\fR \fIfilename\fR" 4
-.IX Item "-e filename"
-.PD 0
-.IP "\fB\-\-output\-exp\fR \fIfilename\fR" 4
-.IX Item "--output-exp filename"
-.PD
-Specifies the name of the export file to be created by dlltool.
-.IP "\fB\-z\fR \fIfilename\fR" 4
-.IX Item "-z filename"
-.PD 0
-.IP "\fB\-\-output\-def\fR \fIfilename\fR" 4
-.IX Item "--output-def filename"
-.PD
-Specifies the name of the \fI.def\fR file to be created by dlltool.
-.IP "\fB\-l\fR \fIfilename\fR" 4
-.IX Item "-l filename"
-.PD 0
-.IP "\fB\-\-output\-lib\fR \fIfilename\fR" 4
-.IX Item "--output-lib filename"
-.PD
-Specifies the name of the library file to be created by dlltool.
-.IP "\fB\-y\fR \fIfilename\fR" 4
-.IX Item "-y filename"
-.PD 0
-.IP "\fB\-\-output\-delaylib\fR \fIfilename\fR" 4
-.IX Item "--output-delaylib filename"
-.PD
-Specifies the name of the delay-import library file to be created by dlltool.
-.IP "\fB\-\-export\-all\-symbols\fR" 4
-.IX Item "--export-all-symbols"
-Treat all global and weak defined symbols found in the input object
-files as symbols to be exported. There is a small list of symbols which
-are not exported by default; see the \fB\-\-no\-default\-excludes\fR
-option. You may add to the list of symbols to not export by using the
-\&\fB\-\-exclude\-symbols\fR option.
-.IP "\fB\-\-no\-export\-all\-symbols\fR" 4
-.IX Item "--no-export-all-symbols"
-Only export symbols explicitly listed in an input \fI.def\fR file or in
-\&\fB.drectve\fR sections in the input object files. This is the default
-behaviour. The \fB.drectve\fR sections are created by \fBdllexport\fR
-attributes in the source code.
-.IP "\fB\-\-exclude\-symbols\fR \fIlist\fR" 4
-.IX Item "--exclude-symbols list"
-Do not export the symbols in \fIlist\fR. This is a list of symbol names
-separated by comma or colon characters. The symbol names should not
-contain a leading underscore. This is only meaningful when
-\&\fB\-\-export\-all\-symbols\fR is used.
-.IP "\fB\-\-no\-default\-excludes\fR" 4
-.IX Item "--no-default-excludes"
-When \fB\-\-export\-all\-symbols\fR is used, it will by default avoid
-exporting certain special symbols. The current list of symbols to avoid
-exporting is \fBDllMain@12\fR, \fBDllEntryPoint@0\fR,
-\&\fBimpure_ptr\fR. You may use the \fB\-\-no\-default\-excludes\fR option
-to go ahead and export these special symbols. This is only meaningful
-when \fB\-\-export\-all\-symbols\fR is used.
-.IP "\fB\-S\fR \fIpath\fR" 4
-.IX Item "-S path"
-.PD 0
-.IP "\fB\-\-as\fR \fIpath\fR" 4
-.IX Item "--as path"
-.PD
-Specifies the path, including the filename, of the assembler to be used
-to create the exports file.
-.IP "\fB\-f\fR \fIoptions\fR" 4
-.IX Item "-f options"
-.PD 0
-.IP "\fB\-\-as\-flags\fR \fIoptions\fR" 4
-.IX Item "--as-flags options"
-.PD
-Specifies any specific command line options to be passed to the
-assembler when building the exports file. This option will work even if
-the \fB\-S\fR option is not used. This option only takes one argument,
-and if it occurs more than once on the command line, then later
-occurrences will override earlier occurrences. So if it is necessary to
-pass multiple options to the assembler they should be enclosed in
-double quotes.
-.IP "\fB\-D\fR \fIname\fR" 4
-.IX Item "-D name"
-.PD 0
-.IP "\fB\-\-dll\-name\fR \fIname\fR" 4
-.IX Item "--dll-name name"
-.PD
-Specifies the name to be stored in the \fI.def\fR file as the name of
-the \s-1DLL\s0 when the \fB\-e\fR option is used. If this option is not
-present, then the filename given to the \fB\-e\fR option will be
-used as the name of the \s-1DLL\s0.
-.IP "\fB\-m\fR \fImachine\fR" 4
-.IX Item "-m machine"
-.PD 0
-.IP "\fB\-machine\fR \fImachine\fR" 4
-.IX Item "-machine machine"
-.PD
-Specifies the type of machine for which the library file should be
-built. \fBdlltool\fR has a built in default type, depending upon how
-it was created, but this option can be used to override that. This is
-normally only useful when creating DLLs for an \s-1ARM\s0 processor, when the
-contents of the \s-1DLL\s0 are actually encode using Thumb instructions.
-.IP "\fB\-a\fR" 4
-.IX Item "-a"
-.PD 0
-.IP "\fB\-\-add\-indirect\fR" 4
-.IX Item "--add-indirect"
-.PD
-Specifies that when \fBdlltool\fR is creating the exports file it
-should add a section which allows the exported functions to be
-referenced without using the import library. Whatever the hell that
-means!
-.IP "\fB\-U\fR" 4
-.IX Item "-U"
-.PD 0
-.IP "\fB\-\-add\-underscore\fR" 4
-.IX Item "--add-underscore"
-.PD
-Specifies that when \fBdlltool\fR is creating the exports file it
-should prepend an underscore to the names of \fIall\fR exported symbols.
-.IP "\fB\-\-no\-leading\-underscore\fR" 4
-.IX Item "--no-leading-underscore"
-.PD 0
-.IP "\fB\-\-leading\-underscore\fR" 4
-.IX Item "--leading-underscore"
-.PD
-Specifies whether standard symbol should be forced to be prefixed, or
-not.
-.IP "\fB\-\-add\-stdcall\-underscore\fR" 4
-.IX Item "--add-stdcall-underscore"
-Specifies that when \fBdlltool\fR is creating the exports file it
-should prepend an underscore to the names of exported \fIstdcall\fR
-functions. Variable names and non-stdcall function names are not modified.
-This option is useful when creating GNU-compatible import libs for third
-party DLLs that were built with MS-Windows tools.
-.IP "\fB\-k\fR" 4
-.IX Item "-k"
-.PD 0
-.IP "\fB\-\-kill\-at\fR" 4
-.IX Item "--kill-at"
-.PD
-Specifies that when \fBdlltool\fR is creating the exports file it
-should not append the string \fB@ \fR. These numbers are
-called ordinal numbers and they represent another way of accessing the
-function in a \s-1DLL\s0, other than by name.
-.IP "\fB\-A\fR" 4
-.IX Item "-A"
-.PD 0
-.IP "\fB\-\-add\-stdcall\-alias\fR" 4
-.IX Item "--add-stdcall-alias"
-.PD
-Specifies that when \fBdlltool\fR is creating the exports file it
-should add aliases for stdcall symbols without \fB@ \fR
-in addition to the symbols with \fB@ \fR.
-.IP "\fB\-p\fR" 4
-.IX Item "-p"
-.PD 0
-.IP "\fB\-\-ext\-prefix\-alias\fR \fIprefix\fR" 4
-.IX Item "--ext-prefix-alias prefix"
-.PD
-Causes \fBdlltool\fR to create external aliases for all \s-1DLL\s0
-imports with the specified prefix. The aliases are created for both
-external and import symbols with no leading underscore.
-.IP "\fB\-x\fR" 4
-.IX Item "-x"
-.PD 0
-.IP "\fB\-\-no\-idata4\fR" 4
-.IX Item "--no-idata4"
-.PD
-Specifies that when \fBdlltool\fR is creating the exports and library
-files it should omit the \f(CW\*(C`.idata4\*(C'\fR section. This is for compatibility
-with certain operating systems.
-.IP "\fB\-\-use\-nul\-prefixed\-import\-tables\fR" 4
-.IX Item "--use-nul-prefixed-import-tables"
-Specifies that when \fBdlltool\fR is creating the exports and library
-files it should prefix the \f(CW\*(C`.idata4\*(C'\fR and \f(CW\*(C`.idata5\*(C'\fR by zero an
-element. This emulates old gnu import library generation of
-\&\f(CW\*(C`dlltool\*(C'\fR. By default this option is turned off.
-.IP "\fB\-c\fR" 4
-.IX Item "-c"
-.PD 0
-.IP "\fB\-\-no\-idata5\fR" 4
-.IX Item "--no-idata5"
-.PD
-Specifies that when \fBdlltool\fR is creating the exports and library
-files it should omit the \f(CW\*(C`.idata5\*(C'\fR section. This is for compatibility
-with certain operating systems.
-.IP "\fB\-I\fR \fIfilename\fR" 4
-.IX Item "-I filename"
-.PD 0
-.IP "\fB\-\-identify\fR \fIfilename\fR" 4
-.IX Item "--identify filename"
-.PD
-Specifies that \fBdlltool\fR should inspect the import library
-indicated by \fIfilename\fR and report, on \f(CW\*(C`stdout\*(C'\fR, the name(s)
-of the associated \s-1DLL\s0(s). This can be performed in addition to any
-other operations indicated by the other options and arguments.
-\&\fBdlltool\fR fails if the import library does not exist or is not
-actually an import library. See also \fB\-\-identify\-strict\fR.
-.IP "\fB\-\-identify\-strict\fR" 4
-.IX Item "--identify-strict"
-Modifies the behavior of the \fB\-\-identify\fR option, such
-that an error is reported if \fIfilename\fR is associated with
-more than one \s-1DLL\s0.
-.IP "\fB\-i\fR" 4
-.IX Item "-i"
-.PD 0
-.IP "\fB\-\-interwork\fR" 4
-.IX Item "--interwork"
-.PD
-Specifies that \fBdlltool\fR should mark the objects in the library
-file and exports file that it produces as supporting interworking
-between \s-1ARM\s0 and Thumb code.
-.IP "\fB\-n\fR" 4
-.IX Item "-n"
-.PD 0
-.IP "\fB\-\-nodelete\fR" 4
-.IX Item "--nodelete"
-.PD
-Makes \fBdlltool\fR preserve the temporary assembler files it used to
-create the exports file. If this option is repeated then dlltool will
-also preserve the temporary object files it uses to create the library
-file.
-.IP "\fB\-t\fR \fIprefix\fR" 4
-.IX Item "-t prefix"
-.PD 0
-.IP "\fB\-\-temp\-prefix\fR \fIprefix\fR" 4
-.IX Item "--temp-prefix prefix"
-.PD
-Makes \fBdlltool\fR use \fIprefix\fR when constructing the names of
-temporary assembler and object files. By default, the temp file prefix
-is generated from the pid.
-.IP "\fB\-v\fR" 4
-.IX Item "-v"
-.PD 0
-.IP "\fB\-\-verbose\fR" 4
-.IX Item "--verbose"
-.PD
-Make dlltool describe what it is doing.
-.IP "\fB\-h\fR" 4
-.IX Item "-h"
-.PD 0
-.IP "\fB\-\-help\fR" 4
-.IX Item "--help"
-.PD
-Displays a list of command line options and then exits.
-.IP "\fB\-V\fR" 4
-.IX Item "-V"
-.PD 0
-.IP "\fB\-\-version\fR" 4
-.IX Item "--version"
-.PD
-Displays dlltool's version number and then exits.
-.IP "\fB@\fR\fIfile\fR" 4
-.IX Item "@file"
-Read command-line options from \fIfile\fR. The options read are
-inserted in place of the original @\fIfile\fR option. If \fIfile\fR
-does not exist, or cannot be read, then the option will be treated
-literally, and not removed.
-.Sp
-Options in \fIfile\fR are separated by whitespace. A whitespace
-character may be included in an option by surrounding the entire
-option in either single or double quotes. Any character (including a
-backslash) may be included by prefixing the character to be included
-with a backslash. The \fIfile\fR may itself contain additional
-@\fIfile\fR options; any such options will be processed recursively.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-The Info pages for \fIbinutils\fR.
-.SH "COPYRIGHT"
-.IX Header "COPYRIGHT"
-Copyright (c) 1991\-2013 Free Software Foundation, Inc.
-.PP
-Permission is granted to copy, distribute and/or modify this document
-under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.3
-or any later version published by the Free Software Foundation;
-with no Invariant Sections, with no Front-Cover Texts, and with no
-Back-Cover Texts. A copy of the license is included in the
-section entitled \*(L"\s-1GNU\s0 Free Documentation License\*(R".
diff -Nur binutils-2.24.orig/binutils/doc/elfedit.1 binutils-2.24/binutils/doc/elfedit.1
--- binutils-2.24.orig/binutils/doc/elfedit.1 2013-11-18 09:49:31.000000000 +0100
+++ binutils-2.24/binutils/doc/elfedit.1 1970-01-01 01:00:00.000000000 +0100
@@ -1,233 +0,0 @@
-.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings. \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote. \*(C+ will
-.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-. ds -- \(*W-
-. ds PI pi
-. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
-. ds L" ""
-. ds R" ""
-. ds C` ""
-. ds C' ""
-'br\}
-.el\{\
-. ds -- \|\(em\|
-. ds PI \(*p
-. ds L" ``
-. ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD. Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-. de IX
-. tm Index:\\$1\t\\n%\t"\\$2"
-..
-. nr % 0
-. rr F
-.\}
-.el \{\
-. de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear. Run. Save yourself. No user-serviceable parts.
-. \" fudge factors for nroff and troff
-.if n \{\
-. ds #H 0
-. ds #V .8m
-. ds #F .3m
-. ds #[ \f1
-. ds #] \fP
-.\}
-.if t \{\
-. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-. ds #V .6m
-. ds #F 0
-. ds #[ \&
-. ds #] \&
-.\}
-. \" simple accents for nroff and troff
-.if n \{\
-. ds ' \&
-. ds ` \&
-. ds ^ \&
-. ds , \&
-. ds ~ ~
-. ds /
-.\}
-.if t \{\
-. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-. \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-. \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-. \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-. ds : e
-. ds 8 ss
-. ds o a
-. ds d- d\h'-1'\(ga
-. ds D- D\h'-1'\(hy
-. ds th \o'bp'
-. ds Th \o'LP'
-. ds ae ae
-. ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "ELFEDIT 1"
-.TH ELFEDIT 1 "2013-11-18" "binutils-2.23.91" "GNU Development Tools"
-.\" For nroff, turn off justification. Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-elfedit \- Update the ELF header of ELF files.
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-elfedit [\fB\-\-input\-mach=\fR\fImachine\fR]
- [\fB\-\-input\-type=\fR\fItype\fR]
- [\fB\-\-input\-osabi=\fR\fIosabi\fR]
- \fB\-\-output\-mach=\fR\fImachine\fR
- \fB\-\-output\-type=\fR\fItype\fR
- \fB\-\-output\-osabi=\fR\fIosabi\fR
- [\fB\-v\fR|\fB\-\-version\fR]
- [\fB\-h\fR|\fB\-\-help\fR]
- \fIelffile\fR...
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-\&\fBelfedit\fR updates the \s-1ELF\s0 header of \s-1ELF\s0 files which have
-the matching \s-1ELF\s0 machine and file types. The options control how and
-which fields in the \s-1ELF\s0 header should be updated.
-.PP
-\&\fIelffile\fR... are the \s-1ELF\s0 files to be updated. 32\-bit and
-64\-bit \s-1ELF\s0 files are supported, as are archives containing \s-1ELF\s0 files.
-.SH "OPTIONS"
-.IX Header "OPTIONS"
-The long and short forms of options, shown here as alternatives, are
-equivalent. At least one of the \fB\-\-output\-mach\fR,
-\&\fB\-\-output\-type\fR and \fB\-\-output\-osabi\fR options must be given.
-.IP "\fB\-\-input\-mach=\fR\fImachine\fR" 4
-.IX Item "--input-mach=machine"
-Set the matching input \s-1ELF\s0 machine type to \fImachine\fR. If
-\&\fB\-\-input\-mach\fR isn't specified, it will match any \s-1ELF\s0
-machine types.
-.Sp
-The supported \s-1ELF\s0 machine types are, \fIL1OM\fR, \fIK1OM\fR and
-\&\fIx86\-64\fR.
-.IP "\fB\-\-output\-mach=\fR\fImachine\fR" 4
-.IX Item "--output-mach=machine"
-Change the \s-1ELF\s0 machine type in the \s-1ELF\s0 header to \fImachine\fR. The
-supported \s-1ELF\s0 machine types are the same as \fB\-\-input\-mach\fR.
-.IP "\fB\-\-input\-type=\fR\fItype\fR" 4
-.IX Item "--input-type=type"
-Set the matching input \s-1ELF\s0 file type to \fItype\fR. If
-\&\fB\-\-input\-type\fR isn't specified, it will match any \s-1ELF\s0 file types.
-.Sp
-The supported \s-1ELF\s0 file types are, \fIrel\fR, \fIexec\fR and \fIdyn\fR.
-.IP "\fB\-\-output\-type=\fR\fItype\fR" 4
-.IX Item "--output-type=type"
-Change the \s-1ELF\s0 file type in the \s-1ELF\s0 header to \fItype\fR. The
-supported \s-1ELF\s0 types are the same as \fB\-\-input\-type\fR.
-.IP "\fB\-\-input\-osabi=\fR\fIosabi\fR" 4
-.IX Item "--input-osabi=osabi"
-Set the matching input \s-1ELF\s0 file \s-1OSABI\s0 to \fIosabi\fR. If
-\&\fB\-\-input\-osabi\fR isn't specified, it will match any \s-1ELF\s0 OSABIs.
-.Sp
-The supported \s-1ELF\s0 OSABIs are, \fInone\fR, \fI\s-1HPUX\s0\fR, \fINetBSD\fR,
-\&\fI\s-1GNU\s0\fR, \fILinux\fR (alias for \fI\s-1GNU\s0\fR),
-\&\fISolaris\fR, \fI\s-1AIX\s0\fR, \fIIrix\fR,
-\&\fIFreeBSD\fR, \fI\s-1TRU64\s0\fR, \fIModesto\fR, \fIOpenBSD\fR, \fIOpenVMS\fR,
-\&\fI\s-1NSK\s0\fR, \fI\s-1AROS\s0\fR and \fIFenixOS\fR.
-.IP "\fB\-\-output\-osabi=\fR\fIosabi\fR" 4
-.IX Item "--output-osabi=osabi"
-Change the \s-1ELF\s0 \s-1OSABI\s0 in the \s-1ELF\s0 header to \fIosabi\fR. The
-supported \s-1ELF\s0 \s-1OSABI\s0 are the same as \fB\-\-input\-osabi\fR.
-.IP "\fB\-v\fR" 4
-.IX Item "-v"
-.PD 0
-.IP "\fB\-\-version\fR" 4
-.IX Item "--version"
-.PD
-Display the version number of \fBelfedit\fR.
-.IP "\fB\-h\fR" 4
-.IX Item "-h"
-.PD 0
-.IP "\fB\-\-help\fR" 4
-.IX Item "--help"
-.PD
-Display the command line options understood by \fBelfedit\fR.
-.IP "\fB@\fR\fIfile\fR" 4
-.IX Item "@file"
-Read command-line options from \fIfile\fR. The options read are
-inserted in place of the original @\fIfile\fR option. If \fIfile\fR
-does not exist, or cannot be read, then the option will be treated
-literally, and not removed.
-.Sp
-Options in \fIfile\fR are separated by whitespace. A whitespace
-character may be included in an option by surrounding the entire
-option in either single or double quotes. Any character (including a
-backslash) may be included by prefixing the character to be included
-with a backslash. The \fIfile\fR may itself contain additional
-@\fIfile\fR options; any such options will be processed recursively.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-\&\fIreadelf\fR\|(1), and the Info entries for \fIbinutils\fR.
-.SH "COPYRIGHT"
-.IX Header "COPYRIGHT"
-Copyright (c) 1991\-2013 Free Software Foundation, Inc.
-.PP
-Permission is granted to copy, distribute and/or modify this document
-under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.3
-or any later version published by the Free Software Foundation;
-with no Invariant Sections, with no Front-Cover Texts, and with no
-Back-Cover Texts. A copy of the license is included in the
-section entitled \*(L"\s-1GNU\s0 Free Documentation License\*(R".
diff -Nur binutils-2.24.orig/binutils/doc/nlmconv.1 binutils-2.24/binutils/doc/nlmconv.1
--- binutils-2.24.orig/binutils/doc/nlmconv.1 2013-11-18 09:49:30.000000000 +0100
+++ binutils-2.24/binutils/doc/nlmconv.1 1970-01-01 01:00:00.000000000 +0100
@@ -1,242 +0,0 @@
-.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings. \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote. \*(C+ will
-.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-. ds -- \(*W-
-. ds PI pi
-. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
-. ds L" ""
-. ds R" ""
-. ds C` ""
-. ds C' ""
-'br\}
-.el\{\
-. ds -- \|\(em\|
-. ds PI \(*p
-. ds L" ``
-. ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD. Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-. de IX
-. tm Index:\\$1\t\\n%\t"\\$2"
-..
-. nr % 0
-. rr F
-.\}
-.el \{\
-. de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear. Run. Save yourself. No user-serviceable parts.
-. \" fudge factors for nroff and troff
-.if n \{\
-. ds #H 0
-. ds #V .8m
-. ds #F .3m
-. ds #[ \f1
-. ds #] \fP
-.\}
-.if t \{\
-. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-. ds #V .6m
-. ds #F 0
-. ds #[ \&
-. ds #] \&
-.\}
-. \" simple accents for nroff and troff
-.if n \{\
-. ds ' \&
-. ds ` \&
-. ds ^ \&
-. ds , \&
-. ds ~ ~
-. ds /
-.\}
-.if t \{\
-. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-. \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-. \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-. \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-. ds : e
-. ds 8 ss
-. ds o a
-. ds d- d\h'-1'\(ga
-. ds D- D\h'-1'\(hy
-. ds th \o'bp'
-. ds Th \o'LP'
-. ds ae ae
-. ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "NLMCONV 1"
-.TH NLMCONV 1 "2013-11-18" "binutils-2.23.91" "GNU Development Tools"
-.\" For nroff, turn off justification. Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-nlmconv \- converts object code into an NLM.
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-nlmconv [\fB\-I\fR \fIbfdname\fR|\fB\-\-input\-target=\fR\fIbfdname\fR]
- [\fB\-O\fR \fIbfdname\fR|\fB\-\-output\-target=\fR\fIbfdname\fR]
- [\fB\-T\fR \fIheaderfile\fR|\fB\-\-header\-file=\fR\fIheaderfile\fR]
- [\fB\-d\fR|\fB\-\-debug\fR] [\fB\-l\fR \fIlinker\fR|\fB\-\-linker=\fR\fIlinker\fR]
- [\fB\-h\fR|\fB\-\-help\fR] [\fB\-V\fR|\fB\-\-version\fR]
- \fIinfile\fR \fIoutfile\fR
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-\&\fBnlmconv\fR converts the relocatable \fBi386\fR object file
-\&\fIinfile\fR into the NetWare Loadable Module \fIoutfile\fR, optionally
-reading \fIheaderfile\fR for \s-1NLM\s0 header information. For instructions
-on writing the \s-1NLM\s0 command file language used in header files, see the
-\&\fBlinkers\fR section, \fB\s-1NLMLINK\s0\fR in particular, of the \fI\s-1NLM\s0
-Development and Tools Overview\fR, which is part of the \s-1NLM\s0 Software
-Developer's Kit (\*(L"\s-1NLM\s0 \s-1SDK\s0\*(R"), available from Novell, Inc.
-\&\fBnlmconv\fR uses the \s-1GNU\s0 Binary File Descriptor library to read
-\&\fIinfile\fR;
-.PP
-\&\fBnlmconv\fR can perform a link step. In other words, you can list
-more than one object file for input if you list them in the definitions
-file (rather than simply specifying one input file on the command line).
-In this case, \fBnlmconv\fR calls the linker for you.
-.SH "OPTIONS"
-.IX Header "OPTIONS"
-.IP "\fB\-I\fR \fIbfdname\fR" 4
-.IX Item "-I bfdname"
-.PD 0
-.IP "\fB\-\-input\-target=\fR\fIbfdname\fR" 4
-.IX Item "--input-target=bfdname"
-.PD
-Object format of the input file. \fBnlmconv\fR can usually determine
-the format of a given file (so no default is necessary).
-.IP "\fB\-O\fR \fIbfdname\fR" 4
-.IX Item "-O bfdname"
-.PD 0
-.IP "\fB\-\-output\-target=\fR\fIbfdname\fR" 4
-.IX Item "--output-target=bfdname"
-.PD
-Object format of the output file. \fBnlmconv\fR infers the output
-format based on the input format, e.g. for a \fBi386\fR input file the
-output format is \fBnlm32\-i386\fR.
-.IP "\fB\-T\fR \fIheaderfile\fR" 4
-.IX Item "-T headerfile"
-.PD 0
-.IP "\fB\-\-header\-file=\fR\fIheaderfile\fR" 4
-.IX Item "--header-file=headerfile"
-.PD
-Reads \fIheaderfile\fR for \s-1NLM\s0 header information. For instructions on
-writing the \s-1NLM\s0 command file language used in header files, see see the
-\&\fBlinkers\fR section, of the \fI\s-1NLM\s0 Development and Tools
-Overview\fR, which is part of the \s-1NLM\s0 Software Developer's Kit, available
-from Novell, Inc.
-.IP "\fB\-d\fR" 4
-.IX Item "-d"
-.PD 0
-.IP "\fB\-\-debug\fR" 4
-.IX Item "--debug"
-.PD
-Displays (on standard error) the linker command line used by \fBnlmconv\fR.
-.IP "\fB\-l\fR \fIlinker\fR" 4
-.IX Item "-l linker"
-.PD 0
-.IP "\fB\-\-linker=\fR\fIlinker\fR" 4
-.IX Item "--linker=linker"
-.PD
-Use \fIlinker\fR for any linking. \fIlinker\fR can be an absolute or a
-relative pathname.
-.IP "\fB\-h\fR" 4
-.IX Item "-h"
-.PD 0
-.IP "\fB\-\-help\fR" 4
-.IX Item "--help"
-.PD
-Prints a usage summary.
-.IP "\fB\-V\fR" 4
-.IX Item "-V"
-.PD 0
-.IP "\fB\-\-version\fR" 4
-.IX Item "--version"
-.PD
-Prints the version number for \fBnlmconv\fR.
-.IP "\fB@\fR\fIfile\fR" 4
-.IX Item "@file"
-Read command-line options from \fIfile\fR. The options read are
-inserted in place of the original @\fIfile\fR option. If \fIfile\fR
-does not exist, or cannot be read, then the option will be treated
-literally, and not removed.
-.Sp
-Options in \fIfile\fR are separated by whitespace. A whitespace
-character may be included in an option by surrounding the entire
-option in either single or double quotes. Any character (including a
-backslash) may be included by prefixing the character to be included
-with a backslash. The \fIfile\fR may itself contain additional
-@\fIfile\fR options; any such options will be processed recursively.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-the Info entries for \fIbinutils\fR.
-.SH "COPYRIGHT"
-.IX Header "COPYRIGHT"
-Copyright (c) 1991\-2013 Free Software Foundation, Inc.
-.PP
-Permission is granted to copy, distribute and/or modify this document
-under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.3
-or any later version published by the Free Software Foundation;
-with no Invariant Sections, with no Front-Cover Texts, and with no
-Back-Cover Texts. A copy of the license is included in the
-section entitled \*(L"\s-1GNU\s0 Free Documentation License\*(R".
diff -Nur binutils-2.24.orig/binutils/doc/nm.1 binutils-2.24/binutils/doc/nm.1
--- binutils-2.24.orig/binutils/doc/nm.1 2013-11-18 09:49:31.000000000 +0100
+++ binutils-2.24/binutils/doc/nm.1 1970-01-01 01:00:00.000000000 +0100
@@ -1,530 +0,0 @@
-.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings. \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote. \*(C+ will
-.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-. ds -- \(*W-
-. ds PI pi
-. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
-. ds L" ""
-. ds R" ""
-. ds C` ""
-. ds C' ""
-'br\}
-.el\{\
-. ds -- \|\(em\|
-. ds PI \(*p
-. ds L" ``
-. ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD. Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-. de IX
-. tm Index:\\$1\t\\n%\t"\\$2"
-..
-. nr % 0
-. rr F
-.\}
-.el \{\
-. de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear. Run. Save yourself. No user-serviceable parts.
-. \" fudge factors for nroff and troff
-.if n \{\
-. ds #H 0
-. ds #V .8m
-. ds #F .3m
-. ds #[ \f1
-. ds #] \fP
-.\}
-.if t \{\
-. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-. ds #V .6m
-. ds #F 0
-. ds #[ \&
-. ds #] \&
-.\}
-. \" simple accents for nroff and troff
-.if n \{\
-. ds ' \&
-. ds ` \&
-. ds ^ \&
-. ds , \&
-. ds ~ ~
-. ds /
-.\}
-.if t \{\
-. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-. \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-. \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-. \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-. ds : e
-. ds 8 ss
-. ds o a
-. ds d- d\h'-1'\(ga
-. ds D- D\h'-1'\(hy
-. ds th \o'bp'
-. ds Th \o'LP'
-. ds ae ae
-. ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "NM 1"
-.TH NM 1 "2013-11-18" "binutils-2.23.91" "GNU Development Tools"
-.\" For nroff, turn off justification. Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-nm \- list symbols from object files
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-nm [\fB\-A\fR|\fB\-o\fR|\fB\-\-print\-file\-name\fR] [\fB\-a\fR|\fB\-\-debug\-syms\fR]
- [\fB\-B\fR|\fB\-\-format=bsd\fR] [\fB\-C\fR|\fB\-\-demangle\fR[=\fIstyle\fR]]
- [\fB\-D\fR|\fB\-\-dynamic\fR] [\fB\-f\fR\fIformat\fR|\fB\-\-format=\fR\fIformat\fR]
- [\fB\-g\fR|\fB\-\-extern\-only\fR] [\fB\-h\fR|\fB\-\-help\fR]
- [\fB\-l\fR|\fB\-\-line\-numbers\fR] [\fB\-n\fR|\fB\-v\fR|\fB\-\-numeric\-sort\fR]
- [\fB\-P\fR|\fB\-\-portability\fR] [\fB\-p\fR|\fB\-\-no\-sort\fR]
- [\fB\-r\fR|\fB\-\-reverse\-sort\fR] [\fB\-S\fR|\fB\-\-print\-size\fR]
- [\fB\-s\fR|\fB\-\-print\-armap\fR] [\fB\-t\fR \fIradix\fR|\fB\-\-radix=\fR\fIradix\fR]
- [\fB\-u\fR|\fB\-\-undefined\-only\fR] [\fB\-V\fR|\fB\-\-version\fR]
- [\fB\-X 32_64\fR] [\fB\-\-defined\-only\fR] [\fB\-\-no\-demangle\fR]
- [\fB\-\-plugin\fR \fIname\fR] [\fB\-\-size\-sort\fR] [\fB\-\-special\-syms\fR]
- [\fB\-\-synthetic\fR] [\fB\-\-target=\fR\fIbfdname\fR]
- [\fIobjfile\fR...]
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-\&\s-1GNU\s0 \fBnm\fR lists the symbols from object files \fIobjfile\fR....
-If no object files are listed as arguments, \fBnm\fR assumes the file
-\&\fIa.out\fR.
-.PP
-For each symbol, \fBnm\fR shows:
-.IP "\(bu" 4
-The symbol value, in the radix selected by options (see below), or
-hexadecimal by default.
-.IP "\(bu" 4
-The symbol type. At least the following types are used; others are, as
-well, depending on the object file format. If lowercase, the symbol is
-usually local; if uppercase, the symbol is global (external). There
-are however a few lowercase symbols that are shown for special global
-symbols (\f(CW\*(C`u\*(C'\fR, \f(CW\*(C`v\*(C'\fR and \f(CW\*(C`w\*(C'\fR).
-.RS 4
-.ie n .IP """A""" 4
-.el .IP "\f(CWA\fR" 4
-.IX Item "A"
-The symbol's value is absolute, and will not be changed by further
-linking.
-.ie n .IP """B""" 4
-.el .IP "\f(CWB\fR" 4
-.IX Item "B"
-.PD 0
-.ie n .IP """b""" 4
-.el .IP "\f(CWb\fR" 4
-.IX Item "b"
-.PD
-The symbol is in the uninitialized data section (known as \s-1BSS\s0).
-.ie n .IP """C""" 4
-.el .IP "\f(CWC\fR" 4
-.IX Item "C"
-The symbol is common. Common symbols are uninitialized data. When
-linking, multiple common symbols may appear with the same name. If the
-symbol is defined anywhere, the common symbols are treated as undefined
-references.
-.ie n .IP """D""" 4
-.el .IP "\f(CWD\fR" 4
-.IX Item "D"
-.PD 0
-.ie n .IP """d""" 4
-.el .IP "\f(CWd\fR" 4
-.IX Item "d"
-.PD
-The symbol is in the initialized data section.
-.ie n .IP """G""" 4
-.el .IP "\f(CWG\fR" 4
-.IX Item "G"
-.PD 0
-.ie n .IP """g""" 4
-.el .IP "\f(CWg\fR" 4
-.IX Item "g"
-.PD
-The symbol is in an initialized data section for small objects. Some
-object file formats permit more efficient access to small data objects,
-such as a global int variable as opposed to a large global array.
-.ie n .IP """i""" 4
-.el .IP "\f(CWi\fR" 4
-.IX Item "i"
-For \s-1PE\s0 format files this indicates that the symbol is in a section
-specific to the implementation of DLLs. For \s-1ELF\s0 format files this
-indicates that the symbol is an indirect function. This is a \s-1GNU\s0
-extension to the standard set of \s-1ELF\s0 symbol types. It indicates a
-symbol which if referenced by a relocation does not evaluate to its
-address, but instead must be invoked at runtime. The runtime
-execution will then return the value to be used in the relocation.
-.ie n .IP """I""" 4
-.el .IP "\f(CWI\fR" 4
-.IX Item "I"
-The symbol is an indirect reference to another symbol.
-.ie n .IP """N""" 4
-.el .IP "\f(CWN\fR" 4
-.IX Item "N"
-The symbol is a debugging symbol.
-.ie n .IP """p""" 4
-.el .IP "\f(CWp\fR" 4
-.IX Item "p"
-The symbols is in a stack unwind section.
-.ie n .IP """R""" 4
-.el .IP "\f(CWR\fR" 4
-.IX Item "R"
-.PD 0
-.ie n .IP """r""" 4
-.el .IP "\f(CWr\fR" 4
-.IX Item "r"
-.PD
-The symbol is in a read only data section.
-.ie n .IP """S""" 4
-.el .IP "\f(CWS\fR" 4
-.IX Item "S"
-.PD 0
-.ie n .IP """s""" 4
-.el .IP "\f(CWs\fR" 4
-.IX Item "s"
-.PD
-The symbol is in an uninitialized data section for small objects.
-.ie n .IP """T""" 4
-.el .IP "\f(CWT\fR" 4
-.IX Item "T"
-.PD 0
-.ie n .IP """t""" 4
-.el .IP "\f(CWt\fR" 4
-.IX Item "t"
-.PD
-The symbol is in the text (code) section.
-.ie n .IP """U""" 4
-.el .IP "\f(CWU\fR" 4
-.IX Item "U"
-The symbol is undefined.
-.ie n .IP """u""" 4
-.el .IP "\f(CWu\fR" 4
-.IX Item "u"
-The symbol is a unique global symbol. This is a \s-1GNU\s0 extension to the
-standard set of \s-1ELF\s0 symbol bindings. For such a symbol the dynamic linker
-will make sure that in the entire process there is just one symbol with
-this name and type in use.
-.ie n .IP """V""" 4
-.el .IP "\f(CWV\fR" 4
-.IX Item "V"
-.PD 0
-.ie n .IP """v""" 4
-.el .IP "\f(CWv\fR" 4
-.IX Item "v"
-.PD
-The symbol is a weak object. When a weak defined symbol is linked with
-a normal defined symbol, the normal defined symbol is used with no error.
-When a weak undefined symbol is linked and the symbol is not defined,
-the value of the weak symbol becomes zero with no error. On some
-systems, uppercase indicates that a default value has been specified.
-.ie n .IP """W""" 4
-.el .IP "\f(CWW\fR" 4
-.IX Item "W"
-.PD 0
-.ie n .IP """w""" 4
-.el .IP "\f(CWw\fR" 4
-.IX Item "w"
-.PD
-The symbol is a weak symbol that has not been specifically tagged as a
-weak object symbol. When a weak defined symbol is linked with a normal
-defined symbol, the normal defined symbol is used with no error.
-When a weak undefined symbol is linked and the symbol is not defined,
-the value of the symbol is determined in a system-specific manner without
-error. On some systems, uppercase indicates that a default value has been
-specified.
-.ie n .IP """\-""" 4
-.el .IP "\f(CW\-\fR" 4
-.IX Item "-"
-The symbol is a stabs symbol in an a.out object file. In this case, the
-next values printed are the stabs other field, the stabs desc field, and
-the stab type. Stabs symbols are used to hold debugging information.
-.ie n .IP """?""" 4
-.el .IP "\f(CW?\fR" 4
-.IX Item "?"
-The symbol type is unknown, or object file format specific.
-.RE
-.RS 4
-.RE
-.IP "\(bu" 4
-The symbol name.
-.SH "OPTIONS"
-.IX Header "OPTIONS"
-The long and short forms of options, shown here as alternatives, are
-equivalent.
-.IP "\fB\-A\fR" 4
-.IX Item "-A"
-.PD 0
-.IP "\fB\-o\fR" 4
-.IX Item "-o"
-.IP "\fB\-\-print\-file\-name\fR" 4
-.IX Item "--print-file-name"
-.PD
-Precede each symbol by the name of the input file (or archive member)
-in which it was found, rather than identifying the input file once only,
-before all of its symbols.
-.IP "\fB\-a\fR" 4
-.IX Item "-a"
-.PD 0
-.IP "\fB\-\-debug\-syms\fR" 4
-.IX Item "--debug-syms"
-.PD
-Display all symbols, even debugger-only symbols; normally these are not
-listed.
-.IP "\fB\-B\fR" 4
-.IX Item "-B"
-The same as \fB\-\-format=bsd\fR (for compatibility with the \s-1MIPS\s0 \fBnm\fR).
-.IP "\fB\-C\fR" 4
-.IX Item "-C"
-.PD 0
-.IP "\fB\-\-demangle[=\fR\fIstyle\fR\fB]\fR" 4
-.IX Item "--demangle[=style]"
-.PD
-Decode (\fIdemangle\fR) low-level symbol names into user-level names.
-Besides removing any initial underscore prepended by the system, this
-makes \*(C+ function names readable. Different compilers have different
-mangling styles. The optional demangling style argument can be used to
-choose an appropriate demangling style for your compiler.
-.IP "\fB\-\-no\-demangle\fR" 4
-.IX Item "--no-demangle"
-Do not demangle low-level symbol names. This is the default.
-.IP "\fB\-D\fR" 4
-.IX Item "-D"
-.PD 0
-.IP "\fB\-\-dynamic\fR" 4
-.IX Item "--dynamic"
-.PD
-Display the dynamic symbols rather than the normal symbols. This is
-only meaningful for dynamic objects, such as certain types of shared
-libraries.
-.IP "\fB\-f\fR \fIformat\fR" 4
-.IX Item "-f format"
-.PD 0
-.IP "\fB\-\-format=\fR\fIformat\fR" 4
-.IX Item "--format=format"
-.PD
-Use the output format \fIformat\fR, which can be \f(CW\*(C`bsd\*(C'\fR,
-\&\f(CW\*(C`sysv\*(C'\fR, or \f(CW\*(C`posix\*(C'\fR. The default is \f(CW\*(C`bsd\*(C'\fR.
-Only the first character of \fIformat\fR is significant; it can be
-either upper or lower case.
-.IP "\fB\-g\fR" 4
-.IX Item "-g"
-.PD 0
-.IP "\fB\-\-extern\-only\fR" 4
-.IX Item "--extern-only"
-.PD
-Display only external symbols.
-.IP "\fB\-h\fR" 4
-.IX Item "-h"
-.PD 0
-.IP "\fB\-\-help\fR" 4
-.IX Item "--help"
-.PD
-Show a summary of the options to \fBnm\fR and exit.
-.IP "\fB\-l\fR" 4
-.IX Item "-l"
-.PD 0
-.IP "\fB\-\-line\-numbers\fR" 4
-.IX Item "--line-numbers"
-.PD
-For each symbol, use debugging information to try to find a filename and
-line number. For a defined symbol, look for the line number of the
-address of the symbol. For an undefined symbol, look for the line
-number of a relocation entry which refers to the symbol. If line number
-information can be found, print it after the other symbol information.
-.IP "\fB\-n\fR" 4
-.IX Item "-n"
-.PD 0
-.IP "\fB\-v\fR" 4
-.IX Item "-v"
-.IP "\fB\-\-numeric\-sort\fR" 4
-.IX Item "--numeric-sort"
-.PD
-Sort symbols numerically by their addresses, rather than alphabetically
-by their names.
-.IP "\fB\-p\fR" 4
-.IX Item "-p"
-.PD 0
-.IP "\fB\-\-no\-sort\fR" 4
-.IX Item "--no-sort"
-.PD
-Do not bother to sort the symbols in any order; print them in the order
-encountered.
-.IP "\fB\-P\fR" 4
-.IX Item "-P"
-.PD 0
-.IP "\fB\-\-portability\fR" 4
-.IX Item "--portability"
-.PD
-Use the \s-1POSIX\s0.2 standard output format instead of the default format.
-Equivalent to \fB\-f posix\fR.
-.IP "\fB\-r\fR" 4
-.IX Item "-r"
-.PD 0
-.IP "\fB\-\-reverse\-sort\fR" 4
-.IX Item "--reverse-sort"
-.PD
-Reverse the order of the sort (whether numeric or alphabetic); let the
-last come first.
-.IP "\fB\-S\fR" 4
-.IX Item "-S"
-.PD 0
-.IP "\fB\-\-print\-size\fR" 4
-.IX Item "--print-size"
-.PD
-Print both value and size of defined symbols for the \f(CW\*(C`bsd\*(C'\fR output style.
-This option has no effect for object formats that do not record symbol
-sizes, unless \fB\-\-size\-sort\fR is also used in which case a
-calculated size is displayed.
-.IP "\fB\-s\fR" 4
-.IX Item "-s"
-.PD 0
-.IP "\fB\-\-print\-armap\fR" 4
-.IX Item "--print-armap"
-.PD
-When listing symbols from archive members, include the index: a mapping
-(stored in the archive by \fBar\fR or \fBranlib\fR) of which modules
-contain definitions for which names.
-.IP "\fB\-t\fR \fIradix\fR" 4
-.IX Item "-t radix"
-.PD 0
-.IP "\fB\-\-radix=\fR\fIradix\fR" 4
-.IX Item "--radix=radix"
-.PD
-Use \fIradix\fR as the radix for printing the symbol values. It must be
-\&\fBd\fR for decimal, \fBo\fR for octal, or \fBx\fR for hexadecimal.
-.IP "\fB\-u\fR" 4
-.IX Item "-u"
-.PD 0
-.IP "\fB\-\-undefined\-only\fR" 4
-.IX Item "--undefined-only"
-.PD
-Display only undefined symbols (those external to each object file).
-.IP "\fB\-V\fR" 4
-.IX Item "-V"
-.PD 0
-.IP "\fB\-\-version\fR" 4
-.IX Item "--version"
-.PD
-Show the version number of \fBnm\fR and exit.
-.IP "\fB\-X\fR" 4
-.IX Item "-X"
-This option is ignored for compatibility with the \s-1AIX\s0 version of
-\&\fBnm\fR. It takes one parameter which must be the string
-\&\fB32_64\fR. The default mode of \s-1AIX\s0 \fBnm\fR corresponds
-to \fB\-X 32\fR, which is not supported by \s-1GNU\s0 \fBnm\fR.
-.IP "\fB\-\-defined\-only\fR" 4
-.IX Item "--defined-only"
-Display only defined symbols for each object file.
-.IP "\fB\-\-plugin\fR \fIname\fR" 4
-.IX Item "--plugin name"
-Load the plugin called \fIname\fR to add support for extra target
-types. This option is only available if the toolchain has been built
-with plugin support enabled.
-.IP "\fB\-\-size\-sort\fR" 4
-.IX Item "--size-sort"
-Sort symbols by size. The size is computed as the difference between
-the value of the symbol and the value of the symbol with the next higher
-value. If the \f(CW\*(C`bsd\*(C'\fR output format is used the size of the symbol
-is printed, rather than the value, and \fB\-S\fR must be used in order
-both size and value to be printed.
-.IP "\fB\-\-special\-syms\fR" 4
-.IX Item "--special-syms"
-Display symbols which have a target-specific special meaning. These
-symbols are usually used by the target for some special processing and
-are not normally helpful when included in the normal symbol lists.
-For example for \s-1ARM\s0 targets this option would skip the mapping symbols
-used to mark transitions between \s-1ARM\s0 code, \s-1THUMB\s0 code and data.
-.IP "\fB\-\-synthetic\fR" 4
-.IX Item "--synthetic"
-Include synthetic symbols in the output. These are special symbols
-created by the linker for various purposes. They are not shown by
-default since they are not part of the binary's original source code.
-.IP "\fB\-\-target=\fR\fIbfdname\fR" 4
-.IX Item "--target=bfdname"
-Specify an object code format other than your system's default format.
-.IP "\fB@\fR\fIfile\fR" 4
-.IX Item "@file"
-Read command-line options from \fIfile\fR. The options read are
-inserted in place of the original @\fIfile\fR option. If \fIfile\fR
-does not exist, or cannot be read, then the option will be treated
-literally, and not removed.
-.Sp
-Options in \fIfile\fR are separated by whitespace. A whitespace
-character may be included in an option by surrounding the entire
-option in either single or double quotes. Any character (including a
-backslash) may be included by prefixing the character to be included
-with a backslash. The \fIfile\fR may itself contain additional
-@\fIfile\fR options; any such options will be processed recursively.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-\&\fIar\fR\|(1), \fIobjdump\fR\|(1), \fIranlib\fR\|(1), and the Info entries for \fIbinutils\fR.
-.SH "COPYRIGHT"
-.IX Header "COPYRIGHT"
-Copyright (c) 1991\-2013 Free Software Foundation, Inc.
-.PP
-Permission is granted to copy, distribute and/or modify this document
-under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.3
-or any later version published by the Free Software Foundation;
-with no Invariant Sections, with no Front-Cover Texts, and with no
-Back-Cover Texts. A copy of the license is included in the
-section entitled \*(L"\s-1GNU\s0 Free Documentation License\*(R".
diff -Nur binutils-2.24.orig/binutils/doc/objcopy.1 binutils-2.24/binutils/doc/objcopy.1
--- binutils-2.24.orig/binutils/doc/objcopy.1 2013-11-18 09:49:31.000000000 +0100
+++ binutils-2.24/binutils/doc/objcopy.1 1970-01-01 01:00:00.000000000 +0100
@@ -1,1012 +0,0 @@
-.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings. \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote. \*(C+ will
-.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-. ds -- \(*W-
-. ds PI pi
-. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
-. ds L" ""
-. ds R" ""
-. ds C` ""
-. ds C' ""
-'br\}
-.el\{\
-. ds -- \|\(em\|
-. ds PI \(*p
-. ds L" ``
-. ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD. Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-. de IX
-. tm Index:\\$1\t\\n%\t"\\$2"
-..
-. nr % 0
-. rr F
-.\}
-.el \{\
-. de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear. Run. Save yourself. No user-serviceable parts.
-. \" fudge factors for nroff and troff
-.if n \{\
-. ds #H 0
-. ds #V .8m
-. ds #F .3m
-. ds #[ \f1
-. ds #] \fP
-.\}
-.if t \{\
-. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-. ds #V .6m
-. ds #F 0
-. ds #[ \&
-. ds #] \&
-.\}
-. \" simple accents for nroff and troff
-.if n \{\
-. ds ' \&
-. ds ` \&
-. ds ^ \&
-. ds , \&
-. ds ~ ~
-. ds /
-.\}
-.if t \{\
-. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-. \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-. \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-. \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-. ds : e
-. ds 8 ss
-. ds o a
-. ds d- d\h'-1'\(ga
-. ds D- D\h'-1'\(hy
-. ds th \o'bp'
-. ds Th \o'LP'
-. ds ae ae
-. ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "OBJCOPY 1"
-.TH OBJCOPY 1 "2013-11-18" "binutils-2.23.91" "GNU Development Tools"
-.\" For nroff, turn off justification. Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-objcopy \- copy and translate object files
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-objcopy [\fB\-F\fR \fIbfdname\fR|\fB\-\-target=\fR\fIbfdname\fR]
- [\fB\-I\fR \fIbfdname\fR|\fB\-\-input\-target=\fR\fIbfdname\fR]
- [\fB\-O\fR \fIbfdname\fR|\fB\-\-output\-target=\fR\fIbfdname\fR]
- [\fB\-B\fR \fIbfdarch\fR|\fB\-\-binary\-architecture=\fR\fIbfdarch\fR]
- [\fB\-S\fR|\fB\-\-strip\-all\fR]
- [\fB\-g\fR|\fB\-\-strip\-debug\fR]
- [\fB\-K\fR \fIsymbolname\fR|\fB\-\-keep\-symbol=\fR\fIsymbolname\fR]
- [\fB\-N\fR \fIsymbolname\fR|\fB\-\-strip\-symbol=\fR\fIsymbolname\fR]
- [\fB\-\-strip\-unneeded\-symbol=\fR\fIsymbolname\fR]
- [\fB\-G\fR \fIsymbolname\fR|\fB\-\-keep\-global\-symbol=\fR\fIsymbolname\fR]
- [\fB\-\-localize\-hidden\fR]
- [\fB\-L\fR \fIsymbolname\fR|\fB\-\-localize\-symbol=\fR\fIsymbolname\fR]
- [\fB\-\-globalize\-symbol=\fR\fIsymbolname\fR]
- [\fB\-W\fR \fIsymbolname\fR|\fB\-\-weaken\-symbol=\fR\fIsymbolname\fR]
- [\fB\-w\fR|\fB\-\-wildcard\fR]
- [\fB\-x\fR|\fB\-\-discard\-all\fR]
- [\fB\-X\fR|\fB\-\-discard\-locals\fR]
- [\fB\-b\fR \fIbyte\fR|\fB\-\-byte=\fR\fIbyte\fR]
- [\fB\-i\fR [\fIbreadth\fR]|\fB\-\-interleave\fR[=\fIbreadth\fR]]
- [\fB\-\-interleave\-width=\fR\fIwidth\fR]
- [\fB\-j\fR \fIsectionpattern\fR|\fB\-\-only\-section=\fR\fIsectionpattern\fR]
- [\fB\-R\fR \fIsectionpattern\fR|\fB\-\-remove\-section=\fR\fIsectionpattern\fR]
- [\fB\-p\fR|\fB\-\-preserve\-dates\fR]
- [\fB\-D\fR|\fB\-\-enable\-deterministic\-archives\fR]
- [\fB\-U\fR|\fB\-\-disable\-deterministic\-archives\fR]
- [\fB\-\-debugging\fR]
- [\fB\-\-gap\-fill=\fR\fIval\fR]
- [\fB\-\-pad\-to=\fR\fIaddress\fR]
- [\fB\-\-set\-start=\fR\fIval\fR]
- [\fB\-\-adjust\-start=\fR\fIincr\fR]
- [\fB\-\-change\-addresses=\fR\fIincr\fR]
- [\fB\-\-change\-section\-address\fR \fIsectionpattern\fR{=,+,\-}\fIval\fR]
- [\fB\-\-change\-section\-lma\fR \fIsectionpattern\fR{=,+,\-}\fIval\fR]
- [\fB\-\-change\-section\-vma\fR \fIsectionpattern\fR{=,+,\-}\fIval\fR]
- [\fB\-\-change\-warnings\fR] [\fB\-\-no\-change\-warnings\fR]
- [\fB\-\-set\-section\-flags\fR \fIsectionpattern\fR=\fIflags\fR]
- [\fB\-\-add\-section\fR \fIsectionname\fR=\fIfilename\fR]
- [\fB\-\-rename\-section\fR \fIoldname\fR=\fInewname\fR[,\fIflags\fR]]
- [\fB\-\-long\-section\-names\fR {enable,disable,keep}]
- [\fB\-\-change\-leading\-char\fR] [\fB\-\-remove\-leading\-char\fR]
- [\fB\-\-reverse\-bytes=\fR\fInum\fR]
- [\fB\-\-srec\-len=\fR\fIival\fR] [\fB\-\-srec\-forceS3\fR]
- [\fB\-\-redefine\-sym\fR \fIold\fR=\fInew\fR]
- [\fB\-\-redefine\-syms=\fR\fIfilename\fR]
- [\fB\-\-weaken\fR]
- [\fB\-\-keep\-symbols=\fR\fIfilename\fR]
- [\fB\-\-strip\-symbols=\fR\fIfilename\fR]
- [\fB\-\-strip\-unneeded\-symbols=\fR\fIfilename\fR]
- [\fB\-\-keep\-global\-symbols=\fR\fIfilename\fR]
- [\fB\-\-localize\-symbols=\fR\fIfilename\fR]
- [\fB\-\-globalize\-symbols=\fR\fIfilename\fR]
- [\fB\-\-weaken\-symbols=\fR\fIfilename\fR]
- [\fB\-\-alt\-machine\-code=\fR\fIindex\fR]
- [\fB\-\-prefix\-symbols=\fR\fIstring\fR]
- [\fB\-\-prefix\-sections=\fR\fIstring\fR]
- [\fB\-\-prefix\-alloc\-sections=\fR\fIstring\fR]
- [\fB\-\-add\-gnu\-debuglink=\fR\fIpath-to-file\fR]
- [\fB\-\-keep\-file\-symbols\fR]
- [\fB\-\-only\-keep\-debug\fR]
- [\fB\-\-strip\-dwo\fR]
- [\fB\-\-extract\-dwo\fR]
- [\fB\-\-extract\-symbol\fR]
- [\fB\-\-writable\-text\fR]
- [\fB\-\-readonly\-text\fR]
- [\fB\-\-pure\fR]
- [\fB\-\-impure\fR]
- [\fB\-\-file\-alignment=\fR\fInum\fR]
- [\fB\-\-heap=\fR\fIsize\fR]
- [\fB\-\-image\-base=\fR\fIaddress\fR]
- [\fB\-\-section\-alignment=\fR\fInum\fR]
- [\fB\-\-stack=\fR\fIsize\fR]
- [\fB\-\-subsystem=\fR\fIwhich\fR:\fImajor\fR.\fIminor\fR]
- [\fB\-\-compress\-debug\-sections\fR]
- [\fB\-\-decompress\-debug\-sections\fR]
- [\fB\-\-dwarf\-depth=\fR\fIn\fR]
- [\fB\-\-dwarf\-start=\fR\fIn\fR]
- [\fB\-v\fR|\fB\-\-verbose\fR]
- [\fB\-V\fR|\fB\-\-version\fR]
- [\fB\-\-help\fR] [\fB\-\-info\fR]
- \fIinfile\fR [\fIoutfile\fR]
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-The \s-1GNU\s0 \fBobjcopy\fR utility copies the contents of an object
-file to another. \fBobjcopy\fR uses the \s-1GNU\s0 \s-1BFD\s0 Library to
-read and write the object files. It can write the destination object
-file in a format different from that of the source object file. The
-exact behavior of \fBobjcopy\fR is controlled by command-line options.
-Note that \fBobjcopy\fR should be able to copy a fully linked file
-between any two formats. However, copying a relocatable object file
-between any two formats may not work as expected.
-.PP
-\&\fBobjcopy\fR creates temporary files to do its translations and
-deletes them afterward. \fBobjcopy\fR uses \s-1BFD\s0 to do all its
-translation work; it has access to all the formats described in \s-1BFD\s0
-and thus is able to recognize most formats without being told
-explicitly.
-.PP
-\&\fBobjcopy\fR can be used to generate S\-records by using an output
-target of \fBsrec\fR (e.g., use \fB\-O srec\fR).
-.PP
-\&\fBobjcopy\fR can be used to generate a raw binary file by using an
-output target of \fBbinary\fR (e.g., use \fB\-O binary\fR). When
-\&\fBobjcopy\fR generates a raw binary file, it will essentially produce
-a memory dump of the contents of the input object file. All symbols and
-relocation information will be discarded. The memory dump will start at
-the load address of the lowest section copied into the output file.
-.PP
-When generating an S\-record or a raw binary file, it may be helpful to
-use \fB\-S\fR to remove sections containing debugging information. In
-some cases \fB\-R\fR will be useful to remove sections which contain
-information that is not needed by the binary file.
-.PP
-Note\-\-\-\fBobjcopy\fR is not able to change the endianness of its input
-files. If the input format has an endianness (some formats do not),
-\&\fBobjcopy\fR can only copy the inputs into file formats that have the
-same endianness or which have no endianness (e.g., \fBsrec\fR).
-(However, see the \fB\-\-reverse\-bytes\fR option.)
-.SH "OPTIONS"
-.IX Header "OPTIONS"
-.IP "\fIinfile\fR" 4
-.IX Item "infile"
-.PD 0
-.IP "\fIoutfile\fR" 4
-.IX Item "outfile"
-.PD
-The input and output files, respectively.
-If you do not specify \fIoutfile\fR, \fBobjcopy\fR creates a
-temporary file and destructively renames the result with
-the name of \fIinfile\fR.
-.IP "\fB\-I\fR \fIbfdname\fR" 4
-.IX Item "-I bfdname"
-.PD 0
-.IP "\fB\-\-input\-target=\fR\fIbfdname\fR" 4
-.IX Item "--input-target=bfdname"
-.PD
-Consider the source file's object format to be \fIbfdname\fR, rather than
-attempting to deduce it.
-.IP "\fB\-O\fR \fIbfdname\fR" 4
-.IX Item "-O bfdname"
-.PD 0
-.IP "\fB\-\-output\-target=\fR\fIbfdname\fR" 4
-.IX Item "--output-target=bfdname"
-.PD
-Write the output file using the object format \fIbfdname\fR.
-.IP "\fB\-F\fR \fIbfdname\fR" 4
-.IX Item "-F bfdname"
-.PD 0
-.IP "\fB\-\-target=\fR\fIbfdname\fR" 4
-.IX Item "--target=bfdname"
-.PD
-Use \fIbfdname\fR as the object format for both the input and the output
-file; i.e., simply transfer data from source to destination with no
-translation.
-.IP "\fB\-B\fR \fIbfdarch\fR" 4
-.IX Item "-B bfdarch"
-.PD 0
-.IP "\fB\-\-binary\-architecture=\fR\fIbfdarch\fR" 4
-.IX Item "--binary-architecture=bfdarch"
-.PD
-Useful when transforming a architecture-less input file into an object file.
-In this case the output architecture can be set to \fIbfdarch\fR. This
-option will be ignored if the input file has a known \fIbfdarch\fR. You
-can access this binary data inside a program by referencing the special
-symbols that are created by the conversion process. These symbols are
-called _binary_\fIobjfile\fR_start, _binary_\fIobjfile\fR_end and
-_binary_\fIobjfile\fR_size. e.g. you can transform a picture file into
-an object file and then access it in your code using these symbols.
-.IP "\fB\-j\fR \fIsectionpattern\fR" 4
-.IX Item "-j sectionpattern"
-.PD 0
-.IP "\fB\-\-only\-section=\fR\fIsectionpattern\fR" 4
-.IX Item "--only-section=sectionpattern"
-.PD
-Copy only the indicated sections from the input file to the output file.
-This option may be given more than once. Note that using this option
-inappropriately may make the output file unusable. Wildcard
-characters are accepted in \fIsectionpattern\fR.
-.IP "\fB\-R\fR \fIsectionpattern\fR" 4
-.IX Item "-R sectionpattern"
-.PD 0
-.IP "\fB\-\-remove\-section=\fR\fIsectionpattern\fR" 4
-.IX Item "--remove-section=sectionpattern"
-.PD
-Remove any section matching \fIsectionpattern\fR from the output file.
-This option may be given more than once. Note that using this option
-inappropriately may make the output file unusable. Wildcard
-characters are accepted in \fIsectionpattern\fR. Using both the
-\&\fB\-j\fR and \fB\-R\fR options together results in undefined
-behaviour.
-.IP "\fB\-S\fR" 4
-.IX Item "-S"
-.PD 0
-.IP "\fB\-\-strip\-all\fR" 4
-.IX Item "--strip-all"
-.PD
-Do not copy relocation and symbol information from the source file.
-.IP "\fB\-g\fR" 4
-.IX Item "-g"
-.PD 0
-.IP "\fB\-\-strip\-debug\fR" 4
-.IX Item "--strip-debug"
-.PD
-Do not copy debugging symbols or sections from the source file.
-.IP "\fB\-\-strip\-unneeded\fR" 4
-.IX Item "--strip-unneeded"
-Strip all symbols that are not needed for relocation processing.
-.IP "\fB\-K\fR \fIsymbolname\fR" 4
-.IX Item "-K symbolname"
-.PD 0
-.IP "\fB\-\-keep\-symbol=\fR\fIsymbolname\fR" 4
-.IX Item "--keep-symbol=symbolname"
-.PD
-When stripping symbols, keep symbol \fIsymbolname\fR even if it would
-normally be stripped. This option may be given more than once.
-.IP "\fB\-N\fR \fIsymbolname\fR" 4
-.IX Item "-N symbolname"
-.PD 0
-.IP "\fB\-\-strip\-symbol=\fR\fIsymbolname\fR" 4
-.IX Item "--strip-symbol=symbolname"
-.PD
-Do not copy symbol \fIsymbolname\fR from the source file. This option
-may be given more than once.
-.IP "\fB\-\-strip\-unneeded\-symbol=\fR\fIsymbolname\fR" 4
-.IX Item "--strip-unneeded-symbol=symbolname"
-Do not copy symbol \fIsymbolname\fR from the source file unless it is needed
-by a relocation. This option may be given more than once.
-.IP "\fB\-G\fR \fIsymbolname\fR" 4
-.IX Item "-G symbolname"
-.PD 0
-.IP "\fB\-\-keep\-global\-symbol=\fR\fIsymbolname\fR" 4
-.IX Item "--keep-global-symbol=symbolname"
-.PD
-Keep only symbol \fIsymbolname\fR global. Make all other symbols local
-to the file, so that they are not visible externally. This option may
-be given more than once.
-.IP "\fB\-\-localize\-hidden\fR" 4
-.IX Item "--localize-hidden"
-In an \s-1ELF\s0 object, mark all symbols that have hidden or internal visibility
-as local. This option applies on top of symbol-specific localization options
-such as \fB\-L\fR.
-.IP "\fB\-L\fR \fIsymbolname\fR" 4
-.IX Item "-L symbolname"
-.PD 0
-.IP "\fB\-\-localize\-symbol=\fR\fIsymbolname\fR" 4
-.IX Item "--localize-symbol=symbolname"
-.PD
-Make symbol \fIsymbolname\fR local to the file, so that it is not
-visible externally. This option may be given more than once.
-.IP "\fB\-W\fR \fIsymbolname\fR" 4
-.IX Item "-W symbolname"
-.PD 0
-.IP "\fB\-\-weaken\-symbol=\fR\fIsymbolname\fR" 4
-.IX Item "--weaken-symbol=symbolname"
-.PD
-Make symbol \fIsymbolname\fR weak. This option may be given more than once.
-.IP "\fB\-\-globalize\-symbol=\fR\fIsymbolname\fR" 4
-.IX Item "--globalize-symbol=symbolname"
-Give symbol \fIsymbolname\fR global scoping so that it is visible
-outside of the file in which it is defined. This option may be given
-more than once.
-.IP "\fB\-w\fR" 4
-.IX Item "-w"
-.PD 0
-.IP "\fB\-\-wildcard\fR" 4
-.IX Item "--wildcard"
-.PD
-Permit regular expressions in \fIsymbolname\fRs used in other command
-line options. The question mark (?), asterisk (*), backslash (\e) and
-square brackets ([]) operators can be used anywhere in the symbol
-name. If the first character of the symbol name is the exclamation
-point (!) then the sense of the switch is reversed for that symbol.
-For example:
-.Sp
-.Vb 1
-\& \-w \-W !foo \-W fo*
-.Ve
-.Sp
-would cause objcopy to weaken all symbols that start with \*(L"fo\*(R"
-except for the symbol \*(L"foo\*(R".
-.IP "\fB\-x\fR" 4
-.IX Item "-x"
-.PD 0
-.IP "\fB\-\-discard\-all\fR" 4
-.IX Item "--discard-all"
-.PD
-Do not copy non-global symbols from the source file.
-.IP "\fB\-X\fR" 4
-.IX Item "-X"
-.PD 0
-.IP "\fB\-\-discard\-locals\fR" 4
-.IX Item "--discard-locals"
-.PD
-Do not copy compiler-generated local symbols.
-(These usually start with \fBL\fR or \fB.\fR.)
-.IP "\fB\-b\fR \fIbyte\fR" 4
-.IX Item "-b byte"
-.PD 0
-.IP "\fB\-\-byte=\fR\fIbyte\fR" 4
-.IX Item "--byte=byte"
-.PD
-If interleaving has been enabled via the \fB\-\-interleave\fR option
-then start the range of bytes to keep at the \fIbyte\fRth byte.
-\&\fIbyte\fR can be in the range from 0 to \fIbreadth\fR\-1, where
-\&\fIbreadth\fR is the value given by the \fB\-\-interleave\fR option.
-.IP "\fB\-i [\fR\fIbreadth\fR\fB]\fR" 4
-.IX Item "-i [breadth]"
-.PD 0
-.IP "\fB\-\-interleave[=\fR\fIbreadth\fR\fB]\fR" 4
-.IX Item "--interleave[=breadth]"
-.PD
-Only copy a range out of every \fIbreadth\fR bytes. (Header data is
-not affected). Select which byte in the range begins the copy with
-the \fB\-\-byte\fR option. Select the width of the range with the
-\&\fB\-\-interleave\-width\fR option.
-.Sp
-This option is useful for creating files to program \s-1ROM\s0. It is
-typically used with an \f(CW\*(C`srec\*(C'\fR output target. Note that
-\&\fBobjcopy\fR will complain if you do not specify the
-\&\fB\-\-byte\fR option as well.
-.Sp
-The default interleave breadth is 4, so with \fB\-\-byte\fR set to 0,
-\&\fBobjcopy\fR would copy the first byte out of every four bytes
-from the input to the output.
-.IP "\fB\-\-interleave\-width=\fR\fIwidth\fR" 4
-.IX Item "--interleave-width=width"
-When used with the \fB\-\-interleave\fR option, copy \fIwidth\fR
-bytes at a time. The start of the range of bytes to be copied is set
-by the \fB\-\-byte\fR option, and the extent of the range is set with
-the \fB\-\-interleave\fR option.
-.Sp
-The default value for this option is 1. The value of \fIwidth\fR plus
-the \fIbyte\fR value set by the \fB\-\-byte\fR option must not exceed
-the interleave breadth set by the \fB\-\-interleave\fR option.
-.Sp
-This option can be used to create images for two 16\-bit flashes interleaved
-in a 32\-bit bus by passing \fB\-b 0 \-i 4 \-\-interleave\-width=2\fR
-and \fB\-b 2 \-i 4 \-\-interleave\-width=2\fR to two \fBobjcopy\fR
-commands. If the input was '12345678' then the outputs would be
-\&'1256' and '3478' respectively.
-.IP "\fB\-p\fR" 4
-.IX Item "-p"
-.PD 0
-.IP "\fB\-\-preserve\-dates\fR" 4
-.IX Item "--preserve-dates"
-.PD
-Set the access and modification dates of the output file to be the same
-as those of the input file.
-.IP "\fB\-D\fR" 4
-.IX Item "-D"
-.PD 0
-.IP "\fB\-\-enable\-deterministic\-archives\fR" 4
-.IX Item "--enable-deterministic-archives"
-.PD
-Operate in \fIdeterministic\fR mode. When copying archive members
-and writing the archive index, use zero for UIDs, GIDs, timestamps,
-and use consistent file modes for all files.
-.Sp
-If \fIbinutils\fR was configured with
-\&\fB\-\-enable\-deterministic\-archives\fR, then this mode is on by default.
-It can be disabled with the \fB\-U\fR option, below.
-.IP "\fB\-U\fR" 4
-.IX Item "-U"
-.PD 0
-.IP "\fB\-\-disable\-deterministic\-archives\fR" 4
-.IX Item "--disable-deterministic-archives"
-.PD
-Do \fInot\fR operate in \fIdeterministic\fR mode. This is the
-inverse of the \fB\-D\fR option, above: when copying archive members
-and writing the archive index, use their actual \s-1UID\s0, \s-1GID\s0, timestamp,
-and file mode values.
-.Sp
-This is the default unless \fIbinutils\fR was configured with
-\&\fB\-\-enable\-deterministic\-archives\fR.
-.IP "\fB\-\-debugging\fR" 4
-.IX Item "--debugging"
-Convert debugging information, if possible. This is not the default
-because only certain debugging formats are supported, and the
-conversion process can be time consuming.
-.IP "\fB\-\-gap\-fill\fR \fIval\fR" 4
-.IX Item "--gap-fill val"
-Fill gaps between sections with \fIval\fR. This operation applies to
-the \fIload address\fR (\s-1LMA\s0) of the sections. It is done by increasing
-the size of the section with the lower address, and filling in the extra
-space created with \fIval\fR.
-.IP "\fB\-\-pad\-to\fR \fIaddress\fR" 4
-.IX Item "--pad-to address"
-Pad the output file up to the load address \fIaddress\fR. This is
-done by increasing the size of the last section. The extra space is
-filled in with the value specified by \fB\-\-gap\-fill\fR (default zero).
-.IP "\fB\-\-set\-start\fR \fIval\fR" 4
-.IX Item "--set-start val"
-Set the start address of the new file to \fIval\fR. Not all object file
-formats support setting the start address.
-.IP "\fB\-\-change\-start\fR \fIincr\fR" 4
-.IX Item "--change-start incr"
-.PD 0
-.IP "\fB\-\-adjust\-start\fR \fIincr\fR" 4
-.IX Item "--adjust-start incr"
-.PD
-Change the start address by adding \fIincr\fR. Not all object file
-formats support setting the start address.
-.IP "\fB\-\-change\-addresses\fR \fIincr\fR" 4
-.IX Item "--change-addresses incr"
-.PD 0
-.IP "\fB\-\-adjust\-vma\fR \fIincr\fR" 4
-.IX Item "--adjust-vma incr"
-.PD
-Change the \s-1VMA\s0 and \s-1LMA\s0 addresses of all sections, as well as the start
-address, by adding \fIincr\fR. Some object file formats do not permit
-section addresses to be changed arbitrarily. Note that this does not
-relocate the sections; if the program expects sections to be loaded at a
-certain address, and this option is used to change the sections such
-that they are loaded at a different address, the program may fail.
-.IP "\fB\-\-change\-section\-address\fR \fIsectionpattern\fR\fB{=,+,\-}\fR\fIval\fR" 4
-.IX Item "--change-section-address sectionpattern{=,+,-}val"
-.PD 0
-.IP "\fB\-\-adjust\-section\-vma\fR \fIsectionpattern\fR\fB{=,+,\-}\fR\fIval\fR" 4
-.IX Item "--adjust-section-vma sectionpattern{=,+,-}val"
-.PD
-Set or change both the \s-1VMA\s0 address and the \s-1LMA\s0 address of any section
-matching \fIsectionpattern\fR. If \fB=\fR is used, the section
-address is set to \fIval\fR. Otherwise, \fIval\fR is added to or
-subtracted from the section address. See the comments under
-\&\fB\-\-change\-addresses\fR, above. If \fIsectionpattern\fR does not
-match any sections in the input file, a warning will be issued, unless
-\&\fB\-\-no\-change\-warnings\fR is used.
-.IP "\fB\-\-change\-section\-lma\fR \fIsectionpattern\fR\fB{=,+,\-}\fR\fIval\fR" 4
-.IX Item "--change-section-lma sectionpattern{=,+,-}val"
-Set or change the \s-1LMA\s0 address of any sections matching
-\&\fIsectionpattern\fR. The \s-1LMA\s0 address is the address where the
-section will be loaded into memory at program load time. Normally
-this is the same as the \s-1VMA\s0 address, which is the address of the
-section at program run time, but on some systems, especially those
-where a program is held in \s-1ROM\s0, the two can be different. If \fB=\fR
-is used, the section address is set to \fIval\fR. Otherwise,
-\&\fIval\fR is added to or subtracted from the section address. See the
-comments under \fB\-\-change\-addresses\fR, above. If
-\&\fIsectionpattern\fR does not match any sections in the input file, a
-warning will be issued, unless \fB\-\-no\-change\-warnings\fR is used.
-.IP "\fB\-\-change\-section\-vma\fR \fIsectionpattern\fR\fB{=,+,\-}\fR\fIval\fR" 4
-.IX Item "--change-section-vma sectionpattern{=,+,-}val"
-Set or change the \s-1VMA\s0 address of any section matching
-\&\fIsectionpattern\fR. The \s-1VMA\s0 address is the address where the
-section will be located once the program has started executing.
-Normally this is the same as the \s-1LMA\s0 address, which is the address
-where the section will be loaded into memory, but on some systems,
-especially those where a program is held in \s-1ROM\s0, the two can be
-different. If \fB=\fR is used, the section address is set to
-\&\fIval\fR. Otherwise, \fIval\fR is added to or subtracted from the
-section address. See the comments under \fB\-\-change\-addresses\fR,
-above. If \fIsectionpattern\fR does not match any sections in the
-input file, a warning will be issued, unless
-\&\fB\-\-no\-change\-warnings\fR is used.
-.IP "\fB\-\-change\-warnings\fR" 4
-.IX Item "--change-warnings"
-.PD 0
-.IP "\fB\-\-adjust\-warnings\fR" 4
-.IX Item "--adjust-warnings"
-.PD
-If \fB\-\-change\-section\-address\fR or \fB\-\-change\-section\-lma\fR or
-\&\fB\-\-change\-section\-vma\fR is used, and the section pattern does not
-match any sections, issue a warning. This is the default.
-.IP "\fB\-\-no\-change\-warnings\fR" 4
-.IX Item "--no-change-warnings"
-.PD 0
-.IP "\fB\-\-no\-adjust\-warnings\fR" 4
-.IX Item "--no-adjust-warnings"
-.PD
-Do not issue a warning if \fB\-\-change\-section\-address\fR or
-\&\fB\-\-adjust\-section\-lma\fR or \fB\-\-adjust\-section\-vma\fR is used, even
-if the section pattern does not match any sections.
-.IP "\fB\-\-set\-section\-flags\fR \fIsectionpattern\fR\fB=\fR\fIflags\fR" 4
-.IX Item "--set-section-flags sectionpattern=flags"
-Set the flags for any sections matching \fIsectionpattern\fR. The
-\&\fIflags\fR argument is a comma separated string of flag names. The
-recognized names are \fBalloc\fR, \fBcontents\fR, \fBload\fR,
-\&\fBnoload\fR, \fBreadonly\fR, \fBcode\fR, \fBdata\fR, \fBrom\fR,
-\&\fBshare\fR, and \fBdebug\fR. You can set the \fBcontents\fR flag
-for a section which does not have contents, but it is not meaningful
-to clear the \fBcontents\fR flag of a section which does have
-contents\*(--just remove the section instead. Not all flags are
-meaningful for all object file formats.
-.IP "\fB\-\-add\-section\fR \fIsectionname\fR\fB=\fR\fIfilename\fR" 4
-.IX Item "--add-section sectionname=filename"
-Add a new section named \fIsectionname\fR while copying the file. The
-contents of the new section are taken from the file \fIfilename\fR. The
-size of the section will be the size of the file. This option only
-works on file formats which can support sections with arbitrary names.
-.IP "\fB\-\-rename\-section\fR \fIoldname\fR\fB=\fR\fInewname\fR\fB[,\fR\fIflags\fR\fB]\fR" 4
-.IX Item "--rename-section oldname=newname[,flags]"
-Rename a section from \fIoldname\fR to \fInewname\fR, optionally
-changing the section's flags to \fIflags\fR in the process. This has
-the advantage over usng a linker script to perform the rename in that
-the output stays as an object file and does not become a linked
-executable.
-.Sp
-This option is particularly helpful when the input format is binary,
-since this will always create a section called .data. If for example,
-you wanted instead to create a section called .rodata containing binary
-data you could use the following command line to achieve it:
-.Sp
-.Vb 3
-\& objcopy \-I binary \-O \-B \e
-\& \-\-rename\-section .data=.rodata,alloc,load,readonly,data,contents \e
-\&
-.Ve
-.IP "\fB\-\-long\-section\-names {enable,disable,keep}\fR" 4
-.IX Item "--long-section-names {enable,disable,keep}"
-Controls the handling of long section names when processing \f(CW\*(C`COFF\*(C'\fR
-and \f(CW\*(C`PE\-COFF\*(C'\fR object formats. The default behaviour, \fBkeep\fR,
-is to preserve long section names if any are present in the input file.
-The \fBenable\fR and \fBdisable\fR options forcibly enable or disable
-the use of long section names in the output object; when \fBdisable\fR
-is in effect, any long section names in the input object will be truncated.
-The \fBenable\fR option will only emit long section names if any are
-present in the inputs; this is mostly the same as \fBkeep\fR, but it
-is left undefined whether the \fBenable\fR option might force the
-creation of an empty string table in the output file.
-.IP "\fB\-\-change\-leading\-char\fR" 4
-.IX Item "--change-leading-char"
-Some object file formats use special characters at the start of
-symbols. The most common such character is underscore, which compilers
-often add before every symbol. This option tells \fBobjcopy\fR to
-change the leading character of every symbol when it converts between
-object file formats. If the object file formats use the same leading
-character, this option has no effect. Otherwise, it will add a
-character, or remove a character, or change a character, as
-appropriate.
-.IP "\fB\-\-remove\-leading\-char\fR" 4
-.IX Item "--remove-leading-char"
-If the first character of a global symbol is a special symbol leading
-character used by the object file format, remove the character. The
-most common symbol leading character is underscore. This option will
-remove a leading underscore from all global symbols. This can be useful
-if you want to link together objects of different file formats with
-different conventions for symbol names. This is different from
-\&\fB\-\-change\-leading\-char\fR because it always changes the symbol name
-when appropriate, regardless of the object file format of the output
-file.
-.IP "\fB\-\-reverse\-bytes=\fR\fInum\fR" 4
-.IX Item "--reverse-bytes=num"
-Reverse the bytes in a section with output contents. A section length must
-be evenly divisible by the value given in order for the swap to be able to
-take place. Reversing takes place before the interleaving is performed.
-.Sp
-This option is used typically in generating \s-1ROM\s0 images for problematic
-target systems. For example, on some target boards, the 32\-bit words
-fetched from 8\-bit ROMs are re-assembled in little-endian byte order
-regardless of the \s-1CPU\s0 byte order. Depending on the programming model, the
-endianness of the \s-1ROM\s0 may need to be modified.
-.Sp
-Consider a simple file with a section containing the following eight
-bytes: \f(CW12345678\fR.
-.Sp
-Using \fB\-\-reverse\-bytes=2\fR for the above example, the bytes in the
-output file would be ordered \f(CW21436587\fR.
-.Sp
-Using \fB\-\-reverse\-bytes=4\fR for the above example, the bytes in the
-output file would be ordered \f(CW43218765\fR.
-.Sp
-By using \fB\-\-reverse\-bytes=2\fR for the above example, followed by
-\&\fB\-\-reverse\-bytes=4\fR on the output file, the bytes in the second
-output file would be ordered \f(CW34127856\fR.
-.IP "\fB\-\-srec\-len=\fR\fIival\fR" 4
-.IX Item "--srec-len=ival"
-Meaningful only for srec output. Set the maximum length of the Srecords
-being produced to \fIival\fR. This length covers both address, data and
-crc fields.
-.IP "\fB\-\-srec\-forceS3\fR" 4
-.IX Item "--srec-forceS3"
-Meaningful only for srec output. Avoid generation of S1/S2 records,
-creating S3\-only record format.
-.IP "\fB\-\-redefine\-sym\fR \fIold\fR\fB=\fR\fInew\fR" 4
-.IX Item "--redefine-sym old=new"
-Change the name of a symbol \fIold\fR, to \fInew\fR. This can be useful
-when one is trying link two things together for which you have no
-source, and there are name collisions.
-.IP "\fB\-\-redefine\-syms=\fR\fIfilename\fR" 4
-.IX Item "--redefine-syms=filename"
-Apply \fB\-\-redefine\-sym\fR to each symbol pair "\fIold\fR \fInew\fR"
-listed in the file \fIfilename\fR. \fIfilename\fR is simply a flat file,
-with one symbol pair per line. Line comments may be introduced by the hash
-character. This option may be given more than once.
-.IP "\fB\-\-weaken\fR" 4
-.IX Item "--weaken"
-Change all global symbols in the file to be weak. This can be useful
-when building an object which will be linked against other objects using
-the \fB\-R\fR option to the linker. This option is only effective when
-using an object file format which supports weak symbols.
-.IP "\fB\-\-keep\-symbols=\fR\fIfilename\fR" 4
-.IX Item "--keep-symbols=filename"
-Apply \fB\-\-keep\-symbol\fR option to each symbol listed in the file
-\&\fIfilename\fR. \fIfilename\fR is simply a flat file, with one symbol
-name per line. Line comments may be introduced by the hash character.
-This option may be given more than once.
-.IP "\fB\-\-strip\-symbols=\fR\fIfilename\fR" 4
-.IX Item "--strip-symbols=filename"
-Apply \fB\-\-strip\-symbol\fR option to each symbol listed in the file
-\&\fIfilename\fR. \fIfilename\fR is simply a flat file, with one symbol
-name per line. Line comments may be introduced by the hash character.
-This option may be given more than once.
-.IP "\fB\-\-strip\-unneeded\-symbols=\fR\fIfilename\fR" 4
-.IX Item "--strip-unneeded-symbols=filename"
-Apply \fB\-\-strip\-unneeded\-symbol\fR option to each symbol listed in
-the file \fIfilename\fR. \fIfilename\fR is simply a flat file, with one
-symbol name per line. Line comments may be introduced by the hash
-character. This option may be given more than once.
-.IP "\fB\-\-keep\-global\-symbols=\fR\fIfilename\fR" 4
-.IX Item "--keep-global-symbols=filename"
-Apply \fB\-\-keep\-global\-symbol\fR option to each symbol listed in the
-file \fIfilename\fR. \fIfilename\fR is simply a flat file, with one
-symbol name per line. Line comments may be introduced by the hash
-character. This option may be given more than once.
-.IP "\fB\-\-localize\-symbols=\fR\fIfilename\fR" 4
-.IX Item "--localize-symbols=filename"
-Apply \fB\-\-localize\-symbol\fR option to each symbol listed in the file
-\&\fIfilename\fR. \fIfilename\fR is simply a flat file, with one symbol
-name per line. Line comments may be introduced by the hash character.
-This option may be given more than once.
-.IP "\fB\-\-globalize\-symbols=\fR\fIfilename\fR" 4
-.IX Item "--globalize-symbols=filename"
-Apply \fB\-\-globalize\-symbol\fR option to each symbol listed in the file
-\&\fIfilename\fR. \fIfilename\fR is simply a flat file, with one symbol
-name per line. Line comments may be introduced by the hash character.
-This option may be given more than once.
-.IP "\fB\-\-weaken\-symbols=\fR\fIfilename\fR" 4
-.IX Item "--weaken-symbols=filename"
-Apply \fB\-\-weaken\-symbol\fR option to each symbol listed in the file
-\&\fIfilename\fR. \fIfilename\fR is simply a flat file, with one symbol
-name per line. Line comments may be introduced by the hash character.
-This option may be given more than once.
-.IP "\fB\-\-alt\-machine\-code=\fR\fIindex\fR" 4
-.IX Item "--alt-machine-code=index"
-If the output architecture has alternate machine codes, use the
-\&\fIindex\fRth code instead of the default one. This is useful in case
-a machine is assigned an official code and the tool-chain adopts the
-new code, but other applications still depend on the original code
-being used. For \s-1ELF\s0 based architectures if the \fIindex\fR
-alternative does not exist then the value is treated as an absolute
-number to be stored in the e_machine field of the \s-1ELF\s0 header.
-.IP "\fB\-\-writable\-text\fR" 4
-.IX Item "--writable-text"
-Mark the output text as writable. This option isn't meaningful for all
-object file formats.
-.IP "\fB\-\-readonly\-text\fR" 4
-.IX Item "--readonly-text"
-Make the output text write protected. This option isn't meaningful for all
-object file formats.
-.IP "\fB\-\-pure\fR" 4
-.IX Item "--pure"
-Mark the output file as demand paged. This option isn't meaningful for all
-object file formats.
-.IP "\fB\-\-impure\fR" 4
-.IX Item "--impure"
-Mark the output file as impure. This option isn't meaningful for all
-object file formats.
-.IP "\fB\-\-prefix\-symbols=\fR\fIstring\fR" 4
-.IX Item "--prefix-symbols=string"
-Prefix all symbols in the output file with \fIstring\fR.
-.IP "\fB\-\-prefix\-sections=\fR\fIstring\fR" 4
-.IX Item "--prefix-sections=string"
-Prefix all section names in the output file with \fIstring\fR.
-.IP "\fB\-\-prefix\-alloc\-sections=\fR\fIstring\fR" 4
-.IX Item "--prefix-alloc-sections=string"
-Prefix all the names of all allocated sections in the output file with
-\&\fIstring\fR.
-.IP "\fB\-\-add\-gnu\-debuglink=\fR\fIpath-to-file\fR" 4
-.IX Item "--add-gnu-debuglink=path-to-file"
-Creates a .gnu_debuglink section which contains a reference to \fIpath-to-file\fR
-and adds it to the output file.
-.IP "\fB\-\-keep\-file\-symbols\fR" 4
-.IX Item "--keep-file-symbols"
-When stripping a file, perhaps with \fB\-\-strip\-debug\fR or
-\&\fB\-\-strip\-unneeded\fR, retain any symbols specifying source file names,
-which would otherwise get stripped.
-.IP "\fB\-\-only\-keep\-debug\fR" 4
-.IX Item "--only-keep-debug"
-Strip a file, removing contents of any sections that would not be
-stripped by \fB\-\-strip\-debug\fR and leaving the debugging sections
-intact. In \s-1ELF\s0 files, this preserves all note sections in the output.
-.Sp
-The intention is that this option will be used in conjunction with
-\&\fB\-\-add\-gnu\-debuglink\fR to create a two part executable. One a
-stripped binary which will occupy less space in \s-1RAM\s0 and in a
-distribution and the second a debugging information file which is only
-needed if debugging abilities are required. The suggested procedure
-to create these files is as follows:
-.RS 4
-.IP "1." 4
-.IX Item "1."
-\&\f(CW\*(C`foo\*(C'\fR then...
-.ie n .IP "1." 4
-.el .IP "1." 4
-.IX Item "1."
-create a file containing the debugging info.
-.ie n .IP "1." 4
-.el .IP "1." 4
-.IX Item "1."
-stripped executable.
-.ie n .IP "1." 4
-.el .IP "1." 4
-.IX Item "1."
-to add a link to the debugging info into the stripped executable.
-.RE
-.RS 4
-.Sp
-Note\-\-\-the choice of \f(CW\*(C`.dbg\*(C'\fR as an extension for the debug info
-file is arbitrary. Also the \f(CW\*(C`\-\-only\-keep\-debug\*(C'\fR step is
-optional. You could instead do this:
-.IP "1." 4
-.IX Item "1."
-.PD 0
-.ie n .IP "1." 4
-.el .IP "1." 4
-.IX Item "1."
-.ie n .IP "1." 4
-.el .IP "1." 4
-.IX Item "1."
-.ie n .IP "1." 4
-.el .IP "1." 4
-.IX Item "1."
-.RE
-.RS 4
-.PD
-.Sp
-i.e., the file pointed to by the \fB\-\-add\-gnu\-debuglink\fR can be the
-full executable. It does not have to be a file created by the
-\&\fB\-\-only\-keep\-debug\fR switch.
-.Sp
-Note\-\-\-this switch is only intended for use on fully linked files. It
-does not make sense to use it on object files where the debugging
-information may be incomplete. Besides the gnu_debuglink feature
-currently only supports the presence of one filename containing
-debugging information, not multiple filenames on a one-per-object-file
-basis.
-.RE
-.IP "\fB\-\-strip\-dwo\fR" 4
-.IX Item "--strip-dwo"
-Remove the contents of all \s-1DWARF\s0 .dwo sections, leaving the
-remaining debugging sections and all symbols intact.
-This option is intended for use by the compiler as part of
-the \fB\-gsplit\-dwarf\fR option, which splits debug information
-between the .o file and a separate .dwo file. The compiler
-generates all debug information in the same file, then uses
-the \fB\-\-extract\-dwo\fR option to copy the .dwo sections to
-the .dwo file, then the \fB\-\-strip\-dwo\fR option to remove
-those sections from the original .o file.
-.IP "\fB\-\-extract\-dwo\fR" 4
-.IX Item "--extract-dwo"
-Extract the contents of all \s-1DWARF\s0 .dwo sections. See the
-\&\fB\-\-strip\-dwo\fR option for more information.
-.IP "\fB\-\-file\-alignment\fR \fInum\fR" 4
-.IX Item "--file-alignment num"
-Specify the file alignment. Sections in the file will always begin at
-file offsets which are multiples of this number. This defaults to
-512.
-[This option is specific to \s-1PE\s0 targets.]
-.IP "\fB\-\-heap\fR \fIreserve\fR" 4
-.IX Item "--heap reserve"
-.PD 0
-.IP "\fB\-\-heap\fR \fIreserve\fR\fB,\fR\fIcommit\fR" 4
-.IX Item "--heap reserve,commit"
-.PD
-Specify the number of bytes of memory to reserve (and optionally commit)
-to be used as heap for this program.
-[This option is specific to \s-1PE\s0 targets.]
-.IP "\fB\-\-image\-base\fR \fIvalue\fR" 4
-.IX Item "--image-base value"
-Use \fIvalue\fR as the base address of your program or dll. This is
-the lowest memory location that will be used when your program or dll
-is loaded. To reduce the need to relocate and improve performance of
-your dlls, each should have a unique base address and not overlap any
-other dlls. The default is 0x400000 for executables, and 0x10000000
-for dlls.
-[This option is specific to \s-1PE\s0 targets.]
-.IP "\fB\-\-section\-alignment\fR \fInum\fR" 4
-.IX Item "--section-alignment num"
-Sets the section alignment. Sections in memory will always begin at
-addresses which are a multiple of this number. Defaults to 0x1000.
-[This option is specific to \s-1PE\s0 targets.]
-.IP "\fB\-\-stack\fR \fIreserve\fR" 4
-.IX Item "--stack reserve"
-.PD 0
-.IP "\fB\-\-stack\fR \fIreserve\fR\fB,\fR\fIcommit\fR" 4
-.IX Item "--stack reserve,commit"
-.PD
-Specify the number of bytes of memory to reserve (and optionally commit)
-to be used as stack for this program.
-[This option is specific to \s-1PE\s0 targets.]
-.IP "\fB\-\-subsystem\fR \fIwhich\fR" 4
-.IX Item "--subsystem which"
-.PD 0
-.IP "\fB\-\-subsystem\fR \fIwhich\fR\fB:\fR\fImajor\fR" 4
-.IX Item "--subsystem which:major"
-.IP "\fB\-\-subsystem\fR \fIwhich\fR\fB:\fR\fImajor\fR\fB.\fR\fIminor\fR" 4
-.IX Item "--subsystem which:major.minor"
-.PD
-Specifies the subsystem under which your program will execute. The
-legal values for \fIwhich\fR are \f(CW\*(C`native\*(C'\fR, \f(CW\*(C`windows\*(C'\fR,
-\&\f(CW\*(C`console\*(C'\fR, \f(CW\*(C`posix\*(C'\fR, \f(CW\*(C`efi\-app\*(C'\fR, \f(CW\*(C`efi\-bsd\*(C'\fR,
-\&\f(CW\*(C`efi\-rtd\*(C'\fR, \f(CW\*(C`sal\-rtd\*(C'\fR, and \f(CW\*(C`xbox\*(C'\fR. You may optionally set
-the subsystem version also. Numeric values are also accepted for
-\&\fIwhich\fR.
-[This option is specific to \s-1PE\s0 targets.]
-.IP "\fB\-\-extract\-symbol\fR" 4
-.IX Item "--extract-symbol"
-Keep the file's section flags and symbols but remove all section data.
-Specifically, the option:
-.RS 4
-.IP "*" 4
-.IX Item "*"
-.PD 0
-.IP "*" 4
-.IX Item "*"
-.IP "*" 4
-.IX Item "*"
-.RE
-.RS 4
-.PD
-.Sp
-This option is used to build a \fI.sym\fR file for a VxWorks kernel.
-It can also be a useful way of reducing the size of a \fB\-\-just\-symbols\fR
-linker input file.
-.RE
-.IP "\fB\-\-compress\-debug\-sections\fR" 4
-.IX Item "--compress-debug-sections"
-Compress \s-1DWARF\s0 debug sections using zlib.
-.IP "\fB\-\-decompress\-debug\-sections\fR" 4
-.IX Item "--decompress-debug-sections"
-Decompress \s-1DWARF\s0 debug sections using zlib.
-.IP "\fB\-V\fR" 4
-.IX Item "-V"
-.PD 0
-.IP "\fB\-\-version\fR" 4
-.IX Item "--version"
-.PD
-Show the version number of \fBobjcopy\fR.
-.IP "\fB\-v\fR" 4
-.IX Item "-v"
-.PD 0
-.IP "\fB\-\-verbose\fR" 4
-.IX Item "--verbose"
-.PD
-Verbose output: list all object files modified. In the case of
-archives, \fBobjcopy \-V\fR lists all members of the archive.
-.IP "\fB\-\-help\fR" 4
-.IX Item "--help"
-Show a summary of the options to \fBobjcopy\fR.
-.IP "\fB\-\-info\fR" 4
-.IX Item "--info"
-Display a list showing all architectures and object formats available.
-.IP "\fB@\fR\fIfile\fR" 4
-.IX Item "@file"
-Read command-line options from \fIfile\fR. The options read are
-inserted in place of the original @\fIfile\fR option. If \fIfile\fR
-does not exist, or cannot be read, then the option will be treated
-literally, and not removed.
-.Sp
-Options in \fIfile\fR are separated by whitespace. A whitespace
-character may be included in an option by surrounding the entire
-option in either single or double quotes. Any character (including a
-backslash) may be included by prefixing the character to be included
-with a backslash. The \fIfile\fR may itself contain additional
-@\fIfile\fR options; any such options will be processed recursively.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-\&\fIld\fR\|(1), \fIobjdump\fR\|(1), and the Info entries for \fIbinutils\fR.
-.SH "COPYRIGHT"
-.IX Header "COPYRIGHT"
-Copyright (c) 1991\-2013 Free Software Foundation, Inc.
-.PP
-Permission is granted to copy, distribute and/or modify this document
-under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.3
-or any later version published by the Free Software Foundation;
-with no Invariant Sections, with no Front-Cover Texts, and with no
-Back-Cover Texts. A copy of the license is included in the
-section entitled \*(L"\s-1GNU\s0 Free Documentation License\*(R".
diff -Nur binutils-2.24.orig/binutils/doc/objdump.1 binutils-2.24/binutils/doc/objdump.1
--- binutils-2.24.orig/binutils/doc/objdump.1 2013-11-18 09:49:31.000000000 +0100
+++ binutils-2.24/binutils/doc/objdump.1 1970-01-01 01:00:00.000000000 +0100
@@ -1,842 +0,0 @@
-.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings. \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote. \*(C+ will
-.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-. ds -- \(*W-
-. ds PI pi
-. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
-. ds L" ""
-. ds R" ""
-. ds C` ""
-. ds C' ""
-'br\}
-.el\{\
-. ds -- \|\(em\|
-. ds PI \(*p
-. ds L" ``
-. ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD. Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-. de IX
-. tm Index:\\$1\t\\n%\t"\\$2"
-..
-. nr % 0
-. rr F
-.\}
-.el \{\
-. de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear. Run. Save yourself. No user-serviceable parts.
-. \" fudge factors for nroff and troff
-.if n \{\
-. ds #H 0
-. ds #V .8m
-. ds #F .3m
-. ds #[ \f1
-. ds #] \fP
-.\}
-.if t \{\
-. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-. ds #V .6m
-. ds #F 0
-. ds #[ \&
-. ds #] \&
-.\}
-. \" simple accents for nroff and troff
-.if n \{\
-. ds ' \&
-. ds ` \&
-. ds ^ \&
-. ds , \&
-. ds ~ ~
-. ds /
-.\}
-.if t \{\
-. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-. \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-. \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-. \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-. ds : e
-. ds 8 ss
-. ds o a
-. ds d- d\h'-1'\(ga
-. ds D- D\h'-1'\(hy
-. ds th \o'bp'
-. ds Th \o'LP'
-. ds ae ae
-. ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "OBJDUMP 1"
-.TH OBJDUMP 1 "2013-11-18" "binutils-2.23.91" "GNU Development Tools"
-.\" For nroff, turn off justification. Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-objdump \- display information from object files.
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-objdump [\fB\-a\fR|\fB\-\-archive\-headers\fR]
- [\fB\-b\fR \fIbfdname\fR|\fB\-\-target=\fR\fIbfdname\fR]
- [\fB\-C\fR|\fB\-\-demangle\fR[=\fIstyle\fR] ]
- [\fB\-d\fR|\fB\-\-disassemble\fR]
- [\fB\-D\fR|\fB\-\-disassemble\-all\fR]
- [\fB\-z\fR|\fB\-\-disassemble\-zeroes\fR]
- [\fB\-EB\fR|\fB\-EL\fR|\fB\-\-endian=\fR{big | little }]
- [\fB\-f\fR|\fB\-\-file\-headers\fR]
- [\fB\-F\fR|\fB\-\-file\-offsets\fR]
- [\fB\-\-file\-start\-context\fR]
- [\fB\-g\fR|\fB\-\-debugging\fR]
- [\fB\-e\fR|\fB\-\-debugging\-tags\fR]
- [\fB\-h\fR|\fB\-\-section\-headers\fR|\fB\-\-headers\fR]
- [\fB\-i\fR|\fB\-\-info\fR]
- [\fB\-j\fR \fIsection\fR|\fB\-\-section=\fR\fIsection\fR]
- [\fB\-l\fR|\fB\-\-line\-numbers\fR]
- [\fB\-S\fR|\fB\-\-source\fR]
- [\fB\-m\fR \fImachine\fR|\fB\-\-architecture=\fR\fImachine\fR]
- [\fB\-M\fR \fIoptions\fR|\fB\-\-disassembler\-options=\fR\fIoptions\fR]
- [\fB\-p\fR|\fB\-\-private\-headers\fR]
- [\fB\-P\fR \fIoptions\fR|\fB\-\-private=\fR\fIoptions\fR]
- [\fB\-r\fR|\fB\-\-reloc\fR]
- [\fB\-R\fR|\fB\-\-dynamic\-reloc\fR]
- [\fB\-s\fR|\fB\-\-full\-contents\fR]
- [\fB\-W[lLiaprmfFsoRt]\fR|
- \fB\-\-dwarf\fR[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames\-interp,=str,=loc,=Ranges,=pubtypes,=trace_info,=trace_abbrev,=trace_aranges,=gdb_index]]
- [\fB\-G\fR|\fB\-\-stabs\fR]
- [\fB\-t\fR|\fB\-\-syms\fR]
- [\fB\-T\fR|\fB\-\-dynamic\-syms\fR]
- [\fB\-x\fR|\fB\-\-all\-headers\fR]
- [\fB\-w\fR|\fB\-\-wide\fR]
- [\fB\-\-start\-address=\fR\fIaddress\fR]
- [\fB\-\-stop\-address=\fR\fIaddress\fR]
- [\fB\-\-prefix\-addresses\fR]
- [\fB\-\-[no\-]show\-raw\-insn\fR]
- [\fB\-\-adjust\-vma=\fR\fIoffset\fR]
- [\fB\-\-special\-syms\fR]
- [\fB\-\-prefix=\fR\fIprefix\fR]
- [\fB\-\-prefix\-strip=\fR\fIlevel\fR]
- [\fB\-\-insn\-width=\fR\fIwidth\fR]
- [\fB\-V\fR|\fB\-\-version\fR]
- [\fB\-H\fR|\fB\-\-help\fR]
- \fIobjfile\fR...
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-\&\fBobjdump\fR displays information about one or more object files.
-The options control what particular information to display. This
-information is mostly useful to programmers who are working on the
-compilation tools, as opposed to programmers who just want their
-program to compile and work.
-.PP
-\&\fIobjfile\fR... are the object files to be examined. When you
-specify archives, \fBobjdump\fR shows information on each of the member
-object files.
-.SH "OPTIONS"
-.IX Header "OPTIONS"
-The long and short forms of options, shown here as alternatives, are
-equivalent. At least one option from the list
-\&\fB\-a,\-d,\-D,\-e,\-f,\-g,\-G,\-h,\-H,\-p,\-P,\-r,\-R,\-s,\-S,\-t,\-T,\-V,\-x\fR must be given.
-.IP "\fB\-a\fR" 4
-.IX Item "-a"
-.PD 0
-.IP "\fB\-\-archive\-header\fR" 4
-.IX Item "--archive-header"
-.PD
-If any of the \fIobjfile\fR files are archives, display the archive
-header information (in a format similar to \fBls \-l\fR). Besides the
-information you could list with \fBar tv\fR, \fBobjdump \-a\fR shows
-the object file format of each archive member.
-.IP "\fB\-\-adjust\-vma=\fR\fIoffset\fR" 4
-.IX Item "--adjust-vma=offset"
-When dumping information, first add \fIoffset\fR to all the section
-addresses. This is useful if the section addresses do not correspond to
-the symbol table, which can happen when putting sections at particular
-addresses when using a format which can not represent section addresses,
-such as a.out.
-.IP "\fB\-b\fR \fIbfdname\fR" 4
-.IX Item "-b bfdname"
-.PD 0
-.IP "\fB\-\-target=\fR\fIbfdname\fR" 4
-.IX Item "--target=bfdname"
-.PD
-Specify that the object-code format for the object files is
-\&\fIbfdname\fR. This option may not be necessary; \fIobjdump\fR can
-automatically recognize many formats.
-.Sp
-For example,
-.Sp
-.Vb 1
-\& objdump \-b oasys \-m vax \-h fu.o
-.Ve
-.Sp
-displays summary information from the section headers (\fB\-h\fR) of
-\&\fIfu.o\fR, which is explicitly identified (\fB\-m\fR) as a \s-1VAX\s0 object
-file in the format produced by Oasys compilers. You can list the
-formats available with the \fB\-i\fR option.
-.IP "\fB\-C\fR" 4
-.IX Item "-C"
-.PD 0
-.IP "\fB\-\-demangle[=\fR\fIstyle\fR\fB]\fR" 4
-.IX Item "--demangle[=style]"
-.PD
-Decode (\fIdemangle\fR) low-level symbol names into user-level names.
-Besides removing any initial underscore prepended by the system, this
-makes \*(C+ function names readable. Different compilers have different
-mangling styles. The optional demangling style argument can be used to
-choose an appropriate demangling style for your compiler.
-.IP "\fB\-g\fR" 4
-.IX Item "-g"
-.PD 0
-.IP "\fB\-\-debugging\fR" 4
-.IX Item "--debugging"
-.PD
-Display debugging information. This attempts to parse \s-1STABS\s0 and \s-1IEEE\s0
-debugging format information stored in the file and print it out using
-a C like syntax. If neither of these formats are found this option
-falls back on the \fB\-W\fR option to print any \s-1DWARF\s0 information in
-the file.
-.IP "\fB\-e\fR" 4
-.IX Item "-e"
-.PD 0
-.IP "\fB\-\-debugging\-tags\fR" 4
-.IX Item "--debugging-tags"
-.PD
-Like \fB\-g\fR, but the information is generated in a format compatible
-with ctags tool.
-.IP "\fB\-d\fR" 4
-.IX Item "-d"
-.PD 0
-.IP "\fB\-\-disassemble\fR" 4
-.IX Item "--disassemble"
-.PD
-Display the assembler mnemonics for the machine instructions from
-\&\fIobjfile\fR. This option only disassembles those sections which are
-expected to contain instructions.
-.IP "\fB\-D\fR" 4
-.IX Item "-D"
-.PD 0
-.IP "\fB\-\-disassemble\-all\fR" 4
-.IX Item "--disassemble-all"
-.PD
-Like \fB\-d\fR, but disassemble the contents of all sections, not just
-those expected to contain instructions.
-.Sp
-If the target is an \s-1ARM\s0 architecture this switch also has the effect
-of forcing the disassembler to decode pieces of data found in code
-sections as if they were instructions.
-.IP "\fB\-\-prefix\-addresses\fR" 4
-.IX Item "--prefix-addresses"
-When disassembling, print the complete address on each line. This is
-the older disassembly format.
-.IP "\fB\-EB\fR" 4
-.IX Item "-EB"
-.PD 0
-.IP "\fB\-EL\fR" 4
-.IX Item "-EL"
-.IP "\fB\-\-endian={big|little}\fR" 4
-.IX Item "--endian={big|little}"
-.PD
-Specify the endianness of the object files. This only affects
-disassembly. This can be useful when disassembling a file format which
-does not describe endianness information, such as S\-records.
-.IP "\fB\-f\fR" 4
-.IX Item "-f"
-.PD 0
-.IP "\fB\-\-file\-headers\fR" 4
-.IX Item "--file-headers"
-.PD
-Display summary information from the overall header of
-each of the \fIobjfile\fR files.
-.IP "\fB\-F\fR" 4
-.IX Item "-F"
-.PD 0
-.IP "\fB\-\-file\-offsets\fR" 4
-.IX Item "--file-offsets"
-.PD
-When disassembling sections, whenever a symbol is displayed, also
-display the file offset of the region of data that is about to be
-dumped. If zeroes are being skipped, then when disassembly resumes,
-tell the user how many zeroes were skipped and the file offset of the
-location from where the disassembly resumes. When dumping sections,
-display the file offset of the location from where the dump starts.
-.IP "\fB\-\-file\-start\-context\fR" 4
-.IX Item "--file-start-context"
-Specify that when displaying interlisted source code/disassembly
-(assumes \fB\-S\fR) from a file that has not yet been displayed, extend the
-context to the start of the file.
-.IP "\fB\-h\fR" 4
-.IX Item "-h"
-.PD 0
-.IP "\fB\-\-section\-headers\fR" 4
-.IX Item "--section-headers"
-.IP "\fB\-\-headers\fR" 4
-.IX Item "--headers"
-.PD
-Display summary information from the section headers of the
-object file.
-.Sp
-File segments may be relocated to nonstandard addresses, for example by
-using the \fB\-Ttext\fR, \fB\-Tdata\fR, or \fB\-Tbss\fR options to
-\&\fBld\fR. However, some object file formats, such as a.out, do not
-store the starting address of the file segments. In those situations,
-although \fBld\fR relocates the sections correctly, using \fBobjdump
-\&\-h\fR to list the file section headers cannot show the correct addresses.
-Instead, it shows the usual addresses, which are implicit for the
-target.
-.IP "\fB\-H\fR" 4
-.IX Item "-H"
-.PD 0
-.IP "\fB\-\-help\fR" 4
-.IX Item "--help"
-.PD
-Print a summary of the options to \fBobjdump\fR and exit.
-.IP "\fB\-i\fR" 4
-.IX Item "-i"
-.PD 0
-.IP "\fB\-\-info\fR" 4
-.IX Item "--info"
-.PD
-Display a list showing all architectures and object formats available
-for specification with \fB\-b\fR or \fB\-m\fR.
-.IP "\fB\-j\fR \fIname\fR" 4
-.IX Item "-j name"
-.PD 0
-.IP "\fB\-\-section=\fR\fIname\fR" 4
-.IX Item "--section=name"
-.PD
-Display information only for section \fIname\fR.
-.IP "\fB\-l\fR" 4
-.IX Item "-l"
-.PD 0
-.IP "\fB\-\-line\-numbers\fR" 4
-.IX Item "--line-numbers"
-.PD
-Label the display (using debugging information) with the filename and
-source line numbers corresponding to the object code or relocs shown.
-Only useful with \fB\-d\fR, \fB\-D\fR, or \fB\-r\fR.
-.IP "\fB\-m\fR \fImachine\fR" 4
-.IX Item "-m machine"
-.PD 0
-.IP "\fB\-\-architecture=\fR\fImachine\fR" 4
-.IX Item "--architecture=machine"
-.PD
-Specify the architecture to use when disassembling object files. This
-can be useful when disassembling object files which do not describe
-architecture information, such as S\-records. You can list the available
-architectures with the \fB\-i\fR option.
-.Sp
-If the target is an \s-1ARM\s0 architecture then this switch has an
-additional effect. It restricts the disassembly to only those
-instructions supported by the architecture specified by \fImachine\fR.
-If it is necessary to use this switch because the input file does not
-contain any architecture information, but it is also desired to
-disassemble all the instructions use \fB\-marm\fR.
-.IP "\fB\-M\fR \fIoptions\fR" 4
-.IX Item "-M options"
-.PD 0
-.IP "\fB\-\-disassembler\-options=\fR\fIoptions\fR" 4
-.IX Item "--disassembler-options=options"
-.PD
-Pass target specific information to the disassembler. Only supported on
-some targets. If it is necessary to specify more than one
-disassembler option then multiple \fB\-M\fR options can be used or
-can be placed together into a comma separated list.
-.Sp
-If the target is an \s-1ARM\s0 architecture then this switch can be used to
-select which register name set is used during disassembler. Specifying
-\&\fB\-M reg-names-std\fR (the default) will select the register names as
-used in \s-1ARM\s0's instruction set documentation, but with register 13 called
-\&'sp', register 14 called 'lr' and register 15 called 'pc'. Specifying
-\&\fB\-M reg-names-apcs\fR will select the name set used by the \s-1ARM\s0
-Procedure Call Standard, whilst specifying \fB\-M reg-names-raw\fR will
-just use \fBr\fR followed by the register number.
-.Sp
-There are also two variants on the \s-1APCS\s0 register naming scheme enabled
-by \fB\-M reg-names-atpcs\fR and \fB\-M reg-names-special-atpcs\fR which
-use the ARM/Thumb Procedure Call Standard naming conventions. (Either
-with the normal register names or the special register names).
-.Sp
-This option can also be used for \s-1ARM\s0 architectures to force the
-disassembler to interpret all instructions as Thumb instructions by
-using the switch \fB\-\-disassembler\-options=force\-thumb\fR. This can be
-useful when attempting to disassemble thumb code produced by other
-compilers.
-.Sp
-For the x86, some of the options duplicate functions of the \fB\-m\fR
-switch, but allow finer grained control. Multiple selections from the
-following may be specified as a comma separated string.
-\&\fBx86\-64\fR, \fBi386\fR and \fBi8086\fR select disassembly for
-the given architecture. \fBintel\fR and \fBatt\fR select between
-intel syntax mode and \s-1AT&T\s0 syntax mode.
-\&\fBintel-mnemonic\fR and \fBatt-mnemonic\fR select between
-intel mnemonic mode and \s-1AT&T\s0 mnemonic mode. \fBintel-mnemonic\fR
-implies \fBintel\fR and \fBatt-mnemonic\fR implies \fBatt\fR.
-\&\fBaddr64\fR, \fBaddr32\fR,
-\&\fBaddr16\fR, \fBdata32\fR and \fBdata16\fR specify the default
-address size and operand size. These four options will be overridden if
-\&\fBx86\-64\fR, \fBi386\fR or \fBi8086\fR appear later in the
-option string. Lastly, \fBsuffix\fR, when in \s-1AT&T\s0 mode,
-instructs the disassembler to print a mnemonic suffix even when the
-suffix could be inferred by the operands.
-.Sp
-For PowerPC, \fBbooke\fR controls the disassembly of BookE
-instructions. \fB32\fR and \fB64\fR select PowerPC and
-PowerPC64 disassembly, respectively. \fBe300\fR selects
-disassembly for the e300 family. \fB440\fR selects disassembly for
-the PowerPC 440. \fBppcps\fR selects disassembly for the paired
-single instructions of the \s-1PPC750CL\s0.
-.Sp
-For \s-1MIPS\s0, this option controls the printing of instruction mnemonic
-names and register names in disassembled instructions. Multiple
-selections from the following may be specified as a comma separated
-string, and invalid options are ignored:
-.RS 4
-.ie n .IP """no\-aliases""" 4
-.el .IP "\f(CWno\-aliases\fR" 4
-.IX Item "no-aliases"
-Print the 'raw' instruction mnemonic instead of some pseudo
-instruction mnemonic. I.e., print 'daddu' or 'or' instead of 'move',
-\&'sll' instead of 'nop', etc.
-.ie n .IP """virt""" 4
-.el .IP "\f(CWvirt\fR" 4
-.IX Item "virt"
-Disassemble the virtualization \s-1ASE\s0 instructions.
-.ie n .IP """gpr\-names=\f(CIABI\f(CW""" 4
-.el .IP "\f(CWgpr\-names=\f(CIABI\f(CW\fR" 4
-.IX Item "gpr-names=ABI"
-Print \s-1GPR\s0 (general-purpose register) names as appropriate
-for the specified \s-1ABI\s0. By default, \s-1GPR\s0 names are selected according to
-the \s-1ABI\s0 of the binary being disassembled.
-.ie n .IP """fpr\-names=\f(CIABI\f(CW""" 4
-.el .IP "\f(CWfpr\-names=\f(CIABI\f(CW\fR" 4
-.IX Item "fpr-names=ABI"
-Print \s-1FPR\s0 (floating-point register) names as
-appropriate for the specified \s-1ABI\s0. By default, \s-1FPR\s0 numbers are printed
-rather than names.
-.ie n .IP """cp0\-names=\f(CIARCH\f(CW""" 4
-.el .IP "\f(CWcp0\-names=\f(CIARCH\f(CW\fR" 4
-.IX Item "cp0-names=ARCH"
-Print \s-1CP0\s0 (system control coprocessor; coprocessor 0) register names
-as appropriate for the \s-1CPU\s0 or architecture specified by
-\&\fI\s-1ARCH\s0\fR. By default, \s-1CP0\s0 register names are selected according to
-the architecture and \s-1CPU\s0 of the binary being disassembled.
-.ie n .IP """hwr\-names=\f(CIARCH\f(CW""" 4
-.el .IP "\f(CWhwr\-names=\f(CIARCH\f(CW\fR" 4
-.IX Item "hwr-names=ARCH"
-Print \s-1HWR\s0 (hardware register, used by the \f(CW\*(C`rdhwr\*(C'\fR instruction) names
-as appropriate for the \s-1CPU\s0 or architecture specified by
-\&\fI\s-1ARCH\s0\fR. By default, \s-1HWR\s0 names are selected according to
-the architecture and \s-1CPU\s0 of the binary being disassembled.
-.ie n .IP """reg\-names=\f(CIABI\f(CW""" 4
-.el .IP "\f(CWreg\-names=\f(CIABI\f(CW\fR" 4
-.IX Item "reg-names=ABI"
-Print \s-1GPR\s0 and \s-1FPR\s0 names as appropriate for the selected \s-1ABI\s0.
-.ie n .IP """reg\-names=\f(CIARCH\f(CW""" 4
-.el .IP "\f(CWreg\-names=\f(CIARCH\f(CW\fR" 4
-.IX Item "reg-names=ARCH"
-Print CPU-specific register names (\s-1CP0\s0 register and \s-1HWR\s0 names)
-as appropriate for the selected \s-1CPU\s0 or architecture.
-.RE
-.RS 4
-.Sp
-For any of the options listed above, \fI\s-1ABI\s0\fR or
-\&\fI\s-1ARCH\s0\fR may be specified as \fBnumeric\fR to have numbers printed
-rather than names, for the selected types of registers.
-You can list the available values of \fI\s-1ABI\s0\fR and \fI\s-1ARCH\s0\fR using
-the \fB\-\-help\fR option.
-.Sp
-For \s-1VAX\s0, you can specify function entry addresses with \fB\-M
-entry:0xf00ba\fR. You can use this multiple times to properly
-disassemble \s-1VAX\s0 binary files that don't contain symbol tables (like
-\&\s-1ROM\s0 dumps). In these cases, the function entry mask would otherwise
-be decoded as \s-1VAX\s0 instructions, which would probably lead the rest
-of the function being wrongly disassembled.
-.RE
-.IP "\fB\-p\fR" 4
-.IX Item "-p"
-.PD 0
-.IP "\fB\-\-private\-headers\fR" 4
-.IX Item "--private-headers"
-.PD
-Print information that is specific to the object file format. The exact
-information printed depends upon the object file format. For some
-object file formats, no additional information is printed.
-.IP "\fB\-P\fR \fIoptions\fR" 4
-.IX Item "-P options"
-.PD 0
-.IP "\fB\-\-private=\fR\fIoptions\fR" 4
-.IX Item "--private=options"
-.PD
-Print information that is specific to the object file format. The
-argument \fIoptions\fR is a comma separated list that depends on the
-format (the lists of options is displayed with the help).
-.Sp
-For \s-1XCOFF\s0, the available options are: \fBheader\fR, \fBaout\fR,
-\&\fBsections\fR, \fBsyms\fR, \fBrelocs\fR, \fBlineno\fR,
-\&\fBloader\fR, \fBexcept\fR, \fBtypchk\fR, \fBtraceback\fR,
-\&\fBtoc\fR and \fBldinfo\fR.
-.IP "\fB\-r\fR" 4
-.IX Item "-r"
-.PD 0
-.IP "\fB\-\-reloc\fR" 4
-.IX Item "--reloc"
-.PD
-Print the relocation entries of the file. If used with \fB\-d\fR or
-\&\fB\-D\fR, the relocations are printed interspersed with the
-disassembly.
-.IP "\fB\-R\fR" 4
-.IX Item "-R"
-.PD 0
-.IP "\fB\-\-dynamic\-reloc\fR" 4
-.IX Item "--dynamic-reloc"
-.PD
-Print the dynamic relocation entries of the file. This is only
-meaningful for dynamic objects, such as certain types of shared
-libraries. As for \fB\-r\fR, if used with \fB\-d\fR or
-\&\fB\-D\fR, the relocations are printed interspersed with the
-disassembly.
-.IP "\fB\-s\fR" 4
-.IX Item "-s"
-.PD 0
-.IP "\fB\-\-full\-contents\fR" 4
-.IX Item "--full-contents"
-.PD
-Display the full contents of any sections requested. By default all
-non-empty sections are displayed.
-.IP "\fB\-S\fR" 4
-.IX Item "-S"
-.PD 0
-.IP "\fB\-\-source\fR" 4
-.IX Item "--source"
-.PD
-Display source code intermixed with disassembly, if possible. Implies
-\&\fB\-d\fR.
-.IP "\fB\-\-prefix=\fR\fIprefix\fR" 4
-.IX Item "--prefix=prefix"
-Specify \fIprefix\fR to add to the absolute paths when used with
-\&\fB\-S\fR.
-.IP "\fB\-\-prefix\-strip=\fR\fIlevel\fR" 4
-.IX Item "--prefix-strip=level"
-Indicate how many initial directory names to strip off the hardwired
-absolute paths. It has no effect without \fB\-\-prefix=\fR\fIprefix\fR.
-.IP "\fB\-\-show\-raw\-insn\fR" 4
-.IX Item "--show-raw-insn"
-When disassembling instructions, print the instruction in hex as well as
-in symbolic form. This is the default except when
-\&\fB\-\-prefix\-addresses\fR is used.
-.IP "\fB\-\-no\-show\-raw\-insn\fR" 4
-.IX Item "--no-show-raw-insn"
-When disassembling instructions, do not print the instruction bytes.
-This is the default when \fB\-\-prefix\-addresses\fR is used.
-.IP "\fB\-\-insn\-width=\fR\fIwidth\fR" 4
-.IX Item "--insn-width=width"
-Display \fIwidth\fR bytes on a single line when disassembling
-instructions.
-.IP "\fB\-W[lLiaprmfFsoRt]\fR" 4
-.IX Item "-W[lLiaprmfFsoRt]"
-.PD 0
-.IP "\fB\-\-dwarf[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames\-interp,=str,=loc,=Ranges,=pubtypes,=trace_info,=trace_abbrev,=trace_aranges,=gdb_index]\fR" 4
-.IX Item "--dwarf[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges,=pubtypes,=trace_info,=trace_abbrev,=trace_aranges,=gdb_index]"
-.PD
-Displays the contents of the debug sections in the file, if any are
-present. If one of the optional letters or words follows the switch
-then only data found in those specific sections will be dumped.
-.Sp
-Note that there is no single letter option to display the content of
-trace sections or .gdb_index.
-.Sp
-Note: the output from the \fB=info\fR option can also be affected
-by the options \fB\-\-dwarf\-depth\fR, the \fB\-\-dwarf\-start\fR and
-the \fB\-\-dwarf\-check\fR.
-.IP "\fB\-\-dwarf\-depth=\fR\fIn\fR" 4
-.IX Item "--dwarf-depth=n"
-Limit the dump of the \f(CW\*(C`.debug_info\*(C'\fR section to \fIn\fR children.
-This is only useful with \fB\-\-dwarf=info\fR. The default is
-to print all DIEs; the special value 0 for \fIn\fR will also have this
-effect.
-.Sp
-With a non-zero value for \fIn\fR, DIEs at or deeper than \fIn\fR
-levels will not be printed. The range for \fIn\fR is zero-based.
-.IP "\fB\-\-dwarf\-start=\fR\fIn\fR" 4
-.IX Item "--dwarf-start=n"
-Print only DIEs beginning with the \s-1DIE\s0 numbered \fIn\fR. This is only
-useful with \fB\-\-dwarf=info\fR.
-.Sp
-If specified, this option will suppress printing of any header
-information and all DIEs before the \s-1DIE\s0 numbered \fIn\fR. Only
-siblings and children of the specified \s-1DIE\s0 will be printed.
-.Sp
-This can be used in conjunction with \fB\-\-dwarf\-depth\fR.
-.IP "\fB\-\-dwarf\-check\fR" 4
-.IX Item "--dwarf-check"
-Enable additional checks for consistency of Dwarf information.
-.IP "\fB\-G\fR" 4
-.IX Item "-G"
-.PD 0
-.IP "\fB\-\-stabs\fR" 4
-.IX Item "--stabs"
-.PD
-Display the full contents of any sections requested. Display the
-contents of the .stab and .stab.index and .stab.excl sections from an
-\&\s-1ELF\s0 file. This is only useful on systems (such as Solaris 2.0) in which
-\&\f(CW\*(C`.stab\*(C'\fR debugging symbol-table entries are carried in an \s-1ELF\s0
-section. In most other file formats, debugging symbol-table entries are
-interleaved with linkage symbols, and are visible in the \fB\-\-syms\fR
-output.
-.IP "\fB\-\-start\-address=\fR\fIaddress\fR" 4
-.IX Item "--start-address=address"
-Start displaying data at the specified address. This affects the output
-of the \fB\-d\fR, \fB\-r\fR and \fB\-s\fR options.
-.IP "\fB\-\-stop\-address=\fR\fIaddress\fR" 4
-.IX Item "--stop-address=address"
-Stop displaying data at the specified address. This affects the output
-of the \fB\-d\fR, \fB\-r\fR and \fB\-s\fR options.
-.IP "\fB\-t\fR" 4
-.IX Item "-t"
-.PD 0
-.IP "\fB\-\-syms\fR" 4
-.IX Item "--syms"
-.PD
-Print the symbol table entries of the file.
-This is similar to the information provided by the \fBnm\fR program,
-although the display format is different. The format of the output
-depends upon the format of the file being dumped, but there are two main
-types. One looks like this:
-.Sp
-.Vb 2
-\& [ 4](sec 3)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x00000000 .bss
-\& [ 6](sec 1)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000000 fred
-.Ve
-.Sp
-where the number inside the square brackets is the number of the entry
-in the symbol table, the \fIsec\fR number is the section number, the
-\&\fIfl\fR value are the symbol's flag bits, the \fIty\fR number is the
-symbol's type, the \fIscl\fR number is the symbol's storage class and
-the \fInx\fR value is the number of auxilary entries associated with
-the symbol. The last two fields are the symbol's value and its name.
-.Sp
-The other common output format, usually seen with \s-1ELF\s0 based files,
-looks like this:
-.Sp
-.Vb 2
-\& 00000000 l d .bss 00000000 .bss
-\& 00000000 g .text 00000000 fred
-.Ve
-.Sp
-Here the first number is the symbol's value (sometimes refered to as
-its address). The next field is actually a set of characters and
-spaces indicating the flag bits that are set on the symbol. These
-characters are described below. Next is the section with which the
-symbol is associated or \fI*ABS*\fR if the section is absolute (ie
-not connected with any section), or \fI*UND*\fR if the section is
-referenced in the file being dumped, but not defined there.
-.Sp
-After the section name comes another field, a number, which for common
-symbols is the alignment and for other symbol is the size. Finally
-the symbol's name is displayed.
-.Sp
-The flag characters are divided into 7 groups as follows:
-.RS 4
-.ie n .IP """l""" 4
-.el .IP "\f(CWl\fR" 4
-.IX Item "l"
-.PD 0
-.ie n .IP """g""" 4
-.el .IP "\f(CWg\fR" 4
-.IX Item "g"
-.ie n .IP """u""" 4
-.el .IP "\f(CWu\fR" 4
-.IX Item "u"
-.ie n .IP """!""" 4
-.el .IP "\f(CW!\fR" 4
-.IX Item "!"
-.PD
-The symbol is a local (l), global (g), unique global (u), neither
-global nor local (a space) or both global and local (!). A
-symbol can be neither local or global for a variety of reasons, e.g.,
-because it is used for debugging, but it is probably an indication of
-a bug if it is ever both local and global. Unique global symbols are
-a \s-1GNU\s0 extension to the standard set of \s-1ELF\s0 symbol bindings. For such
-a symbol the dynamic linker will make sure that in the entire process
-there is just one symbol with this name and type in use.
-.ie n .IP """w""" 4
-.el .IP "\f(CWw\fR" 4
-.IX Item "w"
-The symbol is weak (w) or strong (a space).
-.ie n .IP """C""" 4
-.el .IP "\f(CWC\fR" 4
-.IX Item "C"
-The symbol denotes a constructor (C) or an ordinary symbol (a space).
-.ie n .IP """W""" 4
-.el .IP "\f(CWW\fR" 4
-.IX Item "W"
-The symbol is a warning (W) or a normal symbol (a space). A warning
-symbol's name is a message to be displayed if the symbol following the
-warning symbol is ever referenced.
-.ie n .IP """I""" 4
-.el .IP "\f(CWI\fR" 4
-.IX Item "I"
-.PD 0
-.ie n .IP """i""" 4
-.el .IP "\f(CWi\fR" 4
-.IX Item "i"
-.PD
-The symbol is an indirect reference to another symbol (I), a function
-to be evaluated during reloc processing (i) or a normal symbol (a
-space).
-.ie n .IP """d""" 4
-.el .IP "\f(CWd\fR" 4
-.IX Item "d"
-.PD 0
-.ie n .IP """D""" 4
-.el .IP "\f(CWD\fR" 4
-.IX Item "D"
-.PD
-The symbol is a debugging symbol (d) or a dynamic symbol (D) or a
-normal symbol (a space).
-.ie n .IP """F""" 4
-.el .IP "\f(CWF\fR" 4
-.IX Item "F"
-.PD 0
-.ie n .IP """f""" 4
-.el .IP "\f(CWf\fR" 4
-.IX Item "f"
-.ie n .IP """O""" 4
-.el .IP "\f(CWO\fR" 4
-.IX Item "O"
-.PD
-The symbol is the name of a function (F) or a file (f) or an object
-(O) or just a normal symbol (a space).
-.RE
-.RS 4
-.RE
-.IP "\fB\-T\fR" 4
-.IX Item "-T"
-.PD 0
-.IP "\fB\-\-dynamic\-syms\fR" 4
-.IX Item "--dynamic-syms"
-.PD
-Print the dynamic symbol table entries of the file. This is only
-meaningful for dynamic objects, such as certain types of shared
-libraries. This is similar to the information provided by the \fBnm\fR
-program when given the \fB\-D\fR (\fB\-\-dynamic\fR) option.
-.IP "\fB\-\-special\-syms\fR" 4
-.IX Item "--special-syms"
-When displaying symbols include those which the target considers to be
-special in some way and which would not normally be of interest to the
-user.
-.IP "\fB\-V\fR" 4
-.IX Item "-V"
-.PD 0
-.IP "\fB\-\-version\fR" 4
-.IX Item "--version"
-.PD
-Print the version number of \fBobjdump\fR and exit.
-.IP "\fB\-x\fR" 4
-.IX Item "-x"
-.PD 0
-.IP "\fB\-\-all\-headers\fR" 4
-.IX Item "--all-headers"
-.PD
-Display all available header information, including the symbol table and
-relocation entries. Using \fB\-x\fR is equivalent to specifying all of
-\&\fB\-a \-f \-h \-p \-r \-t\fR.
-.IP "\fB\-w\fR" 4
-.IX Item "-w"
-.PD 0
-.IP "\fB\-\-wide\fR" 4
-.IX Item "--wide"
-.PD
-Format some lines for output devices that have more than 80 columns.
-Also do not truncate symbol names when they are displayed.
-.IP "\fB\-z\fR" 4
-.IX Item "-z"
-.PD 0
-.IP "\fB\-\-disassemble\-zeroes\fR" 4
-.IX Item "--disassemble-zeroes"
-.PD
-Normally the disassembly output will skip blocks of zeroes. This
-option directs the disassembler to disassemble those blocks, just like
-any other data.
-.IP "\fB@\fR\fIfile\fR" 4
-.IX Item "@file"
-Read command-line options from \fIfile\fR. The options read are
-inserted in place of the original @\fIfile\fR option. If \fIfile\fR
-does not exist, or cannot be read, then the option will be treated
-literally, and not removed.
-.Sp
-Options in \fIfile\fR are separated by whitespace. A whitespace
-character may be included in an option by surrounding the entire
-option in either single or double quotes. Any character (including a
-backslash) may be included by prefixing the character to be included
-with a backslash. The \fIfile\fR may itself contain additional
-@\fIfile\fR options; any such options will be processed recursively.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-\&\fInm\fR\|(1), \fIreadelf\fR\|(1), and the Info entries for \fIbinutils\fR.
-.SH "COPYRIGHT"
-.IX Header "COPYRIGHT"
-Copyright (c) 1991\-2013 Free Software Foundation, Inc.
-.PP
-Permission is granted to copy, distribute and/or modify this document
-under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.3
-or any later version published by the Free Software Foundation;
-with no Invariant Sections, with no Front-Cover Texts, and with no
-Back-Cover Texts. A copy of the license is included in the
-section entitled \*(L"\s-1GNU\s0 Free Documentation License\*(R".
diff -Nur binutils-2.24.orig/binutils/doc/ranlib.1 binutils-2.24/binutils/doc/ranlib.1
--- binutils-2.24.orig/binutils/doc/ranlib.1 2013-11-18 09:49:31.000000000 +0100
+++ binutils-2.24/binutils/doc/ranlib.1 1970-01-01 01:00:00.000000000 +0100
@@ -1,218 +0,0 @@
-.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings. \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote. \*(C+ will
-.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-. ds -- \(*W-
-. ds PI pi
-. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
-. ds L" ""
-. ds R" ""
-. ds C` ""
-. ds C' ""
-'br\}
-.el\{\
-. ds -- \|\(em\|
-. ds PI \(*p
-. ds L" ``
-. ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD. Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-. de IX
-. tm Index:\\$1\t\\n%\t"\\$2"
-..
-. nr % 0
-. rr F
-.\}
-.el \{\
-. de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear. Run. Save yourself. No user-serviceable parts.
-. \" fudge factors for nroff and troff
-.if n \{\
-. ds #H 0
-. ds #V .8m
-. ds #F .3m
-. ds #[ \f1
-. ds #] \fP
-.\}
-.if t \{\
-. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-. ds #V .6m
-. ds #F 0
-. ds #[ \&
-. ds #] \&
-.\}
-. \" simple accents for nroff and troff
-.if n \{\
-. ds ' \&
-. ds ` \&
-. ds ^ \&
-. ds , \&
-. ds ~ ~
-. ds /
-.\}
-.if t \{\
-. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-. \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-. \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-. \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-. ds : e
-. ds 8 ss
-. ds o a
-. ds d- d\h'-1'\(ga
-. ds D- D\h'-1'\(hy
-. ds th \o'bp'
-. ds Th \o'LP'
-. ds ae ae
-. ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "RANLIB 1"
-.TH RANLIB 1 "2013-11-18" "binutils-2.23.91" "GNU Development Tools"
-.\" For nroff, turn off justification. Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-ranlib \- generate index to archive.
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-ranlib [\fB\-\-plugin\fR \fIname\fR] [\fB\-DhHvVt\fR] \fIarchive\fR
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-\&\fBranlib\fR generates an index to the contents of an archive and
-stores it in the archive. The index lists each symbol defined by a
-member of an archive that is a relocatable object file.
-.PP
-You may use \fBnm \-s\fR or \fBnm \-\-print\-armap\fR to list this index.
-.PP
-An archive with such an index speeds up linking to the library and
-allows routines in the library to call each other without regard to
-their placement in the archive.
-.PP
-The \s-1GNU\s0 \fBranlib\fR program is another form of \s-1GNU\s0 \fBar\fR; running
-\&\fBranlib\fR is completely equivalent to executing \fBar \-s\fR.
-.SH "OPTIONS"
-.IX Header "OPTIONS"
-.IP "\fB\-h\fR" 4
-.IX Item "-h"
-.PD 0
-.IP "\fB\-H\fR" 4
-.IX Item "-H"
-.IP "\fB\-\-help\fR" 4
-.IX Item "--help"
-.PD
-Show usage information for \fBranlib\fR.
-.IP "\fB\-v\fR" 4
-.IX Item "-v"
-.PD 0
-.IP "\fB\-V\fR" 4
-.IX Item "-V"
-.IP "\fB\-\-version\fR" 4
-.IX Item "--version"
-.PD
-Show the version number of \fBranlib\fR.
-.IP "\fB\-D\fR" 4
-.IX Item "-D"
-Operate in \fIdeterministic\fR mode. The symbol map archive member's
-header will show zero for the \s-1UID\s0, \s-1GID\s0, and timestamp. When this
-option is used, multiple runs will produce identical output files.
-.Sp
-If \fIbinutils\fR was configured with
-\&\fB\-\-enable\-deterministic\-archives\fR, then this mode is on by
-default. It can be disabled with the \fB\-U\fR option, described
-below.
-.IP "\fB\-t\fR" 4
-.IX Item "-t"
-Update the timestamp of the symbol map of an archive.
-.IP "\fB\-U\fR" 4
-.IX Item "-U"
-Do \fInot\fR operate in \fIdeterministic\fR mode. This is the
-inverse of the \fB\-D\fR option, above: the archive index will get
-actual \s-1UID\s0, \s-1GID\s0, timestamp, and file mode values.
-.Sp
-If \fIbinutils\fR was configured \fIwithout\fR
-\&\fB\-\-enable\-deterministic\-archives\fR, then this mode is on by
-default.
-.IP "\fB@\fR\fIfile\fR" 4
-.IX Item "@file"
-Read command-line options from \fIfile\fR. The options read are
-inserted in place of the original @\fIfile\fR option. If \fIfile\fR
-does not exist, or cannot be read, then the option will be treated
-literally, and not removed.
-.Sp
-Options in \fIfile\fR are separated by whitespace. A whitespace
-character may be included in an option by surrounding the entire
-option in either single or double quotes. Any character (including a
-backslash) may be included by prefixing the character to be included
-with a backslash. The \fIfile\fR may itself contain additional
-@\fIfile\fR options; any such options will be processed recursively.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-\&\fIar\fR\|(1), \fInm\fR\|(1), and the Info entries for \fIbinutils\fR.
-.SH "COPYRIGHT"
-.IX Header "COPYRIGHT"
-Copyright (c) 1991\-2013 Free Software Foundation, Inc.
-.PP
-Permission is granted to copy, distribute and/or modify this document
-under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.3
-or any later version published by the Free Software Foundation;
-with no Invariant Sections, with no Front-Cover Texts, and with no
-Back-Cover Texts. A copy of the license is included in the
-section entitled \*(L"\s-1GNU\s0 Free Documentation License\*(R".
diff -Nur binutils-2.24.orig/binutils/doc/readelf.1 binutils-2.24/binutils/doc/readelf.1
--- binutils-2.24.orig/binutils/doc/readelf.1 2013-11-18 09:49:31.000000000 +0100
+++ binutils-2.24/binutils/doc/readelf.1 1970-01-01 01:00:00.000000000 +0100
@@ -1,448 +0,0 @@
-.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings. \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote. \*(C+ will
-.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-. ds -- \(*W-
-. ds PI pi
-. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
-. ds L" ""
-. ds R" ""
-. ds C` ""
-. ds C' ""
-'br\}
-.el\{\
-. ds -- \|\(em\|
-. ds PI \(*p
-. ds L" ``
-. ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD. Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-. de IX
-. tm Index:\\$1\t\\n%\t"\\$2"
-..
-. nr % 0
-. rr F
-.\}
-.el \{\
-. de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear. Run. Save yourself. No user-serviceable parts.
-. \" fudge factors for nroff and troff
-.if n \{\
-. ds #H 0
-. ds #V .8m
-. ds #F .3m
-. ds #[ \f1
-. ds #] \fP
-.\}
-.if t \{\
-. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-. ds #V .6m
-. ds #F 0
-. ds #[ \&
-. ds #] \&
-.\}
-. \" simple accents for nroff and troff
-.if n \{\
-. ds ' \&
-. ds ` \&
-. ds ^ \&
-. ds , \&
-. ds ~ ~
-. ds /
-.\}
-.if t \{\
-. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-. \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-. \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-. \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-. ds : e
-. ds 8 ss
-. ds o a
-. ds d- d\h'-1'\(ga
-. ds D- D\h'-1'\(hy
-. ds th \o'bp'
-. ds Th \o'LP'
-. ds ae ae
-. ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "READELF 1"
-.TH READELF 1 "2013-11-18" "binutils-2.23.91" "GNU Development Tools"
-.\" For nroff, turn off justification. Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-readelf \- Displays information about ELF files.
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-readelf [\fB\-a\fR|\fB\-\-all\fR]
- [\fB\-h\fR|\fB\-\-file\-header\fR]
- [\fB\-l\fR|\fB\-\-program\-headers\fR|\fB\-\-segments\fR]
- [\fB\-S\fR|\fB\-\-section\-headers\fR|\fB\-\-sections\fR]
- [\fB\-g\fR|\fB\-\-section\-groups\fR]
- [\fB\-t\fR|\fB\-\-section\-details\fR]
- [\fB\-e\fR|\fB\-\-headers\fR]
- [\fB\-s\fR|\fB\-\-syms\fR|\fB\-\-symbols\fR]
- [\fB\-\-dyn\-syms\fR]
- [\fB\-n\fR|\fB\-\-notes\fR]
- [\fB\-r\fR|\fB\-\-relocs\fR]
- [\fB\-u\fR|\fB\-\-unwind\fR]
- [\fB\-d\fR|\fB\-\-dynamic\fR]
- [\fB\-V\fR|\fB\-\-version\-info\fR]
- [\fB\-A\fR|\fB\-\-arch\-specific\fR]
- [\fB\-D\fR|\fB\-\-use\-dynamic\fR]
- [\fB\-x\fR |\fB\-\-hex\-dump=\fR]
- [\fB\-p\fR |\fB\-\-string\-dump=\fR]
- [\fB\-R\fR |\fB\-\-relocated\-dump=\fR]
- [\fB\-c\fR|\fB\-\-archive\-index\fR]
- [\fB\-w[lLiaprmfFsoRt]\fR|
- \fB\-\-debug\-dump\fR[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames\-interp,=str,=loc,=Ranges,=pubtypes,=trace_info,=trace_abbrev,=trace_aranges,=gdb_index]]
- [\fB\-\-dwarf\-depth=\fR\fIn\fR]
- [\fB\-\-dwarf\-start=\fR\fIn\fR]
- [\fB\-I\fR|\fB\-\-histogram\fR]
- [\fB\-v\fR|\fB\-\-version\fR]
- [\fB\-W\fR|\fB\-\-wide\fR]
- [\fB\-H\fR|\fB\-\-help\fR]
- \fIelffile\fR...
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-\&\fBreadelf\fR displays information about one or more \s-1ELF\s0 format object
-files. The options control what particular information to display.
-.PP
-\&\fIelffile\fR... are the object files to be examined. 32\-bit and
-64\-bit \s-1ELF\s0 files are supported, as are archives containing \s-1ELF\s0 files.
-.PP
-This program performs a similar function to \fBobjdump\fR but it
-goes into more detail and it exists independently of the \s-1BFD\s0
-library, so if there is a bug in \s-1BFD\s0 then readelf will not be
-affected.
-.SH "OPTIONS"
-.IX Header "OPTIONS"
-The long and short forms of options, shown here as alternatives, are
-equivalent. At least one option besides \fB\-v\fR or \fB\-H\fR must be
-given.
-.IP "\fB\-a\fR" 4
-.IX Item "-a"
-.PD 0
-.IP "\fB\-\-all\fR" 4
-.IX Item "--all"
-.PD
-Equivalent to specifying \fB\-\-file\-header\fR,
-\&\fB\-\-program\-headers\fR, \fB\-\-sections\fR, \fB\-\-symbols\fR,
-\&\fB\-\-relocs\fR, \fB\-\-dynamic\fR, \fB\-\-notes\fR and
-\&\fB\-\-version\-info\fR.
-.IP "\fB\-h\fR" 4
-.IX Item "-h"
-.PD 0
-.IP "\fB\-\-file\-header\fR" 4
-.IX Item "--file-header"
-.PD
-Displays the information contained in the \s-1ELF\s0 header at the start of the
-file.
-.IP "\fB\-l\fR" 4
-.IX Item "-l"
-.PD 0
-.IP "\fB\-\-program\-headers\fR" 4
-.IX Item "--program-headers"
-.IP "\fB\-\-segments\fR" 4
-.IX Item "--segments"
-.PD
-Displays the information contained in the file's segment headers, if it
-has any.
-.IP "\fB\-S\fR" 4
-.IX Item "-S"
-.PD 0
-.IP "\fB\-\-sections\fR" 4
-.IX Item "--sections"
-.IP "\fB\-\-section\-headers\fR" 4
-.IX Item "--section-headers"
-.PD
-Displays the information contained in the file's section headers, if it
-has any.
-.IP "\fB\-g\fR" 4
-.IX Item "-g"
-.PD 0
-.IP "\fB\-\-section\-groups\fR" 4
-.IX Item "--section-groups"
-.PD
-Displays the information contained in the file's section groups, if it
-has any.
-.IP "\fB\-t\fR" 4
-.IX Item "-t"
-.PD 0
-.IP "\fB\-\-section\-details\fR" 4
-.IX Item "--section-details"
-.PD
-Displays the detailed section information. Implies \fB\-S\fR.
-.IP "\fB\-s\fR" 4
-.IX Item "-s"
-.PD 0
-.IP "\fB\-\-symbols\fR" 4
-.IX Item "--symbols"
-.IP "\fB\-\-syms\fR" 4
-.IX Item "--syms"
-.PD
-Displays the entries in symbol table section of the file, if it has one.
-.IP "\fB\-\-dyn\-syms\fR" 4
-.IX Item "--dyn-syms"
-Displays the entries in dynamic symbol table section of the file, if it
-has one.
-.IP "\fB\-e\fR" 4
-.IX Item "-e"
-.PD 0
-.IP "\fB\-\-headers\fR" 4
-.IX Item "--headers"
-.PD
-Display all the headers in the file. Equivalent to \fB\-h \-l \-S\fR.
-.IP "\fB\-n\fR" 4
-.IX Item "-n"
-.PD 0
-.IP "\fB\-\-notes\fR" 4
-.IX Item "--notes"
-.PD
-Displays the contents of the \s-1NOTE\s0 segments and/or sections, if any.
-.IP "\fB\-r\fR" 4
-.IX Item "-r"
-.PD 0
-.IP "\fB\-\-relocs\fR" 4
-.IX Item "--relocs"
-.PD
-Displays the contents of the file's relocation section, if it has one.
-.IP "\fB\-u\fR" 4
-.IX Item "-u"
-.PD 0
-.IP "\fB\-\-unwind\fR" 4
-.IX Item "--unwind"
-.PD
-Displays the contents of the file's unwind section, if it has one. Only
-the unwind sections for \s-1IA64\s0 \s-1ELF\s0 files, as well as \s-1ARM\s0 unwind tables
-(\f(CW\*(C`.ARM.exidx\*(C'\fR / \f(CW\*(C`.ARM.extab\*(C'\fR) are currently supported.
-.IP "\fB\-d\fR" 4
-.IX Item "-d"
-.PD 0
-.IP "\fB\-\-dynamic\fR" 4
-.IX Item "--dynamic"
-.PD
-Displays the contents of the file's dynamic section, if it has one.
-.IP "\fB\-V\fR" 4
-.IX Item "-V"
-.PD 0
-.IP "\fB\-\-version\-info\fR" 4
-.IX Item "--version-info"
-.PD
-Displays the contents of the version sections in the file, it they
-exist.
-.IP "\fB\-A\fR" 4
-.IX Item "-A"
-.PD 0
-.IP "\fB\-\-arch\-specific\fR" 4
-.IX Item "--arch-specific"
-.PD
-Displays architecture-specific information in the file, if there
-is any.
-.IP "\fB\-D\fR" 4
-.IX Item "-D"
-.PD 0
-.IP "\fB\-\-use\-dynamic\fR" 4
-.IX Item "--use-dynamic"
-.PD
-When displaying symbols, this option makes \fBreadelf\fR use the
-symbol hash tables in the file's dynamic section, rather than the
-symbol table sections.
-.IP "\fB\-x \fR" 4
-.IX Item "-x "
-.PD 0
-.IP "\fB\-\-hex\-dump=\fR" 4
-.IX Item "--hex-dump="
-.PD
-Displays the contents of the indicated section as a hexadecimal bytes.
-A number identifies a particular section by index in the section table;
-any other string identifies all sections with that name in the object file.
-.IP "\fB\-R \fR" 4
-.IX Item "-R "
-.PD 0
-.IP "\fB\-\-relocated\-dump=\fR" 4
-.IX Item "--relocated-dump="
-.PD
-Displays the contents of the indicated section as a hexadecimal
-bytes. A number identifies a particular section by index in the
-section table; any other string identifies all sections with that name
-in the object file. The contents of the section will be relocated
-before they are displayed.
-.IP "\fB\-p \fR" 4
-.IX Item "-p "
-.PD 0
-.IP "\fB\-\-string\-dump=\fR" 4
-.IX Item "--string-dump="
-.PD
-Displays the contents of the indicated section as printable strings.
-A number identifies a particular section by index in the section table;
-any other string identifies all sections with that name in the object file.
-.IP "\fB\-c\fR" 4
-.IX Item "-c"
-.PD 0
-.IP "\fB\-\-archive\-index\fR" 4
-.IX Item "--archive-index"
-.PD
-Displays the file symbol index information contained in the header part
-of binary archives. Performs the same function as the \fBt\fR
-command to \fBar\fR, but without using the \s-1BFD\s0 library.
-.IP "\fB\-w[lLiaprmfFsoRt]\fR" 4
-.IX Item "-w[lLiaprmfFsoRt]"
-.PD 0
-.IP "\fB\-\-debug\-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames\-interp,=str,=loc,=Ranges,=pubtypes,=trace_info,=trace_abbrev,=trace_aranges,=gdb_index]\fR" 4
-.IX Item "--debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges,=pubtypes,=trace_info,=trace_abbrev,=trace_aranges,=gdb_index]"
-.PD
-Displays the contents of the debug sections in the file, if any are
-present. If one of the optional letters or words follows the switch
-then only data found in those specific sections will be dumped.
-.Sp
-Note that there is no single letter option to display the content of
-trace sections or .gdb_index.
-.Sp
-Note: the \fB=decodedline\fR option will display the interpreted
-contents of a .debug_line section whereas the \fB=rawline\fR option
-dumps the contents in a raw format.
-.Sp
-Note: the \fB=frames\-interp\fR option will display the interpreted
-contents of a .debug_frame section whereas the \fB=frames\fR option
-dumps the contents in a raw format.
-.Sp
-Note: the output from the \fB=info\fR option can also be affected
-by the options \fB\-\-dwarf\-depth\fR and \fB\-\-dwarf\-start\fR.
-.IP "\fB\-\-dwarf\-depth=\fR\fIn\fR" 4
-.IX Item "--dwarf-depth=n"
-Limit the dump of the \f(CW\*(C`.debug_info\*(C'\fR section to \fIn\fR children.
-This is only useful with \fB\-\-debug\-dump=info\fR. The default is
-to print all DIEs; the special value 0 for \fIn\fR will also have this
-effect.
-.Sp
-With a non-zero value for \fIn\fR, DIEs at or deeper than \fIn\fR
-levels will not be printed. The range for \fIn\fR is zero-based.
-.IP "\fB\-\-dwarf\-start=\fR\fIn\fR" 4
-.IX Item "--dwarf-start=n"
-Print only DIEs beginning with the \s-1DIE\s0 numbered \fIn\fR. This is only
-useful with \fB\-\-debug\-dump=info\fR.
-.Sp
-If specified, this option will suppress printing of any header
-information and all DIEs before the \s-1DIE\s0 numbered \fIn\fR. Only
-siblings and children of the specified \s-1DIE\s0 will be printed.
-.Sp
-This can be used in conjunction with \fB\-\-dwarf\-depth\fR.
-.IP "\fB\-I\fR" 4
-.IX Item "-I"
-.PD 0
-.IP "\fB\-\-histogram\fR" 4
-.IX Item "--histogram"
-.PD
-Display a histogram of bucket list lengths when displaying the contents
-of the symbol tables.
-.IP "\fB\-v\fR" 4
-.IX Item "-v"
-.PD 0
-.IP "\fB\-\-version\fR" 4
-.IX Item "--version"
-.PD
-Display the version number of readelf.
-.IP "\fB\-W\fR" 4
-.IX Item "-W"
-.PD 0
-.IP "\fB\-\-wide\fR" 4
-.IX Item "--wide"
-.PD
-Don't break output lines to fit into 80 columns. By default
-\&\fBreadelf\fR breaks section header and segment listing lines for
-64\-bit \s-1ELF\s0 files, so that they fit into 80 columns. This option causes
-\&\fBreadelf\fR to print each section header resp. each segment one a
-single line, which is far more readable on terminals wider than 80 columns.
-.IP "\fB\-H\fR" 4
-.IX Item "-H"
-.PD 0
-.IP "\fB\-\-help\fR" 4
-.IX Item "--help"
-.PD
-Display the command line options understood by \fBreadelf\fR.
-.IP "\fB@\fR\fIfile\fR" 4
-.IX Item "@file"
-Read command-line options from \fIfile\fR. The options read are
-inserted in place of the original @\fIfile\fR option. If \fIfile\fR
-does not exist, or cannot be read, then the option will be treated
-literally, and not removed.
-.Sp
-Options in \fIfile\fR are separated by whitespace. A whitespace
-character may be included in an option by surrounding the entire
-option in either single or double quotes. Any character (including a
-backslash) may be included by prefixing the character to be included
-with a backslash. The \fIfile\fR may itself contain additional
-@\fIfile\fR options; any such options will be processed recursively.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-\&\fIobjdump\fR\|(1), and the Info entries for \fIbinutils\fR.
-.SH "COPYRIGHT"
-.IX Header "COPYRIGHT"
-Copyright (c) 1991\-2013 Free Software Foundation, Inc.
-.PP
-Permission is granted to copy, distribute and/or modify this document
-under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.3
-or any later version published by the Free Software Foundation;
-with no Invariant Sections, with no Front-Cover Texts, and with no
-Back-Cover Texts. A copy of the license is included in the
-section entitled \*(L"\s-1GNU\s0 Free Documentation License\*(R".
diff -Nur binutils-2.24.orig/binutils/doc/size.1 binutils-2.24/binutils/doc/size.1
--- binutils-2.24.orig/binutils/doc/size.1 2013-11-18 09:49:31.000000000 +0100
+++ binutils-2.24/binutils/doc/size.1 1970-01-01 01:00:00.000000000 +0100
@@ -1,266 +0,0 @@
-.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings. \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote. \*(C+ will
-.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-. ds -- \(*W-
-. ds PI pi
-. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
-. ds L" ""
-. ds R" ""
-. ds C` ""
-. ds C' ""
-'br\}
-.el\{\
-. ds -- \|\(em\|
-. ds PI \(*p
-. ds L" ``
-. ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD. Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-. de IX
-. tm Index:\\$1\t\\n%\t"\\$2"
-..
-. nr % 0
-. rr F
-.\}
-.el \{\
-. de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear. Run. Save yourself. No user-serviceable parts.
-. \" fudge factors for nroff and troff
-.if n \{\
-. ds #H 0
-. ds #V .8m
-. ds #F .3m
-. ds #[ \f1
-. ds #] \fP
-.\}
-.if t \{\
-. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-. ds #V .6m
-. ds #F 0
-. ds #[ \&
-. ds #] \&
-.\}
-. \" simple accents for nroff and troff
-.if n \{\
-. ds ' \&
-. ds ` \&
-. ds ^ \&
-. ds , \&
-. ds ~ ~
-. ds /
-.\}
-.if t \{\
-. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-. \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-. \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-. \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-. ds : e
-. ds 8 ss
-. ds o a
-. ds d- d\h'-1'\(ga
-. ds D- D\h'-1'\(hy
-. ds th \o'bp'
-. ds Th \o'LP'
-. ds ae ae
-. ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "SIZE 1"
-.TH SIZE 1 "2013-11-18" "binutils-2.23.91" "GNU Development Tools"
-.\" For nroff, turn off justification. Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-size \- list section sizes and total size.
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-size [\fB\-A\fR|\fB\-B\fR|\fB\-\-format=\fR\fIcompatibility\fR]
- [\fB\-\-help\fR]
- [\fB\-d\fR|\fB\-o\fR|\fB\-x\fR|\fB\-\-radix=\fR\fInumber\fR]
- [\fB\-\-common\fR]
- [\fB\-t\fR|\fB\-\-totals\fR]
- [\fB\-\-target=\fR\fIbfdname\fR] [\fB\-V\fR|\fB\-\-version\fR]
- [\fIobjfile\fR...]
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-The \s-1GNU\s0 \fBsize\fR utility lists the section sizes\-\-\-and the total
-size\-\-\-for each of the object or archive files \fIobjfile\fR in its
-argument list. By default, one line of output is generated for each
-object file or each module in an archive.
-.PP
-\&\fIobjfile\fR... are the object files to be examined.
-If none are specified, the file \f(CW\*(C`a.out\*(C'\fR will be used.
-.SH "OPTIONS"
-.IX Header "OPTIONS"
-The command line options have the following meanings:
-.IP "\fB\-A\fR" 4
-.IX Item "-A"
-.PD 0
-.IP "\fB\-B\fR" 4
-.IX Item "-B"
-.IP "\fB\-\-format=\fR\fIcompatibility\fR" 4
-.IX Item "--format=compatibility"
-.PD
-Using one of these options, you can choose whether the output from \s-1GNU\s0
-\&\fBsize\fR resembles output from System V \fBsize\fR (using \fB\-A\fR,
-or \fB\-\-format=sysv\fR), or Berkeley \fBsize\fR (using \fB\-B\fR, or
-\&\fB\-\-format=berkeley\fR). The default is the one-line format similar to
-Berkeley's.
-.Sp
-Here is an example of the Berkeley (default) format of output from
-\&\fBsize\fR:
-.Sp
-.Vb 4
-\& $ size \-\-format=Berkeley ranlib size
-\& text data bss dec hex filename
-\& 294880 81920 11592 388392 5ed28 ranlib
-\& 294880 81920 11888 388688 5ee50 size
-.Ve
-.Sp
-This is the same data, but displayed closer to System V conventions:
-.Sp
-.Vb 7
-\& $ size \-\-format=SysV ranlib size
-\& ranlib :
-\& section size addr
-\& .text 294880 8192
-\& .data 81920 303104
-\& .bss 11592 385024
-\& Total 388392
-\&
-\&
-\& size :
-\& section size addr
-\& .text 294880 8192
-\& .data 81920 303104
-\& .bss 11888 385024
-\& Total 388688
-.Ve
-.IP "\fB\-\-help\fR" 4
-.IX Item "--help"
-Show a summary of acceptable arguments and options.
-.IP "\fB\-d\fR" 4
-.IX Item "-d"
-.PD 0
-.IP "\fB\-o\fR" 4
-.IX Item "-o"
-.IP "\fB\-x\fR" 4
-.IX Item "-x"
-.IP "\fB\-\-radix=\fR\fInumber\fR" 4
-.IX Item "--radix=number"
-.PD
-Using one of these options, you can control whether the size of each
-section is given in decimal (\fB\-d\fR, or \fB\-\-radix=10\fR); octal
-(\fB\-o\fR, or \fB\-\-radix=8\fR); or hexadecimal (\fB\-x\fR, or
-\&\fB\-\-radix=16\fR). In \fB\-\-radix=\fR\fInumber\fR, only the three
-values (8, 10, 16) are supported. The total size is always given in two
-radices; decimal and hexadecimal for \fB\-d\fR or \fB\-x\fR output, or
-octal and hexadecimal if you're using \fB\-o\fR.
-.IP "\fB\-\-common\fR" 4
-.IX Item "--common"
-Print total size of common symbols in each file. When using Berkeley
-format these are included in the bss size.
-.IP "\fB\-t\fR" 4
-.IX Item "-t"
-.PD 0
-.IP "\fB\-\-totals\fR" 4
-.IX Item "--totals"
-.PD
-Show totals of all objects listed (Berkeley format listing mode only).
-.IP "\fB\-\-target=\fR\fIbfdname\fR" 4
-.IX Item "--target=bfdname"
-Specify that the object-code format for \fIobjfile\fR is
-\&\fIbfdname\fR. This option may not be necessary; \fBsize\fR can
-automatically recognize many formats.
-.IP "\fB\-V\fR" 4
-.IX Item "-V"
-.PD 0
-.IP "\fB\-\-version\fR" 4
-.IX Item "--version"
-.PD
-Display the version number of \fBsize\fR.
-.IP "\fB@\fR\fIfile\fR" 4
-.IX Item "@file"
-Read command-line options from \fIfile\fR. The options read are
-inserted in place of the original @\fIfile\fR option. If \fIfile\fR
-does not exist, or cannot be read, then the option will be treated
-literally, and not removed.
-.Sp
-Options in \fIfile\fR are separated by whitespace. A whitespace
-character may be included in an option by surrounding the entire
-option in either single or double quotes. Any character (including a
-backslash) may be included by prefixing the character to be included
-with a backslash. The \fIfile\fR may itself contain additional
-@\fIfile\fR options; any such options will be processed recursively.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-\&\fIar\fR\|(1), \fIobjdump\fR\|(1), \fIreadelf\fR\|(1), and the Info entries for \fIbinutils\fR.
-.SH "COPYRIGHT"
-.IX Header "COPYRIGHT"
-Copyright (c) 1991\-2013 Free Software Foundation, Inc.
-.PP
-Permission is granted to copy, distribute and/or modify this document
-under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.3
-or any later version published by the Free Software Foundation;
-with no Invariant Sections, with no Front-Cover Texts, and with no
-Back-Cover Texts. A copy of the license is included in the
-section entitled \*(L"\s-1GNU\s0 Free Documentation License\*(R".
diff -Nur binutils-2.24.orig/binutils/doc/strings.1 binutils-2.24/binutils/doc/strings.1
--- binutils-2.24.orig/binutils/doc/strings.1 2013-11-18 09:49:31.000000000 +0100
+++ binutils-2.24/binutils/doc/strings.1 1970-01-01 01:00:00.000000000 +0100
@@ -1,255 +0,0 @@
-.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings. \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote. \*(C+ will
-.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-. ds -- \(*W-
-. ds PI pi
-. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
-. ds L" ""
-. ds R" ""
-. ds C` ""
-. ds C' ""
-'br\}
-.el\{\
-. ds -- \|\(em\|
-. ds PI \(*p
-. ds L" ``
-. ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD. Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-. de IX
-. tm Index:\\$1\t\\n%\t"\\$2"
-..
-. nr % 0
-. rr F
-.\}
-.el \{\
-. de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear. Run. Save yourself. No user-serviceable parts.
-. \" fudge factors for nroff and troff
-.if n \{\
-. ds #H 0
-. ds #V .8m
-. ds #F .3m
-. ds #[ \f1
-. ds #] \fP
-.\}
-.if t \{\
-. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-. ds #V .6m
-. ds #F 0
-. ds #[ \&
-. ds #] \&
-.\}
-. \" simple accents for nroff and troff
-.if n \{\
-. ds ' \&
-. ds ` \&
-. ds ^ \&
-. ds , \&
-. ds ~ ~
-. ds /
-.\}
-.if t \{\
-. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-. \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-. \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-. \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-. ds : e
-. ds 8 ss
-. ds o a
-. ds d- d\h'-1'\(ga
-. ds D- D\h'-1'\(hy
-. ds th \o'bp'
-. ds Th \o'LP'
-. ds ae ae
-. ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "STRINGS 1"
-.TH STRINGS 1 "2013-11-18" "binutils-2.23.91" "GNU Development Tools"
-.\" For nroff, turn off justification. Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-strings \- print the strings of printable characters in files.
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-strings [\fB\-afovV\fR] [\fB\-\fR\fImin-len\fR]
- [\fB\-n\fR \fImin-len\fR] [\fB\-\-bytes=\fR\fImin-len\fR]
- [\fB\-t\fR \fIradix\fR] [\fB\-\-radix=\fR\fIradix\fR]
- [\fB\-e\fR \fIencoding\fR] [\fB\-\-encoding=\fR\fIencoding\fR]
- [\fB\-\fR] [\fB\-\-all\fR] [\fB\-\-print\-file\-name\fR]
- [\fB\-T\fR \fIbfdname\fR] [\fB\-\-target=\fR\fIbfdname\fR]
- [\fB\-\-help\fR] [\fB\-\-version\fR] \fIfile\fR...
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-For each \fIfile\fR given, \s-1GNU\s0 \fBstrings\fR prints the printable
-character sequences that are at least 4 characters long (or the number
-given with the options below) and are followed by an unprintable
-character. By default, it only prints the strings from the initialized
-and loaded sections of object files; for other types of files, it prints
-the strings from the whole file.
-.PP
-\&\fBstrings\fR is mainly useful for determining the contents of non-text
-files.
-.SH "OPTIONS"
-.IX Header "OPTIONS"
-.IP "\fB\-a\fR" 4
-.IX Item "-a"
-.PD 0
-.IP "\fB\-\-all\fR" 4
-.IX Item "--all"
-.IP "\fB\-\fR" 4
-.IX Item "-"
-.PD
-Do not scan only the initialized and loaded sections of object files;
-scan the whole files.
-.IP "\fB\-f\fR" 4
-.IX Item "-f"
-.PD 0
-.IP "\fB\-\-print\-file\-name\fR" 4
-.IX Item "--print-file-name"
-.PD
-Print the name of the file before each string.
-.IP "\fB\-\-help\fR" 4
-.IX Item "--help"
-Print a summary of the program usage on the standard output and exit.
-.IP "\fB\-\fR\fImin-len\fR" 4
-.IX Item "-min-len"
-.PD 0
-.IP "\fB\-n\fR \fImin-len\fR" 4
-.IX Item "-n min-len"
-.IP "\fB\-\-bytes=\fR\fImin-len\fR" 4
-.IX Item "--bytes=min-len"
-.PD
-Print sequences of characters that are at least \fImin-len\fR characters
-long, instead of the default 4.
-.IP "\fB\-o\fR" 4
-.IX Item "-o"
-Like \fB\-t o\fR. Some other versions of \fBstrings\fR have \fB\-o\fR
-act like \fB\-t d\fR instead. Since we can not be compatible with both
-ways, we simply chose one.
-.IP "\fB\-t\fR \fIradix\fR" 4
-.IX Item "-t radix"
-.PD 0
-.IP "\fB\-\-radix=\fR\fIradix\fR" 4
-.IX Item "--radix=radix"
-.PD
-Print the offset within the file before each string. The single
-character argument specifies the radix of the offset\-\-\-\fBo\fR for
-octal, \fBx\fR for hexadecimal, or \fBd\fR for decimal.
-.IP "\fB\-e\fR \fIencoding\fR" 4
-.IX Item "-e encoding"
-.PD 0
-.IP "\fB\-\-encoding=\fR\fIencoding\fR" 4
-.IX Item "--encoding=encoding"
-.PD
-Select the character encoding of the strings that are to be found.
-Possible values for \fIencoding\fR are: \fBs\fR = single\-7\-bit\-byte
-characters (\s-1ASCII\s0, \s-1ISO\s0 8859, etc., default), \fBS\fR =
-single\-8\-bit\-byte characters, \fBb\fR = 16\-bit bigendian, \fBl\fR =
-16\-bit littleendian, \fBB\fR = 32\-bit bigendian, \fBL\fR = 32\-bit
-littleendian. Useful for finding wide character strings. (\fBl\fR
-and \fBb\fR apply to, for example, Unicode \s-1UTF\-16/UCS\-2\s0 encodings).
-.IP "\fB\-T\fR \fIbfdname\fR" 4
-.IX Item "-T bfdname"
-.PD 0
-.IP "\fB\-\-target=\fR\fIbfdname\fR" 4
-.IX Item "--target=bfdname"
-.PD
-Specify an object code format other than your system's default format.
-.IP "\fB\-v\fR" 4
-.IX Item "-v"
-.PD 0
-.IP "\fB\-V\fR" 4
-.IX Item "-V"
-.IP "\fB\-\-version\fR" 4
-.IX Item "--version"
-.PD
-Print the program version number on the standard output and exit.
-.IP "\fB@\fR\fIfile\fR" 4
-.IX Item "@file"
-Read command-line options from \fIfile\fR. The options read are
-inserted in place of the original @\fIfile\fR option. If \fIfile\fR
-does not exist, or cannot be read, then the option will be treated
-literally, and not removed.
-.Sp
-Options in \fIfile\fR are separated by whitespace. A whitespace
-character may be included in an option by surrounding the entire
-option in either single or double quotes. Any character (including a
-backslash) may be included by prefixing the character to be included
-with a backslash. The \fIfile\fR may itself contain additional
-@\fIfile\fR options; any such options will be processed recursively.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-\&\fIar\fR\|(1), \fInm\fR\|(1), \fIobjdump\fR\|(1), \fIranlib\fR\|(1), \fIreadelf\fR\|(1)
-and the Info entries for \fIbinutils\fR.
-.SH "COPYRIGHT"
-.IX Header "COPYRIGHT"
-Copyright (c) 1991\-2013 Free Software Foundation, Inc.
-.PP
-Permission is granted to copy, distribute and/or modify this document
-under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.3
-or any later version published by the Free Software Foundation;
-with no Invariant Sections, with no Front-Cover Texts, and with no
-Back-Cover Texts. A copy of the license is included in the
-section entitled \*(L"\s-1GNU\s0 Free Documentation License\*(R".
diff -Nur binutils-2.24.orig/binutils/doc/strip.1 binutils-2.24/binutils/doc/strip.1
--- binutils-2.24.orig/binutils/doc/strip.1 2013-11-18 09:49:31.000000000 +0100
+++ binutils-2.24/binutils/doc/strip.1 1970-01-01 01:00:00.000000000 +0100
@@ -1,427 +0,0 @@
-.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings. \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote. \*(C+ will
-.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-. ds -- \(*W-
-. ds PI pi
-. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
-. ds L" ""
-. ds R" ""
-. ds C` ""
-. ds C' ""
-'br\}
-.el\{\
-. ds -- \|\(em\|
-. ds PI \(*p
-. ds L" ``
-. ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD. Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-. de IX
-. tm Index:\\$1\t\\n%\t"\\$2"
-..
-. nr % 0
-. rr F
-.\}
-.el \{\
-. de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear. Run. Save yourself. No user-serviceable parts.
-. \" fudge factors for nroff and troff
-.if n \{\
-. ds #H 0
-. ds #V .8m
-. ds #F .3m
-. ds #[ \f1
-. ds #] \fP
-.\}
-.if t \{\
-. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-. ds #V .6m
-. ds #F 0
-. ds #[ \&
-. ds #] \&
-.\}
-. \" simple accents for nroff and troff
-.if n \{\
-. ds ' \&
-. ds ` \&
-. ds ^ \&
-. ds , \&
-. ds ~ ~
-. ds /
-.\}
-.if t \{\
-. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-. \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-. \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-. \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-. ds : e
-. ds 8 ss
-. ds o a
-. ds d- d\h'-1'\(ga
-. ds D- D\h'-1'\(hy
-. ds th \o'bp'
-. ds Th \o'LP'
-. ds ae ae
-. ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "STRIP 1"
-.TH STRIP 1 "2013-11-18" "binutils-2.23.91" "GNU Development Tools"
-.\" For nroff, turn off justification. Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-strip \- Discard symbols from object files.
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-strip [\fB\-F\fR \fIbfdname\fR |\fB\-\-target=\fR\fIbfdname\fR]
- [\fB\-I\fR \fIbfdname\fR |\fB\-\-input\-target=\fR\fIbfdname\fR]
- [\fB\-O\fR \fIbfdname\fR |\fB\-\-output\-target=\fR\fIbfdname\fR]
- [\fB\-s\fR|\fB\-\-strip\-all\fR]
- [\fB\-S\fR|\fB\-g\fR|\fB\-d\fR|\fB\-\-strip\-debug\fR]
- [\fB\-\-strip\-dwo\fR]
- [\fB\-K\fR \fIsymbolname\fR |\fB\-\-keep\-symbol=\fR\fIsymbolname\fR]
- [\fB\-N\fR \fIsymbolname\fR |\fB\-\-strip\-symbol=\fR\fIsymbolname\fR]
- [\fB\-w\fR|\fB\-\-wildcard\fR]
- [\fB\-x\fR|\fB\-\-discard\-all\fR] [\fB\-X\fR |\fB\-\-discard\-locals\fR]
- [\fB\-R\fR \fIsectionname\fR |\fB\-\-remove\-section=\fR\fIsectionname\fR]
- [\fB\-o\fR \fIfile\fR] [\fB\-p\fR|\fB\-\-preserve\-dates\fR]
- [\fB\-D\fR|\fB\-\-enable\-deterministic\-archives\fR]
- [\fB\-U\fR|\fB\-\-disable\-deterministic\-archives\fR]
- [\fB\-\-keep\-file\-symbols\fR]
- [\fB\-\-only\-keep\-debug\fR]
- [\fB\-v\fR |\fB\-\-verbose\fR] [\fB\-V\fR|\fB\-\-version\fR]
- [\fB\-\-help\fR] [\fB\-\-info\fR]
- \fIobjfile\fR...
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-\&\s-1GNU\s0 \fBstrip\fR discards all symbols from object files
-\&\fIobjfile\fR. The list of object files may include archives.
-At least one object file must be given.
-.PP
-\&\fBstrip\fR modifies the files named in its argument,
-rather than writing modified copies under different names.
-.SH "OPTIONS"
-.IX Header "OPTIONS"
-.IP "\fB\-F\fR \fIbfdname\fR" 4
-.IX Item "-F bfdname"
-.PD 0
-.IP "\fB\-\-target=\fR\fIbfdname\fR" 4
-.IX Item "--target=bfdname"
-.PD
-Treat the original \fIobjfile\fR as a file with the object
-code format \fIbfdname\fR, and rewrite it in the same format.
-.IP "\fB\-\-help\fR" 4
-.IX Item "--help"
-Show a summary of the options to \fBstrip\fR and exit.
-.IP "\fB\-\-info\fR" 4
-.IX Item "--info"
-Display a list showing all architectures and object formats available.
-.IP "\fB\-I\fR \fIbfdname\fR" 4
-.IX Item "-I bfdname"
-.PD 0
-.IP "\fB\-\-input\-target=\fR\fIbfdname\fR" 4
-.IX Item "--input-target=bfdname"
-.PD
-Treat the original \fIobjfile\fR as a file with the object
-code format \fIbfdname\fR.
-.IP "\fB\-O\fR \fIbfdname\fR" 4
-.IX Item "-O bfdname"
-.PD 0
-.IP "\fB\-\-output\-target=\fR\fIbfdname\fR" 4
-.IX Item "--output-target=bfdname"
-.PD
-Replace \fIobjfile\fR with a file in the output format \fIbfdname\fR.
-.IP "\fB\-R\fR \fIsectionname\fR" 4
-.IX Item "-R sectionname"
-.PD 0
-.IP "\fB\-\-remove\-section=\fR\fIsectionname\fR" 4
-.IX Item "--remove-section=sectionname"
-.PD
-Remove any section named \fIsectionname\fR from the output file. This
-option may be given more than once. Note that using this option
-inappropriately may make the output file unusable. The wildcard
-character \fB*\fR may be given at the end of \fIsectionname\fR. If
-so, then any section starting with \fIsectionname\fR will be removed.
-.IP "\fB\-s\fR" 4
-.IX Item "-s"
-.PD 0
-.IP "\fB\-\-strip\-all\fR" 4
-.IX Item "--strip-all"
-.PD
-Remove all symbols.
-.IP "\fB\-g\fR" 4
-.IX Item "-g"
-.PD 0
-.IP "\fB\-S\fR" 4
-.IX Item "-S"
-.IP "\fB\-d\fR" 4
-.IX Item "-d"
-.IP "\fB\-\-strip\-debug\fR" 4
-.IX Item "--strip-debug"
-.PD
-Remove debugging symbols only.
-.IP "\fB\-\-strip\-dwo\fR" 4
-.IX Item "--strip-dwo"
-Remove the contents of all \s-1DWARF\s0 .dwo sections, leaving the
-remaining debugging sections and all symbols intact.
-See the description of this option in the \fBobjcopy\fR section
-for more information.
-.IP "\fB\-\-strip\-unneeded\fR" 4
-.IX Item "--strip-unneeded"
-Remove all symbols that are not needed for relocation processing.
-.IP "\fB\-K\fR \fIsymbolname\fR" 4
-.IX Item "-K symbolname"
-.PD 0
-.IP "\fB\-\-keep\-symbol=\fR\fIsymbolname\fR" 4
-.IX Item "--keep-symbol=symbolname"
-.PD
-When stripping symbols, keep symbol \fIsymbolname\fR even if it would
-normally be stripped. This option may be given more than once.
-.IP "\fB\-N\fR \fIsymbolname\fR" 4
-.IX Item "-N symbolname"
-.PD 0
-.IP "\fB\-\-strip\-symbol=\fR\fIsymbolname\fR" 4
-.IX Item "--strip-symbol=symbolname"
-.PD
-Remove symbol \fIsymbolname\fR from the source file. This option may be
-given more than once, and may be combined with strip options other than
-\&\fB\-K\fR.
-.IP "\fB\-o\fR \fIfile\fR" 4
-.IX Item "-o file"
-Put the stripped output in \fIfile\fR, rather than replacing the
-existing file. When this argument is used, only one \fIobjfile\fR
-argument may be specified.
-.IP "\fB\-p\fR" 4
-.IX Item "-p"
-.PD 0
-.IP "\fB\-\-preserve\-dates\fR" 4
-.IX Item "--preserve-dates"
-.PD
-Preserve the access and modification dates of the file.
-.IP "\fB\-D\fR" 4
-.IX Item "-D"
-.PD 0
-.IP "\fB\-\-enable\-deterministic\-archives\fR" 4
-.IX Item "--enable-deterministic-archives"
-.PD
-Operate in \fIdeterministic\fR mode. When copying archive members
-and writing the archive index, use zero for UIDs, GIDs, timestamps,
-and use consistent file modes for all files.
-.Sp
-If \fIbinutils\fR was configured with
-\&\fB\-\-enable\-deterministic\-archives\fR, then this mode is on by default.
-It can be disabled with the \fB\-U\fR option, below.
-.IP "\fB\-U\fR" 4
-.IX Item "-U"
-.PD 0
-.IP "\fB\-\-disable\-deterministic\-archives\fR" 4
-.IX Item "--disable-deterministic-archives"
-.PD
-Do \fInot\fR operate in \fIdeterministic\fR mode. This is the
-inverse of the \fB\-D\fR option, above: when copying archive members
-and writing the archive index, use their actual \s-1UID\s0, \s-1GID\s0, timestamp,
-and file mode values.
-.Sp
-This is the default unless \fIbinutils\fR was configured with
-\&\fB\-\-enable\-deterministic\-archives\fR.
-.IP "\fB\-w\fR" 4
-.IX Item "-w"
-.PD 0
-.IP "\fB\-\-wildcard\fR" 4
-.IX Item "--wildcard"
-.PD
-Permit regular expressions in \fIsymbolname\fRs used in other command
-line options. The question mark (?), asterisk (*), backslash (\e) and
-square brackets ([]) operators can be used anywhere in the symbol
-name. If the first character of the symbol name is the exclamation
-point (!) then the sense of the switch is reversed for that symbol.
-For example:
-.Sp
-.Vb 1
-\& \-w \-K !foo \-K fo*
-.Ve
-.Sp
-would cause strip to only keep symbols that start with the letters
-\&\*(L"fo\*(R", but to discard the symbol \*(L"foo\*(R".
-.IP "\fB\-x\fR" 4
-.IX Item "-x"
-.PD 0
-.IP "\fB\-\-discard\-all\fR" 4
-.IX Item "--discard-all"
-.PD
-Remove non-global symbols.
-.IP "\fB\-X\fR" 4
-.IX Item "-X"
-.PD 0
-.IP "\fB\-\-discard\-locals\fR" 4
-.IX Item "--discard-locals"
-.PD
-Remove compiler-generated local symbols.
-(These usually start with \fBL\fR or \fB.\fR.)
-.IP "\fB\-\-keep\-file\-symbols\fR" 4
-.IX Item "--keep-file-symbols"
-When stripping a file, perhaps with \fB\-\-strip\-debug\fR or
-\&\fB\-\-strip\-unneeded\fR, retain any symbols specifying source file names,
-which would otherwise get stripped.
-.IP "\fB\-\-only\-keep\-debug\fR" 4
-.IX Item "--only-keep-debug"
-Strip a file, removing contents of any sections that would not be
-stripped by \fB\-\-strip\-debug\fR and leaving the debugging sections
-intact. In \s-1ELF\s0 files, this preserves all note sections in the output.
-.Sp
-The intention is that this option will be used in conjunction with
-\&\fB\-\-add\-gnu\-debuglink\fR to create a two part executable. One a
-stripped binary which will occupy less space in \s-1RAM\s0 and in a
-distribution and the second a debugging information file which is only
-needed if debugging abilities are required. The suggested procedure
-to create these files is as follows:
-.RS 4
-.IP "1." 4
-.IX Item "1."
-\&\f(CW\*(C`foo\*(C'\fR then...
-.ie n .IP "1." 4
-.el .IP "1." 4
-.IX Item "1."
-create a file containing the debugging info.
-.ie n .IP "1." 4
-.el .IP "1." 4
-.IX Item "1."
-stripped executable.
-.ie n .IP "1." 4
-.el .IP "1." 4
-.IX Item "1."
-to add a link to the debugging info into the stripped executable.
-.RE
-.RS 4
-.Sp
-Note\-\-\-the choice of \f(CW\*(C`.dbg\*(C'\fR as an extension for the debug info
-file is arbitrary. Also the \f(CW\*(C`\-\-only\-keep\-debug\*(C'\fR step is
-optional. You could instead do this:
-.IP "1." 4
-.IX Item "1."
-.PD 0
-.ie n .IP "1." 4
-.el .IP "1." 4
-.IX Item "1."
-.ie n .IP "1." 4
-.el .IP "1." 4
-.IX Item "1."
-.ie n .IP "1." 4
-.el .IP "1." 4
-.IX Item "1."
-.RE
-.RS 4
-.PD
-.Sp
-i.e., the file pointed to by the \fB\-\-add\-gnu\-debuglink\fR can be the
-full executable. It does not have to be a file created by the
-\&\fB\-\-only\-keep\-debug\fR switch.
-.Sp
-Note\-\-\-this switch is only intended for use on fully linked files. It
-does not make sense to use it on object files where the debugging
-information may be incomplete. Besides the gnu_debuglink feature
-currently only supports the presence of one filename containing
-debugging information, not multiple filenames on a one-per-object-file
-basis.
-.RE
-.IP "\fB\-V\fR" 4
-.IX Item "-V"
-.PD 0
-.IP "\fB\-\-version\fR" 4
-.IX Item "--version"
-.PD
-Show the version number for \fBstrip\fR.
-.IP "\fB\-v\fR" 4
-.IX Item "-v"
-.PD 0
-.IP "\fB\-\-verbose\fR" 4
-.IX Item "--verbose"
-.PD
-Verbose output: list all object files modified. In the case of
-archives, \fBstrip \-v\fR lists all members of the archive.
-.IP "\fB@\fR\fIfile\fR" 4
-.IX Item "@file"
-Read command-line options from \fIfile\fR. The options read are
-inserted in place of the original @\fIfile\fR option. If \fIfile\fR
-does not exist, or cannot be read, then the option will be treated
-literally, and not removed.
-.Sp
-Options in \fIfile\fR are separated by whitespace. A whitespace
-character may be included in an option by surrounding the entire
-option in either single or double quotes. Any character (including a
-backslash) may be included by prefixing the character to be included
-with a backslash. The \fIfile\fR may itself contain additional
-@\fIfile\fR options; any such options will be processed recursively.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-the Info entries for \fIbinutils\fR.
-.SH "COPYRIGHT"
-.IX Header "COPYRIGHT"
-Copyright (c) 1991\-2013 Free Software Foundation, Inc.
-.PP
-Permission is granted to copy, distribute and/or modify this document
-under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.3
-or any later version published by the Free Software Foundation;
-with no Invariant Sections, with no Front-Cover Texts, and with no
-Back-Cover Texts. A copy of the license is included in the
-section entitled \*(L"\s-1GNU\s0 Free Documentation License\*(R".
diff -Nur binutils-2.24.orig/binutils/doc/windmc.1 binutils-2.24/binutils/doc/windmc.1
--- binutils-2.24.orig/binutils/doc/windmc.1 2013-11-18 09:49:32.000000000 +0100
+++ binutils-2.24/binutils/doc/windmc.1 1970-01-01 01:00:00.000000000 +0100
@@ -1,351 +0,0 @@
-.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings. \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote. \*(C+ will
-.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-. ds -- \(*W-
-. ds PI pi
-. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
-. ds L" ""
-. ds R" ""
-. ds C` ""
-. ds C' ""
-'br\}
-.el\{\
-. ds -- \|\(em\|
-. ds PI \(*p
-. ds L" ``
-. ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD. Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-. de IX
-. tm Index:\\$1\t\\n%\t"\\$2"
-..
-. nr % 0
-. rr F
-.\}
-.el \{\
-. de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear. Run. Save yourself. No user-serviceable parts.
-. \" fudge factors for nroff and troff
-.if n \{\
-. ds #H 0
-. ds #V .8m
-. ds #F .3m
-. ds #[ \f1
-. ds #] \fP
-.\}
-.if t \{\
-. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-. ds #V .6m
-. ds #F 0
-. ds #[ \&
-. ds #] \&
-.\}
-. \" simple accents for nroff and troff
-.if n \{\
-. ds ' \&
-. ds ` \&
-. ds ^ \&
-. ds , \&
-. ds ~ ~
-. ds /
-.\}
-.if t \{\
-. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-. \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-. \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-. \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-. ds : e
-. ds 8 ss
-. ds o a
-. ds d- d\h'-1'\(ga
-. ds D- D\h'-1'\(hy
-. ds th \o'bp'
-. ds Th \o'LP'
-. ds ae ae
-. ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "WINDMC 1"
-.TH WINDMC 1 "2013-11-18" "binutils-2.23.91" "GNU Development Tools"
-.\" For nroff, turn off justification. Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-windmc \- generates Windows message resources.
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-windmc [options] input-file
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-\&\fBwindmc\fR reads message definitions from an input file (.mc) and
-translate them into a set of output files. The output files may be of
-four kinds:
-.ie n .IP """h""" 4
-.el .IP "\f(CWh\fR" 4
-.IX Item "h"
-A C header file containing the message definitions.
-.ie n .IP """rc""" 4
-.el .IP "\f(CWrc\fR" 4
-.IX Item "rc"
-A resource file compilable by the \fBwindres\fR tool.
-.ie n .IP """bin""" 4
-.el .IP "\f(CWbin\fR" 4
-.IX Item "bin"
-One or more binary files containing the resource data for a specific
-message language.
-.ie n .IP """dbg""" 4
-.el .IP "\f(CWdbg\fR" 4
-.IX Item "dbg"
-A C include file that maps message id's to their symbolic name.
-.PP
-The exact description of these different formats is available in
-documentation from Microsoft.
-.PP
-When \fBwindmc\fR converts from the \f(CW\*(C`mc\*(C'\fR format to the \f(CW\*(C`bin\*(C'\fR
-format, \f(CW\*(C`rc\*(C'\fR, \f(CW\*(C`h\*(C'\fR, and optional \f(CW\*(C`dbg\*(C'\fR it is acting like the
-Windows Message Compiler.
-.SH "OPTIONS"
-.IX Header "OPTIONS"
-.IP "\fB\-a\fR" 4
-.IX Item "-a"
-.PD 0
-.IP "\fB\-\-ascii_in\fR" 4
-.IX Item "--ascii_in"
-.PD
-Specifies that the input file specified is \s-1ASCII\s0. This is the default
-behaviour.
-.IP "\fB\-A\fR" 4
-.IX Item "-A"
-.PD 0
-.IP "\fB\-\-ascii_out\fR" 4
-.IX Item "--ascii_out"
-.PD
-Specifies that messages in the output \f(CW\*(C`bin\*(C'\fR files should be in \s-1ASCII\s0
-format.
-.IP "\fB\-b\fR" 4
-.IX Item "-b"
-.PD 0
-.IP "\fB\-\-binprefix\fR" 4
-.IX Item "--binprefix"
-.PD
-Specifies that \f(CW\*(C`bin\*(C'\fR filenames should have to be prefixed by the
-basename of the source file.
-.IP "\fB\-c\fR" 4
-.IX Item "-c"
-.PD 0
-.IP "\fB\-\-customflag\fR" 4
-.IX Item "--customflag"
-.PD
-Sets the customer bit in all message id's.
-.IP "\fB\-C\fR \fIcodepage\fR" 4
-.IX Item "-C codepage"
-.PD 0
-.IP "\fB\-\-codepage_in\fR \fIcodepage\fR" 4
-.IX Item "--codepage_in codepage"
-.PD
-Sets the default codepage to be used to convert input file to \s-1UTF16\s0. The
-default is ocdepage 1252.
-.IP "\fB\-d\fR" 4
-.IX Item "-d"
-.PD 0
-.IP "\fB\-\-decimal_values\fR" 4
-.IX Item "--decimal_values"
-.PD
-Outputs the constants in the header file in decimal. Default is using
-hexadecimal output.
-.IP "\fB\-e\fR \fIext\fR" 4
-.IX Item "-e ext"
-.PD 0
-.IP "\fB\-\-extension\fR \fIext\fR" 4
-.IX Item "--extension ext"
-.PD
-The extension for the header file. The default is .h extension.
-.IP "\fB\-F\fR \fItarget\fR" 4
-.IX Item "-F target"
-.PD 0
-.IP "\fB\-\-target\fR \fItarget\fR" 4
-.IX Item "--target target"
-.PD
-Specify the \s-1BFD\s0 format to use for a bin file as output. This
-is a \s-1BFD\s0 target name; you can use the \fB\-\-help\fR option to see a list
-of supported targets. Normally \fBwindmc\fR will use the default
-format, which is the first one listed by the \fB\-\-help\fR option.
-.IP "\fB\-h\fR \fIpath\fR" 4
-.IX Item "-h path"
-.PD 0
-.IP "\fB\-\-headerdir\fR \fIpath\fR" 4
-.IX Item "--headerdir path"
-.PD
-The target directory of the generated header file. The default is the
-current directory.
-.IP "\fB\-H\fR" 4
-.IX Item "-H"
-.PD 0
-.IP "\fB\-\-help\fR" 4
-.IX Item "--help"
-.PD
-Displays a list of command line options and then exits.
-.IP "\fB\-m\fR \fIcharacters\fR" 4
-.IX Item "-m characters"
-.PD 0
-.IP "\fB\-\-maxlength\fR \fIcharacters\fR" 4
-.IX Item "--maxlength characters"
-.PD
-Instructs \fBwindmc\fR to generate a warning if the length
-of any message exceeds the number specified.
-.IP "\fB\-n\fR" 4
-.IX Item "-n"
-.PD 0
-.IP "\fB\-\-nullterminate\fR" 4
-.IX Item "--nullterminate"
-.PD
-Terminate message text in \f(CW\*(C`bin\*(C'\fR files by zero. By default they are
-terminated by \s-1CR/LF\s0.
-.IP "\fB\-o\fR" 4
-.IX Item "-o"
-.PD 0
-.IP "\fB\-\-hresult_use\fR" 4
-.IX Item "--hresult_use"
-.PD
-Not yet implemented. Instructs \f(CW\*(C`windmc\*(C'\fR to generate an \s-1OLE2\s0 header
-file, using \s-1HRESULT\s0 definitions. Status codes are used if the flag is not
-specified.
-.IP "\fB\-O\fR \fIcodepage\fR" 4
-.IX Item "-O codepage"
-.PD 0
-.IP "\fB\-\-codepage_out\fR \fIcodepage\fR" 4
-.IX Item "--codepage_out codepage"
-.PD
-Sets the default codepage to be used to output text files. The default
-is ocdepage 1252.
-.IP "\fB\-r\fR \fIpath\fR" 4
-.IX Item "-r path"
-.PD 0
-.IP "\fB\-\-rcdir\fR \fIpath\fR" 4
-.IX Item "--rcdir path"
-.PD
-The target directory for the generated \f(CW\*(C`rc\*(C'\fR script and the generated
-\&\f(CW\*(C`bin\*(C'\fR files that the resource compiler script includes. The default
-is the current directory.
-.IP "\fB\-u\fR" 4
-.IX Item "-u"
-.PD 0
-.IP "\fB\-\-unicode_in\fR" 4
-.IX Item "--unicode_in"
-.PD
-Specifies that the input file is \s-1UTF16\s0.
-.IP "\fB\-U\fR" 4
-.IX Item "-U"
-.PD 0
-.IP "\fB\-\-unicode_out\fR" 4
-.IX Item "--unicode_out"
-.PD
-Specifies that messages in the output \f(CW\*(C`bin\*(C'\fR file should be in \s-1UTF16\s0
-format. This is the default behaviour.
-.IP "\fB\-v\fR" 4
-.IX Item "-v"
-.PD 0
-.IP "\fB\-\-verbose\fR" 4
-.IX Item "--verbose"
-.PD
-Enable verbose mode.
-.IP "\fB\-V\fR" 4
-.IX Item "-V"
-.PD 0
-.IP "\fB\-\-version\fR" 4
-.IX Item "--version"
-.PD
-Prints the version number for \fBwindmc\fR.
-.IP "\fB\-x\fR \fIpath\fR" 4
-.IX Item "-x path"
-.PD 0
-.IP "\fB\-\-xdgb\fR \fIpath\fR" 4
-.IX Item "--xdgb path"
-.PD
-The path of the \f(CW\*(C`dbg\*(C'\fR C include file that maps message id's to the
-symbolic name. No such file is generated without specifying the switch.
-.IP "\fB@\fR\fIfile\fR" 4
-.IX Item "@file"
-Read command-line options from \fIfile\fR. The options read are
-inserted in place of the original @\fIfile\fR option. If \fIfile\fR
-does not exist, or cannot be read, then the option will be treated
-literally, and not removed.
-.Sp
-Options in \fIfile\fR are separated by whitespace. A whitespace
-character may be included in an option by surrounding the entire
-option in either single or double quotes. Any character (including a
-backslash) may be included by prefixing the character to be included
-with a backslash. The \fIfile\fR may itself contain additional
-@\fIfile\fR options; any such options will be processed recursively.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-the Info entries for \fIbinutils\fR.
-.SH "COPYRIGHT"
-.IX Header "COPYRIGHT"
-Copyright (c) 1991\-2013 Free Software Foundation, Inc.
-.PP
-Permission is granted to copy, distribute and/or modify this document
-under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.3
-or any later version published by the Free Software Foundation;
-with no Invariant Sections, with no Front-Cover Texts, and with no
-Back-Cover Texts. A copy of the license is included in the
-section entitled \*(L"\s-1GNU\s0 Free Documentation License\*(R".
diff -Nur binutils-2.24.orig/binutils/doc/windres.1 binutils-2.24/binutils/doc/windres.1
--- binutils-2.24.orig/binutils/doc/windres.1 2013-11-18 09:49:31.000000000 +0100
+++ binutils-2.24/binutils/doc/windres.1 1970-01-01 01:00:00.000000000 +0100
@@ -1,359 +0,0 @@
-.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings. \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote. \*(C+ will
-.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-. ds -- \(*W-
-. ds PI pi
-. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
-. ds L" ""
-. ds R" ""
-. ds C` ""
-. ds C' ""
-'br\}
-.el\{\
-. ds -- \|\(em\|
-. ds PI \(*p
-. ds L" ``
-. ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD. Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-. de IX
-. tm Index:\\$1\t\\n%\t"\\$2"
-..
-. nr % 0
-. rr F
-.\}
-.el \{\
-. de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear. Run. Save yourself. No user-serviceable parts.
-. \" fudge factors for nroff and troff
-.if n \{\
-. ds #H 0
-. ds #V .8m
-. ds #F .3m
-. ds #[ \f1
-. ds #] \fP
-.\}
-.if t \{\
-. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-. ds #V .6m
-. ds #F 0
-. ds #[ \&
-. ds #] \&
-.\}
-. \" simple accents for nroff and troff
-.if n \{\
-. ds ' \&
-. ds ` \&
-. ds ^ \&
-. ds , \&
-. ds ~ ~
-. ds /
-.\}
-.if t \{\
-. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-. \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-. \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-. \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-. ds : e
-. ds 8 ss
-. ds o a
-. ds d- d\h'-1'\(ga
-. ds D- D\h'-1'\(hy
-. ds th \o'bp'
-. ds Th \o'LP'
-. ds ae ae
-. ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "WINDRES 1"
-.TH WINDRES 1 "2013-11-18" "binutils-2.23.91" "GNU Development Tools"
-.\" For nroff, turn off justification. Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-windres \- manipulate Windows resources.
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-windres [options] [input\-file] [output\-file]
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-\&\fBwindres\fR reads resources from an input file and copies them into
-an output file. Either file may be in one of three formats:
-.ie n .IP """rc""" 4
-.el .IP "\f(CWrc\fR" 4
-.IX Item "rc"
-A text format read by the Resource Compiler.
-.ie n .IP """res""" 4
-.el .IP "\f(CWres\fR" 4
-.IX Item "res"
-A binary format generated by the Resource Compiler.
-.ie n .IP """coff""" 4
-.el .IP "\f(CWcoff\fR" 4
-.IX Item "coff"
-A \s-1COFF\s0 object or executable.
-.PP
-The exact description of these different formats is available in
-documentation from Microsoft.
-.PP
-When \fBwindres\fR converts from the \f(CW\*(C`rc\*(C'\fR format to the \f(CW\*(C`res\*(C'\fR
-format, it is acting like the Windows Resource Compiler. When
-\&\fBwindres\fR converts from the \f(CW\*(C`res\*(C'\fR format to the \f(CW\*(C`coff\*(C'\fR
-format, it is acting like the Windows \f(CW\*(C`CVTRES\*(C'\fR program.
-.PP
-When \fBwindres\fR generates an \f(CW\*(C`rc\*(C'\fR file, the output is similar
-but not identical to the format expected for the input. When an input
-\&\f(CW\*(C`rc\*(C'\fR file refers to an external filename, an output \f(CW\*(C`rc\*(C'\fR file
-will instead include the file contents.
-.PP
-If the input or output format is not specified, \fBwindres\fR will
-guess based on the file name, or, for the input file, the file contents.
-A file with an extension of \fI.rc\fR will be treated as an \f(CW\*(C`rc\*(C'\fR
-file, a file with an extension of \fI.res\fR will be treated as a
-\&\f(CW\*(C`res\*(C'\fR file, and a file with an extension of \fI.o\fR or
-\&\fI.exe\fR will be treated as a \f(CW\*(C`coff\*(C'\fR file.
-.PP
-If no output file is specified, \fBwindres\fR will print the resources
-in \f(CW\*(C`rc\*(C'\fR format to standard output.
-.PP
-The normal use is for you to write an \f(CW\*(C`rc\*(C'\fR file, use \fBwindres\fR
-to convert it to a \s-1COFF\s0 object file, and then link the \s-1COFF\s0 file into
-your application. This will make the resources described in the
-\&\f(CW\*(C`rc\*(C'\fR file available to Windows.
-.SH "OPTIONS"
-.IX Header "OPTIONS"
-.IP "\fB\-i\fR \fIfilename\fR" 4
-.IX Item "-i filename"
-.PD 0
-.IP "\fB\-\-input\fR \fIfilename\fR" 4
-.IX Item "--input filename"
-.PD
-The name of the input file. If this option is not used, then
-\&\fBwindres\fR will use the first non-option argument as the input file
-name. If there are no non-option arguments, then \fBwindres\fR will
-read from standard input. \fBwindres\fR can not read a \s-1COFF\s0 file from
-standard input.
-.IP "\fB\-o\fR \fIfilename\fR" 4
-.IX Item "-o filename"
-.PD 0
-.IP "\fB\-\-output\fR \fIfilename\fR" 4
-.IX Item "--output filename"
-.PD
-The name of the output file. If this option is not used, then
-\&\fBwindres\fR will use the first non-option argument, after any used
-for the input file name, as the output file name. If there is no
-non-option argument, then \fBwindres\fR will write to standard output.
-\&\fBwindres\fR can not write a \s-1COFF\s0 file to standard output. Note,
-for compatibility with \fBrc\fR the option \fB\-fo\fR is also
-accepted, but its use is not recommended.
-.IP "\fB\-J\fR \fIformat\fR" 4
-.IX Item "-J format"
-.PD 0
-.IP "\fB\-\-input\-format\fR \fIformat\fR" 4
-.IX Item "--input-format format"
-.PD
-The input format to read. \fIformat\fR may be \fBres\fR, \fBrc\fR, or
-\&\fBcoff\fR. If no input format is specified, \fBwindres\fR will
-guess, as described above.
-.IP "\fB\-O\fR \fIformat\fR" 4
-.IX Item "-O format"
-.PD 0
-.IP "\fB\-\-output\-format\fR \fIformat\fR" 4
-.IX Item "--output-format format"
-.PD
-The output format to generate. \fIformat\fR may be \fBres\fR,
-\&\fBrc\fR, or \fBcoff\fR. If no output format is specified,
-\&\fBwindres\fR will guess, as described above.
-.IP "\fB\-F\fR \fItarget\fR" 4
-.IX Item "-F target"
-.PD 0
-.IP "\fB\-\-target\fR \fItarget\fR" 4
-.IX Item "--target target"
-.PD
-Specify the \s-1BFD\s0 format to use for a \s-1COFF\s0 file as input or output. This
-is a \s-1BFD\s0 target name; you can use the \fB\-\-help\fR option to see a list
-of supported targets. Normally \fBwindres\fR will use the default
-format, which is the first one listed by the \fB\-\-help\fR option.
-.IP "\fB\-\-preprocessor\fR \fIprogram\fR" 4
-.IX Item "--preprocessor program"
-When \fBwindres\fR reads an \f(CW\*(C`rc\*(C'\fR file, it runs it through the C
-preprocessor first. This option may be used to specify the preprocessor
-to use, including any leading arguments. The default preprocessor
-argument is \f(CW\*(C`gcc \-E \-xc\-header \-DRC_INVOKED\*(C'\fR.
-.IP "\fB\-\-preprocessor\-arg\fR \fIoption\fR" 4
-.IX Item "--preprocessor-arg option"
-When \fBwindres\fR reads an \f(CW\*(C`rc\*(C'\fR file, it runs it through
-the C preprocessor first. This option may be used to specify additional
-text to be passed to preprocessor on its command line.
-This option can be used multiple times to add multiple options to the
-preprocessor command line.
-.IP "\fB\-I\fR \fIdirectory\fR" 4
-.IX Item "-I directory"
-.PD 0
-.IP "\fB\-\-include\-dir\fR \fIdirectory\fR" 4
-.IX Item "--include-dir directory"
-.PD
-Specify an include directory to use when reading an \f(CW\*(C`rc\*(C'\fR file.
-\&\fBwindres\fR will pass this to the preprocessor as an \fB\-I\fR
-option. \fBwindres\fR will also search this directory when looking for
-files named in the \f(CW\*(C`rc\*(C'\fR file. If the argument passed to this command
-matches any of the supported \fIformats\fR (as described in the \fB\-J\fR
-option), it will issue a deprecation warning, and behave just like the
-\&\fB\-J\fR option. New programs should not use this behaviour. If a
-directory happens to match a \fIformat\fR, simple prefix it with \fB./\fR
-to disable the backward compatibility.
-.IP "\fB\-D\fR \fItarget\fR" 4
-.IX Item "-D target"
-.PD 0
-.IP "\fB\-\-define\fR \fIsym\fR\fB[=\fR\fIval\fR\fB]\fR" 4
-.IX Item "--define sym[=val]"
-.PD
-Specify a \fB\-D\fR option to pass to the preprocessor when reading an
-\&\f(CW\*(C`rc\*(C'\fR file.
-.IP "\fB\-U\fR \fItarget\fR" 4
-.IX Item "-U target"
-.PD 0
-.IP "\fB\-\-undefine\fR \fIsym\fR" 4
-.IX Item "--undefine sym"
-.PD
-Specify a \fB\-U\fR option to pass to the preprocessor when reading an
-\&\f(CW\*(C`rc\*(C'\fR file.
-.IP "\fB\-r\fR" 4
-.IX Item "-r"
-Ignored for compatibility with rc.
-.IP "\fB\-v\fR" 4
-.IX Item "-v"
-Enable verbose mode. This tells you what the preprocessor is if you
-didn't specify one.
-.IP "\fB\-c\fR \fIval\fR" 4
-.IX Item "-c val"
-.PD 0
-.IP "\fB\-\-codepage\fR \fIval\fR" 4
-.IX Item "--codepage val"
-.PD
-Specify the default codepage to use when reading an \f(CW\*(C`rc\*(C'\fR file.
-\&\fIval\fR should be a hexadecimal prefixed by \fB0x\fR or decimal
-codepage code. The valid range is from zero up to 0xffff, but the
-validity of the codepage is host and configuration dependent.
-.IP "\fB\-l\fR \fIval\fR" 4
-.IX Item "-l val"
-.PD 0
-.IP "\fB\-\-language\fR \fIval\fR" 4
-.IX Item "--language val"
-.PD
-Specify the default language to use when reading an \f(CW\*(C`rc\*(C'\fR file.
-\&\fIval\fR should be a hexadecimal language code. The low eight bits are
-the language, and the high eight bits are the sublanguage.
-.IP "\fB\-\-use\-temp\-file\fR" 4
-.IX Item "--use-temp-file"
-Use a temporary file to instead of using popen to read the output of
-the preprocessor. Use this option if the popen implementation is buggy
-on the host (eg., certain non-English language versions of Windows 95 and
-Windows 98 are known to have buggy popen where the output will instead
-go the console).
-.IP "\fB\-\-no\-use\-temp\-file\fR" 4
-.IX Item "--no-use-temp-file"
-Use popen, not a temporary file, to read the output of the preprocessor.
-This is the default behaviour.
-.IP "\fB\-h\fR" 4
-.IX Item "-h"
-.PD 0
-.IP "\fB\-\-help\fR" 4
-.IX Item "--help"
-.PD
-Prints a usage summary.
-.IP "\fB\-V\fR" 4
-.IX Item "-V"
-.PD 0
-.IP "\fB\-\-version\fR" 4
-.IX Item "--version"
-.PD
-Prints the version number for \fBwindres\fR.
-.IP "\fB\-\-yydebug\fR" 4
-.IX Item "--yydebug"
-If \fBwindres\fR is compiled with \f(CW\*(C`YYDEBUG\*(C'\fR defined as \f(CW1\fR,
-this will turn on parser debugging.
-.IP "\fB@\fR\fIfile\fR" 4
-.IX Item "@file"
-Read command-line options from \fIfile\fR. The options read are
-inserted in place of the original @\fIfile\fR option. If \fIfile\fR
-does not exist, or cannot be read, then the option will be treated
-literally, and not removed.
-.Sp
-Options in \fIfile\fR are separated by whitespace. A whitespace
-character may be included in an option by surrounding the entire
-option in either single or double quotes. Any character (including a
-backslash) may be included by prefixing the character to be included
-with a backslash. The \fIfile\fR may itself contain additional
-@\fIfile\fR options; any such options will be processed recursively.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-the Info entries for \fIbinutils\fR.
-.SH "COPYRIGHT"
-.IX Header "COPYRIGHT"
-Copyright (c) 1991\-2013 Free Software Foundation, Inc.
-.PP
-Permission is granted to copy, distribute and/or modify this document
-under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.3
-or any later version published by the Free Software Foundation;
-with no Invariant Sections, with no Front-Cover Texts, and with no
-Back-Cover Texts. A copy of the license is included in the
-section entitled \*(L"\s-1GNU\s0 Free Documentation License\*(R".
diff -Nur binutils-2.24.orig/binutils/dwarf.c binutils-2.24/binutils/dwarf.c
--- binutils-2.24.orig/binutils/dwarf.c 2013-11-08 11:13:48.000000000 +0100
+++ binutils-2.24/binutils/dwarf.c 2024-05-17 16:15:39.007345330 +0200
@@ -263,7 +263,7 @@
*length_return = num_read;
if (sign && (shift < 8 * sizeof (result)) && (byte & 0x40))
- result |= -1L << shift;
+ result |= (dwarf_vma) -1 << shift;
return result;
}
@@ -2663,14 +2663,10 @@
linfo->li_max_ops_per_insn = 1;
SAFE_BYTE_GET_AND_INC (linfo->li_default_is_stmt, hdrptr, 1, end);
- SAFE_BYTE_GET_AND_INC (linfo->li_line_base, hdrptr, 1, end);
+ SAFE_SIGNED_BYTE_GET_AND_INC (linfo->li_line_base, hdrptr, 1, end);
SAFE_BYTE_GET_AND_INC (linfo->li_line_range, hdrptr, 1, end);
SAFE_BYTE_GET_AND_INC (linfo->li_opcode_base, hdrptr, 1, end);
- /* Sign extend the line base field. */
- linfo->li_line_base <<= 24;
- linfo->li_line_base >>= 24;
-
* end_of_sequence = data + linfo->li_length + initial_length_size;
return hdrptr;
}
diff -Nur binutils-2.24.orig/binutils/MAINTAINERS binutils-2.24/binutils/MAINTAINERS
--- binutils-2.24.orig/binutils/MAINTAINERS 2013-11-08 11:13:48.000000000 +0100
+++ binutils-2.24/binutils/MAINTAINERS 2024-05-17 16:15:38.987344917 +0200
@@ -109,6 +109,8 @@
MN10300 Alexandre Oliva
Moxie Anthony Green
MSP430 Dmitry Diky
+ NDS32 Kuan-Lin Chen
+ NDS32 Wei-Cheng Wang
NetBSD support Matt Thomas
Nios II Sandra Loosemore
Nios II Andrew Jenner
diff -Nur binutils-2.24.orig/binutils/Makefile.am binutils-2.24/binutils/Makefile.am
--- binutils-2.24.orig/binutils/Makefile.am 2013-11-04 16:33:37.000000000 +0100
+++ binutils-2.24/binutils/Makefile.am 2024-05-17 16:15:38.987344917 +0200
@@ -241,7 +241,7 @@
objdump_SOURCES = objdump.c dwarf.c prdbg.c $(DEBUG_SRCS) $(BULIBS) $(ELFLIBS)
EXTRA_objdump_SOURCES = od-xcoff.c
-objdump_LDADD = $(OBJDUMP_PRIVATE_OFILES) $(OPCODES) $(BFDLIB) $(LIBIBERTY) $(LIBINTL)
+objdump_LDADD = $(OBJDUMP_PRIVATE_OFILES) $(OPCODES) $(BFDLIB) $(LIBIBERTY) $(LIBINTL) -ldl
objdump.@OBJEXT@:objdump.c
if am__fastdepCC
diff -Nur binutils-2.24.orig/binutils/Makefile.in binutils-2.24/binutils/Makefile.in
--- binutils-2.24.orig/binutils/Makefile.in 2013-11-04 16:33:37.000000000 +0100
+++ binutils-2.24/binutils/Makefile.in 2024-05-17 16:15:38.987344917 +0200
@@ -581,7 +581,7 @@
nm_new_SOURCES = nm.c $(BULIBS)
objdump_SOURCES = objdump.c dwarf.c prdbg.c $(DEBUG_SRCS) $(BULIBS) $(ELFLIBS)
EXTRA_objdump_SOURCES = od-xcoff.c
-objdump_LDADD = $(OBJDUMP_PRIVATE_OFILES) $(OPCODES) $(BFDLIB) $(LIBIBERTY) $(LIBINTL)
+objdump_LDADD = $(OBJDUMP_PRIVATE_OFILES) $(OPCODES) $(BFDLIB) $(LIBIBERTY) $(LIBINTL) -ldl
cxxfilt_SOURCES = cxxfilt.c $(BULIBS)
ar_SOURCES = arparse.y arlex.l ar.c not-ranlib.c arsup.c rename.c binemul.c \
emul_$(EMULATION).c $(BULIBS)
diff -Nur binutils-2.24.orig/binutils/mcparse.c binutils-2.24/binutils/mcparse.c
--- binutils-2.24.orig/binutils/mcparse.c 2013-11-18 09:49:30.000000000 +0100
+++ binutils-2.24/binutils/mcparse.c 1970-01-01 01:00:00.000000000 +0100
@@ -1,2156 +0,0 @@
-/* A Bison parser, made by GNU Bison 2.3. */
-
-/* Skeleton implementation for Bison's Yacc-like parsers in C
-
- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
- Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA. */
-
-/* As a special exception, you may create a larger work that contains
- part or all of the Bison parser skeleton and distribute that work
- under terms of your choice, so long as that work isn't itself a
- parser generator using the skeleton or a modified version thereof
- as a parser skeleton. Alternatively, if you modify or redistribute
- the parser skeleton itself, you may (at your option) remove this
- special exception, which will cause the skeleton and the resulting
- Bison output files to be licensed under the GNU General Public
- License without this special exception.
-
- This special exception was added by the Free Software Foundation in
- version 2.2 of Bison. */
-
-/* C LALR(1) parser skeleton written by Richard Stallman, by
- simplifying the original so-called "semantic" parser. */
-
-/* All symbols defined below should begin with yy or YY, to avoid
- infringing on user name space. This should be done even for local
- variables, as they might otherwise be expanded by user macros.
- There are some unavoidable exceptions within include files to
- define necessary library symbols; they are noted "INFRINGES ON
- USER NAME SPACE" below. */
-
-/* Identify Bison output. */
-#define YYBISON 1
-
-/* Bison version. */
-#define YYBISON_VERSION "2.3"
-
-/* Skeleton name. */
-#define YYSKELETON_NAME "yacc.c"
-
-/* Pure parsers. */
-#define YYPURE 0
-
-/* Using locations. */
-#define YYLSP_NEEDED 0
-
-
-
-/* Tokens. */
-#ifndef YYTOKENTYPE
-# define YYTOKENTYPE
- /* Put the tokens into the symbol table, so that GDB and other debuggers
- know about them. */
- enum yytokentype {
- NL = 258,
- MCIDENT = 259,
- MCFILENAME = 260,
- MCLINE = 261,
- MCCOMMENT = 262,
- MCTOKEN = 263,
- MCENDLINE = 264,
- MCLANGUAGENAMES = 265,
- MCFACILITYNAMES = 266,
- MCSEVERITYNAMES = 267,
- MCOUTPUTBASE = 268,
- MCMESSAGEIDTYPEDEF = 269,
- MCLANGUAGE = 270,
- MCMESSAGEID = 271,
- MCSEVERITY = 272,
- MCFACILITY = 273,
- MCSYMBOLICNAME = 274,
- MCNUMBER = 275
- };
-#endif
-/* Tokens. */
-#define NL 258
-#define MCIDENT 259
-#define MCFILENAME 260
-#define MCLINE 261
-#define MCCOMMENT 262
-#define MCTOKEN 263
-#define MCENDLINE 264
-#define MCLANGUAGENAMES 265
-#define MCFACILITYNAMES 266
-#define MCSEVERITYNAMES 267
-#define MCOUTPUTBASE 268
-#define MCMESSAGEIDTYPEDEF 269
-#define MCLANGUAGE 270
-#define MCMESSAGEID 271
-#define MCSEVERITY 272
-#define MCFACILITY 273
-#define MCSYMBOLICNAME 274
-#define MCNUMBER 275
-
-
-
-
-/* Copy the first part of user declarations. */
-#line 1 "mcparse.y"
- /* mcparse.y -- parser for Windows mc files
- Copyright 2007
- Free Software Foundation, Inc.
-
- Parser for Windows mc files
- Written by Kai Tietz, Onevision.
-
- This file is part of GNU Binutils.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
- 02110-1301, USA. */
-
-/* This is a parser for Windows rc files. It is based on the parser
- by Gunther Ebert . */
-
-#include "sysdep.h"
-#include "bfd.h"
-#include "bucomm.h"
-#include "libiberty.h"
-#include "windmc.h"
-#include "safe-ctype.h"
-
-static rc_uint_type mc_last_id = 0;
-static rc_uint_type mc_sefa_val = 0;
-static unichar *mc_last_symbol = NULL;
-static const mc_keyword *mc_cur_severity = NULL;
-static const mc_keyword *mc_cur_facility = NULL;
-static mc_node *cur_node = NULL;
-
-
-
-/* Enabling traces. */
-#ifndef YYDEBUG
-# define YYDEBUG 0
-#endif
-
-/* Enabling verbose error messages. */
-#ifdef YYERROR_VERBOSE
-# undef YYERROR_VERBOSE
-# define YYERROR_VERBOSE 1
-#else
-# define YYERROR_VERBOSE 0
-#endif
-
-/* Enabling the token table. */
-#ifndef YYTOKEN_TABLE
-# define YYTOKEN_TABLE 0
-#endif
-
-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-typedef union YYSTYPE
-#line 45 "mcparse.y"
-{
- rc_uint_type ival;
- unichar *ustr;
- const mc_keyword *tok;
- mc_node *nod;
-}
-/* Line 193 of yacc.c. */
-#line 186 "mcparse.c"
- YYSTYPE;
-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
-# define YYSTYPE_IS_DECLARED 1
-# define YYSTYPE_IS_TRIVIAL 1
-#endif
-
-
-
-/* Copy the second part of user declarations. */
-
-
-/* Line 216 of yacc.c. */
-#line 199 "mcparse.c"
-
-#ifdef short
-# undef short
-#endif
-
-#ifdef YYTYPE_UINT8
-typedef YYTYPE_UINT8 yytype_uint8;
-#else
-typedef unsigned char yytype_uint8;
-#endif
-
-#ifdef YYTYPE_INT8
-typedef YYTYPE_INT8 yytype_int8;
-#elif (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-typedef signed char yytype_int8;
-#else
-typedef short int yytype_int8;
-#endif
-
-#ifdef YYTYPE_UINT16
-typedef YYTYPE_UINT16 yytype_uint16;
-#else
-typedef unsigned short int yytype_uint16;
-#endif
-
-#ifdef YYTYPE_INT16
-typedef YYTYPE_INT16 yytype_int16;
-#else
-typedef short int yytype_int16;
-#endif
-
-#ifndef YYSIZE_T
-# ifdef __SIZE_TYPE__
-# define YYSIZE_T __SIZE_TYPE__
-# elif defined size_t
-# define YYSIZE_T size_t
-# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-# include /* INFRINGES ON USER NAME SPACE */
-# define YYSIZE_T size_t
-# else
-# define YYSIZE_T unsigned int
-# endif
-#endif
-
-#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
-
-#ifndef YY_
-# if defined YYENABLE_NLS && YYENABLE_NLS
-# if ENABLE_NLS
-# include /* INFRINGES ON USER NAME SPACE */
-# define YY_(msgid) dgettext ("bison-runtime", msgid)
-# endif
-# endif
-# ifndef YY_
-# define YY_(msgid) msgid
-# endif
-#endif
-
-/* Suppress unused-variable warnings by "using" E. */
-#if ! defined lint || defined __GNUC__
-# define YYUSE(e) ((void) (e))
-#else
-# define YYUSE(e) /* empty */
-#endif
-
-/* Identity function, used to suppress warnings about constant conditions. */
-#ifndef lint
-# define YYID(n) (n)
-#else
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static int
-YYID (int i)
-#else
-static int
-YYID (i)
- int i;
-#endif
-{
- return i;
-}
-#endif
-
-#if ! defined yyoverflow || YYERROR_VERBOSE
-
-/* The parser invokes alloca or malloc; define the necessary symbols. */
-
-# ifdef YYSTACK_USE_ALLOCA
-# if YYSTACK_USE_ALLOCA
-# ifdef __GNUC__
-# define YYSTACK_ALLOC __builtin_alloca
-# elif defined __BUILTIN_VA_ARG_INCR
-# include /* INFRINGES ON USER NAME SPACE */
-# elif defined _AIX
-# define YYSTACK_ALLOC __alloca
-# elif defined _MSC_VER
-# include /* INFRINGES ON USER NAME SPACE */
-# define alloca _alloca
-# else
-# define YYSTACK_ALLOC alloca
-# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-# include /* INFRINGES ON USER NAME SPACE */
-# ifndef _STDLIB_H
-# define _STDLIB_H 1
-# endif
-# endif
-# endif
-# endif
-# endif
-
-# ifdef YYSTACK_ALLOC
- /* Pacify GCC's `empty if-body' warning. */
-# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
-# ifndef YYSTACK_ALLOC_MAXIMUM
- /* The OS might guarantee only one guard page at the bottom of the stack,
- and a page size can be as small as 4096 bytes. So we cannot safely
- invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
- to allow for a few compiler-allocated temporary stack slots. */
-# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
-# endif
-# else
-# define YYSTACK_ALLOC YYMALLOC
-# define YYSTACK_FREE YYFREE
-# ifndef YYSTACK_ALLOC_MAXIMUM
-# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
-# endif
-# if (defined __cplusplus && ! defined _STDLIB_H \
- && ! ((defined YYMALLOC || defined malloc) \
- && (defined YYFREE || defined free)))
-# include /* INFRINGES ON USER NAME SPACE */
-# ifndef _STDLIB_H
-# define _STDLIB_H 1
-# endif
-# endif
-# ifndef YYMALLOC
-# define YYMALLOC malloc
-# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
-# endif
-# endif
-# ifndef YYFREE
-# define YYFREE free
-# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-void free (void *); /* INFRINGES ON USER NAME SPACE */
-# endif
-# endif
-# endif
-#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
-
-
-#if (! defined yyoverflow \
- && (! defined __cplusplus \
- || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
-
-/* A type that is properly aligned for any stack member. */
-union yyalloc
-{
- yytype_int16 yyss;
- YYSTYPE yyvs;
- };
-
-/* The size of the maximum gap between one aligned stack and the next. */
-# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
-
-/* The size of an array large to enough to hold all stacks, each with
- N elements. */
-# define YYSTACK_BYTES(N) \
- ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
- + YYSTACK_GAP_MAXIMUM)
-
-/* Copy COUNT objects from FROM to TO. The source and destination do
- not overlap. */
-# ifndef YYCOPY
-# if defined __GNUC__ && 1 < __GNUC__
-# define YYCOPY(To, From, Count) \
- __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
-# else
-# define YYCOPY(To, From, Count) \
- do \
- { \
- YYSIZE_T yyi; \
- for (yyi = 0; yyi < (Count); yyi++) \
- (To)[yyi] = (From)[yyi]; \
- } \
- while (YYID (0))
-# endif
-# endif
-
-/* Relocate STACK from its old location to the new one. The
- local variables YYSIZE and YYSTACKSIZE give the old and new number of
- elements in the stack, and YYPTR gives the new location of the
- stack. Advance YYPTR to a properly aligned location for the next
- stack. */
-# define YYSTACK_RELOCATE(Stack) \
- do \
- { \
- YYSIZE_T yynewbytes; \
- YYCOPY (&yyptr->Stack, Stack, yysize); \
- Stack = &yyptr->Stack; \
- yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
- yyptr += yynewbytes / sizeof (*yyptr); \
- } \
- while (YYID (0))
-
-#endif
-
-/* YYFINAL -- State number of the termination state. */
-#define YYFINAL 3
-/* YYLAST -- Last index in YYTABLE. */
-#define YYLAST 114
-
-/* YYNTOKENS -- Number of terminals. */
-#define YYNTOKENS 26
-/* YYNNTS -- Number of nonterminals. */
-#define YYNNTS 29
-/* YYNRULES -- Number of rules. */
-#define YYNRULES 82
-/* YYNRULES -- Number of states. */
-#define YYNSTATES 125
-
-/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
-#define YYUNDEFTOK 2
-#define YYMAXUTOK 275
-
-#define YYTRANSLATE(YYX) \
- ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
-
-/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */
-static const yytype_uint8 yytranslate[] =
-{
- 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 22, 23, 2, 25, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 24, 2,
- 2, 21, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
- 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
- 15, 16, 17, 18, 19, 20
-};
-
-#if YYDEBUG
-/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
- YYRHS. */
-static const yytype_uint16 yyprhs[] =
-{
- 0, 0, 3, 5, 6, 9, 11, 13, 15, 17,
- 23, 29, 33, 36, 42, 48, 52, 55, 61, 67,
- 71, 74, 78, 82, 86, 89, 91, 94, 96, 101,
- 105, 108, 110, 113, 115, 120, 124, 127, 129, 132,
- 134, 141, 148, 153, 157, 160, 161, 164, 167, 168,
- 173, 177, 181, 184, 185, 187, 190, 193, 194, 197,
- 200, 203, 207, 211, 215, 217, 220, 225, 227, 230,
- 232, 235, 237, 240, 246, 252, 258, 263, 266, 268,
- 270, 271, 272
-};
-
-/* YYRHS -- A `-1'-separated list of the rules' RHS. */
-static const yytype_int8 yyrhs[] =
-{
- 27, 0, -1, 28, -1, -1, 28, 29, -1, 30,
- -1, 38, -1, 49, -1, 1, -1, 12, 21, 22,
- 31, 23, -1, 12, 21, 22, 31, 1, -1, 12,
- 21, 1, -1, 12, 1, -1, 10, 21, 22, 35,
- 23, -1, 10, 21, 22, 35, 1, -1, 10, 21,
- 1, -1, 10, 1, -1, 11, 21, 22, 33, 23,
- -1, 11, 21, 22, 33, 1, -1, 11, 21, 1,
- -1, 11, 1, -1, 13, 21, 20, -1, 14, 21,
- 4, -1, 14, 21, 1, -1, 14, 1, -1, 32,
- -1, 31, 32, -1, 1, -1, 51, 21, 20, 37,
- -1, 51, 21, 1, -1, 51, 1, -1, 34, -1,
- 33, 34, -1, 1, -1, 51, 21, 20, 37, -1,
- 51, 21, 1, -1, 51, 1, -1, 36, -1, 35,
- 36, -1, 1, -1, 51, 21, 20, 54, 24, 5,
- -1, 51, 21, 20, 54, 24, 1, -1, 51, 21,
- 20, 1, -1, 51, 21, 1, -1, 51, 1, -1,
- -1, 24, 4, -1, 24, 1, -1, -1, 40, 42,
- 39, 46, -1, 16, 21, 41, -1, 16, 21, 1,
- -1, 16, 1, -1, -1, 20, -1, 25, 20, -1,
- 25, 1, -1, -1, 42, 43, -1, 42, 44, -1,
- 42, 45, -1, 17, 21, 8, -1, 18, 21, 8,
- -1, 19, 21, 4, -1, 47, -1, 46, 47, -1,
- 50, 53, 48, 9, -1, 6, -1, 48, 6, -1,
- 1, -1, 48, 1, -1, 7, -1, 49, 7, -1,
- 15, 52, 21, 8, 3, -1, 15, 52, 21, 4,
- 3, -1, 15, 52, 21, 51, 1, -1, 15, 52,
- 21, 1, -1, 15, 1, -1, 4, -1, 8, -1,
- -1, -1, -1
-};
-
-/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
-static const yytype_uint16 yyrline[] =
-{
- 0, 67, 67, 70, 72, 74, 75, 76, 81, 85,
- 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
- 96, 97, 103, 107, 111, 118, 119, 120, 124, 128,
- 129, 133, 134, 135, 139, 143, 144, 148, 149, 150,
- 154, 158, 159, 160, 161, 166, 169, 173, 178, 177,
- 190, 191, 192, 196, 199, 203, 207, 212, 219, 225,
- 231, 239, 247, 255, 262, 263, 267, 277, 281, 293,
- 294, 297, 298, 312, 316, 321, 326, 331, 338, 339,
- 343, 347, 351
-};
-#endif
-
-#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
-/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
- First, the terminals, then, starting at YYNTOKENS, nonterminals. */
-static const char *const yytname[] =
-{
- "$end", "error", "$undefined", "NL", "MCIDENT", "MCFILENAME", "MCLINE",
- "MCCOMMENT", "MCTOKEN", "MCENDLINE", "MCLANGUAGENAMES",
- "MCFACILITYNAMES", "MCSEVERITYNAMES", "MCOUTPUTBASE",
- "MCMESSAGEIDTYPEDEF", "MCLANGUAGE", "MCMESSAGEID", "MCSEVERITY",
- "MCFACILITY", "MCSYMBOLICNAME", "MCNUMBER", "'='", "'('", "')'", "':'",
- "'+'", "$accept", "input", "entities", "entity", "global_section",
- "severitymaps", "severitymap", "facilitymaps", "facilitymap", "langmaps",
- "langmap", "alias_name", "message", "@1", "id", "vid", "sefasy_def",
- "severity", "facility", "symbol", "lang_entities", "lang_entity",
- "lines", "comments", "lang", "token", "lex_want_nl", "lex_want_line",
- "lex_want_filename", 0
-};
-#endif
-
-# ifdef YYPRINT
-/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
- token YYLEX-NUM. */
-static const yytype_uint16 yytoknum[] =
-{
- 0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
- 265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
- 275, 61, 40, 41, 58, 43
-};
-# endif
-
-/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
-static const yytype_uint8 yyr1[] =
-{
- 0, 26, 27, 28, 28, 29, 29, 29, 29, 30,
- 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 31, 31, 31, 32, 32,
- 32, 33, 33, 33, 34, 34, 34, 35, 35, 35,
- 36, 36, 36, 36, 36, 37, 37, 37, 39, 38,
- 40, 40, 40, 41, 41, 41, 41, 42, 42, 42,
- 42, 43, 44, 45, 46, 46, 47, 48, 48, 48,
- 48, 49, 49, 50, 50, 50, 50, 50, 51, 51,
- 52, 53, 54
-};
-
-/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
-static const yytype_uint8 yyr2[] =
-{
- 0, 2, 1, 0, 2, 1, 1, 1, 1, 5,
- 5, 3, 2, 5, 5, 3, 2, 5, 5, 3,
- 2, 3, 3, 3, 2, 1, 2, 1, 4, 3,
- 2, 1, 2, 1, 4, 3, 2, 1, 2, 1,
- 6, 6, 4, 3, 2, 0, 2, 2, 0, 4,
- 3, 3, 2, 0, 1, 2, 2, 0, 2, 2,
- 2, 3, 3, 3, 1, 2, 4, 1, 2, 1,
- 2, 1, 2, 5, 5, 5, 4, 2, 1, 1,
- 0, 0, 0
-};
-
-/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
- STATE-NUM when YYTABLE doesn't specify something else to do. Zero
- means the default is an error. */
-static const yytype_uint8 yydefact[] =
-{
- 3, 0, 0, 1, 8, 71, 0, 0, 0, 0,
- 0, 0, 4, 5, 6, 57, 7, 16, 0, 20,
- 0, 12, 0, 0, 24, 0, 52, 0, 48, 72,
- 15, 0, 19, 0, 11, 0, 21, 23, 22, 51,
- 54, 0, 50, 0, 0, 0, 0, 58, 59, 60,
- 39, 78, 79, 0, 37, 0, 33, 0, 31, 0,
- 27, 0, 25, 0, 56, 55, 0, 0, 0, 0,
- 49, 64, 81, 14, 13, 38, 44, 0, 18, 17,
- 32, 36, 0, 10, 9, 26, 30, 0, 61, 62,
- 63, 77, 0, 65, 0, 43, 0, 35, 45, 29,
- 45, 0, 69, 67, 0, 42, 0, 0, 34, 28,
- 76, 78, 79, 0, 70, 68, 66, 0, 47, 46,
- 74, 73, 75, 41, 40
-};
-
-/* YYDEFGOTO[NTERM-NUM]. */
-static const yytype_int8 yydefgoto[] =
-{
- -1, 1, 2, 12, 13, 61, 62, 57, 58, 53,
- 54, 108, 14, 46, 15, 42, 28, 47, 48, 49,
- 70, 71, 104, 16, 72, 55, 92, 94, 106
-};
-
-/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
- STATE-NUM. */
-#define YYPACT_NINF -34
-static const yytype_int8 yypact[] =
-{
- -34, 62, 70, -34, -34, -34, 15, 22, 30, -15,
- 34, 37, -34, -34, -34, -34, 56, -34, 10, -34,
- 12, -34, 20, 25, -34, 52, -34, 0, 80, -34,
- -34, 71, -34, 84, -34, 86, -34, -34, -34, -34,
- -34, 45, -34, 1, 68, 74, 76, -34, -34, -34,
- -34, -34, -34, 4, -34, 38, -34, 6, -34, 39,
- -34, 29, -34, 40, -34, -34, 93, 94, 99, 43,
- 76, -34, -34, -34, -34, -34, -34, 46, -34, -34,
- -34, -34, 47, -34, -34, -34, -34, 49, -34, -34,
- -34, -34, 83, -34, 3, -34, 2, -34, 81, -34,
- 81, 92, -34, -34, 48, -34, 82, 72, -34, -34,
- -34, 104, 105, 108, -34, -34, -34, 73, -34, -34,
- -34, -34, -34, -34, -34
-};
-
-/* YYPGOTO[NTERM-NUM]. */
-static const yytype_int8 yypgoto[] =
-{
- -34, -34, -34, -34, -34, -34, 50, -34, 53, -34,
- 59, 13, -34, -34, -34, -34, -34, -34, -34, -34,
- -34, 44, -34, -34, -34, -33, -34, -34, -34
-};
-
-/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
- positive, shift that token. If negative, reduce the rule which
- number is the opposite. If zero, do what YYDEFACT says.
- If YYTABLE_NINF, syntax error. */
-#define YYTABLE_NINF -83
-static const yytype_int8 yytable[] =
-{
- 59, 39, 63, 105, 102, 73, 23, 78, 51, 103,
- 51, 30, 52, 32, 52, -53, 17, -53, -53, -53,
- 40, 34, 66, 19, 59, 41, -82, 74, 63, 79,
- 83, 21, 31, 51, 33, 24, 18, 52, 26, 76,
- 81, 86, 35, 20, 91, 36, 64, 95, 97, 114,
- 99, 22, 84, 37, 115, 25, 38, 116, 27, 77,
- 82, 87, 3, 29, -80, 65, 96, 98, 113, 100,
- -2, 4, 50, 118, 123, 51, 119, 5, 124, 52,
- 6, 7, 8, 9, 10, 56, 11, 60, 51, 67,
- 51, 69, 52, 110, 52, 68, 111, 43, 44, 45,
- 112, 88, 89, 90, 101, 107, 117, 120, 121, 122,
- 80, 85, 75, 109, 93
-};
-
-static const yytype_uint8 yycheck[] =
-{
- 33, 1, 35, 1, 1, 1, 21, 1, 4, 6,
- 4, 1, 8, 1, 8, 15, 1, 17, 18, 19,
- 20, 1, 21, 1, 57, 25, 24, 23, 61, 23,
- 1, 1, 22, 4, 22, 1, 21, 8, 1, 1,
- 1, 1, 22, 21, 1, 20, 1, 1, 1, 1,
- 1, 21, 23, 1, 6, 21, 4, 9, 21, 21,
- 21, 21, 0, 7, 21, 20, 20, 20, 101, 20,
- 0, 1, 1, 1, 1, 4, 4, 7, 5, 8,
- 10, 11, 12, 13, 14, 1, 16, 1, 4, 21,
- 4, 15, 8, 1, 8, 21, 4, 17, 18, 19,
- 8, 8, 8, 4, 21, 24, 24, 3, 3, 1,
- 57, 61, 53, 100, 70
-};
-
-/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
- symbol of state STATE-NUM. */
-static const yytype_uint8 yystos[] =
-{
- 0, 27, 28, 0, 1, 7, 10, 11, 12, 13,
- 14, 16, 29, 30, 38, 40, 49, 1, 21, 1,
- 21, 1, 21, 21, 1, 21, 1, 21, 42, 7,
- 1, 22, 1, 22, 1, 22, 20, 1, 4, 1,
- 20, 25, 41, 17, 18, 19, 39, 43, 44, 45,
- 1, 4, 8, 35, 36, 51, 1, 33, 34, 51,
- 1, 31, 32, 51, 1, 20, 21, 21, 21, 15,
- 46, 47, 50, 1, 23, 36, 1, 21, 1, 23,
- 34, 1, 21, 1, 23, 32, 1, 21, 8, 8,
- 4, 1, 52, 47, 53, 1, 20, 1, 20, 1,
- 20, 21, 1, 6, 48, 1, 54, 24, 37, 37,
- 1, 4, 8, 51, 1, 6, 9, 24, 1, 4,
- 3, 3, 1, 1, 5
-};
-
-#define yyerrok (yyerrstatus = 0)
-#define yyclearin (yychar = YYEMPTY)
-#define YYEMPTY (-2)
-#define YYEOF 0
-
-#define YYACCEPT goto yyacceptlab
-#define YYABORT goto yyabortlab
-#define YYERROR goto yyerrorlab
-
-
-/* Like YYERROR except do call yyerror. This remains here temporarily
- to ease the transition to the new meaning of YYERROR, for GCC.
- Once GCC version 2 has supplanted version 1, this can go. */
-
-#define YYFAIL goto yyerrlab
-
-#define YYRECOVERING() (!!yyerrstatus)
-
-#define YYBACKUP(Token, Value) \
-do \
- if (yychar == YYEMPTY && yylen == 1) \
- { \
- yychar = (Token); \
- yylval = (Value); \
- yytoken = YYTRANSLATE (yychar); \
- YYPOPSTACK (1); \
- goto yybackup; \
- } \
- else \
- { \
- yyerror (YY_("syntax error: cannot back up")); \
- YYERROR; \
- } \
-while (YYID (0))
-
-
-#define YYTERROR 1
-#define YYERRCODE 256
-
-
-/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
- If N is 0, then set CURRENT to the empty location which ends
- the previous symbol: RHS[0] (always defined). */
-
-#define YYRHSLOC(Rhs, K) ((Rhs)[K])
-#ifndef YYLLOC_DEFAULT
-# define YYLLOC_DEFAULT(Current, Rhs, N) \
- do \
- if (YYID (N)) \
- { \
- (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \
- (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
- (Current).last_line = YYRHSLOC (Rhs, N).last_line; \
- (Current).last_column = YYRHSLOC (Rhs, N).last_column; \
- } \
- else \
- { \
- (Current).first_line = (Current).last_line = \
- YYRHSLOC (Rhs, 0).last_line; \
- (Current).first_column = (Current).last_column = \
- YYRHSLOC (Rhs, 0).last_column; \
- } \
- while (YYID (0))
-#endif
-
-
-/* YY_LOCATION_PRINT -- Print the location on the stream.
- This macro was not mandated originally: define only if we know
- we won't break user code: when these are the locations we know. */
-
-#ifndef YY_LOCATION_PRINT
-# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL
-# define YY_LOCATION_PRINT(File, Loc) \
- fprintf (File, "%d.%d-%d.%d", \
- (Loc).first_line, (Loc).first_column, \
- (Loc).last_line, (Loc).last_column)
-# else
-# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
-# endif
-#endif
-
-
-/* YYLEX -- calling `yylex' with the right arguments. */
-
-#ifdef YYLEX_PARAM
-# define YYLEX yylex (YYLEX_PARAM)
-#else
-# define YYLEX yylex ()
-#endif
-
-/* Enable debugging if requested. */
-#if YYDEBUG
-
-# ifndef YYFPRINTF
-# include /* INFRINGES ON USER NAME SPACE */
-# define YYFPRINTF fprintf
-# endif
-
-# define YYDPRINTF(Args) \
-do { \
- if (yydebug) \
- YYFPRINTF Args; \
-} while (YYID (0))
-
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
-do { \
- if (yydebug) \
- { \
- YYFPRINTF (stderr, "%s ", Title); \
- yy_symbol_print (stderr, \
- Type, Value); \
- YYFPRINTF (stderr, "\n"); \
- } \
-} while (YYID (0))
-
-
-/*--------------------------------.
-| Print this symbol on YYOUTPUT. |
-`--------------------------------*/
-
-/*ARGSUSED*/
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static void
-yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
-#else
-static void
-yy_symbol_value_print (yyoutput, yytype, yyvaluep)
- FILE *yyoutput;
- int yytype;
- YYSTYPE const * const yyvaluep;
-#endif
-{
- if (!yyvaluep)
- return;
-# ifdef YYPRINT
- if (yytype < YYNTOKENS)
- YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
-# else
- YYUSE (yyoutput);
-# endif
- switch (yytype)
- {
- default:
- break;
- }
-}
-
-
-/*--------------------------------.
-| Print this symbol on YYOUTPUT. |
-`--------------------------------*/
-
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static void
-yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
-#else
-static void
-yy_symbol_print (yyoutput, yytype, yyvaluep)
- FILE *yyoutput;
- int yytype;
- YYSTYPE const * const yyvaluep;
-#endif
-{
- if (yytype < YYNTOKENS)
- YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
- else
- YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
-
- yy_symbol_value_print (yyoutput, yytype, yyvaluep);
- YYFPRINTF (yyoutput, ")");
-}
-
-/*------------------------------------------------------------------.
-| yy_stack_print -- Print the state stack from its BOTTOM up to its |
-| TOP (included). |
-`------------------------------------------------------------------*/
-
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static void
-yy_stack_print (yytype_int16 *bottom, yytype_int16 *top)
-#else
-static void
-yy_stack_print (bottom, top)
- yytype_int16 *bottom;
- yytype_int16 *top;
-#endif
-{
- YYFPRINTF (stderr, "Stack now");
- for (; bottom <= top; ++bottom)
- YYFPRINTF (stderr, " %d", *bottom);
- YYFPRINTF (stderr, "\n");
-}
-
-# define YY_STACK_PRINT(Bottom, Top) \
-do { \
- if (yydebug) \
- yy_stack_print ((Bottom), (Top)); \
-} while (YYID (0))
-
-
-/*------------------------------------------------.
-| Report that the YYRULE is going to be reduced. |
-`------------------------------------------------*/
-
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static void
-yy_reduce_print (YYSTYPE *yyvsp, int yyrule)
-#else
-static void
-yy_reduce_print (yyvsp, yyrule)
- YYSTYPE *yyvsp;
- int yyrule;
-#endif
-{
- int yynrhs = yyr2[yyrule];
- int yyi;
- unsigned long int yylno = yyrline[yyrule];
- YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
- yyrule - 1, yylno);
- /* The symbols being reduced. */
- for (yyi = 0; yyi < yynrhs; yyi++)
- {
- fprintf (stderr, " $%d = ", yyi + 1);
- yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
- &(yyvsp[(yyi + 1) - (yynrhs)])
- );
- fprintf (stderr, "\n");
- }
-}
-
-# define YY_REDUCE_PRINT(Rule) \
-do { \
- if (yydebug) \
- yy_reduce_print (yyvsp, Rule); \
-} while (YYID (0))
-
-/* Nonzero means print parse trace. It is left uninitialized so that
- multiple parsers can coexist. */
-int yydebug;
-#else /* !YYDEBUG */
-# define YYDPRINTF(Args)
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
-# define YY_STACK_PRINT(Bottom, Top)
-# define YY_REDUCE_PRINT(Rule)
-#endif /* !YYDEBUG */
-
-
-/* YYINITDEPTH -- initial size of the parser's stacks. */
-#ifndef YYINITDEPTH
-# define YYINITDEPTH 200
-#endif
-
-/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
- if the built-in stack extension method is used).
-
- Do not make this value too large; the results are undefined if
- YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
- evaluated with infinite-precision integer arithmetic. */
-
-#ifndef YYMAXDEPTH
-# define YYMAXDEPTH 10000
-#endif
-
-
-
-#if YYERROR_VERBOSE
-
-# ifndef yystrlen
-# if defined __GLIBC__ && defined _STRING_H
-# define yystrlen strlen
-# else
-/* Return the length of YYSTR. */
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static YYSIZE_T
-yystrlen (const char *yystr)
-#else
-static YYSIZE_T
-yystrlen (yystr)
- const char *yystr;
-#endif
-{
- YYSIZE_T yylen;
- for (yylen = 0; yystr[yylen]; yylen++)
- continue;
- return yylen;
-}
-# endif
-# endif
-
-# ifndef yystpcpy
-# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
-# define yystpcpy stpcpy
-# else
-/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
- YYDEST. */
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static char *
-yystpcpy (char *yydest, const char *yysrc)
-#else
-static char *
-yystpcpy (yydest, yysrc)
- char *yydest;
- const char *yysrc;
-#endif
-{
- char *yyd = yydest;
- const char *yys = yysrc;
-
- while ((*yyd++ = *yys++) != '\0')
- continue;
-
- return yyd - 1;
-}
-# endif
-# endif
-
-# ifndef yytnamerr
-/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
- quotes and backslashes, so that it's suitable for yyerror. The
- heuristic is that double-quoting is unnecessary unless the string
- contains an apostrophe, a comma, or backslash (other than
- backslash-backslash). YYSTR is taken from yytname. If YYRES is
- null, do not copy; instead, return the length of what the result
- would have been. */
-static YYSIZE_T
-yytnamerr (char *yyres, const char *yystr)
-{
- if (*yystr == '"')
- {
- YYSIZE_T yyn = 0;
- char const *yyp = yystr;
-
- for (;;)
- switch (*++yyp)
- {
- case '\'':
- case ',':
- goto do_not_strip_quotes;
-
- case '\\':
- if (*++yyp != '\\')
- goto do_not_strip_quotes;
- /* Fall through. */
- default:
- if (yyres)
- yyres[yyn] = *yyp;
- yyn++;
- break;
-
- case '"':
- if (yyres)
- yyres[yyn] = '\0';
- return yyn;
- }
- do_not_strip_quotes: ;
- }
-
- if (! yyres)
- return yystrlen (yystr);
-
- return yystpcpy (yyres, yystr) - yyres;
-}
-# endif
-
-/* Copy into YYRESULT an error message about the unexpected token
- YYCHAR while in state YYSTATE. Return the number of bytes copied,
- including the terminating null byte. If YYRESULT is null, do not
- copy anything; just return the number of bytes that would be
- copied. As a special case, return 0 if an ordinary "syntax error"
- message will do. Return YYSIZE_MAXIMUM if overflow occurs during
- size calculation. */
-static YYSIZE_T
-yysyntax_error (char *yyresult, int yystate, int yychar)
-{
- int yyn = yypact[yystate];
-
- if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
- return 0;
- else
- {
- int yytype = YYTRANSLATE (yychar);
- YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
- YYSIZE_T yysize = yysize0;
- YYSIZE_T yysize1;
- int yysize_overflow = 0;
- enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
- char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
- int yyx;
-
-# if 0
- /* This is so xgettext sees the translatable formats that are
- constructed on the fly. */
- YY_("syntax error, unexpected %s");
- YY_("syntax error, unexpected %s, expecting %s");
- YY_("syntax error, unexpected %s, expecting %s or %s");
- YY_("syntax error, unexpected %s, expecting %s or %s or %s");
- YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
-# endif
- char *yyfmt;
- char const *yyf;
- static char const yyunexpected[] = "syntax error, unexpected %s";
- static char const yyexpecting[] = ", expecting %s";
- static char const yyor[] = " or %s";
- char yyformat[sizeof yyunexpected
- + sizeof yyexpecting - 1
- + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
- * (sizeof yyor - 1))];
- char const *yyprefix = yyexpecting;
-
- /* Start YYX at -YYN if negative to avoid negative indexes in
- YYCHECK. */
- int yyxbegin = yyn < 0 ? -yyn : 0;
-
- /* Stay within bounds of both yycheck and yytname. */
- int yychecklim = YYLAST - yyn + 1;
- int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
- int yycount = 1;
-
- yyarg[0] = yytname[yytype];
- yyfmt = yystpcpy (yyformat, yyunexpected);
-
- for (yyx = yyxbegin; yyx < yyxend; ++yyx)
- if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
- {
- if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
- {
- yycount = 1;
- yysize = yysize0;
- yyformat[sizeof yyunexpected - 1] = '\0';
- break;
- }
- yyarg[yycount++] = yytname[yyx];
- yysize1 = yysize + yytnamerr (0, yytname[yyx]);
- yysize_overflow |= (yysize1 < yysize);
- yysize = yysize1;
- yyfmt = yystpcpy (yyfmt, yyprefix);
- yyprefix = yyor;
- }
-
- yyf = YY_(yyformat);
- yysize1 = yysize + yystrlen (yyf);
- yysize_overflow |= (yysize1 < yysize);
- yysize = yysize1;
-
- if (yysize_overflow)
- return YYSIZE_MAXIMUM;
-
- if (yyresult)
- {
- /* Avoid sprintf, as that infringes on the user's name space.
- Don't have undefined behavior even if the translation
- produced a string with the wrong number of "%s"s. */
- char *yyp = yyresult;
- int yyi = 0;
- while ((*yyp = *yyf) != '\0')
- {
- if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
- {
- yyp += yytnamerr (yyp, yyarg[yyi++]);
- yyf += 2;
- }
- else
- {
- yyp++;
- yyf++;
- }
- }
- }
- return yysize;
- }
-}
-#endif /* YYERROR_VERBOSE */
-
-
-/*-----------------------------------------------.
-| Release the memory associated to this symbol. |
-`-----------------------------------------------*/
-
-/*ARGSUSED*/
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static void
-yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
-#else
-static void
-yydestruct (yymsg, yytype, yyvaluep)
- const char *yymsg;
- int yytype;
- YYSTYPE *yyvaluep;
-#endif
-{
- YYUSE (yyvaluep);
-
- if (!yymsg)
- yymsg = "Deleting";
- YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
-
- switch (yytype)
- {
-
- default:
- break;
- }
-}
-
-
-/* Prevent warnings from -Wmissing-prototypes. */
-
-#ifdef YYPARSE_PARAM
-#if defined __STDC__ || defined __cplusplus
-int yyparse (void *YYPARSE_PARAM);
-#else
-int yyparse ();
-#endif
-#else /* ! YYPARSE_PARAM */
-#if defined __STDC__ || defined __cplusplus
-int yyparse (void);
-#else
-int yyparse ();
-#endif
-#endif /* ! YYPARSE_PARAM */
-
-
-
-/* The look-ahead symbol. */
-int yychar;
-
-/* The semantic value of the look-ahead symbol. */
-YYSTYPE yylval;
-
-/* Number of syntax errors so far. */
-int yynerrs;
-
-
-
-/*----------.
-| yyparse. |
-`----------*/
-
-#ifdef YYPARSE_PARAM
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-int
-yyparse (void *YYPARSE_PARAM)
-#else
-int
-yyparse (YYPARSE_PARAM)
- void *YYPARSE_PARAM;
-#endif
-#else /* ! YYPARSE_PARAM */
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-int
-yyparse (void)
-#else
-int
-yyparse ()
-
-#endif
-#endif
-{
-
- int yystate;
- int yyn;
- int yyresult;
- /* Number of tokens to shift before error messages enabled. */
- int yyerrstatus;
- /* Look-ahead token as an internal (translated) token number. */
- int yytoken = 0;
-#if YYERROR_VERBOSE
- /* Buffer for error messages, and its allocated size. */
- char yymsgbuf[128];
- char *yymsg = yymsgbuf;
- YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
-#endif
-
- /* Three stacks and their tools:
- `yyss': related to states,
- `yyvs': related to semantic values,
- `yyls': related to locations.
-
- Refer to the stacks thru separate pointers, to allow yyoverflow
- to reallocate them elsewhere. */
-
- /* The state stack. */
- yytype_int16 yyssa[YYINITDEPTH];
- yytype_int16 *yyss = yyssa;
- yytype_int16 *yyssp;
-
- /* The semantic value stack. */
- YYSTYPE yyvsa[YYINITDEPTH];
- YYSTYPE *yyvs = yyvsa;
- YYSTYPE *yyvsp;
-
-
-
-#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
-
- YYSIZE_T yystacksize = YYINITDEPTH;
-
- /* The variables used to return semantic value and location from the
- action routines. */
- YYSTYPE yyval;
-
-
- /* The number of symbols on the RHS of the reduced rule.
- Keep to zero when no symbol should be popped. */
- int yylen = 0;
-
- YYDPRINTF ((stderr, "Starting parse\n"));
-
- yystate = 0;
- yyerrstatus = 0;
- yynerrs = 0;
- yychar = YYEMPTY; /* Cause a token to be read. */
-
- /* Initialize stack pointers.
- Waste one element of value and location stack
- so that they stay on the same level as the state stack.
- The wasted elements are never initialized. */
-
- yyssp = yyss;
- yyvsp = yyvs;
-
- goto yysetstate;
-
-/*------------------------------------------------------------.
-| yynewstate -- Push a new state, which is found in yystate. |
-`------------------------------------------------------------*/
- yynewstate:
- /* In all cases, when you get here, the value and location stacks
- have just been pushed. So pushing a state here evens the stacks. */
- yyssp++;
-
- yysetstate:
- *yyssp = yystate;
-
- if (yyss + yystacksize - 1 <= yyssp)
- {
- /* Get the current used size of the three stacks, in elements. */
- YYSIZE_T yysize = yyssp - yyss + 1;
-
-#ifdef yyoverflow
- {
- /* Give user a chance to reallocate the stack. Use copies of
- these so that the &'s don't force the real ones into
- memory. */
- YYSTYPE *yyvs1 = yyvs;
- yytype_int16 *yyss1 = yyss;
-
-
- /* Each stack pointer address is followed by the size of the
- data in use in that stack, in bytes. This used to be a
- conditional around just the two extra args, but that might
- be undefined if yyoverflow is a macro. */
- yyoverflow (YY_("memory exhausted"),
- &yyss1, yysize * sizeof (*yyssp),
- &yyvs1, yysize * sizeof (*yyvsp),
-
- &yystacksize);
-
- yyss = yyss1;
- yyvs = yyvs1;
- }
-#else /* no yyoverflow */
-# ifndef YYSTACK_RELOCATE
- goto yyexhaustedlab;
-# else
- /* Extend the stack our own way. */
- if (YYMAXDEPTH <= yystacksize)
- goto yyexhaustedlab;
- yystacksize *= 2;
- if (YYMAXDEPTH < yystacksize)
- yystacksize = YYMAXDEPTH;
-
- {
- yytype_int16 *yyss1 = yyss;
- union yyalloc *yyptr =
- (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
- if (! yyptr)
- goto yyexhaustedlab;
- YYSTACK_RELOCATE (yyss);
- YYSTACK_RELOCATE (yyvs);
-
-# undef YYSTACK_RELOCATE
- if (yyss1 != yyssa)
- YYSTACK_FREE (yyss1);
- }
-# endif
-#endif /* no yyoverflow */
-
- yyssp = yyss + yysize - 1;
- yyvsp = yyvs + yysize - 1;
-
-
- YYDPRINTF ((stderr, "Stack size increased to %lu\n",
- (unsigned long int) yystacksize));
-
- if (yyss + yystacksize - 1 <= yyssp)
- YYABORT;
- }
-
- YYDPRINTF ((stderr, "Entering state %d\n", yystate));
-
- goto yybackup;
-
-/*-----------.
-| yybackup. |
-`-----------*/
-yybackup:
-
- /* Do appropriate processing given the current state. Read a
- look-ahead token if we need one and don't already have one. */
-
- /* First try to decide what to do without reference to look-ahead token. */
- yyn = yypact[yystate];
- if (yyn == YYPACT_NINF)
- goto yydefault;
-
- /* Not known => get a look-ahead token if don't already have one. */
-
- /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */
- if (yychar == YYEMPTY)
- {
- YYDPRINTF ((stderr, "Reading a token: "));
- yychar = YYLEX;
- }
-
- if (yychar <= YYEOF)
- {
- yychar = yytoken = YYEOF;
- YYDPRINTF ((stderr, "Now at end of input.\n"));
- }
- else
- {
- yytoken = YYTRANSLATE (yychar);
- YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
- }
-
- /* If the proper action on seeing token YYTOKEN is to reduce or to
- detect an error, take that action. */
- yyn += yytoken;
- if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
- goto yydefault;
- yyn = yytable[yyn];
- if (yyn <= 0)
- {
- if (yyn == 0 || yyn == YYTABLE_NINF)
- goto yyerrlab;
- yyn = -yyn;
- goto yyreduce;
- }
-
- if (yyn == YYFINAL)
- YYACCEPT;
-
- /* Count tokens shifted since error; after three, turn off error
- status. */
- if (yyerrstatus)
- yyerrstatus--;
-
- /* Shift the look-ahead token. */
- YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
-
- /* Discard the shifted token unless it is eof. */
- if (yychar != YYEOF)
- yychar = YYEMPTY;
-
- yystate = yyn;
- *++yyvsp = yylval;
-
- goto yynewstate;
-
-
-/*-----------------------------------------------------------.
-| yydefault -- do the default action for the current state. |
-`-----------------------------------------------------------*/
-yydefault:
- yyn = yydefact[yystate];
- if (yyn == 0)
- goto yyerrlab;
- goto yyreduce;
-
-
-/*-----------------------------.
-| yyreduce -- Do a reduction. |
-`-----------------------------*/
-yyreduce:
- /* yyn is the number of a rule to reduce with. */
- yylen = yyr2[yyn];
-
- /* If YYLEN is nonzero, implement the default value of the action:
- `$$ = $1'.
-
- Otherwise, the following line sets YYVAL to garbage.
- This behavior is undocumented and Bison
- users should not rely upon it. Assigning to YYVAL
- unconditionally makes the parser a bit smaller, and it avoids a
- GCC warning that YYVAL may be used uninitialized. */
- yyval = yyvsp[1-yylen];
-
-
- YY_REDUCE_PRINT (yyn);
- switch (yyn)
- {
- case 7:
-#line 77 "mcparse.y"
- {
- cur_node = mc_add_node ();
- cur_node->user_text = (yyvsp[(1) - (1)].ustr);
- }
- break;
-
- case 8:
-#line 81 "mcparse.y"
- { mc_fatal ("syntax error"); }
- break;
-
- case 10:
-#line 86 "mcparse.y"
- { mc_fatal ("missing ')' in SeverityNames"); }
- break;
-
- case 11:
-#line 87 "mcparse.y"
- { mc_fatal ("missing '(' in SeverityNames"); }
- break;
-
- case 12:
-#line 88 "mcparse.y"
- { mc_fatal ("missing '=' for SeverityNames"); }
- break;
-
- case 14:
-#line 90 "mcparse.y"
- { mc_fatal ("missing ')' in LanguageNames"); }
- break;
-
- case 15:
-#line 91 "mcparse.y"
- { mc_fatal ("missing '(' in LanguageNames"); }
- break;
-
- case 16:
-#line 92 "mcparse.y"
- { mc_fatal ("missing '=' for LanguageNames"); }
- break;
-
- case 18:
-#line 94 "mcparse.y"
- { mc_fatal ("missing ')' in FacilityNames"); }
- break;
-
- case 19:
-#line 95 "mcparse.y"
- { mc_fatal ("missing '(' in FacilityNames"); }
- break;
-
- case 20:
-#line 96 "mcparse.y"
- { mc_fatal ("missing '=' for FacilityNames"); }
- break;
-
- case 21:
-#line 98 "mcparse.y"
- {
- if ((yyvsp[(3) - (3)].ival) != 10 && (yyvsp[(3) - (3)].ival) != 16)
- mc_fatal ("OutputBase allows 10 or 16 as value");
- mcset_out_values_are_decimal = ((yyvsp[(3) - (3)].ival) == 10 ? 1 : 0);
- }
- break;
-
- case 22:
-#line 104 "mcparse.y"
- {
- mcset_msg_id_typedef = (yyvsp[(3) - (3)].ustr);
- }
- break;
-
- case 23:
-#line 108 "mcparse.y"
- {
- mc_fatal ("MessageIdTypedef expects an identifier");
- }
- break;
-
- case 24:
-#line 112 "mcparse.y"
- {
- mc_fatal ("missing '=' for MessageIdTypedef");
- }
- break;
-
- case 27:
-#line 120 "mcparse.y"
- { mc_fatal ("severity ident missing"); }
- break;
-
- case 28:
-#line 125 "mcparse.y"
- {
- mc_add_keyword ((yyvsp[(1) - (4)].ustr), MCTOKEN, "severity", (yyvsp[(3) - (4)].ival), (yyvsp[(4) - (4)].ustr));
- }
- break;
-
- case 29:
-#line 128 "mcparse.y"
- { mc_fatal ("severity number missing"); }
- break;
-
- case 30:
-#line 129 "mcparse.y"
- { mc_fatal ("severity missing '='"); }
- break;
-
- case 33:
-#line 135 "mcparse.y"
- { mc_fatal ("missing ident in FacilityNames"); }
- break;
-
- case 34:
-#line 140 "mcparse.y"
- {
- mc_add_keyword ((yyvsp[(1) - (4)].ustr), MCTOKEN, "facility", (yyvsp[(3) - (4)].ival), (yyvsp[(4) - (4)].ustr));
- }
- break;
-
- case 35:
-#line 143 "mcparse.y"
- { mc_fatal ("facility number missing"); }
- break;
-
- case 36:
-#line 144 "mcparse.y"
- { mc_fatal ("facility missing '='"); }
- break;
-
- case 39:
-#line 150 "mcparse.y"
- { mc_fatal ("missing ident in LanguageNames"); }
- break;
-
- case 40:
-#line 155 "mcparse.y"
- {
- mc_add_keyword ((yyvsp[(1) - (6)].ustr), MCTOKEN, "language", (yyvsp[(3) - (6)].ival), (yyvsp[(6) - (6)].ustr));
- }
- break;
-
- case 41:
-#line 158 "mcparse.y"
- { mc_fatal ("missing filename in LanguageNames"); }
- break;
-
- case 42:
-#line 159 "mcparse.y"
- { mc_fatal ("missing ':' in LanguageNames"); }
- break;
-
- case 43:
-#line 160 "mcparse.y"
- { mc_fatal ("missing language code in LanguageNames"); }
- break;
-
- case 44:
-#line 161 "mcparse.y"
- { mc_fatal ("missing '=' for LanguageNames"); }
- break;
-
- case 45:
-#line 166 "mcparse.y"
- {
- (yyval.ustr) = NULL;
- }
- break;
-
- case 46:
-#line 170 "mcparse.y"
- {
- (yyval.ustr) = (yyvsp[(2) - (2)].ustr);
- }
- break;
-
- case 47:
-#line 173 "mcparse.y"
- { mc_fatal ("illegal token in identifier"); (yyval.ustr) = NULL; }
- break;
-
- case 48:
-#line 178 "mcparse.y"
- {
- cur_node = mc_add_node ();
- cur_node->symbol = mc_last_symbol;
- cur_node->facility = mc_cur_facility;
- cur_node->severity = mc_cur_severity;
- cur_node->id = ((yyvsp[(1) - (2)].ival) & 0xffffUL);
- cur_node->vid = ((yyvsp[(1) - (2)].ival) & 0xffffUL) | mc_sefa_val;
- mc_last_id = (yyvsp[(1) - (2)].ival);
- }
- break;
-
- case 50:
-#line 190 "mcparse.y"
- { (yyval.ival) = (yyvsp[(3) - (3)].ival); }
- break;
-
- case 51:
-#line 191 "mcparse.y"
- { mc_fatal ("missing number in MessageId"); (yyval.ival) = 0; }
- break;
-
- case 52:
-#line 192 "mcparse.y"
- { mc_fatal ("missing '=' for MessageId"); (yyval.ival) = 0; }
- break;
-
- case 53:
-#line 196 "mcparse.y"
- {
- (yyval.ival) = ++mc_last_id;
- }
- break;
-
- case 54:
-#line 200 "mcparse.y"
- {
- (yyval.ival) = (yyvsp[(1) - (1)].ival);
- }
- break;
-
- case 55:
-#line 204 "mcparse.y"
- {
- (yyval.ival) = mc_last_id + (yyvsp[(2) - (2)].ival);
- }
- break;
-
- case 56:
-#line 207 "mcparse.y"
- { mc_fatal ("missing number after MessageId '+'"); }
- break;
-
- case 57:
-#line 212 "mcparse.y"
- {
- (yyval.ival) = 0;
- mc_sefa_val = (mcset_custom_bit ? 1 : 0) << 29;
- mc_last_symbol = NULL;
- mc_cur_severity = NULL;
- mc_cur_facility = NULL;
- }
- break;
-
- case 58:
-#line 220 "mcparse.y"
- {
- if ((yyvsp[(1) - (2)].ival) & 1)
- mc_warn (_("duplicate definition of Severity"));
- (yyval.ival) = (yyvsp[(1) - (2)].ival) | 1;
- }
- break;
-
- case 59:
-#line 226 "mcparse.y"
- {
- if ((yyvsp[(1) - (2)].ival) & 2)
- mc_warn (_("duplicate definition of Facility"));
- (yyval.ival) = (yyvsp[(1) - (2)].ival) | 2;
- }
- break;
-
- case 60:
-#line 232 "mcparse.y"
- {
- if ((yyvsp[(1) - (2)].ival) & 4)
- mc_warn (_("duplicate definition of SymbolicName"));
- (yyval.ival) = (yyvsp[(1) - (2)].ival) | 4;
- }
- break;
-
- case 61:
-#line 240 "mcparse.y"
- {
- mc_sefa_val &= ~ (0x3UL << 30);
- mc_sefa_val |= (((yyvsp[(3) - (3)].tok)->nval & 0x3UL) << 30);
- mc_cur_severity = (yyvsp[(3) - (3)].tok);
- }
- break;
-
- case 62:
-#line 248 "mcparse.y"
- {
- mc_sefa_val &= ~ (0xfffUL << 16);
- mc_sefa_val |= (((yyvsp[(3) - (3)].tok)->nval & 0xfffUL) << 16);
- mc_cur_facility = (yyvsp[(3) - (3)].tok);
- }
- break;
-
- case 63:
-#line 256 "mcparse.y"
- {
- mc_last_symbol = (yyvsp[(3) - (3)].ustr);
- }
- break;
-
- case 66:
-#line 268 "mcparse.y"
- {
- mc_node_lang *h;
- h = mc_add_node_lang (cur_node, (yyvsp[(1) - (4)].tok), cur_node->vid);
- h->message = (yyvsp[(3) - (4)].ustr);
- if (mcset_max_message_length != 0 && unichar_len (h->message) > mcset_max_message_length)
- mc_warn ("message length to long");
- }
- break;
-
- case 67:
-#line 278 "mcparse.y"
- {
- (yyval.ustr) = (yyvsp[(1) - (1)].ustr);
- }
- break;
-
- case 68:
-#line 282 "mcparse.y"
- {
- unichar *h;
- rc_uint_type l1,l2;
- l1 = unichar_len ((yyvsp[(1) - (2)].ustr));
- l2 = unichar_len ((yyvsp[(2) - (2)].ustr));
- h = (unichar *) res_alloc ((l1 + l2 + 1) * sizeof (unichar));
- if (l1) memcpy (h, (yyvsp[(1) - (2)].ustr), l1 * sizeof (unichar));
- if (l2) memcpy (&h[l1], (yyvsp[(2) - (2)].ustr), l2 * sizeof (unichar));
- h[l1 + l2] = 0;
- (yyval.ustr) = h;
- }
- break;
-
- case 69:
-#line 293 "mcparse.y"
- { mc_fatal ("missing end of message text"); (yyval.ustr) = NULL; }
- break;
-
- case 70:
-#line 294 "mcparse.y"
- { mc_fatal ("missing end of message text"); (yyval.ustr) = (yyvsp[(1) - (2)].ustr); }
- break;
-
- case 71:
-#line 297 "mcparse.y"
- { (yyval.ustr) = (yyvsp[(1) - (1)].ustr); }
- break;
-
- case 72:
-#line 299 "mcparse.y"
- {
- unichar *h;
- rc_uint_type l1,l2;
- l1 = unichar_len ((yyvsp[(1) - (2)].ustr));
- l2 = unichar_len ((yyvsp[(2) - (2)].ustr));
- h = (unichar *) res_alloc ((l1 + l2 + 1) * sizeof (unichar));
- if (l1) memcpy (h, (yyvsp[(1) - (2)].ustr), l1 * sizeof (unichar));
- if (l2) memcpy (&h[l1], (yyvsp[(2) - (2)].ustr), l2 * sizeof (unichar));
- h[l1 + l2] = 0;
- (yyval.ustr) = h;
- }
- break;
-
- case 73:
-#line 313 "mcparse.y"
- {
- (yyval.tok) = (yyvsp[(4) - (5)].tok);
- }
- break;
-
- case 74:
-#line 317 "mcparse.y"
- {
- (yyval.tok) = NULL;
- mc_fatal (_("undeclared language identifier"));
- }
- break;
-
- case 75:
-#line 322 "mcparse.y"
- {
- (yyval.tok) = NULL;
- mc_fatal ("missing newline after Language");
- }
- break;
-
- case 76:
-#line 327 "mcparse.y"
- {
- (yyval.tok) = NULL;
- mc_fatal ("missing ident for Language");
- }
- break;
-
- case 77:
-#line 332 "mcparse.y"
- {
- (yyval.tok) = NULL;
- mc_fatal ("missing '=' for Language");
- }
- break;
-
- case 78:
-#line 338 "mcparse.y"
- { (yyval.ustr) = (yyvsp[(1) - (1)].ustr); }
- break;
-
- case 79:
-#line 339 "mcparse.y"
- { (yyval.ustr) = (yyvsp[(1) - (1)].tok)->usz; }
- break;
-
- case 80:
-#line 343 "mcparse.y"
- { mclex_want_nl = 1; }
- break;
-
- case 81:
-#line 347 "mcparse.y"
- { mclex_want_line = 1; }
- break;
-
- case 82:
-#line 351 "mcparse.y"
- { mclex_want_filename = 1; }
- break;
-
-
-/* Line 1267 of yacc.c. */
-#line 1939 "mcparse.c"
- default: break;
- }
- YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
-
- YYPOPSTACK (yylen);
- yylen = 0;
- YY_STACK_PRINT (yyss, yyssp);
-
- *++yyvsp = yyval;
-
-
- /* Now `shift' the result of the reduction. Determine what state
- that goes to, based on the state we popped back to and the rule
- number reduced by. */
-
- yyn = yyr1[yyn];
-
- yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
- if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
- yystate = yytable[yystate];
- else
- yystate = yydefgoto[yyn - YYNTOKENS];
-
- goto yynewstate;
-
-
-/*------------------------------------.
-| yyerrlab -- here on detecting error |
-`------------------------------------*/
-yyerrlab:
- /* If not already recovering from an error, report this error. */
- if (!yyerrstatus)
- {
- ++yynerrs;
-#if ! YYERROR_VERBOSE
- yyerror (YY_("syntax error"));
-#else
- {
- YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
- if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
- {
- YYSIZE_T yyalloc = 2 * yysize;
- if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
- yyalloc = YYSTACK_ALLOC_MAXIMUM;
- if (yymsg != yymsgbuf)
- YYSTACK_FREE (yymsg);
- yymsg = (char *) YYSTACK_ALLOC (yyalloc);
- if (yymsg)
- yymsg_alloc = yyalloc;
- else
- {
- yymsg = yymsgbuf;
- yymsg_alloc = sizeof yymsgbuf;
- }
- }
-
- if (0 < yysize && yysize <= yymsg_alloc)
- {
- (void) yysyntax_error (yymsg, yystate, yychar);
- yyerror (yymsg);
- }
- else
- {
- yyerror (YY_("syntax error"));
- if (yysize != 0)
- goto yyexhaustedlab;
- }
- }
-#endif
- }
-
-
-
- if (yyerrstatus == 3)
- {
- /* If just tried and failed to reuse look-ahead token after an
- error, discard it. */
-
- if (yychar <= YYEOF)
- {
- /* Return failure if at end of input. */
- if (yychar == YYEOF)
- YYABORT;
- }
- else
- {
- yydestruct ("Error: discarding",
- yytoken, &yylval);
- yychar = YYEMPTY;
- }
- }
-
- /* Else will try to reuse look-ahead token after shifting the error
- token. */
- goto yyerrlab1;
-
-
-/*---------------------------------------------------.
-| yyerrorlab -- error raised explicitly by YYERROR. |
-`---------------------------------------------------*/
-yyerrorlab:
-
- /* Pacify compilers like GCC when the user code never invokes
- YYERROR and the label yyerrorlab therefore never appears in user
- code. */
- if (/*CONSTCOND*/ 0)
- goto yyerrorlab;
-
- /* Do not reclaim the symbols of the rule which action triggered
- this YYERROR. */
- YYPOPSTACK (yylen);
- yylen = 0;
- YY_STACK_PRINT (yyss, yyssp);
- yystate = *yyssp;
- goto yyerrlab1;
-
-
-/*-------------------------------------------------------------.
-| yyerrlab1 -- common code for both syntax error and YYERROR. |
-`-------------------------------------------------------------*/
-yyerrlab1:
- yyerrstatus = 3; /* Each real token shifted decrements this. */
-
- for (;;)
- {
- yyn = yypact[yystate];
- if (yyn != YYPACT_NINF)
- {
- yyn += YYTERROR;
- if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
- {
- yyn = yytable[yyn];
- if (0 < yyn)
- break;
- }
- }
-
- /* Pop the current state because it cannot handle the error token. */
- if (yyssp == yyss)
- YYABORT;
-
-
- yydestruct ("Error: popping",
- yystos[yystate], yyvsp);
- YYPOPSTACK (1);
- yystate = *yyssp;
- YY_STACK_PRINT (yyss, yyssp);
- }
-
- if (yyn == YYFINAL)
- YYACCEPT;
-
- *++yyvsp = yylval;
-
-
- /* Shift the error token. */
- YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
-
- yystate = yyn;
- goto yynewstate;
-
-
-/*-------------------------------------.
-| yyacceptlab -- YYACCEPT comes here. |
-`-------------------------------------*/
-yyacceptlab:
- yyresult = 0;
- goto yyreturn;
-
-/*-----------------------------------.
-| yyabortlab -- YYABORT comes here. |
-`-----------------------------------*/
-yyabortlab:
- yyresult = 1;
- goto yyreturn;
-
-#ifndef yyoverflow
-/*-------------------------------------------------.
-| yyexhaustedlab -- memory exhaustion comes here. |
-`-------------------------------------------------*/
-yyexhaustedlab:
- yyerror (YY_("memory exhausted"));
- yyresult = 2;
- /* Fall through. */
-#endif
-
-yyreturn:
- if (yychar != YYEOF && yychar != YYEMPTY)
- yydestruct ("Cleanup: discarding lookahead",
- yytoken, &yylval);
- /* Do not reclaim the symbols of the rule which action triggered
- this YYABORT or YYACCEPT. */
- YYPOPSTACK (yylen);
- YY_STACK_PRINT (yyss, yyssp);
- while (yyssp != yyss)
- {
- yydestruct ("Cleanup: popping",
- yystos[*yyssp], yyvsp);
- YYPOPSTACK (1);
- }
-#ifndef yyoverflow
- if (yyss != yyssa)
- YYSTACK_FREE (yyss);
-#endif
-#if YYERROR_VERBOSE
- if (yymsg != yymsgbuf)
- YYSTACK_FREE (yymsg);
-#endif
- /* Make sure YYID is used. */
- return YYID (yyresult);
-}
-
-
-#line 354 "mcparse.y"
-
-
-/* Something else. */
-
diff -Nur binutils-2.24.orig/binutils/mcparse.h binutils-2.24/binutils/mcparse.h
--- binutils-2.24.orig/binutils/mcparse.h 2013-11-18 09:49:30.000000000 +0100
+++ binutils-2.24/binutils/mcparse.h 1970-01-01 01:00:00.000000000 +0100
@@ -1,103 +0,0 @@
-/* A Bison parser, made by GNU Bison 2.3. */
-
-/* Skeleton interface for Bison's Yacc-like parsers in C
-
- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
- Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA. */
-
-/* As a special exception, you may create a larger work that contains
- part or all of the Bison parser skeleton and distribute that work
- under terms of your choice, so long as that work isn't itself a
- parser generator using the skeleton or a modified version thereof
- as a parser skeleton. Alternatively, if you modify or redistribute
- the parser skeleton itself, you may (at your option) remove this
- special exception, which will cause the skeleton and the resulting
- Bison output files to be licensed under the GNU General Public
- License without this special exception.
-
- This special exception was added by the Free Software Foundation in
- version 2.2 of Bison. */
-
-/* Tokens. */
-#ifndef YYTOKENTYPE
-# define YYTOKENTYPE
- /* Put the tokens into the symbol table, so that GDB and other debuggers
- know about them. */
- enum yytokentype {
- NL = 258,
- MCIDENT = 259,
- MCFILENAME = 260,
- MCLINE = 261,
- MCCOMMENT = 262,
- MCTOKEN = 263,
- MCENDLINE = 264,
- MCLANGUAGENAMES = 265,
- MCFACILITYNAMES = 266,
- MCSEVERITYNAMES = 267,
- MCOUTPUTBASE = 268,
- MCMESSAGEIDTYPEDEF = 269,
- MCLANGUAGE = 270,
- MCMESSAGEID = 271,
- MCSEVERITY = 272,
- MCFACILITY = 273,
- MCSYMBOLICNAME = 274,
- MCNUMBER = 275
- };
-#endif
-/* Tokens. */
-#define NL 258
-#define MCIDENT 259
-#define MCFILENAME 260
-#define MCLINE 261
-#define MCCOMMENT 262
-#define MCTOKEN 263
-#define MCENDLINE 264
-#define MCLANGUAGENAMES 265
-#define MCFACILITYNAMES 266
-#define MCSEVERITYNAMES 267
-#define MCOUTPUTBASE 268
-#define MCMESSAGEIDTYPEDEF 269
-#define MCLANGUAGE 270
-#define MCMESSAGEID 271
-#define MCSEVERITY 272
-#define MCFACILITY 273
-#define MCSYMBOLICNAME 274
-#define MCNUMBER 275
-
-
-
-
-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-typedef union YYSTYPE
-#line 45 "mcparse.y"
-{
- rc_uint_type ival;
- unichar *ustr;
- const mc_keyword *tok;
- mc_node *nod;
-}
-/* Line 1529 of yacc.c. */
-#line 96 "mcparse.h"
- YYSTYPE;
-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
-# define YYSTYPE_IS_DECLARED 1
-# define YYSTYPE_IS_TRIVIAL 1
-#endif
-
-extern YYSTYPE yylval;
-
diff -Nur binutils-2.24.orig/binutils/NEWS binutils-2.24/binutils/NEWS
--- binutils-2.24.orig/binutils/NEWS 2013-11-04 16:33:37.000000000 +0100
+++ binutils-2.24/binutils/NEWS 2024-05-17 16:15:38.987344917 +0200
@@ -1,5 +1,7 @@
-*- text -*-
+* Add support for the Andes NDS32.
+
Changes in 2.24:
* Objcopy now supports wildcard characters in command line options that take
diff -Nur binutils-2.24.orig/binutils/nlmheader.c binutils-2.24/binutils/nlmheader.c
--- binutils-2.24.orig/binutils/nlmheader.c 2013-11-18 09:49:30.000000000 +0100
+++ binutils-2.24/binutils/nlmheader.c 1970-01-01 01:00:00.000000000 +0100
@@ -1,2698 +0,0 @@
-/* A Bison parser, made by GNU Bison 2.3. */
-
-/* Skeleton implementation for Bison's Yacc-like parsers in C
-
- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
- Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA. */
-
-/* As a special exception, you may create a larger work that contains
- part or all of the Bison parser skeleton and distribute that work
- under terms of your choice, so long as that work isn't itself a
- parser generator using the skeleton or a modified version thereof
- as a parser skeleton. Alternatively, if you modify or redistribute
- the parser skeleton itself, you may (at your option) remove this
- special exception, which will cause the skeleton and the resulting
- Bison output files to be licensed under the GNU General Public
- License without this special exception.
-
- This special exception was added by the Free Software Foundation in
- version 2.2 of Bison. */
-
-/* C LALR(1) parser skeleton written by Richard Stallman, by
- simplifying the original so-called "semantic" parser. */
-
-/* All symbols defined below should begin with yy or YY, to avoid
- infringing on user name space. This should be done even for local
- variables, as they might otherwise be expanded by user macros.
- There are some unavoidable exceptions within include files to
- define necessary library symbols; they are noted "INFRINGES ON
- USER NAME SPACE" below. */
-
-/* Identify Bison output. */
-#define YYBISON 1
-
-/* Bison version. */
-#define YYBISON_VERSION "2.3"
-
-/* Skeleton name. */
-#define YYSKELETON_NAME "yacc.c"
-
-/* Pure parsers. */
-#define YYPURE 0
-
-/* Using locations. */
-#define YYLSP_NEEDED 0
-
-
-
-/* Tokens. */
-#ifndef YYTOKENTYPE
-# define YYTOKENTYPE
- /* Put the tokens into the symbol table, so that GDB and other debuggers
- know about them. */
- enum yytokentype {
- CHECK = 258,
- CODESTART = 259,
- COPYRIGHT = 260,
- CUSTOM = 261,
- DATE = 262,
- DEBUG_K = 263,
- DESCRIPTION = 264,
- EXIT = 265,
- EXPORT = 266,
- FLAG_ON = 267,
- FLAG_OFF = 268,
- FULLMAP = 269,
- HELP = 270,
- IMPORT = 271,
- INPUT = 272,
- MAP = 273,
- MESSAGES = 274,
- MODULE = 275,
- MULTIPLE = 276,
- OS_DOMAIN = 277,
- OUTPUT = 278,
- PSEUDOPREEMPTION = 279,
- REENTRANT = 280,
- SCREENNAME = 281,
- SHARELIB = 282,
- STACK = 283,
- START = 284,
- SYNCHRONIZE = 285,
- THREADNAME = 286,
- TYPE = 287,
- VERBOSE = 288,
- VERSIONK = 289,
- XDCDATA = 290,
- STRING = 291,
- QUOTED_STRING = 292
- };
-#endif
-/* Tokens. */
-#define CHECK 258
-#define CODESTART 259
-#define COPYRIGHT 260
-#define CUSTOM 261
-#define DATE 262
-#define DEBUG_K 263
-#define DESCRIPTION 264
-#define EXIT 265
-#define EXPORT 266
-#define FLAG_ON 267
-#define FLAG_OFF 268
-#define FULLMAP 269
-#define HELP 270
-#define IMPORT 271
-#define INPUT 272
-#define MAP 273
-#define MESSAGES 274
-#define MODULE 275
-#define MULTIPLE 276
-#define OS_DOMAIN 277
-#define OUTPUT 278
-#define PSEUDOPREEMPTION 279
-#define REENTRANT 280
-#define SCREENNAME 281
-#define SHARELIB 282
-#define STACK 283
-#define START 284
-#define SYNCHRONIZE 285
-#define THREADNAME 286
-#define TYPE 287
-#define VERBOSE 288
-#define VERSIONK 289
-#define XDCDATA 290
-#define STRING 291
-#define QUOTED_STRING 292
-
-
-
-
-/* Copy the first part of user declarations. */
-#line 1 "nlmheader.y"
-/* nlmheader.y - parse NLM header specification keywords.
- Copyright 1993, 1994, 1995, 1997, 1998, 2001, 2002, 2003, 2005, 2007,
- 2010 Free Software Foundation, Inc.
-
- This file is part of GNU Binutils.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
- MA 02110-1301, USA. */
-
-/* Written by Ian Lance Taylor .
-
- This bison file parses the commands recognized by the NetWare NLM
- linker, except for lists of object files. It stores the
- information in global variables.
-
- This implementation is based on the description in the NetWare Tool
- Maker Specification manual, edition 1.0. */
-
-#include "sysdep.h"
-#include "safe-ctype.h"
-#include "bfd.h"
-#include "nlm/common.h"
-#include "nlm/internal.h"
-#include "bucomm.h"
-#include "nlmconv.h"
-
-/* Information is stored in the structures pointed to by these
- variables. */
-
-Nlm_Internal_Fixed_Header *fixed_hdr;
-Nlm_Internal_Variable_Header *var_hdr;
-Nlm_Internal_Version_Header *version_hdr;
-Nlm_Internal_Copyright_Header *copyright_hdr;
-Nlm_Internal_Extended_Header *extended_hdr;
-
-/* Procedure named by CHECK. */
-char *check_procedure;
-/* File named by CUSTOM. */
-char *custom_file;
-/* Whether to generate debugging information (DEBUG). */
-bfd_boolean debug_info;
-/* Procedure named by EXIT. */
-char *exit_procedure;
-/* Exported symbols (EXPORT). */
-struct string_list *export_symbols;
-/* List of files from INPUT. */
-struct string_list *input_files;
-/* Map file name (MAP, FULLMAP). */
-char *map_file;
-/* Whether a full map has been requested (FULLMAP). */
-bfd_boolean full_map;
-/* File named by HELP. */
-char *help_file;
-/* Imported symbols (IMPORT). */
-struct string_list *import_symbols;
-/* File named by MESSAGES. */
-char *message_file;
-/* Autoload module list (MODULE). */
-struct string_list *modules;
-/* File named by OUTPUT. */
-char *output_file;
-/* File named by SHARELIB. */
-char *sharelib_file;
-/* Start procedure name (START). */
-char *start_procedure;
-/* VERBOSE. */
-bfd_boolean verbose;
-/* RPC description file (XDCDATA). */
-char *rpc_file;
-
-/* The number of serious errors that have occurred. */
-int parse_errors;
-
-/* The current symbol prefix when reading a list of import or export
- symbols. */
-static char *symbol_prefix;
-
-/* Parser error message handler. */
-#define yyerror(msg) nlmheader_error (msg);
-
-/* Local functions. */
-static int yylex (void);
-static void nlmlex_file_push (const char *);
-static bfd_boolean nlmlex_file_open (const char *);
-static int nlmlex_buf_init (void);
-static char nlmlex_buf_add (int);
-static long nlmlex_get_number (const char *);
-static void nlmheader_identify (void);
-static void nlmheader_warn (const char *, int);
-static void nlmheader_error (const char *);
-static struct string_list * string_list_cons (char *, struct string_list *);
-static struct string_list * string_list_append (struct string_list *,
- struct string_list *);
-static struct string_list * string_list_append1 (struct string_list *,
- char *);
-static char *xstrdup (const char *);
-
-
-
-/* Enabling traces. */
-#ifndef YYDEBUG
-# define YYDEBUG 0
-#endif
-
-/* Enabling verbose error messages. */
-#ifdef YYERROR_VERBOSE
-# undef YYERROR_VERBOSE
-# define YYERROR_VERBOSE 1
-#else
-# define YYERROR_VERBOSE 0
-#endif
-
-/* Enabling the token table. */
-#ifndef YYTOKEN_TABLE
-# define YYTOKEN_TABLE 0
-#endif
-
-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-typedef union YYSTYPE
-#line 113 "nlmheader.y"
-{
- char *string;
- struct string_list *list;
-}
-/* Line 193 of yacc.c. */
-#line 286 "nlmheader.c"
- YYSTYPE;
-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
-# define YYSTYPE_IS_DECLARED 1
-# define YYSTYPE_IS_TRIVIAL 1
-#endif
-
-
-
-/* Copy the second part of user declarations. */
-
-
-/* Line 216 of yacc.c. */
-#line 299 "nlmheader.c"
-
-#ifdef short
-# undef short
-#endif
-
-#ifdef YYTYPE_UINT8
-typedef YYTYPE_UINT8 yytype_uint8;
-#else
-typedef unsigned char yytype_uint8;
-#endif
-
-#ifdef YYTYPE_INT8
-typedef YYTYPE_INT8 yytype_int8;
-#elif (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-typedef signed char yytype_int8;
-#else
-typedef short int yytype_int8;
-#endif
-
-#ifdef YYTYPE_UINT16
-typedef YYTYPE_UINT16 yytype_uint16;
-#else
-typedef unsigned short int yytype_uint16;
-#endif
-
-#ifdef YYTYPE_INT16
-typedef YYTYPE_INT16 yytype_int16;
-#else
-typedef short int yytype_int16;
-#endif
-
-#ifndef YYSIZE_T
-# ifdef __SIZE_TYPE__
-# define YYSIZE_T __SIZE_TYPE__
-# elif defined size_t
-# define YYSIZE_T size_t
-# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-# include /* INFRINGES ON USER NAME SPACE */
-# define YYSIZE_T size_t
-# else
-# define YYSIZE_T unsigned int
-# endif
-#endif
-
-#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
-
-#ifndef YY_
-# if defined YYENABLE_NLS && YYENABLE_NLS
-# if ENABLE_NLS
-# include /* INFRINGES ON USER NAME SPACE */
-# define YY_(msgid) dgettext ("bison-runtime", msgid)
-# endif
-# endif
-# ifndef YY_
-# define YY_(msgid) msgid
-# endif
-#endif
-
-/* Suppress unused-variable warnings by "using" E. */
-#if ! defined lint || defined __GNUC__
-# define YYUSE(e) ((void) (e))
-#else
-# define YYUSE(e) /* empty */
-#endif
-
-/* Identity function, used to suppress warnings about constant conditions. */
-#ifndef lint
-# define YYID(n) (n)
-#else
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static int
-YYID (int i)
-#else
-static int
-YYID (i)
- int i;
-#endif
-{
- return i;
-}
-#endif
-
-#if ! defined yyoverflow || YYERROR_VERBOSE
-
-/* The parser invokes alloca or malloc; define the necessary symbols. */
-
-# ifdef YYSTACK_USE_ALLOCA
-# if YYSTACK_USE_ALLOCA
-# ifdef __GNUC__
-# define YYSTACK_ALLOC __builtin_alloca
-# elif defined __BUILTIN_VA_ARG_INCR
-# include /* INFRINGES ON USER NAME SPACE */
-# elif defined _AIX
-# define YYSTACK_ALLOC __alloca
-# elif defined _MSC_VER
-# include /* INFRINGES ON USER NAME SPACE */
-# define alloca _alloca
-# else
-# define YYSTACK_ALLOC alloca
-# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-# include /* INFRINGES ON USER NAME SPACE */
-# ifndef _STDLIB_H
-# define _STDLIB_H 1
-# endif
-# endif
-# endif
-# endif
-# endif
-
-# ifdef YYSTACK_ALLOC
- /* Pacify GCC's `empty if-body' warning. */
-# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
-# ifndef YYSTACK_ALLOC_MAXIMUM
- /* The OS might guarantee only one guard page at the bottom of the stack,
- and a page size can be as small as 4096 bytes. So we cannot safely
- invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
- to allow for a few compiler-allocated temporary stack slots. */
-# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
-# endif
-# else
-# define YYSTACK_ALLOC YYMALLOC
-# define YYSTACK_FREE YYFREE
-# ifndef YYSTACK_ALLOC_MAXIMUM
-# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
-# endif
-# if (defined __cplusplus && ! defined _STDLIB_H \
- && ! ((defined YYMALLOC || defined malloc) \
- && (defined YYFREE || defined free)))
-# include /* INFRINGES ON USER NAME SPACE */
-# ifndef _STDLIB_H
-# define _STDLIB_H 1
-# endif
-# endif
-# ifndef YYMALLOC
-# define YYMALLOC malloc
-# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
-# endif
-# endif
-# ifndef YYFREE
-# define YYFREE free
-# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-void free (void *); /* INFRINGES ON USER NAME SPACE */
-# endif
-# endif
-# endif
-#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
-
-
-#if (! defined yyoverflow \
- && (! defined __cplusplus \
- || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
-
-/* A type that is properly aligned for any stack member. */
-union yyalloc
-{
- yytype_int16 yyss;
- YYSTYPE yyvs;
- };
-
-/* The size of the maximum gap between one aligned stack and the next. */
-# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
-
-/* The size of an array large to enough to hold all stacks, each with
- N elements. */
-# define YYSTACK_BYTES(N) \
- ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
- + YYSTACK_GAP_MAXIMUM)
-
-/* Copy COUNT objects from FROM to TO. The source and destination do
- not overlap. */
-# ifndef YYCOPY
-# if defined __GNUC__ && 1 < __GNUC__
-# define YYCOPY(To, From, Count) \
- __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
-# else
-# define YYCOPY(To, From, Count) \
- do \
- { \
- YYSIZE_T yyi; \
- for (yyi = 0; yyi < (Count); yyi++) \
- (To)[yyi] = (From)[yyi]; \
- } \
- while (YYID (0))
-# endif
-# endif
-
-/* Relocate STACK from its old location to the new one. The
- local variables YYSIZE and YYSTACKSIZE give the old and new number of
- elements in the stack, and YYPTR gives the new location of the
- stack. Advance YYPTR to a properly aligned location for the next
- stack. */
-# define YYSTACK_RELOCATE(Stack) \
- do \
- { \
- YYSIZE_T yynewbytes; \
- YYCOPY (&yyptr->Stack, Stack, yysize); \
- Stack = &yyptr->Stack; \
- yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
- yyptr += yynewbytes / sizeof (*yyptr); \
- } \
- while (YYID (0))
-
-#endif
-
-/* YYFINAL -- State number of the termination state. */
-#define YYFINAL 64
-/* YYLAST -- Last index in YYTABLE. */
-#define YYLAST 73
-
-/* YYNTOKENS -- Number of terminals. */
-#define YYNTOKENS 40
-/* YYNNTS -- Number of nonterminals. */
-#define YYNNTS 11
-/* YYNRULES -- Number of rules. */
-#define YYNRULES 52
-/* YYNRULES -- Number of states. */
-#define YYNSTATES 82
-
-/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
-#define YYUNDEFTOK 2
-#define YYMAXUTOK 292
-
-#define YYTRANSLATE(YYX) \
- ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
-
-/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */
-static const yytype_uint8 yytranslate[] =
-{
- 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 38, 39, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
- 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
- 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
- 35, 36, 37
-};
-
-#if YYDEBUG
-/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
- YYRHS. */
-static const yytype_uint8 yyprhs[] =
-{
- 0, 0, 3, 5, 6, 9, 12, 15, 18, 21,
- 26, 28, 31, 34, 35, 39, 42, 45, 47, 50,
- 53, 54, 58, 61, 63, 66, 69, 72, 74, 76,
- 79, 81, 83, 86, 89, 92, 95, 97, 100, 103,
- 105, 110, 114, 117, 118, 120, 122, 124, 127, 130,
- 134, 136, 137
-};
-
-/* YYRHS -- A `-1'-separated list of the rules' RHS. */
-static const yytype_int8 yyrhs[] =
-{
- 41, 0, -1, 42, -1, -1, 43, 42, -1, 3,
- 36, -1, 4, 36, -1, 5, 37, -1, 6, 36,
- -1, 7, 36, 36, 36, -1, 8, -1, 9, 37,
- -1, 10, 36, -1, -1, 11, 44, 46, -1, 12,
- 36, -1, 13, 36, -1, 14, -1, 14, 36, -1,
- 15, 36, -1, -1, 16, 45, 46, -1, 17, 50,
- -1, 18, -1, 18, 36, -1, 19, 36, -1, 20,
- 50, -1, 21, -1, 22, -1, 23, 36, -1, 24,
- -1, 25, -1, 26, 37, -1, 27, 36, -1, 28,
- 36, -1, 29, 36, -1, 30, -1, 31, 37, -1,
- 32, 36, -1, 33, -1, 34, 36, 36, 36, -1,
- 34, 36, 36, -1, 35, 36, -1, -1, 47, -1,
- 49, -1, 48, -1, 47, 49, -1, 47, 48, -1,
- 38, 36, 39, -1, 36, -1, -1, 36, 50, -1
-};
-
-/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
-static const yytype_uint16 yyrline[] =
-{
- 0, 144, 144, 149, 151, 157, 161, 166, 183, 187,
- 205, 209, 225, 230, 229, 237, 242, 247, 252, 257,
- 262, 261, 269, 273, 277, 281, 285, 289, 293, 297,
- 304, 308, 312, 328, 332, 337, 341, 345, 361, 366,
- 370, 394, 410, 420, 423, 434, 438, 442, 446, 455,
- 466, 483, 486
-};
-#endif
-
-#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
-/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
- First, the terminals, then, starting at YYNTOKENS, nonterminals. */
-static const char *const yytname[] =
-{
- "$end", "error", "$undefined", "CHECK", "CODESTART", "COPYRIGHT",
- "CUSTOM", "DATE", "DEBUG_K", "DESCRIPTION", "EXIT", "EXPORT", "FLAG_ON",
- "FLAG_OFF", "FULLMAP", "HELP", "IMPORT", "INPUT", "MAP", "MESSAGES",
- "MODULE", "MULTIPLE", "OS_DOMAIN", "OUTPUT", "PSEUDOPREEMPTION",
- "REENTRANT", "SCREENNAME", "SHARELIB", "STACK", "START", "SYNCHRONIZE",
- "THREADNAME", "TYPE", "VERBOSE", "VERSIONK", "XDCDATA", "STRING",
- "QUOTED_STRING", "'('", "')'", "$accept", "file", "commands", "command",
- "@1", "@2", "symbol_list_opt", "symbol_list", "symbol_prefix", "symbol",
- "string_list", 0
-};
-#endif
-
-# ifdef YYPRINT
-/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
- token YYLEX-NUM. */
-static const yytype_uint16 yytoknum[] =
-{
- 0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
- 265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
- 275, 276, 277, 278, 279, 280, 281, 282, 283, 284,
- 285, 286, 287, 288, 289, 290, 291, 292, 40, 41
-};
-# endif
-
-/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
-static const yytype_uint8 yyr1[] =
-{
- 0, 40, 41, 42, 42, 43, 43, 43, 43, 43,
- 43, 43, 43, 44, 43, 43, 43, 43, 43, 43,
- 45, 43, 43, 43, 43, 43, 43, 43, 43, 43,
- 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
- 43, 43, 43, 46, 46, 47, 47, 47, 47, 48,
- 49, 50, 50
-};
-
-/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
-static const yytype_uint8 yyr2[] =
-{
- 0, 2, 1, 0, 2, 2, 2, 2, 2, 4,
- 1, 2, 2, 0, 3, 2, 2, 1, 2, 2,
- 0, 3, 2, 1, 2, 2, 2, 1, 1, 2,
- 1, 1, 2, 2, 2, 2, 1, 2, 2, 1,
- 4, 3, 2, 0, 1, 1, 1, 2, 2, 3,
- 1, 0, 2
-};
-
-/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
- STATE-NUM when YYTABLE doesn't specify something else to do. Zero
- means the default is an error. */
-static const yytype_uint8 yydefact[] =
-{
- 3, 0, 0, 0, 0, 0, 10, 0, 0, 13,
- 0, 0, 17, 0, 20, 51, 23, 0, 51, 27,
- 28, 0, 30, 31, 0, 0, 0, 0, 36, 0,
- 0, 39, 0, 0, 0, 2, 3, 5, 6, 7,
- 8, 0, 11, 12, 43, 15, 16, 18, 19, 43,
- 51, 22, 24, 25, 26, 29, 32, 33, 34, 35,
- 37, 38, 0, 42, 1, 4, 0, 50, 0, 14,
- 44, 46, 45, 21, 52, 41, 9, 0, 48, 47,
- 40, 49
-};
-
-/* YYDEFGOTO[NTERM-NUM]. */
-static const yytype_int8 yydefgoto[] =
-{
- -1, 34, 35, 36, 44, 49, 69, 70, 71, 72,
- 51
-};
-
-/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
- STATE-NUM. */
-#define YYPACT_NINF -20
-static const yytype_int8 yypact[] =
-{
- -3, -1, 1, 2, 4, 5, -20, 6, 8, -20,
- 9, 10, 11, 12, -20, 13, 14, 16, 13, -20,
- -20, 17, -20, -20, 18, 20, 21, 22, -20, 23,
- 25, -20, 26, 27, 38, -20, -3, -20, -20, -20,
- -20, 28, -20, -20, -2, -20, -20, -20, -20, -2,
- 13, -20, -20, -20, -20, -20, -20, -20, -20, -20,
- -20, -20, 30, -20, -20, -20, 31, -20, 32, -20,
- -2, -20, -20, -20, -20, 33, -20, 3, -20, -20,
- -20, -20
-};
-
-/* YYPGOTO[NTERM-NUM]. */
-static const yytype_int8 yypgoto[] =
-{
- -20, -20, 34, -20, -20, -20, 24, -20, -19, -16,
- 15
-};
-
-/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
- positive, shift that token. If negative, reduce the rule which
- number is the opposite. If zero, do what YYDEFACT says.
- If YYTABLE_NINF, syntax error. */
-#define YYTABLE_NINF -1
-static const yytype_uint8 yytable[] =
-{
- 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
- 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
- 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
- 31, 32, 33, 54, 67, 37, 68, 38, 64, 39,
- 40, 41, 81, 42, 43, 45, 46, 47, 48, 50,
- 52, 78, 53, 55, 79, 56, 57, 58, 59, 0,
- 60, 61, 62, 63, 66, 74, 75, 76, 77, 80,
- 65, 0, 0, 73
-};
-
-static const yytype_int8 yycheck[] =
-{
- 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
- 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
- 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
- 33, 34, 35, 18, 36, 36, 38, 36, 0, 37,
- 36, 36, 39, 37, 36, 36, 36, 36, 36, 36,
- 36, 70, 36, 36, 70, 37, 36, 36, 36, -1,
- 37, 36, 36, 36, 36, 50, 36, 36, 36, 36,
- 36, -1, -1, 49
-};
-
-/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
- symbol of state STATE-NUM. */
-static const yytype_uint8 yystos[] =
-{
- 0, 3, 4, 5, 6, 7, 8, 9, 10, 11,
- 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
- 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
- 32, 33, 34, 35, 41, 42, 43, 36, 36, 37,
- 36, 36, 37, 36, 44, 36, 36, 36, 36, 45,
- 36, 50, 36, 36, 50, 36, 37, 36, 36, 36,
- 37, 36, 36, 36, 0, 42, 36, 36, 38, 46,
- 47, 48, 49, 46, 50, 36, 36, 36, 48, 49,
- 36, 39
-};
-
-#define yyerrok (yyerrstatus = 0)
-#define yyclearin (yychar = YYEMPTY)
-#define YYEMPTY (-2)
-#define YYEOF 0
-
-#define YYACCEPT goto yyacceptlab
-#define YYABORT goto yyabortlab
-#define YYERROR goto yyerrorlab
-
-
-/* Like YYERROR except do call yyerror. This remains here temporarily
- to ease the transition to the new meaning of YYERROR, for GCC.
- Once GCC version 2 has supplanted version 1, this can go. */
-
-#define YYFAIL goto yyerrlab
-
-#define YYRECOVERING() (!!yyerrstatus)
-
-#define YYBACKUP(Token, Value) \
-do \
- if (yychar == YYEMPTY && yylen == 1) \
- { \
- yychar = (Token); \
- yylval = (Value); \
- yytoken = YYTRANSLATE (yychar); \
- YYPOPSTACK (1); \
- goto yybackup; \
- } \
- else \
- { \
- yyerror (YY_("syntax error: cannot back up")); \
- YYERROR; \
- } \
-while (YYID (0))
-
-
-#define YYTERROR 1
-#define YYERRCODE 256
-
-
-/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
- If N is 0, then set CURRENT to the empty location which ends
- the previous symbol: RHS[0] (always defined). */
-
-#define YYRHSLOC(Rhs, K) ((Rhs)[K])
-#ifndef YYLLOC_DEFAULT
-# define YYLLOC_DEFAULT(Current, Rhs, N) \
- do \
- if (YYID (N)) \
- { \
- (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \
- (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
- (Current).last_line = YYRHSLOC (Rhs, N).last_line; \
- (Current).last_column = YYRHSLOC (Rhs, N).last_column; \
- } \
- else \
- { \
- (Current).first_line = (Current).last_line = \
- YYRHSLOC (Rhs, 0).last_line; \
- (Current).first_column = (Current).last_column = \
- YYRHSLOC (Rhs, 0).last_column; \
- } \
- while (YYID (0))
-#endif
-
-
-/* YY_LOCATION_PRINT -- Print the location on the stream.
- This macro was not mandated originally: define only if we know
- we won't break user code: when these are the locations we know. */
-
-#ifndef YY_LOCATION_PRINT
-# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL
-# define YY_LOCATION_PRINT(File, Loc) \
- fprintf (File, "%d.%d-%d.%d", \
- (Loc).first_line, (Loc).first_column, \
- (Loc).last_line, (Loc).last_column)
-# else
-# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
-# endif
-#endif
-
-
-/* YYLEX -- calling `yylex' with the right arguments. */
-
-#ifdef YYLEX_PARAM
-# define YYLEX yylex (YYLEX_PARAM)
-#else
-# define YYLEX yylex ()
-#endif
-
-/* Enable debugging if requested. */
-#if YYDEBUG
-
-# ifndef YYFPRINTF
-# include /* INFRINGES ON USER NAME SPACE */
-# define YYFPRINTF fprintf
-# endif
-
-# define YYDPRINTF(Args) \
-do { \
- if (yydebug) \
- YYFPRINTF Args; \
-} while (YYID (0))
-
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
-do { \
- if (yydebug) \
- { \
- YYFPRINTF (stderr, "%s ", Title); \
- yy_symbol_print (stderr, \
- Type, Value); \
- YYFPRINTF (stderr, "\n"); \
- } \
-} while (YYID (0))
-
-
-/*--------------------------------.
-| Print this symbol on YYOUTPUT. |
-`--------------------------------*/
-
-/*ARGSUSED*/
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static void
-yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
-#else
-static void
-yy_symbol_value_print (yyoutput, yytype, yyvaluep)
- FILE *yyoutput;
- int yytype;
- YYSTYPE const * const yyvaluep;
-#endif
-{
- if (!yyvaluep)
- return;
-# ifdef YYPRINT
- if (yytype < YYNTOKENS)
- YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
-# else
- YYUSE (yyoutput);
-# endif
- switch (yytype)
- {
- default:
- break;
- }
-}
-
-
-/*--------------------------------.
-| Print this symbol on YYOUTPUT. |
-`--------------------------------*/
-
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static void
-yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
-#else
-static void
-yy_symbol_print (yyoutput, yytype, yyvaluep)
- FILE *yyoutput;
- int yytype;
- YYSTYPE const * const yyvaluep;
-#endif
-{
- if (yytype < YYNTOKENS)
- YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
- else
- YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
-
- yy_symbol_value_print (yyoutput, yytype, yyvaluep);
- YYFPRINTF (yyoutput, ")");
-}
-
-/*------------------------------------------------------------------.
-| yy_stack_print -- Print the state stack from its BOTTOM up to its |
-| TOP (included). |
-`------------------------------------------------------------------*/
-
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static void
-yy_stack_print (yytype_int16 *bottom, yytype_int16 *top)
-#else
-static void
-yy_stack_print (bottom, top)
- yytype_int16 *bottom;
- yytype_int16 *top;
-#endif
-{
- YYFPRINTF (stderr, "Stack now");
- for (; bottom <= top; ++bottom)
- YYFPRINTF (stderr, " %d", *bottom);
- YYFPRINTF (stderr, "\n");
-}
-
-# define YY_STACK_PRINT(Bottom, Top) \
-do { \
- if (yydebug) \
- yy_stack_print ((Bottom), (Top)); \
-} while (YYID (0))
-
-
-/*------------------------------------------------.
-| Report that the YYRULE is going to be reduced. |
-`------------------------------------------------*/
-
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static void
-yy_reduce_print (YYSTYPE *yyvsp, int yyrule)
-#else
-static void
-yy_reduce_print (yyvsp, yyrule)
- YYSTYPE *yyvsp;
- int yyrule;
-#endif
-{
- int yynrhs = yyr2[yyrule];
- int yyi;
- unsigned long int yylno = yyrline[yyrule];
- YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
- yyrule - 1, yylno);
- /* The symbols being reduced. */
- for (yyi = 0; yyi < yynrhs; yyi++)
- {
- fprintf (stderr, " $%d = ", yyi + 1);
- yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
- &(yyvsp[(yyi + 1) - (yynrhs)])
- );
- fprintf (stderr, "\n");
- }
-}
-
-# define YY_REDUCE_PRINT(Rule) \
-do { \
- if (yydebug) \
- yy_reduce_print (yyvsp, Rule); \
-} while (YYID (0))
-
-/* Nonzero means print parse trace. It is left uninitialized so that
- multiple parsers can coexist. */
-int yydebug;
-#else /* !YYDEBUG */
-# define YYDPRINTF(Args)
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
-# define YY_STACK_PRINT(Bottom, Top)
-# define YY_REDUCE_PRINT(Rule)
-#endif /* !YYDEBUG */
-
-
-/* YYINITDEPTH -- initial size of the parser's stacks. */
-#ifndef YYINITDEPTH
-# define YYINITDEPTH 200
-#endif
-
-/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
- if the built-in stack extension method is used).
-
- Do not make this value too large; the results are undefined if
- YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
- evaluated with infinite-precision integer arithmetic. */
-
-#ifndef YYMAXDEPTH
-# define YYMAXDEPTH 10000
-#endif
-
-
-
-#if YYERROR_VERBOSE
-
-# ifndef yystrlen
-# if defined __GLIBC__ && defined _STRING_H
-# define yystrlen strlen
-# else
-/* Return the length of YYSTR. */
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static YYSIZE_T
-yystrlen (const char *yystr)
-#else
-static YYSIZE_T
-yystrlen (yystr)
- const char *yystr;
-#endif
-{
- YYSIZE_T yylen;
- for (yylen = 0; yystr[yylen]; yylen++)
- continue;
- return yylen;
-}
-# endif
-# endif
-
-# ifndef yystpcpy
-# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
-# define yystpcpy stpcpy
-# else
-/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
- YYDEST. */
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static char *
-yystpcpy (char *yydest, const char *yysrc)
-#else
-static char *
-yystpcpy (yydest, yysrc)
- char *yydest;
- const char *yysrc;
-#endif
-{
- char *yyd = yydest;
- const char *yys = yysrc;
-
- while ((*yyd++ = *yys++) != '\0')
- continue;
-
- return yyd - 1;
-}
-# endif
-# endif
-
-# ifndef yytnamerr
-/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
- quotes and backslashes, so that it's suitable for yyerror. The
- heuristic is that double-quoting is unnecessary unless the string
- contains an apostrophe, a comma, or backslash (other than
- backslash-backslash). YYSTR is taken from yytname. If YYRES is
- null, do not copy; instead, return the length of what the result
- would have been. */
-static YYSIZE_T
-yytnamerr (char *yyres, const char *yystr)
-{
- if (*yystr == '"')
- {
- YYSIZE_T yyn = 0;
- char const *yyp = yystr;
-
- for (;;)
- switch (*++yyp)
- {
- case '\'':
- case ',':
- goto do_not_strip_quotes;
-
- case '\\':
- if (*++yyp != '\\')
- goto do_not_strip_quotes;
- /* Fall through. */
- default:
- if (yyres)
- yyres[yyn] = *yyp;
- yyn++;
- break;
-
- case '"':
- if (yyres)
- yyres[yyn] = '\0';
- return yyn;
- }
- do_not_strip_quotes: ;
- }
-
- if (! yyres)
- return yystrlen (yystr);
-
- return yystpcpy (yyres, yystr) - yyres;
-}
-# endif
-
-/* Copy into YYRESULT an error message about the unexpected token
- YYCHAR while in state YYSTATE. Return the number of bytes copied,
- including the terminating null byte. If YYRESULT is null, do not
- copy anything; just return the number of bytes that would be
- copied. As a special case, return 0 if an ordinary "syntax error"
- message will do. Return YYSIZE_MAXIMUM if overflow occurs during
- size calculation. */
-static YYSIZE_T
-yysyntax_error (char *yyresult, int yystate, int yychar)
-{
- int yyn = yypact[yystate];
-
- if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
- return 0;
- else
- {
- int yytype = YYTRANSLATE (yychar);
- YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
- YYSIZE_T yysize = yysize0;
- YYSIZE_T yysize1;
- int yysize_overflow = 0;
- enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
- char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
- int yyx;
-
-# if 0
- /* This is so xgettext sees the translatable formats that are
- constructed on the fly. */
- YY_("syntax error, unexpected %s");
- YY_("syntax error, unexpected %s, expecting %s");
- YY_("syntax error, unexpected %s, expecting %s or %s");
- YY_("syntax error, unexpected %s, expecting %s or %s or %s");
- YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
-# endif
- char *yyfmt;
- char const *yyf;
- static char const yyunexpected[] = "syntax error, unexpected %s";
- static char const yyexpecting[] = ", expecting %s";
- static char const yyor[] = " or %s";
- char yyformat[sizeof yyunexpected
- + sizeof yyexpecting - 1
- + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
- * (sizeof yyor - 1))];
- char const *yyprefix = yyexpecting;
-
- /* Start YYX at -YYN if negative to avoid negative indexes in
- YYCHECK. */
- int yyxbegin = yyn < 0 ? -yyn : 0;
-
- /* Stay within bounds of both yycheck and yytname. */
- int yychecklim = YYLAST - yyn + 1;
- int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
- int yycount = 1;
-
- yyarg[0] = yytname[yytype];
- yyfmt = yystpcpy (yyformat, yyunexpected);
-
- for (yyx = yyxbegin; yyx < yyxend; ++yyx)
- if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
- {
- if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
- {
- yycount = 1;
- yysize = yysize0;
- yyformat[sizeof yyunexpected - 1] = '\0';
- break;
- }
- yyarg[yycount++] = yytname[yyx];
- yysize1 = yysize + yytnamerr (0, yytname[yyx]);
- yysize_overflow |= (yysize1 < yysize);
- yysize = yysize1;
- yyfmt = yystpcpy (yyfmt, yyprefix);
- yyprefix = yyor;
- }
-
- yyf = YY_(yyformat);
- yysize1 = yysize + yystrlen (yyf);
- yysize_overflow |= (yysize1 < yysize);
- yysize = yysize1;
-
- if (yysize_overflow)
- return YYSIZE_MAXIMUM;
-
- if (yyresult)
- {
- /* Avoid sprintf, as that infringes on the user's name space.
- Don't have undefined behavior even if the translation
- produced a string with the wrong number of "%s"s. */
- char *yyp = yyresult;
- int yyi = 0;
- while ((*yyp = *yyf) != '\0')
- {
- if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
- {
- yyp += yytnamerr (yyp, yyarg[yyi++]);
- yyf += 2;
- }
- else
- {
- yyp++;
- yyf++;
- }
- }
- }
- return yysize;
- }
-}
-#endif /* YYERROR_VERBOSE */
-
-
-/*-----------------------------------------------.
-| Release the memory associated to this symbol. |
-`-----------------------------------------------*/
-
-/*ARGSUSED*/
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static void
-yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
-#else
-static void
-yydestruct (yymsg, yytype, yyvaluep)
- const char *yymsg;
- int yytype;
- YYSTYPE *yyvaluep;
-#endif
-{
- YYUSE (yyvaluep);
-
- if (!yymsg)
- yymsg = "Deleting";
- YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
-
- switch (yytype)
- {
-
- default:
- break;
- }
-}
-
-
-/* Prevent warnings from -Wmissing-prototypes. */
-
-#ifdef YYPARSE_PARAM
-#if defined __STDC__ || defined __cplusplus
-int yyparse (void *YYPARSE_PARAM);
-#else
-int yyparse ();
-#endif
-#else /* ! YYPARSE_PARAM */
-#if defined __STDC__ || defined __cplusplus
-int yyparse (void);
-#else
-int yyparse ();
-#endif
-#endif /* ! YYPARSE_PARAM */
-
-
-
-/* The look-ahead symbol. */
-int yychar;
-
-/* The semantic value of the look-ahead symbol. */
-YYSTYPE yylval;
-
-/* Number of syntax errors so far. */
-int yynerrs;
-
-
-
-/*----------.
-| yyparse. |
-`----------*/
-
-#ifdef YYPARSE_PARAM
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-int
-yyparse (void *YYPARSE_PARAM)
-#else
-int
-yyparse (YYPARSE_PARAM)
- void *YYPARSE_PARAM;
-#endif
-#else /* ! YYPARSE_PARAM */
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-int
-yyparse (void)
-#else
-int
-yyparse ()
-
-#endif
-#endif
-{
-
- int yystate;
- int yyn;
- int yyresult;
- /* Number of tokens to shift before error messages enabled. */
- int yyerrstatus;
- /* Look-ahead token as an internal (translated) token number. */
- int yytoken = 0;
-#if YYERROR_VERBOSE
- /* Buffer for error messages, and its allocated size. */
- char yymsgbuf[128];
- char *yymsg = yymsgbuf;
- YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
-#endif
-
- /* Three stacks and their tools:
- `yyss': related to states,
- `yyvs': related to semantic values,
- `yyls': related to locations.
-
- Refer to the stacks thru separate pointers, to allow yyoverflow
- to reallocate them elsewhere. */
-
- /* The state stack. */
- yytype_int16 yyssa[YYINITDEPTH];
- yytype_int16 *yyss = yyssa;
- yytype_int16 *yyssp;
-
- /* The semantic value stack. */
- YYSTYPE yyvsa[YYINITDEPTH];
- YYSTYPE *yyvs = yyvsa;
- YYSTYPE *yyvsp;
-
-
-
-#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
-
- YYSIZE_T yystacksize = YYINITDEPTH;
-
- /* The variables used to return semantic value and location from the
- action routines. */
- YYSTYPE yyval;
-
-
- /* The number of symbols on the RHS of the reduced rule.
- Keep to zero when no symbol should be popped. */
- int yylen = 0;
-
- YYDPRINTF ((stderr, "Starting parse\n"));
-
- yystate = 0;
- yyerrstatus = 0;
- yynerrs = 0;
- yychar = YYEMPTY; /* Cause a token to be read. */
-
- /* Initialize stack pointers.
- Waste one element of value and location stack
- so that they stay on the same level as the state stack.
- The wasted elements are never initialized. */
-
- yyssp = yyss;
- yyvsp = yyvs;
-
- goto yysetstate;
-
-/*------------------------------------------------------------.
-| yynewstate -- Push a new state, which is found in yystate. |
-`------------------------------------------------------------*/
- yynewstate:
- /* In all cases, when you get here, the value and location stacks
- have just been pushed. So pushing a state here evens the stacks. */
- yyssp++;
-
- yysetstate:
- *yyssp = yystate;
-
- if (yyss + yystacksize - 1 <= yyssp)
- {
- /* Get the current used size of the three stacks, in elements. */
- YYSIZE_T yysize = yyssp - yyss + 1;
-
-#ifdef yyoverflow
- {
- /* Give user a chance to reallocate the stack. Use copies of
- these so that the &'s don't force the real ones into
- memory. */
- YYSTYPE *yyvs1 = yyvs;
- yytype_int16 *yyss1 = yyss;
-
-
- /* Each stack pointer address is followed by the size of the
- data in use in that stack, in bytes. This used to be a
- conditional around just the two extra args, but that might
- be undefined if yyoverflow is a macro. */
- yyoverflow (YY_("memory exhausted"),
- &yyss1, yysize * sizeof (*yyssp),
- &yyvs1, yysize * sizeof (*yyvsp),
-
- &yystacksize);
-
- yyss = yyss1;
- yyvs = yyvs1;
- }
-#else /* no yyoverflow */
-# ifndef YYSTACK_RELOCATE
- goto yyexhaustedlab;
-# else
- /* Extend the stack our own way. */
- if (YYMAXDEPTH <= yystacksize)
- goto yyexhaustedlab;
- yystacksize *= 2;
- if (YYMAXDEPTH < yystacksize)
- yystacksize = YYMAXDEPTH;
-
- {
- yytype_int16 *yyss1 = yyss;
- union yyalloc *yyptr =
- (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
- if (! yyptr)
- goto yyexhaustedlab;
- YYSTACK_RELOCATE (yyss);
- YYSTACK_RELOCATE (yyvs);
-
-# undef YYSTACK_RELOCATE
- if (yyss1 != yyssa)
- YYSTACK_FREE (yyss1);
- }
-# endif
-#endif /* no yyoverflow */
-
- yyssp = yyss + yysize - 1;
- yyvsp = yyvs + yysize - 1;
-
-
- YYDPRINTF ((stderr, "Stack size increased to %lu\n",
- (unsigned long int) yystacksize));
-
- if (yyss + yystacksize - 1 <= yyssp)
- YYABORT;
- }
-
- YYDPRINTF ((stderr, "Entering state %d\n", yystate));
-
- goto yybackup;
-
-/*-----------.
-| yybackup. |
-`-----------*/
-yybackup:
-
- /* Do appropriate processing given the current state. Read a
- look-ahead token if we need one and don't already have one. */
-
- /* First try to decide what to do without reference to look-ahead token. */
- yyn = yypact[yystate];
- if (yyn == YYPACT_NINF)
- goto yydefault;
-
- /* Not known => get a look-ahead token if don't already have one. */
-
- /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */
- if (yychar == YYEMPTY)
- {
- YYDPRINTF ((stderr, "Reading a token: "));
- yychar = YYLEX;
- }
-
- if (yychar <= YYEOF)
- {
- yychar = yytoken = YYEOF;
- YYDPRINTF ((stderr, "Now at end of input.\n"));
- }
- else
- {
- yytoken = YYTRANSLATE (yychar);
- YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
- }
-
- /* If the proper action on seeing token YYTOKEN is to reduce or to
- detect an error, take that action. */
- yyn += yytoken;
- if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
- goto yydefault;
- yyn = yytable[yyn];
- if (yyn <= 0)
- {
- if (yyn == 0 || yyn == YYTABLE_NINF)
- goto yyerrlab;
- yyn = -yyn;
- goto yyreduce;
- }
-
- if (yyn == YYFINAL)
- YYACCEPT;
-
- /* Count tokens shifted since error; after three, turn off error
- status. */
- if (yyerrstatus)
- yyerrstatus--;
-
- /* Shift the look-ahead token. */
- YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
-
- /* Discard the shifted token unless it is eof. */
- if (yychar != YYEOF)
- yychar = YYEMPTY;
-
- yystate = yyn;
- *++yyvsp = yylval;
-
- goto yynewstate;
-
-
-/*-----------------------------------------------------------.
-| yydefault -- do the default action for the current state. |
-`-----------------------------------------------------------*/
-yydefault:
- yyn = yydefact[yystate];
- if (yyn == 0)
- goto yyerrlab;
- goto yyreduce;
-
-
-/*-----------------------------.
-| yyreduce -- Do a reduction. |
-`-----------------------------*/
-yyreduce:
- /* yyn is the number of a rule to reduce with. */
- yylen = yyr2[yyn];
-
- /* If YYLEN is nonzero, implement the default value of the action:
- `$$ = $1'.
-
- Otherwise, the following line sets YYVAL to garbage.
- This behavior is undocumented and Bison
- users should not rely upon it. Assigning to YYVAL
- unconditionally makes the parser a bit smaller, and it avoids a
- GCC warning that YYVAL may be used uninitialized. */
- yyval = yyvsp[1-yylen];
-
-
- YY_REDUCE_PRINT (yyn);
- switch (yyn)
- {
- case 5:
-#line 158 "nlmheader.y"
- {
- check_procedure = (yyvsp[(2) - (2)].string);
- }
- break;
-
- case 6:
-#line 162 "nlmheader.y"
- {
- nlmheader_warn (_("CODESTART is not implemented; sorry"), -1);
- free ((yyvsp[(2) - (2)].string));
- }
- break;
-
- case 7:
-#line 167 "nlmheader.y"
- {
- int len;
-
- strncpy (copyright_hdr->stamp, "CoPyRiGhT=", 10);
- len = strlen ((yyvsp[(2) - (2)].string));
- if (len >= NLM_MAX_COPYRIGHT_MESSAGE_LENGTH)
- {
- nlmheader_warn (_("copyright string is too long"),
- NLM_MAX_COPYRIGHT_MESSAGE_LENGTH - 1);
- len = NLM_MAX_COPYRIGHT_MESSAGE_LENGTH - 1;
- }
- copyright_hdr->copyrightMessageLength = len;
- strncpy (copyright_hdr->copyrightMessage, (yyvsp[(2) - (2)].string), len);
- copyright_hdr->copyrightMessage[len] = '\0';
- free ((yyvsp[(2) - (2)].string));
- }
- break;
-
- case 8:
-#line 184 "nlmheader.y"
- {
- custom_file = (yyvsp[(2) - (2)].string);
- }
- break;
-
- case 9:
-#line 188 "nlmheader.y"
- {
- /* We don't set the version stamp here, because we use the
- version stamp to detect whether the required VERSION
- keyword was given. */
- version_hdr->month = nlmlex_get_number ((yyvsp[(2) - (4)].string));
- version_hdr->day = nlmlex_get_number ((yyvsp[(3) - (4)].string));
- version_hdr->year = nlmlex_get_number ((yyvsp[(4) - (4)].string));
- free ((yyvsp[(2) - (4)].string));
- free ((yyvsp[(3) - (4)].string));
- free ((yyvsp[(4) - (4)].string));
- if (version_hdr->month < 1 || version_hdr->month > 12)
- nlmheader_warn (_("illegal month"), -1);
- if (version_hdr->day < 1 || version_hdr->day > 31)
- nlmheader_warn (_("illegal day"), -1);
- if (version_hdr->year < 1900 || version_hdr->year > 3000)
- nlmheader_warn (_("illegal year"), -1);
- }
- break;
-
- case 10:
-#line 206 "nlmheader.y"
- {
- debug_info = TRUE;
- }
- break;
-
- case 11:
-#line 210 "nlmheader.y"
- {
- int len;
-
- len = strlen ((yyvsp[(2) - (2)].string));
- if (len > NLM_MAX_DESCRIPTION_LENGTH)
- {
- nlmheader_warn (_("description string is too long"),
- NLM_MAX_DESCRIPTION_LENGTH);
- len = NLM_MAX_DESCRIPTION_LENGTH;
- }
- var_hdr->descriptionLength = len;
- strncpy (var_hdr->descriptionText, (yyvsp[(2) - (2)].string), len);
- var_hdr->descriptionText[len] = '\0';
- free ((yyvsp[(2) - (2)].string));
- }
- break;
-
- case 12:
-#line 226 "nlmheader.y"
- {
- exit_procedure = (yyvsp[(2) - (2)].string);
- }
- break;
-
- case 13:
-#line 230 "nlmheader.y"
- {
- symbol_prefix = NULL;
- }
- break;
-
- case 14:
-#line 234 "nlmheader.y"
- {
- export_symbols = string_list_append (export_symbols, (yyvsp[(3) - (3)].list));
- }
- break;
-
- case 15:
-#line 238 "nlmheader.y"
- {
- fixed_hdr->flags |= nlmlex_get_number ((yyvsp[(2) - (2)].string));
- free ((yyvsp[(2) - (2)].string));
- }
- break;
-
- case 16:
-#line 243 "nlmheader.y"
- {
- fixed_hdr->flags &=~ nlmlex_get_number ((yyvsp[(2) - (2)].string));
- free ((yyvsp[(2) - (2)].string));
- }
- break;
-
- case 17:
-#line 248 "nlmheader.y"
- {
- map_file = "";
- full_map = TRUE;
- }
- break;
-
- case 18:
-#line 253 "nlmheader.y"
- {
- map_file = (yyvsp[(2) - (2)].string);
- full_map = TRUE;
- }
- break;
-
- case 19:
-#line 258 "nlmheader.y"
- {
- help_file = (yyvsp[(2) - (2)].string);
- }
- break;
-
- case 20:
-#line 262 "nlmheader.y"
- {
- symbol_prefix = NULL;
- }
- break;
-
- case 21:
-#line 266 "nlmheader.y"
- {
- import_symbols = string_list_append (import_symbols, (yyvsp[(3) - (3)].list));
- }
- break;
-
- case 22:
-#line 270 "nlmheader.y"
- {
- input_files = string_list_append (input_files, (yyvsp[(2) - (2)].list));
- }
- break;
-
- case 23:
-#line 274 "nlmheader.y"
- {
- map_file = "";
- }
- break;
-
- case 24:
-#line 278 "nlmheader.y"
- {
- map_file = (yyvsp[(2) - (2)].string);
- }
- break;
-
- case 25:
-#line 282 "nlmheader.y"
- {
- message_file = (yyvsp[(2) - (2)].string);
- }
- break;
-
- case 26:
-#line 286 "nlmheader.y"
- {
- modules = string_list_append (modules, (yyvsp[(2) - (2)].list));
- }
- break;
-
- case 27:
-#line 290 "nlmheader.y"
- {
- fixed_hdr->flags |= 0x2;
- }
- break;
-
- case 28:
-#line 294 "nlmheader.y"
- {
- fixed_hdr->flags |= 0x10;
- }
- break;
-
- case 29:
-#line 298 "nlmheader.y"
- {
- if (output_file == NULL)
- output_file = (yyvsp[(2) - (2)].string);
- else
- nlmheader_warn (_("ignoring duplicate OUTPUT statement"), -1);
- }
- break;
-
- case 30:
-#line 305 "nlmheader.y"
- {
- fixed_hdr->flags |= 0x8;
- }
- break;
-
- case 31:
-#line 309 "nlmheader.y"
- {
- fixed_hdr->flags |= 0x1;
- }
- break;
-
- case 32:
-#line 313 "nlmheader.y"
- {
- int len;
-
- len = strlen ((yyvsp[(2) - (2)].string));
- if (len >= NLM_MAX_SCREEN_NAME_LENGTH)
- {
- nlmheader_warn (_("screen name is too long"),
- NLM_MAX_SCREEN_NAME_LENGTH);
- len = NLM_MAX_SCREEN_NAME_LENGTH;
- }
- var_hdr->screenNameLength = len;
- strncpy (var_hdr->screenName, (yyvsp[(2) - (2)].string), len);
- var_hdr->screenName[NLM_MAX_SCREEN_NAME_LENGTH] = '\0';
- free ((yyvsp[(2) - (2)].string));
- }
- break;
-
- case 33:
-#line 329 "nlmheader.y"
- {
- sharelib_file = (yyvsp[(2) - (2)].string);
- }
- break;
-
- case 34:
-#line 333 "nlmheader.y"
- {
- var_hdr->stackSize = nlmlex_get_number ((yyvsp[(2) - (2)].string));
- free ((yyvsp[(2) - (2)].string));
- }
- break;
-
- case 35:
-#line 338 "nlmheader.y"
- {
- start_procedure = (yyvsp[(2) - (2)].string);
- }
- break;
-
- case 36:
-#line 342 "nlmheader.y"
- {
- fixed_hdr->flags |= 0x4;
- }
- break;
-
- case 37:
-#line 346 "nlmheader.y"
- {
- int len;
-
- len = strlen ((yyvsp[(2) - (2)].string));
- if (len >= NLM_MAX_THREAD_NAME_LENGTH)
- {
- nlmheader_warn (_("thread name is too long"),
- NLM_MAX_THREAD_NAME_LENGTH);
- len = NLM_MAX_THREAD_NAME_LENGTH;
- }
- var_hdr->threadNameLength = len;
- strncpy (var_hdr->threadName, (yyvsp[(2) - (2)].string), len);
- var_hdr->threadName[len] = '\0';
- free ((yyvsp[(2) - (2)].string));
- }
- break;
-
- case 38:
-#line 362 "nlmheader.y"
- {
- fixed_hdr->moduleType = nlmlex_get_number ((yyvsp[(2) - (2)].string));
- free ((yyvsp[(2) - (2)].string));
- }
- break;
-
- case 39:
-#line 367 "nlmheader.y"
- {
- verbose = TRUE;
- }
- break;
-
- case 40:
-#line 371 "nlmheader.y"
- {
- long val;
-
- strncpy (version_hdr->stamp, "VeRsIoN#", 8);
- version_hdr->majorVersion = nlmlex_get_number ((yyvsp[(2) - (4)].string));
- val = nlmlex_get_number ((yyvsp[(3) - (4)].string));
- if (val < 0 || val > 99)
- nlmheader_warn (_("illegal minor version number (must be between 0 and 99)"),
- -1);
- else
- version_hdr->minorVersion = val;
- val = nlmlex_get_number ((yyvsp[(4) - (4)].string));
- if (val < 0)
- nlmheader_warn (_("illegal revision number (must be between 0 and 26)"),
- -1);
- else if (val > 26)
- version_hdr->revision = 0;
- else
- version_hdr->revision = val;
- free ((yyvsp[(2) - (4)].string));
- free ((yyvsp[(3) - (4)].string));
- free ((yyvsp[(4) - (4)].string));
- }
- break;
-
- case 41:
-#line 395 "nlmheader.y"
- {
- long val;
-
- strncpy (version_hdr->stamp, "VeRsIoN#", 8);
- version_hdr->majorVersion = nlmlex_get_number ((yyvsp[(2) - (3)].string));
- val = nlmlex_get_number ((yyvsp[(3) - (3)].string));
- if (val < 0 || val > 99)
- nlmheader_warn (_("illegal minor version number (must be between 0 and 99)"),
- -1);
- else
- version_hdr->minorVersion = val;
- version_hdr->revision = 0;
- free ((yyvsp[(2) - (3)].string));
- free ((yyvsp[(3) - (3)].string));
- }
- break;
-
- case 42:
-#line 411 "nlmheader.y"
- {
- rpc_file = (yyvsp[(2) - (2)].string);
- }
- break;
-
- case 43:
-#line 420 "nlmheader.y"
- {
- (yyval.list) = NULL;
- }
- break;
-
- case 44:
-#line 424 "nlmheader.y"
- {
- (yyval.list) = (yyvsp[(1) - (1)].list);
- }
- break;
-
- case 45:
-#line 435 "nlmheader.y"
- {
- (yyval.list) = string_list_cons ((yyvsp[(1) - (1)].string), NULL);
- }
- break;
-
- case 46:
-#line 439 "nlmheader.y"
- {
- (yyval.list) = NULL;
- }
- break;
-
- case 47:
-#line 443 "nlmheader.y"
- {
- (yyval.list) = string_list_append1 ((yyvsp[(1) - (2)].list), (yyvsp[(2) - (2)].string));
- }
- break;
-
- case 48:
-#line 447 "nlmheader.y"
- {
- (yyval.list) = (yyvsp[(1) - (2)].list);
- }
- break;
-
- case 49:
-#line 456 "nlmheader.y"
- {
- if (symbol_prefix != NULL)
- free (symbol_prefix);
- symbol_prefix = (yyvsp[(2) - (3)].string);
- }
- break;
-
- case 50:
-#line 467 "nlmheader.y"
- {
- if (symbol_prefix == NULL)
- (yyval.string) = (yyvsp[(1) - (1)].string);
- else
- {
- (yyval.string) = xmalloc (strlen (symbol_prefix) + strlen ((yyvsp[(1) - (1)].string)) + 2);
- sprintf ((yyval.string), "%s@%s", symbol_prefix, (yyvsp[(1) - (1)].string));
- free ((yyvsp[(1) - (1)].string));
- }
- }
- break;
-
- case 51:
-#line 483 "nlmheader.y"
- {
- (yyval.list) = NULL;
- }
- break;
-
- case 52:
-#line 487 "nlmheader.y"
- {
- (yyval.list) = string_list_cons ((yyvsp[(1) - (2)].string), (yyvsp[(2) - (2)].list));
- }
- break;
-
-
-/* Line 1267 of yacc.c. */
-#line 2015 "nlmheader.c"
- default: break;
- }
- YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
-
- YYPOPSTACK (yylen);
- yylen = 0;
- YY_STACK_PRINT (yyss, yyssp);
-
- *++yyvsp = yyval;
-
-
- /* Now `shift' the result of the reduction. Determine what state
- that goes to, based on the state we popped back to and the rule
- number reduced by. */
-
- yyn = yyr1[yyn];
-
- yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
- if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
- yystate = yytable[yystate];
- else
- yystate = yydefgoto[yyn - YYNTOKENS];
-
- goto yynewstate;
-
-
-/*------------------------------------.
-| yyerrlab -- here on detecting error |
-`------------------------------------*/
-yyerrlab:
- /* If not already recovering from an error, report this error. */
- if (!yyerrstatus)
- {
- ++yynerrs;
-#if ! YYERROR_VERBOSE
- yyerror (YY_("syntax error"));
-#else
- {
- YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
- if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
- {
- YYSIZE_T yyalloc = 2 * yysize;
- if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
- yyalloc = YYSTACK_ALLOC_MAXIMUM;
- if (yymsg != yymsgbuf)
- YYSTACK_FREE (yymsg);
- yymsg = (char *) YYSTACK_ALLOC (yyalloc);
- if (yymsg)
- yymsg_alloc = yyalloc;
- else
- {
- yymsg = yymsgbuf;
- yymsg_alloc = sizeof yymsgbuf;
- }
- }
-
- if (0 < yysize && yysize <= yymsg_alloc)
- {
- (void) yysyntax_error (yymsg, yystate, yychar);
- yyerror (yymsg);
- }
- else
- {
- yyerror (YY_("syntax error"));
- if (yysize != 0)
- goto yyexhaustedlab;
- }
- }
-#endif
- }
-
-
-
- if (yyerrstatus == 3)
- {
- /* If just tried and failed to reuse look-ahead token after an
- error, discard it. */
-
- if (yychar <= YYEOF)
- {
- /* Return failure if at end of input. */
- if (yychar == YYEOF)
- YYABORT;
- }
- else
- {
- yydestruct ("Error: discarding",
- yytoken, &yylval);
- yychar = YYEMPTY;
- }
- }
-
- /* Else will try to reuse look-ahead token after shifting the error
- token. */
- goto yyerrlab1;
-
-
-/*---------------------------------------------------.
-| yyerrorlab -- error raised explicitly by YYERROR. |
-`---------------------------------------------------*/
-yyerrorlab:
-
- /* Pacify compilers like GCC when the user code never invokes
- YYERROR and the label yyerrorlab therefore never appears in user
- code. */
- if (/*CONSTCOND*/ 0)
- goto yyerrorlab;
-
- /* Do not reclaim the symbols of the rule which action triggered
- this YYERROR. */
- YYPOPSTACK (yylen);
- yylen = 0;
- YY_STACK_PRINT (yyss, yyssp);
- yystate = *yyssp;
- goto yyerrlab1;
-
-
-/*-------------------------------------------------------------.
-| yyerrlab1 -- common code for both syntax error and YYERROR. |
-`-------------------------------------------------------------*/
-yyerrlab1:
- yyerrstatus = 3; /* Each real token shifted decrements this. */
-
- for (;;)
- {
- yyn = yypact[yystate];
- if (yyn != YYPACT_NINF)
- {
- yyn += YYTERROR;
- if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
- {
- yyn = yytable[yyn];
- if (0 < yyn)
- break;
- }
- }
-
- /* Pop the current state because it cannot handle the error token. */
- if (yyssp == yyss)
- YYABORT;
-
-
- yydestruct ("Error: popping",
- yystos[yystate], yyvsp);
- YYPOPSTACK (1);
- yystate = *yyssp;
- YY_STACK_PRINT (yyss, yyssp);
- }
-
- if (yyn == YYFINAL)
- YYACCEPT;
-
- *++yyvsp = yylval;
-
-
- /* Shift the error token. */
- YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
-
- yystate = yyn;
- goto yynewstate;
-
-
-/*-------------------------------------.
-| yyacceptlab -- YYACCEPT comes here. |
-`-------------------------------------*/
-yyacceptlab:
- yyresult = 0;
- goto yyreturn;
-
-/*-----------------------------------.
-| yyabortlab -- YYABORT comes here. |
-`-----------------------------------*/
-yyabortlab:
- yyresult = 1;
- goto yyreturn;
-
-#ifndef yyoverflow
-/*-------------------------------------------------.
-| yyexhaustedlab -- memory exhaustion comes here. |
-`-------------------------------------------------*/
-yyexhaustedlab:
- yyerror (YY_("memory exhausted"));
- yyresult = 2;
- /* Fall through. */
-#endif
-
-yyreturn:
- if (yychar != YYEOF && yychar != YYEMPTY)
- yydestruct ("Cleanup: discarding lookahead",
- yytoken, &yylval);
- /* Do not reclaim the symbols of the rule which action triggered
- this YYABORT or YYACCEPT. */
- YYPOPSTACK (yylen);
- YY_STACK_PRINT (yyss, yyssp);
- while (yyssp != yyss)
- {
- yydestruct ("Cleanup: popping",
- yystos[*yyssp], yyvsp);
- YYPOPSTACK (1);
- }
-#ifndef yyoverflow
- if (yyss != yyssa)
- YYSTACK_FREE (yyss);
-#endif
-#if YYERROR_VERBOSE
- if (yymsg != yymsgbuf)
- YYSTACK_FREE (yymsg);
-#endif
- /* Make sure YYID is used. */
- return YYID (yyresult);
-}
-
-
-#line 492 "nlmheader.y"
-
-
-/* If strerror is just a macro, we want to use the one from libiberty
- since it will handle undefined values. */
-#undef strerror
-extern char *strerror PARAMS ((int));
-
-/* The lexer is simple, too simple for flex. Keywords are only
- recognized at the start of lines. Everything else must be an
- argument. A comma is treated as whitespace. */
-
-/* The states the lexer can be in. */
-
-enum lex_state
-{
- /* At the beginning of a line. */
- BEGINNING_OF_LINE,
- /* In the middle of a line. */
- IN_LINE
-};
-
-/* We need to keep a stack of files to handle file inclusion. */
-
-struct input
-{
- /* The file to read from. */
- FILE *file;
- /* The name of the file. */
- char *name;
- /* The current line number. */
- int lineno;
- /* The current state. */
- enum lex_state state;
- /* The next file on the stack. */
- struct input *next;
-};
-
-/* The current input file. */
-
-static struct input current;
-
-/* The character which introduces comments. */
-#define COMMENT_CHAR '#'
-
-/* Start the lexer going on the main input file. */
-
-bfd_boolean
-nlmlex_file (const char *name)
-{
- current.next = NULL;
- return nlmlex_file_open (name);
-}
-
-/* Start the lexer going on a subsidiary input file. */
-
-static void
-nlmlex_file_push (const char *name)
-{
- struct input *push;
-
- push = (struct input *) xmalloc (sizeof (struct input));
- *push = current;
- if (nlmlex_file_open (name))
- current.next = push;
- else
- {
- current = *push;
- free (push);
- }
-}
-
-/* Start lexing from a file. */
-
-static bfd_boolean
-nlmlex_file_open (const char *name)
-{
- current.file = fopen (name, "r");
- if (current.file == NULL)
- {
- fprintf (stderr, "%s:%s: %s\n", program_name, name, strerror (errno));
- ++parse_errors;
- return FALSE;
- }
- current.name = xstrdup (name);
- current.lineno = 1;
- current.state = BEGINNING_OF_LINE;
- return TRUE;
-}
-
-/* Table used to turn keywords into tokens. */
-
-struct keyword_tokens_struct
-{
- const char *keyword;
- int token;
-};
-
-static struct keyword_tokens_struct keyword_tokens[] =
-{
- { "CHECK", CHECK },
- { "CODESTART", CODESTART },
- { "COPYRIGHT", COPYRIGHT },
- { "CUSTOM", CUSTOM },
- { "DATE", DATE },
- { "DEBUG", DEBUG_K },
- { "DESCRIPTION", DESCRIPTION },
- { "EXIT", EXIT },
- { "EXPORT", EXPORT },
- { "FLAG_ON", FLAG_ON },
- { "FLAG_OFF", FLAG_OFF },
- { "FULLMAP", FULLMAP },
- { "HELP", HELP },
- { "IMPORT", IMPORT },
- { "INPUT", INPUT },
- { "MAP", MAP },
- { "MESSAGES", MESSAGES },
- { "MODULE", MODULE },
- { "MULTIPLE", MULTIPLE },
- { "OS_DOMAIN", OS_DOMAIN },
- { "OUTPUT", OUTPUT },
- { "PSEUDOPREEMPTION", PSEUDOPREEMPTION },
- { "REENTRANT", REENTRANT },
- { "SCREENNAME", SCREENNAME },
- { "SHARELIB", SHARELIB },
- { "STACK", STACK },
- { "STACKSIZE", STACK },
- { "START", START },
- { "SYNCHRONIZE", SYNCHRONIZE },
- { "THREADNAME", THREADNAME },
- { "TYPE", TYPE },
- { "VERBOSE", VERBOSE },
- { "VERSION", VERSIONK },
- { "XDCDATA", XDCDATA }
-};
-
-#define KEYWORD_COUNT (sizeof (keyword_tokens) / sizeof (keyword_tokens[0]))
-
-/* The lexer accumulates strings in these variables. */
-static char *lex_buf;
-static int lex_size;
-static int lex_pos;
-
-/* Start accumulating strings into the buffer. */
-#define BUF_INIT() \
- ((void) (lex_buf != NULL ? lex_pos = 0 : nlmlex_buf_init ()))
-
-static int
-nlmlex_buf_init (void)
-{
- lex_size = 10;
- lex_buf = xmalloc (lex_size + 1);
- lex_pos = 0;
- return 0;
-}
-
-/* Finish a string in the buffer. */
-#define BUF_FINISH() ((void) (lex_buf[lex_pos] = '\0'))
-
-/* Accumulate a character into the buffer. */
-#define BUF_ADD(c) \
- ((void) (lex_pos < lex_size \
- ? lex_buf[lex_pos++] = (c) \
- : nlmlex_buf_add (c)))
-
-static char
-nlmlex_buf_add (int c)
-{
- if (lex_pos >= lex_size)
- {
- lex_size *= 2;
- lex_buf = xrealloc (lex_buf, lex_size + 1);
- }
-
- return lex_buf[lex_pos++] = c;
-}
-
-/* The lexer proper. This is called by the bison generated parsing
- code. */
-
-static int
-yylex (void)
-{
- int c;
-
-tail_recurse:
-
- c = getc (current.file);
-
- /* Commas are treated as whitespace characters. */
- while (ISSPACE (c) || c == ',')
- {
- current.state = IN_LINE;
- if (c == '\n')
- {
- ++current.lineno;
- current.state = BEGINNING_OF_LINE;
- }
- c = getc (current.file);
- }
-
- /* At the end of the file we either pop to the previous file or
- finish up. */
- if (c == EOF)
- {
- fclose (current.file);
- free (current.name);
- if (current.next == NULL)
- return 0;
- else
- {
- struct input *next;
-
- next = current.next;
- current = *next;
- free (next);
- goto tail_recurse;
- }
- }
-
- /* A comment character always means to drop everything until the
- next newline. */
- if (c == COMMENT_CHAR)
- {
- do
- {
- c = getc (current.file);
- }
- while (c != '\n');
- ++current.lineno;
- current.state = BEGINNING_OF_LINE;
- goto tail_recurse;
- }
-
- /* An '@' introduces an include file. */
- if (c == '@')
- {
- do
- {
- c = getc (current.file);
- if (c == '\n')
- ++current.lineno;
- }
- while (ISSPACE (c));
- BUF_INIT ();
- while (! ISSPACE (c) && c != EOF)
- {
- BUF_ADD (c);
- c = getc (current.file);
- }
- BUF_FINISH ();
-
- ungetc (c, current.file);
-
- nlmlex_file_push (lex_buf);
- goto tail_recurse;
- }
-
- /* A non-space character at the start of a line must be the start of
- a keyword. */
- if (current.state == BEGINNING_OF_LINE)
- {
- BUF_INIT ();
- while (ISALNUM (c) || c == '_')
- {
- BUF_ADD (TOUPPER (c));
- c = getc (current.file);
- }
- BUF_FINISH ();
-
- if (c != EOF && ! ISSPACE (c) && c != ',')
- {
- nlmheader_identify ();
- fprintf (stderr, _("%s:%d: illegal character in keyword: %c\n"),
- current.name, current.lineno, c);
- }
- else
- {
- unsigned int i;
-
- for (i = 0; i < KEYWORD_COUNT; i++)
- {
- if (lex_buf[0] == keyword_tokens[i].keyword[0]
- && strcmp (lex_buf, keyword_tokens[i].keyword) == 0)
- {
- /* Pushing back the final whitespace avoids worrying
- about \n here. */
- ungetc (c, current.file);
- current.state = IN_LINE;
- return keyword_tokens[i].token;
- }
- }
-
- nlmheader_identify ();
- fprintf (stderr, _("%s:%d: unrecognized keyword: %s\n"),
- current.name, current.lineno, lex_buf);
- }
-
- ++parse_errors;
- /* Treat the rest of this line as a comment. */
- ungetc (COMMENT_CHAR, current.file);
- goto tail_recurse;
- }
-
- /* Parentheses just represent themselves. */
- if (c == '(' || c == ')')
- return c;
-
- /* Handle quoted strings. */
- if (c == '"' || c == '\'')
- {
- int quote;
- int start_lineno;
-
- quote = c;
- start_lineno = current.lineno;
-
- c = getc (current.file);
- BUF_INIT ();
- while (c != quote && c != EOF)
- {
- BUF_ADD (c);
- if (c == '\n')
- ++current.lineno;
- c = getc (current.file);
- }
- BUF_FINISH ();
-
- if (c == EOF)
- {
- nlmheader_identify ();
- fprintf (stderr, _("%s:%d: end of file in quoted string\n"),
- current.name, start_lineno);
- ++parse_errors;
- }
-
- /* FIXME: Possible memory leak. */
- yylval.string = xstrdup (lex_buf);
- return QUOTED_STRING;
- }
-
- /* Gather a generic argument. */
- BUF_INIT ();
- while (! ISSPACE (c)
- && c != ','
- && c != COMMENT_CHAR
- && c != '('
- && c != ')')
- {
- BUF_ADD (c);
- c = getc (current.file);
- }
- BUF_FINISH ();
-
- ungetc (c, current.file);
-
- /* FIXME: Possible memory leak. */
- yylval.string = xstrdup (lex_buf);
- return STRING;
-}
-
-/* Get a number from a string. */
-
-static long
-nlmlex_get_number (const char *s)
-{
- long ret;
- char *send;
-
- ret = strtol (s, &send, 10);
- if (*send != '\0')
- nlmheader_warn (_("bad number"), -1);
- return ret;
-}
-
-/* Prefix the nlmconv warnings with a note as to where they come from.
- We don't use program_name on every warning, because then some
- versions of the emacs next-error function can't recognize the line
- number. */
-
-static void
-nlmheader_identify (void)
-{
- static int done;
-
- if (! done)
- {
- fprintf (stderr, _("%s: problems in NLM command language input:\n"),
- program_name);
- done = 1;
- }
-}
-
-/* Issue a warning. */
-
-static void
-nlmheader_warn (const char *s, int imax)
-{
- nlmheader_identify ();
- fprintf (stderr, "%s:%d: %s", current.name, current.lineno, s);
- if (imax != -1)
- fprintf (stderr, " (max %d)", imax);
- fprintf (stderr, "\n");
-}
-
-/* Report an error. */
-
-static void
-nlmheader_error (const char *s)
-{
- nlmheader_warn (s, -1);
- ++parse_errors;
-}
-
-/* Add a string to a string list. */
-
-static struct string_list *
-string_list_cons (char *s, struct string_list *l)
-{
- struct string_list *ret;
-
- ret = (struct string_list *) xmalloc (sizeof (struct string_list));
- ret->next = l;
- ret->string = s;
- return ret;
-}
-
-/* Append a string list to another string list. */
-
-static struct string_list *
-string_list_append (struct string_list *l1, struct string_list *l2)
-{
- register struct string_list **pp;
-
- for (pp = &l1; *pp != NULL; pp = &(*pp)->next)
- ;
- *pp = l2;
- return l1;
-}
-
-/* Append a string to a string list. */
-
-static struct string_list *
-string_list_append1 (struct string_list *l, char *s)
-{
- struct string_list *n;
- register struct string_list **pp;
-
- n = (struct string_list *) xmalloc (sizeof (struct string_list));
- n->next = NULL;
- n->string = s;
- for (pp = &l; *pp != NULL; pp = &(*pp)->next)
- ;
- *pp = n;
- return l;
-}
-
-/* Duplicate a string in memory. */
-
-static char *
-xstrdup (const char *s)
-{
- unsigned long len;
- char *ret;
-
- len = strlen (s);
- ret = xmalloc (len + 1);
- strcpy (ret, s);
- return ret;
-}
-
diff -Nur binutils-2.24.orig/binutils/nlmheader.h binutils-2.24/binutils/nlmheader.h
--- binutils-2.24.orig/binutils/nlmheader.h 2013-11-18 09:49:30.000000000 +0100
+++ binutils-2.24/binutils/nlmheader.h 1970-01-01 01:00:00.000000000 +0100
@@ -1,135 +0,0 @@
-/* A Bison parser, made by GNU Bison 2.3. */
-
-/* Skeleton interface for Bison's Yacc-like parsers in C
-
- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
- Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA. */
-
-/* As a special exception, you may create a larger work that contains
- part or all of the Bison parser skeleton and distribute that work
- under terms of your choice, so long as that work isn't itself a
- parser generator using the skeleton or a modified version thereof
- as a parser skeleton. Alternatively, if you modify or redistribute
- the parser skeleton itself, you may (at your option) remove this
- special exception, which will cause the skeleton and the resulting
- Bison output files to be licensed under the GNU General Public
- License without this special exception.
-
- This special exception was added by the Free Software Foundation in
- version 2.2 of Bison. */
-
-/* Tokens. */
-#ifndef YYTOKENTYPE
-# define YYTOKENTYPE
- /* Put the tokens into the symbol table, so that GDB and other debuggers
- know about them. */
- enum yytokentype {
- CHECK = 258,
- CODESTART = 259,
- COPYRIGHT = 260,
- CUSTOM = 261,
- DATE = 262,
- DEBUG_K = 263,
- DESCRIPTION = 264,
- EXIT = 265,
- EXPORT = 266,
- FLAG_ON = 267,
- FLAG_OFF = 268,
- FULLMAP = 269,
- HELP = 270,
- IMPORT = 271,
- INPUT = 272,
- MAP = 273,
- MESSAGES = 274,
- MODULE = 275,
- MULTIPLE = 276,
- OS_DOMAIN = 277,
- OUTPUT = 278,
- PSEUDOPREEMPTION = 279,
- REENTRANT = 280,
- SCREENNAME = 281,
- SHARELIB = 282,
- STACK = 283,
- START = 284,
- SYNCHRONIZE = 285,
- THREADNAME = 286,
- TYPE = 287,
- VERBOSE = 288,
- VERSIONK = 289,
- XDCDATA = 290,
- STRING = 291,
- QUOTED_STRING = 292
- };
-#endif
-/* Tokens. */
-#define CHECK 258
-#define CODESTART 259
-#define COPYRIGHT 260
-#define CUSTOM 261
-#define DATE 262
-#define DEBUG_K 263
-#define DESCRIPTION 264
-#define EXIT 265
-#define EXPORT 266
-#define FLAG_ON 267
-#define FLAG_OFF 268
-#define FULLMAP 269
-#define HELP 270
-#define IMPORT 271
-#define INPUT 272
-#define MAP 273
-#define MESSAGES 274
-#define MODULE 275
-#define MULTIPLE 276
-#define OS_DOMAIN 277
-#define OUTPUT 278
-#define PSEUDOPREEMPTION 279
-#define REENTRANT 280
-#define SCREENNAME 281
-#define SHARELIB 282
-#define STACK 283
-#define START 284
-#define SYNCHRONIZE 285
-#define THREADNAME 286
-#define TYPE 287
-#define VERBOSE 288
-#define VERSIONK 289
-#define XDCDATA 290
-#define STRING 291
-#define QUOTED_STRING 292
-
-
-
-
-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-typedef union YYSTYPE
-#line 113 "nlmheader.y"
-{
- char *string;
- struct string_list *list;
-}
-/* Line 1529 of yacc.c. */
-#line 128 "nlmheader.h"
- YYSTYPE;
-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
-# define YYSTYPE_IS_DECLARED 1
-# define YYSTYPE_IS_TRIVIAL 1
-#endif
-
-extern YYSTYPE yylval;
-
diff -Nur binutils-2.24.orig/binutils/po/.cvsignore binutils-2.24/binutils/po/.cvsignore
--- binutils-2.24.orig/binutils/po/.cvsignore 1970-01-01 01:00:00.000000000 +0100
+++ binutils-2.24/binutils/po/.cvsignore 2024-05-17 16:15:39.011345414 +0200
@@ -0,0 +1 @@
+*.gmo
diff -Nur binutils-2.24.orig/binutils/rcparse.c binutils-2.24/binutils/rcparse.c
--- binutils-2.24.orig/binutils/rcparse.c 2013-11-18 09:49:30.000000000 +0100
+++ binutils-2.24/binutils/rcparse.c 1970-01-01 01:00:00.000000000 +0100
@@ -1,4663 +0,0 @@
-/* A Bison parser, made by GNU Bison 2.3. */
-
-/* Skeleton implementation for Bison's Yacc-like parsers in C
-
- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
- Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA. */
-
-/* As a special exception, you may create a larger work that contains
- part or all of the Bison parser skeleton and distribute that work
- under terms of your choice, so long as that work isn't itself a
- parser generator using the skeleton or a modified version thereof
- as a parser skeleton. Alternatively, if you modify or redistribute
- the parser skeleton itself, you may (at your option) remove this
- special exception, which will cause the skeleton and the resulting
- Bison output files to be licensed under the GNU General Public
- License without this special exception.
-
- This special exception was added by the Free Software Foundation in
- version 2.2 of Bison. */
-
-/* C LALR(1) parser skeleton written by Richard Stallman, by
- simplifying the original so-called "semantic" parser. */
-
-/* All symbols defined below should begin with yy or YY, to avoid
- infringing on user name space. This should be done even for local
- variables, as they might otherwise be expanded by user macros.
- There are some unavoidable exceptions within include files to
- define necessary library symbols; they are noted "INFRINGES ON
- USER NAME SPACE" below. */
-
-/* Identify Bison output. */
-#define YYBISON 1
-
-/* Bison version. */
-#define YYBISON_VERSION "2.3"
-
-/* Skeleton name. */
-#define YYSKELETON_NAME "yacc.c"
-
-/* Pure parsers. */
-#define YYPURE 0
-
-/* Using locations. */
-#define YYLSP_NEEDED 0
-
-
-
-/* Tokens. */
-#ifndef YYTOKENTYPE
-# define YYTOKENTYPE
- /* Put the tokens into the symbol table, so that GDB and other debuggers
- know about them. */
- enum yytokentype {
- BEG = 258,
- END = 259,
- ACCELERATORS = 260,
- VIRTKEY = 261,
- ASCII = 262,
- NOINVERT = 263,
- SHIFT = 264,
- CONTROL = 265,
- ALT = 266,
- BITMAP = 267,
- CURSOR = 268,
- DIALOG = 269,
- DIALOGEX = 270,
- EXSTYLE = 271,
- CAPTION = 272,
- CLASS = 273,
- STYLE = 274,
- AUTO3STATE = 275,
- AUTOCHECKBOX = 276,
- AUTORADIOBUTTON = 277,
- CHECKBOX = 278,
- COMBOBOX = 279,
- CTEXT = 280,
- DEFPUSHBUTTON = 281,
- EDITTEXT = 282,
- GROUPBOX = 283,
- LISTBOX = 284,
- LTEXT = 285,
- PUSHBOX = 286,
- PUSHBUTTON = 287,
- RADIOBUTTON = 288,
- RTEXT = 289,
- SCROLLBAR = 290,
- STATE3 = 291,
- USERBUTTON = 292,
- BEDIT = 293,
- HEDIT = 294,
- IEDIT = 295,
- FONT = 296,
- ICON = 297,
- ANICURSOR = 298,
- ANIICON = 299,
- DLGINCLUDE = 300,
- DLGINIT = 301,
- FONTDIR = 302,
- HTML = 303,
- MANIFEST = 304,
- PLUGPLAY = 305,
- VXD = 306,
- TOOLBAR = 307,
- BUTTON = 308,
- LANGUAGE = 309,
- CHARACTERISTICS = 310,
- VERSIONK = 311,
- MENU = 312,
- MENUEX = 313,
- MENUITEM = 314,
- SEPARATOR = 315,
- POPUP = 316,
- CHECKED = 317,
- GRAYED = 318,
- HELP = 319,
- INACTIVE = 320,
- MENUBARBREAK = 321,
- MENUBREAK = 322,
- MESSAGETABLE = 323,
- RCDATA = 324,
- STRINGTABLE = 325,
- VERSIONINFO = 326,
- FILEVERSION = 327,
- PRODUCTVERSION = 328,
- FILEFLAGSMASK = 329,
- FILEFLAGS = 330,
- FILEOS = 331,
- FILETYPE = 332,
- FILESUBTYPE = 333,
- BLOCKSTRINGFILEINFO = 334,
- BLOCKVARFILEINFO = 335,
- VALUE = 336,
- BLOCK = 337,
- MOVEABLE = 338,
- FIXED = 339,
- PURE = 340,
- IMPURE = 341,
- PRELOAD = 342,
- LOADONCALL = 343,
- DISCARDABLE = 344,
- NOT = 345,
- QUOTEDUNISTRING = 346,
- QUOTEDSTRING = 347,
- STRING = 348,
- NUMBER = 349,
- SIZEDUNISTRING = 350,
- SIZEDSTRING = 351,
- IGNORED_TOKEN = 352,
- NEG = 353
- };
-#endif
-/* Tokens. */
-#define BEG 258
-#define END 259
-#define ACCELERATORS 260
-#define VIRTKEY 261
-#define ASCII 262
-#define NOINVERT 263
-#define SHIFT 264
-#define CONTROL 265
-#define ALT 266
-#define BITMAP 267
-#define CURSOR 268
-#define DIALOG 269
-#define DIALOGEX 270
-#define EXSTYLE 271
-#define CAPTION 272
-#define CLASS 273
-#define STYLE 274
-#define AUTO3STATE 275
-#define AUTOCHECKBOX 276
-#define AUTORADIOBUTTON 277
-#define CHECKBOX 278
-#define COMBOBOX 279
-#define CTEXT 280
-#define DEFPUSHBUTTON 281
-#define EDITTEXT 282
-#define GROUPBOX 283
-#define LISTBOX 284
-#define LTEXT 285
-#define PUSHBOX 286
-#define PUSHBUTTON 287
-#define RADIOBUTTON 288
-#define RTEXT 289
-#define SCROLLBAR 290
-#define STATE3 291
-#define USERBUTTON 292
-#define BEDIT 293
-#define HEDIT 294
-#define IEDIT 295
-#define FONT 296
-#define ICON 297
-#define ANICURSOR 298
-#define ANIICON 299
-#define DLGINCLUDE 300
-#define DLGINIT 301
-#define FONTDIR 302
-#define HTML 303
-#define MANIFEST 304
-#define PLUGPLAY 305
-#define VXD 306
-#define TOOLBAR 307
-#define BUTTON 308
-#define LANGUAGE 309
-#define CHARACTERISTICS 310
-#define VERSIONK 311
-#define MENU 312
-#define MENUEX 313
-#define MENUITEM 314
-#define SEPARATOR 315
-#define POPUP 316
-#define CHECKED 317
-#define GRAYED 318
-#define HELP 319
-#define INACTIVE 320
-#define MENUBARBREAK 321
-#define MENUBREAK 322
-#define MESSAGETABLE 323
-#define RCDATA 324
-#define STRINGTABLE 325
-#define VERSIONINFO 326
-#define FILEVERSION 327
-#define PRODUCTVERSION 328
-#define FILEFLAGSMASK 329
-#define FILEFLAGS 330
-#define FILEOS 331
-#define FILETYPE 332
-#define FILESUBTYPE 333
-#define BLOCKSTRINGFILEINFO 334
-#define BLOCKVARFILEINFO 335
-#define VALUE 336
-#define BLOCK 337
-#define MOVEABLE 338
-#define FIXED 339
-#define PURE 340
-#define IMPURE 341
-#define PRELOAD 342
-#define LOADONCALL 343
-#define DISCARDABLE 344
-#define NOT 345
-#define QUOTEDUNISTRING 346
-#define QUOTEDSTRING 347
-#define STRING 348
-#define NUMBER 349
-#define SIZEDUNISTRING 350
-#define SIZEDSTRING 351
-#define IGNORED_TOKEN 352
-#define NEG 353
-
-
-
-
-/* Copy the first part of user declarations. */
-#line 1 "rcparse.y"
- /* rcparse.y -- parser for Windows rc files
- Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2007, 2008,
- 2011 Free Software Foundation, Inc.
- Written by Ian Lance Taylor, Cygnus Support.
- Extended by Kai Tietz, Onevision.
-
- This file is part of GNU Binutils.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
- 02110-1301, USA. */
-
-
-/* This is a parser for Windows rc files. It is based on the parser
- by Gunther Ebert . */
-
-#include "sysdep.h"
-#include "bfd.h"
-#include "bucomm.h"
-#include "libiberty.h"
-#include "windres.h"
-#include "safe-ctype.h"
-
-/* The current language. */
-
-static unsigned short language;
-
-/* The resource information during a sub statement. */
-
-static rc_res_res_info sub_res_info;
-
-/* Dialog information. This is built by the nonterminals styles and
- controls. */
-
-static rc_dialog dialog;
-
-/* This is used when building a style. It is modified by the
- nonterminal styleexpr. */
-
-static unsigned long style;
-
-/* These are used when building a control. They are set before using
- control_params. */
-
-static rc_uint_type base_style;
-static rc_uint_type default_style;
-static rc_res_id class;
-static rc_res_id res_text_field;
-static unichar null_unichar;
-
-/* This is used for COMBOBOX, LISTBOX and EDITTEXT which
- do not allow resource 'text' field in control definition. */
-static const rc_res_id res_null_text = { 1, {{0, &null_unichar}}};
-
-
-
-/* Enabling traces. */
-#ifndef YYDEBUG
-# define YYDEBUG 0
-#endif
-
-/* Enabling verbose error messages. */
-#ifdef YYERROR_VERBOSE
-# undef YYERROR_VERBOSE
-# define YYERROR_VERBOSE 1
-#else
-# define YYERROR_VERBOSE 0
-#endif
-
-/* Enabling the token table. */
-#ifndef YYTOKEN_TABLE
-# define YYTOKEN_TABLE 0
-#endif
-
-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-typedef union YYSTYPE
-#line 69 "rcparse.y"
-{
- rc_accelerator acc;
- rc_accelerator *pacc;
- rc_dialog_control *dialog_control;
- rc_menuitem *menuitem;
- struct
- {
- rc_rcdata_item *first;
- rc_rcdata_item *last;
- } rcdata;
- rc_rcdata_item *rcdata_item;
- rc_fixed_versioninfo *fixver;
- rc_ver_info *verinfo;
- rc_ver_stringtable *verstringtable;
- rc_ver_stringinfo *verstring;
- rc_ver_varinfo *vervar;
- rc_toolbar_item *toobar_item;
- rc_res_id id;
- rc_res_res_info res_info;
- struct
- {
- rc_uint_type on;
- rc_uint_type off;
- } memflags;
- struct
- {
- rc_uint_type val;
- /* Nonzero if this number was explicitly specified as long. */
- int dword;
- } i;
- rc_uint_type il;
- rc_uint_type is;
- const char *s;
- struct
- {
- rc_uint_type length;
- const char *s;
- } ss;
- unichar *uni;
- struct
- {
- rc_uint_type length;
- const unichar *s;
- } suni;
-}
-/* Line 193 of yacc.c. */
-#line 405 "rcparse.c"
- YYSTYPE;
-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
-# define YYSTYPE_IS_DECLARED 1
-# define YYSTYPE_IS_TRIVIAL 1
-#endif
-
-
-
-/* Copy the second part of user declarations. */
-
-
-/* Line 216 of yacc.c. */
-#line 418 "rcparse.c"
-
-#ifdef short
-# undef short
-#endif
-
-#ifdef YYTYPE_UINT8
-typedef YYTYPE_UINT8 yytype_uint8;
-#else
-typedef unsigned char yytype_uint8;
-#endif
-
-#ifdef YYTYPE_INT8
-typedef YYTYPE_INT8 yytype_int8;
-#elif (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-typedef signed char yytype_int8;
-#else
-typedef short int yytype_int8;
-#endif
-
-#ifdef YYTYPE_UINT16
-typedef YYTYPE_UINT16 yytype_uint16;
-#else
-typedef unsigned short int yytype_uint16;
-#endif
-
-#ifdef YYTYPE_INT16
-typedef YYTYPE_INT16 yytype_int16;
-#else
-typedef short int yytype_int16;
-#endif
-
-#ifndef YYSIZE_T
-# ifdef __SIZE_TYPE__
-# define YYSIZE_T __SIZE_TYPE__
-# elif defined size_t
-# define YYSIZE_T size_t
-# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-# include /* INFRINGES ON USER NAME SPACE */
-# define YYSIZE_T size_t
-# else
-# define YYSIZE_T unsigned int
-# endif
-#endif
-
-#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
-
-#ifndef YY_
-# if defined YYENABLE_NLS && YYENABLE_NLS
-# if ENABLE_NLS
-# include /* INFRINGES ON USER NAME SPACE */
-# define YY_(msgid) dgettext ("bison-runtime", msgid)
-# endif
-# endif
-# ifndef YY_
-# define YY_(msgid) msgid
-# endif
-#endif
-
-/* Suppress unused-variable warnings by "using" E. */
-#if ! defined lint || defined __GNUC__
-# define YYUSE(e) ((void) (e))
-#else
-# define YYUSE(e) /* empty */
-#endif
-
-/* Identity function, used to suppress warnings about constant conditions. */
-#ifndef lint
-# define YYID(n) (n)
-#else
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static int
-YYID (int i)
-#else
-static int
-YYID (i)
- int i;
-#endif
-{
- return i;
-}
-#endif
-
-#if ! defined yyoverflow || YYERROR_VERBOSE
-
-/* The parser invokes alloca or malloc; define the necessary symbols. */
-
-# ifdef YYSTACK_USE_ALLOCA
-# if YYSTACK_USE_ALLOCA
-# ifdef __GNUC__
-# define YYSTACK_ALLOC __builtin_alloca
-# elif defined __BUILTIN_VA_ARG_INCR
-# include /* INFRINGES ON USER NAME SPACE */
-# elif defined _AIX
-# define YYSTACK_ALLOC __alloca
-# elif defined _MSC_VER
-# include /* INFRINGES ON USER NAME SPACE */
-# define alloca _alloca
-# else
-# define YYSTACK_ALLOC alloca
-# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-# include /* INFRINGES ON USER NAME SPACE */
-# ifndef _STDLIB_H
-# define _STDLIB_H 1
-# endif
-# endif
-# endif
-# endif
-# endif
-
-# ifdef YYSTACK_ALLOC
- /* Pacify GCC's `empty if-body' warning. */
-# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
-# ifndef YYSTACK_ALLOC_MAXIMUM
- /* The OS might guarantee only one guard page at the bottom of the stack,
- and a page size can be as small as 4096 bytes. So we cannot safely
- invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
- to allow for a few compiler-allocated temporary stack slots. */
-# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
-# endif
-# else
-# define YYSTACK_ALLOC YYMALLOC
-# define YYSTACK_FREE YYFREE
-# ifndef YYSTACK_ALLOC_MAXIMUM
-# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
-# endif
-# if (defined __cplusplus && ! defined _STDLIB_H \
- && ! ((defined YYMALLOC || defined malloc) \
- && (defined YYFREE || defined free)))
-# include /* INFRINGES ON USER NAME SPACE */
-# ifndef _STDLIB_H
-# define _STDLIB_H 1
-# endif
-# endif
-# ifndef YYMALLOC
-# define YYMALLOC malloc
-# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
-# endif
-# endif
-# ifndef YYFREE
-# define YYFREE free
-# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-void free (void *); /* INFRINGES ON USER NAME SPACE */
-# endif
-# endif
-# endif
-#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
-
-
-#if (! defined yyoverflow \
- && (! defined __cplusplus \
- || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
-
-/* A type that is properly aligned for any stack member. */
-union yyalloc
-{
- yytype_int16 yyss;
- YYSTYPE yyvs;
- };
-
-/* The size of the maximum gap between one aligned stack and the next. */
-# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
-
-/* The size of an array large to enough to hold all stacks, each with
- N elements. */
-# define YYSTACK_BYTES(N) \
- ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
- + YYSTACK_GAP_MAXIMUM)
-
-/* Copy COUNT objects from FROM to TO. The source and destination do
- not overlap. */
-# ifndef YYCOPY
-# if defined __GNUC__ && 1 < __GNUC__
-# define YYCOPY(To, From, Count) \
- __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
-# else
-# define YYCOPY(To, From, Count) \
- do \
- { \
- YYSIZE_T yyi; \
- for (yyi = 0; yyi < (Count); yyi++) \
- (To)[yyi] = (From)[yyi]; \
- } \
- while (YYID (0))
-# endif
-# endif
-
-/* Relocate STACK from its old location to the new one. The
- local variables YYSIZE and YYSTACKSIZE give the old and new number of
- elements in the stack, and YYPTR gives the new location of the
- stack. Advance YYPTR to a properly aligned location for the next
- stack. */
-# define YYSTACK_RELOCATE(Stack) \
- do \
- { \
- YYSIZE_T yynewbytes; \
- YYCOPY (&yyptr->Stack, Stack, yysize); \
- Stack = &yyptr->Stack; \
- yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
- yyptr += yynewbytes / sizeof (*yyptr); \
- } \
- while (YYID (0))
-
-#endif
-
-/* YYFINAL -- State number of the termination state. */
-#define YYFINAL 2
-/* YYLAST -- Last index in YYTABLE. */
-#define YYLAST 830
-
-/* YYNTOKENS -- Number of terminals. */
-#define YYNTOKENS 112
-/* YYNNTS -- Number of nonterminals. */
-#define YYNNTS 102
-/* YYNRULES -- Number of rules. */
-#define YYNRULES 276
-/* YYNRULES -- Number of states. */
-#define YYNSTATES 520
-
-/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
-#define YYUNDEFTOK 2
-#define YYMAXUTOK 353
-
-#define YYTRANSLATE(YYX) \
- ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
-
-/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */
-static const yytype_uint8 yytranslate[] =
-{
- 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 105, 100, 2,
- 110, 111, 103, 101, 108, 102, 2, 104, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 109, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 99, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 98, 2, 106, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
- 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
- 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
- 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
- 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
- 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
- 65, 66, 67, 68, 69, 70, 71, 72, 73, 74,
- 75, 76, 77, 78, 79, 80, 81, 82, 83, 84,
- 85, 86, 87, 88, 89, 90, 91, 92, 93, 94,
- 95, 96, 97, 107
-};
-
-#if YYDEBUG
-/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
- YYRHS. */
-static const yytype_uint16 yyprhs[] =
-{
- 0, 0, 3, 4, 7, 10, 13, 16, 19, 22,
- 25, 28, 31, 34, 37, 40, 43, 46, 49, 56,
- 57, 60, 63, 68, 70, 72, 74, 78, 81, 83,
- 85, 87, 89, 91, 93, 98, 103, 104, 118, 119,
- 133, 134, 149, 150, 154, 155, 159, 163, 167, 171,
- 175, 181, 188, 196, 205, 209, 213, 218, 222, 223,
- 226, 227, 232, 233, 238, 239, 244, 245, 250, 251,
- 256, 257, 261, 273, 286, 287, 292, 293, 298, 299,
- 303, 304, 309, 310, 315, 322, 331, 342, 354, 355,
- 360, 361, 365, 366, 371, 372, 377, 378, 383, 384,
- 389, 390, 395, 396, 400, 401, 406, 407, 423, 430,
- 439, 449, 452, 453, 456, 458, 460, 461, 465, 466,
- 470, 471, 475, 476, 480, 485, 490, 494, 501, 502,
- 505, 510, 513, 520, 521, 525, 528, 530, 532, 534,
- 536, 538, 540, 547, 548, 551, 554, 558, 564, 567,
- 573, 580, 588, 598, 603, 604, 607, 608, 610, 612,
- 614, 616, 620, 624, 628, 631, 632, 639, 640, 644,
- 649, 652, 654, 656, 658, 660, 662, 664, 666, 668,
- 670, 672, 679, 684, 693, 694, 698, 701, 708, 709,
- 716, 723, 727, 731, 735, 739, 743, 744, 750, 758,
- 759, 765, 766, 772, 773, 777, 779, 781, 783, 785,
- 788, 790, 793, 794, 797, 801, 806, 810, 811, 814,
- 815, 818, 820, 822, 824, 826, 828, 830, 832, 834,
- 836, 838, 841, 843, 845, 847, 849, 851, 854, 856,
- 859, 861, 864, 866, 869, 873, 878, 880, 884, 885,
- 887, 890, 892, 894, 898, 901, 904, 908, 912, 916,
- 920, 924, 928, 932, 936, 939, 941, 943, 947, 950,
- 954, 958, 962, 966, 970, 974, 978
-};
-
-/* YYRHS -- A `-1'-separated list of the rules' RHS. */
-static const yytype_int16 yyrhs[] =
-{
- 113, 0, -1, -1, 113, 114, -1, 113, 120, -1,
- 113, 121, -1, 113, 122, -1, 113, 162, -1, 113,
- 163, -1, 113, 164, -1, 113, 165, -1, 113, 170,
- -1, 113, 173, -1, 113, 178, -1, 113, 183, -1,
- 113, 182, -1, 113, 185, -1, 113, 97, -1, 191,
- 5, 194, 3, 115, 4, -1, -1, 115, 116, -1,
- 117, 211, -1, 117, 211, 108, 118, -1, 92, -1,
- 212, -1, 119, -1, 118, 108, 119, -1, 118, 119,
- -1, 6, -1, 7, -1, 8, -1, 9, -1, 10,
- -1, 11, -1, 191, 12, 196, 198, -1, 191, 13,
- 195, 198, -1, -1, 191, 14, 196, 126, 212, 208,
- 208, 208, 123, 127, 3, 128, 4, -1, -1, 191,
- 15, 196, 126, 212, 208, 208, 208, 124, 127, 3,
- 128, 4, -1, -1, 191, 15, 196, 126, 212, 208,
- 208, 208, 208, 125, 127, 3, 128, 4, -1, -1,
- 16, 109, 209, -1, -1, 127, 17, 199, -1, 127,
- 18, 191, -1, 127, 19, 205, -1, 127, 16, 209,
- -1, 127, 18, 199, -1, 127, 41, 209, 108, 199,
- -1, 127, 41, 209, 108, 199, 208, -1, 127, 41,
- 209, 108, 199, 208, 208, -1, 127, 41, 209, 108,
- 199, 208, 208, 208, -1, 127, 57, 191, -1, 127,
- 55, 209, -1, 127, 54, 209, 208, -1, 127, 56,
- 209, -1, -1, 128, 129, -1, -1, 20, 153, 130,
- 151, -1, -1, 21, 153, 131, 151, -1, -1, 22,
- 153, 132, 151, -1, -1, 38, 153, 133, 151, -1,
- -1, 23, 153, 134, 151, -1, -1, 24, 135, 151,
- -1, 10, 153, 209, 152, 156, 208, 208, 208, 208,
- 207, 155, -1, 10, 153, 209, 152, 156, 208, 208,
- 208, 208, 208, 208, 155, -1, -1, 25, 153, 136,
- 151, -1, -1, 26, 153, 137, 151, -1, -1, 27,
- 138, 151, -1, -1, 28, 153, 139, 151, -1, -1,
- 39, 153, 140, 151, -1, 42, 193, 209, 208, 208,
- 155, -1, 42, 193, 209, 208, 208, 208, 208, 155,
- -1, 42, 193, 209, 208, 208, 208, 208, 158, 207,
- 155, -1, 42, 193, 209, 208, 208, 208, 208, 158,
- 208, 208, 155, -1, -1, 40, 153, 141, 151, -1,
- -1, 29, 142, 151, -1, -1, 30, 153, 143, 151,
- -1, -1, 31, 153, 144, 151, -1, -1, 32, 153,
- 145, 151, -1, -1, 33, 153, 146, 151, -1, -1,
- 34, 153, 147, 151, -1, -1, 35, 148, 151, -1,
- -1, 36, 153, 149, 151, -1, -1, 37, 193, 209,
- 108, 209, 108, 209, 108, 209, 108, 209, 108, 150,
- 205, 207, -1, 209, 208, 208, 208, 208, 155, -1,
- 209, 208, 208, 208, 208, 160, 207, 155, -1, 209,
- 208, 208, 208, 208, 160, 208, 208, 155, -1, 108,
- 154, -1, -1, 154, 108, -1, 212, -1, 199, -1,
- -1, 3, 174, 4, -1, -1, 108, 157, 205, -1,
- -1, 108, 159, 205, -1, -1, 108, 161, 205, -1,
- 191, 41, 195, 198, -1, 191, 42, 195, 198, -1,
- 54, 209, 208, -1, 191, 57, 194, 3, 166, 4,
- -1, -1, 166, 167, -1, 59, 199, 208, 168, -1,
- 59, 60, -1, 61, 199, 168, 3, 166, 4, -1,
- -1, 168, 108, 169, -1, 168, 169, -1, 62, -1,
- 63, -1, 64, -1, 65, -1, 66, -1, 67, -1,
- 191, 58, 194, 3, 171, 4, -1, -1, 171, 172,
- -1, 59, 199, -1, 59, 199, 208, -1, 59, 199,
- 208, 208, 207, -1, 59, 60, -1, 61, 199, 3,
- 171, 4, -1, 61, 199, 208, 3, 171, 4, -1,
- 61, 199, 208, 208, 3, 171, 4, -1, 61, 199,
- 208, 208, 208, 207, 3, 171, 4, -1, 191, 68,
- 196, 198, -1, -1, 175, 176, -1, -1, 177, -1,
- 203, -1, 204, -1, 210, -1, 177, 108, 203, -1,
- 177, 108, 204, -1, 177, 108, 210, -1, 177, 108,
- -1, -1, 70, 194, 3, 179, 180, 4, -1, -1,
- 180, 209, 202, -1, 180, 209, 108, 202, -1, 180,
- 1, -1, 191, -1, 48, -1, 69, -1, 49, -1,
- 50, -1, 51, -1, 45, -1, 46, -1, 43, -1,
- 44, -1, 191, 181, 194, 3, 174, 4, -1, 191,
- 181, 194, 198, -1, 191, 52, 194, 209, 208, 3,
- 184, 4, -1, -1, 184, 53, 191, -1, 184, 60,
- -1, 191, 71, 186, 3, 187, 4, -1, -1, 186,
- 72, 209, 207, 207, 207, -1, 186, 73, 209, 207,
- 207, 207, -1, 186, 74, 209, -1, 186, 75, 209,
- -1, 186, 76, 209, -1, 186, 77, 209, -1, 186,
- 78, 209, -1, -1, 187, 79, 3, 188, 4, -1,
- 187, 80, 3, 81, 199, 190, 4, -1, -1, 188,
- 82, 3, 189, 4, -1, -1, 189, 81, 199, 108,
- 199, -1, -1, 190, 208, 208, -1, 212, -1, 192,
- -1, 200, -1, 93, -1, 212, 108, -1, 192, -1,
- 192, 108, -1, -1, 194, 197, -1, 194, 55, 209,
- -1, 194, 54, 209, 208, -1, 194, 56, 209, -1,
- -1, 195, 197, -1, -1, 196, 197, -1, 83, -1,
- 84, -1, 85, -1, 86, -1, 87, -1, 88, -1,
- 89, -1, 92, -1, 93, -1, 200, -1, 199, 200,
- -1, 91, -1, 92, -1, 204, -1, 203, -1, 201,
- -1, 202, 201, -1, 96, -1, 203, 96, -1, 95,
- -1, 204, 95, -1, 206, -1, 90, 206, -1, 205,
- 98, 206, -1, 205, 98, 90, 206, -1, 94, -1,
- 110, 209, 111, -1, -1, 208, -1, 108, 209, -1,
- 210, -1, 94, -1, 110, 210, 111, -1, 106, 210,
- -1, 102, 210, -1, 210, 103, 210, -1, 210, 104,
- 210, -1, 210, 105, 210, -1, 210, 101, 210, -1,
- 210, 102, 210, -1, 210, 100, 210, -1, 210, 99,
- 210, -1, 210, 98, 210, -1, 108, 212, -1, 213,
- -1, 94, -1, 110, 210, 111, -1, 106, 210, -1,
- 213, 103, 210, -1, 213, 104, 210, -1, 213, 105,
- 210, -1, 213, 101, 210, -1, 213, 102, 210, -1,
- 213, 100, 210, -1, 213, 99, 210, -1, 213, 98,
- 210, -1
-};
-
-/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
-static const yytype_uint16 yyrline[] =
-{
- 0, 179, 179, 181, 182, 183, 184, 185, 186, 187,
- 188, 189, 190, 191, 192, 193, 194, 195, 201, 212,
- 215, 236, 241, 253, 273, 283, 287, 292, 299, 303,
- 308, 312, 316, 320, 329, 341, 355, 353, 380, 378,
- 407, 405, 437, 440, 446, 448, 454, 458, 463, 467,
- 471, 484, 499, 514, 529, 533, 537, 541, 547, 549,
- 561, 560, 573, 572, 585, 584, 597, 596, 612, 611,
- 624, 623, 637, 648, 658, 657, 670, 669, 682, 681,
- 694, 693, 706, 705, 720, 725, 731, 737, 744, 743,
- 759, 758, 771, 770, 783, 782, 794, 793, 806, 805,
- 818, 817, 830, 829, 842, 841, 855, 853, 874, 885,
- 896, 908, 919, 922, 926, 931, 941, 944, 954, 953,
- 960, 959, 966, 965, 973, 985, 998, 1007, 1018, 1021,
- 1038, 1042, 1046, 1054, 1057, 1061, 1068, 1072, 1076, 1080,
- 1084, 1088, 1097, 1108, 1111, 1128, 1132, 1136, 1140, 1144,
- 1148, 1152, 1156, 1166, 1179, 1179, 1191, 1195, 1202, 1210,
- 1218, 1226, 1235, 1244, 1253, 1263, 1262, 1267, 1269, 1274,
- 1279, 1287, 1291, 1296, 1301, 1306, 1311, 1316, 1321, 1326,
- 1331, 1342, 1349, 1359, 1365, 1366, 1385, 1410, 1421, 1426,
- 1433, 1440, 1445, 1450, 1455, 1460, 1475, 1478, 1482, 1490,
- 1493, 1501, 1504, 1512, 1515, 1524, 1529, 1538, 1542, 1552,
- 1557, 1561, 1572, 1578, 1584, 1589, 1594, 1605, 1610, 1622,
- 1627, 1639, 1644, 1649, 1654, 1659, 1664, 1669, 1679, 1683,
- 1691, 1696, 1711, 1715, 1724, 1728, 1740, 1745, 1761, 1765,
- 1777, 1781, 1803, 1807, 1811, 1815, 1822, 1826, 1836, 1839,
- 1848, 1857, 1866, 1870, 1874, 1879, 1884, 1889, 1894, 1899,
- 1904, 1909, 1914, 1919, 1930, 1939, 1950, 1954, 1958, 1963,
- 1968, 1973, 1978, 1983, 1988, 1993, 1998
-};
-#endif
-
-#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
-/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
- First, the terminals, then, starting at YYNTOKENS, nonterminals. */
-static const char *const yytname[] =
-{
- "$end", "error", "$undefined", "BEG", "END", "ACCELERATORS", "VIRTKEY",
- "ASCII", "NOINVERT", "SHIFT", "CONTROL", "ALT", "BITMAP", "CURSOR",
- "DIALOG", "DIALOGEX", "EXSTYLE", "CAPTION", "CLASS", "STYLE",
- "AUTO3STATE", "AUTOCHECKBOX", "AUTORADIOBUTTON", "CHECKBOX", "COMBOBOX",
- "CTEXT", "DEFPUSHBUTTON", "EDITTEXT", "GROUPBOX", "LISTBOX", "LTEXT",
- "PUSHBOX", "PUSHBUTTON", "RADIOBUTTON", "RTEXT", "SCROLLBAR", "STATE3",
- "USERBUTTON", "BEDIT", "HEDIT", "IEDIT", "FONT", "ICON", "ANICURSOR",
- "ANIICON", "DLGINCLUDE", "DLGINIT", "FONTDIR", "HTML", "MANIFEST",
- "PLUGPLAY", "VXD", "TOOLBAR", "BUTTON", "LANGUAGE", "CHARACTERISTICS",
- "VERSIONK", "MENU", "MENUEX", "MENUITEM", "SEPARATOR", "POPUP",
- "CHECKED", "GRAYED", "HELP", "INACTIVE", "MENUBARBREAK", "MENUBREAK",
- "MESSAGETABLE", "RCDATA", "STRINGTABLE", "VERSIONINFO", "FILEVERSION",
- "PRODUCTVERSION", "FILEFLAGSMASK", "FILEFLAGS", "FILEOS", "FILETYPE",
- "FILESUBTYPE", "BLOCKSTRINGFILEINFO", "BLOCKVARFILEINFO", "VALUE",
- "BLOCK", "MOVEABLE", "FIXED", "PURE", "IMPURE", "PRELOAD", "LOADONCALL",
- "DISCARDABLE", "NOT", "QUOTEDUNISTRING", "QUOTEDSTRING", "STRING",
- "NUMBER", "SIZEDUNISTRING", "SIZEDSTRING", "IGNORED_TOKEN", "'|'", "'^'",
- "'&'", "'+'", "'-'", "'*'", "'/'", "'%'", "'~'", "NEG", "','", "'='",
- "'('", "')'", "$accept", "input", "accelerator", "acc_entries",
- "acc_entry", "acc_event", "acc_options", "acc_option", "bitmap",
- "cursor", "dialog", "@1", "@2", "@3", "exstyle", "styles", "controls",
- "control", "@4", "@5", "@6", "@7", "@8", "@9", "@10", "@11", "@12",
- "@13", "@14", "@15", "@16", "@17", "@18", "@19", "@20", "@21", "@22",
- "@23", "@24", "control_params", "cresid", "optresidc", "resid",
- "opt_control_data", "control_styleexpr", "@25", "icon_styleexpr", "@26",
- "control_params_styleexpr", "@27", "font", "icon", "language", "menu",
- "menuitems", "menuitem", "menuitem_flags", "menuitem_flag", "menuex",
- "menuexitems", "menuexitem", "messagetable", "optrcdata_data", "@28",
- "optrcdata_data_int", "rcdata_data", "stringtable", "@29", "string_data",
- "rcdata_id", "user", "toolbar", "toolbar_data", "versioninfo",
- "fixedverinfo", "verblocks", "verstringtables", "vervals", "vertrans",
- "id", "resname", "resref", "suboptions", "memflags_move_discard",
- "memflags_move", "memflag", "file_name", "res_unicode_string_concat",
- "res_unicode_string", "res_unicode_sizedstring",
- "res_unicode_sizedstring_concat", "sizedstring", "sizedunistring",
- "styleexpr", "parennumber", "optcnumexpr", "cnumexpr", "numexpr",
- "sizednumexpr", "cposnumexpr", "posnumexpr", "sizedposnumexpr", 0
-};
-#endif
-
-# ifdef YYPRINT
-/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
- token YYLEX-NUM. */
-static const yytype_uint16 yytoknum[] =
-{
- 0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
- 265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
- 275, 276, 277, 278, 279, 280, 281, 282, 283, 284,
- 285, 286, 287, 288, 289, 290, 291, 292, 293, 294,
- 295, 296, 297, 298, 299, 300, 301, 302, 303, 304,
- 305, 306, 307, 308, 309, 310, 311, 312, 313, 314,
- 315, 316, 317, 318, 319, 320, 321, 322, 323, 324,
- 325, 326, 327, 328, 329, 330, 331, 332, 333, 334,
- 335, 336, 337, 338, 339, 340, 341, 342, 343, 344,
- 345, 346, 347, 348, 349, 350, 351, 352, 124, 94,
- 38, 43, 45, 42, 47, 37, 126, 353, 44, 61,
- 40, 41
-};
-# endif
-
-/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
-static const yytype_uint8 yyr1[] =
-{
- 0, 112, 113, 113, 113, 113, 113, 113, 113, 113,
- 113, 113, 113, 113, 113, 113, 113, 113, 114, 115,
- 115, 116, 116, 117, 117, 118, 118, 118, 119, 119,
- 119, 119, 119, 119, 120, 121, 123, 122, 124, 122,
- 125, 122, 126, 126, 127, 127, 127, 127, 127, 127,
- 127, 127, 127, 127, 127, 127, 127, 127, 128, 128,
- 130, 129, 131, 129, 132, 129, 133, 129, 134, 129,
- 135, 129, 129, 129, 136, 129, 137, 129, 138, 129,
- 139, 129, 140, 129, 129, 129, 129, 129, 141, 129,
- 142, 129, 143, 129, 144, 129, 145, 129, 146, 129,
- 147, 129, 148, 129, 149, 129, 150, 129, 151, 151,
- 151, 152, 153, 153, 154, 154, 155, 155, 157, 156,
- 159, 158, 161, 160, 162, 163, 164, 165, 166, 166,
- 167, 167, 167, 168, 168, 168, 169, 169, 169, 169,
- 169, 169, 170, 171, 171, 172, 172, 172, 172, 172,
- 172, 172, 172, 173, 175, 174, 176, 176, 177, 177,
- 177, 177, 177, 177, 177, 179, 178, 180, 180, 180,
- 180, 181, 181, 181, 181, 181, 181, 181, 181, 181,
- 181, 182, 182, 183, 184, 184, 184, 185, 186, 186,
- 186, 186, 186, 186, 186, 186, 187, 187, 187, 188,
- 188, 189, 189, 190, 190, 191, 191, 192, 192, 193,
- 193, 193, 194, 194, 194, 194, 194, 195, 195, 196,
- 196, 197, 197, 197, 197, 197, 197, 197, 198, 198,
- 199, 199, 200, 200, 201, 201, 202, 202, 203, 203,
- 204, 204, 205, 205, 205, 205, 206, 206, 207, 207,
- 208, 209, 210, 210, 210, 210, 210, 210, 210, 210,
- 210, 210, 210, 210, 211, 212, 213, 213, 213, 213,
- 213, 213, 213, 213, 213, 213, 213
-};
-
-/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
-static const yytype_uint8 yyr2[] =
-{
- 0, 2, 0, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 6, 0,
- 2, 2, 4, 1, 1, 1, 3, 2, 1, 1,
- 1, 1, 1, 1, 4, 4, 0, 13, 0, 13,
- 0, 14, 0, 3, 0, 3, 3, 3, 3, 3,
- 5, 6, 7, 8, 3, 3, 4, 3, 0, 2,
- 0, 4, 0, 4, 0, 4, 0, 4, 0, 4,
- 0, 3, 11, 12, 0, 4, 0, 4, 0, 3,
- 0, 4, 0, 4, 6, 8, 10, 11, 0, 4,
- 0, 3, 0, 4, 0, 4, 0, 4, 0, 4,
- 0, 4, 0, 3, 0, 4, 0, 15, 6, 8,
- 9, 2, 0, 2, 1, 1, 0, 3, 0, 3,
- 0, 3, 0, 3, 4, 4, 3, 6, 0, 2,
- 4, 2, 6, 0, 3, 2, 1, 1, 1, 1,
- 1, 1, 6, 0, 2, 2, 3, 5, 2, 5,
- 6, 7, 9, 4, 0, 2, 0, 1, 1, 1,
- 1, 3, 3, 3, 2, 0, 6, 0, 3, 4,
- 2, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 6, 4, 8, 0, 3, 2, 6, 0, 6,
- 6, 3, 3, 3, 3, 3, 0, 5, 7, 0,
- 5, 0, 5, 0, 3, 1, 1, 1, 1, 2,
- 1, 2, 0, 2, 3, 4, 3, 0, 2, 0,
- 2, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 2, 1, 1, 1, 1, 1, 2, 1, 2,
- 1, 2, 1, 2, 3, 4, 1, 3, 0, 1,
- 2, 1, 1, 3, 2, 2, 3, 3, 3, 3,
- 3, 3, 3, 3, 2, 1, 1, 3, 2, 3,
- 3, 3, 3, 3, 3, 3, 3
-};
-
-/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
- STATE-NUM when YYTABLE doesn't specify something else to do. Zero
- means the default is an error. */
-static const yytype_uint16 yydefact[] =
-{
- 2, 0, 1, 0, 212, 232, 233, 208, 266, 17,
- 0, 0, 3, 4, 5, 6, 7, 8, 9, 10,
- 11, 12, 13, 15, 14, 16, 0, 206, 207, 205,
- 265, 252, 0, 0, 0, 0, 251, 0, 268, 0,
- 212, 219, 217, 219, 219, 217, 217, 179, 180, 177,
- 178, 172, 174, 175, 176, 212, 212, 212, 219, 173,
- 188, 212, 171, 0, 0, 0, 0, 0, 0, 0,
- 0, 255, 254, 0, 0, 126, 0, 0, 0, 0,
- 0, 0, 0, 0, 165, 0, 0, 0, 221, 222,
- 223, 224, 225, 226, 227, 213, 267, 0, 0, 0,
- 42, 42, 0, 0, 0, 0, 0, 0, 0, 0,
- 276, 275, 274, 272, 273, 269, 270, 271, 253, 250,
- 263, 262, 261, 259, 260, 256, 257, 258, 167, 0,
- 214, 216, 19, 228, 229, 220, 34, 218, 35, 0,
- 0, 0, 124, 125, 0, 128, 143, 153, 196, 0,
- 0, 0, 0, 0, 0, 0, 154, 182, 0, 215,
- 0, 0, 0, 0, 0, 0, 0, 0, 248, 248,
- 191, 192, 193, 194, 195, 0, 156, 170, 166, 0,
- 18, 23, 20, 0, 24, 43, 0, 0, 184, 127,
- 0, 0, 129, 142, 0, 0, 144, 187, 0, 0,
- 248, 249, 248, 181, 240, 238, 155, 157, 158, 159,
- 160, 0, 236, 168, 235, 234, 0, 21, 0, 0,
- 0, 131, 0, 230, 133, 148, 145, 0, 199, 0,
- 248, 248, 164, 239, 241, 169, 237, 264, 0, 36,
- 38, 183, 0, 186, 231, 133, 0, 146, 143, 0,
- 0, 0, 189, 190, 161, 162, 163, 28, 29, 30,
- 31, 32, 33, 22, 25, 44, 44, 40, 185, 130,
- 128, 136, 137, 138, 139, 140, 141, 0, 135, 248,
- 0, 143, 0, 197, 0, 203, 0, 27, 0, 0,
- 44, 0, 134, 147, 149, 0, 143, 248, 201, 0,
- 26, 58, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 58, 0, 132, 150, 0, 0, 0, 198, 0,
- 0, 48, 45, 46, 49, 207, 0, 246, 0, 47,
- 242, 0, 0, 55, 57, 54, 0, 58, 151, 143,
- 200, 0, 204, 37, 112, 112, 112, 112, 112, 70,
- 112, 112, 78, 112, 90, 112, 112, 112, 112, 112,
- 102, 112, 0, 112, 112, 112, 0, 59, 243, 0,
- 0, 0, 56, 39, 0, 0, 0, 0, 0, 115,
- 114, 60, 62, 64, 68, 0, 74, 76, 0, 80,
- 0, 92, 94, 96, 98, 100, 0, 104, 210, 0,
- 0, 66, 82, 88, 0, 247, 0, 244, 50, 41,
- 152, 0, 0, 113, 0, 0, 0, 0, 71, 0,
- 0, 0, 79, 0, 91, 0, 0, 0, 0, 0,
- 103, 0, 211, 0, 209, 0, 0, 0, 0, 245,
- 51, 202, 0, 0, 61, 63, 65, 69, 0, 75,
- 77, 81, 93, 95, 97, 99, 101, 105, 0, 67,
- 83, 89, 0, 52, 111, 118, 0, 0, 0, 116,
- 53, 0, 0, 0, 0, 154, 84, 0, 119, 0,
- 116, 0, 0, 116, 0, 122, 108, 248, 0, 117,
- 120, 85, 248, 248, 0, 116, 249, 0, 0, 116,
- 249, 116, 249, 123, 109, 116, 0, 121, 86, 116,
- 72, 116, 110, 0, 87, 73, 106, 0, 248, 107
-};
-
-/* YYDEFGOTO[NTERM-NUM]. */
-static const yytype_int16 yydefgoto[] =
-{
- -1, 1, 12, 160, 182, 183, 263, 264, 13, 14,
- 15, 265, 266, 290, 140, 288, 320, 367, 414, 415,
- 416, 435, 417, 385, 420, 421, 388, 423, 436, 437,
- 390, 425, 426, 427, 428, 429, 396, 431, 517, 418,
- 443, 377, 378, 476, 466, 471, 492, 498, 487, 494,
- 16, 17, 18, 19, 165, 192, 246, 278, 20, 166,
- 196, 21, 175, 176, 206, 207, 22, 128, 158, 61,
- 23, 24, 220, 25, 108, 167, 250, 317, 299, 26,
- 27, 399, 37, 99, 98, 95, 136, 379, 223, 212,
- 213, 214, 215, 329, 330, 200, 201, 419, 36, 217,
- 380, 30
-};
-
-/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
- STATE-NUM. */
-#define YYPACT_NINF -446
-static const yytype_int16 yypact[] =
-{
- -446, 75, -446, 317, -446, -446, -446, -446, -446, -446,
- 317, 317, -446, -446, -446, -446, -446, -446, -446, -446,
- -446, -446, -446, -446, -446, -446, 463, -446, -446, -446,
- 589, -446, 317, 317, 317, -93, 626, 209, -446, 437,
- -446, -446, -446, -446, -446, -446, -446, -446, -446, -446,
- -446, -446, -446, -446, -446, -446, -446, -446, -446, -446,
- -446, -446, -446, 317, 317, 317, 317, 317, 317, 317,
- 317, -446, -446, 526, 317, -446, 317, 317, 317, 317,
- 317, 317, 317, 317, -446, 317, 317, 317, -446, -446,
- -446, -446, -446, -446, -446, -446, -446, 267, 675, 675,
- 275, 275, 675, 675, 491, 404, 441, 675, 168, 256,
- 719, 379, 397, 213, 213, -446, -446, -446, -446, -446,
- 719, 379, 397, 213, 213, -446, -446, -446, -446, -93,
- -446, -446, -446, -446, -446, -446, -446, -446, -446, -65,
- 144, 144, -446, -446, -93, -446, -446, -446, -446, 317,
- 317, 317, 317, 317, 317, 317, -446, -446, 18, -446,
- 21, 317, -93, -93, 31, 140, 155, 126, -93, -93,
- -446, -446, -446, -446, -446, 47, 177, -446, -446, 212,
- -446, -446, -446, -34, -446, -446, -93, -93, -446, -446,
- -36, -5, -446, -446, -25, -5, -446, -446, 119, 131,
- -93, -446, -93, -446, -446, -446, -446, 54, 68, 84,
- 626, 2, -446, 2, 68, 84, 144, 87, -93, -93,
- 25, -446, 95, -446, -5, -446, 95, 62, -446, 102,
- -93, -93, 177, -446, -446, 2, -446, -446, 552, -446,
- -93, -446, 306, -446, -446, -446, 76, -93, -446, 8,
- 6, -5, -446, -446, 68, 84, 626, -446, -446, -446,
- -446, -446, -446, 167, -446, -446, -446, -446, -446, 271,
- -446, -446, -446, -446, -446, -446, -446, 763, -446, -93,
- 161, -446, 11, -446, 197, -5, 552, -446, 374, 548,
- -446, 178, -446, -446, -446, 190, -446, -93, -446, 3,
- -446, -446, 317, -5, 306, -47, 317, 317, 317, 317,
- 306, -446, 565, -446, -446, 194, 201, -1, -446, -93,
- 639, -446, -5, -446, -5, 143, -33, -446, 317, 110,
- -446, 105, -93, -446, -446, -446, 676, -446, -446, -446,
- -446, -5, -446, -446, 311, 311, 311, 311, 311, -446,
- 311, 311, -446, 311, -446, 311, 311, 311, 311, 311,
- -446, 311, 306, 311, 311, 311, 306, -446, -446, 104,
- -42, -5, -446, -446, 713, 207, 99, 317, 113, -5,
- -446, -446, -446, -446, -446, 317, -446, -446, 317, -446,
- 317, -446, -446, -446, -446, -446, 317, -446, 115, 317,
- 120, -446, -446, -446, 317, -446, -33, -446, 95, -446,
- -446, -5, 152, -446, 317, 317, 317, 317, -446, -93,
- 317, 317, -446, 317, -446, 317, 317, 317, 317, 317,
- -446, 317, -446, 153, -446, 317, 317, 317, -93, -446,
- -93, -5, 311, 159, -446, -446, -446, -446, -93, -446,
- -446, -446, -446, -446, -446, -446, -446, -446, 317, -446,
- -446, -446, -93, -93, -446, -446, -93, -93, 173, 15,
- -446, -47, -93, -93, 317, -446, -446, -93, 110, -93,
- 27, 180, 244, 29, -93, -446, -446, -93, 317, -446,
- -446, -446, -93, -93, -47, 273, -93, 192, -47, 273,
- -93, 273, -93, 110, -446, 273, 317, 110, -446, 273,
- -446, 273, -446, 193, -446, -446, -446, -47, -75, -446
-};
-
-/* YYPGOTO[NTERM-NUM]. */
-static const yytype_int16 yypgoto[] =
-{
- -446, -446, -446, -446, -446, -446, -446, -236, -446, -446,
- -446, -446, -446, -446, 184, -262, -273, -446, -446, -446,
- -446, -446, -446, -446, -446, -446, -446, -446, -446, -446,
- -446, -446, -446, -446, -446, -446, -446, -446, -446, 219,
- -446, 442, -123, 274, -446, -446, -446, -446, -446, -446,
- -446, -446, -446, -446, 77, -446, 101, 88, -446, -239,
- -446, -446, -109, -446, -446, -446, -446, -446, -446, -446,
- -446, -446, -446, -446, -446, -446, -446, -446, -446, -24,
- -245, 4, 169, 211, 270, 710, 175, -178, 5, -173,
- 157, -156, -122, -445, -325, -161, -30, -3, 26, -446,
- 20, -446
-};
-
-/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
- positive, shift that token. If negative, reduce the rule which
- number is the opposite. If zero, do what YYDEFACT says.
- If YYTABLE_NINF, syntax error. */
-#define YYTABLE_NINF -231
-static const yytype_int16 yytable[] =
-{
- 35, 368, 62, 340, 289, 75, 28, 318, 202, 280,
- 283, 281, 222, 224, 296, 74, 226, 227, 475, 177,
- 208, 29, 178, 370, 221, 180, 478, 287, 312, 241,
- 475, 28, 475, 74, 188, 225, 38, 39, 336, 230,
- 236, 231, 295, 326, 161, 407, 29, 327, 406, 503,
- 300, 203, 327, 507, 209, 5, 6, 315, 71, 72,
- 73, 327, 236, 328, 374, 248, 5, 6, 328, 252,
- 253, 119, 518, 285, 216, 2, 254, 328, 242, 270,
- 341, 439, 129, 130, 131, 243, 5, 6, 284, 110,
- 111, 112, 113, 114, 115, 116, 117, 204, 205, 159,
- 375, 144, 120, 121, 122, 123, 124, 125, 126, 127,
- 255, 74, 31, 181, 164, 8, 74, 398, 293, 74,
- 32, 398, 228, 74, 33, 322, 324, 10, 34, 3,
- 197, 11, 186, 187, 229, 485, 316, 490, 271, 272,
- 273, 274, 275, 276, 189, 4, 168, 169, 170, 171,
- 172, 173, 174, 5, 6, 179, 218, 219, 185, 193,
- 162, 163, 232, 376, 233, 294, 5, 6, 7, 8,
- 74, 148, 9, 257, 258, 259, 260, 261, 262, 234,
- 184, 10, 313, 251, 277, 11, 5, 6, 239, 240,
- 5, 6, 245, 408, 314, 238, 247, 249, 338, 190,
- 298, 191, 210, 74, 339, 198, 199, 411, 370, 97,
- 267, 410, 84, 371, 194, 405, 195, 279, 268, 282,
- 194, 413, 195, 432, 104, 105, 106, 244, 434, 244,
- 109, 244, 244, 441, -230, -230, 237, 190, 8, 191,
- 149, 150, 151, 152, 153, 154, 155, 28, 489, 194,
- 10, 195, 297, 194, 11, 195, 102, 103, 256, 156,
- 442, 458, 29, 85, 86, 87, 194, 465, 195, 319,
- 132, 31, 204, 205, 138, 286, 475, 142, 143, 32,
- 323, 474, 147, 33, 157, 141, 335, 34, 488, 342,
- 244, 139, 88, 89, 90, 91, 92, 93, 94, 321,
- 506, 516, 372, 331, 332, 333, 334, 204, 205, 325,
- 85, 86, 87, 100, 101, 28, 81, 82, 83, 464,
- 211, 85, 86, 87, 29, 369, 495, 244, 107, 244,
- 29, 499, 501, 271, 272, 273, 274, 275, 276, 88,
- 89, 90, 91, 92, 93, 94, 269, 291, 133, 134,
- 88, 89, 90, 91, 92, 93, 94, 519, 88, 89,
- 90, 91, 92, 93, 94, 292, 482, 28, 235, 0,
- 404, 28, 0, 0, 412, 0, 0, 301, 440, 277,
- 0, 244, 400, 0, 244, 0, 400, 0, 0, 448,
- 302, 303, 304, 305, 0, 0, 433, 5, 6, 7,
- 8, 438, 5, 6, 0, 8, 0, 145, 462, 0,
- 463, 31, 10, 244, 0, 306, 11, 10, 467, 32,
- 0, 11, 0, 33, 0, 0, 0, 34, 307, 308,
- 309, 310, 469, 470, 0, 0, 472, 473, 0, 477,
- 0, 0, 479, 480, 146, 0, 244, 483, 0, 484,
- 0, 0, 0, 0, 493, 468, 0, 496, 85, 86,
- 87, 0, 500, 502, 0, 0, 505, 0, 40, 0,
- 509, 481, 511, 0, 0, 41, 42, 43, 44, 78,
- 79, 80, 81, 82, 83, 497, 0, 88, 89, 90,
- 91, 92, 93, 94, 0, 85, 86, 87, 79, 80,
- 81, 82, 83, 513, 45, 46, 47, 48, 49, 50,
- 0, 51, 52, 53, 54, 55, 0, 0, 0, 0,
- 56, 57, 0, 0, 88, 89, 90, 91, 92, 93,
- 94, 58, 59, 0, 60, 76, 77, 78, 79, 80,
- 81, 82, 83, 0, 0, 85, 86, 87, 96, 0,
- 0, 311, 0, 0, 5, 6, 7, 8, 257, 258,
- 259, 260, 261, 262, 302, 303, 304, 305, 337, 10,
- 0, 0, 0, 11, 88, 89, 90, 91, 92, 93,
- 94, 302, 303, 304, 305, 31, 0, 0, 0, 306,
- 0, 0, 0, 32, 0, 0, 0, 33, 0, 0,
- 0, 34, 307, 308, 309, 310, 306, 422, 0, 424,
- 0, 0, 0, 0, 0, 430, 0, 0, 0, 307,
- 308, 309, 310, 0, 76, 77, 78, 79, 80, 81,
- 82, 83, 0, 444, 445, 446, 447, 118, 0, 449,
- 450, 0, 451, 343, 452, 453, 454, 455, 456, 344,
- 457, 0, 0, 0, 459, 460, 461, 0, 0, 345,
- 346, 347, 348, 349, 350, 351, 352, 353, 354, 355,
- 356, 357, 358, 359, 360, 361, 362, 363, 364, 365,
- 373, 366, 0, 0, 0, 0, 344, 63, 64, 65,
- 66, 67, 68, 69, 70, 0, 345, 346, 347, 348,
- 349, 350, 351, 352, 353, 354, 355, 356, 357, 358,
- 359, 360, 361, 362, 363, 364, 365, 409, 366, 0,
- 0, 0, 0, 344, 76, 77, 78, 79, 80, 81,
- 82, 83, 0, 345, 346, 347, 348, 349, 350, 351,
- 352, 353, 354, 355, 356, 357, 358, 359, 360, 361,
- 362, 363, 364, 365, 486, 366, 0, 491, 88, 89,
- 90, 91, 92, 93, 94, 0, 0, 133, 134, 504,
- 0, 0, 0, 508, 0, 510, 0, 0, 0, 512,
- 0, 0, 0, 514, 0, 515, 0, 381, 382, 383,
- 384, 0, 386, 387, 0, 389, 0, 391, 392, 393,
- 394, 395, 0, 397, 0, 401, 402, 403, 135, 137,
- 135, 135, 137, 137, 0, 0, 0, 135, 77, 78,
- 79, 80, 81, 82, 83, 271, 272, 273, 274, 275,
- 276
-};
-
-static const yytype_int16 yycheck[] =
-{
- 3, 326, 26, 4, 266, 35, 1, 4, 169, 248,
- 4, 3, 190, 191, 3, 108, 194, 195, 3, 1,
- 176, 1, 4, 98, 60, 4, 471, 263, 290, 4,
- 3, 26, 3, 108, 3, 60, 10, 11, 311, 200,
- 213, 202, 281, 90, 109, 370, 26, 94, 90, 494,
- 286, 4, 94, 498, 176, 91, 92, 296, 32, 33,
- 34, 94, 235, 110, 337, 3, 91, 92, 110, 230,
- 231, 74, 517, 251, 108, 0, 232, 110, 53, 3,
- 81, 406, 85, 86, 87, 60, 91, 92, 82, 63,
- 64, 65, 66, 67, 68, 69, 70, 95, 96, 129,
- 339, 104, 76, 77, 78, 79, 80, 81, 82, 83,
- 232, 108, 94, 92, 144, 94, 108, 362, 279, 108,
- 102, 366, 3, 108, 106, 303, 304, 106, 110, 54,
- 4, 110, 162, 163, 3, 108, 297, 108, 62, 63,
- 64, 65, 66, 67, 4, 70, 149, 150, 151, 152,
- 153, 154, 155, 91, 92, 158, 186, 187, 161, 4,
- 140, 141, 108, 341, 96, 4, 91, 92, 93, 94,
- 108, 3, 97, 6, 7, 8, 9, 10, 11, 95,
- 160, 106, 4, 81, 108, 110, 91, 92, 218, 219,
- 91, 92, 222, 371, 4, 108, 226, 227, 4, 59,
- 3, 61, 176, 108, 3, 79, 80, 108, 98, 40,
- 240, 4, 3, 108, 59, 111, 61, 247, 242, 249,
- 59, 108, 61, 108, 55, 56, 57, 222, 108, 224,
- 61, 226, 227, 411, 91, 92, 216, 59, 94, 61,
- 72, 73, 74, 75, 76, 77, 78, 242, 4, 59,
- 106, 61, 282, 59, 110, 61, 45, 46, 232, 3,
- 108, 108, 242, 54, 55, 56, 59, 108, 61, 299,
- 3, 94, 95, 96, 99, 108, 3, 102, 103, 102,
- 304, 108, 107, 106, 109, 101, 310, 110, 108, 319,
- 285, 16, 83, 84, 85, 86, 87, 88, 89, 302,
- 108, 108, 332, 306, 307, 308, 309, 95, 96, 304,
- 54, 55, 56, 43, 44, 310, 103, 104, 105, 442,
- 108, 54, 55, 56, 304, 328, 487, 322, 58, 324,
- 310, 492, 493, 62, 63, 64, 65, 66, 67, 83,
- 84, 85, 86, 87, 88, 89, 245, 270, 92, 93,
- 83, 84, 85, 86, 87, 88, 89, 518, 83, 84,
- 85, 86, 87, 88, 89, 277, 475, 362, 211, -1,
- 366, 366, -1, -1, 377, -1, -1, 3, 408, 108,
- -1, 376, 362, -1, 379, -1, 366, -1, -1, 419,
- 16, 17, 18, 19, -1, -1, 399, 91, 92, 93,
- 94, 404, 91, 92, -1, 94, -1, 3, 438, -1,
- 440, 94, 106, 408, -1, 41, 110, 106, 448, 102,
- -1, 110, -1, 106, -1, -1, -1, 110, 54, 55,
- 56, 57, 462, 463, -1, -1, 466, 467, -1, 469,
- -1, -1, 472, 473, 3, -1, 441, 477, -1, 479,
- -1, -1, -1, -1, 484, 458, -1, 487, 54, 55,
- 56, -1, 492, 493, -1, -1, 496, -1, 5, -1,
- 500, 474, 502, -1, -1, 12, 13, 14, 15, 100,
- 101, 102, 103, 104, 105, 488, -1, 83, 84, 85,
- 86, 87, 88, 89, -1, 54, 55, 56, 101, 102,
- 103, 104, 105, 506, 41, 42, 43, 44, 45, 46,
- -1, 48, 49, 50, 51, 52, -1, -1, -1, -1,
- 57, 58, -1, -1, 83, 84, 85, 86, 87, 88,
- 89, 68, 69, -1, 71, 98, 99, 100, 101, 102,
- 103, 104, 105, -1, -1, 54, 55, 56, 111, -1,
- -1, 3, -1, -1, 91, 92, 93, 94, 6, 7,
- 8, 9, 10, 11, 16, 17, 18, 19, 3, 106,
- -1, -1, -1, 110, 83, 84, 85, 86, 87, 88,
- 89, 16, 17, 18, 19, 94, -1, -1, -1, 41,
- -1, -1, -1, 102, -1, -1, -1, 106, -1, -1,
- -1, 110, 54, 55, 56, 57, 41, 388, -1, 390,
- -1, -1, -1, -1, -1, 396, -1, -1, -1, 54,
- 55, 56, 57, -1, 98, 99, 100, 101, 102, 103,
- 104, 105, -1, 414, 415, 416, 417, 111, -1, 420,
- 421, -1, 423, 4, 425, 426, 427, 428, 429, 10,
- 431, -1, -1, -1, 435, 436, 437, -1, -1, 20,
- 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
- 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
- 4, 42, -1, -1, -1, -1, 10, 98, 99, 100,
- 101, 102, 103, 104, 105, -1, 20, 21, 22, 23,
- 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
- 34, 35, 36, 37, 38, 39, 40, 4, 42, -1,
- -1, -1, -1, 10, 98, 99, 100, 101, 102, 103,
- 104, 105, -1, 20, 21, 22, 23, 24, 25, 26,
- 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
- 37, 38, 39, 40, 480, 42, -1, 483, 83, 84,
- 85, 86, 87, 88, 89, -1, -1, 92, 93, 495,
- -1, -1, -1, 499, -1, 501, -1, -1, -1, 505,
- -1, -1, -1, 509, -1, 511, -1, 345, 346, 347,
- 348, -1, 350, 351, -1, 353, -1, 355, 356, 357,
- 358, 359, -1, 361, -1, 363, 364, 365, 98, 99,
- 100, 101, 102, 103, -1, -1, -1, 107, 99, 100,
- 101, 102, 103, 104, 105, 62, 63, 64, 65, 66,
- 67
-};
-
-/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
- symbol of state STATE-NUM. */
-static const yytype_uint8 yystos[] =
-{
- 0, 113, 0, 54, 70, 91, 92, 93, 94, 97,
- 106, 110, 114, 120, 121, 122, 162, 163, 164, 165,
- 170, 173, 178, 182, 183, 185, 191, 192, 200, 212,
- 213, 94, 102, 106, 110, 209, 210, 194, 210, 210,
- 5, 12, 13, 14, 15, 41, 42, 43, 44, 45,
- 46, 48, 49, 50, 51, 52, 57, 58, 68, 69,
- 71, 181, 191, 98, 99, 100, 101, 102, 103, 104,
- 105, 210, 210, 210, 108, 208, 98, 99, 100, 101,
- 102, 103, 104, 105, 3, 54, 55, 56, 83, 84,
- 85, 86, 87, 88, 89, 197, 111, 194, 196, 195,
- 196, 196, 195, 195, 194, 194, 194, 196, 186, 194,
- 210, 210, 210, 210, 210, 210, 210, 210, 111, 209,
- 210, 210, 210, 210, 210, 210, 210, 210, 179, 209,
- 209, 209, 3, 92, 93, 197, 198, 197, 198, 16,
- 126, 126, 198, 198, 209, 3, 3, 198, 3, 72,
- 73, 74, 75, 76, 77, 78, 3, 198, 180, 208,
- 115, 109, 212, 212, 208, 166, 171, 187, 209, 209,
- 209, 209, 209, 209, 209, 174, 175, 1, 4, 209,
- 4, 92, 116, 117, 212, 209, 208, 208, 3, 4,
- 59, 61, 167, 4, 59, 61, 172, 4, 79, 80,
- 207, 208, 207, 4, 95, 96, 176, 177, 203, 204,
- 210, 108, 201, 202, 203, 204, 108, 211, 208, 208,
- 184, 60, 199, 200, 199, 60, 199, 199, 3, 3,
- 207, 207, 108, 96, 95, 202, 201, 212, 108, 208,
- 208, 4, 53, 60, 200, 208, 168, 208, 3, 208,
- 188, 81, 207, 207, 203, 204, 210, 6, 7, 8,
- 9, 10, 11, 118, 119, 123, 124, 208, 191, 168,
- 3, 62, 63, 64, 65, 66, 67, 108, 169, 208,
- 171, 3, 208, 4, 82, 199, 108, 119, 127, 127,
- 125, 166, 169, 207, 4, 171, 3, 208, 3, 190,
- 119, 3, 16, 17, 18, 19, 41, 54, 55, 56,
- 57, 3, 127, 4, 4, 171, 207, 189, 4, 208,
- 128, 209, 199, 191, 199, 200, 90, 94, 110, 205,
- 206, 209, 209, 209, 209, 191, 128, 3, 4, 3,
- 4, 81, 208, 4, 10, 20, 21, 22, 23, 24,
- 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
- 35, 36, 37, 38, 39, 40, 42, 129, 206, 209,
- 98, 108, 208, 4, 128, 171, 199, 153, 154, 199,
- 212, 153, 153, 153, 153, 135, 153, 153, 138, 153,
- 142, 153, 153, 153, 153, 153, 148, 153, 192, 193,
- 212, 153, 153, 153, 193, 111, 90, 206, 199, 4,
- 4, 108, 209, 108, 130, 131, 132, 134, 151, 209,
- 136, 137, 151, 139, 151, 143, 144, 145, 146, 147,
- 151, 149, 108, 209, 108, 133, 140, 141, 209, 206,
- 208, 199, 108, 152, 151, 151, 151, 151, 208, 151,
- 151, 151, 151, 151, 151, 151, 151, 151, 108, 151,
- 151, 151, 208, 208, 154, 108, 156, 208, 209, 208,
- 208, 157, 208, 208, 108, 3, 155, 208, 205, 208,
- 208, 209, 174, 208, 208, 108, 155, 160, 108, 4,
- 108, 155, 158, 208, 161, 207, 208, 209, 159, 207,
- 208, 207, 208, 205, 155, 208, 108, 205, 155, 208,
- 155, 208, 155, 209, 155, 155, 108, 150, 205, 207
-};
-
-#define yyerrok (yyerrstatus = 0)
-#define yyclearin (yychar = YYEMPTY)
-#define YYEMPTY (-2)
-#define YYEOF 0
-
-#define YYACCEPT goto yyacceptlab
-#define YYABORT goto yyabortlab
-#define YYERROR goto yyerrorlab
-
-
-/* Like YYERROR except do call yyerror. This remains here temporarily
- to ease the transition to the new meaning of YYERROR, for GCC.
- Once GCC version 2 has supplanted version 1, this can go. */
-
-#define YYFAIL goto yyerrlab
-
-#define YYRECOVERING() (!!yyerrstatus)
-
-#define YYBACKUP(Token, Value) \
-do \
- if (yychar == YYEMPTY && yylen == 1) \
- { \
- yychar = (Token); \
- yylval = (Value); \
- yytoken = YYTRANSLATE (yychar); \
- YYPOPSTACK (1); \
- goto yybackup; \
- } \
- else \
- { \
- yyerror (YY_("syntax error: cannot back up")); \
- YYERROR; \
- } \
-while (YYID (0))
-
-
-#define YYTERROR 1
-#define YYERRCODE 256
-
-
-/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
- If N is 0, then set CURRENT to the empty location which ends
- the previous symbol: RHS[0] (always defined). */
-
-#define YYRHSLOC(Rhs, K) ((Rhs)[K])
-#ifndef YYLLOC_DEFAULT
-# define YYLLOC_DEFAULT(Current, Rhs, N) \
- do \
- if (YYID (N)) \
- { \
- (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \
- (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
- (Current).last_line = YYRHSLOC (Rhs, N).last_line; \
- (Current).last_column = YYRHSLOC (Rhs, N).last_column; \
- } \
- else \
- { \
- (Current).first_line = (Current).last_line = \
- YYRHSLOC (Rhs, 0).last_line; \
- (Current).first_column = (Current).last_column = \
- YYRHSLOC (Rhs, 0).last_column; \
- } \
- while (YYID (0))
-#endif
-
-
-/* YY_LOCATION_PRINT -- Print the location on the stream.
- This macro was not mandated originally: define only if we know
- we won't break user code: when these are the locations we know. */
-
-#ifndef YY_LOCATION_PRINT
-# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL
-# define YY_LOCATION_PRINT(File, Loc) \
- fprintf (File, "%d.%d-%d.%d", \
- (Loc).first_line, (Loc).first_column, \
- (Loc).last_line, (Loc).last_column)
-# else
-# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
-# endif
-#endif
-
-
-/* YYLEX -- calling `yylex' with the right arguments. */
-
-#ifdef YYLEX_PARAM
-# define YYLEX yylex (YYLEX_PARAM)
-#else
-# define YYLEX yylex ()
-#endif
-
-/* Enable debugging if requested. */
-#if YYDEBUG
-
-# ifndef YYFPRINTF
-# include /* INFRINGES ON USER NAME SPACE */
-# define YYFPRINTF fprintf
-# endif
-
-# define YYDPRINTF(Args) \
-do { \
- if (yydebug) \
- YYFPRINTF Args; \
-} while (YYID (0))
-
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
-do { \
- if (yydebug) \
- { \
- YYFPRINTF (stderr, "%s ", Title); \
- yy_symbol_print (stderr, \
- Type, Value); \
- YYFPRINTF (stderr, "\n"); \
- } \
-} while (YYID (0))
-
-
-/*--------------------------------.
-| Print this symbol on YYOUTPUT. |
-`--------------------------------*/
-
-/*ARGSUSED*/
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static void
-yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
-#else
-static void
-yy_symbol_value_print (yyoutput, yytype, yyvaluep)
- FILE *yyoutput;
- int yytype;
- YYSTYPE const * const yyvaluep;
-#endif
-{
- if (!yyvaluep)
- return;
-# ifdef YYPRINT
- if (yytype < YYNTOKENS)
- YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
-# else
- YYUSE (yyoutput);
-# endif
- switch (yytype)
- {
- default:
- break;
- }
-}
-
-
-/*--------------------------------.
-| Print this symbol on YYOUTPUT. |
-`--------------------------------*/
-
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static void
-yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
-#else
-static void
-yy_symbol_print (yyoutput, yytype, yyvaluep)
- FILE *yyoutput;
- int yytype;
- YYSTYPE const * const yyvaluep;
-#endif
-{
- if (yytype < YYNTOKENS)
- YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
- else
- YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
-
- yy_symbol_value_print (yyoutput, yytype, yyvaluep);
- YYFPRINTF (yyoutput, ")");
-}
-
-/*------------------------------------------------------------------.
-| yy_stack_print -- Print the state stack from its BOTTOM up to its |
-| TOP (included). |
-`------------------------------------------------------------------*/
-
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static void
-yy_stack_print (yytype_int16 *bottom, yytype_int16 *top)
-#else
-static void
-yy_stack_print (bottom, top)
- yytype_int16 *bottom;
- yytype_int16 *top;
-#endif
-{
- YYFPRINTF (stderr, "Stack now");
- for (; bottom <= top; ++bottom)
- YYFPRINTF (stderr, " %d", *bottom);
- YYFPRINTF (stderr, "\n");
-}
-
-# define YY_STACK_PRINT(Bottom, Top) \
-do { \
- if (yydebug) \
- yy_stack_print ((Bottom), (Top)); \
-} while (YYID (0))
-
-
-/*------------------------------------------------.
-| Report that the YYRULE is going to be reduced. |
-`------------------------------------------------*/
-
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static void
-yy_reduce_print (YYSTYPE *yyvsp, int yyrule)
-#else
-static void
-yy_reduce_print (yyvsp, yyrule)
- YYSTYPE *yyvsp;
- int yyrule;
-#endif
-{
- int yynrhs = yyr2[yyrule];
- int yyi;
- unsigned long int yylno = yyrline[yyrule];
- YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
- yyrule - 1, yylno);
- /* The symbols being reduced. */
- for (yyi = 0; yyi < yynrhs; yyi++)
- {
- fprintf (stderr, " $%d = ", yyi + 1);
- yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
- &(yyvsp[(yyi + 1) - (yynrhs)])
- );
- fprintf (stderr, "\n");
- }
-}
-
-# define YY_REDUCE_PRINT(Rule) \
-do { \
- if (yydebug) \
- yy_reduce_print (yyvsp, Rule); \
-} while (YYID (0))
-
-/* Nonzero means print parse trace. It is left uninitialized so that
- multiple parsers can coexist. */
-int yydebug;
-#else /* !YYDEBUG */
-# define YYDPRINTF(Args)
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
-# define YY_STACK_PRINT(Bottom, Top)
-# define YY_REDUCE_PRINT(Rule)
-#endif /* !YYDEBUG */
-
-
-/* YYINITDEPTH -- initial size of the parser's stacks. */
-#ifndef YYINITDEPTH
-# define YYINITDEPTH 200
-#endif
-
-/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
- if the built-in stack extension method is used).
-
- Do not make this value too large; the results are undefined if
- YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
- evaluated with infinite-precision integer arithmetic. */
-
-#ifndef YYMAXDEPTH
-# define YYMAXDEPTH 10000
-#endif
-
-
-
-#if YYERROR_VERBOSE
-
-# ifndef yystrlen
-# if defined __GLIBC__ && defined _STRING_H
-# define yystrlen strlen
-# else
-/* Return the length of YYSTR. */
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static YYSIZE_T
-yystrlen (const char *yystr)
-#else
-static YYSIZE_T
-yystrlen (yystr)
- const char *yystr;
-#endif
-{
- YYSIZE_T yylen;
- for (yylen = 0; yystr[yylen]; yylen++)
- continue;
- return yylen;
-}
-# endif
-# endif
-
-# ifndef yystpcpy
-# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
-# define yystpcpy stpcpy
-# else
-/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
- YYDEST. */
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static char *
-yystpcpy (char *yydest, const char *yysrc)
-#else
-static char *
-yystpcpy (yydest, yysrc)
- char *yydest;
- const char *yysrc;
-#endif
-{
- char *yyd = yydest;
- const char *yys = yysrc;
-
- while ((*yyd++ = *yys++) != '\0')
- continue;
-
- return yyd - 1;
-}
-# endif
-# endif
-
-# ifndef yytnamerr
-/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
- quotes and backslashes, so that it's suitable for yyerror. The
- heuristic is that double-quoting is unnecessary unless the string
- contains an apostrophe, a comma, or backslash (other than
- backslash-backslash). YYSTR is taken from yytname. If YYRES is
- null, do not copy; instead, return the length of what the result
- would have been. */
-static YYSIZE_T
-yytnamerr (char *yyres, const char *yystr)
-{
- if (*yystr == '"')
- {
- YYSIZE_T yyn = 0;
- char const *yyp = yystr;
-
- for (;;)
- switch (*++yyp)
- {
- case '\'':
- case ',':
- goto do_not_strip_quotes;
-
- case '\\':
- if (*++yyp != '\\')
- goto do_not_strip_quotes;
- /* Fall through. */
- default:
- if (yyres)
- yyres[yyn] = *yyp;
- yyn++;
- break;
-
- case '"':
- if (yyres)
- yyres[yyn] = '\0';
- return yyn;
- }
- do_not_strip_quotes: ;
- }
-
- if (! yyres)
- return yystrlen (yystr);
-
- return yystpcpy (yyres, yystr) - yyres;
-}
-# endif
-
-/* Copy into YYRESULT an error message about the unexpected token
- YYCHAR while in state YYSTATE. Return the number of bytes copied,
- including the terminating null byte. If YYRESULT is null, do not
- copy anything; just return the number of bytes that would be
- copied. As a special case, return 0 if an ordinary "syntax error"
- message will do. Return YYSIZE_MAXIMUM if overflow occurs during
- size calculation. */
-static YYSIZE_T
-yysyntax_error (char *yyresult, int yystate, int yychar)
-{
- int yyn = yypact[yystate];
-
- if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
- return 0;
- else
- {
- int yytype = YYTRANSLATE (yychar);
- YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
- YYSIZE_T yysize = yysize0;
- YYSIZE_T yysize1;
- int yysize_overflow = 0;
- enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
- char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
- int yyx;
-
-# if 0
- /* This is so xgettext sees the translatable formats that are
- constructed on the fly. */
- YY_("syntax error, unexpected %s");
- YY_("syntax error, unexpected %s, expecting %s");
- YY_("syntax error, unexpected %s, expecting %s or %s");
- YY_("syntax error, unexpected %s, expecting %s or %s or %s");
- YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
-# endif
- char *yyfmt;
- char const *yyf;
- static char const yyunexpected[] = "syntax error, unexpected %s";
- static char const yyexpecting[] = ", expecting %s";
- static char const yyor[] = " or %s";
- char yyformat[sizeof yyunexpected
- + sizeof yyexpecting - 1
- + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
- * (sizeof yyor - 1))];
- char const *yyprefix = yyexpecting;
-
- /* Start YYX at -YYN if negative to avoid negative indexes in
- YYCHECK. */
- int yyxbegin = yyn < 0 ? -yyn : 0;
-
- /* Stay within bounds of both yycheck and yytname. */
- int yychecklim = YYLAST - yyn + 1;
- int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
- int yycount = 1;
-
- yyarg[0] = yytname[yytype];
- yyfmt = yystpcpy (yyformat, yyunexpected);
-
- for (yyx = yyxbegin; yyx < yyxend; ++yyx)
- if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
- {
- if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
- {
- yycount = 1;
- yysize = yysize0;
- yyformat[sizeof yyunexpected - 1] = '\0';
- break;
- }
- yyarg[yycount++] = yytname[yyx];
- yysize1 = yysize + yytnamerr (0, yytname[yyx]);
- yysize_overflow |= (yysize1 < yysize);
- yysize = yysize1;
- yyfmt = yystpcpy (yyfmt, yyprefix);
- yyprefix = yyor;
- }
-
- yyf = YY_(yyformat);
- yysize1 = yysize + yystrlen (yyf);
- yysize_overflow |= (yysize1 < yysize);
- yysize = yysize1;
-
- if (yysize_overflow)
- return YYSIZE_MAXIMUM;
-
- if (yyresult)
- {
- /* Avoid sprintf, as that infringes on the user's name space.
- Don't have undefined behavior even if the translation
- produced a string with the wrong number of "%s"s. */
- char *yyp = yyresult;
- int yyi = 0;
- while ((*yyp = *yyf) != '\0')
- {
- if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
- {
- yyp += yytnamerr (yyp, yyarg[yyi++]);
- yyf += 2;
- }
- else
- {
- yyp++;
- yyf++;
- }
- }
- }
- return yysize;
- }
-}
-#endif /* YYERROR_VERBOSE */
-
-
-/*-----------------------------------------------.
-| Release the memory associated to this symbol. |
-`-----------------------------------------------*/
-
-/*ARGSUSED*/
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static void
-yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
-#else
-static void
-yydestruct (yymsg, yytype, yyvaluep)
- const char *yymsg;
- int yytype;
- YYSTYPE *yyvaluep;
-#endif
-{
- YYUSE (yyvaluep);
-
- if (!yymsg)
- yymsg = "Deleting";
- YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
-
- switch (yytype)
- {
-
- default:
- break;
- }
-}
-
-
-/* Prevent warnings from -Wmissing-prototypes. */
-
-#ifdef YYPARSE_PARAM
-#if defined __STDC__ || defined __cplusplus
-int yyparse (void *YYPARSE_PARAM);
-#else
-int yyparse ();
-#endif
-#else /* ! YYPARSE_PARAM */
-#if defined __STDC__ || defined __cplusplus
-int yyparse (void);
-#else
-int yyparse ();
-#endif
-#endif /* ! YYPARSE_PARAM */
-
-
-
-/* The look-ahead symbol. */
-int yychar;
-
-/* The semantic value of the look-ahead symbol. */
-YYSTYPE yylval;
-
-/* Number of syntax errors so far. */
-int yynerrs;
-
-
-
-/*----------.
-| yyparse. |
-`----------*/
-
-#ifdef YYPARSE_PARAM
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-int
-yyparse (void *YYPARSE_PARAM)
-#else
-int
-yyparse (YYPARSE_PARAM)
- void *YYPARSE_PARAM;
-#endif
-#else /* ! YYPARSE_PARAM */
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-int
-yyparse (void)
-#else
-int
-yyparse ()
-
-#endif
-#endif
-{
-
- int yystate;
- int yyn;
- int yyresult;
- /* Number of tokens to shift before error messages enabled. */
- int yyerrstatus;
- /* Look-ahead token as an internal (translated) token number. */
- int yytoken = 0;
-#if YYERROR_VERBOSE
- /* Buffer for error messages, and its allocated size. */
- char yymsgbuf[128];
- char *yymsg = yymsgbuf;
- YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
-#endif
-
- /* Three stacks and their tools:
- `yyss': related to states,
- `yyvs': related to semantic values,
- `yyls': related to locations.
-
- Refer to the stacks thru separate pointers, to allow yyoverflow
- to reallocate them elsewhere. */
-
- /* The state stack. */
- yytype_int16 yyssa[YYINITDEPTH];
- yytype_int16 *yyss = yyssa;
- yytype_int16 *yyssp;
-
- /* The semantic value stack. */
- YYSTYPE yyvsa[YYINITDEPTH];
- YYSTYPE *yyvs = yyvsa;
- YYSTYPE *yyvsp;
-
-
-
-#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
-
- YYSIZE_T yystacksize = YYINITDEPTH;
-
- /* The variables used to return semantic value and location from the
- action routines. */
- YYSTYPE yyval;
-
-
- /* The number of symbols on the RHS of the reduced rule.
- Keep to zero when no symbol should be popped. */
- int yylen = 0;
-
- YYDPRINTF ((stderr, "Starting parse\n"));
-
- yystate = 0;
- yyerrstatus = 0;
- yynerrs = 0;
- yychar = YYEMPTY; /* Cause a token to be read. */
-
- /* Initialize stack pointers.
- Waste one element of value and location stack
- so that they stay on the same level as the state stack.
- The wasted elements are never initialized. */
-
- yyssp = yyss;
- yyvsp = yyvs;
-
- goto yysetstate;
-
-/*------------------------------------------------------------.
-| yynewstate -- Push a new state, which is found in yystate. |
-`------------------------------------------------------------*/
- yynewstate:
- /* In all cases, when you get here, the value and location stacks
- have just been pushed. So pushing a state here evens the stacks. */
- yyssp++;
-
- yysetstate:
- *yyssp = yystate;
-
- if (yyss + yystacksize - 1 <= yyssp)
- {
- /* Get the current used size of the three stacks, in elements. */
- YYSIZE_T yysize = yyssp - yyss + 1;
-
-#ifdef yyoverflow
- {
- /* Give user a chance to reallocate the stack. Use copies of
- these so that the &'s don't force the real ones into
- memory. */
- YYSTYPE *yyvs1 = yyvs;
- yytype_int16 *yyss1 = yyss;
-
-
- /* Each stack pointer address is followed by the size of the
- data in use in that stack, in bytes. This used to be a
- conditional around just the two extra args, but that might
- be undefined if yyoverflow is a macro. */
- yyoverflow (YY_("memory exhausted"),
- &yyss1, yysize * sizeof (*yyssp),
- &yyvs1, yysize * sizeof (*yyvsp),
-
- &yystacksize);
-
- yyss = yyss1;
- yyvs = yyvs1;
- }
-#else /* no yyoverflow */
-# ifndef YYSTACK_RELOCATE
- goto yyexhaustedlab;
-# else
- /* Extend the stack our own way. */
- if (YYMAXDEPTH <= yystacksize)
- goto yyexhaustedlab;
- yystacksize *= 2;
- if (YYMAXDEPTH < yystacksize)
- yystacksize = YYMAXDEPTH;
-
- {
- yytype_int16 *yyss1 = yyss;
- union yyalloc *yyptr =
- (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
- if (! yyptr)
- goto yyexhaustedlab;
- YYSTACK_RELOCATE (yyss);
- YYSTACK_RELOCATE (yyvs);
-
-# undef YYSTACK_RELOCATE
- if (yyss1 != yyssa)
- YYSTACK_FREE (yyss1);
- }
-# endif
-#endif /* no yyoverflow */
-
- yyssp = yyss + yysize - 1;
- yyvsp = yyvs + yysize - 1;
-
-
- YYDPRINTF ((stderr, "Stack size increased to %lu\n",
- (unsigned long int) yystacksize));
-
- if (yyss + yystacksize - 1 <= yyssp)
- YYABORT;
- }
-
- YYDPRINTF ((stderr, "Entering state %d\n", yystate));
-
- goto yybackup;
-
-/*-----------.
-| yybackup. |
-`-----------*/
-yybackup:
-
- /* Do appropriate processing given the current state. Read a
- look-ahead token if we need one and don't already have one. */
-
- /* First try to decide what to do without reference to look-ahead token. */
- yyn = yypact[yystate];
- if (yyn == YYPACT_NINF)
- goto yydefault;
-
- /* Not known => get a look-ahead token if don't already have one. */
-
- /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */
- if (yychar == YYEMPTY)
- {
- YYDPRINTF ((stderr, "Reading a token: "));
- yychar = YYLEX;
- }
-
- if (yychar <= YYEOF)
- {
- yychar = yytoken = YYEOF;
- YYDPRINTF ((stderr, "Now at end of input.\n"));
- }
- else
- {
- yytoken = YYTRANSLATE (yychar);
- YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
- }
-
- /* If the proper action on seeing token YYTOKEN is to reduce or to
- detect an error, take that action. */
- yyn += yytoken;
- if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
- goto yydefault;
- yyn = yytable[yyn];
- if (yyn <= 0)
- {
- if (yyn == 0 || yyn == YYTABLE_NINF)
- goto yyerrlab;
- yyn = -yyn;
- goto yyreduce;
- }
-
- if (yyn == YYFINAL)
- YYACCEPT;
-
- /* Count tokens shifted since error; after three, turn off error
- status. */
- if (yyerrstatus)
- yyerrstatus--;
-
- /* Shift the look-ahead token. */
- YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
-
- /* Discard the shifted token unless it is eof. */
- if (yychar != YYEOF)
- yychar = YYEMPTY;
-
- yystate = yyn;
- *++yyvsp = yylval;
-
- goto yynewstate;
-
-
-/*-----------------------------------------------------------.
-| yydefault -- do the default action for the current state. |
-`-----------------------------------------------------------*/
-yydefault:
- yyn = yydefact[yystate];
- if (yyn == 0)
- goto yyerrlab;
- goto yyreduce;
-
-
-/*-----------------------------.
-| yyreduce -- Do a reduction. |
-`-----------------------------*/
-yyreduce:
- /* yyn is the number of a rule to reduce with. */
- yylen = yyr2[yyn];
-
- /* If YYLEN is nonzero, implement the default value of the action:
- `$$ = $1'.
-
- Otherwise, the following line sets YYVAL to garbage.
- This behavior is undocumented and Bison
- users should not rely upon it. Assigning to YYVAL
- unconditionally makes the parser a bit smaller, and it avoids a
- GCC warning that YYVAL may be used uninitialized. */
- yyval = yyvsp[1-yylen];
-
-
- YY_REDUCE_PRINT (yyn);
- switch (yyn)
- {
- case 18:
-#line 202 "rcparse.y"
- {
- define_accelerator ((yyvsp[(1) - (6)].id), &(yyvsp[(3) - (6)].res_info), (yyvsp[(5) - (6)].pacc));
- if (yychar != YYEMPTY)
- YYERROR;
- rcparse_discard_strings ();
- }
- break;
-
- case 19:
-#line 212 "rcparse.y"
- {
- (yyval.pacc) = NULL;
- }
- break;
-
- case 20:
-#line 216 "rcparse.y"
- {
- rc_accelerator *a;
-
- a = (rc_accelerator *) res_alloc (sizeof *a);
- *a = (yyvsp[(2) - (2)].acc);
- if ((yyvsp[(1) - (2)].pacc) == NULL)
- (yyval.pacc) = a;
- else
- {
- rc_accelerator **pp;
-
- for (pp = &(yyvsp[(1) - (2)].pacc)->next; *pp != NULL; pp = &(*pp)->next)
- ;
- *pp = a;
- (yyval.pacc) = (yyvsp[(1) - (2)].pacc);
- }
- }
- break;
-
- case 21:
-#line 237 "rcparse.y"
- {
- (yyval.acc) = (yyvsp[(1) - (2)].acc);
- (yyval.acc).id = (yyvsp[(2) - (2)].il);
- }
- break;
-
- case 22:
-#line 242 "rcparse.y"
- {
- (yyval.acc) = (yyvsp[(1) - (4)].acc);
- (yyval.acc).id = (yyvsp[(2) - (4)].il);
- (yyval.acc).flags |= (yyvsp[(4) - (4)].is);
- if (((yyval.acc).flags & ACC_VIRTKEY) == 0
- && ((yyval.acc).flags & (ACC_SHIFT | ACC_CONTROL)) != 0)
- rcparse_warning (_("inappropriate modifiers for non-VIRTKEY"));
- }
- break;
-
- case 23:
-#line 254 "rcparse.y"
- {
- const char *s = (yyvsp[(1) - (1)].s);
- char ch;
-
- (yyval.acc).next = NULL;
- (yyval.acc).id = 0;
- ch = *s;
- if (ch != '^')
- (yyval.acc).flags = 0;
- else
- {
- (yyval.acc).flags = ACC_CONTROL | ACC_VIRTKEY;
- ++s;
- ch = TOUPPER (s[0]);
- }
- (yyval.acc).key = ch;
- if (s[1] != '\0')
- rcparse_warning (_("accelerator should only be one character"));
- }
- break;
-
- case 24:
-#line 274 "rcparse.y"
- {
- (yyval.acc).next = NULL;
- (yyval.acc).flags = 0;
- (yyval.acc).id = 0;
- (yyval.acc).key = (yyvsp[(1) - (1)].il);
- }
- break;
-
- case 25:
-#line 284 "rcparse.y"
- {
- (yyval.is) = (yyvsp[(1) - (1)].is);
- }
- break;
-
- case 26:
-#line 288 "rcparse.y"
- {
- (yyval.is) = (yyvsp[(1) - (3)].is) | (yyvsp[(3) - (3)].is);
- }
- break;
-
- case 27:
-#line 293 "rcparse.y"
- {
- (yyval.is) = (yyvsp[(1) - (2)].is) | (yyvsp[(2) - (2)].is);
- }
- break;
-
- case 28:
-#line 300 "rcparse.y"
- {
- (yyval.is) = ACC_VIRTKEY;
- }
- break;
-
- case 29:
-#line 304 "rcparse.y"
- {
- /* This is just the absence of VIRTKEY. */
- (yyval.is) = 0;
- }
- break;
-
- case 30:
-#line 309 "rcparse.y"
- {
- (yyval.is) = ACC_NOINVERT;
- }
- break;
-
- case 31:
-#line 313 "rcparse.y"
- {
- (yyval.is) = ACC_SHIFT;
- }
- break;
-
- case 32:
-#line 317 "rcparse.y"
- {
- (yyval.is) = ACC_CONTROL;
- }
- break;
-
- case 33:
-#line 321 "rcparse.y"
- {
- (yyval.is) = ACC_ALT;
- }
- break;
-
- case 34:
-#line 330 "rcparse.y"
- {
- define_bitmap ((yyvsp[(1) - (4)].id), &(yyvsp[(3) - (4)].res_info), (yyvsp[(4) - (4)].s));
- if (yychar != YYEMPTY)
- YYERROR;
- rcparse_discard_strings ();
- }
- break;
-
- case 35:
-#line 342 "rcparse.y"
- {
- define_cursor ((yyvsp[(1) - (4)].id), &(yyvsp[(3) - (4)].res_info), (yyvsp[(4) - (4)].s));
- if (yychar != YYEMPTY)
- YYERROR;
- rcparse_discard_strings ();
- }
- break;
-
- case 36:
-#line 355 "rcparse.y"
- {
- memset (&dialog, 0, sizeof dialog);
- dialog.x = (yyvsp[(5) - (8)].il);
- dialog.y = (yyvsp[(6) - (8)].il);
- dialog.width = (yyvsp[(7) - (8)].il);
- dialog.height = (yyvsp[(8) - (8)].il);
- dialog.style = WS_POPUP | WS_BORDER | WS_SYSMENU;
- dialog.exstyle = (yyvsp[(4) - (8)].il);
- dialog.menu.named = 1;
- dialog.class.named = 1;
- dialog.font = NULL;
- dialog.ex = NULL;
- dialog.controls = NULL;
- sub_res_info = (yyvsp[(3) - (8)].res_info);
- style = 0;
- }
- break;
-
- case 37:
-#line 372 "rcparse.y"
- {
- define_dialog ((yyvsp[(1) - (13)].id), &sub_res_info, &dialog);
- if (yychar != YYEMPTY)
- YYERROR;
- rcparse_discard_strings ();
- }
- break;
-
- case 38:
-#line 380 "rcparse.y"
- {
- memset (&dialog, 0, sizeof dialog);
- dialog.x = (yyvsp[(5) - (8)].il);
- dialog.y = (yyvsp[(6) - (8)].il);
- dialog.width = (yyvsp[(7) - (8)].il);
- dialog.height = (yyvsp[(8) - (8)].il);
- dialog.style = WS_POPUP | WS_BORDER | WS_SYSMENU;
- dialog.exstyle = (yyvsp[(4) - (8)].il);
- dialog.menu.named = 1;
- dialog.class.named = 1;
- dialog.font = NULL;
- dialog.ex = ((rc_dialog_ex *)
- res_alloc (sizeof (rc_dialog_ex)));
- memset (dialog.ex, 0, sizeof (rc_dialog_ex));
- dialog.controls = NULL;
- sub_res_info = (yyvsp[(3) - (8)].res_info);
- style = 0;
- }
- break;
-
- case 39:
-#line 399 "rcparse.y"
- {
- define_dialog ((yyvsp[(1) - (13)].id), &sub_res_info, &dialog);
- if (yychar != YYEMPTY)
- YYERROR;
- rcparse_discard_strings ();
- }
- break;
-
- case 40:
-#line 407 "rcparse.y"
- {
- memset (&dialog, 0, sizeof dialog);
- dialog.x = (yyvsp[(5) - (9)].il);
- dialog.y = (yyvsp[(6) - (9)].il);
- dialog.width = (yyvsp[(7) - (9)].il);
- dialog.height = (yyvsp[(8) - (9)].il);
- dialog.style = WS_POPUP | WS_BORDER | WS_SYSMENU;
- dialog.exstyle = (yyvsp[(4) - (9)].il);
- dialog.menu.named = 1;
- dialog.class.named = 1;
- dialog.font = NULL;
- dialog.ex = ((rc_dialog_ex *)
- res_alloc (sizeof (rc_dialog_ex)));
- memset (dialog.ex, 0, sizeof (rc_dialog_ex));
- dialog.ex->help = (yyvsp[(9) - (9)].il);
- dialog.controls = NULL;
- sub_res_info = (yyvsp[(3) - (9)].res_info);
- style = 0;
- }
- break;
-
- case 41:
-#line 427 "rcparse.y"
- {
- define_dialog ((yyvsp[(1) - (14)].id), &sub_res_info, &dialog);
- if (yychar != YYEMPTY)
- YYERROR;
- rcparse_discard_strings ();
- }
- break;
-
- case 42:
-#line 437 "rcparse.y"
- {
- (yyval.il) = 0;
- }
- break;
-
- case 43:
-#line 441 "rcparse.y"
- {
- (yyval.il) = (yyvsp[(3) - (3)].il);
- }
- break;
-
- case 45:
-#line 449 "rcparse.y"
- {
- dialog.style |= WS_CAPTION;
- style |= WS_CAPTION;
- dialog.caption = (yyvsp[(3) - (3)].uni);
- }
- break;
-
- case 46:
-#line 455 "rcparse.y"
- {
- dialog.class = (yyvsp[(3) - (3)].id);
- }
- break;
-
- case 47:
-#line 460 "rcparse.y"
- {
- dialog.style = style;
- }
- break;
-
- case 48:
-#line 464 "rcparse.y"
- {
- dialog.exstyle = (yyvsp[(3) - (3)].il);
- }
- break;
-
- case 49:
-#line 468 "rcparse.y"
- {
- res_unistring_to_id (& dialog.class, (yyvsp[(3) - (3)].uni));
- }
- break;
-
- case 50:
-#line 472 "rcparse.y"
- {
- dialog.style |= DS_SETFONT;
- style |= DS_SETFONT;
- dialog.pointsize = (yyvsp[(3) - (5)].il);
- dialog.font = (yyvsp[(5) - (5)].uni);
- if (dialog.ex != NULL)
- {
- dialog.ex->weight = 0;
- dialog.ex->italic = 0;
- dialog.ex->charset = 1;
- }
- }
- break;
-
- case 51:
-#line 485 "rcparse.y"
- {
- dialog.style |= DS_SETFONT;
- style |= DS_SETFONT;
- dialog.pointsize = (yyvsp[(3) - (6)].il);
- dialog.font = (yyvsp[(5) - (6)].uni);
- if (dialog.ex == NULL)
- rcparse_warning (_("extended FONT requires DIALOGEX"));
- else
- {
- dialog.ex->weight = (yyvsp[(6) - (6)].il);
- dialog.ex->italic = 0;
- dialog.ex->charset = 1;
- }
- }
- break;
-
- case 52:
-#line 500 "rcparse.y"
- {
- dialog.style |= DS_SETFONT;
- style |= DS_SETFONT;
- dialog.pointsize = (yyvsp[(3) - (7)].il);
- dialog.font = (yyvsp[(5) - (7)].uni);
- if (dialog.ex == NULL)
- rcparse_warning (_("extended FONT requires DIALOGEX"));
- else
- {
- dialog.ex->weight = (yyvsp[(6) - (7)].il);
- dialog.ex->italic = (yyvsp[(7) - (7)].il);
- dialog.ex->charset = 1;
- }
- }
- break;
-
- case 53:
-#line 515 "rcparse.y"
- {
- dialog.style |= DS_SETFONT;
- style |= DS_SETFONT;
- dialog.pointsize = (yyvsp[(3) - (8)].il);
- dialog.font = (yyvsp[(5) - (8)].uni);
- if (dialog.ex == NULL)
- rcparse_warning (_("extended FONT requires DIALOGEX"));
- else
- {
- dialog.ex->weight = (yyvsp[(6) - (8)].il);
- dialog.ex->italic = (yyvsp[(7) - (8)].il);
- dialog.ex->charset = (yyvsp[(8) - (8)].il);
- }
- }
- break;
-
- case 54:
-#line 530 "rcparse.y"
- {
- dialog.menu = (yyvsp[(3) - (3)].id);
- }
- break;
-
- case 55:
-#line 534 "rcparse.y"
- {
- sub_res_info.characteristics = (yyvsp[(3) - (3)].il);
- }
- break;
-
- case 56:
-#line 538 "rcparse.y"
- {
- sub_res_info.language = (yyvsp[(3) - (4)].il) | ((yyvsp[(4) - (4)].il) << SUBLANG_SHIFT);
- }
- break;
-
- case 57:
-#line 542 "rcparse.y"
- {
- sub_res_info.version = (yyvsp[(3) - (3)].il);
- }
- break;
-
- case 59:
-#line 550 "rcparse.y"
- {
- rc_dialog_control **pp;
-
- for (pp = &dialog.controls; *pp != NULL; pp = &(*pp)->next)
- ;
- *pp = (yyvsp[(2) - (2)].dialog_control);
- }
- break;
-
- case 60:
-#line 561 "rcparse.y"
- {
- default_style = BS_AUTO3STATE | WS_TABSTOP;
- base_style = BS_AUTO3STATE;
- class.named = 0;
- class.u.id = CTL_BUTTON;
- res_text_field = (yyvsp[(2) - (2)].id);
- }
- break;
-
- case 61:
-#line 569 "rcparse.y"
- {
- (yyval.dialog_control) = (yyvsp[(4) - (4)].dialog_control);
- }
- break;
-
- case 62:
-#line 573 "rcparse.y"
- {
- default_style = BS_AUTOCHECKBOX | WS_TABSTOP;
- base_style = BS_AUTOCHECKBOX;
- class.named = 0;
- class.u.id = CTL_BUTTON;
- res_text_field = (yyvsp[(2) - (2)].id);
- }
- break;
-
- case 63:
-#line 581 "rcparse.y"
- {
- (yyval.dialog_control) = (yyvsp[(4) - (4)].dialog_control);
- }
- break;
-
- case 64:
-#line 585 "rcparse.y"
- {
- default_style = BS_AUTORADIOBUTTON | WS_TABSTOP;
- base_style = BS_AUTORADIOBUTTON;
- class.named = 0;
- class.u.id = CTL_BUTTON;
- res_text_field = (yyvsp[(2) - (2)].id);
- }
- break;
-
- case 65:
-#line 593 "rcparse.y"
- {
- (yyval.dialog_control) = (yyvsp[(4) - (4)].dialog_control);
- }
- break;
-
- case 66:
-#line 597 "rcparse.y"
- {
- default_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
- base_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
- class.named = 0;
- class.u.id = CTL_EDIT;
- res_text_field = (yyvsp[(2) - (2)].id);
- }
- break;
-
- case 67:
-#line 605 "rcparse.y"
- {
- (yyval.dialog_control) = (yyvsp[(4) - (4)].dialog_control);
- if (dialog.ex == NULL)
- rcparse_warning (_("BEDIT requires DIALOGEX"));
- res_string_to_id (&(yyval.dialog_control)->class, "BEDIT");
- }
- break;
-
- case 68:
-#line 612 "rcparse.y"
- {
- default_style = BS_CHECKBOX | WS_TABSTOP;
- base_style = BS_CHECKBOX | WS_TABSTOP;
- class.named = 0;
- class.u.id = CTL_BUTTON;
- res_text_field = (yyvsp[(2) - (2)].id);
- }
- break;
-
- case 69:
-#line 620 "rcparse.y"
- {
- (yyval.dialog_control) = (yyvsp[(4) - (4)].dialog_control);
- }
- break;
-
- case 70:
-#line 624 "rcparse.y"
- {
- /* This is as per MSDN documentation. With some (???)
- versions of MS rc.exe their is no default style. */
- default_style = CBS_SIMPLE | WS_TABSTOP;
- base_style = 0;
- class.named = 0;
- class.u.id = CTL_COMBOBOX;
- res_text_field = res_null_text;
- }
- break;
-
- case 71:
-#line 634 "rcparse.y"
- {
- (yyval.dialog_control) = (yyvsp[(3) - (3)].dialog_control);
- }
- break;
-
- case 72:
-#line 639 "rcparse.y"
- {
- (yyval.dialog_control) = define_control ((yyvsp[(2) - (11)].id), (yyvsp[(3) - (11)].il), (yyvsp[(6) - (11)].il), (yyvsp[(7) - (11)].il), (yyvsp[(8) - (11)].il), (yyvsp[(9) - (11)].il), (yyvsp[(4) - (11)].id), style, (yyvsp[(10) - (11)].il));
- if ((yyvsp[(11) - (11)].rcdata_item) != NULL)
- {
- if (dialog.ex == NULL)
- rcparse_warning (_("control data requires DIALOGEX"));
- (yyval.dialog_control)->data = (yyvsp[(11) - (11)].rcdata_item);
- }
- }
- break;
-
- case 73:
-#line 650 "rcparse.y"
- {
- (yyval.dialog_control) = define_control ((yyvsp[(2) - (12)].id), (yyvsp[(3) - (12)].il), (yyvsp[(6) - (12)].il), (yyvsp[(7) - (12)].il), (yyvsp[(8) - (12)].il), (yyvsp[(9) - (12)].il), (yyvsp[(4) - (12)].id), style, (yyvsp[(10) - (12)].il));
- if (dialog.ex == NULL)
- rcparse_warning (_("help ID requires DIALOGEX"));
- (yyval.dialog_control)->help = (yyvsp[(11) - (12)].il);
- (yyval.dialog_control)->data = (yyvsp[(12) - (12)].rcdata_item);
- }
- break;
-
- case 74:
-#line 658 "rcparse.y"
- {
- default_style = SS_CENTER | WS_GROUP;
- base_style = SS_CENTER;
- class.named = 0;
- class.u.id = CTL_STATIC;
- res_text_field = (yyvsp[(2) - (2)].id);
- }
- break;
-
- case 75:
-#line 666 "rcparse.y"
- {
- (yyval.dialog_control) = (yyvsp[(4) - (4)].dialog_control);
- }
- break;
-
- case 76:
-#line 670 "rcparse.y"
- {
- default_style = BS_DEFPUSHBUTTON | WS_TABSTOP;
- base_style = BS_DEFPUSHBUTTON | WS_TABSTOP;
- class.named = 0;
- class.u.id = CTL_BUTTON;
- res_text_field = (yyvsp[(2) - (2)].id);
- }
- break;
-
- case 77:
-#line 678 "rcparse.y"
- {
- (yyval.dialog_control) = (yyvsp[(4) - (4)].dialog_control);
- }
- break;
-
- case 78:
-#line 682 "rcparse.y"
- {
- default_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
- base_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
- class.named = 0;
- class.u.id = CTL_EDIT;
- res_text_field = res_null_text;
- }
- break;
-
- case 79:
-#line 690 "rcparse.y"
- {
- (yyval.dialog_control) = (yyvsp[(3) - (3)].dialog_control);
- }
- break;
-
- case 80:
-#line 694 "rcparse.y"
- {
- default_style = BS_GROUPBOX;
- base_style = BS_GROUPBOX;
- class.named = 0;
- class.u.id = CTL_BUTTON;
- res_text_field = (yyvsp[(2) - (2)].id);
- }
- break;
-
- case 81:
-#line 702 "rcparse.y"
- {
- (yyval.dialog_control) = (yyvsp[(4) - (4)].dialog_control);
- }
- break;
-
- case 82:
-#line 706 "rcparse.y"
- {
- default_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
- base_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
- class.named = 0;
- class.u.id = CTL_EDIT;
- res_text_field = (yyvsp[(2) - (2)].id);
- }
- break;
-
- case 83:
-#line 714 "rcparse.y"
- {
- (yyval.dialog_control) = (yyvsp[(4) - (4)].dialog_control);
- if (dialog.ex == NULL)
- rcparse_warning (_("IEDIT requires DIALOGEX"));
- res_string_to_id (&(yyval.dialog_control)->class, "HEDIT");
- }
- break;
-
- case 84:
-#line 721 "rcparse.y"
- {
- (yyval.dialog_control) = define_icon_control ((yyvsp[(2) - (6)].id), (yyvsp[(3) - (6)].il), (yyvsp[(4) - (6)].il), (yyvsp[(5) - (6)].il), 0, 0, 0, (yyvsp[(6) - (6)].rcdata_item),
- dialog.ex);
- }
- break;
-
- case 85:
-#line 727 "rcparse.y"
- {
- (yyval.dialog_control) = define_icon_control ((yyvsp[(2) - (8)].id), (yyvsp[(3) - (8)].il), (yyvsp[(4) - (8)].il), (yyvsp[(5) - (8)].il), 0, 0, 0, (yyvsp[(8) - (8)].rcdata_item),
- dialog.ex);
- }
- break;
-
- case 86:
-#line 733 "rcparse.y"
- {
- (yyval.dialog_control) = define_icon_control ((yyvsp[(2) - (10)].id), (yyvsp[(3) - (10)].il), (yyvsp[(4) - (10)].il), (yyvsp[(5) - (10)].il), style, (yyvsp[(9) - (10)].il), 0, (yyvsp[(10) - (10)].rcdata_item),
- dialog.ex);
- }
- break;
-
- case 87:
-#line 739 "rcparse.y"
- {
- (yyval.dialog_control) = define_icon_control ((yyvsp[(2) - (11)].id), (yyvsp[(3) - (11)].il), (yyvsp[(4) - (11)].il), (yyvsp[(5) - (11)].il), style, (yyvsp[(9) - (11)].il), (yyvsp[(10) - (11)].il), (yyvsp[(11) - (11)].rcdata_item),
- dialog.ex);
- }
- break;
-
- case 88:
-#line 744 "rcparse.y"
- {
- default_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
- base_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
- class.named = 0;
- class.u.id = CTL_EDIT;
- res_text_field = (yyvsp[(2) - (2)].id);
- }
- break;
-
- case 89:
-#line 752 "rcparse.y"
- {
- (yyval.dialog_control) = (yyvsp[(4) - (4)].dialog_control);
- if (dialog.ex == NULL)
- rcparse_warning (_("IEDIT requires DIALOGEX"));
- res_string_to_id (&(yyval.dialog_control)->class, "IEDIT");
- }
- break;
-
- case 90:
-#line 759 "rcparse.y"
- {
- default_style = LBS_NOTIFY | WS_BORDER;
- base_style = LBS_NOTIFY | WS_BORDER;
- class.named = 0;
- class.u.id = CTL_LISTBOX;
- res_text_field = res_null_text;
- }
- break;
-
- case 91:
-#line 767 "rcparse.y"
- {
- (yyval.dialog_control) = (yyvsp[(3) - (3)].dialog_control);
- }
- break;
-
- case 92:
-#line 771 "rcparse.y"
- {
- default_style = SS_LEFT | WS_GROUP;
- base_style = SS_LEFT;
- class.named = 0;
- class.u.id = CTL_STATIC;
- res_text_field = (yyvsp[(2) - (2)].id);
- }
- break;
-
- case 93:
-#line 779 "rcparse.y"
- {
- (yyval.dialog_control) = (yyvsp[(4) - (4)].dialog_control);
- }
- break;
-
- case 94:
-#line 783 "rcparse.y"
- {
- default_style = BS_PUSHBOX | WS_TABSTOP;
- base_style = BS_PUSHBOX;
- class.named = 0;
- class.u.id = CTL_BUTTON;
- }
- break;
-
- case 95:
-#line 790 "rcparse.y"
- {
- (yyval.dialog_control) = (yyvsp[(4) - (4)].dialog_control);
- }
- break;
-
- case 96:
-#line 794 "rcparse.y"
- {
- default_style = BS_PUSHBUTTON | WS_TABSTOP;
- base_style = BS_PUSHBUTTON | WS_TABSTOP;
- class.named = 0;
- class.u.id = CTL_BUTTON;
- res_text_field = (yyvsp[(2) - (2)].id);
- }
- break;
-
- case 97:
-#line 802 "rcparse.y"
- {
- (yyval.dialog_control) = (yyvsp[(4) - (4)].dialog_control);
- }
- break;
-
- case 98:
-#line 806 "rcparse.y"
- {
- default_style = BS_RADIOBUTTON | WS_TABSTOP;
- base_style = BS_RADIOBUTTON;
- class.named = 0;
- class.u.id = CTL_BUTTON;
- res_text_field = (yyvsp[(2) - (2)].id);
- }
- break;
-
- case 99:
-#line 814 "rcparse.y"
- {
- (yyval.dialog_control) = (yyvsp[(4) - (4)].dialog_control);
- }
- break;
-
- case 100:
-#line 818 "rcparse.y"
- {
- default_style = SS_RIGHT | WS_GROUP;
- base_style = SS_RIGHT;
- class.named = 0;
- class.u.id = CTL_STATIC;
- res_text_field = (yyvsp[(2) - (2)].id);
- }
- break;
-
- case 101:
-#line 826 "rcparse.y"
- {
- (yyval.dialog_control) = (yyvsp[(4) - (4)].dialog_control);
- }
- break;
-
- case 102:
-#line 830 "rcparse.y"
- {
- default_style = SBS_HORZ;
- base_style = 0;
- class.named = 0;
- class.u.id = CTL_SCROLLBAR;
- res_text_field = res_null_text;
- }
- break;
-
- case 103:
-#line 838 "rcparse.y"
- {
- (yyval.dialog_control) = (yyvsp[(3) - (3)].dialog_control);
- }
- break;
-
- case 104:
-#line 842 "rcparse.y"
- {
- default_style = BS_3STATE | WS_TABSTOP;
- base_style = BS_3STATE;
- class.named = 0;
- class.u.id = CTL_BUTTON;
- res_text_field = (yyvsp[(2) - (2)].id);
- }
- break;
-
- case 105:
-#line 850 "rcparse.y"
- {
- (yyval.dialog_control) = (yyvsp[(4) - (4)].dialog_control);
- }
- break;
-
- case 106:
-#line 855 "rcparse.y"
- { style = WS_CHILD | WS_VISIBLE; }
- break;
-
- case 107:
-#line 857 "rcparse.y"
- {
- rc_res_id cid;
- cid.named = 0;
- cid.u.id = CTL_BUTTON;
- (yyval.dialog_control) = define_control ((yyvsp[(2) - (15)].id), (yyvsp[(3) - (15)].il), (yyvsp[(5) - (15)].il), (yyvsp[(7) - (15)].il), (yyvsp[(9) - (15)].il), (yyvsp[(11) - (15)].il), cid,
- style, (yyvsp[(15) - (15)].il));
- }
- break;
-
- case 108:
-#line 875 "rcparse.y"
- {
- (yyval.dialog_control) = define_control (res_text_field, (yyvsp[(1) - (6)].il), (yyvsp[(2) - (6)].il), (yyvsp[(3) - (6)].il), (yyvsp[(4) - (6)].il), (yyvsp[(5) - (6)].il), class,
- default_style | WS_CHILD | WS_VISIBLE, 0);
- if ((yyvsp[(6) - (6)].rcdata_item) != NULL)
- {
- if (dialog.ex == NULL)
- rcparse_warning (_("control data requires DIALOGEX"));
- (yyval.dialog_control)->data = (yyvsp[(6) - (6)].rcdata_item);
- }
- }
- break;
-
- case 109:
-#line 887 "rcparse.y"
- {
- (yyval.dialog_control) = define_control (res_text_field, (yyvsp[(1) - (8)].il), (yyvsp[(2) - (8)].il), (yyvsp[(3) - (8)].il), (yyvsp[(4) - (8)].il), (yyvsp[(5) - (8)].il), class, style, (yyvsp[(7) - (8)].il));
- if ((yyvsp[(8) - (8)].rcdata_item) != NULL)
- {
- if (dialog.ex == NULL)
- rcparse_warning (_("control data requires DIALOGEX"));
- (yyval.dialog_control)->data = (yyvsp[(8) - (8)].rcdata_item);
- }
- }
- break;
-
- case 110:
-#line 898 "rcparse.y"
- {
- (yyval.dialog_control) = define_control (res_text_field, (yyvsp[(1) - (9)].il), (yyvsp[(2) - (9)].il), (yyvsp[(3) - (9)].il), (yyvsp[(4) - (9)].il), (yyvsp[(5) - (9)].il), class, style, (yyvsp[(7) - (9)].il));
- if (dialog.ex == NULL)
- rcparse_warning (_("help ID requires DIALOGEX"));
- (yyval.dialog_control)->help = (yyvsp[(8) - (9)].il);
- (yyval.dialog_control)->data = (yyvsp[(9) - (9)].rcdata_item);
- }
- break;
-
- case 111:
-#line 909 "rcparse.y"
- {
- if ((yyvsp[(2) - (2)].id).named)
- res_unistring_to_id (&(yyval.id), (yyvsp[(2) - (2)].id).u.n.name);
- else
- (yyval.id)=(yyvsp[(2) - (2)].id);
- }
- break;
-
- case 112:
-#line 919 "rcparse.y"
- {
- res_string_to_id (&(yyval.id), "");
- }
- break;
-
- case 113:
-#line 922 "rcparse.y"
- { (yyval.id)=(yyvsp[(1) - (2)].id); }
- break;
-
- case 114:
-#line 927 "rcparse.y"
- {
- (yyval.id).named = 0;
- (yyval.id).u.id = (yyvsp[(1) - (1)].il);
- }
- break;
-
- case 115:
-#line 932 "rcparse.y"
- {
- (yyval.id).named = 1;
- (yyval.id).u.n.name = (yyvsp[(1) - (1)].uni);
- (yyval.id).u.n.length = unichar_len ((yyvsp[(1) - (1)].uni));
- }
- break;
-
- case 116:
-#line 941 "rcparse.y"
- {
- (yyval.rcdata_item) = NULL;
- }
- break;
-
- case 117:
-#line 945 "rcparse.y"
- {
- (yyval.rcdata_item) = (yyvsp[(2) - (3)].rcdata).first;
- }
- break;
-
- case 118:
-#line 954 "rcparse.y"
- { style = WS_CHILD | WS_VISIBLE; }
- break;
-
- case 120:
-#line 960 "rcparse.y"
- { style = SS_ICON | WS_CHILD | WS_VISIBLE; }
- break;
-
- case 122:
-#line 966 "rcparse.y"
- { style = base_style | WS_CHILD | WS_VISIBLE; }
- break;
-
- case 124:
-#line 974 "rcparse.y"
- {
- define_font ((yyvsp[(1) - (4)].id), &(yyvsp[(3) - (4)].res_info), (yyvsp[(4) - (4)].s));
- if (yychar != YYEMPTY)
- YYERROR;
- rcparse_discard_strings ();
- }
- break;
-
- case 125:
-#line 986 "rcparse.y"
- {
- define_icon ((yyvsp[(1) - (4)].id), &(yyvsp[(3) - (4)].res_info), (yyvsp[(4) - (4)].s));
- if (yychar != YYEMPTY)
- YYERROR;
- rcparse_discard_strings ();
- }
- break;
-
- case 126:
-#line 999 "rcparse.y"
- {
- language = (yyvsp[(2) - (3)].il) | ((yyvsp[(3) - (3)].il) << SUBLANG_SHIFT);
- }
- break;
-
- case 127:
-#line 1008 "rcparse.y"
- {
- define_menu ((yyvsp[(1) - (6)].id), &(yyvsp[(3) - (6)].res_info), (yyvsp[(5) - (6)].menuitem));
- if (yychar != YYEMPTY)
- YYERROR;
- rcparse_discard_strings ();
- }
- break;
-
- case 128:
-#line 1018 "rcparse.y"
- {
- (yyval.menuitem) = NULL;
- }
- break;
-
- case 129:
-#line 1022 "rcparse.y"
- {
- if ((yyvsp[(1) - (2)].menuitem) == NULL)
- (yyval.menuitem) = (yyvsp[(2) - (2)].menuitem);
- else
- {
- rc_menuitem **pp;
-
- for (pp = &(yyvsp[(1) - (2)].menuitem)->next; *pp != NULL; pp = &(*pp)->next)
- ;
- *pp = (yyvsp[(2) - (2)].menuitem);
- (yyval.menuitem) = (yyvsp[(1) - (2)].menuitem);
- }
- }
- break;
-
- case 130:
-#line 1039 "rcparse.y"
- {
- (yyval.menuitem) = define_menuitem ((yyvsp[(2) - (4)].uni), (yyvsp[(3) - (4)].il), (yyvsp[(4) - (4)].is), 0, 0, NULL);
- }
- break;
-
- case 131:
-#line 1043 "rcparse.y"
- {
- (yyval.menuitem) = define_menuitem (NULL, 0, 0, 0, 0, NULL);
- }
- break;
-
- case 132:
-#line 1047 "rcparse.y"
- {
- (yyval.menuitem) = define_menuitem ((yyvsp[(2) - (6)].uni), 0, (yyvsp[(3) - (6)].is), 0, 0, (yyvsp[(5) - (6)].menuitem));
- }
- break;
-
- case 133:
-#line 1054 "rcparse.y"
- {
- (yyval.is) = 0;
- }
- break;
-
- case 134:
-#line 1058 "rcparse.y"
- {
- (yyval.is) = (yyvsp[(1) - (3)].is) | (yyvsp[(3) - (3)].is);
- }
- break;
-
- case 135:
-#line 1062 "rcparse.y"
- {
- (yyval.is) = (yyvsp[(1) - (2)].is) | (yyvsp[(2) - (2)].is);
- }
- break;
-
- case 136:
-#line 1069 "rcparse.y"
- {
- (yyval.is) = MENUITEM_CHECKED;
- }
- break;
-
- case 137:
-#line 1073 "rcparse.y"
- {
- (yyval.is) = MENUITEM_GRAYED;
- }
- break;
-
- case 138:
-#line 1077 "rcparse.y"
- {
- (yyval.is) = MENUITEM_HELP;
- }
- break;
-
- case 139:
-#line 1081 "rcparse.y"
- {
- (yyval.is) = MENUITEM_INACTIVE;
- }
- break;
-
- case 140:
-#line 1085 "rcparse.y"
- {
- (yyval.is) = MENUITEM_MENUBARBREAK;
- }
- break;
-
- case 141:
-#line 1089 "rcparse.y"
- {
- (yyval.is) = MENUITEM_MENUBREAK;
- }
- break;
-
- case 142:
-#line 1098 "rcparse.y"
- {
- define_menu ((yyvsp[(1) - (6)].id), &(yyvsp[(3) - (6)].res_info), (yyvsp[(5) - (6)].menuitem));
- if (yychar != YYEMPTY)
- YYERROR;
- rcparse_discard_strings ();
- }
- break;
-
- case 143:
-#line 1108 "rcparse.y"
- {
- (yyval.menuitem) = NULL;
- }
- break;
-
- case 144:
-#line 1112 "rcparse.y"
- {
- if ((yyvsp[(1) - (2)].menuitem) == NULL)
- (yyval.menuitem) = (yyvsp[(2) - (2)].menuitem);
- else
- {
- rc_menuitem **pp;
-
- for (pp = &(yyvsp[(1) - (2)].menuitem)->next; *pp != NULL; pp = &(*pp)->next)
- ;
- *pp = (yyvsp[(2) - (2)].menuitem);
- (yyval.menuitem) = (yyvsp[(1) - (2)].menuitem);
- }
- }
- break;
-
- case 145:
-#line 1129 "rcparse.y"
- {
- (yyval.menuitem) = define_menuitem ((yyvsp[(2) - (2)].uni), 0, 0, 0, 0, NULL);
- }
- break;
-
- case 146:
-#line 1133 "rcparse.y"
- {
- (yyval.menuitem) = define_menuitem ((yyvsp[(2) - (3)].uni), (yyvsp[(3) - (3)].il), 0, 0, 0, NULL);
- }
- break;
-
- case 147:
-#line 1137 "rcparse.y"
- {
- (yyval.menuitem) = define_menuitem ((yyvsp[(2) - (5)].uni), (yyvsp[(3) - (5)].il), (yyvsp[(4) - (5)].il), (yyvsp[(5) - (5)].il), 0, NULL);
- }
- break;
-
- case 148:
-#line 1141 "rcparse.y"
- {
- (yyval.menuitem) = define_menuitem (NULL, 0, 0, 0, 0, NULL);
- }
- break;
-
- case 149:
-#line 1145 "rcparse.y"
- {
- (yyval.menuitem) = define_menuitem ((yyvsp[(2) - (5)].uni), 0, 0, 0, 0, (yyvsp[(4) - (5)].menuitem));
- }
- break;
-
- case 150:
-#line 1149 "rcparse.y"
- {
- (yyval.menuitem) = define_menuitem ((yyvsp[(2) - (6)].uni), (yyvsp[(3) - (6)].il), 0, 0, 0, (yyvsp[(5) - (6)].menuitem));
- }
- break;
-
- case 151:
-#line 1153 "rcparse.y"
- {
- (yyval.menuitem) = define_menuitem ((yyvsp[(2) - (7)].uni), (yyvsp[(3) - (7)].il), (yyvsp[(4) - (7)].il), 0, 0, (yyvsp[(6) - (7)].menuitem));
- }
- break;
-
- case 152:
-#line 1158 "rcparse.y"
- {
- (yyval.menuitem) = define_menuitem ((yyvsp[(2) - (9)].uni), (yyvsp[(3) - (9)].il), (yyvsp[(4) - (9)].il), (yyvsp[(5) - (9)].il), (yyvsp[(6) - (9)].il), (yyvsp[(8) - (9)].menuitem));
- }
- break;
-
- case 153:
-#line 1167 "rcparse.y"
- {
- define_messagetable ((yyvsp[(1) - (4)].id), &(yyvsp[(3) - (4)].res_info), (yyvsp[(4) - (4)].s));
- if (yychar != YYEMPTY)
- YYERROR;
- rcparse_discard_strings ();
- }
- break;
-
- case 154:
-#line 1179 "rcparse.y"
- {
- rcparse_rcdata ();
- }
- break;
-
- case 155:
-#line 1183 "rcparse.y"
- {
- rcparse_normal ();
- (yyval.rcdata) = (yyvsp[(2) - (2)].rcdata);
- }
- break;
-
- case 156:
-#line 1191 "rcparse.y"
- {
- (yyval.rcdata).first = NULL;
- (yyval.rcdata).last = NULL;
- }
- break;
-
- case 157:
-#line 1196 "rcparse.y"
- {
- (yyval.rcdata) = (yyvsp[(1) - (1)].rcdata);
- }
- break;
-
- case 158:
-#line 1203 "rcparse.y"
- {
- rc_rcdata_item *ri;
-
- ri = define_rcdata_string ((yyvsp[(1) - (1)].ss).s, (yyvsp[(1) - (1)].ss).length);
- (yyval.rcdata).first = ri;
- (yyval.rcdata).last = ri;
- }
- break;
-
- case 159:
-#line 1211 "rcparse.y"
- {
- rc_rcdata_item *ri;
-
- ri = define_rcdata_unistring ((yyvsp[(1) - (1)].suni).s, (yyvsp[(1) - (1)].suni).length);
- (yyval.rcdata).first = ri;
- (yyval.rcdata).last = ri;
- }
- break;
-
- case 160:
-#line 1219 "rcparse.y"
- {
- rc_rcdata_item *ri;
-
- ri = define_rcdata_number ((yyvsp[(1) - (1)].i).val, (yyvsp[(1) - (1)].i).dword);
- (yyval.rcdata).first = ri;
- (yyval.rcdata).last = ri;
- }
- break;
-
- case 161:
-#line 1227 "rcparse.y"
- {
- rc_rcdata_item *ri;
-
- ri = define_rcdata_string ((yyvsp[(3) - (3)].ss).s, (yyvsp[(3) - (3)].ss).length);
- (yyval.rcdata).first = (yyvsp[(1) - (3)].rcdata).first;
- (yyvsp[(1) - (3)].rcdata).last->next = ri;
- (yyval.rcdata).last = ri;
- }
- break;
-
- case 162:
-#line 1236 "rcparse.y"
- {
- rc_rcdata_item *ri;
-
- ri = define_rcdata_unistring ((yyvsp[(3) - (3)].suni).s, (yyvsp[(3) - (3)].suni).length);
- (yyval.rcdata).first = (yyvsp[(1) - (3)].rcdata).first;
- (yyvsp[(1) - (3)].rcdata).last->next = ri;
- (yyval.rcdata).last = ri;
- }
- break;
-
- case 163:
-#line 1245 "rcparse.y"
- {
- rc_rcdata_item *ri;
-
- ri = define_rcdata_number ((yyvsp[(3) - (3)].i).val, (yyvsp[(3) - (3)].i).dword);
- (yyval.rcdata).first = (yyvsp[(1) - (3)].rcdata).first;
- (yyvsp[(1) - (3)].rcdata).last->next = ri;
- (yyval.rcdata).last = ri;
- }
- break;
-
- case 164:
-#line 1254 "rcparse.y"
- {
- (yyval.rcdata)=(yyvsp[(1) - (2)].rcdata);
- }
- break;
-
- case 165:
-#line 1263 "rcparse.y"
- { sub_res_info = (yyvsp[(2) - (3)].res_info); rcparse_rcdata (); }
- break;
-
- case 166:
-#line 1264 "rcparse.y"
- { rcparse_normal (); }
- break;
-
- case 168:
-#line 1270 "rcparse.y"
- {
- define_stringtable (&sub_res_info, (yyvsp[(2) - (3)].il), (yyvsp[(3) - (3)].suni).s, (yyvsp[(3) - (3)].suni).length);
- rcparse_discard_strings ();
- }
- break;
-
- case 169:
-#line 1275 "rcparse.y"
- {
- define_stringtable (&sub_res_info, (yyvsp[(2) - (4)].il), (yyvsp[(4) - (4)].suni).s, (yyvsp[(4) - (4)].suni).length);
- rcparse_discard_strings ();
- }
- break;
-
- case 170:
-#line 1280 "rcparse.y"
- {
- rcparse_warning (_("invalid stringtable resource."));
- abort ();
- }
- break;
-
- case 171:
-#line 1288 "rcparse.y"
- {
- (yyval.id)=(yyvsp[(1) - (1)].id);
- }
- break;
-
- case 172:
-#line 1292 "rcparse.y"
- {
- (yyval.id).named = 0;
- (yyval.id).u.id = 23;
- }
- break;
-
- case 173:
-#line 1297 "rcparse.y"
- {
- (yyval.id).named = 0;
- (yyval.id).u.id = RT_RCDATA;
- }
- break;
-
- case 174:
-#line 1302 "rcparse.y"
- {
- (yyval.id).named = 0;
- (yyval.id).u.id = RT_MANIFEST;
- }
- break;
-
- case 175:
-#line 1307 "rcparse.y"
- {
- (yyval.id).named = 0;
- (yyval.id).u.id = RT_PLUGPLAY;
- }
- break;
-
- case 176:
-#line 1312 "rcparse.y"
- {
- (yyval.id).named = 0;
- (yyval.id).u.id = RT_VXD;
- }
- break;
-
- case 177:
-#line 1317 "rcparse.y"
- {
- (yyval.id).named = 0;
- (yyval.id).u.id = RT_DLGINCLUDE;
- }
- break;
-
- case 178:
-#line 1322 "rcparse.y"
- {
- (yyval.id).named = 0;
- (yyval.id).u.id = RT_DLGINIT;
- }
- break;
-
- case 179:
-#line 1327 "rcparse.y"
- {
- (yyval.id).named = 0;
- (yyval.id).u.id = RT_ANICURSOR;
- }
- break;
-
- case 180:
-#line 1332 "rcparse.y"
- {
- (yyval.id).named = 0;
- (yyval.id).u.id = RT_ANIICON;
- }
- break;
-
- case 181:
-#line 1343 "rcparse.y"
- {
- define_user_data ((yyvsp[(1) - (6)].id), (yyvsp[(2) - (6)].id), &(yyvsp[(3) - (6)].res_info), (yyvsp[(5) - (6)].rcdata).first);
- if (yychar != YYEMPTY)
- YYERROR;
- rcparse_discard_strings ();
- }
- break;
-
- case 182:
-#line 1350 "rcparse.y"
- {
- define_user_file ((yyvsp[(1) - (4)].id), (yyvsp[(2) - (4)].id), &(yyvsp[(3) - (4)].res_info), (yyvsp[(4) - (4)].s));
- if (yychar != YYEMPTY)
- YYERROR;
- rcparse_discard_strings ();
- }
- break;
-
- case 183:
-#line 1360 "rcparse.y"
- {
- define_toolbar ((yyvsp[(1) - (8)].id), &(yyvsp[(3) - (8)].res_info), (yyvsp[(4) - (8)].il), (yyvsp[(5) - (8)].il), (yyvsp[(7) - (8)].toobar_item));
- }
- break;
-
- case 184:
-#line 1365 "rcparse.y"
- { (yyval.toobar_item)= NULL; }
- break;
-
- case 185:
-#line 1367 "rcparse.y"
- {
- rc_toolbar_item *c,*n;
- c = (yyvsp[(1) - (3)].toobar_item);
- n= (rc_toolbar_item *)
- res_alloc (sizeof (rc_toolbar_item));
- if (c != NULL)
- while (c->next != NULL)
- c = c->next;
- n->prev = c;
- n->next = NULL;
- if (c != NULL)
- c->next = n;
- n->id = (yyvsp[(3) - (3)].id);
- if ((yyvsp[(1) - (3)].toobar_item) == NULL)
- (yyval.toobar_item) = n;
- else
- (yyval.toobar_item) = (yyvsp[(1) - (3)].toobar_item);
- }
- break;
-
- case 186:
-#line 1386 "rcparse.y"
- {
- rc_toolbar_item *c,*n;
- c = (yyvsp[(1) - (2)].toobar_item);
- n= (rc_toolbar_item *)
- res_alloc (sizeof (rc_toolbar_item));
- if (c != NULL)
- while (c->next != NULL)
- c = c->next;
- n->prev = c;
- n->next = NULL;
- if (c != NULL)
- c->next = n;
- n->id.named = 0;
- n->id.u.id = 0;
- if ((yyvsp[(1) - (2)].toobar_item) == NULL)
- (yyval.toobar_item) = n;
- else
- (yyval.toobar_item) = (yyvsp[(1) - (2)].toobar_item);
- }
- break;
-
- case 187:
-#line 1411 "rcparse.y"
- {
- define_versioninfo ((yyvsp[(1) - (6)].id), language, (yyvsp[(3) - (6)].fixver), (yyvsp[(5) - (6)].verinfo));
- if (yychar != YYEMPTY)
- YYERROR;
- rcparse_discard_strings ();
- }
- break;
-
- case 188:
-#line 1421 "rcparse.y"
- {
- (yyval.fixver) = ((rc_fixed_versioninfo *)
- res_alloc (sizeof (rc_fixed_versioninfo)));
- memset ((yyval.fixver), 0, sizeof (rc_fixed_versioninfo));
- }
- break;
-
- case 189:
-#line 1428 "rcparse.y"
- {
- (yyvsp[(1) - (6)].fixver)->file_version_ms = ((yyvsp[(3) - (6)].il) << 16) | (yyvsp[(4) - (6)].il);
- (yyvsp[(1) - (6)].fixver)->file_version_ls = ((yyvsp[(5) - (6)].il) << 16) | (yyvsp[(6) - (6)].il);
- (yyval.fixver) = (yyvsp[(1) - (6)].fixver);
- }
- break;
-
- case 190:
-#line 1435 "rcparse.y"
- {
- (yyvsp[(1) - (6)].fixver)->product_version_ms = ((yyvsp[(3) - (6)].il) << 16) | (yyvsp[(4) - (6)].il);
- (yyvsp[(1) - (6)].fixver)->product_version_ls = ((yyvsp[(5) - (6)].il) << 16) | (yyvsp[(6) - (6)].il);
- (yyval.fixver) = (yyvsp[(1) - (6)].fixver);
- }
- break;
-
- case 191:
-#line 1441 "rcparse.y"
- {
- (yyvsp[(1) - (3)].fixver)->file_flags_mask = (yyvsp[(3) - (3)].il);
- (yyval.fixver) = (yyvsp[(1) - (3)].fixver);
- }
- break;
-
- case 192:
-#line 1446 "rcparse.y"
- {
- (yyvsp[(1) - (3)].fixver)->file_flags = (yyvsp[(3) - (3)].il);
- (yyval.fixver) = (yyvsp[(1) - (3)].fixver);
- }
- break;
-
- case 193:
-#line 1451 "rcparse.y"
- {
- (yyvsp[(1) - (3)].fixver)->file_os = (yyvsp[(3) - (3)].il);
- (yyval.fixver) = (yyvsp[(1) - (3)].fixver);
- }
- break;
-
- case 194:
-#line 1456 "rcparse.y"
- {
- (yyvsp[(1) - (3)].fixver)->file_type = (yyvsp[(3) - (3)].il);
- (yyval.fixver) = (yyvsp[(1) - (3)].fixver);
- }
- break;
-
- case 195:
-#line 1461 "rcparse.y"
- {
- (yyvsp[(1) - (3)].fixver)->file_subtype = (yyvsp[(3) - (3)].il);
- (yyval.fixver) = (yyvsp[(1) - (3)].fixver);
- }
- break;
-
- case 196:
-#line 1475 "rcparse.y"
- {
- (yyval.verinfo) = NULL;
- }
- break;
-
- case 197:
-#line 1479 "rcparse.y"
- {
- (yyval.verinfo) = append_ver_stringfileinfo ((yyvsp[(1) - (5)].verinfo), (yyvsp[(4) - (5)].verstringtable));
- }
- break;
-
- case 198:
-#line 1483 "rcparse.y"
- {
- (yyval.verinfo) = append_ver_varfileinfo ((yyvsp[(1) - (7)].verinfo), (yyvsp[(5) - (7)].uni), (yyvsp[(6) - (7)].vervar));
- }
- break;
-
- case 199:
-#line 1490 "rcparse.y"
- {
- (yyval.verstringtable) = NULL;
- }
- break;
-
- case 200:
-#line 1494 "rcparse.y"
- {
- (yyval.verstringtable) = append_ver_stringtable ((yyvsp[(1) - (5)].verstringtable), (yyvsp[(2) - (5)].s), (yyvsp[(4) - (5)].verstring));
- }
- break;
-
- case 201:
-#line 1501 "rcparse.y"
- {
- (yyval.verstring) = NULL;
- }
- break;
-
- case 202:
-#line 1505 "rcparse.y"
- {
- (yyval.verstring) = append_verval ((yyvsp[(1) - (5)].verstring), (yyvsp[(3) - (5)].uni), (yyvsp[(5) - (5)].uni));
- }
- break;
-
- case 203:
-#line 1512 "rcparse.y"
- {
- (yyval.vervar) = NULL;
- }
- break;
-
- case 204:
-#line 1516 "rcparse.y"
- {
- (yyval.vervar) = append_vertrans ((yyvsp[(1) - (3)].vervar), (yyvsp[(2) - (3)].il), (yyvsp[(3) - (3)].il));
- }
- break;
-
- case 205:
-#line 1525 "rcparse.y"
- {
- (yyval.id).named = 0;
- (yyval.id).u.id = (yyvsp[(1) - (1)].il);
- }
- break;
-
- case 206:
-#line 1530 "rcparse.y"
- {
- res_unistring_to_id (&(yyval.id), (yyvsp[(1) - (1)].uni));
- }
- break;
-
- case 207:
-#line 1539 "rcparse.y"
- {
- (yyval.uni) = (yyvsp[(1) - (1)].uni);
- }
- break;
-
- case 208:
-#line 1543 "rcparse.y"
- {
- unichar *h = NULL;
- unicode_from_ascii ((rc_uint_type *) NULL, &h, (yyvsp[(1) - (1)].s));
- (yyval.uni) = h;
- }
- break;
-
- case 209:
-#line 1553 "rcparse.y"
- {
- (yyval.id).named = 0;
- (yyval.id).u.id = (yyvsp[(1) - (2)].il);
- }
- break;
-
- case 210:
-#line 1558 "rcparse.y"
- {
- res_unistring_to_id (&(yyval.id), (yyvsp[(1) - (1)].uni));
- }
- break;
-
- case 211:
-#line 1562 "rcparse.y"
- {
- res_unistring_to_id (&(yyval.id), (yyvsp[(1) - (2)].uni));
- }
- break;
-
- case 212:
-#line 1572 "rcparse.y"
- {
- memset (&(yyval.res_info), 0, sizeof (rc_res_res_info));
- (yyval.res_info).language = language;
- /* FIXME: Is this the right default? */
- (yyval.res_info).memflags = MEMFLAG_MOVEABLE | MEMFLAG_PURE | MEMFLAG_DISCARDABLE;
- }
- break;
-
- case 213:
-#line 1579 "rcparse.y"
- {
- (yyval.res_info) = (yyvsp[(1) - (2)].res_info);
- (yyval.res_info).memflags |= (yyvsp[(2) - (2)].memflags).on;
- (yyval.res_info).memflags &=~ (yyvsp[(2) - (2)].memflags).off;
- }
- break;
-
- case 214:
-#line 1585 "rcparse.y"
- {
- (yyval.res_info) = (yyvsp[(1) - (3)].res_info);
- (yyval.res_info).characteristics = (yyvsp[(3) - (3)].il);
- }
- break;
-
- case 215:
-#line 1590 "rcparse.y"
- {
- (yyval.res_info) = (yyvsp[(1) - (4)].res_info);
- (yyval.res_info).language = (yyvsp[(3) - (4)].il) | ((yyvsp[(4) - (4)].il) << SUBLANG_SHIFT);
- }
- break;
-
- case 216:
-#line 1595 "rcparse.y"
- {
- (yyval.res_info) = (yyvsp[(1) - (3)].res_info);
- (yyval.res_info).version = (yyvsp[(3) - (3)].il);
- }
- break;
-
- case 217:
-#line 1605 "rcparse.y"
- {
- memset (&(yyval.res_info), 0, sizeof (rc_res_res_info));
- (yyval.res_info).language = language;
- (yyval.res_info).memflags = MEMFLAG_MOVEABLE | MEMFLAG_DISCARDABLE;
- }
- break;
-
- case 218:
-#line 1611 "rcparse.y"
- {
- (yyval.res_info) = (yyvsp[(1) - (2)].res_info);
- (yyval.res_info).memflags |= (yyvsp[(2) - (2)].memflags).on;
- (yyval.res_info).memflags &=~ (yyvsp[(2) - (2)].memflags).off;
- }
- break;
-
- case 219:
-#line 1622 "rcparse.y"
- {
- memset (&(yyval.res_info), 0, sizeof (rc_res_res_info));
- (yyval.res_info).language = language;
- (yyval.res_info).memflags = MEMFLAG_MOVEABLE | MEMFLAG_PURE | MEMFLAG_DISCARDABLE;
- }
- break;
-
- case 220:
-#line 1628 "rcparse.y"
- {
- (yyval.res_info) = (yyvsp[(1) - (2)].res_info);
- (yyval.res_info).memflags |= (yyvsp[(2) - (2)].memflags).on;
- (yyval.res_info).memflags &=~ (yyvsp[(2) - (2)].memflags).off;
- }
- break;
-
- case 221:
-#line 1640 "rcparse.y"
- {
- (yyval.memflags).on = MEMFLAG_MOVEABLE;
- (yyval.memflags).off = 0;
- }
- break;
-
- case 222:
-#line 1645 "rcparse.y"
- {
- (yyval.memflags).on = 0;
- (yyval.memflags).off = MEMFLAG_MOVEABLE;
- }
- break;
-
- case 223:
-#line 1650 "rcparse.y"
- {
- (yyval.memflags).on = MEMFLAG_PURE;
- (yyval.memflags).off = 0;
- }
- break;
-
- case 224:
-#line 1655 "rcparse.y"
- {
- (yyval.memflags).on = 0;
- (yyval.memflags).off = MEMFLAG_PURE;
- }
- break;
-
- case 225:
-#line 1660 "rcparse.y"
- {
- (yyval.memflags).on = MEMFLAG_PRELOAD;
- (yyval.memflags).off = 0;
- }
- break;
-
- case 226:
-#line 1665 "rcparse.y"
- {
- (yyval.memflags).on = 0;
- (yyval.memflags).off = MEMFLAG_PRELOAD;
- }
- break;
-
- case 227:
-#line 1670 "rcparse.y"
- {
- (yyval.memflags).on = MEMFLAG_DISCARDABLE;
- (yyval.memflags).off = 0;
- }
- break;
-
- case 228:
-#line 1680 "rcparse.y"
- {
- (yyval.s) = (yyvsp[(1) - (1)].s);
- }
- break;
-
- case 229:
-#line 1684 "rcparse.y"
- {
- (yyval.s) = (yyvsp[(1) - (1)].s);
- }
- break;
-
- case 230:
-#line 1692 "rcparse.y"
- {
- (yyval.uni) = (yyvsp[(1) - (1)].uni);
- }
- break;
-
- case 231:
-#line 1697 "rcparse.y"
- {
- rc_uint_type l1 = unichar_len ((yyvsp[(1) - (2)].uni));
- rc_uint_type l2 = unichar_len ((yyvsp[(2) - (2)].uni));
- unichar *h = (unichar *) res_alloc ((l1 + l2 + 1) * sizeof (unichar));
- if (l1 != 0)
- memcpy (h, (yyvsp[(1) - (2)].uni), l1 * sizeof (unichar));
- if (l2 != 0)
- memcpy (h + l1, (yyvsp[(2) - (2)].uni), l2 * sizeof (unichar));
- h[l1 + l2] = 0;
- (yyval.uni) = h;
- }
- break;
-
- case 232:
-#line 1712 "rcparse.y"
- {
- (yyval.uni) = unichar_dup ((yyvsp[(1) - (1)].uni));
- }
- break;
-
- case 233:
-#line 1716 "rcparse.y"
- {
- unichar *h = NULL;
- unicode_from_ascii ((rc_uint_type *) NULL, &h, (yyvsp[(1) - (1)].s));
- (yyval.uni) = h;
- }
- break;
-
- case 234:
-#line 1725 "rcparse.y"
- {
- (yyval.suni) = (yyvsp[(1) - (1)].suni);
- }
- break;
-
- case 235:
-#line 1729 "rcparse.y"
- {
- unichar *h = NULL;
- rc_uint_type l = 0;
- unicode_from_ascii_len (&l, &h, (yyvsp[(1) - (1)].ss).s, (yyvsp[(1) - (1)].ss).length);
- (yyval.suni).s = h;
- (yyval.suni).length = l;
- }
- break;
-
- case 236:
-#line 1741 "rcparse.y"
- {
- (yyval.suni) = (yyvsp[(1) - (1)].suni);
- }
- break;
-
- case 237:
-#line 1746 "rcparse.y"
- {
- rc_uint_type l1 = (yyvsp[(1) - (2)].suni).length;
- rc_uint_type l2 = (yyvsp[(2) - (2)].suni).length;
- unichar *h = (unichar *) res_alloc ((l1 + l2 + 1) * sizeof (unichar));
- if (l1 != 0)
- memcpy (h, (yyvsp[(1) - (2)].suni).s, l1 * sizeof (unichar));
- if (l2 != 0)
- memcpy (h + l1, (yyvsp[(2) - (2)].suni).s, l2 * sizeof (unichar));
- h[l1 + l2] = 0;
- (yyval.suni).length = l1 + l2;
- (yyval.suni).s = h;
- }
- break;
-
- case 238:
-#line 1762 "rcparse.y"
- {
- (yyval.ss) = (yyvsp[(1) - (1)].ss);
- }
- break;
-
- case 239:
-#line 1766 "rcparse.y"
- {
- rc_uint_type l = (yyvsp[(1) - (2)].ss).length + (yyvsp[(2) - (2)].ss).length;
- char *h = (char *) res_alloc (l);
- memcpy (h, (yyvsp[(1) - (2)].ss).s, (yyvsp[(1) - (2)].ss).length);
- memcpy (h + (yyvsp[(1) - (2)].ss).length, (yyvsp[(2) - (2)].ss).s, (yyvsp[(2) - (2)].ss).length);
- (yyval.ss).s = h;
- (yyval.ss).length = l;
- }
- break;
-
- case 240:
-#line 1778 "rcparse.y"
- {
- (yyval.suni) = (yyvsp[(1) - (1)].suni);
- }
- break;
-
- case 241:
-#line 1782 "rcparse.y"
- {
- rc_uint_type l = (yyvsp[(1) - (2)].suni).length + (yyvsp[(2) - (2)].suni).length;
- unichar *h = (unichar *) res_alloc (l * sizeof (unichar));
- memcpy (h, (yyvsp[(1) - (2)].suni).s, (yyvsp[(1) - (2)].suni).length * sizeof (unichar));
- memcpy (h + (yyvsp[(1) - (2)].suni).length, (yyvsp[(2) - (2)].suni).s, (yyvsp[(2) - (2)].suni).length * sizeof (unichar));
- (yyval.suni).s = h;
- (yyval.suni).length = l;
- }
- break;
-
- case 242:
-#line 1804 "rcparse.y"
- {
- style |= (yyvsp[(1) - (1)].il);
- }
- break;
-
- case 243:
-#line 1808 "rcparse.y"
- {
- style &=~ (yyvsp[(2) - (2)].il);
- }
- break;
-
- case 244:
-#line 1812 "rcparse.y"
- {
- style |= (yyvsp[(3) - (3)].il);
- }
- break;
-
- case 245:
-#line 1816 "rcparse.y"
- {
- style &=~ (yyvsp[(4) - (4)].il);
- }
- break;
-
- case 246:
-#line 1823 "rcparse.y"
- {
- (yyval.il) = (yyvsp[(1) - (1)].i).val;
- }
- break;
-
- case 247:
-#line 1827 "rcparse.y"
- {
- (yyval.il) = (yyvsp[(2) - (3)].il);
- }
- break;
-
- case 248:
-#line 1836 "rcparse.y"
- {
- (yyval.il) = 0;
- }
- break;
-
- case 249:
-#line 1840 "rcparse.y"
- {
- (yyval.il) = (yyvsp[(1) - (1)].il);
- }
- break;
-
- case 250:
-#line 1849 "rcparse.y"
- {
- (yyval.il) = (yyvsp[(2) - (2)].il);
- }
- break;
-
- case 251:
-#line 1858 "rcparse.y"
- {
- (yyval.il) = (yyvsp[(1) - (1)].i).val;
- }
- break;
-
- case 252:
-#line 1867 "rcparse.y"
- {
- (yyval.i) = (yyvsp[(1) - (1)].i);
- }
- break;
-
- case 253:
-#line 1871 "rcparse.y"
- {
- (yyval.i) = (yyvsp[(2) - (3)].i);
- }
- break;
-
- case 254:
-#line 1875 "rcparse.y"
- {
- (yyval.i).val = ~ (yyvsp[(2) - (2)].i).val;
- (yyval.i).dword = (yyvsp[(2) - (2)].i).dword;
- }
- break;
-
- case 255:
-#line 1880 "rcparse.y"
- {
- (yyval.i).val = - (yyvsp[(2) - (2)].i).val;
- (yyval.i).dword = (yyvsp[(2) - (2)].i).dword;
- }
- break;
-
- case 256:
-#line 1885 "rcparse.y"
- {
- (yyval.i).val = (yyvsp[(1) - (3)].i).val * (yyvsp[(3) - (3)].i).val;
- (yyval.i).dword = (yyvsp[(1) - (3)].i).dword || (yyvsp[(3) - (3)].i).dword;
- }
- break;
-
- case 257:
-#line 1890 "rcparse.y"
- {
- (yyval.i).val = (yyvsp[(1) - (3)].i).val / (yyvsp[(3) - (3)].i).val;
- (yyval.i).dword = (yyvsp[(1) - (3)].i).dword || (yyvsp[(3) - (3)].i).dword;
- }
- break;
-
- case 258:
-#line 1895 "rcparse.y"
- {
- (yyval.i).val = (yyvsp[(1) - (3)].i).val % (yyvsp[(3) - (3)].i).val;
- (yyval.i).dword = (yyvsp[(1) - (3)].i).dword || (yyvsp[(3) - (3)].i).dword;
- }
- break;
-
- case 259:
-#line 1900 "rcparse.y"
- {
- (yyval.i).val = (yyvsp[(1) - (3)].i).val + (yyvsp[(3) - (3)].i).val;
- (yyval.i).dword = (yyvsp[(1) - (3)].i).dword || (yyvsp[(3) - (3)].i).dword;
- }
- break;
-
- case 260:
-#line 1905 "rcparse.y"
- {
- (yyval.i).val = (yyvsp[(1) - (3)].i).val - (yyvsp[(3) - (3)].i).val;
- (yyval.i).dword = (yyvsp[(1) - (3)].i).dword || (yyvsp[(3) - (3)].i).dword;
- }
- break;
-
- case 261:
-#line 1910 "rcparse.y"
- {
- (yyval.i).val = (yyvsp[(1) - (3)].i).val & (yyvsp[(3) - (3)].i).val;
- (yyval.i).dword = (yyvsp[(1) - (3)].i).dword || (yyvsp[(3) - (3)].i).dword;
- }
- break;
-
- case 262:
-#line 1915 "rcparse.y"
- {
- (yyval.i).val = (yyvsp[(1) - (3)].i).val ^ (yyvsp[(3) - (3)].i).val;
- (yyval.i).dword = (yyvsp[(1) - (3)].i).dword || (yyvsp[(3) - (3)].i).dword;
- }
- break;
-
- case 263:
-#line 1920 "rcparse.y"
- {
- (yyval.i).val = (yyvsp[(1) - (3)].i).val | (yyvsp[(3) - (3)].i).val;
- (yyval.i).dword = (yyvsp[(1) - (3)].i).dword || (yyvsp[(3) - (3)].i).dword;
- }
- break;
-
- case 264:
-#line 1931 "rcparse.y"
- {
- (yyval.il) = (yyvsp[(2) - (2)].il);
- }
- break;
-
- case 265:
-#line 1940 "rcparse.y"
- {
- (yyval.il) = (yyvsp[(1) - (1)].i).val;
- }
- break;
-
- case 266:
-#line 1951 "rcparse.y"
- {
- (yyval.i) = (yyvsp[(1) - (1)].i);
- }
- break;
-
- case 267:
-#line 1955 "rcparse.y"
- {
- (yyval.i) = (yyvsp[(2) - (3)].i);
- }
- break;
-
- case 268:
-#line 1959 "rcparse.y"
- {
- (yyval.i).val = ~ (yyvsp[(2) - (2)].i).val;
- (yyval.i).dword = (yyvsp[(2) - (2)].i).dword;
- }
- break;
-
- case 269:
-#line 1964 "rcparse.y"
- {
- (yyval.i).val = (yyvsp[(1) - (3)].i).val * (yyvsp[(3) - (3)].i).val;
- (yyval.i).dword = (yyvsp[(1) - (3)].i).dword || (yyvsp[(3) - (3)].i).dword;
- }
- break;
-
- case 270:
-#line 1969 "rcparse.y"
- {
- (yyval.i).val = (yyvsp[(1) - (3)].i).val / (yyvsp[(3) - (3)].i).val;
- (yyval.i).dword = (yyvsp[(1) - (3)].i).dword || (yyvsp[(3) - (3)].i).dword;
- }
- break;
-
- case 271:
-#line 1974 "rcparse.y"
- {
- (yyval.i).val = (yyvsp[(1) - (3)].i).val % (yyvsp[(3) - (3)].i).val;
- (yyval.i).dword = (yyvsp[(1) - (3)].i).dword || (yyvsp[(3) - (3)].i).dword;
- }
- break;
-
- case 272:
-#line 1979 "rcparse.y"
- {
- (yyval.i).val = (yyvsp[(1) - (3)].i).val + (yyvsp[(3) - (3)].i).val;
- (yyval.i).dword = (yyvsp[(1) - (3)].i).dword || (yyvsp[(3) - (3)].i).dword;
- }
- break;
-
- case 273:
-#line 1984 "rcparse.y"
- {
- (yyval.i).val = (yyvsp[(1) - (3)].i).val - (yyvsp[(3) - (3)].i).val;
- (yyval.i).dword = (yyvsp[(1) - (3)].i).dword || (yyvsp[(3) - (3)].i).dword;
- }
- break;
-
- case 274:
-#line 1989 "rcparse.y"
- {
- (yyval.i).val = (yyvsp[(1) - (3)].i).val & (yyvsp[(3) - (3)].i).val;
- (yyval.i).dword = (yyvsp[(1) - (3)].i).dword || (yyvsp[(3) - (3)].i).dword;
- }
- break;
-
- case 275:
-#line 1994 "rcparse.y"
- {
- (yyval.i).val = (yyvsp[(1) - (3)].i).val ^ (yyvsp[(3) - (3)].i).val;
- (yyval.i).dword = (yyvsp[(1) - (3)].i).dword || (yyvsp[(3) - (3)].i).dword;
- }
- break;
-
- case 276:
-#line 1999 "rcparse.y"
- {
- (yyval.i).val = (yyvsp[(1) - (3)].i).val | (yyvsp[(3) - (3)].i).val;
- (yyval.i).dword = (yyvsp[(1) - (3)].i).dword || (yyvsp[(3) - (3)].i).dword;
- }
- break;
-
-
-/* Line 1267 of yacc.c. */
-#line 4440 "rcparse.c"
- default: break;
- }
- YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
-
- YYPOPSTACK (yylen);
- yylen = 0;
- YY_STACK_PRINT (yyss, yyssp);
-
- *++yyvsp = yyval;
-
-
- /* Now `shift' the result of the reduction. Determine what state
- that goes to, based on the state we popped back to and the rule
- number reduced by. */
-
- yyn = yyr1[yyn];
-
- yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
- if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
- yystate = yytable[yystate];
- else
- yystate = yydefgoto[yyn - YYNTOKENS];
-
- goto yynewstate;
-
-
-/*------------------------------------.
-| yyerrlab -- here on detecting error |
-`------------------------------------*/
-yyerrlab:
- /* If not already recovering from an error, report this error. */
- if (!yyerrstatus)
- {
- ++yynerrs;
-#if ! YYERROR_VERBOSE
- yyerror (YY_("syntax error"));
-#else
- {
- YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
- if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
- {
- YYSIZE_T yyalloc = 2 * yysize;
- if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
- yyalloc = YYSTACK_ALLOC_MAXIMUM;
- if (yymsg != yymsgbuf)
- YYSTACK_FREE (yymsg);
- yymsg = (char *) YYSTACK_ALLOC (yyalloc);
- if (yymsg)
- yymsg_alloc = yyalloc;
- else
- {
- yymsg = yymsgbuf;
- yymsg_alloc = sizeof yymsgbuf;
- }
- }
-
- if (0 < yysize && yysize <= yymsg_alloc)
- {
- (void) yysyntax_error (yymsg, yystate, yychar);
- yyerror (yymsg);
- }
- else
- {
- yyerror (YY_("syntax error"));
- if (yysize != 0)
- goto yyexhaustedlab;
- }
- }
-#endif
- }
-
-
-
- if (yyerrstatus == 3)
- {
- /* If just tried and failed to reuse look-ahead token after an
- error, discard it. */
-
- if (yychar <= YYEOF)
- {
- /* Return failure if at end of input. */
- if (yychar == YYEOF)
- YYABORT;
- }
- else
- {
- yydestruct ("Error: discarding",
- yytoken, &yylval);
- yychar = YYEMPTY;
- }
- }
-
- /* Else will try to reuse look-ahead token after shifting the error
- token. */
- goto yyerrlab1;
-
-
-/*---------------------------------------------------.
-| yyerrorlab -- error raised explicitly by YYERROR. |
-`---------------------------------------------------*/
-yyerrorlab:
-
- /* Pacify compilers like GCC when the user code never invokes
- YYERROR and the label yyerrorlab therefore never appears in user
- code. */
- if (/*CONSTCOND*/ 0)
- goto yyerrorlab;
-
- /* Do not reclaim the symbols of the rule which action triggered
- this YYERROR. */
- YYPOPSTACK (yylen);
- yylen = 0;
- YY_STACK_PRINT (yyss, yyssp);
- yystate = *yyssp;
- goto yyerrlab1;
-
-
-/*-------------------------------------------------------------.
-| yyerrlab1 -- common code for both syntax error and YYERROR. |
-`-------------------------------------------------------------*/
-yyerrlab1:
- yyerrstatus = 3; /* Each real token shifted decrements this. */
-
- for (;;)
- {
- yyn = yypact[yystate];
- if (yyn != YYPACT_NINF)
- {
- yyn += YYTERROR;
- if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
- {
- yyn = yytable[yyn];
- if (0 < yyn)
- break;
- }
- }
-
- /* Pop the current state because it cannot handle the error token. */
- if (yyssp == yyss)
- YYABORT;
-
-
- yydestruct ("Error: popping",
- yystos[yystate], yyvsp);
- YYPOPSTACK (1);
- yystate = *yyssp;
- YY_STACK_PRINT (yyss, yyssp);
- }
-
- if (yyn == YYFINAL)
- YYACCEPT;
-
- *++yyvsp = yylval;
-
-
- /* Shift the error token. */
- YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
-
- yystate = yyn;
- goto yynewstate;
-
-
-/*-------------------------------------.
-| yyacceptlab -- YYACCEPT comes here. |
-`-------------------------------------*/
-yyacceptlab:
- yyresult = 0;
- goto yyreturn;
-
-/*-----------------------------------.
-| yyabortlab -- YYABORT comes here. |
-`-----------------------------------*/
-yyabortlab:
- yyresult = 1;
- goto yyreturn;
-
-#ifndef yyoverflow
-/*-------------------------------------------------.
-| yyexhaustedlab -- memory exhaustion comes here. |
-`-------------------------------------------------*/
-yyexhaustedlab:
- yyerror (YY_("memory exhausted"));
- yyresult = 2;
- /* Fall through. */
-#endif
-
-yyreturn:
- if (yychar != YYEOF && yychar != YYEMPTY)
- yydestruct ("Cleanup: discarding lookahead",
- yytoken, &yylval);
- /* Do not reclaim the symbols of the rule which action triggered
- this YYABORT or YYACCEPT. */
- YYPOPSTACK (yylen);
- YY_STACK_PRINT (yyss, yyssp);
- while (yyssp != yyss)
- {
- yydestruct ("Cleanup: popping",
- yystos[*yyssp], yyvsp);
- YYPOPSTACK (1);
- }
-#ifndef yyoverflow
- if (yyss != yyssa)
- YYSTACK_FREE (yyss);
-#endif
-#if YYERROR_VERBOSE
- if (yymsg != yymsgbuf)
- YYSTACK_FREE (yymsg);
-#endif
- /* Make sure YYID is used. */
- return YYID (yyresult);
-}
-
-
-#line 2005 "rcparse.y"
-
-
-/* Set the language from the command line. */
-
-void
-rcparse_set_language (int lang)
-{
- language = lang;
-}
-
diff -Nur binutils-2.24.orig/binutils/rcparse.h binutils-2.24/binutils/rcparse.h
--- binutils-2.24.orig/binutils/rcparse.h 2013-11-18 09:49:30.000000000 +0100
+++ binutils-2.24/binutils/rcparse.h 1970-01-01 01:00:00.000000000 +0100
@@ -1,298 +0,0 @@
-/* A Bison parser, made by GNU Bison 2.3. */
-
-/* Skeleton interface for Bison's Yacc-like parsers in C
-
- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
- Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA. */
-
-/* As a special exception, you may create a larger work that contains
- part or all of the Bison parser skeleton and distribute that work
- under terms of your choice, so long as that work isn't itself a
- parser generator using the skeleton or a modified version thereof
- as a parser skeleton. Alternatively, if you modify or redistribute
- the parser skeleton itself, you may (at your option) remove this
- special exception, which will cause the skeleton and the resulting
- Bison output files to be licensed under the GNU General Public
- License without this special exception.
-
- This special exception was added by the Free Software Foundation in
- version 2.2 of Bison. */
-
-/* Tokens. */
-#ifndef YYTOKENTYPE
-# define YYTOKENTYPE
- /* Put the tokens into the symbol table, so that GDB and other debuggers
- know about them. */
- enum yytokentype {
- BEG = 258,
- END = 259,
- ACCELERATORS = 260,
- VIRTKEY = 261,
- ASCII = 262,
- NOINVERT = 263,
- SHIFT = 264,
- CONTROL = 265,
- ALT = 266,
- BITMAP = 267,
- CURSOR = 268,
- DIALOG = 269,
- DIALOGEX = 270,
- EXSTYLE = 271,
- CAPTION = 272,
- CLASS = 273,
- STYLE = 274,
- AUTO3STATE = 275,
- AUTOCHECKBOX = 276,
- AUTORADIOBUTTON = 277,
- CHECKBOX = 278,
- COMBOBOX = 279,
- CTEXT = 280,
- DEFPUSHBUTTON = 281,
- EDITTEXT = 282,
- GROUPBOX = 283,
- LISTBOX = 284,
- LTEXT = 285,
- PUSHBOX = 286,
- PUSHBUTTON = 287,
- RADIOBUTTON = 288,
- RTEXT = 289,
- SCROLLBAR = 290,
- STATE3 = 291,
- USERBUTTON = 292,
- BEDIT = 293,
- HEDIT = 294,
- IEDIT = 295,
- FONT = 296,
- ICON = 297,
- ANICURSOR = 298,
- ANIICON = 299,
- DLGINCLUDE = 300,
- DLGINIT = 301,
- FONTDIR = 302,
- HTML = 303,
- MANIFEST = 304,
- PLUGPLAY = 305,
- VXD = 306,
- TOOLBAR = 307,
- BUTTON = 308,
- LANGUAGE = 309,
- CHARACTERISTICS = 310,
- VERSIONK = 311,
- MENU = 312,
- MENUEX = 313,
- MENUITEM = 314,
- SEPARATOR = 315,
- POPUP = 316,
- CHECKED = 317,
- GRAYED = 318,
- HELP = 319,
- INACTIVE = 320,
- MENUBARBREAK = 321,
- MENUBREAK = 322,
- MESSAGETABLE = 323,
- RCDATA = 324,
- STRINGTABLE = 325,
- VERSIONINFO = 326,
- FILEVERSION = 327,
- PRODUCTVERSION = 328,
- FILEFLAGSMASK = 329,
- FILEFLAGS = 330,
- FILEOS = 331,
- FILETYPE = 332,
- FILESUBTYPE = 333,
- BLOCKSTRINGFILEINFO = 334,
- BLOCKVARFILEINFO = 335,
- VALUE = 336,
- BLOCK = 337,
- MOVEABLE = 338,
- FIXED = 339,
- PURE = 340,
- IMPURE = 341,
- PRELOAD = 342,
- LOADONCALL = 343,
- DISCARDABLE = 344,
- NOT = 345,
- QUOTEDUNISTRING = 346,
- QUOTEDSTRING = 347,
- STRING = 348,
- NUMBER = 349,
- SIZEDUNISTRING = 350,
- SIZEDSTRING = 351,
- IGNORED_TOKEN = 352,
- NEG = 353
- };
-#endif
-/* Tokens. */
-#define BEG 258
-#define END 259
-#define ACCELERATORS 260
-#define VIRTKEY 261
-#define ASCII 262
-#define NOINVERT 263
-#define SHIFT 264
-#define CONTROL 265
-#define ALT 266
-#define BITMAP 267
-#define CURSOR 268
-#define DIALOG 269
-#define DIALOGEX 270
-#define EXSTYLE 271
-#define CAPTION 272
-#define CLASS 273
-#define STYLE 274
-#define AUTO3STATE 275
-#define AUTOCHECKBOX 276
-#define AUTORADIOBUTTON 277
-#define CHECKBOX 278
-#define COMBOBOX 279
-#define CTEXT 280
-#define DEFPUSHBUTTON 281
-#define EDITTEXT 282
-#define GROUPBOX 283
-#define LISTBOX 284
-#define LTEXT 285
-#define PUSHBOX 286
-#define PUSHBUTTON 287
-#define RADIOBUTTON 288
-#define RTEXT 289
-#define SCROLLBAR 290
-#define STATE3 291
-#define USERBUTTON 292
-#define BEDIT 293
-#define HEDIT 294
-#define IEDIT 295
-#define FONT 296
-#define ICON 297
-#define ANICURSOR 298
-#define ANIICON 299
-#define DLGINCLUDE 300
-#define DLGINIT 301
-#define FONTDIR 302
-#define HTML 303
-#define MANIFEST 304
-#define PLUGPLAY 305
-#define VXD 306
-#define TOOLBAR 307
-#define BUTTON 308
-#define LANGUAGE 309
-#define CHARACTERISTICS 310
-#define VERSIONK 311
-#define MENU 312
-#define MENUEX 313
-#define MENUITEM 314
-#define SEPARATOR 315
-#define POPUP 316
-#define CHECKED 317
-#define GRAYED 318
-#define HELP 319
-#define INACTIVE 320
-#define MENUBARBREAK 321
-#define MENUBREAK 322
-#define MESSAGETABLE 323
-#define RCDATA 324
-#define STRINGTABLE 325
-#define VERSIONINFO 326
-#define FILEVERSION 327
-#define PRODUCTVERSION 328
-#define FILEFLAGSMASK 329
-#define FILEFLAGS 330
-#define FILEOS 331
-#define FILETYPE 332
-#define FILESUBTYPE 333
-#define BLOCKSTRINGFILEINFO 334
-#define BLOCKVARFILEINFO 335
-#define VALUE 336
-#define BLOCK 337
-#define MOVEABLE 338
-#define FIXED 339
-#define PURE 340
-#define IMPURE 341
-#define PRELOAD 342
-#define LOADONCALL 343
-#define DISCARDABLE 344
-#define NOT 345
-#define QUOTEDUNISTRING 346
-#define QUOTEDSTRING 347
-#define STRING 348
-#define NUMBER 349
-#define SIZEDUNISTRING 350
-#define SIZEDSTRING 351
-#define IGNORED_TOKEN 352
-#define NEG 353
-
-
-
-
-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-typedef union YYSTYPE
-#line 69 "rcparse.y"
-{
- rc_accelerator acc;
- rc_accelerator *pacc;
- rc_dialog_control *dialog_control;
- rc_menuitem *menuitem;
- struct
- {
- rc_rcdata_item *first;
- rc_rcdata_item *last;
- } rcdata;
- rc_rcdata_item *rcdata_item;
- rc_fixed_versioninfo *fixver;
- rc_ver_info *verinfo;
- rc_ver_stringtable *verstringtable;
- rc_ver_stringinfo *verstring;
- rc_ver_varinfo *vervar;
- rc_toolbar_item *toobar_item;
- rc_res_id id;
- rc_res_res_info res_info;
- struct
- {
- rc_uint_type on;
- rc_uint_type off;
- } memflags;
- struct
- {
- rc_uint_type val;
- /* Nonzero if this number was explicitly specified as long. */
- int dword;
- } i;
- rc_uint_type il;
- rc_uint_type is;
- const char *s;
- struct
- {
- rc_uint_type length;
- const char *s;
- } ss;
- unichar *uni;
- struct
- {
- rc_uint_type length;
- const unichar *s;
- } suni;
-}
-/* Line 1529 of yacc.c. */
-#line 291 "rcparse.h"
- YYSTYPE;
-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
-# define YYSTYPE_IS_DECLARED 1
-# define YYSTYPE_IS_TRIVIAL 1
-#endif
-
-extern YYSTYPE yylval;
-
diff -Nur binutils-2.24.orig/binutils/readelf.c binutils-2.24/binutils/readelf.c
--- binutils-2.24.orig/binutils/readelf.c 2013-11-18 09:40:15.000000000 +0100
+++ binutils-2.24/binutils/readelf.c 2024-05-17 16:15:39.019345578 +0200
@@ -131,6 +131,7 @@
#include "elf/moxie.h"
#include "elf/mt.h"
#include "elf/msp430.h"
+#include "elf/nds32.h"
#include "elf/nios2.h"
#include "elf/or32.h"
#include "elf/pj.h"
@@ -626,6 +627,7 @@
case EM_MSP430:
case EM_MSP430_OLD:
case EM_MT:
+ case EM_NDS32:
case EM_NIOS32:
case EM_PPC64:
case EM_PPC:
@@ -1144,6 +1146,10 @@
rtype = elf_msp430_reloc_type (type);
break;
+ case EM_NDS32:
+ rtype = elf_nds32_reloc_type (type);
+ break;
+
case EM_PPC:
rtype = elf_ppc_reloc_type (type);
break;
@@ -2307,6 +2313,215 @@
strcat (buf,_(", "));
}
+static void
+decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
+{
+ unsigned abi;
+ unsigned arch;
+ unsigned config;
+ unsigned version;
+ int has_fpu = 0;
+ int r = 0;
+
+ static const char *ABI_STRINGS[] = {
+ [E_NDS_ABI_V0 >> EF_NDS_ABI_SHIFT] = "ABI v0", /* use r5 as return register; only used in N1213HC */
+ [E_NDS_ABI_V1 >> EF_NDS_ABI_SHIFT] = "ABI v1", /* use r0 as return register */
+ [E_NDS_ABI_V2 >> EF_NDS_ABI_SHIFT] = "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
+ [E_NDS_ABI_V2FP >> EF_NDS_ABI_SHIFT] = "ABI v2fp", /* for FPU */
+ [E_NDS_ABI_AABI >> EF_NDS_ABI_SHIFT] = "AABI",
+ [E_NDS_ABI_V2FP_PLUS >> EF_NDS_ABI_SHIFT] = "ABI2 FP+"
+ };
+ static const char *VER_STRINGS[] = {
+ [E_NDS32_ELF_VER_1_2 >> EF_NDS32_ELF_VERSION_SHIFT] = "Andes ELF V1.3 or older",
+ [E_NDS32_ELF_VER_1_3 >> EF_NDS32_ELF_VERSION_SHIFT] = "Andes ELF V1.3.1",
+ [E_NDS32_ELF_VER_1_4 >> EF_NDS32_ELF_VERSION_SHIFT] = "Andes ELF V1.4",
+ };
+ static const char *ARCH_STRINGS[] = {
+ [E_NDS_ARCH_STAR_V1_0 >> EF_NDS_ARCH_SHIFT] = "Andes Star v1.0",
+ [E_NDS_ARCH_STAR_V2_0 >> EF_NDS_ARCH_SHIFT] = "Andes Star v2.0",
+ [E_NDS_ARCH_STAR_V3_0 >> EF_NDS_ARCH_SHIFT] = "Andes Star v3.0",
+ [E_NDS_ARCH_STAR_V3_M >> EF_NDS_ARCH_SHIFT] = "Andes Star v3.0m"
+ };
+
+ abi = EF_NDS_ABI & e_flags;
+ arch = EF_NDS_ARCH & e_flags;
+ config = EF_NDS_INST & e_flags;
+ version = EF_NDS32_ELF_VERSION & e_flags;
+
+ memset (buf, 0, size);
+
+ switch (abi)
+ {
+ case E_NDS_ABI_V0:
+ case E_NDS_ABI_V1:
+ case E_NDS_ABI_V2:
+ case E_NDS_ABI_V2FP:
+ case E_NDS_ABI_AABI:
+ case E_NDS_ABI_V2FP_PLUS:
+ /* In case there are holes in the array. */
+ r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
+ break;
+
+ default:
+ r += snprintf (buf + r, size - r, ", ");
+ break;
+ }
+
+ switch (version)
+ {
+ case E_NDS32_ELF_VER_1_2:
+ case E_NDS32_ELF_VER_1_3:
+ case E_NDS32_ELF_VER_1_4:
+ r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
+ break;
+
+ default:
+ r += snprintf (buf + r, size - r, ", ");
+ break;
+ }
+
+ if (E_NDS_ABI_V0 == abi)
+ {
+ /* OLD ABI; only used in N1213HC, has performance extension 1 */
+ r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
+ if (arch == E_NDS_ARCH_STAR_V1_0)
+ r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
+ return;
+ }
+
+ switch (arch)
+ {
+ case E_NDS_ARCH_STAR_V1_0:
+ case E_NDS_ARCH_STAR_V2_0:
+ case E_NDS_ARCH_STAR_V3_0:
+ case E_NDS_ARCH_STAR_V3_M:
+ r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
+ break;
+
+ default:
+ r += snprintf (buf + r, size - r, ", ");
+ /* ARCH version determines how the e_flags are interpreted.
+ If it is unknown, we cannot proceed. */
+ return;
+ }
+
+ /* newer ABI; Now handle architecture specific flags. */
+ if (arch == E_NDS_ARCH_STAR_V1_0)
+ {
+ if (config & E_NDS32_HAS_MFUSR_PC_INST)
+ r += snprintf (buf + r, size -r, ", MFUSR_PC");
+
+ if (!(config & E_NDS32_HAS_NO_MAC_INST))
+ r += snprintf (buf + r, size -r, ", MAC");
+
+ if (config & E_NDS32_HAS_DIV_INST)
+ r += snprintf (buf + r, size -r, ", DIV");
+
+ if (config & E_NDS32_HAS_16BIT_INST)
+ r += snprintf (buf + r, size -r, ", 16b");
+ }
+ else
+ {
+ if (config & E_NDS32_HAS_MFUSR_PC_INST)
+ {
+ if (version <= E_NDS32_ELF_VER_1_3)
+ r += snprintf (buf + r, size -r, ", [B8]");
+ else
+ r += snprintf (buf + r, size -r, ", EX9");
+ }
+
+ if (config & E_NDS32_HAS_MAC_DX_INST)
+ r += snprintf (buf + r, size -r, ", MAC_DX");
+
+ if (config & E_NDS32_HAS_DIV_DX_INST)
+ r += snprintf (buf + r, size -r, ", DIV_DX");
+
+ if (config & E_NDS32_HAS_16BIT_INST)
+ {
+ if (version <= E_NDS32_ELF_VER_1_3)
+ r += snprintf (buf + r, size -r, ", 16b");
+ else
+ r += snprintf (buf + r, size -r, ", IFC");
+ }
+ }
+
+ if (config & E_NDS32_HAS_EXT_INST)
+ r += snprintf (buf + r, size -r, ", PERF1");
+
+ if (config & E_NDS32_HAS_EXT2_INST)
+ r += snprintf (buf + r, size -r, ", PERF2");
+
+ if (config & E_NDS32_HAS_FPU_INST)
+ {
+ has_fpu = 1;
+ r += snprintf (buf + r, size -r, ", FPU_SP");
+ }
+
+ if (config & E_NDS32_HAS_FPU_DP_INST)
+ {
+ has_fpu = 1;
+ r += snprintf (buf + r, size -r, ", FPU_DP");
+ }
+
+ if (config & E_NDS32_HAS_FPU_MAC_INST)
+ {
+ has_fpu = 1;
+ r += snprintf (buf + r, size -r, ", FPU_MAC");
+ }
+
+ if (config & E_NDS32_HAS_DSP_INST)
+ {
+ r += snprintf (buf + r, size -r, ", DSP");
+ }
+
+ if (config & E_NDS32_HAS_ZOL)
+ {
+ r += snprintf (buf + r, size -r, ", ZOL");
+ }
+
+ if (has_fpu)
+ {
+ switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
+ {
+ case E_NDS32_FPU_REG_8SP_4DP:
+ r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
+ break;
+ case E_NDS32_FPU_REG_16SP_8DP:
+ r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
+ break;
+ case E_NDS32_FPU_REG_32SP_16DP:
+ r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
+ break;
+ case E_NDS32_FPU_REG_32SP_32DP:
+ r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
+ break;
+ }
+ }
+
+ if (config & E_NDS32_HAS_AUDIO_INST)
+ r += snprintf (buf + r, size -r, ", AUDIO");
+
+ if (config & E_NDS32_HAS_STRING_INST)
+ r += snprintf (buf + r, size -r, ", STR");
+
+ if (config & E_NDS32_HAS_REDUCED_REGS)
+ r += snprintf (buf + r, size -r, ", 16REG");
+
+ if (config & E_NDS32_HAS_VIDEO_INST)
+ {
+ if (version <= E_NDS32_ELF_VER_1_3)
+ r += snprintf (buf + r, size -r, ", VIDEO");
+ else
+ r += snprintf (buf + r, size -r, ", SATURATION");
+ }
+
+ if (config & E_NDS32_HAS_ENCRIPT_INST)
+ r += snprintf (buf + r, size -r, ", ENCRP");
+
+ if (config & E_NDS32_HAS_L2C_INST)
+ r += snprintf (buf + r, size -r, ", L2C");
+}
+
static char *
get_machine_flags (unsigned e_flags, unsigned e_machine)
{
@@ -2649,6 +2864,10 @@
}
break;
+ case EM_NDS32:
+ decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
+ break;
+
case EM_SH:
switch ((e_flags & EF_SH_MACH_MASK))
{
@@ -4171,7 +4390,7 @@
else
{
char fmt [32];
- int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX);
+ int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
if (ret >= (int) sizeof (fmt) || ret < 0)
error (_("Internal error: failed to create format string to display program interpreter\n"));
@@ -10257,6 +10476,8 @@
return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32. */
case EM_MT:
return reloc_type == 2; /* R_MT_32. */
+ case EM_NDS32:
+ return reloc_type == 20; /* R_NDS32_RELA. */
case EM_ALTERA_NIOS2:
return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32. */
case EM_NIOS32:
@@ -10510,6 +10731,8 @@
return reloc_type == 2; /* R_MSP430_ABS16. */
case EM_MSP430_OLD:
return reloc_type == 5; /* R_MSP430_16_BYTE. */
+ case EM_NDS32:
+ return reloc_type == 19; /* R_NDS32_RELA. */
case EM_ALTERA_NIOS2:
return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16. */
case EM_NIOS32:
@@ -10573,6 +10796,12 @@
return reloc_type == 0;
case EM_AARCH64:
return reloc_type == 0 || reloc_type == 256;
+ case EM_NDS32:
+ return (reloc_type == 0 /* R_XTENSA_NONE. */
+ || reloc_type == 204 /* R_NDS32_DIFF8. */
+ || reloc_type == 205 /* R_NDS32_DIFF16. */
+ || reloc_type == 206 /* R_NDS32_DIFF32. */
+ || reloc_type == 207 /* R_NDS32_ULEB128. */);
case EM_XTENSA_OLD:
case EM_XTENSA:
return (reloc_type == 0 /* R_XTENSA_NONE. */
@@ -12954,6 +13183,39 @@
}
static int
+process_nds32_specific (FILE * file)
+{
+ Elf_Internal_Shdr *sect = NULL;
+
+ sect = find_section (".nds32_e_flags");
+ if (sect != NULL)
+ {
+ unsigned int *flag;
+ printf ("\nNDS32 elf flags section:\n");
+ flag = get_data (NULL, file, sect->sh_offset, 1,
+ sect->sh_size, _("NDS32 elf flags section"));
+
+ switch ((*flag) & 0x3)
+ {
+ case 0:
+ printf ("(VEC_SIZE):\tNo entry.\n");
+ break;
+ case 1:
+ printf ("(VEC_SIZE):\t4 bytes\n");
+ break;
+ case 2:
+ printf ("(VEC_SIZE):\t16 bytes\n");
+ break;
+ case 3:
+ printf ("(VEC_SIZE):\treserved\n");
+ break;
+ }
+ }
+
+ return TRUE;
+}
+
+static int
process_gnu_liblist (FILE * file)
{
Elf_Internal_Shdr * section;
@@ -13779,6 +14041,9 @@
case EM_MIPS_RS3_LE:
return process_mips_specific (file);
break;
+ case EM_NDS32:
+ return process_nds32_specific (file);
+ break;
case EM_PPC:
return process_power_specific (file);
break;
diff -Nur binutils-2.24.orig/binutils/size.c binutils-2.24/binutils/size.c
--- binutils-2.24.orig/binutils/size.c 2013-11-04 16:33:37.000000000 +0100
+++ binutils-2.24/binutils/size.c 2024-05-17 16:15:39.019345578 +0200
@@ -436,6 +436,7 @@
static bfd_size_type bsssize;
static bfd_size_type datasize;
static bfd_size_type textsize;
+static bfd_size_type rodata_size;
static void
berkeley_sum (bfd *abfd ATTRIBUTE_UNUSED, sec_ptr sec,
@@ -449,6 +450,10 @@
return;
size = bfd_get_section_size (sec);
+
+ if ((flags & SEC_DATA) != 0 && (flags & SEC_READONLY) != 0 && (flags & SEC_CODE) == 0)
+ rodata_size = rodata_size + size;
+
if ((flags & SEC_CODE) != 0 || (flags & SEC_READONLY) != 0)
textsize += size;
else if ((flags & SEC_HAS_CONTENTS) != 0)
@@ -466,13 +471,15 @@
bsssize = 0;
datasize = 0;
textsize = 0;
+ rodata_size = 0;
bfd_map_over_sections (abfd, berkeley_sum, NULL);
bsssize += common_size;
if (files_seen++ == 0)
- puts ((radix == octal) ? " text\t data\t bss\t oct\t hex\tfilename" :
- " text\t data\t bss\t dec\t hex\tfilename");
+ puts ((radix == octal) ?
+ " text (code + rodata)\t data\t bss\t oct\t hex\tfilename" :
+ " text (code + rodata)\t data\t bss\t dec\t hex\tfilename");
total = textsize + datasize + bsssize;
@@ -484,6 +491,11 @@
}
rprint_number (7, textsize);
+ printf (" (");
+ rprint_number (4, (textsize - rodata_size));
+ printf (" + ");
+ rprint_number (6, rodata_size);
+ printf (")");
putchar ('\t');
rprint_number (7, datasize);
putchar ('\t');
diff -Nur binutils-2.24.orig/binutils/sysinfo.c binutils-2.24/binutils/sysinfo.c
--- binutils-2.24.orig/binutils/sysinfo.c 2013-11-18 09:49:30.000000000 +0100
+++ binutils-2.24/binutils/sysinfo.c 1970-01-01 01:00:00.000000000 +0100
@@ -1,1962 +0,0 @@
-/* A Bison parser, made by GNU Bison 2.3. */
-
-/* Skeleton implementation for Bison's Yacc-like parsers in C
-
- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
- Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA. */
-
-/* As a special exception, you may create a larger work that contains
- part or all of the Bison parser skeleton and distribute that work
- under terms of your choice, so long as that work isn't itself a
- parser generator using the skeleton or a modified version thereof
- as a parser skeleton. Alternatively, if you modify or redistribute
- the parser skeleton itself, you may (at your option) remove this
- special exception, which will cause the skeleton and the resulting
- Bison output files to be licensed under the GNU General Public
- License without this special exception.
-
- This special exception was added by the Free Software Foundation in
- version 2.2 of Bison. */
-
-/* C LALR(1) parser skeleton written by Richard Stallman, by
- simplifying the original so-called "semantic" parser. */
-
-/* All symbols defined below should begin with yy or YY, to avoid
- infringing on user name space. This should be done even for local
- variables, as they might otherwise be expanded by user macros.
- There are some unavoidable exceptions within include files to
- define necessary library symbols; they are noted "INFRINGES ON
- USER NAME SPACE" below. */
-
-/* Identify Bison output. */
-#define YYBISON 1
-
-/* Bison version. */
-#define YYBISON_VERSION "2.3"
-
-/* Skeleton name. */
-#define YYSKELETON_NAME "yacc.c"
-
-/* Pure parsers. */
-#define YYPURE 0
-
-/* Using locations. */
-#define YYLSP_NEEDED 0
-
-
-
-/* Tokens. */
-#ifndef YYTOKENTYPE
-# define YYTOKENTYPE
- /* Put the tokens into the symbol table, so that GDB and other debuggers
- know about them. */
- enum yytokentype {
- COND = 258,
- REPEAT = 259,
- TYPE = 260,
- NAME = 261,
- NUMBER = 262,
- UNIT = 263
- };
-#endif
-/* Tokens. */
-#define COND 258
-#define REPEAT 259
-#define TYPE 260
-#define NAME 261
-#define NUMBER 262
-#define UNIT 263
-
-
-
-
-/* Copy the first part of user declarations. */
-#line 21 "sysinfo.y"
-
-#include
-#include
-
-static char writecode;
-static char *it;
-static int code;
-static char * repeat;
-static char *oldrepeat;
-static char *name;
-static int rdepth;
-static char *names[] = {" ","[n]","[n][m]"};
-static char *pnames[]= {"","*","**"};
-
-static int yyerror (char *s);
-extern int yylex (void);
-
-
-/* Enabling traces. */
-#ifndef YYDEBUG
-# define YYDEBUG 0
-#endif
-
-/* Enabling verbose error messages. */
-#ifdef YYERROR_VERBOSE
-# undef YYERROR_VERBOSE
-# define YYERROR_VERBOSE 1
-#else
-# define YYERROR_VERBOSE 0
-#endif
-
-/* Enabling the token table. */
-#ifndef YYTOKEN_TABLE
-# define YYTOKEN_TABLE 0
-#endif
-
-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-typedef union YYSTYPE
-#line 40 "sysinfo.y"
-{
- int i;
- char *s;
-}
-/* Line 193 of yacc.c. */
-#line 135 "sysinfo.c"
- YYSTYPE;
-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
-# define YYSTYPE_IS_DECLARED 1
-# define YYSTYPE_IS_TRIVIAL 1
-#endif
-
-
-
-/* Copy the second part of user declarations. */
-
-
-/* Line 216 of yacc.c. */
-#line 148 "sysinfo.c"
-
-#ifdef short
-# undef short
-#endif
-
-#ifdef YYTYPE_UINT8
-typedef YYTYPE_UINT8 yytype_uint8;
-#else
-typedef unsigned char yytype_uint8;
-#endif
-
-#ifdef YYTYPE_INT8
-typedef YYTYPE_INT8 yytype_int8;
-#elif (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-typedef signed char yytype_int8;
-#else
-typedef short int yytype_int8;
-#endif
-
-#ifdef YYTYPE_UINT16
-typedef YYTYPE_UINT16 yytype_uint16;
-#else
-typedef unsigned short int yytype_uint16;
-#endif
-
-#ifdef YYTYPE_INT16
-typedef YYTYPE_INT16 yytype_int16;
-#else
-typedef short int yytype_int16;
-#endif
-
-#ifndef YYSIZE_T
-# ifdef __SIZE_TYPE__
-# define YYSIZE_T __SIZE_TYPE__
-# elif defined size_t
-# define YYSIZE_T size_t
-# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-# include /* INFRINGES ON USER NAME SPACE */
-# define YYSIZE_T size_t
-# else
-# define YYSIZE_T unsigned int
-# endif
-#endif
-
-#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
-
-#ifndef YY_
-# if defined YYENABLE_NLS && YYENABLE_NLS
-# if ENABLE_NLS
-# include /* INFRINGES ON USER NAME SPACE */
-# define YY_(msgid) dgettext ("bison-runtime", msgid)
-# endif
-# endif
-# ifndef YY_
-# define YY_(msgid) msgid
-# endif
-#endif
-
-/* Suppress unused-variable warnings by "using" E. */
-#if ! defined lint || defined __GNUC__
-# define YYUSE(e) ((void) (e))
-#else
-# define YYUSE(e) /* empty */
-#endif
-
-/* Identity function, used to suppress warnings about constant conditions. */
-#ifndef lint
-# define YYID(n) (n)
-#else
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static int
-YYID (int i)
-#else
-static int
-YYID (i)
- int i;
-#endif
-{
- return i;
-}
-#endif
-
-#if ! defined yyoverflow || YYERROR_VERBOSE
-
-/* The parser invokes alloca or malloc; define the necessary symbols. */
-
-# ifdef YYSTACK_USE_ALLOCA
-# if YYSTACK_USE_ALLOCA
-# ifdef __GNUC__
-# define YYSTACK_ALLOC __builtin_alloca
-# elif defined __BUILTIN_VA_ARG_INCR
-# include /* INFRINGES ON USER NAME SPACE */
-# elif defined _AIX
-# define YYSTACK_ALLOC __alloca
-# elif defined _MSC_VER
-# include /* INFRINGES ON USER NAME SPACE */
-# define alloca _alloca
-# else
-# define YYSTACK_ALLOC alloca
-# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-# include /* INFRINGES ON USER NAME SPACE */
-# ifndef _STDLIB_H
-# define _STDLIB_H 1
-# endif
-# endif
-# endif
-# endif
-# endif
-
-# ifdef YYSTACK_ALLOC
- /* Pacify GCC's `empty if-body' warning. */
-# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
-# ifndef YYSTACK_ALLOC_MAXIMUM
- /* The OS might guarantee only one guard page at the bottom of the stack,
- and a page size can be as small as 4096 bytes. So we cannot safely
- invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
- to allow for a few compiler-allocated temporary stack slots. */
-# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
-# endif
-# else
-# define YYSTACK_ALLOC YYMALLOC
-# define YYSTACK_FREE YYFREE
-# ifndef YYSTACK_ALLOC_MAXIMUM
-# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
-# endif
-# if (defined __cplusplus && ! defined _STDLIB_H \
- && ! ((defined YYMALLOC || defined malloc) \
- && (defined YYFREE || defined free)))
-# include /* INFRINGES ON USER NAME SPACE */
-# ifndef _STDLIB_H
-# define _STDLIB_H 1
-# endif
-# endif
-# ifndef YYMALLOC
-# define YYMALLOC malloc
-# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
-# endif
-# endif
-# ifndef YYFREE
-# define YYFREE free
-# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-void free (void *); /* INFRINGES ON USER NAME SPACE */
-# endif
-# endif
-# endif
-#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
-
-
-#if (! defined yyoverflow \
- && (! defined __cplusplus \
- || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
-
-/* A type that is properly aligned for any stack member. */
-union yyalloc
-{
- yytype_int16 yyss;
- YYSTYPE yyvs;
- };
-
-/* The size of the maximum gap between one aligned stack and the next. */
-# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
-
-/* The size of an array large to enough to hold all stacks, each with
- N elements. */
-# define YYSTACK_BYTES(N) \
- ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
- + YYSTACK_GAP_MAXIMUM)
-
-/* Copy COUNT objects from FROM to TO. The source and destination do
- not overlap. */
-# ifndef YYCOPY
-# if defined __GNUC__ && 1 < __GNUC__
-# define YYCOPY(To, From, Count) \
- __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
-# else
-# define YYCOPY(To, From, Count) \
- do \
- { \
- YYSIZE_T yyi; \
- for (yyi = 0; yyi < (Count); yyi++) \
- (To)[yyi] = (From)[yyi]; \
- } \
- while (YYID (0))
-# endif
-# endif
-
-/* Relocate STACK from its old location to the new one. The
- local variables YYSIZE and YYSTACKSIZE give the old and new number of
- elements in the stack, and YYPTR gives the new location of the
- stack. Advance YYPTR to a properly aligned location for the next
- stack. */
-# define YYSTACK_RELOCATE(Stack) \
- do \
- { \
- YYSIZE_T yynewbytes; \
- YYCOPY (&yyptr->Stack, Stack, yysize); \
- Stack = &yyptr->Stack; \
- yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
- yyptr += yynewbytes / sizeof (*yyptr); \
- } \
- while (YYID (0))
-
-#endif
-
-/* YYFINAL -- State number of the termination state. */
-#define YYFINAL 3
-/* YYLAST -- Last index in YYTABLE. */
-#define YYLAST 38
-
-/* YYNTOKENS -- Number of terminals. */
-#define YYNTOKENS 11
-/* YYNNTS -- Number of nonterminals. */
-#define YYNNTS 19
-/* YYNRULES -- Number of rules. */
-#define YYNRULES 27
-/* YYNRULES -- Number of states. */
-#define YYNSTATES 55
-
-/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
-#define YYUNDEFTOK 2
-#define YYMAXUTOK 263
-
-#define YYTRANSLATE(YYX) \
- ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
-
-/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */
-static const yytype_uint8 yytranslate[] =
-{
- 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 5, 6, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
- 7, 8, 9, 10
-};
-
-#if YYDEBUG
-/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
- YYRHS. */
-static const yytype_uint8 yyprhs[] =
-{
- 0, 0, 3, 4, 7, 10, 11, 12, 19, 22,
- 25, 28, 29, 30, 37, 38, 45, 46, 57, 59,
- 60, 64, 67, 71, 72, 73, 77, 78
-};
-
-/* YYRHS -- A `-1'-separated list of the rules' RHS. */
-static const yytype_int8 yyrhs[] =
-{
- 12, 0, -1, -1, 13, 14, -1, 15, 14, -1,
- -1, -1, 5, 8, 9, 16, 17, 6, -1, 22,
- 17, -1, 20, 17, -1, 18, 17, -1, -1, -1,
- 5, 4, 8, 19, 17, 6, -1, -1, 5, 3,
- 8, 21, 17, 6, -1, -1, 5, 25, 5, 24,
- 26, 6, 27, 23, 28, 6, -1, 7, -1, -1,
- 5, 8, 6, -1, 9, 10, -1, 5, 8, 6,
- -1, -1, -1, 5, 29, 6, -1, -1, 29, 5,
- 8, 8, 6, -1
-};
-
-/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
-static const yytype_uint16 yyrline[] =
-{
- 0, 54, 54, 54, 92, 93, 98, 97, 169, 170,
- 171, 172, 176, 175, 223, 222, 250, 249, 357, 358,
- 362, 367, 373, 374, 377, 378, 380, 382
-};
-#endif
-
-#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
-/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
- First, the terminals, then, starting at YYNTOKENS, nonterminals. */
-static const char *const yytname[] =
-{
- "$end", "error", "$undefined", "COND", "REPEAT", "'('", "')'", "TYPE",
- "NAME", "NUMBER", "UNIT", "$accept", "top", "@1", "it_list", "it", "@2",
- "it_field_list", "repeat_it_field", "@3", "cond_it_field", "@4",
- "it_field", "@5", "attr_type", "attr_desc", "attr_size", "attr_id",
- "enums", "enum_list", 0
-};
-#endif
-
-# ifdef YYPRINT
-/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
- token YYLEX-NUM. */
-static const yytype_uint16 yytoknum[] =
-{
- 0, 256, 257, 258, 259, 40, 41, 260, 261, 262,
- 263
-};
-# endif
-
-/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
-static const yytype_uint8 yyr1[] =
-{
- 0, 11, 13, 12, 14, 14, 16, 15, 17, 17,
- 17, 17, 19, 18, 21, 20, 23, 22, 24, 24,
- 25, 26, 27, 27, 28, 28, 29, 29
-};
-
-/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
-static const yytype_uint8 yyr2[] =
-{
- 0, 2, 0, 2, 2, 0, 0, 6, 2, 2,
- 2, 0, 0, 6, 0, 6, 0, 10, 1, 0,
- 3, 2, 3, 0, 0, 3, 0, 5
-};
-
-/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
- STATE-NUM when YYTABLE doesn't specify something else to do. Zero
- means the default is an error. */
-static const yytype_uint8 yydefact[] =
-{
- 2, 0, 5, 1, 0, 3, 5, 0, 4, 6,
- 11, 0, 0, 11, 11, 11, 0, 0, 0, 0,
- 7, 10, 9, 8, 14, 12, 0, 19, 11, 11,
- 20, 18, 0, 0, 0, 0, 0, 15, 13, 21,
- 23, 0, 16, 0, 24, 22, 26, 0, 0, 17,
- 0, 25, 0, 0, 27
-};
-
-/* YYDEFGOTO[NTERM-NUM]. */
-static const yytype_int8 yydefgoto[] =
-{
- -1, 1, 2, 5, 6, 10, 12, 13, 29, 14,
- 28, 15, 44, 32, 19, 36, 42, 47, 48
-};
-
-/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
- STATE-NUM. */
-#define YYPACT_NINF -14
-static const yytype_int8 yypact[] =
-{
- -14, 8, 4, -14, 2, -14, 4, 3, -14, -14,
- 6, 0, 7, 6, 6, 6, 9, 10, 11, 15,
- -14, -14, -14, -14, -14, -14, 16, 14, 6, 6,
- -14, -14, 5, 17, 18, 19, 20, -14, -14, -14,
- 22, 23, -14, 24, 27, -14, -14, 28, 1, -14,
- 25, -14, 29, 30, -14
-};
-
-/* YYPGOTO[NTERM-NUM]. */
-static const yytype_int8 yypgoto[] =
-{
- -14, -14, -14, 32, -14, -14, -13, -14, -14, -14,
- -14, -14, -14, -14, -14, -14, -14, -14, -14
-};
-
-/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
- positive, shift that token. If negative, reduce the rule which
- number is the opposite. If zero, do what YYDEFACT says.
- If YYTABLE_NINF, syntax error. */
-#define YYTABLE_NINF -1
-static const yytype_uint8 yytable[] =
-{
- 21, 22, 23, 16, 17, 18, 50, 51, 3, 4,
- 7, 11, 9, 20, 35, 33, 34, 24, 25, 26,
- 27, 31, 30, 37, 38, 0, 40, 41, 0, 39,
- 45, 43, 46, 52, 49, 0, 54, 53, 8
-};
-
-static const yytype_int8 yycheck[] =
-{
- 13, 14, 15, 3, 4, 5, 5, 6, 0, 5,
- 8, 5, 9, 6, 9, 28, 29, 8, 8, 8,
- 5, 7, 6, 6, 6, -1, 6, 5, -1, 10,
- 6, 8, 5, 8, 6, -1, 6, 8, 6
-};
-
-/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
- symbol of state STATE-NUM. */
-static const yytype_uint8 yystos[] =
-{
- 0, 12, 13, 0, 5, 14, 15, 8, 14, 9,
- 16, 5, 17, 18, 20, 22, 3, 4, 5, 25,
- 6, 17, 17, 17, 8, 8, 8, 5, 21, 19,
- 6, 7, 24, 17, 17, 9, 26, 6, 6, 10,
- 6, 5, 27, 8, 23, 6, 5, 28, 29, 6,
- 5, 6, 8, 8, 6
-};
-
-#define yyerrok (yyerrstatus = 0)
-#define yyclearin (yychar = YYEMPTY)
-#define YYEMPTY (-2)
-#define YYEOF 0
-
-#define YYACCEPT goto yyacceptlab
-#define YYABORT goto yyabortlab
-#define YYERROR goto yyerrorlab
-
-
-/* Like YYERROR except do call yyerror. This remains here temporarily
- to ease the transition to the new meaning of YYERROR, for GCC.
- Once GCC version 2 has supplanted version 1, this can go. */
-
-#define YYFAIL goto yyerrlab
-
-#define YYRECOVERING() (!!yyerrstatus)
-
-#define YYBACKUP(Token, Value) \
-do \
- if (yychar == YYEMPTY && yylen == 1) \
- { \
- yychar = (Token); \
- yylval = (Value); \
- yytoken = YYTRANSLATE (yychar); \
- YYPOPSTACK (1); \
- goto yybackup; \
- } \
- else \
- { \
- yyerror (YY_("syntax error: cannot back up")); \
- YYERROR; \
- } \
-while (YYID (0))
-
-
-#define YYTERROR 1
-#define YYERRCODE 256
-
-
-/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
- If N is 0, then set CURRENT to the empty location which ends
- the previous symbol: RHS[0] (always defined). */
-
-#define YYRHSLOC(Rhs, K) ((Rhs)[K])
-#ifndef YYLLOC_DEFAULT
-# define YYLLOC_DEFAULT(Current, Rhs, N) \
- do \
- if (YYID (N)) \
- { \
- (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \
- (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
- (Current).last_line = YYRHSLOC (Rhs, N).last_line; \
- (Current).last_column = YYRHSLOC (Rhs, N).last_column; \
- } \
- else \
- { \
- (Current).first_line = (Current).last_line = \
- YYRHSLOC (Rhs, 0).last_line; \
- (Current).first_column = (Current).last_column = \
- YYRHSLOC (Rhs, 0).last_column; \
- } \
- while (YYID (0))
-#endif
-
-
-/* YY_LOCATION_PRINT -- Print the location on the stream.
- This macro was not mandated originally: define only if we know
- we won't break user code: when these are the locations we know. */
-
-#ifndef YY_LOCATION_PRINT
-# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL
-# define YY_LOCATION_PRINT(File, Loc) \
- fprintf (File, "%d.%d-%d.%d", \
- (Loc).first_line, (Loc).first_column, \
- (Loc).last_line, (Loc).last_column)
-# else
-# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
-# endif
-#endif
-
-
-/* YYLEX -- calling `yylex' with the right arguments. */
-
-#ifdef YYLEX_PARAM
-# define YYLEX yylex (YYLEX_PARAM)
-#else
-# define YYLEX yylex ()
-#endif
-
-/* Enable debugging if requested. */
-#if YYDEBUG
-
-# ifndef YYFPRINTF
-# include /* INFRINGES ON USER NAME SPACE */
-# define YYFPRINTF fprintf
-# endif
-
-# define YYDPRINTF(Args) \
-do { \
- if (yydebug) \
- YYFPRINTF Args; \
-} while (YYID (0))
-
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
-do { \
- if (yydebug) \
- { \
- YYFPRINTF (stderr, "%s ", Title); \
- yy_symbol_print (stderr, \
- Type, Value); \
- YYFPRINTF (stderr, "\n"); \
- } \
-} while (YYID (0))
-
-
-/*--------------------------------.
-| Print this symbol on YYOUTPUT. |
-`--------------------------------*/
-
-/*ARGSUSED*/
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static void
-yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
-#else
-static void
-yy_symbol_value_print (yyoutput, yytype, yyvaluep)
- FILE *yyoutput;
- int yytype;
- YYSTYPE const * const yyvaluep;
-#endif
-{
- if (!yyvaluep)
- return;
-# ifdef YYPRINT
- if (yytype < YYNTOKENS)
- YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
-# else
- YYUSE (yyoutput);
-# endif
- switch (yytype)
- {
- default:
- break;
- }
-}
-
-
-/*--------------------------------.
-| Print this symbol on YYOUTPUT. |
-`--------------------------------*/
-
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static void
-yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
-#else
-static void
-yy_symbol_print (yyoutput, yytype, yyvaluep)
- FILE *yyoutput;
- int yytype;
- YYSTYPE const * const yyvaluep;
-#endif
-{
- if (yytype < YYNTOKENS)
- YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
- else
- YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
-
- yy_symbol_value_print (yyoutput, yytype, yyvaluep);
- YYFPRINTF (yyoutput, ")");
-}
-
-/*------------------------------------------------------------------.
-| yy_stack_print -- Print the state stack from its BOTTOM up to its |
-| TOP (included). |
-`------------------------------------------------------------------*/
-
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static void
-yy_stack_print (yytype_int16 *bottom, yytype_int16 *top)
-#else
-static void
-yy_stack_print (bottom, top)
- yytype_int16 *bottom;
- yytype_int16 *top;
-#endif
-{
- YYFPRINTF (stderr, "Stack now");
- for (; bottom <= top; ++bottom)
- YYFPRINTF (stderr, " %d", *bottom);
- YYFPRINTF (stderr, "\n");
-}
-
-# define YY_STACK_PRINT(Bottom, Top) \
-do { \
- if (yydebug) \
- yy_stack_print ((Bottom), (Top)); \
-} while (YYID (0))
-
-
-/*------------------------------------------------.
-| Report that the YYRULE is going to be reduced. |
-`------------------------------------------------*/
-
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static void
-yy_reduce_print (YYSTYPE *yyvsp, int yyrule)
-#else
-static void
-yy_reduce_print (yyvsp, yyrule)
- YYSTYPE *yyvsp;
- int yyrule;
-#endif
-{
- int yynrhs = yyr2[yyrule];
- int yyi;
- unsigned long int yylno = yyrline[yyrule];
- YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
- yyrule - 1, yylno);
- /* The symbols being reduced. */
- for (yyi = 0; yyi < yynrhs; yyi++)
- {
- fprintf (stderr, " $%d = ", yyi + 1);
- yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
- &(yyvsp[(yyi + 1) - (yynrhs)])
- );
- fprintf (stderr, "\n");
- }
-}
-
-# define YY_REDUCE_PRINT(Rule) \
-do { \
- if (yydebug) \
- yy_reduce_print (yyvsp, Rule); \
-} while (YYID (0))
-
-/* Nonzero means print parse trace. It is left uninitialized so that
- multiple parsers can coexist. */
-int yydebug;
-#else /* !YYDEBUG */
-# define YYDPRINTF(Args)
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
-# define YY_STACK_PRINT(Bottom, Top)
-# define YY_REDUCE_PRINT(Rule)
-#endif /* !YYDEBUG */
-
-
-/* YYINITDEPTH -- initial size of the parser's stacks. */
-#ifndef YYINITDEPTH
-# define YYINITDEPTH 200
-#endif
-
-/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
- if the built-in stack extension method is used).
-
- Do not make this value too large; the results are undefined if
- YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
- evaluated with infinite-precision integer arithmetic. */
-
-#ifndef YYMAXDEPTH
-# define YYMAXDEPTH 10000
-#endif
-
-
-
-#if YYERROR_VERBOSE
-
-# ifndef yystrlen
-# if defined __GLIBC__ && defined _STRING_H
-# define yystrlen strlen
-# else
-/* Return the length of YYSTR. */
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static YYSIZE_T
-yystrlen (const char *yystr)
-#else
-static YYSIZE_T
-yystrlen (yystr)
- const char *yystr;
-#endif
-{
- YYSIZE_T yylen;
- for (yylen = 0; yystr[yylen]; yylen++)
- continue;
- return yylen;
-}
-# endif
-# endif
-
-# ifndef yystpcpy
-# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
-# define yystpcpy stpcpy
-# else
-/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
- YYDEST. */
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static char *
-yystpcpy (char *yydest, const char *yysrc)
-#else
-static char *
-yystpcpy (yydest, yysrc)
- char *yydest;
- const char *yysrc;
-#endif
-{
- char *yyd = yydest;
- const char *yys = yysrc;
-
- while ((*yyd++ = *yys++) != '\0')
- continue;
-
- return yyd - 1;
-}
-# endif
-# endif
-
-# ifndef yytnamerr
-/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
- quotes and backslashes, so that it's suitable for yyerror. The
- heuristic is that double-quoting is unnecessary unless the string
- contains an apostrophe, a comma, or backslash (other than
- backslash-backslash). YYSTR is taken from yytname. If YYRES is
- null, do not copy; instead, return the length of what the result
- would have been. */
-static YYSIZE_T
-yytnamerr (char *yyres, const char *yystr)
-{
- if (*yystr == '"')
- {
- YYSIZE_T yyn = 0;
- char const *yyp = yystr;
-
- for (;;)
- switch (*++yyp)
- {
- case '\'':
- case ',':
- goto do_not_strip_quotes;
-
- case '\\':
- if (*++yyp != '\\')
- goto do_not_strip_quotes;
- /* Fall through. */
- default:
- if (yyres)
- yyres[yyn] = *yyp;
- yyn++;
- break;
-
- case '"':
- if (yyres)
- yyres[yyn] = '\0';
- return yyn;
- }
- do_not_strip_quotes: ;
- }
-
- if (! yyres)
- return yystrlen (yystr);
-
- return yystpcpy (yyres, yystr) - yyres;
-}
-# endif
-
-/* Copy into YYRESULT an error message about the unexpected token
- YYCHAR while in state YYSTATE. Return the number of bytes copied,
- including the terminating null byte. If YYRESULT is null, do not
- copy anything; just return the number of bytes that would be
- copied. As a special case, return 0 if an ordinary "syntax error"
- message will do. Return YYSIZE_MAXIMUM if overflow occurs during
- size calculation. */
-static YYSIZE_T
-yysyntax_error (char *yyresult, int yystate, int yychar)
-{
- int yyn = yypact[yystate];
-
- if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
- return 0;
- else
- {
- int yytype = YYTRANSLATE (yychar);
- YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
- YYSIZE_T yysize = yysize0;
- YYSIZE_T yysize1;
- int yysize_overflow = 0;
- enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
- char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
- int yyx;
-
-# if 0
- /* This is so xgettext sees the translatable formats that are
- constructed on the fly. */
- YY_("syntax error, unexpected %s");
- YY_("syntax error, unexpected %s, expecting %s");
- YY_("syntax error, unexpected %s, expecting %s or %s");
- YY_("syntax error, unexpected %s, expecting %s or %s or %s");
- YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
-# endif
- char *yyfmt;
- char const *yyf;
- static char const yyunexpected[] = "syntax error, unexpected %s";
- static char const yyexpecting[] = ", expecting %s";
- static char const yyor[] = " or %s";
- char yyformat[sizeof yyunexpected
- + sizeof yyexpecting - 1
- + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
- * (sizeof yyor - 1))];
- char const *yyprefix = yyexpecting;
-
- /* Start YYX at -YYN if negative to avoid negative indexes in
- YYCHECK. */
- int yyxbegin = yyn < 0 ? -yyn : 0;
-
- /* Stay within bounds of both yycheck and yytname. */
- int yychecklim = YYLAST - yyn + 1;
- int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
- int yycount = 1;
-
- yyarg[0] = yytname[yytype];
- yyfmt = yystpcpy (yyformat, yyunexpected);
-
- for (yyx = yyxbegin; yyx < yyxend; ++yyx)
- if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
- {
- if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
- {
- yycount = 1;
- yysize = yysize0;
- yyformat[sizeof yyunexpected - 1] = '\0';
- break;
- }
- yyarg[yycount++] = yytname[yyx];
- yysize1 = yysize + yytnamerr (0, yytname[yyx]);
- yysize_overflow |= (yysize1 < yysize);
- yysize = yysize1;
- yyfmt = yystpcpy (yyfmt, yyprefix);
- yyprefix = yyor;
- }
-
- yyf = YY_(yyformat);
- yysize1 = yysize + yystrlen (yyf);
- yysize_overflow |= (yysize1 < yysize);
- yysize = yysize1;
-
- if (yysize_overflow)
- return YYSIZE_MAXIMUM;
-
- if (yyresult)
- {
- /* Avoid sprintf, as that infringes on the user's name space.
- Don't have undefined behavior even if the translation
- produced a string with the wrong number of "%s"s. */
- char *yyp = yyresult;
- int yyi = 0;
- while ((*yyp = *yyf) != '\0')
- {
- if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
- {
- yyp += yytnamerr (yyp, yyarg[yyi++]);
- yyf += 2;
- }
- else
- {
- yyp++;
- yyf++;
- }
- }
- }
- return yysize;
- }
-}
-#endif /* YYERROR_VERBOSE */
-
-
-/*-----------------------------------------------.
-| Release the memory associated to this symbol. |
-`-----------------------------------------------*/
-
-/*ARGSUSED*/
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-static void
-yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
-#else
-static void
-yydestruct (yymsg, yytype, yyvaluep)
- const char *yymsg;
- int yytype;
- YYSTYPE *yyvaluep;
-#endif
-{
- YYUSE (yyvaluep);
-
- if (!yymsg)
- yymsg = "Deleting";
- YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
-
- switch (yytype)
- {
-
- default:
- break;
- }
-}
-
-
-/* Prevent warnings from -Wmissing-prototypes. */
-
-#ifdef YYPARSE_PARAM
-#if defined __STDC__ || defined __cplusplus
-int yyparse (void *YYPARSE_PARAM);
-#else
-int yyparse ();
-#endif
-#else /* ! YYPARSE_PARAM */
-#if defined __STDC__ || defined __cplusplus
-int yyparse (void);
-#else
-int yyparse ();
-#endif
-#endif /* ! YYPARSE_PARAM */
-
-
-
-/* The look-ahead symbol. */
-int yychar;
-
-/* The semantic value of the look-ahead symbol. */
-YYSTYPE yylval;
-
-/* Number of syntax errors so far. */
-int yynerrs;
-
-
-
-/*----------.
-| yyparse. |
-`----------*/
-
-#ifdef YYPARSE_PARAM
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-int
-yyparse (void *YYPARSE_PARAM)
-#else
-int
-yyparse (YYPARSE_PARAM)
- void *YYPARSE_PARAM;
-#endif
-#else /* ! YYPARSE_PARAM */
-#if (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
-int
-yyparse (void)
-#else
-int
-yyparse ()
-
-#endif
-#endif
-{
-
- int yystate;
- int yyn;
- int yyresult;
- /* Number of tokens to shift before error messages enabled. */
- int yyerrstatus;
- /* Look-ahead token as an internal (translated) token number. */
- int yytoken = 0;
-#if YYERROR_VERBOSE
- /* Buffer for error messages, and its allocated size. */
- char yymsgbuf[128];
- char *yymsg = yymsgbuf;
- YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
-#endif
-
- /* Three stacks and their tools:
- `yyss': related to states,
- `yyvs': related to semantic values,
- `yyls': related to locations.
-
- Refer to the stacks thru separate pointers, to allow yyoverflow
- to reallocate them elsewhere. */
-
- /* The state stack. */
- yytype_int16 yyssa[YYINITDEPTH];
- yytype_int16 *yyss = yyssa;
- yytype_int16 *yyssp;
-
- /* The semantic value stack. */
- YYSTYPE yyvsa[YYINITDEPTH];
- YYSTYPE *yyvs = yyvsa;
- YYSTYPE *yyvsp;
-
-
-
-#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
-
- YYSIZE_T yystacksize = YYINITDEPTH;
-
- /* The variables used to return semantic value and location from the
- action routines. */
- YYSTYPE yyval;
-
-
- /* The number of symbols on the RHS of the reduced rule.
- Keep to zero when no symbol should be popped. */
- int yylen = 0;
-
- YYDPRINTF ((stderr, "Starting parse\n"));
-
- yystate = 0;
- yyerrstatus = 0;
- yynerrs = 0;
- yychar = YYEMPTY; /* Cause a token to be read. */
-
- /* Initialize stack pointers.
- Waste one element of value and location stack
- so that they stay on the same level as the state stack.
- The wasted elements are never initialized. */
-
- yyssp = yyss;
- yyvsp = yyvs;
-
- goto yysetstate;
-
-/*------------------------------------------------------------.
-| yynewstate -- Push a new state, which is found in yystate. |
-`------------------------------------------------------------*/
- yynewstate:
- /* In all cases, when you get here, the value and location stacks
- have just been pushed. So pushing a state here evens the stacks. */
- yyssp++;
-
- yysetstate:
- *yyssp = yystate;
-
- if (yyss + yystacksize - 1 <= yyssp)
- {
- /* Get the current used size of the three stacks, in elements. */
- YYSIZE_T yysize = yyssp - yyss + 1;
-
-#ifdef yyoverflow
- {
- /* Give user a chance to reallocate the stack. Use copies of
- these so that the &'s don't force the real ones into
- memory. */
- YYSTYPE *yyvs1 = yyvs;
- yytype_int16 *yyss1 = yyss;
-
-
- /* Each stack pointer address is followed by the size of the
- data in use in that stack, in bytes. This used to be a
- conditional around just the two extra args, but that might
- be undefined if yyoverflow is a macro. */
- yyoverflow (YY_("memory exhausted"),
- &yyss1, yysize * sizeof (*yyssp),
- &yyvs1, yysize * sizeof (*yyvsp),
-
- &yystacksize);
-
- yyss = yyss1;
- yyvs = yyvs1;
- }
-#else /* no yyoverflow */
-# ifndef YYSTACK_RELOCATE
- goto yyexhaustedlab;
-# else
- /* Extend the stack our own way. */
- if (YYMAXDEPTH <= yystacksize)
- goto yyexhaustedlab;
- yystacksize *= 2;
- if (YYMAXDEPTH < yystacksize)
- yystacksize = YYMAXDEPTH;
-
- {
- yytype_int16 *yyss1 = yyss;
- union yyalloc *yyptr =
- (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
- if (! yyptr)
- goto yyexhaustedlab;
- YYSTACK_RELOCATE (yyss);
- YYSTACK_RELOCATE (yyvs);
-
-# undef YYSTACK_RELOCATE
- if (yyss1 != yyssa)
- YYSTACK_FREE (yyss1);
- }
-# endif
-#endif /* no yyoverflow */
-
- yyssp = yyss + yysize - 1;
- yyvsp = yyvs + yysize - 1;
-
-
- YYDPRINTF ((stderr, "Stack size increased to %lu\n",
- (unsigned long int) yystacksize));
-
- if (yyss + yystacksize - 1 <= yyssp)
- YYABORT;
- }
-
- YYDPRINTF ((stderr, "Entering state %d\n", yystate));
-
- goto yybackup;
-
-/*-----------.
-| yybackup. |
-`-----------*/
-yybackup:
-
- /* Do appropriate processing given the current state. Read a
- look-ahead token if we need one and don't already have one. */
-
- /* First try to decide what to do without reference to look-ahead token. */
- yyn = yypact[yystate];
- if (yyn == YYPACT_NINF)
- goto yydefault;
-
- /* Not known => get a look-ahead token if don't already have one. */
-
- /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */
- if (yychar == YYEMPTY)
- {
- YYDPRINTF ((stderr, "Reading a token: "));
- yychar = YYLEX;
- }
-
- if (yychar <= YYEOF)
- {
- yychar = yytoken = YYEOF;
- YYDPRINTF ((stderr, "Now at end of input.\n"));
- }
- else
- {
- yytoken = YYTRANSLATE (yychar);
- YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
- }
-
- /* If the proper action on seeing token YYTOKEN is to reduce or to
- detect an error, take that action. */
- yyn += yytoken;
- if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
- goto yydefault;
- yyn = yytable[yyn];
- if (yyn <= 0)
- {
- if (yyn == 0 || yyn == YYTABLE_NINF)
- goto yyerrlab;
- yyn = -yyn;
- goto yyreduce;
- }
-
- if (yyn == YYFINAL)
- YYACCEPT;
-
- /* Count tokens shifted since error; after three, turn off error
- status. */
- if (yyerrstatus)
- yyerrstatus--;
-
- /* Shift the look-ahead token. */
- YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
-
- /* Discard the shifted token unless it is eof. */
- if (yychar != YYEOF)
- yychar = YYEMPTY;
-
- yystate = yyn;
- *++yyvsp = yylval;
-
- goto yynewstate;
-
-
-/*-----------------------------------------------------------.
-| yydefault -- do the default action for the current state. |
-`-----------------------------------------------------------*/
-yydefault:
- yyn = yydefact[yystate];
- if (yyn == 0)
- goto yyerrlab;
- goto yyreduce;
-
-
-/*-----------------------------.
-| yyreduce -- Do a reduction. |
-`-----------------------------*/
-yyreduce:
- /* yyn is the number of a rule to reduce with. */
- yylen = yyr2[yyn];
-
- /* If YYLEN is nonzero, implement the default value of the action:
- `$$ = $1'.
-
- Otherwise, the following line sets YYVAL to garbage.
- This behavior is undocumented and Bison
- users should not rely upon it. Assigning to YYVAL
- unconditionally makes the parser a bit smaller, and it avoids a
- GCC warning that YYVAL may be used uninitialized. */
- yyval = yyvsp[1-yylen];
-
-
- YY_REDUCE_PRINT (yyn);
- switch (yyn)
- {
- case 2:
-#line 54 "sysinfo.y"
- {
- switch (writecode)
- {
- case 'i':
- printf("#ifdef SYSROFF_SWAP_IN\n");
- break;
- case 'p':
- printf("#ifdef SYSROFF_p\n");
- break;
- case 'd':
- break;
- case 'g':
- printf("#ifdef SYSROFF_SWAP_OUT\n");
- break;
- case 'c':
- printf("#ifdef SYSROFF_PRINT\n");
- printf("#include \n");
- printf("#include \n");
- printf("#include \n");
- break;
- }
- }
- break;
-
- case 3:
-#line 76 "sysinfo.y"
- {
- switch (writecode) {
- case 'i':
- case 'p':
- case 'g':
- case 'c':
- printf("#endif\n");
- break;
- case 'd':
- break;
- }
-}
- break;
-
- case 6:
-#line 98 "sysinfo.y"
- {
- it = (yyvsp[(2) - (3)].s); code = (yyvsp[(3) - (3)].i);
- switch (writecode)
- {
- case 'd':
- printf("\n\n\n#define IT_%s_CODE 0x%x\n", it,code);
- printf("struct IT_%s;\n", it);
- printf("extern void sysroff_swap_%s_in (struct IT_%s *);\n",
- (yyvsp[(2) - (3)].s), it);
- printf("extern void sysroff_swap_%s_out (FILE *, struct IT_%s *);\n",
- (yyvsp[(2) - (3)].s), it);
- printf("extern void sysroff_print_%s_out (struct IT_%s *);\n",
- (yyvsp[(2) - (3)].s), it);
- printf("struct IT_%s { \n", it);
- break;
- case 'i':
- printf("void sysroff_swap_%s_in (struct IT_%s * ptr)\n",(yyvsp[(2) - (3)].s),it);
- printf("{\n");
- printf("\tunsigned char raw[255];\n");
- printf("\tint idx = 0;\n");
- printf("\tint size;\n");
- printf("\tmemset(raw,0,255);\n");
- printf("\tmemset(ptr,0,sizeof(*ptr));\n");
- printf("\tsize = fillup(raw);\n");
- break;
- case 'g':
- printf("void sysroff_swap_%s_out (FILE * ffile, struct IT_%s * ptr)\n",(yyvsp[(2) - (3)].s),it);
- printf("{\n");
- printf("\tunsigned char raw[255];\n");
- printf("\tint idx = 16;\n");
- printf("\tmemset (raw, 0, 255);\n");
- printf("\tcode = IT_%s_CODE;\n", it);
- break;
- case 'o':
- printf("void sysroff_swap_%s_out (bfd * abfd, struct IT_%s * ptr)\n",(yyvsp[(2) - (3)].s), it);
- printf("{\n");
- printf("\tint idx = 0;\n");
- break;
- case 'c':
- printf("void sysroff_print_%s_out (struct IT_%s *ptr)\n",(yyvsp[(2) - (3)].s),it);
- printf("{\n");
- printf("itheader(\"%s\", IT_%s_CODE);\n",(yyvsp[(2) - (3)].s),(yyvsp[(2) - (3)].s));
- break;
-
- case 't':
- break;
- }
-
- }
- break;
-
- case 7:
-#line 149 "sysinfo.y"
- {
- switch (writecode) {
- case 'd':
- printf("};\n");
- break;
- case 'g':
- printf("\tchecksum(ffile,raw, idx, IT_%s_CODE);\n", it);
-
- case 'i':
-
- case 'o':
- case 'c':
- printf("}\n");
- }
-}
- break;
-
- case 12:
-#line 176 "sysinfo.y"
- {
- rdepth++;
- switch (writecode)
- {
- case 'c':
- if (rdepth==1)
- printf("\tprintf(\"repeat %%d\\n\", %s);\n",(yyvsp[(3) - (3)].s));
- if (rdepth==2)
- printf("\tprintf(\"repeat %%d\\n\", %s[n]);\n",(yyvsp[(3) - (3)].s));
- case 'i':
- case 'g':
- case 'o':
-
- if (rdepth==1)
- {
- printf("\t{ int n; for (n = 0; n < %s; n++) {\n", (yyvsp[(3) - (3)].s));
- }
- if (rdepth == 2) {
- printf("\t{ int m; for (m = 0; m < %s[n]; m++) {\n", (yyvsp[(3) - (3)].s));
- }
-
- break;
- }
-
- oldrepeat = repeat;
- repeat = (yyvsp[(3) - (3)].s);
- }
- break;
-
- case 13:
-#line 206 "sysinfo.y"
- {
- repeat = oldrepeat;
- oldrepeat =0;
- rdepth--;
- switch (writecode)
- {
- case 'i':
- case 'g':
- case 'o':
- case 'c':
- printf("\t}}\n");
- }
- }
- break;
-
- case 14:
-#line 223 "sysinfo.y"
- {
- switch (writecode)
- {
- case 'i':
- case 'g':
- case 'o':
- case 'c':
- printf("\tif (%s) {\n", (yyvsp[(3) - (3)].s));
- break;
- }
- }
- break;
-
- case 15:
-#line 236 "sysinfo.y"
- {
- switch (writecode)
- {
- case 'i':
- case 'g':
- case 'o':
- case 'c':
- printf("\t}\n");
- }
- }
- break;
-
- case 16:
-#line 250 "sysinfo.y"
- {name = (yyvsp[(7) - (7)].s); }
- break;
-
- case 17:
-#line 252 "sysinfo.y"
- {
- char *desc = (yyvsp[(2) - (10)].s);
- char *type = (yyvsp[(4) - (10)].s);
- int size = (yyvsp[(5) - (10)].i);
- char *id = (yyvsp[(7) - (10)].s);
-char *p = names[rdepth];
-char *ptr = pnames[rdepth];
- switch (writecode)
- {
- case 'g':
- if (size % 8)
- {
-
- printf("\twriteBITS(ptr->%s%s,raw,&idx,%d);\n",
- id,
- names[rdepth], size);
-
- }
- else {
- printf("\twrite%s(ptr->%s%s,raw,&idx,%d,ffile);\n",
- type,
- id,
- names[rdepth],size/8);
- }
- break;
- case 'i':
- {
-
- if (rdepth >= 1)
-
- {
- printf("if (!ptr->%s) ptr->%s = (%s*)xcalloc(%s, sizeof(ptr->%s[0]));\n",
- id,
- id,
- type,
- repeat,
- id);
- }
-
- if (rdepth == 2)
- {
- printf("if (!ptr->%s[n]) ptr->%s[n] = (%s**)xcalloc(%s[n], sizeof(ptr->%s[n][0]));\n",
- id,
- id,
- type,
- repeat,
- id);
- }
-
- }
-
- if (size % 8)
- {
- printf("\tptr->%s%s = getBITS(raw,&idx, %d,size);\n",
- id,
- names[rdepth],
- size);
- }
- else {
- printf("\tptr->%s%s = get%s(raw,&idx, %d,size);\n",
- id,
- names[rdepth],
- type,
- size/8);
- }
- break;
- case 'o':
- printf("\tput%s(raw,%d,%d,&idx,ptr->%s%s);\n", type,size/8,size%8,id,names[rdepth]);
- break;
- case 'd':
- if (repeat)
- printf("\t/* repeat %s */\n", repeat);
-
- if (type[0] == 'I') {
- printf("\tint %s%s; \t/* %s */\n",ptr,id, desc);
- }
- else if (type[0] =='C') {
- printf("\tchar %s*%s;\t /* %s */\n",ptr,id, desc);
- }
- else {
- printf("\tbarray %s%s;\t /* %s */\n",ptr,id, desc);
- }
- break;
- case 'c':
- printf("tabout();\n");
- printf("\tprintf(\"/*%-30s*/ ptr->%s = \");\n", desc, id);
-
- if (type[0] == 'I')
- printf("\tprintf(\"%%d\\n\",ptr->%s%s);\n", id,p);
- else if (type[0] == 'C')
- printf("\tprintf(\"%%s\\n\",ptr->%s%s);\n", id,p);
-
- else if (type[0] == 'B')
- {
- printf("\tpbarray(&ptr->%s%s);\n", id,p);
- }
- else abort();
- break;
- }
- }
- break;
-
- case 18:
-#line 357 "sysinfo.y"
- { (yyval.s) = (yyvsp[(1) - (1)].s); }
- break;
-
- case 19:
-#line 358 "sysinfo.y"
- { (yyval.s) = "INT";}
- break;
-
- case 20:
-#line 363 "sysinfo.y"
- { (yyval.s) = (yyvsp[(2) - (3)].s); }
- break;
-
- case 21:
-#line 368 "sysinfo.y"
- { (yyval.i) = (yyvsp[(1) - (2)].i) * (yyvsp[(2) - (2)].i); }
- break;
-
- case 22:
-#line 373 "sysinfo.y"
- { (yyval.s) = (yyvsp[(2) - (3)].s); }
- break;
-
- case 23:
-#line 374 "sysinfo.y"
- { (yyval.s) = "dummy";}
- break;
-
- case 27:
-#line 382 "sysinfo.y"
- {
- switch (writecode)
- {
- case 'd':
- printf("#define %s %s\n", (yyvsp[(3) - (5)].s),(yyvsp[(4) - (5)].s));
- break;
- case 'c':
- printf("if (ptr->%s%s == %s) { tabout(); printf(\"%s\\n\");}\n", name, names[rdepth],(yyvsp[(4) - (5)].s),(yyvsp[(3) - (5)].s));
- }
- }
- break;
-
-
-/* Line 1267 of yacc.c. */
-#line 1715 "sysinfo.c"
- default: break;
- }
- YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
-
- YYPOPSTACK (yylen);
- yylen = 0;
- YY_STACK_PRINT (yyss, yyssp);
-
- *++yyvsp = yyval;
-
-
- /* Now `shift' the result of the reduction. Determine what state
- that goes to, based on the state we popped back to and the rule
- number reduced by. */
-
- yyn = yyr1[yyn];
-
- yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
- if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
- yystate = yytable[yystate];
- else
- yystate = yydefgoto[yyn - YYNTOKENS];
-
- goto yynewstate;
-
-
-/*------------------------------------.
-| yyerrlab -- here on detecting error |
-`------------------------------------*/
-yyerrlab:
- /* If not already recovering from an error, report this error. */
- if (!yyerrstatus)
- {
- ++yynerrs;
-#if ! YYERROR_VERBOSE
- yyerror (YY_("syntax error"));
-#else
- {
- YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
- if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
- {
- YYSIZE_T yyalloc = 2 * yysize;
- if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
- yyalloc = YYSTACK_ALLOC_MAXIMUM;
- if (yymsg != yymsgbuf)
- YYSTACK_FREE (yymsg);
- yymsg = (char *) YYSTACK_ALLOC (yyalloc);
- if (yymsg)
- yymsg_alloc = yyalloc;
- else
- {
- yymsg = yymsgbuf;
- yymsg_alloc = sizeof yymsgbuf;
- }
- }
-
- if (0 < yysize && yysize <= yymsg_alloc)
- {
- (void) yysyntax_error (yymsg, yystate, yychar);
- yyerror (yymsg);
- }
- else
- {
- yyerror (YY_("syntax error"));
- if (yysize != 0)
- goto yyexhaustedlab;
- }
- }
-#endif
- }
-
-
-
- if (yyerrstatus == 3)
- {
- /* If just tried and failed to reuse look-ahead token after an
- error, discard it. */
-
- if (yychar <= YYEOF)
- {
- /* Return failure if at end of input. */
- if (yychar == YYEOF)
- YYABORT;
- }
- else
- {
- yydestruct ("Error: discarding",
- yytoken, &yylval);
- yychar = YYEMPTY;
- }
- }
-
- /* Else will try to reuse look-ahead token after shifting the error
- token. */
- goto yyerrlab1;
-
-
-/*---------------------------------------------------.
-| yyerrorlab -- error raised explicitly by YYERROR. |
-`---------------------------------------------------*/
-yyerrorlab:
-
- /* Pacify compilers like GCC when the user code never invokes
- YYERROR and the label yyerrorlab therefore never appears in user
- code. */
- if (/*CONSTCOND*/ 0)
- goto yyerrorlab;
-
- /* Do not reclaim the symbols of the rule which action triggered
- this YYERROR. */
- YYPOPSTACK (yylen);
- yylen = 0;
- YY_STACK_PRINT (yyss, yyssp);
- yystate = *yyssp;
- goto yyerrlab1;
-
-
-/*-------------------------------------------------------------.
-| yyerrlab1 -- common code for both syntax error and YYERROR. |
-`-------------------------------------------------------------*/
-yyerrlab1:
- yyerrstatus = 3; /* Each real token shifted decrements this. */
-
- for (;;)
- {
- yyn = yypact[yystate];
- if (yyn != YYPACT_NINF)
- {
- yyn += YYTERROR;
- if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
- {
- yyn = yytable[yyn];
- if (0 < yyn)
- break;
- }
- }
-
- /* Pop the current state because it cannot handle the error token. */
- if (yyssp == yyss)
- YYABORT;
-
-
- yydestruct ("Error: popping",
- yystos[yystate], yyvsp);
- YYPOPSTACK (1);
- yystate = *yyssp;
- YY_STACK_PRINT (yyss, yyssp);
- }
-
- if (yyn == YYFINAL)
- YYACCEPT;
-
- *++yyvsp = yylval;
-
-
- /* Shift the error token. */
- YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
-
- yystate = yyn;
- goto yynewstate;
-
-
-/*-------------------------------------.
-| yyacceptlab -- YYACCEPT comes here. |
-`-------------------------------------*/
-yyacceptlab:
- yyresult = 0;
- goto yyreturn;
-
-/*-----------------------------------.
-| yyabortlab -- YYABORT comes here. |
-`-----------------------------------*/
-yyabortlab:
- yyresult = 1;
- goto yyreturn;
-
-#ifndef yyoverflow
-/*-------------------------------------------------.
-| yyexhaustedlab -- memory exhaustion comes here. |
-`-------------------------------------------------*/
-yyexhaustedlab:
- yyerror (YY_("memory exhausted"));
- yyresult = 2;
- /* Fall through. */
-#endif
-
-yyreturn:
- if (yychar != YYEOF && yychar != YYEMPTY)
- yydestruct ("Cleanup: discarding lookahead",
- yytoken, &yylval);
- /* Do not reclaim the symbols of the rule which action triggered
- this YYABORT or YYACCEPT. */
- YYPOPSTACK (yylen);
- YY_STACK_PRINT (yyss, yyssp);
- while (yyssp != yyss)
- {
- yydestruct ("Cleanup: popping",
- yystos[*yyssp], yyvsp);
- YYPOPSTACK (1);
- }
-#ifndef yyoverflow
- if (yyss != yyssa)
- YYSTACK_FREE (yyss);
-#endif
-#if YYERROR_VERBOSE
- if (yymsg != yymsgbuf)
- YYSTACK_FREE (yymsg);
-#endif
- /* Make sure YYID is used. */
- return YYID (yyresult);
-}
-
-
-#line 397 "sysinfo.y"
-
-/* four modes
-
- -d write structure definitions for sysroff in host format
- -i write functions to swap into sysroff format in
- -o write functions to swap into sysroff format out
- -c write code to print info in human form */
-
-int yydebug;
-
-int
-main (int ac, char **av)
-{
- yydebug=0;
- if (ac > 1)
- writecode = av[1][1];
-if (writecode == 'd')
- {
- printf("typedef struct { unsigned char *data; int len; } barray; \n");
- printf("typedef int INT;\n");
- printf("typedef char * CHARS;\n");
-
- }
- yyparse();
-return 0;
-}
-
-static int
-yyerror (char *s)
-{
- fprintf(stderr, "%s\n" , s);
- return 0;
-}
-
diff -Nur binutils-2.24.orig/binutils/sysinfo.h binutils-2.24/binutils/sysinfo.h
--- binutils-2.24.orig/binutils/sysinfo.h 2013-11-18 09:49:30.000000000 +0100
+++ binutils-2.24/binutils/sysinfo.h 1970-01-01 01:00:00.000000000 +0100
@@ -1,77 +0,0 @@
-/* A Bison parser, made by GNU Bison 2.3. */
-
-/* Skeleton interface for Bison's Yacc-like parsers in C
-
- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
- Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA. */
-
-/* As a special exception, you may create a larger work that contains
- part or all of the Bison parser skeleton and distribute that work
- under terms of your choice, so long as that work isn't itself a
- parser generator using the skeleton or a modified version thereof
- as a parser skeleton. Alternatively, if you modify or redistribute
- the parser skeleton itself, you may (at your option) remove this
- special exception, which will cause the skeleton and the resulting
- Bison output files to be licensed under the GNU General Public
- License without this special exception.
-
- This special exception was added by the Free Software Foundation in
- version 2.2 of Bison. */
-
-/* Tokens. */
-#ifndef YYTOKENTYPE
-# define YYTOKENTYPE
- /* Put the tokens into the symbol table, so that GDB and other debuggers
- know about them. */
- enum yytokentype {
- COND = 258,
- REPEAT = 259,
- TYPE = 260,
- NAME = 261,
- NUMBER = 262,
- UNIT = 263
- };
-#endif
-/* Tokens. */
-#define COND 258
-#define REPEAT 259
-#define TYPE 260
-#define NAME 261
-#define NUMBER 262
-#define UNIT 263
-
-
-
-
-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-typedef union YYSTYPE
-#line 40 "sysinfo.y"
-{
- int i;
- char *s;
-}
-/* Line 1529 of yacc.c. */
-#line 70 "sysinfo.h"
- YYSTYPE;
-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
-# define YYSTYPE_IS_DECLARED 1
-# define YYSTYPE_IS_TRIVIAL 1
-#endif
-
-extern YYSTYPE yylval;
-
diff -Nur binutils-2.24.orig/binutils/syslex.c binutils-2.24/binutils/syslex.c
--- binutils-2.24.orig/binutils/syslex.c 2013-11-18 09:49:30.000000000 +0100
+++ binutils-2.24/binutils/syslex.c 1970-01-01 01:00:00.000000000 +0100
@@ -1,1906 +0,0 @@
-
-#line 3 "syslex.c"
-
-#define YY_INT_ALIGNED short int
-
-/* A lexical scanner generated by flex */
-
-#define FLEX_SCANNER
-#define YY_FLEX_MAJOR_VERSION 2
-#define YY_FLEX_MINOR_VERSION 5
-#define YY_FLEX_SUBMINOR_VERSION 35
-#if YY_FLEX_SUBMINOR_VERSION > 0
-#define FLEX_BETA
-#endif
-
-/* First, we deal with platform-specific or compiler-specific issues. */
-
-/* begin standard C headers. */
-#include
-#include
-#include
-#include
-
-/* end standard C headers. */
-
-/* flex integer type definitions */
-
-#ifndef FLEXINT_H
-#define FLEXINT_H
-
-/* C99 systems have . Non-C99 systems may or may not. */
-
-#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
-
-/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
- * if you want the limit (max/min) macros for int types.
- */
-#ifndef __STDC_LIMIT_MACROS
-#define __STDC_LIMIT_MACROS 1
-#endif
-
-#include
-typedef int8_t flex_int8_t;
-typedef uint8_t flex_uint8_t;
-typedef int16_t flex_int16_t;
-typedef uint16_t flex_uint16_t;
-typedef int32_t flex_int32_t;
-typedef uint32_t flex_uint32_t;
-typedef uint64_t flex_uint64_t;
-#else
-typedef signed char flex_int8_t;
-typedef short int flex_int16_t;
-typedef int flex_int32_t;
-typedef unsigned char flex_uint8_t;
-typedef unsigned short int flex_uint16_t;
-typedef unsigned int flex_uint32_t;
-#endif /* ! C99 */
-
-/* Limits of integral types. */
-#ifndef INT8_MIN
-#define INT8_MIN (-128)
-#endif
-#ifndef INT16_MIN
-#define INT16_MIN (-32767-1)
-#endif
-#ifndef INT32_MIN
-#define INT32_MIN (-2147483647-1)
-#endif
-#ifndef INT8_MAX
-#define INT8_MAX (127)
-#endif
-#ifndef INT16_MAX
-#define INT16_MAX (32767)
-#endif
-#ifndef INT32_MAX
-#define INT32_MAX (2147483647)
-#endif
-#ifndef UINT8_MAX
-#define UINT8_MAX (255U)
-#endif
-#ifndef UINT16_MAX
-#define UINT16_MAX (65535U)
-#endif
-#ifndef UINT32_MAX
-#define UINT32_MAX (4294967295U)
-#endif
-
-#endif /* ! FLEXINT_H */
-
-#ifdef __cplusplus
-
-/* The "const" storage-class-modifier is valid. */
-#define YY_USE_CONST
-
-#else /* ! __cplusplus */
-
-/* C99 requires __STDC__ to be defined as 1. */
-#if defined (__STDC__)
-
-#define YY_USE_CONST
-
-#endif /* defined (__STDC__) */
-#endif /* ! __cplusplus */
-
-#ifdef YY_USE_CONST
-#define yyconst const
-#else
-#define yyconst
-#endif
-
-/* Returned upon end-of-file. */
-#define YY_NULL 0
-
-/* Promotes a possibly negative, possibly signed char to an unsigned
- * integer for use as an array index. If the signed char is negative,
- * we want to instead treat it as an 8-bit unsigned char, hence the
- * double cast.
- */
-#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
-
-/* Enter a start condition. This macro really ought to take a parameter,
- * but we do it the disgusting crufty way forced on us by the ()-less
- * definition of BEGIN.
- */
-#define BEGIN (yy_start) = 1 + 2 *
-
-/* Translate the current start state into a value that can be later handed
- * to BEGIN to return to the state. The YYSTATE alias is for lex
- * compatibility.
- */
-#define YY_START (((yy_start) - 1) / 2)
-#define YYSTATE YY_START
-
-/* Action number for EOF rule of a given start state. */
-#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
-
-/* Special action meaning "start processing a new file". */
-#define YY_NEW_FILE yyrestart(yyin )
-
-#define YY_END_OF_BUFFER_CHAR 0
-
-/* Size of default input buffer. */
-#ifndef YY_BUF_SIZE
-#define YY_BUF_SIZE 16384
-#endif
-
-/* The state buf must be large enough to hold one state per character in the main buffer.
- */
-#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
-
-#ifndef YY_TYPEDEF_YY_BUFFER_STATE
-#define YY_TYPEDEF_YY_BUFFER_STATE
-typedef struct yy_buffer_state *YY_BUFFER_STATE;
-#endif
-
-#ifndef YY_TYPEDEF_YY_SIZE_T
-#define YY_TYPEDEF_YY_SIZE_T
-typedef size_t yy_size_t;
-#endif
-
-extern yy_size_t yyleng;
-
-extern FILE *yyin, *yyout;
-
-#define EOB_ACT_CONTINUE_SCAN 0
-#define EOB_ACT_END_OF_FILE 1
-#define EOB_ACT_LAST_MATCH 2
-
- #define YY_LESS_LINENO(n)
-
-/* Return all but the first "n" matched characters back to the input stream. */
-#define yyless(n) \
- do \
- { \
- /* Undo effects of setting up yytext. */ \
- int yyless_macro_arg = (n); \
- YY_LESS_LINENO(yyless_macro_arg);\
- *yy_cp = (yy_hold_char); \
- YY_RESTORE_YY_MORE_OFFSET \
- (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
- YY_DO_BEFORE_ACTION; /* set up yytext again */ \
- } \
- while ( 0 )
-
-#define unput(c) yyunput( c, (yytext_ptr) )
-
-#ifndef YY_STRUCT_YY_BUFFER_STATE
-#define YY_STRUCT_YY_BUFFER_STATE
-struct yy_buffer_state
- {
- FILE *yy_input_file;
-
- char *yy_ch_buf; /* input buffer */
- char *yy_buf_pos; /* current position in input buffer */
-
- /* Size of input buffer in bytes, not including room for EOB
- * characters.
- */
- yy_size_t yy_buf_size;
-
- /* Number of characters read into yy_ch_buf, not including EOB
- * characters.
- */
- yy_size_t yy_n_chars;
-
- /* Whether we "own" the buffer - i.e., we know we created it,
- * and can realloc() it to grow it, and should free() it to
- * delete it.
- */
- int yy_is_our_buffer;
-
- /* Whether this is an "interactive" input source; if so, and
- * if we're using stdio for input, then we want to use getc()
- * instead of fread(), to make sure we stop fetching input after
- * each newline.
- */
- int yy_is_interactive;
-
- /* Whether we're considered to be at the beginning of a line.
- * If so, '^' rules will be active on the next match, otherwise
- * not.
- */
- int yy_at_bol;
-
- int yy_bs_lineno; /**< The line count. */
- int yy_bs_column; /**< The column count. */
-
- /* Whether to try to fill the input buffer when we reach the
- * end of it.
- */
- int yy_fill_buffer;
-
- int yy_buffer_status;
-
-#define YY_BUFFER_NEW 0
-#define YY_BUFFER_NORMAL 1
- /* When an EOF's been seen but there's still some text to process
- * then we mark the buffer as YY_EOF_PENDING, to indicate that we
- * shouldn't try reading from the input source any more. We might
- * still have a bunch of tokens to match, though, because of
- * possible backing-up.
- *
- * When we actually see the EOF, we change the status to "new"
- * (via yyrestart()), so that the user can continue scanning by
- * just pointing yyin at a new input file.
- */
-#define YY_BUFFER_EOF_PENDING 2
-
- };
-#endif /* !YY_STRUCT_YY_BUFFER_STATE */
-
-/* Stack of input buffers. */
-static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
-static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
-static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
-
-/* We provide macros for accessing buffer states in case in the
- * future we want to put the buffer states in a more general
- * "scanner state".
- *
- * Returns the top of the stack, or NULL.
- */
-#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
- ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
- : NULL)
-
-/* Same as previous macro, but useful when we know that the buffer stack is not
- * NULL or when we need an lvalue. For internal use only.
- */
-#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
-
-/* yy_hold_char holds the character lost when yytext is formed. */
-static char yy_hold_char;
-static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */
-yy_size_t yyleng;
-
-/* Points to current character in buffer. */
-static char *yy_c_buf_p = (char *) 0;
-static int yy_init = 0; /* whether we need to initialize */
-static int yy_start = 0; /* start state number */
-
-/* Flag which is used to allow yywrap()'s to do buffer switches
- * instead of setting up a fresh yyin. A bit of a hack ...
- */
-static int yy_did_buffer_switch_on_eof;
-
-void yyrestart (FILE *input_file );
-void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer );
-YY_BUFFER_STATE yy_create_buffer (FILE *file,int size );
-void yy_delete_buffer (YY_BUFFER_STATE b );
-void yy_flush_buffer (YY_BUFFER_STATE b );
-void yypush_buffer_state (YY_BUFFER_STATE new_buffer );
-void yypop_buffer_state (void );
-
-static void yyensure_buffer_stack (void );
-static void yy_load_buffer_state (void );
-static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file );
-
-#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER )
-
-YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size );
-YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str );
-YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,yy_size_t len );
-
-void *yyalloc (yy_size_t );
-void *yyrealloc (void *,yy_size_t );
-void yyfree (void * );
-
-#define yy_new_buffer yy_create_buffer
-
-#define yy_set_interactive(is_interactive) \
- { \
- if ( ! YY_CURRENT_BUFFER ){ \
- yyensure_buffer_stack (); \
- YY_CURRENT_BUFFER_LVALUE = \
- yy_create_buffer(yyin,YY_BUF_SIZE ); \
- } \
- YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
- }
-
-#define yy_set_bol(at_bol) \
- { \
- if ( ! YY_CURRENT_BUFFER ){\
- yyensure_buffer_stack (); \
- YY_CURRENT_BUFFER_LVALUE = \
- yy_create_buffer(yyin,YY_BUF_SIZE ); \
- } \
- YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
- }
-
-#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
-
-typedef unsigned char YY_CHAR;
-
-FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
-
-typedef int yy_state_type;
-
-extern int yylineno;
-
-int yylineno = 1;
-
-extern char *yytext;
-#define yytext_ptr yytext
-
-static yy_state_type yy_get_previous_state (void );
-static yy_state_type yy_try_NUL_trans (yy_state_type current_state );
-static int yy_get_next_buffer (void );
-static void yy_fatal_error (yyconst char msg[] );
-
-/* Done after the current pattern has been matched and before the
- * corresponding action - sets up yytext.
- */
-#define YY_DO_BEFORE_ACTION \
- (yytext_ptr) = yy_bp; \
- yyleng = (yy_size_t) (yy_cp - yy_bp); \
- (yy_hold_char) = *yy_cp; \
- *yy_cp = '\0'; \
- (yy_c_buf_p) = yy_cp;
-
-#define YY_NUM_RULES 25
-#define YY_END_OF_BUFFER 26
-/* This struct is not used in this scanner,
- but its presence is necessary. */
-struct yy_trans_info
- {
- flex_int32_t yy_verify;
- flex_int32_t yy_nxt;
- };
-static yyconst flex_int16_t yy_accept[81] =
- { 0,
- 0, 0, 26, 25, 7, 8, 5, 25, 1, 2,
- 11, 11, 6, 3, 4, 25, 25, 25, 25, 25,
- 25, 25, 0, 9, 11, 0, 6, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 10, 0, 0,
- 13, 0, 0, 0, 0, 16, 0, 0, 0, 0,
- 0, 12, 15, 0, 23, 0, 0, 0, 0, 0,
- 0, 14, 18, 0, 0, 0, 0, 0, 17, 0,
- 24, 0, 0, 0, 20, 22, 0, 21, 19, 0
- } ;
-
-static yyconst flex_int32_t yy_ec[256] =
- { 0,
- 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 4, 1, 5, 1, 1, 1, 1, 1, 6,
- 7, 1, 1, 1, 1, 1, 1, 8, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 1, 10, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 11, 1, 12, 1, 1, 1, 13, 14, 15, 16,
-
- 17, 18, 19, 20, 21, 1, 1, 22, 1, 23,
- 24, 25, 1, 26, 27, 28, 29, 30, 1, 31,
- 32, 33, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1
- } ;
-
-static yyconst flex_int32_t yy_meta[34] =
- { 0,
- 1, 1, 2, 1, 1, 1, 1, 3, 3, 1,
- 1, 1, 3, 3, 3, 3, 3, 3, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1
- } ;
-
-static yyconst flex_int16_t yy_base[84] =
- { 0,
- 0, 0, 100, 101, 101, 101, 101, 94, 101, 101,
- 26, 28, 0, 101, 101, 82, 26, 18, 74, 79,
- 78, 81, 88, 101, 32, 0, 0, 76, 65, 62,
- 61, 75, 20, 59, 61, 66, 58, 0, 57, 56,
- 54, 63, 53, 62, 54, 101, 59, 48, 53, 46,
- 59, 101, 44, 43, 101, 41, 55, 46, 53, 44,
- 31, 101, 101, 39, 27, 21, 39, 19, 101, 35,
- 101, 33, 26, 29, 101, 101, 28, 101, 101, 101,
- 58, 61, 41
- } ;
-
-static yyconst flex_int16_t yy_def[84] =
- { 0,
- 80, 1, 80, 80, 80, 80, 80, 81, 80, 80,
- 80, 80, 82, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 81, 80, 80, 83, 82, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 83, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80, 80, 0,
- 80, 80, 80
- } ;
-
-static yyconst flex_int16_t yy_nxt[135] =
- { 0,
- 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
- 14, 15, 16, 17, 18, 4, 4, 4, 4, 4,
- 19, 4, 4, 4, 4, 20, 21, 4, 4, 22,
- 4, 4, 4, 25, 25, 25, 25, 32, 29, 25,
- 25, 33, 44, 38, 79, 78, 30, 77, 45, 76,
- 75, 74, 73, 72, 71, 70, 26, 31, 23, 23,
- 23, 27, 69, 27, 68, 67, 66, 65, 64, 63,
- 62, 61, 60, 59, 58, 57, 56, 55, 54, 53,
- 52, 51, 50, 49, 48, 47, 46, 43, 42, 41,
- 40, 39, 24, 37, 36, 35, 34, 28, 24, 80,
-
- 3, 80, 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80
- } ;
-
-static yyconst flex_int16_t yy_chk[135] =
- { 0,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 11, 11, 12, 12, 18, 17, 25,
- 25, 18, 33, 83, 77, 74, 17, 73, 33, 72,
- 70, 68, 67, 66, 65, 64, 11, 17, 81, 81,
- 81, 82, 61, 82, 60, 59, 58, 57, 56, 54,
- 53, 51, 50, 49, 48, 47, 45, 44, 43, 42,
- 41, 40, 39, 37, 36, 35, 34, 32, 31, 30,
- 29, 28, 23, 22, 21, 20, 19, 16, 8, 3,
-
- 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80
- } ;
-
-static yy_state_type yy_last_accepting_state;
-static char *yy_last_accepting_cpos;
-
-extern int yy_flex_debug;
-int yy_flex_debug = 0;
-
-/* The intent behind this definition is that it'll catch
- * any uses of REJECT which flex missed.
- */
-#define REJECT reject_used_but_not_detected
-#define yymore() yymore_used_but_not_detected
-#define YY_MORE_ADJ 0
-#define YY_RESTORE_YY_MORE_OFFSET
-char *yytext;
-#line 1 "syslex.l"
-#define YY_NO_INPUT 1
-#line 4 "syslex.l"
-/* Copyright 2001, 2003, 2005, 2007, 2011, 2012 Free Software Foundation, Inc.
-
- This file is part of GNU Binutils.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with GLD; see the file COPYING. If not, write to the Free
- Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
- 02110-1301, USA. */
-
-/* Note: config.h is #included via syslex_wrap.c. */
-
-#ifdef HAVE_STRING_H
-#include
-#else
-#ifdef HAVE_STRINGS_H
-#include
-#endif
-#endif
-
-#include "sysinfo.h"
-
-#ifndef YY_NO_UNPUT
-#define YY_NO_UNPUT
-#endif
-
-#ifndef yywrap
-static int yywrap (void) { return 1; }
-#endif
-
-extern int yylex (void);
-#line 544 "syslex.c"
-
-#define INITIAL 0
-
-#ifndef YY_NO_UNISTD_H
-/* Special case for "unistd.h", since it is non-ANSI. We include it way
- * down here because we want the user's section 1 to have been scanned first.
- * The user has a chance to override it with an option.
- */
-#include
-#endif
-
-#ifndef YY_EXTRA_TYPE
-#define YY_EXTRA_TYPE void *
-#endif
-
-static int yy_init_globals (void );
-
-/* Accessor methods to globals.
- These are made visible to non-reentrant scanners for convenience. */
-
-int yylex_destroy (void );
-
-int yyget_debug (void );
-
-void yyset_debug (int debug_flag );
-
-YY_EXTRA_TYPE yyget_extra (void );
-
-void yyset_extra (YY_EXTRA_TYPE user_defined );
-
-FILE *yyget_in (void );
-
-void yyset_in (FILE * in_str );
-
-FILE *yyget_out (void );
-
-void yyset_out (FILE * out_str );
-
-yy_size_t yyget_leng (void );
-
-char *yyget_text (void );
-
-int yyget_lineno (void );
-
-void yyset_lineno (int line_number );
-
-/* Macros after this point can all be overridden by user definitions in
- * section 1.
- */
-
-#ifndef YY_SKIP_YYWRAP
-#ifdef __cplusplus
-extern "C" int yywrap (void );
-#else
-extern int yywrap (void );
-#endif
-#endif
-
-#ifndef yytext_ptr
-static void yy_flex_strncpy (char *,yyconst char *,int );
-#endif
-
-#ifdef YY_NEED_STRLEN
-static int yy_flex_strlen (yyconst char * );
-#endif
-
-#ifndef YY_NO_INPUT
-
-#ifdef __cplusplus
-static int yyinput (void );
-#else
-static int input (void );
-#endif
-
-#endif
-
-/* Amount of stuff to slurp up with each read. */
-#ifndef YY_READ_BUF_SIZE
-#define YY_READ_BUF_SIZE 8192
-#endif
-
-/* Copy whatever the last rule matched to the standard output. */
-#ifndef ECHO
-/* This used to be an fputs(), but since the string might contain NUL's,
- * we now use fwrite().
- */
-#define ECHO fwrite( yytext, yyleng, 1, yyout )
-#endif
-
-/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
- * is returned in "result".
- */
-#ifndef YY_INPUT
-#define YY_INPUT(buf,result,max_size) \
- if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
- { \
- int c = '*'; \
- yy_size_t n; \
- for ( n = 0; n < max_size && \
- (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
- buf[n] = (char) c; \
- if ( c == '\n' ) \
- buf[n++] = (char) c; \
- if ( c == EOF && ferror( yyin ) ) \
- YY_FATAL_ERROR( "input in flex scanner failed" ); \
- result = n; \
- } \
- else \
- { \
- errno=0; \
- while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
- { \
- if( errno != EINTR) \
- { \
- YY_FATAL_ERROR( "input in flex scanner failed" ); \
- break; \
- } \
- errno=0; \
- clearerr(yyin); \
- } \
- }\
-\
-
-#endif
-
-/* No semi-colon after return; correct usage is to write "yyterminate();" -
- * we don't want an extra ';' after the "return" because that will cause
- * some compilers to complain about unreachable statements.
- */
-#ifndef yyterminate
-#define yyterminate() return YY_NULL
-#endif
-
-/* Number of entries by which start-condition stack grows. */
-#ifndef YY_START_STACK_INCR
-#define YY_START_STACK_INCR 25
-#endif
-
-/* Report a fatal error. */
-#ifndef YY_FATAL_ERROR
-#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
-#endif
-
-/* end tables serialization structures and prototypes */
-
-/* Default declaration of generated scanner - a define so the user can
- * easily add parameters.
- */
-#ifndef YY_DECL
-#define YY_DECL_IS_OURS 1
-
-extern int yylex (void);
-
-#define YY_DECL int yylex (void)
-#endif /* !YY_DECL */
-
-/* Code executed at the beginning of each rule, after yytext and yyleng
- * have been set up.
- */
-#ifndef YY_USER_ACTION
-#define YY_USER_ACTION
-#endif
-
-/* Code executed at the end of each rule. */
-#ifndef YY_BREAK
-#define YY_BREAK break;
-#endif
-
-#define YY_RULE_SETUP \
- YY_USER_ACTION
-
-/** The main scanner function which does all the work.
- */
-YY_DECL
-{
- register yy_state_type yy_current_state;
- register char *yy_cp, *yy_bp;
- register int yy_act;
-
-#line 45 "syslex.l"
-
-#line 726 "syslex.c"
-
- if ( !(yy_init) )
- {
- (yy_init) = 1;
-
-#ifdef YY_USER_INIT
- YY_USER_INIT;
-#endif
-
- if ( ! (yy_start) )
- (yy_start) = 1; /* first start state */
-
- if ( ! yyin )
- yyin = stdin;
-
- if ( ! yyout )
- yyout = stdout;
-
- if ( ! YY_CURRENT_BUFFER ) {
- yyensure_buffer_stack ();
- YY_CURRENT_BUFFER_LVALUE =
- yy_create_buffer(yyin,YY_BUF_SIZE );
- }
-
- yy_load_buffer_state( );
- }
-
- while ( 1 ) /* loops until end-of-file is reached */
- {
- yy_cp = (yy_c_buf_p);
-
- /* Support of yytext. */
- *yy_cp = (yy_hold_char);
-
- /* yy_bp points to the position in yy_ch_buf of the start of
- * the current run.
- */
- yy_bp = yy_cp;
-
- yy_current_state = (yy_start);
-yy_match:
- do
- {
- register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
- if ( yy_accept[yy_current_state] )
- {
- (yy_last_accepting_state) = yy_current_state;
- (yy_last_accepting_cpos) = yy_cp;
- }
- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
- {
- yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 81 )
- yy_c = yy_meta[(unsigned int) yy_c];
- }
- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
- ++yy_cp;
- }
- while ( yy_base[yy_current_state] != 101 );
-
-yy_find_action:
- yy_act = yy_accept[yy_current_state];
- if ( yy_act == 0 )
- { /* have to back up */
- yy_cp = (yy_last_accepting_cpos);
- yy_current_state = (yy_last_accepting_state);
- yy_act = yy_accept[yy_current_state];
- }
-
- YY_DO_BEFORE_ACTION;
-
-do_action: /* This label is used only to access EOF actions. */
-
- switch ( yy_act )
- { /* beginning of action switch */
- case 0: /* must back up */
- /* undo the effects of YY_DO_BEFORE_ACTION */
- *yy_cp = (yy_hold_char);
- yy_cp = (yy_last_accepting_cpos);
- yy_current_state = (yy_last_accepting_state);
- goto yy_find_action;
-
-case 1:
-YY_RULE_SETUP
-#line 46 "syslex.l"
-{ return '(';}
- YY_BREAK
-case 2:
-YY_RULE_SETUP
-#line 47 "syslex.l"
-{ return ')';}
- YY_BREAK
-case 3:
-YY_RULE_SETUP
-#line 48 "syslex.l"
-{ return '[';}
- YY_BREAK
-case 4:
-YY_RULE_SETUP
-#line 49 "syslex.l"
-{ return ']';}
- YY_BREAK
-case 5:
-YY_RULE_SETUP
-#line 50 "syslex.l"
-{ ; }
- YY_BREAK
-case 6:
-YY_RULE_SETUP
-#line 51 "syslex.l"
-{ ; }
- YY_BREAK
-case 7:
-YY_RULE_SETUP
-#line 52 "syslex.l"
-{ ; }
- YY_BREAK
-case 8:
-/* rule 8 can match eol */
-YY_RULE_SETUP
-#line 53 "syslex.l"
-{ ; }
- YY_BREAK
-case 9:
-/* rule 9 can match eol */
-YY_RULE_SETUP
-#line 54 "syslex.l"
-{
- yylval.s = malloc (yyleng - 1);
- memcpy (yylval.s, yytext + 1, yyleng - 2);
- yylval.s[yyleng - 2] = '\0';
- return NAME;
- }
- YY_BREAK
-case 10:
-YY_RULE_SETUP
-#line 61 "syslex.l"
-{
- yylval.i = strtol(yytext,0,16);
- return NUMBER;
- }
- YY_BREAK
-case 11:
-YY_RULE_SETUP
-#line 66 "syslex.l"
-{
- yylval.i = atoi(yytext);
- return NUMBER;
- }
- YY_BREAK
-case 12:
-YY_RULE_SETUP
-#line 72 "syslex.l"
-{ yylval.i =1 ;return UNIT;}
- YY_BREAK
-case 13:
-YY_RULE_SETUP
-#line 73 "syslex.l"
-{ yylval.i = 1; return UNIT;}
- YY_BREAK
-case 14:
-YY_RULE_SETUP
-#line 74 "syslex.l"
-{ yylval.i= 8; return UNIT;}
- YY_BREAK
-case 15:
-YY_RULE_SETUP
-#line 75 "syslex.l"
-{ yylval.i = 8; return UNIT;}
- YY_BREAK
-case 16:
-YY_RULE_SETUP
-#line 77 "syslex.l"
-{ yylval.s = "INT"; return TYPE;}
- YY_BREAK
-case 17:
-YY_RULE_SETUP
-#line 78 "syslex.l"
-{ yylval.s = "BARRAY"; return TYPE;}
- YY_BREAK
-case 18:
-YY_RULE_SETUP
-#line 79 "syslex.l"
-{ yylval.s = "CHARS"; return TYPE;}
- YY_BREAK
-case 19:
-YY_RULE_SETUP
-#line 80 "syslex.l"
-{ yylval.i = 0; return NUMBER;}
- YY_BREAK
-case 20:
-YY_RULE_SETUP
-#line 81 "syslex.l"
-{ yylval.i = -4; return NUMBER;}
- YY_BREAK
-case 21:
-YY_RULE_SETUP
-#line 82 "syslex.l"
-{ yylval.i = -2; return NUMBER; }
- YY_BREAK
-case 22:
-YY_RULE_SETUP
-#line 83 "syslex.l"
-{ yylval.i = -1; return NUMBER; }
- YY_BREAK
-case 23:
-YY_RULE_SETUP
-#line 84 "syslex.l"
-{ return COND;}
- YY_BREAK
-case 24:
-YY_RULE_SETUP
-#line 85 "syslex.l"
-{ return REPEAT;}
- YY_BREAK
-case 25:
-YY_RULE_SETUP
-#line 86 "syslex.l"
-ECHO;
- YY_BREAK
-#line 947 "syslex.c"
-case YY_STATE_EOF(INITIAL):
- yyterminate();
-
- case YY_END_OF_BUFFER:
- {
- /* Amount of text matched not including the EOB char. */
- int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
-
- /* Undo the effects of YY_DO_BEFORE_ACTION. */
- *yy_cp = (yy_hold_char);
- YY_RESTORE_YY_MORE_OFFSET
-
- if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
- {
- /* We're scanning a new file or input source. It's
- * possible that this happened because the user
- * just pointed yyin at a new source and called
- * yylex(). If so, then we have to assure
- * consistency between YY_CURRENT_BUFFER and our
- * globals. Here is the right place to do so, because
- * this is the first action (other than possibly a
- * back-up) that will match for the new input source.
- */
- (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
- YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
- YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
- }
-
- /* Note that here we test for yy_c_buf_p "<=" to the position
- * of the first EOB in the buffer, since yy_c_buf_p will
- * already have been incremented past the NUL character
- * (since all states make transitions on EOB to the
- * end-of-buffer state). Contrast this with the test
- * in input().
- */
- if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
- { /* This was really a NUL. */
- yy_state_type yy_next_state;
-
- (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
-
- yy_current_state = yy_get_previous_state( );
-
- /* Okay, we're now positioned to make the NUL
- * transition. We couldn't have
- * yy_get_previous_state() go ahead and do it
- * for us because it doesn't know how to deal
- * with the possibility of jamming (and we don't
- * want to build jamming into it because then it
- * will run more slowly).
- */
-
- yy_next_state = yy_try_NUL_trans( yy_current_state );
-
- yy_bp = (yytext_ptr) + YY_MORE_ADJ;
-
- if ( yy_next_state )
- {
- /* Consume the NUL. */
- yy_cp = ++(yy_c_buf_p);
- yy_current_state = yy_next_state;
- goto yy_match;
- }
-
- else
- {
- yy_cp = (yy_c_buf_p);
- goto yy_find_action;
- }
- }
-
- else switch ( yy_get_next_buffer( ) )
- {
- case EOB_ACT_END_OF_FILE:
- {
- (yy_did_buffer_switch_on_eof) = 0;
-
- if ( yywrap( ) )
- {
- /* Note: because we've taken care in
- * yy_get_next_buffer() to have set up
- * yytext, we can now set up
- * yy_c_buf_p so that if some total
- * hoser (like flex itself) wants to
- * call the scanner after we return the
- * YY_NULL, it'll still work - another
- * YY_NULL will get returned.
- */
- (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
-
- yy_act = YY_STATE_EOF(YY_START);
- goto do_action;
- }
-
- else
- {
- if ( ! (yy_did_buffer_switch_on_eof) )
- YY_NEW_FILE;
- }
- break;
- }
-
- case EOB_ACT_CONTINUE_SCAN:
- (yy_c_buf_p) =
- (yytext_ptr) + yy_amount_of_matched_text;
-
- yy_current_state = yy_get_previous_state( );
-
- yy_cp = (yy_c_buf_p);
- yy_bp = (yytext_ptr) + YY_MORE_ADJ;
- goto yy_match;
-
- case EOB_ACT_LAST_MATCH:
- (yy_c_buf_p) =
- &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
-
- yy_current_state = yy_get_previous_state( );
-
- yy_cp = (yy_c_buf_p);
- yy_bp = (yytext_ptr) + YY_MORE_ADJ;
- goto yy_find_action;
- }
- break;
- }
-
- default:
- YY_FATAL_ERROR(
- "fatal flex scanner internal error--no action found" );
- } /* end of action switch */
- } /* end of scanning one token */
-} /* end of yylex */
-
-/* yy_get_next_buffer - try to read in a new buffer
- *
- * Returns a code representing an action:
- * EOB_ACT_LAST_MATCH -
- * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
- * EOB_ACT_END_OF_FILE - end of file
- */
-static int yy_get_next_buffer (void)
-{
- register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
- register char *source = (yytext_ptr);
- register int number_to_move, i;
- int ret_val;
-
- if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
- YY_FATAL_ERROR(
- "fatal flex scanner internal error--end of buffer missed" );
-
- if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
- { /* Don't try to fill the buffer, so this is an EOF. */
- if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
- {
- /* We matched a single character, the EOB, so
- * treat this as a final EOF.
- */
- return EOB_ACT_END_OF_FILE;
- }
-
- else
- {
- /* We matched some text prior to the EOB, first
- * process it.
- */
- return EOB_ACT_LAST_MATCH;
- }
- }
-
- /* Try to read more data. */
-
- /* First move last chars to start of buffer. */
- number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
-
- for ( i = 0; i < number_to_move; ++i )
- *(dest++) = *(source++);
-
- if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
- /* don't do the read, it's not guaranteed to return an EOF,
- * just force an EOF
- */
- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
-
- else
- {
- yy_size_t num_to_read =
- YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
-
- while ( num_to_read <= 0 )
- { /* Not enough room in the buffer - grow it. */
-
- /* just a shorter name for the current buffer */
- YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
-
- int yy_c_buf_p_offset =
- (int) ((yy_c_buf_p) - b->yy_ch_buf);
-
- if ( b->yy_is_our_buffer )
- {
- yy_size_t new_size = b->yy_buf_size * 2;
-
- if ( new_size <= 0 )
- b->yy_buf_size += b->yy_buf_size / 8;
- else
- b->yy_buf_size *= 2;
-
- b->yy_ch_buf = (char *)
- /* Include room in for 2 EOB chars. */
- yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 );
- }
- else
- /* Can't grow it, we don't own it. */
- b->yy_ch_buf = 0;
-
- if ( ! b->yy_ch_buf )
- YY_FATAL_ERROR(
- "fatal error - scanner input buffer overflow" );
-
- (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
-
- num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
- number_to_move - 1;
-
- }
-
- if ( num_to_read > YY_READ_BUF_SIZE )
- num_to_read = YY_READ_BUF_SIZE;
-
- /* Read in more data. */
- YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
- (yy_n_chars), num_to_read );
-
- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
- }
-
- if ( (yy_n_chars) == 0 )
- {
- if ( number_to_move == YY_MORE_ADJ )
- {
- ret_val = EOB_ACT_END_OF_FILE;
- yyrestart(yyin );
- }
-
- else
- {
- ret_val = EOB_ACT_LAST_MATCH;
- YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
- YY_BUFFER_EOF_PENDING;
- }
- }
-
- else
- ret_val = EOB_ACT_CONTINUE_SCAN;
-
- if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
- /* Extend the array by 50%, plus the number we really need. */
- yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size );
- if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
- YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
- }
-
- (yy_n_chars) += number_to_move;
- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
-
- (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
-
- return ret_val;
-}
-
-/* yy_get_previous_state - get the state just before the EOB char was reached */
-
- static yy_state_type yy_get_previous_state (void)
-{
- register yy_state_type yy_current_state;
- register char *yy_cp;
-
- yy_current_state = (yy_start);
-
- for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
- {
- register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
- if ( yy_accept[yy_current_state] )
- {
- (yy_last_accepting_state) = yy_current_state;
- (yy_last_accepting_cpos) = yy_cp;
- }
- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
- {
- yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 81 )
- yy_c = yy_meta[(unsigned int) yy_c];
- }
- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
- }
-
- return yy_current_state;
-}
-
-/* yy_try_NUL_trans - try to make a transition on the NUL character
- *
- * synopsis
- * next_state = yy_try_NUL_trans( current_state );
- */
- static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
-{
- register int yy_is_jam;
- register char *yy_cp = (yy_c_buf_p);
-
- register YY_CHAR yy_c = 1;
- if ( yy_accept[yy_current_state] )
- {
- (yy_last_accepting_state) = yy_current_state;
- (yy_last_accepting_cpos) = yy_cp;
- }
- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
- {
- yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 81 )
- yy_c = yy_meta[(unsigned int) yy_c];
- }
- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
- yy_is_jam = (yy_current_state == 80);
-
- return yy_is_jam ? 0 : yy_current_state;
-}
-
-#ifndef YY_NO_INPUT
-#ifdef __cplusplus
- static int yyinput (void)
-#else
- static int input (void)
-#endif
-
-{
- int c;
-
- *(yy_c_buf_p) = (yy_hold_char);
-
- if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
- {
- /* yy_c_buf_p now points to the character we want to return.
- * If this occurs *before* the EOB characters, then it's a
- * valid NUL; if not, then we've hit the end of the buffer.
- */
- if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
- /* This was really a NUL. */
- *(yy_c_buf_p) = '\0';
-
- else
- { /* need more input */
- yy_size_t offset = (yy_c_buf_p) - (yytext_ptr);
- ++(yy_c_buf_p);
-
- switch ( yy_get_next_buffer( ) )
- {
- case EOB_ACT_LAST_MATCH:
- /* This happens because yy_g_n_b()
- * sees that we've accumulated a
- * token and flags that we need to
- * try matching the token before
- * proceeding. But for input(),
- * there's no matching to consider.
- * So convert the EOB_ACT_LAST_MATCH
- * to EOB_ACT_END_OF_FILE.
- */
-
- /* Reset buffer status. */
- yyrestart(yyin );
-
- /*FALLTHROUGH*/
-
- case EOB_ACT_END_OF_FILE:
- {
- if ( yywrap( ) )
- return 0;
-
- if ( ! (yy_did_buffer_switch_on_eof) )
- YY_NEW_FILE;
-#ifdef __cplusplus
- return yyinput();
-#else
- return input();
-#endif
- }
-
- case EOB_ACT_CONTINUE_SCAN:
- (yy_c_buf_p) = (yytext_ptr) + offset;
- break;
- }
- }
- }
-
- c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */
- *(yy_c_buf_p) = '\0'; /* preserve yytext */
- (yy_hold_char) = *++(yy_c_buf_p);
-
- return c;
-}
-#endif /* ifndef YY_NO_INPUT */
-
-/** Immediately switch to a different input stream.
- * @param input_file A readable stream.
- *
- * @note This function does not reset the start condition to @c INITIAL .
- */
- void yyrestart (FILE * input_file )
-{
-
- if ( ! YY_CURRENT_BUFFER ){
- yyensure_buffer_stack ();
- YY_CURRENT_BUFFER_LVALUE =
- yy_create_buffer(yyin,YY_BUF_SIZE );
- }
-
- yy_init_buffer(YY_CURRENT_BUFFER,input_file );
- yy_load_buffer_state( );
-}
-
-/** Switch to a different input buffer.
- * @param new_buffer The new input buffer.
- *
- */
- void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer )
-{
-
- /* TODO. We should be able to replace this entire function body
- * with
- * yypop_buffer_state();
- * yypush_buffer_state(new_buffer);
- */
- yyensure_buffer_stack ();
- if ( YY_CURRENT_BUFFER == new_buffer )
- return;
-
- if ( YY_CURRENT_BUFFER )
- {
- /* Flush out information for old buffer. */
- *(yy_c_buf_p) = (yy_hold_char);
- YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
- }
-
- YY_CURRENT_BUFFER_LVALUE = new_buffer;
- yy_load_buffer_state( );
-
- /* We don't actually know whether we did this switch during
- * EOF (yywrap()) processing, but the only time this flag
- * is looked at is after yywrap() is called, so it's safe
- * to go ahead and always set it.
- */
- (yy_did_buffer_switch_on_eof) = 1;
-}
-
-static void yy_load_buffer_state (void)
-{
- (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
- (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
- yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
- (yy_hold_char) = *(yy_c_buf_p);
-}
-
-/** Allocate and initialize an input buffer state.
- * @param file A readable stream.
- * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
- *
- * @return the allocated buffer state.
- */
- YY_BUFFER_STATE yy_create_buffer (FILE * file, int size )
-{
- YY_BUFFER_STATE b;
-
- b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) );
- if ( ! b )
- YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
-
- b->yy_buf_size = size;
-
- /* yy_ch_buf has to be 2 characters longer than the size given because
- * we need to put in 2 end-of-buffer characters.
- */
- b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 );
- if ( ! b->yy_ch_buf )
- YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
-
- b->yy_is_our_buffer = 1;
-
- yy_init_buffer(b,file );
-
- return b;
-}
-
-/** Destroy the buffer.
- * @param b a buffer created with yy_create_buffer()
- *
- */
- void yy_delete_buffer (YY_BUFFER_STATE b )
-{
-
- if ( ! b )
- return;
-
- if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
- YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
-
- if ( b->yy_is_our_buffer )
- yyfree((void *) b->yy_ch_buf );
-
- yyfree((void *) b );
-}
-
-#ifndef __cplusplus
-extern int isatty (int );
-#endif /* __cplusplus */
-
-/* Initializes or reinitializes a buffer.
- * This function is sometimes called more than once on the same buffer,
- * such as during a yyrestart() or at EOF.
- */
- static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file )
-
-{
- int oerrno = errno;
-
- yy_flush_buffer(b );
-
- b->yy_input_file = file;
- b->yy_fill_buffer = 1;
-
- /* If b is the current buffer, then yy_init_buffer was _probably_
- * called from yyrestart() or through yy_get_next_buffer.
- * In that case, we don't want to reset the lineno or column.
- */
- if (b != YY_CURRENT_BUFFER){
- b->yy_bs_lineno = 1;
- b->yy_bs_column = 0;
- }
-
- b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
-
- errno = oerrno;
-}
-
-/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
- * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
- *
- */
- void yy_flush_buffer (YY_BUFFER_STATE b )
-{
- if ( ! b )
- return;
-
- b->yy_n_chars = 0;
-
- /* We always need two end-of-buffer characters. The first causes
- * a transition to the end-of-buffer state. The second causes
- * a jam in that state.
- */
- b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
- b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
-
- b->yy_buf_pos = &b->yy_ch_buf[0];
-
- b->yy_at_bol = 1;
- b->yy_buffer_status = YY_BUFFER_NEW;
-
- if ( b == YY_CURRENT_BUFFER )
- yy_load_buffer_state( );
-}
-
-/** Pushes the new state onto the stack. The new state becomes
- * the current state. This function will allocate the stack
- * if necessary.
- * @param new_buffer The new state.
- *
- */
-void yypush_buffer_state (YY_BUFFER_STATE new_buffer )
-{
- if (new_buffer == NULL)
- return;
-
- yyensure_buffer_stack();
-
- /* This block is copied from yy_switch_to_buffer. */
- if ( YY_CURRENT_BUFFER )
- {
- /* Flush out information for old buffer. */
- *(yy_c_buf_p) = (yy_hold_char);
- YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
- }
-
- /* Only push if top exists. Otherwise, replace top. */
- if (YY_CURRENT_BUFFER)
- (yy_buffer_stack_top)++;
- YY_CURRENT_BUFFER_LVALUE = new_buffer;
-
- /* copied from yy_switch_to_buffer. */
- yy_load_buffer_state( );
- (yy_did_buffer_switch_on_eof) = 1;
-}
-
-/** Removes and deletes the top of the stack, if present.
- * The next element becomes the new top.
- *
- */
-void yypop_buffer_state (void)
-{
- if (!YY_CURRENT_BUFFER)
- return;
-
- yy_delete_buffer(YY_CURRENT_BUFFER );
- YY_CURRENT_BUFFER_LVALUE = NULL;
- if ((yy_buffer_stack_top) > 0)
- --(yy_buffer_stack_top);
-
- if (YY_CURRENT_BUFFER) {
- yy_load_buffer_state( );
- (yy_did_buffer_switch_on_eof) = 1;
- }
-}
-
-/* Allocates the stack if it does not exist.
- * Guarantees space for at least one push.
- */
-static void yyensure_buffer_stack (void)
-{
- yy_size_t num_to_alloc;
-
- if (!(yy_buffer_stack)) {
-
- /* First allocation is just for 2 elements, since we don't know if this
- * scanner will even need a stack. We use 2 instead of 1 to avoid an
- * immediate realloc on the next call.
- */
- num_to_alloc = 1;
- (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc
- (num_to_alloc * sizeof(struct yy_buffer_state*)
- );
- if ( ! (yy_buffer_stack) )
- YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
-
- memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
-
- (yy_buffer_stack_max) = num_to_alloc;
- (yy_buffer_stack_top) = 0;
- return;
- }
-
- if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
-
- /* Increase the buffer to prepare for a possible push. */
- int grow_size = 8 /* arbitrary grow size */;
-
- num_to_alloc = (yy_buffer_stack_max) + grow_size;
- (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc
- ((yy_buffer_stack),
- num_to_alloc * sizeof(struct yy_buffer_state*)
- );
- if ( ! (yy_buffer_stack) )
- YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
-
- /* zero only the new slots.*/
- memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
- (yy_buffer_stack_max) = num_to_alloc;
- }
-}
-
-/** Setup the input buffer state to scan directly from a user-specified character buffer.
- * @param base the character buffer
- * @param size the size in bytes of the character buffer
- *
- * @return the newly allocated buffer state object.
- */
-YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size )
-{
- YY_BUFFER_STATE b;
-
- if ( size < 2 ||
- base[size-2] != YY_END_OF_BUFFER_CHAR ||
- base[size-1] != YY_END_OF_BUFFER_CHAR )
- /* They forgot to leave room for the EOB's. */
- return 0;
-
- b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) );
- if ( ! b )
- YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
-
- b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
- b->yy_buf_pos = b->yy_ch_buf = base;
- b->yy_is_our_buffer = 0;
- b->yy_input_file = 0;
- b->yy_n_chars = b->yy_buf_size;
- b->yy_is_interactive = 0;
- b->yy_at_bol = 1;
- b->yy_fill_buffer = 0;
- b->yy_buffer_status = YY_BUFFER_NEW;
-
- yy_switch_to_buffer(b );
-
- return b;
-}
-
-/** Setup the input buffer state to scan a string. The next call to yylex() will
- * scan from a @e copy of @a str.
- * @param yystr a NUL-terminated string to scan
- *
- * @return the newly allocated buffer state object.
- * @note If you want to scan bytes that may contain NUL values, then use
- * yy_scan_bytes() instead.
- */
-YY_BUFFER_STATE yy_scan_string (yyconst char * yystr )
-{
-
- return yy_scan_bytes(yystr,strlen(yystr) );
-}
-
-/** Setup the input buffer state to scan the given bytes. The next call to yylex() will
- * scan from a @e copy of @a bytes.
- * @param bytes the byte buffer to scan
- * @param len the number of bytes in the buffer pointed to by @a bytes.
- *
- * @return the newly allocated buffer state object.
- */
-YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len )
-{
- YY_BUFFER_STATE b;
- char *buf;
- yy_size_t n, i;
-
- /* Get memory for full buffer, including space for trailing EOB's. */
- n = _yybytes_len + 2;
- buf = (char *) yyalloc(n );
- if ( ! buf )
- YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
-
- for ( i = 0; i < _yybytes_len; ++i )
- buf[i] = yybytes[i];
-
- buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
-
- b = yy_scan_buffer(buf,n );
- if ( ! b )
- YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
-
- /* It's okay to grow etc. this buffer, and we should throw it
- * away when we're done.
- */
- b->yy_is_our_buffer = 1;
-
- return b;
-}
-
-#ifndef YY_EXIT_FAILURE
-#define YY_EXIT_FAILURE 2
-#endif
-
-static void yy_fatal_error (yyconst char* msg )
-{
- (void) fprintf( stderr, "%s\n", msg );
- exit( YY_EXIT_FAILURE );
-}
-
-/* Redefine yyless() so it works in section 3 code. */
-
-#undef yyless
-#define yyless(n) \
- do \
- { \
- /* Undo effects of setting up yytext. */ \
- int yyless_macro_arg = (n); \
- YY_LESS_LINENO(yyless_macro_arg);\
- yytext[yyleng] = (yy_hold_char); \
- (yy_c_buf_p) = yytext + yyless_macro_arg; \
- (yy_hold_char) = *(yy_c_buf_p); \
- *(yy_c_buf_p) = '\0'; \
- yyleng = yyless_macro_arg; \
- } \
- while ( 0 )
-
-/* Accessor methods (get/set functions) to struct members. */
-
-/** Get the current line number.
- *
- */
-int yyget_lineno (void)
-{
-
- return yylineno;
-}
-
-/** Get the input stream.
- *
- */
-FILE *yyget_in (void)
-{
- return yyin;
-}
-
-/** Get the output stream.
- *
- */
-FILE *yyget_out (void)
-{
- return yyout;
-}
-
-/** Get the length of the current token.
- *
- */
-yy_size_t yyget_leng (void)
-{
- return yyleng;
-}
-
-/** Get the current token.
- *
- */
-
-char *yyget_text (void)
-{
- return yytext;
-}
-
-/** Set the current line number.
- * @param line_number
- *
- */
-void yyset_lineno (int line_number )
-{
-
- yylineno = line_number;
-}
-
-/** Set the input stream. This does not discard the current
- * input buffer.
- * @param in_str A readable stream.
- *
- * @see yy_switch_to_buffer
- */
-void yyset_in (FILE * in_str )
-{
- yyin = in_str ;
-}
-
-void yyset_out (FILE * out_str )
-{
- yyout = out_str ;
-}
-
-int yyget_debug (void)
-{
- return yy_flex_debug;
-}
-
-void yyset_debug (int bdebug )
-{
- yy_flex_debug = bdebug ;
-}
-
-static int yy_init_globals (void)
-{
- /* Initialization is the same as for the non-reentrant scanner.
- * This function is called from yylex_destroy(), so don't allocate here.
- */
-
- (yy_buffer_stack) = 0;
- (yy_buffer_stack_top) = 0;
- (yy_buffer_stack_max) = 0;
- (yy_c_buf_p) = (char *) 0;
- (yy_init) = 0;
- (yy_start) = 0;
-
-/* Defined in main.c */
-#ifdef YY_STDINIT
- yyin = stdin;
- yyout = stdout;
-#else
- yyin = (FILE *) 0;
- yyout = (FILE *) 0;
-#endif
-
- /* For future reference: Set errno on error, since we are called by
- * yylex_init()
- */
- return 0;
-}
-
-/* yylex_destroy is for both reentrant and non-reentrant scanners. */
-int yylex_destroy (void)
-{
-
- /* Pop the buffer stack, destroying each element. */
- while(YY_CURRENT_BUFFER){
- yy_delete_buffer(YY_CURRENT_BUFFER );
- YY_CURRENT_BUFFER_LVALUE = NULL;
- yypop_buffer_state();
- }
-
- /* Destroy the stack itself. */
- yyfree((yy_buffer_stack) );
- (yy_buffer_stack) = NULL;
-
- /* Reset the globals. This is important in a non-reentrant scanner so the next time
- * yylex() is called, initialization will occur. */
- yy_init_globals( );
-
- return 0;
-}
-
-/*
- * Internal utility routines.
- */
-
-#ifndef yytext_ptr
-static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
-{
- register int i;
- for ( i = 0; i < n; ++i )
- s1[i] = s2[i];
-}
-#endif
-
-#ifdef YY_NEED_STRLEN
-static int yy_flex_strlen (yyconst char * s )
-{
- register int n;
- for ( n = 0; s[n]; ++n )
- ;
-
- return n;
-}
-#endif
-
-void *yyalloc (yy_size_t size )
-{
- return (void *) malloc( size );
-}
-
-void *yyrealloc (void * ptr, yy_size_t size )
-{
- /* The cast to (char *) in the following accommodates both
- * implementations that use char* generic pointers, and those
- * that use void* generic pointers. It works with the latter
- * because both ANSI C and C++ allow castless assignment from
- * any pointer type to void*, and deal with argument conversions
- * as though doing an assignment.
- */
- return (void *) realloc( (char *) ptr, size );
-}
-
-void yyfree (void * ptr )
-{
- free( (char *) ptr ); /* see yyrealloc() for (char *) cast */
-}
-
-#define YYTABLES_NAME "yytables"
-
-#line 86 "syslex.l"
diff -Nur binutils-2.24.orig/cgen/aclocal.m4 binutils-2.24/cgen/aclocal.m4
--- binutils-2.24.orig/cgen/aclocal.m4 1970-01-01 01:00:00.000000000 +0100
+++ binutils-2.24/cgen/aclocal.m4 2024-05-17 16:15:39.031345828 +0200
@@ -0,0 +1,137 @@
+dnl aclocal.m4 generated automatically by aclocal 1.4
+
+dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl This program is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+dnl PARTICULAR PURPOSE.
+
+# Do all the work for Automake. This macro actually does too much --
+# some checks are only needed if your package does certain things.
+# But this isn't really a big deal.
+
+# serial 1
+
+dnl Usage:
+dnl AM_INIT_AUTOMAKE(package,version, [no-define])
+
+AC_DEFUN(AM_INIT_AUTOMAKE,
+[AC_REQUIRE([AC_PROG_INSTALL])
+PACKAGE=[$1]
+AC_SUBST(PACKAGE)
+VERSION=[$2]
+AC_SUBST(VERSION)
+dnl test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
+ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+fi
+ifelse([$3],,
+AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package]))
+AC_REQUIRE([AM_SANITY_CHECK])
+AC_REQUIRE([AC_ARG_PROGRAM])
+dnl FIXME This is truly gross.
+missing_dir=`cd $ac_aux_dir && pwd`
+AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir)
+AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir)
+AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir)
+AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir)
+AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir)
+AC_REQUIRE([AC_PROG_MAKE_SET])])
+
+#
+# Check to make sure that the build environment is sane.
+#
+
+AC_DEFUN(AM_SANITY_CHECK,
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftestfile
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
+ if test "[$]*" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftestfile`
+ fi
+ if test "[$]*" != "X $srcdir/configure conftestfile" \
+ && test "[$]*" != "X conftestfile $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
+alias in your environment])
+ fi
+
+ test "[$]2" = conftestfile
+ )
+then
+ # Ok.
+ :
+else
+ AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+rm -f conftest*
+AC_MSG_RESULT(yes)])
+
+dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY)
+dnl The program must properly implement --version.
+AC_DEFUN(AM_MISSING_PROG,
+[AC_MSG_CHECKING(for working $2)
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf. Sigh.
+if ($2 --version) < /dev/null > /dev/null 2>&1; then
+ $1=$2
+ AC_MSG_RESULT(found)
+else
+ $1="$3/missing $2"
+ AC_MSG_RESULT(missing)
+fi
+AC_SUBST($1)])
+
+# Add --enable-maintainer-mode option to configure.
+# From Jim Meyering
+
+# serial 1
+
+AC_DEFUN(AM_MAINTAINER_MODE,
+[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+ dnl maintainer-mode is disabled by default
+ AC_ARG_ENABLE(maintainer-mode,
+[ --enable-maintainer-mode enable make rules and dependencies not useful
+ (and sometimes confusing) to the casual installer],
+ USE_MAINTAINER_MODE=$enableval,
+ USE_MAINTAINER_MODE=no)
+ AC_MSG_RESULT($USE_MAINTAINER_MODE)
+ AM_CONDITIONAL(MAINTAINER_MODE, test $USE_MAINTAINER_MODE = yes)
+ MAINT=$MAINTAINER_MODE_TRUE
+ AC_SUBST(MAINT)dnl
+]
+)
+
+# Define a conditional.
+
+AC_DEFUN(AM_CONDITIONAL,
+[AC_SUBST($1_TRUE)
+AC_SUBST($1_FALSE)
+if $2; then
+ $1_TRUE=
+ $1_FALSE='#'
+else
+ $1_TRUE='#'
+ $1_FALSE=
+fi])
+
diff -Nur binutils-2.24.orig/cgen/attr.scm binutils-2.24/cgen/attr.scm
--- binutils-2.24.orig/cgen/attr.scm 1970-01-01 01:00:00.000000000 +0100
+++ binutils-2.24/cgen/attr.scm 2024-05-17 16:15:39.031345828 +0200
@@ -0,0 +1,1230 @@
+; Attributes.
+; Copyright (C) 2000, 2003, 2005, 2009 Red Hat, Inc.
+; This file is part of CGEN.
+; See file COPYING.CGEN for details.
+
+; There are 5 kinds of attributes: boolean, integer, enum, bitset, and string.
+; Boolean attributes are really enum attributes with two possible values,
+; but they occur frequently enough that they are special cased.
+; String attributes are intentionally not documented in the manual as
+; being supported - they're still a bit of work-in-progress.
+;
+; All objects that use attributes must have two methods:
+; - 'get-atlist - returns the object's attr-list
+; - 'set-atlist! - set the object's attr-list
+;
+; In .cpu files, attribute lists are associative lists of (NAME VALUE).
+; Boolean attributes are specified as (NAME #t) or (NAME #f),
+; but for convenience ATTR and !ATTR are also supported.
+; integer/enum attrs are specified as (ATTR value).
+; string attrs are specified as (ATTR "value").
+; Bitset attrs are specified as (ATTR val1 val2 val3), each value must be
+; a valid Scheme symbol (stick with valid C symbols + "-" and you'll be fine).
+; For backwards compatibility (ATTR val1,val2,val3) and
+; (ATTR "val1,val2,val3") are also supported for bitset values.
+; val1,val2,val3 is not portable (e.g. mzscheme will reject it).
+; In all cases the value needn't be constant, and can be an expression,
+; though expressions are currently only supported for META-attributes
+; (attributes that don't appear in any generated code).
+;
+; Example:
+; (FOO1 !FOO2 (BAR 3) (FOO3 X) (MACH sparc sparclite))
+;
+; ??? Implementation of expressions is being postponed as long
+; as possible, avoiding adding complications for complication's sake, and
+; because I'm not completely sure how I want to do them.
+; The syntax for an expression value is (ATTR (rtx-func ...)).
+;
+; ??? May wish to allow a bitset attribute like (ATTR val1 !val2), where `!'
+; means to turn off that particular bit (or bits if val2 refers to several).
+;
+; ??? May wish to allow specifying enum attributes by only having to
+; specify the value (move names into "enum space" or some such).
+
+; An attr-list (or "atlist") is a collection of attributes.
+; Attributes are stored as an associative list.
+; There is possible confusion between "alist" (associative-list) and
+; "atlist" (attribute-list) but in practice I haven't had a problem.
+; ??? May wish to change this to a list of objects, as the alist doesn't carry
+; enough info. However the alist is simple and fast.
+
+(define (class-make ' nil '(prefix attrs) nil))
+
+(define atlist-prefix (elm-make-getter 'prefix))
+(define atlist-attrs (elm-make-getter 'attrs))
+
+(define (atlist? x) (class-instance? x))
+
+; An empty attribute-list.
+
+(define atlist-empty (make "" nil))
+
+; The attribute baseclass.
+; The attributes of are the set of attributes for this attribute
+; [meaning attributes themselves can have attributes].
+; [Ya, that's clumsily written. I left it that way for fun.]
+; An odd notion that is of some use. It's current raison d'etre is to
+; support sanitization of attributes [which is implemented with the
+; `sanitize' attribute].
+
+(define
+ (class-make '
+ '()
+ '(
+ ; List of object types this attribute is for.
+ ; Possible element values are:
+ ; attr, enum, cpu, mach, model, ifield, hardware, operand,
+ ; insn
+ ; A value of #f means the attribute is for everything.
+ for
+ )
+ nil)
+)
+
+; Accessors.
+
+(define atlist-for (elm-make-getter 'for))
+
+; A class for each type of attribute.
+
+; `values' exists for boolean-attribute to simplify the code, it's ignored.
+; Ditto for `default'. The default for boolean-attribute is always #f.
+
+(define
+ (class-make '
+ '()
+ '(default values)
+ nil)
+)
+
+; VALUES is ignored for string-attribute.
+
+(define
+ (class-make '
+ '()
+ '(default values)
+ nil)
+)
+
+; For bitset attributes VALUES is a list of
+; (symbol bit-number-or-#f attr-list comment-or-#f),
+; one for each bit.
+; If bit-number is #f (unspecified), cgen will choose.
+; Int's are used to record the bitset in the generated code so there's a limit
+; of 32 elements, though there's nothing inherent in the description language
+; that precludes removing the limit.
+; NOTE: While one might want to record each element as an object, there's
+; currently no need for the added complexity.
+
+(define
+ (class-make '
+ '()
+ '(default values)
+ nil)
+)
+
+; For integer attributes VALUES is a list of (int),
+; one for each possible value,
+; or the empty list of all values are permissible.
+; Note that each element is itself a list. This is for consistency.
+
+(define
+ (class-make '
+ '()
+ '(default values)
+ nil)
+)
+
+; For enum attributes VALUES is a list of
+; (symbol enum-value-or-#f attr-list comment-or-#f),
+; one for each possible.
+; If enum-value is #f (unspecified) cgen will apply the standard rule for
+; assigning enum values.
+; NOTE: While one might want to record each element as an object, there's
+; currently no need for the added complexity.
+
+(define
+ (class-make '
+ '()
+ '(default values)
+ nil)
+)
+
+; Return a boolean indicating if X is a object.
+
+(define (bool-attr? x) (class-instance? x))
+
+; Return a symbol indicating the kind of attribute ATTR is.
+; The result is one of boolean,integer,enum,bitset or string.
+
+(define (attr-kind attr)
+ (case (object-class-name attr)
+ (() 'boolean)
+ (() 'string)
+ (() 'integer)
+ (() 'enum)
+ (() 'bitset)
+ (else (error "attr-kind: internal error, not an attribute class"
+ (object-class-name attr))))
+)
+
+; Accessors.
+
+(define (attr-default attr) (elm-xget attr 'default))
+(define (attr-values attr) (elm-xget attr 'values))
+
+; Create an attribute.
+; Attributes are stored in attribute lists using the actual value
+; rather than an object containing the value, so we only have to cons
+; NAME and VALUE rather than building some object. This is for simplicity
+; and speed. We try to incrementally complicate things, only as necessary.
+
+; VALUE must be #f or #t.
+
+(define (bool-attr-make name value) (cons name value))
+
+; VALUES must be a list of symbols.
+; E.g., (val1 val2) not val1,val2.
+
+(define (bitset-attr-make name values) (cons name values))
+
+; VALUE must be a number (or maybe a symbol).
+
+(define (int-attr-make name value) (cons name value))
+
+; VALUE must be a symbol.
+
+(define (enum-attr-make name value) (cons name value))
+
+;; Return a procedure to parse an attribute.
+;; RIGHT-TYPE? is a procedure that verifies the value is the right type.
+;; MESSAGE is printed if there is an error.
+;; The result of the parsed attribute is (name . value).
+
+(define (/parse-simple-attribute right-type? message)
+ (lambda (self context val)
+ (if (and (not (null? val))
+ (right-type? (car val))
+ (null? (cdr val)))
+ (cons (obj:name self) (car val))
+ (parse-error context message (cons (obj:name self) val))))
+)
+
+; A boolean attribute's value is either #t or #f.
+
+(method-make!
+ 'parse-value
+ (/parse-simple-attribute boolean? "boolean attribute not one of #f/#t")
+)
+
+(method-make!
+ 'parse-value
+ (/parse-simple-attribute string? "invalid argument to string attribute"))
+
+; A bitset attribute's value is a list of symbols.
+; For backwards compatibility (ATTR val1,val2,val3) and
+; (ATTR "val1,val2,val3") are also supported for bitset values.
+; val1,val2,val3 is not portable (e.g. mzscheme will reject it).
+;
+; We don't validate the values. In the case of the MACH attribute,
+; there's no current mechanism to create it after all define-mach's have
+; been read in.
+; ??? Need to decide whether all define-mach's must appear before any
+; define-insn's. It would be nice to be able to spread an architecture's
+; description over several .cpu files.
+; ??? On the other hand, all machs are specified in define-arch.
+; Perhaps creation of builtins could be defered until then.
+
+(method-make!
+ 'parse-value
+ (lambda (self context val)
+ (let ((value (if (and (= (length val) 1)
+ (or (symbol? (car val)) (string? (car val))))
+ (map string->symbol (string-cut (->string (car val)) #\,))
+ val))
+ (message "improper bitset attribute"))
+ ;; NOTE: An empty list is ok.
+ (if (all-true? (map symbol? value))
+ (cons (obj:name self) value)
+ (parse-error context message (cons (obj:name self) val)))))
+)
+
+; An integer attribute's value is a number
+; (or maybe a symbol representing that value).
+
+(method-make!
+ 'parse-value
+ (/parse-simple-attribute (lambda (x) (or (number? x) (symbol? x)))
+ "improper integer attribute")
+)
+
+; An enum attribute's value is a symbol representing that value.
+
+(method-make!
+ 'parse-value
+ (/parse-simple-attribute (lambda (x) (or (symbol? x) (string? x)))
+ "improper enum attribute")
+)
+
+; Parse a boolean attribute's value definition.
+
+(method-make!
+ 'parse-value-def
+ (lambda (self context values)
+ (if (equal? values '(#f #t))
+ values
+ (parse-error context "boolean value list must be (#f #t)" values)))
+)
+
+; Ignore values for strings.
+; They're not supported and /attr-read catches this.
+
+(method-make!
+ 'parse-value-def
+ (lambda (self context values) #f)
+)
+
+; Parse a bitset attribute's value definition.
+
+(method-make!
+ 'parse-value-def
+ (lambda (self context values)
+ ;; parse-enum-vals works well enough
+ (parse-enum-vals context "" values))
+)
+
+; Parse an integer attribute's value definition.
+; VALUES may be #f which means any value is ok.
+; A fixed set of VALUES is work-in-progress.
+
+(method-make!
+ 'parse-value-def
+ (lambda (self context values)
+ (if values
+ (for-each (lambda (val)
+ ;; A list entry is for providing a sanitization key.
+ (if (or (not (list? val))
+ (not (number? (car val))))
+ (parse-error context
+ "invalid element in integer attribute list"
+ val)))
+ values))
+ values)
+)
+
+; Parse an enum attribute's value definition.
+; See parse-enum-vals for more info.
+
+(method-make!
+ 'parse-value-def
+ (lambda (self context values)
+ (parse-enum-vals context "" values))
+)
+
+; Make an attribute list object from a list of name/value pairs.
+
+(define (atlist-make prefix . attrs) (make prefix attrs))
+
+; Parse an attribute definition.
+; This is the main routine for building an attribute object from a
+; description in the .cpu file.
+; All arguments are in raw (non-evaluated) form.
+; TYPE-CLASS is the class of the object to create.
+; i.e. one of <{boolean,bitset,integer,enum,string}-attribute>.
+; For enum attributes, if DEFAULT is #f use the first value.
+; For all other attribute kinds, we use what /attr-read gives us.
+; ??? Allowable values for integer attributes is wip,
+; for now it is the portable set of integers (int32_t).
+
+(define (/attr-parse context type-class name comment attrs for default values)
+ (logit 2 "Processing attribute " name " ...\n")
+
+ ;; Pick out name first to augment the error context.
+ (let* ((name (parse-name context name))
+ (context (context-append-name context name))
+ (result (new type-class))
+ (parsed-values (send result 'parse-value-def context values)))
+
+ (elm-xset! result 'name name)
+ (elm-xset! result 'comment (parse-comment context comment))
+ (elm-xset! result 'attrs (atlist-parse context attrs ""))
+ (elm-xset! result 'for for)
+
+ ;; Set the default.
+ ;; FIXME: Clean up with /attr-read.
+ (case (class-name type-class)
+ (()
+ ;; ??? docs say default must be #f, but we want to allow an rtx to
+ ;; specify the default.
+ (if (and (not (memq default '(#f #t)))
+ (not (/attr-val-is-rtx? default)))
+ (parse-error context "invalid default" default))
+ (elm-xset! result 'default default))
+ (()
+ (let ((default (or default "")))
+ (if (and (not (string? default))
+ (not (/attr-val-is-rtx? default)))
+ (parse-error context "invalid default" default))
+ (elm-xset! result 'default default)))
+ (()
+ (let ((default (if default default (if (null? values) 0 (car values)))))
+ (if (and (not (integer? default))
+ (not (/attr-val-is-rtx? default)))
+ (parse-error context "invalid default" default))
+ (elm-xset! result 'default default)))
+ (()
+ (let ((default (if default default (caar parsed-values))))
+ (if (and (not (assq default parsed-values))
+ (not (/attr-val-is-rtx? default)))
+ (parse-error context "invalid default" default))
+ (elm-xset! result 'default default)))
+ (()
+ ;; bitset attributes must specify a default, /attr-read catches this
+ (assert default)
+ ;; It's also /attr-read's job to ensure it is a list.
+ (assert (list? default))
+ (let ((default default))
+ ;; NOTE: We don't allow an rtx for bitset attributes,
+ ;; the rtl language currently doesn't support them.
+ (if (/attr-val-is-rtx? default)
+ (parse-error context "invalid default, rtx not supported for bitset" default))
+ (if (not (all-true? (map (lambda (v) (assq v parsed-values))
+ default)))
+ (parse-error context "invalid default" default))
+ (elm-xset! result 'default default))))
+
+ (elm-xset! result 'values parsed-values)
+
+ result)
+)
+
+; Read an attribute description
+; This is the main routine for analyzing attributes in the .cpu file.
+; CONTEXT is a object for error messages.
+; ARG-LIST is an associative list of field name and field value.
+; /attr-parse is invoked to create the attribute object.
+
+(define (/attr-read context . arg-list)
+ (let (
+ (type 'not-set) ;; attribute type
+ (type-class 'not-set) ;; attribute class
+ (name #f)
+ (comment "")
+ (attrs nil)
+ (for #f) ;; assume for everything
+ (default #f) ;; #f indicates "not set"
+ (values #f) ;; #f indicates "not set"
+ )
+
+ ;; Loop over each element in ARG-LIST, recording what's found.
+ (let loop ((arg-list arg-list))
+ (if (null? arg-list)
+ nil
+ (let ((arg (car arg-list))
+ (elm-name (caar arg-list)))
+ (case elm-name
+ ((type)
+ (set! type-class (case (cadr arg)
+ ((boolean) )
+ ((string) )
+ ((bitset) )
+ ((integer) )
+ ((enum) )
+ (else (parse-error
+ context
+ "invalid attribute type"
+ (cadr arg)))))
+ (set! type (cadr arg)))
+ ((name) (set! name (cadr arg)))
+ ((comment) (set! comment (cadr arg)))
+ ((attrs) (set! attrs (cdr arg)))
+ ((for) (set! for (cdr arg)))
+ ((default) (set! default (cdr arg)))
+ ((values) (set! values (cdr arg)))
+ (else (parse-error context "invalid attribute arg" arg)))
+ (loop (cdr arg-list)))))
+
+ ;; Must have type now.
+ (if (eq? type-class 'not-set)
+ (parse-error context "type not specified") arg-list)
+
+ ;; For scalar attributes, fix up the default.
+ (if (and default (memq type '(boolean string integer enum)))
+ (begin
+ (if (!= (length default) 1)
+ (parse-error context "invalid default" default))
+ ;; Don't change rtx values.
+ (if (not (pair? (car default)))
+ (set! default (car default)))))
+
+ ;; Establish proper defaults now that we know the type.
+ ;; FIXME: Clean up with /attr-parse.
+ (case type
+ ((boolean)
+ (if (eq? default #f)
+ (set! default #f)) ;; really a nop, but for consistency
+ (if (eq? values #f)
+ (set! values '(#f #t))))
+ ((bitset) ;; FIXME
+ (if (eq? default #f)
+ (parse-error context "bitset attribute default not specified"
+ arg-list))
+ (if (eq? values #f)
+ (parse-error context "bitset attribute values not specified"
+ arg-list)))
+ ((integer) ;; FIXME
+ (if (eq? default #f)
+ (set! default 0))
+ (if (eq? values #f)
+ (set! values #f))) ;; really a nop, but for consistency
+ ((enum) ;; FIXME
+;; There are some existing cases where no default is specified,
+;; expecting that the first value is the default.
+;; (if (eq? default #f)
+;; (parse-error context "enum attribute default not specified"
+;; arg-list))
+ (if (eq? values #f)
+ (parse-error context "enum attribute values not specified"
+ arg-list)))
+ ((string)
+ (if (eq? default #f)
+ (set! default ""))
+ (if (not (eq? values #f))
+ (parse-error context "string attribute values specified"
+ arg-list)))
+ )
+
+ ;; Now that we've identified the elements, build the object.
+ (/attr-parse context type-class name comment attrs for default values))
+)
+
+; Main routines for defining attributes in .cpu files.
+
+(define define-attr
+ (lambda arg-list
+ (let ((a (apply /attr-read (cons (make-current-context "define-attr")
+ arg-list))))
+ (current-attr-add! a)
+ a))
+)
+
+; Query routines.
+
+; Lookup ATTR-NAME in ATTR-LIST.
+; The result is the object or #f if not found.
+
+(define (attr-lookup attr-name attr-list)
+ (object-assq attr-name attr-list)
+)
+
+; Return a boolean indicating if boolean attribute ATTR is "true" in
+; attribute alist ALIST.
+; Note that if the attribute isn't present, it is defined to be #f.
+
+(method-make!
+ 'has-attr?
+ (lambda (self attr)
+ (let ((a (assq attr (elm-get self 'attrs))))
+ (cond ((not a) a)
+ ((boolean? (cdr a)) (cdr a))
+ (else (error "Not a boolean attribute:" attr)))))
+)
+
+(define (atlist-has-attr? atlist attr)
+ (send atlist 'has-attr? attr)
+)
+
+; Return a boolean indicating if attribute ATTR is present in
+; attribute alist ALIST.
+
+(method-make!
+ 'attr-present?
+ (lambda (self attr)
+ (->bool (assq attr (elm-get self 'attrs))))
+)
+
+(define (atlist-attr-present? atlist attr)
+ (send atlist 'attr-present? attr)
+)
+
+;; Return #t if attribute value VAL is an rtx expression.
+;; RTXs in attributes are recorded as a list of one element
+;; which is the rtx.
+;; I.e., ((rtx foo bar)).
+
+(define (/attr-val-is-rtx? val)
+ (and (pair? val)
+ (null? (cdr val))
+ (pair? (car val))) ;; pair? -> cheap non-null-list?
+)
+
+; Expand attribute value ATVAL, which is an rtx expression.
+; OWNER is the containing object or #f if there is none.
+; OWNER is needed if an attribute is defined in terms of other attributes.
+; OWNER is also needed to get the ISA(s) in which to evaluate the expression.
+; If it's #f obviously ATVAL can't be defined in terms of others,
+; or refer to operands that require an ISA to disambiguate.
+
+(define (/attr-eval atval owner)
+ (let* ((atval-expr (car atval))
+ (expr (rtx-simplify #f owner
+ (rtx-canonicalize #f 'DFLT
+ (and owner (obj-isa-list owner))
+ nil atval-expr)
+ nil))
+ (value (rtx-value expr owner)))
+ (cond ((symbol? value) value)
+ ((number? value) value)
+ (error "/attr-eval: internal error, unsupported result:" value)))
+)
+
+; Return value of ATTR in attribute alist ALIST.
+; If not present, return the default value.
+; If ATTR is an unknown attribute, return #f.
+; OWNER is the containing object or #f if there is none.
+
+(define (attr-value alist attr owner)
+ (let ((a (assq-ref alist attr)))
+ (if a
+ (if (/attr-val-is-rtx? a)
+ (/attr-eval a owner)
+ a)
+ (attr-lookup-default attr owner)))
+)
+
+; Return the value of ATTR in ATLIST.
+; If not present, return the default value.
+; If ATTR is an unknown attribute, return #f.
+; OWNER is the containing object or #f if there is none.
+
+(define (atlist-attr-value atlist attr owner)
+ (attr-value (atlist-attrs atlist) attr owner)
+)
+
+; Same as atlist-attr-value but return nil if attribute not present.
+
+(define (atlist-attr-value-no-default atlist attr owner)
+ (let ((a (assq-ref (atlist-attrs atlist) attr)))
+ (if a
+ (if (/attr-val-is-rtx? a)
+ (/attr-eval a owner)
+ a)
+ nil))
+)
+
+; Return the default for attribute A.
+;
+; If A is unknown return #f.
+; This means the caller can't distinguish booleans from unknowns,
+; but the caller is left to deal with that.
+;
+; OWNER is the containing object or #f if there is none.
+
+(define (attr-lookup-default a owner)
+ (let ((at (current-attr-lookup a)))
+ (if at
+ (if (bool-attr? at)
+ #f ;; FIXME: should fetch default from the attribute
+ (let ((deflt (attr-default at)))
+ (if deflt
+ (if (/attr-val-is-rtx? deflt)
+ (/attr-eval deflt owner)
+ deflt)
+ ;; If no default was provided, use the first value.
+ ;; FIXME: This shouldn't happen. /attr-parse should DTRT.
+ (caar (attr-values at)))))
+ #f))
+)
+
+; Return a boolean indicating if X is present in BITSET.
+; Bitset values are recorded as (val1 val2 ...).
+
+(define (bitset-attr-member? x bitset)
+ (->bool (memq x bitset))
+)
+
+; Routines for accessing attributes in objects.
+
+; Get/set attributes of OBJ.
+; OBJ is any object which supports the get-atlist message.
+
+(define (obj-atlist obj)
+ (let ((result (send obj 'get-atlist)))
+ ; As a speed up, we allow objects to specify an empty attribute list
+ ; with #f or (), rather than creating an attr-list object.
+ ; ??? There is atlist-empty now which should be used directly.
+ (if (or (null? result) (not result))
+ atlist-empty
+ result))
+)
+
+(define (obj-set-atlist! obj attrs) (send obj 'set-atlist! attrs))
+
+; Add attribute ATTR to OBJ.
+; The attribute is prepended to the front so it overrides any existing
+; definition.
+
+(define (obj-cons-attr! obj attr)
+ (obj-set-atlist! obj (atlist-cons attr (obj-atlist obj)))
+)
+
+; Add attribute list ATLIST to OBJ.
+; Attributes in ATLIST override existing values, so ATLIST is "prepended".
+
+(define (obj-prepend-atlist! obj atlist)
+ ; Must have same prefix.
+ (assert (equal? (atlist-prefix (obj-atlist obj))
+ (atlist-prefix atlist)))
+ (obj-set-atlist! obj (atlist-append atlist (obj-atlist obj)))
+)
+
+; Return boolean of whether OBJ has boolean attribute ATTR or not.
+; OBJ is any object that supports attributes.
+
+(define (obj-has-attr? obj attr)
+ (atlist-has-attr? (obj-atlist obj) attr)
+)
+
+; FIXME: for backward compatibility. Delete in time.
+(define has-attr? obj-has-attr?)
+
+; Return a boolean indicating if attribute ATTR is present in OBJ.
+
+(define (obj-attr-present? obj attr)
+ (atlist-attr-present? (obj-atlist obj) attr)
+)
+
+; Return value of attribute ATTR in OBJ.
+; If the attribute isn't present, the default is returned.
+; If ATTR is an unknown attribute, return #f.
+; OBJ is any object that supports the get-atlist method.
+
+(define (obj-attr-value obj attr)
+ (let ((atlist (obj-atlist obj)))
+ (atlist-attr-value atlist attr obj))
+)
+
+; Return boolean of whether OBJ has attribute ATTR value VALUE or not.
+; OBJ is any object that supports attributes.
+; NOTE: The default value of the attribute IS considered.
+
+(define (obj-has-attr-value? obj attr value)
+ (let ((a (obj-attr-value obj attr)))
+ (eq? a value))
+)
+
+; Return boolean of whether OBJ explicitly has attribute ATTR value VALUE
+; or not.
+; OBJ is any object that supports attributes.
+; NOTE: The default value of the attribute IS NOT considered.
+
+(define (obj-has-attr-value-no-default? obj attr value)
+ (let* ((atlist (obj-atlist obj))
+ (objs-value (atlist-attr-value-no-default atlist attr obj)))
+ (and (not (null? objs-value)) (eq? value objs-value)))
+)
+
+; Utilities.
+
+; Generate a list representing a bit mask of the indices of 'values'
+; within 'all-values'. Each element in the resulting list represents a byte.
+; Both bits and bytes are indexed from left to right starting at 0
+; with 8 bits in a byte.
+
+(define (charmask-bytes values all-values vec-length)
+ (logit 3 "charmask-bytes for " values " " all-values "\n")
+ (let ((result (make-vector vec-length 0))
+ (indices (map (lambda (name)
+ (list-ref (map cadr all-values)
+ (element-lookup-index name (map car all-values) 0)))
+ values)))
+ (logit 3 "indices: " indices "\n")
+ (for-each (lambda (x)
+ (let* ((byteno (quotient x 8))
+ (bitno (- 7 (remainder x 8)))
+ (byteval (logior (vector-ref result byteno)
+ (ash 1 bitno))))
+ (vector-set! result byteno byteval)))
+ indices)
+ (logit 3 "result: " (vector->list result) "\n")
+ (vector->list result))
+)
+
+; Convert a bitset value into a bit string based on the
+; index of each member in values.
+; VALUE is a list of symbols in the bitset.
+; VALUES is the values member of the attribute's definition.
+
+(define (/bitset-attr->charmask value values)
+ (let* ((values-names (map car values))
+ (values-values (map cadr values))
+ (vec-length (+ 1 (quotient (apply max values-values) 8))))
+ (string-append "{ " (number->string vec-length) ", \""
+ (string-map (lambda (x)
+ (string-append "\\x" (number->hex x)))
+ (charmask-bytes value values vec-length))
+ "\" }"))
+)
+
+; Return the enum of ATTR-NAME for type TYPE.
+; TYPE is one of 'ifld, 'hw, 'operand, 'insn.
+
+(define (gen-attr-enum type attr-name)
+ (string-upcase (string-append "CGEN_" type "_" (gen-sym attr-name)))
+)
+
+; Return a list of enum value definitions for gen-enum-decl.
+; Attributes numbers are organized as follows: booleans are numbered 0-31.
+; The range is because that's what fits in a portable int. Unused numbers
+; are left unused. Non-booleans are numbered starting at 32.
+; An alternative is start numbering the booleans at 32. The generated code
+; is simpler with the current way (the "- 32" to get back the bit number or
+; array index number occurs less often).
+;
+; Three special values are created:
+; END-BOOLS - mark end of boolean attributes
+; END-NBOOLS - mark end of non-boolean attributes
+; START-NBOOLS - marks the start of the non-boolean attributes
+; (needed in case first non-bool is sanytized out).
+;
+; ATTR-OBJ-LIST is a list of objects (always subclassed of course).
+
+(define (attr-list-enum-list attr-obj-list)
+ (let ((sorted-attrs (/attr-sort (attr-remove-meta-attrs attr-obj-list))))
+ (assert (<= (length (car sorted-attrs)) 32))
+ (append!
+ (map (lambda (bool-attr)
+ (list (obj:name bool-attr) '-
+ (atlist-attrs (obj-atlist bool-attr))))
+ (car sorted-attrs))
+ (list '(END-BOOLS))
+ (list '(START-NBOOLS 31))
+ (map (lambda (nbool-attr)
+ (list (obj:name nbool-attr) '-
+ (atlist-attrs (obj-atlist nbool-attr))))
+ (cdr sorted-attrs))
+ (list '(END-NBOOLS))
+ ))
+)
+
+; Sort an alist of attributes so non-boolean attributes are at the front.
+; This is used to sort a particular object's attributes.
+; This is required by the C support code (cgen.h:CGEN_ATTR_VALUE).
+; Boolean attributes appear as (NAME . #t/#f), non-boolean ones appear as
+; (NAME . VALUE). Attributes of the same type are sorted by name.
+
+(define (/attr-sort-alist alist)
+ (sort alist
+ (lambda (a b)
+ ;(display (list a b "\n"))
+ (cond ((and (boolean? (cdr a)) (boolean? (cdr b)))
+ (string (symbol->string (car a)) (symbol->string (car b))))
+ ((boolean? (cdr a)) #f) ; we know b is non-bool here
+ ((boolean? (cdr b)) #t) ; we know a is non-bool here
+ (else (string (symbol->string (car a))
+ (symbol->string (car b)))))))
+)
+
+; Sort ATTR-LIST into two lists: bools and non-bools.
+; The car of the result is the bools, the cdr is the non-bools.
+; Attributes requiring a fixed index have the INDEX attribute,
+; and used for the few special attributes that are refered to by
+; architecture independent code.
+; For each of non-bools and bools, put attributes with the INDEX attribute
+; first. This is used to sort a list of attributes for output (e.g. define
+; the attr enum).
+;
+; FIXME: Record index number with the INDEX attribute and sort on it.
+; At present it's just a boolean.
+
+(define (/attr-sort attr-list)
+ (let loop ((fixed-non-bools nil)
+ (non-fixed-non-bools nil)
+ (fixed-bools nil)
+ (non-fixed-bools nil)
+ (attr-list attr-list))
+ (cond ((null? attr-list)
+ (cons (append! (reverse! fixed-bools)
+ (reverse! non-fixed-bools))
+ (append! (reverse! fixed-non-bools)
+ (reverse! non-fixed-non-bools))))
+ ((bool-attr? (car attr-list))
+ (if (obj-has-attr? (car attr-list) 'INDEX)
+ (loop fixed-non-bools non-fixed-non-bools
+ (cons (car attr-list) fixed-bools) non-fixed-bools
+ (cdr attr-list))
+ (loop fixed-non-bools non-fixed-non-bools
+ fixed-bools (cons (car attr-list) non-fixed-bools)
+ (cdr attr-list))))
+ (else
+ (if (obj-has-attr? (car attr-list) 'INDEX)
+ (loop (cons (car attr-list) fixed-non-bools) non-fixed-non-bools
+ fixed-bools non-fixed-bools
+ (cdr attr-list))
+ (loop fixed-non-bools (cons (car attr-list) non-fixed-non-bools)
+ fixed-bools non-fixed-bools
+ (cdr attr-list))))))
+)
+
+; Return number of non-bools in attributes ATLIST.
+
+(define (attr-count-non-bools atlist)
+ (count-true (map (lambda (a) (not (bool-attr? a)))
+ atlist))
+)
+
+; Given an alist of attributes, return the non-bools.
+
+(define (attr-non-bool-attrs alist)
+ (let loop ((result nil) (alist alist))
+ (cond ((null? alist) (reverse! result))
+ ((boolean? (cdar alist)) (loop result (cdr alist)))
+ (else (loop (cons (car alist) result) (cdr alist)))))
+)
+
+; Given an alist of attributes, return the bools.
+
+(define (attr-bool-attrs alist)
+ (let loop ((result nil) (alist alist))
+ (cond ((null? alist) (reverse! result))
+ ((boolean? (cdar alist))
+ (loop (cons (car alist) result) (cdr alist)))
+ (else (loop result (cdr alist)))))
+)
+
+; Parse an attribute spec.
+; CONTEXT is a object or #f if there is none.
+; ATTRS is a list of attribute specs (e.g. (FOO !BAR (BAZ 3))).
+; The result is the attribute alist.
+
+(define (attr-parse context attrs)
+ (logit 4 (list 'attr-parse context attrs) "\n")
+ (if (not (list? attrs))
+ (parse-error context "improper attribute list" attrs))
+ (let ((alist nil))
+ (for-each (lambda (elm)
+ (cond ((symbol? elm)
+ ; boolean attribute
+ (if (char=? (string-ref (symbol->string elm) 0) #\!)
+ (set! alist (acons (string->symbol (string-drop1 (symbol->string elm))) #f alist))
+ (set! alist (acons elm #t alist)))
+ (if (not (current-attr-lookup (caar alist)))
+ (parse-error context "unknown attribute" (caar alist))))
+ ((and (list? elm) (pair? elm) (symbol? (car elm)))
+ (let ((a (current-attr-lookup (car elm))))
+ (if (not a)
+ (parse-error context "unknown attribute" elm))
+ (set! alist (cons (send a 'parse-value
+ context (cdr elm))
+ alist))))
+ (else (parse-error context "improper attribute" elm))))
+ attrs)
+ alist)
+)
+
+; Parse an object attribute spec.
+; ATTRS is a list of attribute specs (e.g. (FOO !BAR (BAZ 3))).
+; The result is an object.
+
+(define (atlist-parse context attrs prefix)
+ (make prefix (attr-parse context attrs))
+)
+
+;; Return the source form of an atlist's values.
+;; Externally scalar attributes (boolean, integer, enum and string) are
+;; ((name1 value1) (name2 value2) ...).
+;; Internally they are ((name1 . value1) (name2 . value2) ...).
+;; Externally bitset attributes are (name value1 value2 ...).
+;; Internally they are the same, (name value1 value2 ...).
+;; If the value is an rtx expression, externally it is (name (expr)),
+;; and internally it is the same, (name (expr)).
+
+(define (atlist-source-form atlist)
+ (map (lambda (attr)
+ (let ((value (cdr attr)))
+ (if (pair? value)
+ (cons (car attr) value)
+ (list (car attr) value))))
+ (atlist-attrs atlist))
+)
+
+; Cons an attribute to an attribute list to create a new attribute list.
+; ATLIST is either an attr-list object or #f or () (both of the latter two
+; signify an empty attribute list, in which case we make the prefix of the
+; result "").
+
+(define (atlist-cons attr atlist)
+ (if (or (not atlist) (null? atlist))
+ (make "" (cons attr nil))
+ (make (atlist-prefix atlist) (cons attr (atlist-attrs atlist))))
+)
+
+; Append one attribute list to another.
+; The prefix for the new atlist is taken from the first one.
+
+(define (atlist-append attr-list1 attr-list2)
+ (make
+ (atlist-prefix attr-list1)
+ (append (atlist-attrs attr-list1) (atlist-attrs attr-list2)))
+)
+
+; Remove meta-attributes from ALIST.
+; "meta" may be the wrong adjective to use here.
+; The attributes in question are not intended to appear in generated files.
+; They started out being attributes of attributes, hence the name "meta".
+
+(define (attr-remove-meta-attrs-alist alist)
+ (let ((all-attrs (current-attr-list)))
+ ; FIXME: Why not use find?
+ (let loop ((result nil) (alist alist))
+ (if (null? alist)
+ (reverse! result)
+ (let ((attr (attr-lookup (caar alist) all-attrs)))
+ (if (and attr (has-attr? attr 'META))
+ (loop result (cdr alist))
+ (loop (cons (car alist) result) (cdr alist)))))))
+)
+
+; Remove meta-attributes from ATTR-LIST.
+; "meta" may be the wrong adjective to use here.
+; The attributes in question are not intended to appear in generated files.
+; They started out being attributes of attributes, hence the name "meta".
+
+(define (attr-remove-meta-attrs attr-list)
+ ; FIXME: Why not use find?
+ (let loop ((result nil) (attr-list attr-list))
+ (cond ((null? attr-list)
+ (reverse! result))
+ ((has-attr? (car attr-list) 'META)
+ (loop result (cdr attr-list)))
+ (else
+ (loop (cons (car attr-list) result) (cdr attr-list)))))
+)
+
+; Remove duplicates from ATTRS, a list of attributes.
+; Attribute lists are typically small so we use a simple O^2 algorithm.
+; The leading entry of an attribute overrides subsequent ones so this is
+; defined to pick the first entry of each attribute.
+
+(define (attr-nub attrs)
+ (let loop ((result nil) (attrs attrs))
+ (cond ((null? attrs) (reverse! result))
+ ((assq (caar attrs) result) (loop result (cdr attrs)))
+ (else (loop (cons (car attrs) result) (cdr attrs)))))
+)
+
+; Return a list of all attrs in TABLE-LIST, a list of lists of arbitrary
+; elements. A list of lists is passed to simplify computation of insn
+; attributes where the insns and macro-insns are on separate lists and
+; appending them into one list would be unnecessarily expensive.
+; ACCESSOR is a function to access the attrs field from TABLE-LIST.
+; Duplicates are eliminated and the list is sorted so non-boolean attributes
+; are at the front (required by the C code that fetches attribute values).
+; STD-ATTRS is an `attr-list' object of attrs that are always available.
+; The actual values returned are random (e.g. #t vs #f). We could
+; canonicalize them.
+; The result is an alist of all the attributes that are used in TABLE-LIST.
+; ??? The cdr of each element is some random value. Perhaps it should be
+; the default value or perhaps we should just return a list of names.
+; ??? No longer used.
+
+(define (attr-compute-all table-list accessor std-attrs)
+ (let ((accessor (lambda (elm) (atlist-attrs (accessor elm)))))
+ (attr-remove-meta-attrs-alist
+ (attr-nub
+ (/attr-sort-alist
+ (append
+ (apply append
+ (map (lambda (table-elm)
+ (apply append
+ (find-apply accessor
+ (lambda (e)
+ (let ((attrs (accessor e)))
+ (not (null? attrs))))
+ table-elm)))
+ table-list))
+ (atlist-attrs std-attrs))))))
+)
+
+; Return lists of attributes for particular object types.
+; FIXME: The output shouldn't be required to be sorted.
+
+(define (current-attr-list-for type)
+ (let ((sorted (/attr-sort (find (lambda (a)
+ (if (atlist-for a)
+ (memq type (atlist-for a))
+ #t))
+ (attr-remove-meta-attrs
+ (current-attr-list))))))
+ ; Current behaviour puts the non-bools at the front.
+ (append! (cdr sorted) (car sorted)))
+)
+(define (current-ifld-attr-list)
+ (current-attr-list-for 'ifield)
+)
+(define (current-hw-attr-list)
+ (current-attr-list-for 'hardware)
+)
+(define (current-op-attr-list)
+ (current-attr-list-for 'operand)
+)
+(define (current-insn-attr-list)
+ (current-attr-list-for 'insn)
+)
+
+; Methods to emit the C value of an attribute.
+; These don't _really_ belong here (C code doesn't belong in the appl'n
+; independent part of CGEN), but there isn't a better place for them
+; (maybe utils-cgen.scm?) and there's only a few of them.
+
+(method-make!
+ 'gen-value-for-defn-raw
+ (lambda (self value)
+ (if (not value)
+ "0"
+ "1"))
+ ;(string-upcase (string-append (obj:str-name self) "_" value)))
+)
+
+(method-make!
+ 'gen-value-for-defn
+ (lambda (self value)
+ (send self 'gen-value-for-defn-raw value))
+)
+
+;; NOTE: VALUE is a list of symbols in the bitset.
+
+(method-make!
+ 'gen-value-for-defn-raw
+ (lambda (self value)
+ (if (string=? (string-downcase (gen-sym self)) "isa")
+ (/bitset-attr->charmask value (elm-get self 'values))
+ (string-drop1
+ (string-upcase
+ (string-map (lambda (x)
+ (string-append "|(1<<"
+ (gen-sym self)
+ "_" (gen-c-symbol x) ")"))
+ value))))
+ )
+)
+
+;; NOTE: VALUE is a list of symbols in the bitset.
+
+(method-make!
+ 'gen-value-for-defn
+ (lambda (self value)
+ (string-append
+ "{ "
+ (if (string=? (string-downcase (gen-sym self)) "isa")
+ (/bitset-attr->charmask value (elm-get self 'values))
+ (string-append
+ "{ "
+ (string-drop1
+ (string-upcase
+ (string-map (lambda (x)
+ (string-append "|(1<<"
+ (gen-sym self)
+ "_" (gen-c-symbol x) ")"))
+ value)))
+ ", 0 }"))
+ " }")
+ )
+)
+
+(method-make!
+ 'gen-value-for-defn-raw
+ (lambda (self value)
+ (number->string value)
+ )
+)
+
+(method-make!
+ 'gen-value-for-defn
+ (lambda (self value)
+ (string-append
+ "{ { "
+ (send self 'gen-value-for-defn-raw value)
+ ", 0 } }")
+ )
+)
+
+(method-make!
+ 'gen-value-for-defn-raw
+ (lambda (self value)
+ (string-upcase
+ (gen-c-symbol (string-append (obj:str-name self)
+ "_"
+ (symbol->string value))))
+ )
+)
+
+(method-make!
+