* bfd/bfd-in.h (bfd_elf32_arm_set_target_relocs): Update prototype.
[deliverable/binutils-gdb.git] / ld / emultempl / armelf.em
CommitLineData
252b5132 1# This shell script emits a C file. -*- C -*-
aef6203b
AM
2# Copyright 1991, 1993, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
3# 2004, 2005
41392f03
AM
4# Free Software Foundation, Inc.
5#
6# This file is part of GLD, the Gnu Linker.
7#
8# This program is free software; you can redistribute it and/or modify
9# it under the terms of the GNU General Public License as published by
10# the Free Software Foundation; either version 2 of the License, or
11# (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU General Public License
19# along with this program; if not, write to the Free Software
20# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21#
22
23# This file is sourced from elf32.em, and defines extra arm-elf
24# specific routines.
25#
3674e28a 26test -z $TARGET2_TYPE && TARGET2_TYPE="rel"
41392f03 27cat >>e${EMULATION_NAME}.c <<EOF
7ca69e9e 28
88f7bcd5
NC
29static char *thumb_entry_symbol = NULL;
30static bfd *bfd_for_interwork;
e489d0ae 31static int byteswap_code = 0;
9c504268 32static int target1_is_rel = 0${TARGET1_IS_REL};
3674e28a 33static char *target2_type = "${TARGET2_TYPE}";
319850b4 34static int fix_v4bx = 0;
33bfe774 35static int use_blx = 0;
7ca69e9e 36
252b5132 37static void
0c7a8e5a 38gld${EMULATION_NAME}_before_parse (void)
252b5132
RH
39{
40#ifndef TARGET_ /* I.e., if not generic. */
5e2f1575 41 ldfile_set_output_arch ("`echo ${ARCH}`", bfd_arch_unknown);
252b5132 42#endif /* not TARGET_ */
b34976b6
AM
43 config.dynamic_link = ${DYNAMIC_LINK-TRUE};
44 config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
252b5132
RH
45}
46
1220a729 47static void
0c7a8e5a 48arm_elf_after_open (void)
1220a729 49{
f11523b0 50 if (strstr (bfd_get_target (output_bfd), "arm") == NULL)
1220a729 51 {
f11523b0
NC
52 /* The arm backend needs special fields in the output hash structure.
53 These will only be created if the output format is an arm format,
54 hence we do not support linking and changing output formats at the
55 same time. Use a link followed by objcopy to change output formats. */
56 einfo ("%F%X%P: error: cannot change output format whilst linking ARM binaries\n");
57 return;
1220a729
NC
58 }
59
f11523b0
NC
60 {
61 LANG_FOR_EACH_INPUT_STATEMENT (is)
62 {
8afb0e02 63 bfd_elf32_arm_add_glue_sections_to_bfd (is->the_bfd, & link_info);
f11523b0
NC
64 }
65 }
66
41392f03
AM
67 /* Call the standard elf routine. */
68 gld${EMULATION_NAME}_after_open ();
1220a729
NC
69}
70
8afb0e02 71static void
0c7a8e5a 72arm_elf_set_bfd_for_interworking (lang_statement_union_type *statement)
8afb0e02
NC
73{
74 if (statement->header.type == lang_input_section_enum
57ceae94
AM
75 && !statement->input_section.ifile->just_syms_flag
76 && (statement->input_section.section->flags & SEC_EXCLUDE) == 0)
8afb0e02 77 {
88f7bcd5
NC
78 asection *i = statement->input_section.section;
79 asection *output_section = i->output_section;
8afb0e02
NC
80
81 ASSERT (output_section->owner == output_bfd);
82
b7693d02
DJ
83 /* Don't attach the interworking stubs to a dynamic object, to
84 an empty section, etc. */
8afb0e02
NC
85 if ((output_section->flags & SEC_HAS_CONTENTS) != 0
86 && (i->flags & SEC_NEVER_LOAD) == 0
b7693d02 87 && ! (i->owner->flags & DYNAMIC)
8afb0e02
NC
88 && ! i->owner->output_has_begun)
89 {
90 bfd_for_interwork = i->owner;
b34976b6 91 bfd_for_interwork->output_has_begun = TRUE;
8afb0e02
NC
92 }
93 }
94}
1220a729 95
1220a729 96static void
0c7a8e5a 97arm_elf_before_allocation (void)
1220a729 98{
88f7bcd5 99 bfd *tem;
8afb0e02 100
41392f03
AM
101 /* Call the standard elf routine. */
102 gld${EMULATION_NAME}_before_allocation ();
1220a729 103
2004afbc
NC
104 if (link_info.input_bfds != NULL)
105 {
106 /* The interworking bfd must be the last one in the link. */
107 bfd_for_interwork = NULL;
108 for (tem = link_info.input_bfds; tem != NULL; tem = tem->link_next)
b34976b6 109 tem->output_has_begun = FALSE;
252b5132 110
2004afbc 111 lang_for_each_statement (arm_elf_set_bfd_for_interworking);
2004afbc 112 for (tem = link_info.input_bfds; tem != NULL; tem = tem->link_next)
b34976b6 113 tem->output_has_begun = FALSE;
8afb0e02 114
06aa7234
NC
115 /* If bfd_for_interwork is NULL, then there are no loadable sections
116 with real contents to be linked, so we are not going to have to
117 create any interworking stubs, so it is OK not to call
118 bfd_elf32_arm_get_bfd_for_interworking. */
119 if (bfd_for_interwork != NULL)
120 bfd_elf32_arm_get_bfd_for_interworking (bfd_for_interwork, &link_info);
2004afbc 121 }
8afb0e02
NC
122 /* We should be able to set the size of the interworking stub section. */
123
124 /* Here we rummage through the found bfds to collect glue information. */
125 /* FIXME: should this be based on a command line option? krk@cygnus.com */
252b5132
RH
126 {
127 LANG_FOR_EACH_INPUT_STATEMENT (is)
128 {
7ca69e9e 129 if (!bfd_elf32_arm_process_before_allocation (is->the_bfd, & link_info,
3674e28a 130 byteswap_code))
252b5132
RH
131 {
132 /* xgettext:c-format */
133 einfo (_("Errors encountered processing file %s"), is->filename);
134 }
135 }
136 }
137
8afb0e02 138 /* We have seen it all. Allocate it, and carry on. */
252b5132
RH
139 bfd_elf32_arm_allocate_interworking_sections (& link_info);
140}
141
6f798e5c 142static void
0c7a8e5a 143arm_elf_finish (void)
6f798e5c
NC
144{
145 struct bfd_link_hash_entry * h;
146
c56feb2b
AM
147 /* Call the elf32.em routine. */
148 gld${EMULATION_NAME}_finish ();
149
88f7bcd5
NC
150 if (thumb_entry_symbol == NULL)
151 return;
0c7a8e5a 152
88f7bcd5 153 h = bfd_link_hash_lookup (link_info.hash, thumb_entry_symbol,
b34976b6 154 FALSE, FALSE, TRUE);
6f798e5c
NC
155
156 if (h != (struct bfd_link_hash_entry *) NULL
157 && (h->type == bfd_link_hash_defined
158 || h->type == bfd_link_hash_defweak)
159 && h->u.def.section->output_section != NULL)
160 {
161 static char buffer[32];
88f7bcd5 162 bfd_vma val;
0c7a8e5a 163
88f7bcd5
NC
164 /* Special procesing is required for a Thumb entry symbol. The
165 bottom bit of its address must be set. */
166 val = (h->u.def.value
167 + bfd_get_section_vma (output_bfd,
168 h->u.def.section->output_section)
169 + h->u.def.section->output_offset);
0c7a8e5a 170
88f7bcd5 171 val |= 1;
6f798e5c 172
88f7bcd5 173 /* Now convert this value into a string and store it in entry_symbol
0c7a8e5a 174 where the lang_finish() function will pick it up. */
88f7bcd5
NC
175 buffer[0] = '0';
176 buffer[1] = 'x';
0c7a8e5a 177
88f7bcd5 178 sprintf_vma (buffer + 2, val);
6f798e5c 179
88f7bcd5
NC
180 if (entry_symbol.name != NULL && entry_from_cmdline)
181 einfo (_("%P: warning: '--thumb-entry %s' is overriding '-e %s'\n"),
182 thumb_entry_symbol, entry_symbol.name);
183 entry_symbol.name = buffer;
6f798e5c 184 }
88f7bcd5
NC
185 else
186 einfo (_("%P: warning: connot find thumb start symbol %s\n"),
187 thumb_entry_symbol);
6f798e5c
NC
188}
189
3674e28a
PB
190/* This is a convenitent point to tell BFD about target specific flags.
191 After the output has been created, but before inputs are read. */
192static void
193arm_elf_create_output_section_statements (void)
194{
319850b4 195 bfd_elf32_arm_set_target_relocs (&link_info, target1_is_rel, target2_type,
33bfe774 196 fix_v4bx, use_blx);
3674e28a
PB
197}
198
252b5132
RH
199EOF
200
41392f03
AM
201# Define some shell vars to insert bits of code into the standard elf
202# parse_args and list_options functions.
203#
204PARSE_AND_LIST_PROLOGUE='
205#define OPTION_THUMB_ENTRY 301
e489d0ae 206#define OPTION_BE8 302
9c504268
PB
207#define OPTION_TARGET1_REL 303
208#define OPTION_TARGET1_ABS 304
3674e28a 209#define OPTION_TARGET2 305
33bfe774
JB
210#define OPTION_FIX_V4BX 306
211#define OPTION_USE_BLX 307
41392f03 212'
252b5132 213
ef5bdbd1 214PARSE_AND_LIST_SHORTOPTS=p
252b5132 215
41392f03
AM
216PARSE_AND_LIST_LONGOPTS='
217 { "no-pipeline-knowledge", no_argument, NULL, '\'p\''},
218 { "thumb-entry", required_argument, NULL, OPTION_THUMB_ENTRY},
e489d0ae 219 { "be8", no_argument, NULL, OPTION_BE8},
9c504268
PB
220 { "target1-rel", no_argument, NULL, OPTION_TARGET1_REL},
221 { "target1-abs", no_argument, NULL, OPTION_TARGET1_ABS},
3674e28a 222 { "target2", required_argument, NULL, OPTION_TARGET2},
319850b4 223 { "fix-v4bx", no_argument, NULL, OPTION_FIX_V4BX},
33bfe774 224 { "use-blx", no_argument, NULL, OPTION_USE_BLX},
41392f03 225'
252b5132 226
41392f03 227PARSE_AND_LIST_OPTIONS='
41392f03 228 fprintf (file, _(" --thumb-entry=<sym> Set the entry point to be Thumb symbol <sym>\n"));
e489d0ae 229 fprintf (file, _(" --be8 Oputput BE8 format image\n"));
3674e28a
PB
230 fprintf (file, _(" --target1=rel Interpret R_ARM_TARGET1 as R_ARM_REL32\n"));
231 fprintf (file, _(" --target1=abs Interpret R_ARM_TARGET1 as R_ARM_ABS32\n"));
232 fprintf (file, _(" --target2=<type> Specify definition of R_ARM_TARGET2\n"));
319850b4 233 fprintf (file, _(" --fix-v4bx Rewrite BX rn as MOV pc, rn for ARMv4\n"));
33bfe774 234 fprintf (file, _(" --use-blx Enable use of BLX instructions\n"));
41392f03 235'
252b5132 236
41392f03
AM
237PARSE_AND_LIST_ARGS_CASES='
238 case '\'p\'':
dea514f5 239 /* Only here for backwards compatibility. */
41392f03 240 break;
252b5132 241
41392f03
AM
242 case OPTION_THUMB_ENTRY:
243 thumb_entry_symbol = optarg;
244 break;
e489d0ae
PB
245
246 case OPTION_BE8:
247 byteswap_code = 1;
248 break;
9c504268
PB
249
250 case OPTION_TARGET1_REL:
251 target1_is_rel = 1;
252 break;
253
254 case OPTION_TARGET1_ABS:
255 target1_is_rel = 0;
256 break;
3674e28a
PB
257
258 case OPTION_TARGET2:
259 target2_type = optarg;
260 break;
319850b4
JB
261
262 case OPTION_FIX_V4BX:
263 fix_v4bx = 1;
264 break;
33bfe774
JB
265
266 case OPTION_USE_BLX:
267 use_blx = 1;
268 break;
41392f03 269'
252b5132 270
41392f03
AM
271# We have our own after_open and before_allocation functions, but they call
272# the standard routines, so give them a different name.
273LDEMUL_AFTER_OPEN=arm_elf_after_open
274LDEMUL_BEFORE_ALLOCATION=arm_elf_before_allocation
3674e28a 275LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS=arm_elf_create_output_section_statements
252b5132 276
41392f03
AM
277# Replace the elf before_parse function with our own.
278LDEMUL_BEFORE_PARSE=gld"${EMULATION_NAME}"_before_parse
252b5132 279
41392f03 280# Call the extra arm-elf function
a48ca7f2 281LDEMUL_FINISH=arm_elf_finish
This page took 0.271241 seconds and 4 git commands to generate.