| Index: bfd/section.c
|
| diff --git a/bfd/section.c b/bfd/section.c
|
| index 7c1f75048318f5df7b99e4ae829365a1c150f4f7..a3b7c56db562e19981c9dbe9e169239b43d42fce 100644
|
| --- a/bfd/section.c
|
| +++ b/bfd/section.c
|
| @@ -1,6 +1,7 @@
|
| /* Object file "section" support for the BFD library.
|
| Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
| - 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
|
| + 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011,
|
| + 2012
|
| Free Software Foundation, Inc.
|
| Written by Cygnus Support.
|
|
|
| @@ -382,11 +383,11 @@ CODE_FRAGMENT
|
| .
|
| . {* 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
|
| +.#define SEC_INFO_TYPE_NONE 0
|
| +.#define SEC_INFO_TYPE_STABS 1
|
| +.#define SEC_INFO_TYPE_MERGE 2
|
| +.#define SEC_INFO_TYPE_EH_FRAME 3
|
| +.#define SEC_INFO_TYPE_JUST_SYMS 4
|
| .
|
| . {* Nonzero if this section uses RELA relocations, rather than REL. *}
|
| . unsigned int use_rela_p:1;
|
| @@ -516,9 +517,6 @@ CODE_FRAGMENT
|
| . {* The BFD which owns the section. *}
|
| . bfd *owner;
|
| .
|
| -. {* INPUT_SECTION_FLAGS if specified in the linker script. *}
|
| -. struct flag_info *section_flag_info;
|
| -.
|
| . {* A symbol which points at this section only. *}
|
| . struct bfd_symbol *symbol;
|
| . struct bfd_symbol **symbol_ptr_ptr;
|
| @@ -546,28 +544,25 @@ CODE_FRAGMENT
|
| .
|
| .{* These sections are global, and are managed by BFD. The application
|
| . and target back end are not permitted to change the values in
|
| -. these sections. New code should use the section_ptr macros rather
|
| -. than referring directly to the const sections. The const sections
|
| -. may eventually vanish. *}
|
| +. these sections. *}
|
| +.extern asection std_section[4];
|
| +.
|
| .#define BFD_ABS_SECTION_NAME "*ABS*"
|
| .#define BFD_UND_SECTION_NAME "*UND*"
|
| .#define BFD_COM_SECTION_NAME "*COM*"
|
| .#define BFD_IND_SECTION_NAME "*IND*"
|
| .
|
| -.{* The absolute section. *}
|
| -.extern asection bfd_abs_section;
|
| -.#define bfd_abs_section_ptr ((asection *) &bfd_abs_section)
|
| -.#define bfd_is_abs_section(sec) ((sec) == bfd_abs_section_ptr)
|
| -.{* Pointer to the undefined section. *}
|
| -.extern asection bfd_und_section;
|
| -.#define bfd_und_section_ptr ((asection *) &bfd_und_section)
|
| -.#define bfd_is_und_section(sec) ((sec) == bfd_und_section_ptr)
|
| .{* Pointer to the common section. *}
|
| -.extern asection bfd_com_section;
|
| -.#define bfd_com_section_ptr ((asection *) &bfd_com_section)
|
| +.#define bfd_com_section_ptr (&std_section[0])
|
| +.{* Pointer to the undefined section. *}
|
| +.#define bfd_und_section_ptr (&std_section[1])
|
| +.{* Pointer to the absolute section. *}
|
| +.#define bfd_abs_section_ptr (&std_section[2])
|
| .{* Pointer to the indirect section. *}
|
| -.extern asection bfd_ind_section;
|
| -.#define bfd_ind_section_ptr ((asection *) &bfd_ind_section)
|
| +.#define bfd_ind_section_ptr (&std_section[3])
|
| +.
|
| +.#define bfd_is_und_section(sec) ((sec) == bfd_und_section_ptr)
|
| +.#define bfd_is_abs_section(sec) ((sec) == bfd_abs_section_ptr)
|
| .#define bfd_is_ind_section(sec) ((sec) == bfd_ind_section_ptr)
|
| .
|
| .#define bfd_is_const_section(SEC) \
|
| @@ -682,8 +677,8 @@ CODE_FRAGMENT
|
| . {* vma, lma, size, rawsize, compressed_size, relax, relax_count, *} \
|
| . 0, 0, 0, 0, 0, 0, 0, \
|
| . \
|
| -. {* output_offset, output_section, alignment_power, *} \
|
| -. 0, (struct bfd_section *) &SEC, 0, \
|
| +. {* output_offset, output_section, alignment_power, *} \
|
| +. 0, &SEC, 0, \
|
| . \
|
| . {* relocation, orelocation, reloc_count, filepos, rel_filepos, *} \
|
| . NULL, NULL, 0, 0, 0, \
|
| @@ -697,9 +692,6 @@ CODE_FRAGMENT
|
| . {* target_index, used_by_bfd, constructor_chain, owner, *} \
|
| . 0, NULL, NULL, NULL, \
|
| . \
|
| -. {* flag_info, *} \
|
| -. NULL, \
|
| -. \
|
| . {* symbol, symbol_ptr_ptr, *} \
|
| . (struct bfd_symbol *) SYM, &SEC.symbol, \
|
| . \
|
| @@ -715,10 +707,10 @@ CODE_FRAGMENT
|
| /* the_bfd, name, value, attr, section [, udata] */
|
| #ifdef __STDC__
|
| #define GLOBAL_SYM_INIT(NAME, SECTION) \
|
| - { 0, NAME, 0, BSF_SECTION_SYM, (asection *) SECTION, { 0 }}
|
| + { 0, NAME, 0, BSF_SECTION_SYM, SECTION, { 0 }}
|
| #else
|
| #define GLOBAL_SYM_INIT(NAME, SECTION) \
|
| - { 0, NAME, 0, BSF_SECTION_SYM, (asection *) SECTION }
|
| + { 0, NAME, 0, BSF_SECTION_SYM, SECTION }
|
| #endif
|
|
|
| /* These symbols are global, not specific to any BFD. Therefore, anything
|
| @@ -726,20 +718,21 @@ CODE_FRAGMENT
|
|
|
| static const asymbol global_syms[] =
|
| {
|
| - GLOBAL_SYM_INIT (BFD_COM_SECTION_NAME, &bfd_com_section),
|
| - GLOBAL_SYM_INIT (BFD_UND_SECTION_NAME, &bfd_und_section),
|
| - GLOBAL_SYM_INIT (BFD_ABS_SECTION_NAME, &bfd_abs_section),
|
| - GLOBAL_SYM_INIT (BFD_IND_SECTION_NAME, &bfd_ind_section)
|
| + GLOBAL_SYM_INIT (BFD_COM_SECTION_NAME, bfd_com_section_ptr),
|
| + GLOBAL_SYM_INIT (BFD_UND_SECTION_NAME, bfd_und_section_ptr),
|
| + GLOBAL_SYM_INIT (BFD_ABS_SECTION_NAME, bfd_abs_section_ptr),
|
| + GLOBAL_SYM_INIT (BFD_IND_SECTION_NAME, bfd_ind_section_ptr)
|
| };
|
|
|
| -#define STD_SECTION(SEC, FLAGS, NAME, IDX) \
|
| - asection SEC = BFD_FAKE_SECTION(SEC, FLAGS, &global_syms[IDX], \
|
| - NAME, IDX)
|
| +#define STD_SECTION(NAME, IDX, FLAGS) \
|
| + BFD_FAKE_SECTION(std_section[IDX], FLAGS, &global_syms[IDX], NAME, IDX)
|
|
|
| -STD_SECTION (bfd_com_section, SEC_IS_COMMON, BFD_COM_SECTION_NAME, 0);
|
| -STD_SECTION (bfd_und_section, 0, BFD_UND_SECTION_NAME, 1);
|
| -STD_SECTION (bfd_abs_section, 0, BFD_ABS_SECTION_NAME, 2);
|
| -STD_SECTION (bfd_ind_section, 0, BFD_IND_SECTION_NAME, 3);
|
| +asection std_section[] = {
|
| + STD_SECTION (BFD_COM_SECTION_NAME, 0, SEC_IS_COMMON),
|
| + STD_SECTION (BFD_UND_SECTION_NAME, 1, 0),
|
| + STD_SECTION (BFD_ABS_SECTION_NAME, 2, 0),
|
| + STD_SECTION (BFD_IND_SECTION_NAME, 3, 0)
|
| +};
|
| #undef STD_SECTION
|
|
|
| /* Initialize an entry in the section hash table. */
|
| @@ -852,14 +845,8 @@ SYNOPSIS
|
| asection *bfd_get_section_by_name (bfd *abfd, const char *name);
|
|
|
| DESCRIPTION
|
| - Run through @var{abfd} and return the one of the
|
| - <<asection>>s whose name matches @var{name}, otherwise <<NULL>>.
|
| - @xref{Sections}, for more information.
|
| -
|
| - This should only be used in special cases; the normal way to process
|
| - all sections of a given name is to use <<bfd_map_over_sections>> and
|
| - <<strcmp>> on the name (or better yet, base it on the section flags
|
| - or something else) for each section.
|
| + Return the most recently created section attached to @var{abfd}
|
| + named @var{name}. Return NULL if no such section exists.
|
| */
|
|
|
| asection *
|
| @@ -876,6 +863,63 @@ bfd_get_section_by_name (bfd *abfd, const char *name)
|
|
|
| /*
|
| FUNCTION
|
| + bfd_get_next_section_by_name
|
| +
|
| +SYNOPSIS
|
| + asection *bfd_get_next_section_by_name (asection *sec);
|
| +
|
| +DESCRIPTION
|
| + Given @var{sec} is a section returned by @code{bfd_get_section_by_name},
|
| + return the next most recently created section attached to the same
|
| + BFD with the same name. Return NULL if no such section exists.
|
| +*/
|
| +
|
| +asection *
|
| +bfd_get_next_section_by_name (asection *sec)
|
| +{
|
| + struct section_hash_entry *sh;
|
| + const char *name;
|
| + unsigned long hash;
|
| +
|
| + sh = ((struct section_hash_entry *)
|
| + ((char *) sec - offsetof (struct section_hash_entry, section)));
|
| +
|
| + hash = sh->root.hash;
|
| + name = sec->name;
|
| + for (sh = (struct section_hash_entry *) sh->root.next;
|
| + sh != NULL;
|
| + sh = (struct section_hash_entry *) sh->root.next)
|
| + if (sh->root.hash == hash
|
| + && strcmp (sh->root.string, name) == 0)
|
| + return &sh->section;
|
| +
|
| + return NULL;
|
| +}
|
| +
|
| +/*
|
| +FUNCTION
|
| + bfd_get_linker_section
|
| +
|
| +SYNOPSIS
|
| + asection *bfd_get_linker_section (bfd *abfd, const char *name);
|
| +
|
| +DESCRIPTION
|
| + Return the linker created section attached to @var{abfd}
|
| + named @var{name}. Return NULL if no such section exists.
|
| +*/
|
| +
|
| +asection *
|
| +bfd_get_linker_section (bfd *abfd, const char *name)
|
| +{
|
| + asection *sec = bfd_get_section_by_name (abfd, name);
|
| +
|
| + while (sec != NULL && (sec->flags & SEC_LINKER_CREATED) == 0)
|
| + sec = bfd_get_next_section_by_name (sec);
|
| + return sec;
|
| +}
|
| +
|
| +/*
|
| +FUNCTION
|
| bfd_get_section_by_name_if
|
|
|
| SYNOPSIS
|
|
|