Line 1... |
Line 1... |
/* Object file "section" support for the BFD library.
|
/* Object file "section" support for the BFD library.
|
Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
|
2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
|
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
Written by Cygnus Support.
|
Written by Cygnus Support.
|
|
|
This file is part of BFD, the Binary File Descriptor library.
|
This file is part of BFD, the Binary File Descriptor library.
|
|
|
Line 341... |
Line 341... |
. {* Conditionally link this section; do not link if there are no
|
. {* Conditionally link this section; do not link if there are no
|
. references found to any symbol in the section. This is for TI
|
. references found to any symbol in the section. This is for TI
|
. TMS320C54X only. *}
|
. TMS320C54X only. *}
|
.#define SEC_TIC54X_CLINK 0x20000000
|
.#define SEC_TIC54X_CLINK 0x20000000
|
.
|
.
|
|
. {* Indicate that section has the no read flag set. This happens
|
|
. when memory read flag isn't set. *}
|
|
.#define SEC_COFF_NOREAD 0x40000000
|
|
.
|
. {* End of section flags. *}
|
. {* End of section flags. *}
|
.
|
.
|
. {* Some internal packed boolean fields. *}
|
. {* Some internal packed boolean fields. *}
|
.
|
.
|
. {* See the vma field. *}
|
. {* See the vma field. *}
|
Line 380... |
Line 384... |
. these fields. *}
|
. these fields. *}
|
.
|
.
|
. {* Nonzero if this section has TLS related relocations. *}
|
. {* Nonzero if this section has TLS related relocations. *}
|
. unsigned int has_tls_reloc:1;
|
. unsigned int has_tls_reloc:1;
|
.
|
.
|
|
. {* Nonzero if this section has a call to __tls_get_addr. *}
|
|
. unsigned int has_tls_get_addr_call:1;
|
|
.
|
. {* Nonzero if this section has a gp reloc. *}
|
. {* Nonzero if this section has a gp reloc. *}
|
. unsigned int has_gp_reloc:1;
|
. unsigned int has_gp_reloc:1;
|
.
|
.
|
. {* Nonzero if this section needs the relax finalize pass. *}
|
. {* Nonzero if this section needs the relax finalize pass. *}
|
. unsigned int need_finalize_relax:1;
|
. unsigned int need_finalize_relax:1;
|
Line 419... |
Line 426... |
. targets), and thus the original size needs to be kept to read the
|
. targets), and thus the original size needs to be kept to read the
|
. section multiple times. For output sections, rawsize holds the
|
. section multiple times. For output sections, rawsize holds the
|
. section size calculated on a previous linker relaxation pass. *}
|
. section size calculated on a previous linker relaxation pass. *}
|
. bfd_size_type rawsize;
|
. bfd_size_type rawsize;
|
.
|
.
|
|
. {* Relaxation table. *}
|
|
. struct relax_table *relax;
|
|
.
|
|
. {* Count of used relaxation table entries. *}
|
|
. int relax_count;
|
|
.
|
|
.
|
. {* If this section is going to be output, then this value is the
|
. {* If this section is going to be output, then this value is the
|
. offset in *bytes* into the output section of the first byte in the
|
. offset in *bytes* into the output section of the first byte in the
|
. input section (byte ==> smallest addressable unit on the
|
. input section (byte ==> smallest addressable unit on the
|
. target). In most cases, if this was going to start at the
|
. target). In most cases, if this was going to start at the
|
. 100th octet (8-bit quantity) in the output section, this value
|
. 100th octet (8-bit quantity) in the output section, this value
|
Line 508... |
Line 522... |
. struct bfd_link_order *link_order;
|
. struct bfd_link_order *link_order;
|
. struct bfd_section *s;
|
. struct bfd_section *s;
|
. } map_head, map_tail;
|
. } map_head, map_tail;
|
.} asection;
|
.} asection;
|
.
|
.
|
|
.{* Relax table contains information about instructions which can
|
|
. be removed by relaxation -- replacing a long address with a
|
|
. short address. *}
|
|
.struct relax_table {
|
|
. {* Address where bytes may be deleted. *}
|
|
. bfd_vma addr;
|
|
.
|
|
. {* Number of bytes to be deleted. *}
|
|
. int size;
|
|
.};
|
|
.
|
.{* These sections are global, and are managed by BFD. The application
|
.{* These sections are global, and are managed by BFD. The application
|
. and target back end are not permitted to change the values in
|
. and target back end are not permitted to change the values in
|
. these sections. New code should use the section_ptr macros rather
|
. these sections. New code should use the section_ptr macros rather
|
. than referring directly to the const sections. The const sections
|
. than referring directly to the const sections. The const sections
|
. may eventually vanish. *}
|
. may eventually vanish. *}
|
Line 640... |
Line 665... |
. 0, 0, 1, \
|
. 0, 0, 1, \
|
. \
|
. \
|
. {* segment_mark, sec_info_type, use_rela_p, has_tls_reloc, *} \
|
. {* segment_mark, sec_info_type, use_rela_p, has_tls_reloc, *} \
|
. 0, 0, 0, 0, \
|
. 0, 0, 0, 0, \
|
. \
|
. \
|
. {* has_gp_reloc, need_finalize_relax, reloc_done, *} \
|
. {* has_tls_get_addr_call, has_gp_reloc, need_finalize_relax, *} \
|
. 0, 0, 0, \
|
. 0, 0, 0, \
|
. \
|
. \
|
. {* vma, lma, size, rawsize *} \
|
. {* reloc_done, vma, lma, size, rawsize, relax, relax_count, *} \
|
. 0, 0, 0, 0, \
|
. 0, 0, 0, 0, 0, 0, 0, \
|
. \
|
. \
|
. {* output_offset, output_section, alignment_power, *} \
|
. {* output_offset, output_section, alignment_power, *} \
|
. 0, (struct bfd_section *) &SEC, 0, \
|
. 0, (struct bfd_section *) &SEC, 0, \
|
. \
|
. \
|
. {* relocation, orelocation, reloc_count, filepos, rel_filepos, *} \
|
. {* relocation, orelocation, reloc_count, filepos, rel_filepos, *} \
|
Line 910... |
Line 935... |
int num;
|
int num;
|
unsigned int len;
|
unsigned int len;
|
char *sname;
|
char *sname;
|
|
|
len = strlen (templat);
|
len = strlen (templat);
|
sname = bfd_malloc (len + 8);
|
sname = (char *) bfd_malloc (len + 8);
|
if (sname == NULL)
|
if (sname == NULL)
|
return NULL;
|
return NULL;
|
memcpy (sname, templat, len);
|
memcpy (sname, templat, len);
|
num = 1;
|
num = 1;
|
if (count != NULL)
|
if (count != NULL)
|
Line 1427... |
Line 1452... |
return TRUE;
|
return TRUE;
|
}
|
}
|
|
|
if ((section->flags & SEC_IN_MEMORY) != 0)
|
if ((section->flags & SEC_IN_MEMORY) != 0)
|
{
|
{
|
|
if (section->contents == NULL)
|
|
{
|
|
/* This can happen because of errors earlier on in the linking process.
|
|
We do not want to seg-fault here, so clear the flag and return an
|
|
error code. */
|
|
section->flags &= ~ SEC_IN_MEMORY;
|
|
bfd_set_error (bfd_error_invalid_operation);
|
|
return FALSE;
|
|
}
|
|
|
memcpy (location, section->contents + offset, (size_t) count);
|
memcpy (location, section->contents + offset, (size_t) count);
|
return TRUE;
|
return TRUE;
|
}
|
}
|
|
|
return BFD_SEND (abfd, _bfd_get_section_contents,
|
return BFD_SEND (abfd, _bfd_get_section_contents,
|
Line 1458... |
Line 1493... |
|
|
*buf = p;
|
*buf = p;
|
if (sz == 0)
|
if (sz == 0)
|
return TRUE;
|
return TRUE;
|
|
|
p = bfd_malloc (sec->rawsize > sec->size ? sec->rawsize : sec->size);
|
p = (bfd_byte *)
|
|
bfd_malloc (sec->rawsize > sec->size ? sec->rawsize : sec->size);
|
if (p == NULL)
|
if (p == NULL)
|
return FALSE;
|
return FALSE;
|
*buf = p;
|
*buf = p;
|
|
|
return bfd_get_section_contents (abfd, sec, p, 0, sz);
|
return bfd_get_section_contents (abfd, sec, p, 0, sz);
|