OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-stable/] [binutils-2.20.1/] [bfd/] [simple.c] - Blame information for rev 861

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 205 julius
/* simple.c -- BFD simple client routines
2
   Copyright 2002, 2003, 2004, 2005, 2007, 2008, 2009
3
   Free Software Foundation, Inc.
4
   Contributed by MontaVista Software, Inc.
5
 
6
   This file is part of BFD, the Binary File Descriptor library.
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 3 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., 51 Franklin Street - Fifth Floor, Boston,
21
   MA 02110-1301, USA.  */
22
 
23
#include "sysdep.h"
24
#include "bfd.h"
25
#include "libbfd.h"
26
#include "bfdlink.h"
27
 
28
static bfd_boolean
29
simple_dummy_warning (struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
30
                      const char *warning ATTRIBUTE_UNUSED,
31
                      const char *symbol ATTRIBUTE_UNUSED,
32
                      bfd *abfd ATTRIBUTE_UNUSED,
33
                      asection *section ATTRIBUTE_UNUSED,
34
                      bfd_vma address ATTRIBUTE_UNUSED)
35
{
36
  return TRUE;
37
}
38
 
39
static bfd_boolean
40
simple_dummy_undefined_symbol (struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
41
                               const char *name ATTRIBUTE_UNUSED,
42
                               bfd *abfd ATTRIBUTE_UNUSED,
43
                               asection *section ATTRIBUTE_UNUSED,
44
                               bfd_vma address ATTRIBUTE_UNUSED,
45
                               bfd_boolean fatal ATTRIBUTE_UNUSED)
46
{
47
  return TRUE;
48
}
49
 
50
static bfd_boolean
51
simple_dummy_reloc_overflow (struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
52
                             struct bfd_link_hash_entry *entry ATTRIBUTE_UNUSED,
53
                             const char *name ATTRIBUTE_UNUSED,
54
                             const char *reloc_name ATTRIBUTE_UNUSED,
55
                             bfd_vma addend ATTRIBUTE_UNUSED,
56
                             bfd *abfd ATTRIBUTE_UNUSED,
57
                             asection *section ATTRIBUTE_UNUSED,
58
                             bfd_vma address ATTRIBUTE_UNUSED)
59
{
60
  return TRUE;
61
}
62
 
63
static bfd_boolean
64
simple_dummy_reloc_dangerous (struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
65
                              const char *message ATTRIBUTE_UNUSED,
66
                              bfd *abfd ATTRIBUTE_UNUSED,
67
                              asection *section ATTRIBUTE_UNUSED,
68
                              bfd_vma address ATTRIBUTE_UNUSED)
69
{
70
  return TRUE;
71
}
72
 
73
static bfd_boolean
74
simple_dummy_unattached_reloc (struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
75
                               const char *name ATTRIBUTE_UNUSED,
76
                               bfd *abfd ATTRIBUTE_UNUSED,
77
                               asection *section ATTRIBUTE_UNUSED,
78
                               bfd_vma address ATTRIBUTE_UNUSED)
79
{
80
  return TRUE;
81
}
82
 
83
static bfd_boolean
84
simple_dummy_multiple_definition (struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
85
                                  const char *name ATTRIBUTE_UNUSED,
86
                                  bfd *obfd ATTRIBUTE_UNUSED,
87
                                  asection *osec ATTRIBUTE_UNUSED,
88
                                  bfd_vma oval ATTRIBUTE_UNUSED,
89
                                  bfd *nbfd ATTRIBUTE_UNUSED,
90
                                  asection *nsec ATTRIBUTE_UNUSED,
91
                                  bfd_vma nval ATTRIBUTE_UNUSED)
92
{
93
  return TRUE;
94
}
95
 
96
static void
97
simple_dummy_einfo (const char *fmt ATTRIBUTE_UNUSED, ...)
98
{
99
}
100
 
101
struct saved_output_info
102
{
103
  bfd_vma offset;
104
  asection *section;
105
};
106
 
107
static void
108
simple_save_output_info (bfd *abfd ATTRIBUTE_UNUSED,
109
                         asection *section,
110
                         void *ptr)
111
{
112
  struct saved_output_info *output_info = (struct saved_output_info *) ptr;
113
  output_info[section->index].offset = section->output_offset;
114
  output_info[section->index].section = section->output_section;
115
  if ((section->flags & SEC_DEBUGGING) != 0
116
      || section->output_section == NULL)
117
    {
118
      section->output_offset = 0;
119
      section->output_section = section;
120
    }
121
}
122
 
123
static void
124
simple_restore_output_info (bfd *abfd ATTRIBUTE_UNUSED,
125
                            asection *section,
126
                            void *ptr)
127
{
128
  struct saved_output_info *output_info = (struct saved_output_info *) ptr;
129
  section->output_offset = output_info[section->index].offset;
130
  section->output_section = output_info[section->index].section;
131
}
132
 
