OpenCores
URL https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk

Subversion Repositories openrisc_2011-10-31

[/] [openrisc/] [trunk/] [gnu-src/] [binutils-2.18.50/] [bfd/] [simple.c] - Blame information for rev 278

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

Line No. Rev Author Line
1 38 julius
/* simple.c -- BFD simple client routines
2
   Copyright 2002, 2003, 2004, 2005, 2007, 2008
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 = 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 = 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_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
      data = bfd_malloc (sec->size);
214
      if (data == NULL)
215
        return NULL;
216
      outbuf = data;
217
    }
218
 
219
  /* The sections in ABFD may already have output sections and offsets set.
220
     Because this function is primarily for debug sections, and GCC uses the
221
     knowledge that debug sections will generally have VMA 0 when emitting
222
     relocations between DWARF-2 sections (which are supposed to be
223
     section-relative offsets anyway), we need to reset the output offsets
224
     to zero.  We also need to arrange for section->output_section->vma plus
225
     section->output_offset to equal section->vma, which we do by setting
226
     section->output_section to point back to section.  Save the original
227
     output offset and output section to restore later.  */
228
  saved_offsets = malloc (sizeof (struct saved_output_info)
229
                          * abfd->section_count);
230
  if (saved_offsets == NULL)
231
    {
232
      if (data)
233
        free (data);
234
      return NULL;
235
    }
236
  bfd_map_over_sections (abfd, simple_save_output_info, saved_offsets);
237
 
238
  if (symbol_table == NULL)
239
    {
240
      _bfd_generic_link_add_symbols (abfd, &link_info);
241
 
242
      storage_needed = bfd_get_symtab_upper_bound (abfd);
243
      symbol_table = bfd_malloc (storage_needed);
244
      bfd_canonicalize_symtab (abfd, symbol_table);
245
    }
246
  else
247
    storage_needed = 0;
248
 
249
  contents = bfd_get_relocated_section_contents (abfd,
250
                                                 &link_info,
251
                                                 &link_order,
252
                                                 outbuf,
253
                                                 0,
254
                                                 symbol_table);
255
  if (contents == NULL && data != NULL)
256
    free (data);
257
 
258
  bfd_map_over_sections (abfd, simple_restore_output_info, saved_offsets);
259
  free (saved_offsets);
260
 
261
  _bfd_generic_link_hash_table_free (link_info.hash);
262
  return contents;
263
}

powered by: WebSVN 2.1.0

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