mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-27 03:51:15 +08:00
6590a8c953
* aout-target.h: add to vector, call generic_relax * bfd-in.h: add to vector * bfd.c: add #define for vector * bout.c: add to vector, call generic_relax * coffcode.h: add to vector, also now has coff specific relax code for the relaxable H8/300 relocs. Also clean up abs section cruft. * elf.c: call generic_relax * ieee.c: call new vector, clean up some bugs due to the creation of bfd_abs_section * libbfd.h: add bfd_generic_relax_section EXFUN * oasys.c: call generic_relax * reloc.c: implement generic_relax * seclet.c: moved much of this into coffcode.h * srec.c: call generic_relax * targets.c: define new transfer vector
130 lines
2.5 KiB
C
130 lines
2.5 KiB
C
/* This module is part of BFD */
|
|
|
|
|
|
/* The intention is that one day, all the code which uses sections
|
|
will change and use seclets instead - maybe seglet would have been
|
|
a better name..
|
|
|
|
Anyway, a seclet contains enough info to be able to describe an
|
|
area of output memory in one go.
|
|
|
|
The only description so far catered for is that of the
|
|
<<bfd_indirect_seclet>>, which is a select which points to a
|
|
<<section>> and the <<asymbols>> associated with the section, so
|
|
that relocation can be done when needed.
|
|
|
|
One day there will be more types - they will at least migrate from
|
|
the linker's data structures - also there could be extra stuff,
|
|
like a bss seclet, which descibes a lump of memory as containing
|
|
zeros compactly, without the horrible SEC_* flag cruft.
|
|
|
|
|
|
*/
|
|
|
|
#include "bfd.h"
|
|
#include "sysdep.h"
|
|
#include "libbfd.h"
|
|
#include "seclet.h"
|
|
#include "coff/internal.h"
|
|
bfd_seclet_type *
|
|
DEFUN(bfd_new_seclet,(abfd, section),
|
|
bfd *abfd AND
|
|
asection *section)
|
|
{
|
|
bfd_seclet_type *n = (bfd_seclet_type *)bfd_alloc(abfd, sizeof(bfd_seclet_type));
|
|
if (section->seclets_tail != (bfd_seclet_type *)NULL) {
|
|
section->seclets_tail->next = n;
|
|
}
|
|
else
|
|
{
|
|
section->seclets_head = n;
|
|
}
|
|
section->seclets_tail = n;
|
|
|
|
return n;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#define MAX_ERRORS_IN_A_ROW 10
|
|
extern bfd_error_vector_type bfd_error_vector;
|
|
|
|
|
|
void
|
|
DEFUN(rel,(abfd, seclet, output_section),
|
|
bfd *abfd AND
|
|
bfd_seclet_type *seclet AND
|
|
asection *output_section)
|
|
{
|
|
bfd_byte *data;
|
|
if (output_section->flags & SEC_HAS_CONTENTS )
|
|
{
|
|
|
|
data = bfd_get_relocated_section_contents(abfd, seclet);
|
|
|
|
if(bfd_set_section_contents(abfd,
|
|
output_section,
|
|
data,
|
|
seclet->offset,
|
|
seclet->size) == false)
|
|
{
|
|
abort();
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
void
|
|
DEFUN(seclet_dump_seclet,(abfd, seclet, section),
|
|
bfd *abfd AND
|
|
bfd_seclet_type *seclet AND
|
|
asection *section)
|
|
{
|
|
switch (seclet->type)
|
|
{
|
|
|
|
case bfd_indirect_seclet:
|
|
/* The contents of this section come from another one somewhere
|
|
else */
|
|
rel(abfd, seclet, section);
|
|
|
|
|
|
break;
|
|
|
|
default:
|
|
abort();
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
void
|
|
DEFUN(seclet_dump,(abfd),
|
|
bfd *abfd)
|
|
{
|
|
/* Write all the seclets on the bfd out, relocate etc according to the
|
|
rules */
|
|
|
|
asection *o = abfd->sections;
|
|
while (o != (asection *)NULL)
|
|
{
|
|
bfd_seclet_type *p = o->seclets_head;
|
|
while (p != (bfd_seclet_type *)NULL)
|
|
{
|
|
seclet_dump_seclet(abfd, p, o);
|
|
p = p ->next;
|
|
}
|
|
|
|
o = o->next;
|
|
}
|
|
|
|
}
|