133
/*
134
FUNCTION
135
        bfd_simple_relocate_secton
136
 
137
SYNOPSIS
138
        bfd_byte *bfd_simple_get_relocated_section_contents
139
          (bfd *abfd, asection *sec, bfd_byte *outbuf, asymbol **symbol_table);
140
 
141
DESCRIPTION
142
        Returns the relocated contents of section @var{sec}.  The symbols in
143
        @var{symbol_table} will be used, or the symbols from @var{abfd} if
144
        @var{symbol_table} is NULL.  The output offsets for debug sections will
145
        be temporarily reset to 0.  The result will be stored at @var{outbuf}
146
        or allocated with @code{bfd_malloc} if @var{outbuf} is @code{NULL}.
147
 
148
        Returns @code{NULL} on a fatal error; ignores errors applying
149
        particular relocations.
150
*/
151
 
152
bfd_byte *
153
bfd_simple_get_relocated_section_contents (bfd *abfd,
154
                                           asection *sec,
155
                                           bfd_byte *outbuf,
156
                                           asymbol **symbol_table)
157
{
158
  struct bfd_link_info link_info;
159
  struct bfd_link_order link_order;
160
  struct bfd_link_callbacks callbacks;
161
  bfd_byte *contents, *data;
162
  int storage_needed;
163
  void *saved_offsets;
164
 
165
  /* Don't apply relocation on executable and shared library.  See
166
     PR 4756.  */
167
  if ((abfd->flags & (HAS_RELOC | EXEC_P | DYNAMIC)) != HAS_RELOC
168
      || ! (sec->flags & SEC_RELOC))
169
    {
170
      bfd_size_type amt = sec->rawsize > sec->size ? sec->rawsize : sec->size;
171
      bfd_size_type size = sec->rawsize ? sec->rawsize : sec->size;
172
 
173
      if (outbuf == NULL)
174
        contents = (bfd_byte *) bfd_malloc (amt);
175
      else
176
        contents = outbuf;
177
 
178
      if (contents)
179
        bfd_get_section_contents (abfd, sec, contents, 0, size);
180
 
181
      return contents;
182
    }
183
 
184
  /* In order to use bfd_get_relocated_section_contents, we need
185
     to forge some data structures that it expects.  */
186
 
187
  /* Fill in the bare minimum number of fields for our purposes.  */
188
  memset (&link_info, 0, sizeof (link_info));
189
  link_info.output_bfd = abfd;
190
  link_info.input_bfds = abfd;
191
  link_info.input_bfds_tail = &abfd->link_next;
192
 
193
  link_info.hash = _bfd_generic_link_hash_table_create (abfd);
194
  link_info.callbacks = &callbacks;
195
  callbacks.warning = simple_dummy_warning;
196
  callbacks.undefined_symbol = simple_dummy_undefined_symbol;
197
  callbacks.reloc_overflow = simple_dummy_reloc_overflow;
198
  callbacks.reloc_dangerous = simple_dummy_reloc_dangerous;
199
  callbacks.unattached_reloc = simple_dummy_unattached_reloc;
200
  callbacks.multiple_definition = simple_dummy_multiple_definition;
201
  callbacks.einfo = simple_dummy_einfo;
202
 
203
  memset (&link_order, 0, sizeof (link_order));
204
  link_order.next = NULL;
205
  link_order.type = bfd_indirect_link_order;
206
  link_order.offset = 0;
207
  link_order.size = sec->size;
208
  link_order.u.indirect.section = sec;
209
 
210
  data = NULL;
211
  if (outbuf == NULL)
212
    {
213
      bfd_size_type amt = sec->rawsize > sec->size ? sec->rawsize : sec->size;
214
      data = (bfd_byte *) bfd_malloc (amt);
215
      if (data == NULL)
216
        return NULL;
217
      outbuf = data;
218
    }
219
 
220
  /* The sections in ABFD may already have output sections and offsets set.
221
     Because this function is primarily for debug sections, and GCC uses the
222
     knowledge that debug sections will generally have VMA 0 when emitting
223
     relocations between DWARF-2 sections (which are supposed to be
224
     section-relative offsets anyway), we need to reset the output offsets
225
     to zero.  We also need to arrange for section->output_section->vma plus
226
     section->output_offset to equal section->vma, which we do by setting
227
     section->output_section to point back to section.  Save the original
228
     output offset and output section to restore later.  */
229
  saved_offsets = malloc (sizeof (struct saved_output_info)
230
                          * abfd->section_count);
231
  if (saved_offsets == NULL)
232
    {
233
      if (data)
234
        free (data);
235
      return NULL;
236
    }
237
  bfd_map_over_sections (abfd, simple_save_output_info, saved_offsets);
238
 
239
  if (symbol_table == NULL)
240
    {
241
      _bfd_generic_link_add_symbols (abfd, &link_info);
242
 
243
      storage_needed = bfd_get_symtab_upper_bound (abfd);
244
      symbol_table = (asymbol **) bfd_malloc (storage_needed);
245
      bfd_canonicalize_symtab (abfd, symbol_table);
246
    }
247
  else
248
    storage_needed = 0;
249
 
250
  contents = bfd_get_relocated_section_contents (abfd,
251
                                                 &link_info,
252
                                                 &link_order,
253
                                                 outbuf,
254
                                                 0,
255
                                                 symbol_table);
256
  if (contents == NULL && data != NULL)
257
    free (data);
258
 
259
  bfd_map_over_sections (abfd, simple_restore_output_info, saved_offsets);
260
  free (saved_offsets);
261
 
262
  _bfd_generic_link_hash_table_free (link_info.hash);
263
  return contents;
264
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.