]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - ld/emultempl/armelf.em
* Makefile.in (ALLDEPFILES): Remove sparc-linux-nat.c and
[thirdparty/binutils-gdb.git] / ld / emultempl / armelf.em
CommitLineData
252b5132 1# This shell script emits a C file. -*- C -*-
3bcf5557 2# Copyright 1991, 1993, 1996, 1997, 1998, 1999, 2000, 2002, 2003
41392f03
AM
3# Free Software Foundation, Inc.
4#
5# This file is part of GLD, the Gnu Linker.
6#
7# This program is free software; you can redistribute it and/or modify
8# it under the terms of the GNU General Public License as published by
9# the Free Software Foundation; either version 2 of the License, or
10# (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU General Public License for more details.
16#
17# You should have received a copy of the GNU General Public License
18# along with this program; if not, write to the Free Software
19# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20#
21
22# This file is sourced from elf32.em, and defines extra arm-elf
23# specific routines.
24#
25cat >>e${EMULATION_NAME}.c <<EOF
7ca69e9e 26
88f7bcd5
NC
27static int no_pipeline_knowledge = 0;
28static char *thumb_entry_symbol = NULL;
29static bfd *bfd_for_interwork;
7ca69e9e 30
252b5132 31static void
0c7a8e5a 32gld${EMULATION_NAME}_before_parse (void)
252b5132
RH
33{
34#ifndef TARGET_ /* I.e., if not generic. */
35 ldfile_set_output_arch ("`echo ${ARCH}`");
36#endif /* not TARGET_ */
b34976b6
AM
37 config.dynamic_link = ${DYNAMIC_LINK-TRUE};
38 config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
252b5132
RH
39}
40
1220a729 41static void
0c7a8e5a 42arm_elf_after_open (void)
1220a729 43{
f11523b0 44 if (strstr (bfd_get_target (output_bfd), "arm") == NULL)
1220a729 45 {
f11523b0
NC
46 /* The arm backend needs special fields in the output hash structure.
47 These will only be created if the output format is an arm format,
48 hence we do not support linking and changing output formats at the
49 same time. Use a link followed by objcopy to change output formats. */
50 einfo ("%F%X%P: error: cannot change output format whilst linking ARM binaries\n");
51 return;
1220a729
NC
52 }
53
f11523b0
NC
54 {
55 LANG_FOR_EACH_INPUT_STATEMENT (is)
56 {
8afb0e02 57 bfd_elf32_arm_add_glue_sections_to_bfd (is->the_bfd, & link_info);
f11523b0
NC
58 }
59 }
60
41392f03
AM
61 /* Call the standard elf routine. */
62 gld${EMULATION_NAME}_after_open ();
1220a729
NC
63}
64
8afb0e02 65static void
0c7a8e5a 66arm_elf_set_bfd_for_interworking (lang_statement_union_type *statement)
8afb0e02
NC
67{
68 if (statement->header.type == lang_input_section_enum
b34976b6 69 && !statement->input_section.ifile->just_syms_flag)
8afb0e02 70 {
88f7bcd5
NC
71 asection *i = statement->input_section.section;
72 asection *output_section = i->output_section;
8afb0e02
NC
73
74 ASSERT (output_section->owner == output_bfd);
75
76 if ((output_section->flags & SEC_HAS_CONTENTS) != 0
77 && (i->flags & SEC_NEVER_LOAD) == 0
78 && ! i->owner->output_has_begun)
79 {
80 bfd_for_interwork = i->owner;
b34976b6 81 bfd_for_interwork->output_has_begun = TRUE;
8afb0e02
NC
82 }
83 }
84}
1220a729 85
1220a729 86static void
0c7a8e5a 87arm_elf_before_allocation (void)
1220a729 88{
88f7bcd5 89 bfd *tem;
8afb0e02 90
41392f03
AM
91 /* Call the standard elf routine. */
92 gld${EMULATION_NAME}_before_allocation ();
1220a729 93
2004afbc
NC
94 if (link_info.input_bfds != NULL)
95 {
96 /* The interworking bfd must be the last one in the link. */
97 bfd_for_interwork = NULL;
98 for (tem = link_info.input_bfds; tem != NULL; tem = tem->link_next)
b34976b6 99 tem->output_has_begun = FALSE;
252b5132 100
2004afbc 101 lang_for_each_statement (arm_elf_set_bfd_for_interworking);
2004afbc 102 for (tem = link_info.input_bfds; tem != NULL; tem = tem->link_next)
b34976b6 103 tem->output_has_begun = FALSE;
8afb0e02 104
06aa7234
NC
105 /* If bfd_for_interwork is NULL, then there are no loadable sections
106 with real contents to be linked, so we are not going to have to
107 create any interworking stubs, so it is OK not to call
108 bfd_elf32_arm_get_bfd_for_interworking. */
109 if (bfd_for_interwork != NULL)
110 bfd_elf32_arm_get_bfd_for_interworking (bfd_for_interwork, &link_info);
2004afbc 111 }
8afb0e02
NC
112 /* We should be able to set the size of the interworking stub section. */
113
114 /* Here we rummage through the found bfds to collect glue information. */
115 /* FIXME: should this be based on a command line option? krk@cygnus.com */
252b5132
RH
116 {
117 LANG_FOR_EACH_INPUT_STATEMENT (is)
118 {
7ca69e9e
NC
119 if (!bfd_elf32_arm_process_before_allocation (is->the_bfd, & link_info,
120 no_pipeline_knowledge))
252b5132
RH
121 {
122 /* xgettext:c-format */
123 einfo (_("Errors encountered processing file %s"), is->filename);
124 }
125 }
126 }
127
8afb0e02 128 /* We have seen it all. Allocate it, and carry on. */
252b5132
RH
129 bfd_elf32_arm_allocate_interworking_sections (& link_info);
130}
131
6f798e5c 132static void
0c7a8e5a 133arm_elf_finish (void)
6f798e5c
NC
134{
135 struct bfd_link_hash_entry * h;
136
c56feb2b
AM
137 /* Call the elf32.em routine. */
138 gld${EMULATION_NAME}_finish ();
139
88f7bcd5
NC
140 if (thumb_entry_symbol == NULL)
141 return;
0c7a8e5a 142
88f7bcd5 143 h = bfd_link_hash_lookup (link_info.hash, thumb_entry_symbol,
b34976b6 144 FALSE, FALSE, TRUE);
6f798e5c
NC
145
146 if (h != (struct bfd_link_hash_entry *) NULL
147 && (h->type == bfd_link_hash_defined
148 || h->type == bfd_link_hash_defweak)
149 && h->u.def.section->output_section != NULL)
150 {
151 static char buffer[32];
88f7bcd5 152 bfd_vma val;
0c7a8e5a 153
88f7bcd5
NC
154 /* Special procesing is required for a Thumb entry symbol. The
155 bottom bit of its address must be set. */
156 val = (h->u.def.value
157 + bfd_get_section_vma (output_bfd,
158 h->u.def.section->output_section)
159 + h->u.def.section->output_offset);
0c7a8e5a 160
88f7bcd5 161 val |= 1;
6f798e5c 162
88f7bcd5 163 /* Now convert this value into a string and store it in entry_symbol
0c7a8e5a 164 where the lang_finish() function will pick it up. */
88f7bcd5
NC
165 buffer[0] = '0';
166 buffer[1] = 'x';
0c7a8e5a 167
88f7bcd5 168 sprintf_vma (buffer + 2, val);
6f798e5c 169
88f7bcd5
NC
170 if (entry_symbol.name != NULL && entry_from_cmdline)
171 einfo (_("%P: warning: '--thumb-entry %s' is overriding '-e %s'\n"),
172 thumb_entry_symbol, entry_symbol.name);
173 entry_symbol.name = buffer;
6f798e5c 174 }
88f7bcd5
NC
175 else
176 einfo (_("%P: warning: connot find thumb start symbol %s\n"),
177 thumb_entry_symbol);
6f798e5c
NC
178}
179
252b5132
RH
180EOF
181
41392f03
AM
182# Define some shell vars to insert bits of code into the standard elf
183# parse_args and list_options functions.
184#
185PARSE_AND_LIST_PROLOGUE='
186#define OPTION_THUMB_ENTRY 301
187'
252b5132 188
ef5bdbd1 189PARSE_AND_LIST_SHORTOPTS=p
252b5132 190
41392f03
AM
191PARSE_AND_LIST_LONGOPTS='
192 { "no-pipeline-knowledge", no_argument, NULL, '\'p\''},
193 { "thumb-entry", required_argument, NULL, OPTION_THUMB_ENTRY},
194'
252b5132 195
41392f03
AM
196PARSE_AND_LIST_OPTIONS='
197 fprintf (file, _(" -p --no-pipeline-knowledge Stop the linker knowing about the pipeline length\n"));
198 fprintf (file, _(" --thumb-entry=<sym> Set the entry point to be Thumb symbol <sym>\n"));
199'
252b5132 200
41392f03
AM
201PARSE_AND_LIST_ARGS_CASES='
202 case '\'p\'':
203 no_pipeline_knowledge = 1;
204 break;
252b5132 205
41392f03
AM
206 case OPTION_THUMB_ENTRY:
207 thumb_entry_symbol = optarg;
208 break;
209'
252b5132 210
41392f03
AM
211# We have our own after_open and before_allocation functions, but they call
212# the standard routines, so give them a different name.
213LDEMUL_AFTER_OPEN=arm_elf_after_open
214LDEMUL_BEFORE_ALLOCATION=arm_elf_before_allocation
252b5132 215
41392f03
AM
216# Replace the elf before_parse function with our own.
217LDEMUL_BEFORE_PARSE=gld"${EMULATION_NAME}"_before_parse
252b5132 218
41392f03 219# Call the extra arm-elf function
a48ca7f2 220LDEMUL_FINISH=arm_elf_finish