* elf-bfd.h (enum elf_link_info_type): Remove.
	(struct bfd_elf_section_data): Move sec_info_type, use_rela_p fields
	to struct sec.  Remove linkonce_p field.
	(elf_linkonce_p): Delete.
	(elf_discarded_section): Update for sec_info_type change.
	* section.c (struct sec): Add sec_info_type, use_rela_p, has_tls_reloc,
	flag11, flag12, flag13, flag14, flag15, flag16, flag20, flag24.
	(ELF_INFO_TYPE_NONE): Define.
	(ELF_INFO_TYPE_STABS): Define.
	(ELF_INFO_TYPE_MERGE): Define.
	(ELF_INFO_TYPE_EH_FRAME): Define.
	(ELF_INFO_TYPE_JUST_SYMS): Define.
	(STD_SECTION): Update struct sec initializer.
	* ecoff.c (bfd_debug_section): Likewise.
	* elf.c: Likewise.  Update occurrences of sec_info_type and use_rela_p.
	* elflink.h: Likewise.
	* elf-eh-frame.c: Likewise.
	* elf64-alpha.c: Likewise.
	* elfxx-ia64.c: Likewise.
	* elfxx-mips.c: Likewise.
	* bfd-in2.h: Regenerate.

	* elf32-sparc.c (sec_do_relax): Use elf_section_data macro rather than
	referring to used_by_bfd.
	* elf64-sparc.c (sec_do_relax): Likewise.
	* elf64-mmix.c (mmix_elf_section_data): Likewise.
	* elfxx-mips.c (mips_elf_section_data): Likewise.
	* ieee.c (ieee_slurp_section_data): Use ieee_per_section macro.
	(ieee_get_section_contents): Likewise.
	(ieee_new_section_hook): Formatting.
	(ieee_canonicalize_reloc): Remove commented out code.
	* mmo.c (mmo_section_data): Define.  Use throughout file.
	* oasys.c (oasys_get_section_contents): Use oasys_per_section macro.

gas
	* config/obj-elf.c (obj_elf_change_section): Set SEC_LINK_ONCE and
	SEC_LINK_DUPLICATES_DISCARD directly rather than using elf_linkonce_p.
This commit is contained in:
Alan Modra 2003-02-04 12:34:08 +00:00
parent f8bd30003a
commit 68bfbfcc5a
19 changed files with 174 additions and 114 deletions

View File

@ -1,3 +1,39 @@
2003-02-04 Alan Modra <amodra@bigpond.net.au>
* elf-bfd.h (enum elf_link_info_type): Remove.
(struct bfd_elf_section_data): Move sec_info_type, use_rela_p fields
to struct sec. Remove linkonce_p field.
(elf_linkonce_p): Delete.
(elf_discarded_section): Update for sec_info_type change.
* section.c (struct sec): Add sec_info_type, use_rela_p, has_tls_reloc,
flag11, flag12, flag13, flag14, flag15, flag16, flag20, flag24.
(ELF_INFO_TYPE_NONE): Define.
(ELF_INFO_TYPE_STABS): Define.
(ELF_INFO_TYPE_MERGE): Define.
(ELF_INFO_TYPE_EH_FRAME): Define.
(ELF_INFO_TYPE_JUST_SYMS): Define.
(STD_SECTION): Update struct sec initializer.
* ecoff.c (bfd_debug_section): Likewise.
* elf.c: Likewise. Update occurrences of sec_info_type and use_rela_p.
* elflink.h: Likewise.
* elf-eh-frame.c: Likewise.
* elf64-alpha.c: Likewise.
* elfxx-ia64.c: Likewise.
* elfxx-mips.c: Likewise.
* bfd-in2.h: Regenerate.
* elf32-sparc.c (sec_do_relax): Use elf_section_data macro rather than
referring to used_by_bfd.
* elf64-sparc.c (sec_do_relax): Likewise.
* elf64-mmix.c (mmix_elf_section_data): Likewise.
* elfxx-mips.c (mips_elf_section_data): Likewise.
* ieee.c (ieee_slurp_section_data): Use ieee_per_section macro.
(ieee_get_section_contents): Likewise.
(ieee_new_section_hook): Formatting.
(ieee_canonicalize_reloc): Remove commented out code.
* mmo.c (mmo_section_data): Define. Use throughout file.
* oasys.c (oasys_get_section_contents): Use oasys_per_section macro.
2003-01-31 Graydon Hoare <graydon@redhat.com>
* Makefile.am (opncls.lo): Add dependency upon libiberty.h.

