Revert: [AArch64] MTE corefile support
[deliverable/binutils-gdb.git] / bfd / simple.c
CommitLineData
af39267e 1/* simple.c -- BFD simple client routines
250d07de 2 Copyright (C) 2002-2021 Free Software Foundation, Inc.
af39267e
DJ
3 Contributed by MontaVista Software, Inc.
4
5 This file is part of BFD, the Binary File Descriptor library.
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
cd123cb7 9 the Free Software Foundation; either version 3 of the License, or
af39267e
DJ
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
cd123cb7
NC
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
af39267e 21
af39267e 22#include "sysdep.h"
3db64b00 23#include "bfd.h"
af39267e
DJ
24#include "libbfd.h"
25#include "bfdlink.h"
26
23182ac0
NC
27static void
28simple_dummy_add_to_set (struct bfd_link_info * info ATTRIBUTE_UNUSED,
29 struct bfd_link_hash_entry *entry ATTRIBUTE_UNUSED,
30 bfd_reloc_code_real_type reloc ATTRIBUTE_UNUSED,
31 bfd *abfd ATTRIBUTE_UNUSED,
32 asection *sec ATTRIBUTE_UNUSED,
33 bfd_vma value ATTRIBUTE_UNUSED)
34{
35}
36
37static void
38simple_dummy_constructor (struct bfd_link_info * info ATTRIBUTE_UNUSED,
39 bool constructor ATTRIBUTE_UNUSED,
40 const char *name ATTRIBUTE_UNUSED,
41 bfd *abfd ATTRIBUTE_UNUSED,
42 asection *sec ATTRIBUTE_UNUSED,
43 bfd_vma value ATTRIBUTE_UNUSED)
44{
45}
46
47static void
48simple_dummy_multiple_common (struct bfd_link_info * info ATTRIBUTE_UNUSED,
49 struct bfd_link_hash_entry * entry ATTRIBUTE_UNUSED,
50 bfd * abfd ATTRIBUTE_UNUSED,
51 enum bfd_link_hash_type type ATTRIBUTE_UNUSED,
52 bfd_vma size ATTRIBUTE_UNUSED)
53{
54}
55
1a72702b 56static void
c58b9523
AM
57simple_dummy_warning (struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
58 const char *warning ATTRIBUTE_UNUSED,
59 const char *symbol ATTRIBUTE_UNUSED,
60 bfd *abfd ATTRIBUTE_UNUSED,
61 asection *section ATTRIBUTE_UNUSED,
62 bfd_vma address ATTRIBUTE_UNUSED)
af39267e 63{
af39267e
DJ
64}
65
1a72702b 66static void
c58b9523
AM
67simple_dummy_undefined_symbol (struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
68 const char *name ATTRIBUTE_UNUSED,
69 bfd *abfd ATTRIBUTE_UNUSED,
70 asection *section ATTRIBUTE_UNUSED,
71 bfd_vma address ATTRIBUTE_UNUSED,
0a1b45a2 72 bool fatal ATTRIBUTE_UNUSED)
af39267e 73{
af39267e
DJ
74}
75
1a72702b 76static void
c58b9523 77simple_dummy_reloc_overflow (struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
dfeffb9f 78 struct bfd_link_hash_entry *entry ATTRIBUTE_UNUSED,
c58b9523
AM
79 const char *name ATTRIBUTE_UNUSED,
80 const char *reloc_name ATTRIBUTE_UNUSED,
81 bfd_vma addend ATTRIBUTE_UNUSED,
82 bfd *abfd ATTRIBUTE_UNUSED,
83 asection *section ATTRIBUTE_UNUSED,
84 bfd_vma address ATTRIBUTE_UNUSED)
af39267e 85{
af39267e
DJ
86}
87
1a72702b 88static void
c58b9523
AM
89simple_dummy_reloc_dangerous (struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
90 const char *message ATTRIBUTE_UNUSED,
91 bfd *abfd ATTRIBUTE_UNUSED,
92 asection *section ATTRIBUTE_UNUSED,
93 bfd_vma address ATTRIBUTE_UNUSED)
af39267e 94{
af39267e
DJ
95}
96
1a72702b 97static void
c58b9523
AM
98simple_dummy_unattached_reloc (struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
99 const char *name ATTRIBUTE_UNUSED,
100 bfd *abfd ATTRIBUTE_UNUSED,
101 asection *section ATTRIBUTE_UNUSED,
102 bfd_vma address ATTRIBUTE_UNUSED)
af39267e 103{
af39267e
DJ
104}
105
1a72702b 106static void
1511ddaf 107simple_dummy_multiple_definition (struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
24f58f47 108 struct bfd_link_hash_entry *h ATTRIBUTE_UNUSED,
1511ddaf
DJ
109 bfd *nbfd ATTRIBUTE_UNUSED,
110 asection *nsec ATTRIBUTE_UNUSED,
111 bfd_vma nval ATTRIBUTE_UNUSED)
112{
1511ddaf
DJ
113}
114
e1fffbe6
AM
115static void
116simple_dummy_einfo (const char *fmt ATTRIBUTE_UNUSED, ...)
117{
118}
119
6e84a906
DJ
120struct saved_output_info
121{
122 bfd_vma offset;
123 asection *section;
124};
125
024a2310
JK
126struct saved_offsets
127{
7292b3ac 128 unsigned int section_count;
024a2310
JK
129 struct saved_output_info *sections;
130};
131
93ee1e36
AM
132/* The sections in ABFD may already have output sections and offsets
133 set if we are here during linking.
134
135 DWARF-2 specifies offsets into debug sections in many cases and
136 bfd_simple_get_relocated_section_contents is called to relocate
137 debug info for a single relocatable object file. So we want
138 offsets relative to that object file's sections, not offsets in the
139 output file. For that reason, reset a debug section->output_offset
140 to zero.
141
142 If not called during linking then set section->output_section to
143 point back to the input section, because output_section must not be
144 NULL when calling the relocation routines.
145
146 Save the original output offset and section to restore later. */
147
6e84a906 148static void
c58b9523
AM
149simple_save_output_info (bfd *abfd ATTRIBUTE_UNUSED,
150 asection *section,
151 void *ptr)
6e84a906 152{
024a2310
JK
153 struct saved_offsets *saved_offsets = (struct saved_offsets *) ptr;
154 struct saved_output_info *output_info;
155
156 output_info = &saved_offsets->sections[section->index];
157 output_info->offset = section->output_offset;
158 output_info->section = section->output_section;
1ba54ee0
AM
159 if ((section->flags & SEC_DEBUGGING) != 0
160 || section->output_section == NULL)
161 {
162 section->output_offset = 0;
163 section->output_section = section;
164 }
6e84a906
DJ
165}
166
167static void
c58b9523
AM
168simple_restore_output_info (bfd *abfd ATTRIBUTE_UNUSED,
169 asection *section,
170 void *ptr)
6e84a906 171{
024a2310
JK
172 struct saved_offsets *saved_offsets = (struct saved_offsets *) ptr;
173 struct saved_output_info *output_info;
174
175 if (section->index >= saved_offsets->section_count)
176 return;
177
178 output_info = &saved_offsets->sections[section->index];
179 section->output_offset = output_info->offset;
180 section->output_section = output_info->section;
6e84a906
DJ
181}
182
af39267e
DJ
183/*
184FUNCTION
185 bfd_simple_relocate_secton
186
187SYNOPSIS
c58b9523
AM
188 bfd_byte *bfd_simple_get_relocated_section_contents
189 (bfd *abfd, asection *sec, bfd_byte *outbuf, asymbol **symbol_table);
af39267e
DJ
190
191DESCRIPTION
6e84a906
DJ
192 Returns the relocated contents of section @var{sec}. The symbols in
193 @var{symbol_table} will be used, or the symbols from @var{abfd} if
1ba54ee0 194 @var{symbol_table} is NULL. The output offsets for debug sections will
6e84a906 195 be temporarily reset to 0. The result will be stored at @var{outbuf}
af39267e
DJ
196 or allocated with @code{bfd_malloc} if @var{outbuf} is @code{NULL}.
197
af39267e
DJ
198 Returns @code{NULL} on a fatal error; ignores errors applying
199 particular relocations.
200*/
201
202bfd_byte *
c58b9523
AM
203bfd_simple_get_relocated_section_contents (bfd *abfd,
204 asection *sec,
205 bfd_byte *outbuf,
206 asymbol **symbol_table)
af39267e
DJ
207{
208 struct bfd_link_info link_info;
209 struct bfd_link_order link_order;
210 struct bfd_link_callbacks callbacks;
211 bfd_byte *contents, *data;
5ed6aba4 212 int storage_needed;
024a2310 213 struct saved_offsets saved_offsets;
d495ab0d 214 bfd *link_next;
af39267e 215
329b43c4
L
216 /* Don't apply relocation on executable and shared library. See
217 PR 4756. */
218 if ((abfd->flags & (HAS_RELOC | EXEC_P | DYNAMIC)) != HAS_RELOC
219 || ! (sec->flags & SEC_RELOC))
ec4530b5 220 {
4a114e3e
L
221 contents = outbuf;
222 if (!bfd_get_full_section_contents (abfd, sec, &contents))
223 return NULL;
57a1784e 224 return contents;
ec4530b5
NC
225 }
226
af39267e
DJ
227 /* In order to use bfd_get_relocated_section_contents, we need
228 to forge some data structures that it expects. */
229
230 /* Fill in the bare minimum number of fields for our purposes. */
231 memset (&link_info, 0, sizeof (link_info));
37da76e8 232 link_info.output_bfd = abfd;
af39267e 233 link_info.input_bfds = abfd;
c72f2fb2 234 link_info.input_bfds_tail = &abfd->link.next;
af39267e 235
d495ab0d
AM
236 link_next = abfd->link.next;
237 abfd->link.next = NULL;
228ce064 238 link_info.hash = _bfd_generic_link_hash_table_create (abfd);
af39267e 239 link_info.callbacks = &callbacks;
23182ac0
NC
240 /* Make sure that any fields not initialised below do not
241 result in a potential indirection via a random address. */
242 memset (&callbacks, 0, sizeof callbacks);
af39267e
DJ
243 callbacks.warning = simple_dummy_warning;
244 callbacks.undefined_symbol = simple_dummy_undefined_symbol;
245 callbacks.reloc_overflow = simple_dummy_reloc_overflow;
246 callbacks.reloc_dangerous = simple_dummy_reloc_dangerous;
247 callbacks.unattached_reloc = simple_dummy_unattached_reloc;
1511ddaf 248 callbacks.multiple_definition = simple_dummy_multiple_definition;
e1fffbe6 249 callbacks.einfo = simple_dummy_einfo;
23182ac0
NC
250 callbacks.multiple_common = simple_dummy_multiple_common;
251 callbacks.constructor = simple_dummy_constructor;
252 callbacks.add_to_set = simple_dummy_add_to_set;
af39267e
DJ
253
254 memset (&link_order, 0, sizeof (link_order));
255 link_order.next = NULL;
256 link_order.type = bfd_indirect_link_order;
257 link_order.offset = 0;
eea6121a 258 link_order.size = sec->size;
af39267e
DJ
259 link_order.u.indirect.section = sec;
260
261 data = NULL;
262 if (outbuf == NULL)
263 {
588f62fc 264 bfd_size_type amt = sec->rawsize > sec->size ? sec->rawsize : sec->size;
a50b1753 265 data = (bfd_byte *) bfd_malloc (amt);
af39267e 266 if (data == NULL)
d495ab0d
AM
267 {
268 _bfd_generic_link_hash_table_free (abfd);
269 abfd->link.next = link_next;
270 return NULL;
271 }
af39267e
DJ
272 outbuf = data;
273 }
af39267e 274
024a2310
JK
275 saved_offsets.section_count = abfd->section_count;
276 saved_offsets.sections = malloc (sizeof (*saved_offsets.sections)
277 * saved_offsets.section_count);
278 if (saved_offsets.sections == NULL)
6e84a906 279 {
c9594989 280 free (data);
d495ab0d
AM
281 _bfd_generic_link_hash_table_free (abfd);
282 abfd->link.next = link_next;
57a1784e 283 return NULL;
6e84a906 284 }
024a2310 285 bfd_map_over_sections (abfd, simple_save_output_info, &saved_offsets);
6e84a906
DJ
286
287 if (symbol_table == NULL)
288 {
c82b20e4 289 _bfd_generic_link_add_symbols (abfd, &link_info);
6e84a906
DJ
290
291 storage_needed = bfd_get_symtab_upper_bound (abfd);
a50b1753 292 symbol_table = (asymbol **) bfd_malloc (storage_needed);
6e84a906
DJ
293 bfd_canonicalize_symtab (abfd, symbol_table);
294 }
295 else
296 storage_needed = 0;
af39267e
DJ
297
298 contents = bfd_get_relocated_section_contents (abfd,
299 &link_info,
300 &link_order,
301 outbuf,
302 0,
303 symbol_table);
c9594989 304 if (contents == NULL)
af39267e
DJ
305 free (data);
306
024a2310
JK
307 bfd_map_over_sections (abfd, simple_restore_output_info, &saved_offsets);
308 free (saved_offsets.sections);
6e84a906 309
d495ab0d
AM
310 _bfd_generic_link_hash_table_free (abfd);
311 abfd->link.next = link_next;
57a1784e 312 return contents;
af39267e 313}
This page took 1.076876 seconds and 4 git commands to generate.