View File

@ -1261,10 +1261,35 @@ typedef struct sec
/* A mark flag used by some linker backends for garbage collection. */
unsigned int gc_mark : 1;
/* Used by the ELF code to mark sections which have been allocated
to segments. */
/* The following flags are used by the ELF linker. */
/* Mark sections which have been allocated to segments. */
unsigned int segment_mark : 1;
/* Type of sec_info information. */
unsigned int sec_info_type:3;
#define ELF_INFO_TYPE_NONE 0
#define ELF_INFO_TYPE_STABS 1
#define ELF_INFO_TYPE_MERGE 2
#define ELF_INFO_TYPE_EH_FRAME 3
#define ELF_INFO_TYPE_JUST_SYMS 4
/* Nonzero if this section uses RELA relocations, rather than REL. */
unsigned int use_rela_p:1;
/* Bits used by various backends. */
unsigned int has_tls_reloc:1;
/* Usused bits. */
unsigned int flag11:1;
unsigned int flag12:1;
unsigned int flag13:1;
unsigned int flag14:1;
unsigned int flag15:1;
unsigned int flag16:4;
unsigned int flag20:4;
unsigned int flag24:8;
/* End of internal packed boolean fields. */
/* The virtual memory address of the section - where it will be

View File

@ -1,6 +1,6 @@
/* Generic ECOFF (Extended-COFF) routines.
Copyright 1990, 1991, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002
Free Software Foundation, Inc.
Copyright 1990, 1991, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
2002, 2003 Free Software Foundation, Inc.
Original version by Per Bothner.
Full support added by Ian Lance Taylor, ian@cygnus.com.
@ -81,6 +81,10 @@ static asection bfd_debug_section =
"*DEBUG*", 0, 0, NULL, 0, 0, 0,
/* linker_mark, linker_has_input, gc_mark, segment_mark, */
0, 0, 0, 0,
/* sec_info_type, use_rela_p, has_tls_reloc, flag11, flag12, */
0, 0, 0, 0, 0,
/* flag13, flag14, flag15, flag16, flag20, flag24, */
0, 0, 0, 0, 0, 0,
/* vma, lma, _cooked_size, _raw_size, */
0, 0, 0, 0,
/* output_offset, output_section, alignment_power, */

View File

@ -229,16 +229,6 @@ struct elf_link_loaded_list
bfd *abfd;
};
enum elf_link_info_type
{
ELF_INFO_TYPE_NONE,
ELF_INFO_TYPE_STABS,
ELF_INFO_TYPE_MERGE,
ELF_INFO_TYPE_EH_FRAME,
ELF_INFO_TYPE_JUST_SYMS,
ELF_INFO_TYPE_LAST
};
/* Structures used by the eh_frame optimization code. */
struct cie_header
{
@ -989,29 +979,19 @@ struct bfd_elf_section_data
/* A pointer used for various section optimizations. */
PTR sec_info;
/* Type of sec_info information. */
enum elf_link_info_type sec_info_type;
/* Nonzero if this section uses RELA relocations, rather than REL. */
unsigned int use_rela_p:1;
/* Nonzero when a group is COMDAT. */
unsigned int linkonce_p:1;
};
#define elf_section_data(sec) ((struct bfd_elf_section_data*)sec->used_by_bfd)
#define elf_group_name(sec) (elf_section_data(sec)->group.name)
#define elf_group_id(sec) (elf_section_data(sec)->group.id)
#define elf_next_in_group(sec) (elf_section_data(sec)->next_in_group)
#define elf_linkonce_p(sec) (elf_section_data(sec)->linkonce_p)
/* Return TRUE if section has been discarded. */
#define elf_discarded_section(sec) \
(!bfd_is_abs_section(sec) \
&& bfd_is_abs_section((sec)->output_section) \
&& elf_section_data (sec)->sec_info_type != ELF_INFO_TYPE_MERGE \
&& elf_section_data (sec)->sec_info_type != ELF_INFO_TYPE_JUST_SYMS)
#define elf_discarded_section(sec) \
(!bfd_is_abs_section (sec) \
&& bfd_is_abs_section ((sec)->output_section) \
&& sec->sec_info_type != ELF_INFO_TYPE_MERGE \
&& sec->sec_info_type != ELF_INFO_TYPE_JUST_SYMS)
#define get_elf_backend_data(abfd) \
((struct elf_backend_data *) (abfd)->xvec->backend_data)

View File

@ -1,5 +1,5 @@
/* .eh_frame section optimization.
Copyright 2001, 2002 Free Software Foundation, Inc.
Copyright 2001, 2002, 2003 Free Software Foundation, Inc.
Written by Jakub Jelinek <jakub@redhat.com>.
This file is part of BFD, the Binary File Descriptor library.
@ -605,7 +605,7 @@ _bfd_elf_discard_section_eh_frame (abfd, info, sec,
}
elf_section_data (sec)->sec_info = sec_info;
elf_section_data (sec)->sec_info_type = ELF_INFO_TYPE_EH_FRAME;
sec->sec_info_type = ELF_INFO_TYPE_EH_FRAME;
/* Ok, now we can assign new offsets. */
offset = 0;
@ -758,7 +758,7 @@ _bfd_elf_eh_frame_section_offset (output_bfd, sec, offset)
struct eh_frame_sec_info *sec_info;
unsigned int lo, hi, mid;
if (elf_section_data (sec)->sec_info_type != ELF_INFO_TYPE_EH_FRAME)
if (sec->sec_info_type != ELF_INFO_TYPE_EH_FRAME)
return offset;
sec_info = (struct eh_frame_sec_info *)
elf_section_data (sec)->sec_info;
@ -828,7 +828,7 @@ _bfd_elf_write_section_eh_frame (abfd, info, sec, contents)
ptr_size = (elf_elfheader (sec->owner)->e_ident[EI_CLASS]
== ELFCLASS64) ? 8 : 4;
if (elf_section_data (sec)->sec_info_type != ELF_INFO_TYPE_EH_FRAME)
if (sec->sec_info_type != ELF_INFO_TYPE_EH_FRAME)
return bfd_set_section_contents (abfd, sec->output_section,
contents,
(file_ptr) sec->output_offset,

View File

@ -969,11 +969,8 @@ merge_sections_remove_hook (abfd, sec)
bfd *abfd ATTRIBUTE_UNUSED;
asection *sec;
{
struct bfd_elf_section_data *sec_data;
sec_data = elf_section_data (sec);
BFD_ASSERT (sec_data->sec_info_type == ELF_INFO_TYPE_MERGE);
sec_data->sec_info_type = ELF_INFO_TYPE_NONE;
BFD_ASSERT (sec->sec_info_type == ELF_INFO_TYPE_MERGE);
sec->sec_info_type = ELF_INFO_TYPE_NONE;
}
/* Finish SHF_MERGE section merging. */
@ -1001,7 +998,7 @@ _bfd_elf_link_just_syms (sec, info)
if (!is_elf_hash_table (info))
return;
elf_section_data (sec)->sec_info_type = ELF_INFO_TYPE_JUST_SYMS;
sec->sec_info_type = ELF_INFO_TYPE_JUST_SYMS;
}
/* Copy the program header and other data from one object module to
@ -2007,8 +2004,7 @@ bfd_section_from_shdr (abfd, shindex)
/* In the section to which the relocations apply, mark whether
its relocations are of the REL or RELA variety. */
if (hdr->sh_size != 0)
elf_section_data (target_sect)->use_rela_p
= (hdr->sh_type == SHT_RELA);
target_sect->use_rela_p = hdr->sh_type == SHT_RELA;
abfd->flags |= HAS_RELOC;
return TRUE;
}
@ -2148,8 +2144,7 @@ _bfd_elf_new_section_hook (abfd, sec)
}
/* Indicate whether or not this section should use RELA relocations. */
sdata->use_rela_p
= get_elf_backend_data (abfd)->default_use_rela_p;
sec->use_rela_p = get_elf_backend_data (abfd)->default_use_rela_p;
return TRUE;
}
@ -2507,7 +2502,7 @@ elf_fake_sections (abfd, asect, failedptrarg)
&& !_bfd_elf_init_reloc_shdr (abfd,
&elf_section_data (asect)->rel_hdr,
asect,
elf_section_data (asect)->use_rela_p))
asect->use_rela_p))
*failedptr = TRUE;
}
@ -5190,8 +5185,7 @@ _bfd_elf_copy_private_section_data (ibfd, isec, obfd, osec)
elf_next_in_group (osec) = elf_next_in_group (isec);
elf_group_name (osec) = elf_group_name (isec);
elf_section_data (osec)->use_rela_p
= elf_section_data (isec)->use_rela_p;
osec->use_rela_p = isec->use_rela_p;
return TRUE;
}
@ -7336,7 +7330,7 @@ _bfd_elf_rela_local_sym (abfd, sym, sec, rel)
+ sym->st_value);
if ((sec->flags & SEC_MERGE)
&& ELF_ST_TYPE (sym->st_info) == STT_SECTION
&& elf_section_data (sec)->sec_info_type == ELF_INFO_TYPE_MERGE)
&& sec->sec_info_type == ELF_INFO_TYPE_MERGE)
{
asection *msec;
@ -7361,7 +7355,7 @@ _bfd_elf_rel_local_sym (abfd, sym, psec, addend)
{
asection *sec = *psec;
if (elf_section_data (sec)->sec_info_type != ELF_INFO_TYPE_MERGE)
if (sec->sec_info_type != ELF_INFO_TYPE_MERGE)
return sym->st_value + addend;
return _bfd_merged_section_offset (abfd, psec,
@ -7379,7 +7373,7 @@ _bfd_elf_section_offset (abfd, info, sec, offset)
struct bfd_elf_section_data *sec_data;
sec_data = elf_section_data (sec);
switch (sec_data->sec_info_type)
switch (sec->sec_info_type)
{
case ELF_INFO_TYPE_STABS:
return _bfd_stab_section_offset (abfd,

View File

@ -2058,7 +2058,7 @@ struct elf32_sparc_section_data
};
#define sec_do_relax(sec) \
((struct elf32_sparc_section_data *) (sec)->used_by_bfd)->do_relax
((struct elf32_sparc_section_data *) elf_section_data (sec))->do_relax
static bfd_boolean
elf32_sparc_new_section_hook (abfd, sec)

View File

@ -4438,8 +4438,7 @@ elf64_alpha_relocate_section (output_bfd, info, input_bfd, input_section,
unless it has been done already. */
if ((sec->flags & SEC_MERGE)
&& ELF_ST_TYPE (sym->st_info) == STT_SECTION
&& (elf_section_data (sec)->sec_info_type
== ELF_INFO_TYPE_MERGE)
&& sec->sec_info_type == ELF_INFO_TYPE_MERGE
&& gotent
&& !gotent->reloc_xlated)
{

View File

@ -52,7 +52,7 @@ struct _mmix_elf_section_data
};
#define mmix_elf_section_data(sec) \
((struct _mmix_elf_section_data *) (sec)->used_by_bfd)
((struct _mmix_elf_section_data *) elf_section_data (sec))
/* For each section containing a base-plus-offset (BPO) reloc, we attach
this struct as mmix_elf_section_data (section)->bpo, which is otherwise

View File

@ -1925,7 +1925,7 @@ struct sparc64_elf_section_data
};
#define sec_do_relax(sec) \
((struct sparc64_elf_section_data *) (sec)->used_by_bfd)->do_relax
((struct sparc64_elf_section_data *) elf_section_data (sec))->do_relax
static bfd_boolean
sparc64_elf_new_section_hook (abfd, sec)

View File

@ -1,5 +1,5 @@
/* ELF linker support.
Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
@ -1304,7 +1304,7 @@ elf_link_add_object_symbols (abfd, info)
Test for --just-symbols by looking at info set up by
_bfd_elf_link_just_syms. */
if ((s = abfd->sections) != NULL
&& elf_section_data (s)->sec_info_type == ELF_INFO_TYPE_JUST_SYMS)
&& s->sec_info_type == ELF_INFO_TYPE_JUST_SYMS)
goto error_return;
/* Find the name to use in a DT_NEEDED entry that refers to this
@ -2234,7 +2234,7 @@ elf_link_add_object_symbols (abfd, info)
&secdata->sec_info))
goto error_return;
if (secdata->sec_info)
secdata->sec_info_type = ELF_INFO_TYPE_STABS;
stab->sec_info_type = ELF_INFO_TYPE_STABS;
}
}
}
@ -2256,7 +2256,7 @@ elf_link_add_object_symbols (abfd, info)
s, &secdata->sec_info))
goto error_return;
else if (secdata->sec_info)
secdata->sec_info_type = ELF_INFO_TYPE_MERGE;
s->sec_info_type = ELF_INFO_TYPE_MERGE;
}
}
@ -5916,7 +5916,7 @@ elf_link_sec_merge_syms (h, data)
if ((h->root.type == bfd_link_hash_defined
|| h->root.type == bfd_link_hash_defweak)
&& ((sec = h->root.u.def.section)->flags & SEC_MERGE)
&& elf_section_data (sec)->sec_info_type == ELF_INFO_TYPE_MERGE)
&& sec->sec_info_type == ELF_INFO_TYPE_MERGE)
{
bfd *output_bfd = (bfd *) data;
@ -6522,7 +6522,7 @@ elf_link_input_bfd (finfo, input_bfd)
{
isec = section_from_elf_index (input_bfd, isym->st_shndx);
if (isec
&& elf_section_data (isec)->sec_info_type == ELF_INFO_TYPE_MERGE
&& isec->sec_info_type == ELF_INFO_TYPE_MERGE
&& ELF_ST_TYPE (isym->st_info) != STT_SECTION)
isym->st_value =
_bfd_merged_section_offset (output_bfd, &isec,
@ -7015,7 +7015,7 @@ elf_link_input_bfd (finfo, input_bfd)
{
/* Section written out. */
}
else switch (elf_section_data (o)->sec_info_type)
else switch (o->sec_info_type)
{
case ELF_INFO_TYPE_STABS:
if (! (_bfd_write_section_stabs
@ -8268,7 +8268,7 @@ elf_bfd_discard_info (output_bfd, info)
if (stab != NULL
&& (stab->_raw_size == 0
|| bfd_is_abs_section (stab->output_section)
|| elf_section_data (stab)->sec_info_type != ELF_INFO_TYPE_STABS))
|| stab->sec_info_type != ELF_INFO_TYPE_STABS))
stab = NULL;
if (stab == NULL
@ -8374,7 +8374,7 @@ elf_section_ignore_discarded_relocs (sec)
{
struct elf_backend_data *bed;
switch (elf_section_data (sec)->sec_info_type)
switch (sec->sec_info_type)
{
case ELF_INFO_TYPE_STABS:
case ELF_INFO_TYPE_EH_FRAME:

View File

@ -3763,8 +3763,7 @@ elfNN_ia64_relocate_section (output_bfd, info, input_bfd, input_section,
value = _bfd_elf_rela_local_sym (output_bfd, sym, sym_sec, rel);
if ((sym_sec->flags & SEC_MERGE)
&& ELF_ST_TYPE (sym->st_info) == STT_SECTION
&& (elf_section_data (sym_sec)->sec_info_type
== ELF_INFO_TYPE_MERGE))
&& sym_sec->sec_info_type == ELF_INFO_TYPE_MERGE)
{
struct elfNN_ia64_local_hash_entry *loc_h;

View File

@ -148,7 +148,7 @@ struct _mips_elf_section_data
};
#define mips_elf_section_data(sec) \
((struct _mips_elf_section_data *) (sec)->used_by_bfd)
((struct _mips_elf_section_data *) elf_section_data (sec))
/* This structure is passed to mips_elf_sort_hash_table_f when sorting
the dynamic symbols. */
@ -4600,8 +4600,7 @@ _bfd_mips_elf_fake_sections (abfd, hdr, sec)
esd->rel_hdr2 = (Elf_Internal_Shdr *) bfd_zalloc (abfd, amt);
if (!esd->rel_hdr2)
return FALSE;
_bfd_elf_init_reloc_shdr (abfd, esd->rel_hdr2, sec,
!elf_section_data (sec)->use_rela_p);
_bfd_elf_init_reloc_shdr (abfd, esd->rel_hdr2, sec, !sec->use_rela_p);
}
return TRUE;

View File

@ -1,6 +1,6 @@
/* BFD back-end for ieee-695 objects.
Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
2000, 2001, 2002
2000, 2001, 2002, 2003
Free Software Foundation, Inc.
Written by Steve Chamberlain of Cygnus Support.
@ -2074,7 +2074,7 @@ ieee_slurp_section_data (abfd)
for (s = abfd->sections; s != (asection *) NULL; s = s->next)
{
ieee_per_section_type *per = (ieee_per_section_type *) s->used_by_bfd;
ieee_per_section_type *per = ieee_per_section (s);
if ((s->flags & SEC_DEBUGGING) != 0)
continue;
per->data = (bfd_byte *) bfd_alloc (ieee->h.abfd, s->_raw_size);
@ -2098,7 +2098,7 @@ ieee_slurp_section_data (abfd)
section_number = must_parse_int (&(ieee->h));
s = ieee->section_table[section_number];
s->flags |= SEC_LOAD | SEC_HAS_CONTENTS;
current_map = (ieee_per_section_type *) s->used_by_bfd;
current_map = ieee_per_section (s);
location_ptr = current_map->data - s->vma;
/* The document I have says that Microtec's compilers reset */
/* this after a sec section, even though the standard says not */
@ -2192,8 +2192,8 @@ ieee_new_section_hook (abfd, newsect)
bfd *abfd;
asection *newsect;
{
newsect->used_by_bfd = (PTR)
bfd_alloc (abfd, (bfd_size_type) sizeof (ieee_per_section_type));
newsect->used_by_bfd
= (PTR) bfd_alloc (abfd, (bfd_size_type) sizeof (ieee_per_section_type));
if (!newsect->used_by_bfd)
return FALSE;
ieee_per_section (newsect)->data = (bfd_byte *) NULL;
@ -2221,7 +2221,7 @@ ieee_get_section_contents (abfd, section, location, offset, count)
file_ptr offset;
bfd_size_type count;
{
ieee_per_section_type *p = (ieee_per_section_type *) section->used_by_bfd;
ieee_per_section_type *p = ieee_per_section (section);
if ((section->flags & SEC_DEBUGGING) != 0)
return _bfd_generic_get_section_contents (abfd, section, location,
offset, count);
@ -2237,7 +2237,6 @@ ieee_canonicalize_reloc (abfd, section, relptr, symbols)
arelent **relptr;
asymbol **symbols;
{
/* ieee_per_section_type *p = (ieee_per_section_type *) section->used_by_bfd;*/
ieee_reloc_type *src = (ieee_reloc_type *) (section->relocation);
ieee_data_type *ieee = IEEE_DATA (abfd);

View File

@ -1,5 +1,5 @@
/* BFD back-end for mmo objects (MMIX-specific object-format).
Copyright 2001, 2002
Copyright 2001, 2002, 2003
Free Software Foundation, Inc.
Written by Hans-Peter Nilsson (hp@bitrange.com).
Infrastructure and other bits originally copied from srec.c and
@ -335,6 +335,9 @@ struct mmo_section_data_struct
mmo_data_list_type *tail;
};
#define mmo_section_data(sec) \
((struct mmo_section_data_struct *) (sec)->used_by_bfd)
/* These structures are used in bfd_map_over_sections constructs. */
/* Used when writing out sections; all but the register contents section
@ -1177,12 +1180,11 @@ mmo_get_spec_section (abfd, spec_data_number)
}
loc->next = NULL;
if (((struct mmo_section_data_struct *) (sec->used_by_bfd))->tail != NULL)
((struct mmo_section_data_struct *) (sec->used_by_bfd))->tail->next
= loc;
if (mmo_section_data (sec)->tail != NULL)
mmo_section_data (sec)->tail->next = loc;
else
((struct mmo_section_data_struct *) (sec->used_by_bfd))->head = loc;
((struct mmo_section_data_struct *) (sec->used_by_bfd))->tail = loc;
mmo_section_data (sec)->head = loc;
mmo_section_data (sec)->tail = loc;
loc->where = section_vma;
return sec;
@ -1517,8 +1519,7 @@ mmo_get_loc (sec, vma, size)
int size;
{
bfd_size_type allocated_size;
struct mmo_section_data_struct *sdatap
= (struct mmo_section_data_struct *) sec->used_by_bfd;
struct mmo_section_data_struct *sdatap = mmo_section_data (sec);
struct mmo_data_list_struct *datap = sdatap->head;
struct mmo_data_list_struct *entry;
@ -2463,15 +2464,9 @@ mmo_internal_write_section (abfd, sec)
if (strcmp (sec->name, MMO_TEXT_SECTION_NAME) == 0)
/* FIXME: Output source file name and line number. */
return
mmo_write_loc_chunk_list (abfd,
((struct mmo_section_data_struct *)
(sec->used_by_bfd))->head);
return mmo_write_loc_chunk_list (abfd, mmo_section_data (sec)->head);
else if (strcmp (sec->name, MMO_DATA_SECTION_NAME) == 0)
return
mmo_write_loc_chunk_list (abfd,
((struct mmo_section_data_struct *)
(sec->used_by_bfd))->head);
return mmo_write_loc_chunk_list (abfd, mmo_section_data (sec)->head);
else if (strcmp (sec->name, MMIX_REG_CONTENTS_SECTION_NAME) == 0)
/* Not handled here. */
{
@ -2486,9 +2481,7 @@ mmo_internal_write_section (abfd, sec)
int n = atoi (sec->name + strlen (MMIX_OTHER_SPEC_SECTION_PREFIX));
mmo_write_tetra_raw (abfd, (LOP << 24) | (LOP_SPEC << 16) | n);
return (! abfd->tdata.mmo_data->have_error
&& mmo_write_chunk_list (abfd,
((struct mmo_section_data_struct *)
(sec->used_by_bfd))->head));
&& mmo_write_chunk_list (abfd, mmo_section_data (sec)->head));
}
/* Ignore sections that are just allocated or empty; we write out
_contents_ here. */
@ -2605,16 +2598,11 @@ EXAMPLE
/* Writing a LOP_LOC ends the LOP_SPEC data, and makes data actually
loaded. */
if (bfd_get_section_flags (abfd, sec) & SEC_LOAD)
return
! abfd->tdata.mmo_data->have_error
&& mmo_write_loc_chunk_list (abfd,
((struct mmo_section_data_struct *)
(sec->used_by_bfd))->head);
return
! abfd->tdata.mmo_data->have_error
&& mmo_write_chunk_list (abfd,
((struct mmo_section_data_struct *)
(sec->used_by_bfd))->head);
return (! abfd->tdata.mmo_data->have_error
&& mmo_write_loc_chunk_list (abfd,
mmo_section_data (sec)->head));
return (! abfd->tdata.mmo_data->have_error
&& mmo_write_chunk_list (abfd, mmo_section_data (sec)->head));
}
return TRUE;
}

View File

@ -1,6 +1,6 @@
/* BFD back-end for oasys objects.
Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2001, 2002
Free Software Foundation, Inc.
Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2001,
2002, 2003 Free Software Foundation, Inc.
Written by Steve Chamberlain of Cygnus Support, <sac@cygnus.com>.
This file is part of BFD, the Binary File Descriptor library.
@ -864,7 +864,7 @@ oasys_get_section_contents (abfd, section, location, offset, count)
file_ptr offset;
bfd_size_type count;
{
oasys_per_section_type *p = (oasys_per_section_type *) section->used_by_bfd;
oasys_per_section_type *p = oasys_per_section (section);
oasys_slurp_section_data (abfd);
if (! p->initialized)
{

View File

@ -1,6 +1,6 @@
/* Object file "section" support for the BFD library.
Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
2000, 2001, 2002
2000, 2001, 2002, 2003
Free Software Foundation, Inc.
Written by Cygnus Support.
@ -377,10 +377,35 @@ CODE_FRAGMENT
. {* A mark flag used by some linker backends for garbage collection. *}
. unsigned int gc_mark : 1;
.
. {* Used by the ELF code to mark sections which have been allocated
. to segments. *}
. {* The following flags are used by the ELF linker. *}
.
. {* Mark sections which have been allocated to segments. *}
. unsigned int segment_mark : 1;
.
. {* Type of sec_info information. *}
. unsigned int sec_info_type:3;
.#define ELF_INFO_TYPE_NONE 0
.#define ELF_INFO_TYPE_STABS 1
.#define ELF_INFO_TYPE_MERGE 2
.#define ELF_INFO_TYPE_EH_FRAME 3
.#define ELF_INFO_TYPE_JUST_SYMS 4
.
. {* Nonzero if this section uses RELA relocations, rather than REL. *}
. unsigned int use_rela_p:1;
.
. {* Bits used by various backends. *}
. unsigned int has_tls_reloc:1;
.
. {* Usused bits. *}
. unsigned int flag11:1;
. unsigned int flag12:1;
. unsigned int flag13:1;
. unsigned int flag14:1;
. unsigned int flag15:1;
. unsigned int flag16:4;
. unsigned int flag20:4;
. unsigned int flag24:8;
.
. {* End of internal packed boolean fields. *}
.
. {* The virtual memory address of the section - where it will be
@ -590,6 +615,12 @@ static const asymbol global_syms[] =
/* linker_mark, linker_has_input, gc_mark, segment_mark, */ \
0, 0, 1, 0, \
\
/* sec_info_type, use_rela_p, has_tls_reloc, flag11, flag12, */ \
0, 0, 0, 0, 0, \
\
/* flag13, flag14, flag15, flag16, flag20, flag24, */ \
0, 0, 0, 0, 0, 0, \
\
/* vma, lma, _cooked_size, _raw_size, */ \
0, 0, 0, 0, \
\

View File

@ -1,3 +1,8 @@
2003-02-04 Alan Modra <amodra@bigpond.net.au>
* config/obj-elf.c (obj_elf_change_section): Set SEC_LINK_ONCE and
SEC_LINK_DUPLICATES_DISCARD directly rather than using elf_linkonce_p.
2003-02-02 Richard Sandiford <rsandifo@redhat.com>
* config/tc-mips.c (enum small_ex_type): Remove.

View File

@ -755,11 +755,12 @@ obj_elf_change_section (name, type, attr, entsize, group_name, linkonce, push)
if (type == SHT_NOBITS)
seg_info (sec)->bss = 1;
if (linkonce)
flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
bfd_set_section_flags (stdoutput, sec, flags);
if (flags & SEC_MERGE)
sec->entsize = entsize;
elf_group_name (sec) = group_name;
elf_linkonce_p (sec) = linkonce;
/* Add a symbol for this section to the symbol table. */
secsym = symbol_find (name);
@ -776,8 +777,8 @@ obj_elf_change_section (name, type, attr, entsize, group_name, linkonce, push)
if (((old_sec->flags ^ flags)
& (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE
| SEC_EXCLUDE | SEC_SORT_ENTRIES | SEC_MERGE | SEC_STRINGS
| SEC_THREAD_LOCAL))
|| linkonce != elf_linkonce_p (sec))
| SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD
| SEC_THREAD_LOCAL)))
as_warn (_("ignoring changed section attributes for %s"), name);
if ((flags & SEC_MERGE) && old_sec->entsize != (unsigned) entsize)
as_warn (_("ignoring changed section entity size for %s"), name);
@ -2037,7 +2038,7 @@ elf_frob_file ()
flags = SEC_READONLY | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_GROUP;
for (s = list.head[i]; s != NULL; s = elf_next_in_group (s))
if (elf_linkonce_p (s) != ((flags & SEC_LINK_ONCE) != 0))
if ((s->flags ^ flags) & SEC_LINK_ONCE)
{
flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
if (s != list.head[i])