forked from Imagelibrary/binutils-gdb
bfd/
* libbfd-in.h (_bfd_generic_new_section_hook): Declare. * section.c (bfd_abs_symbol, bfd_com_symbol): Delete. (bfd_und_symbol, bfd_ind_symbol): Delete. (BFD_FAKE_SECTION): Remove SYM_PTR param, set symbol_ptr_ptr to &SEC.symbol. (STD_SECTION): Adjust. (_bfd_generic_new_section_hook): New function, extracted from.. (bfd_section_init): ..here. (bfd_make_section_old_way): Call new_section_hook for abs, com, und and ind sections. * elf.c (_bfd_elf_large_com_section): Adjust. * aoutx.h (new_section_hook): Call _bfd_generic_new_section_hook. * pdp11.c (new_section_hook): Likewise. * coffcode.h (coff_new_section_hook): Likewise. * ecoff.c (_bfd_ecoff_new_section_hook): Likewise. * elf.c (_bfd_elf_new_section_hook): Likewise. * vms.c (vms_new_section_hook): Likwise. * elf32-arm.c (elf32_arm_new_section_hook): Check used_by_bfd isn't already set. * elf32-sh64.c (sh64_elf_new_section_hook): Likewise. * elf32-xtensa.c (elf_xtensa_new_section_hook): Likewise. * elf64-mmix.c (mmix_elf_new_section_hook): Likewise. * elf64-ppc.c (ppc64_elf_new_section_hook): Likewise. * elfxx-mips.c (_bfd_mips_elf_new_section_hook): Likewise. * elfxx-sparc.c (_bfd_sparc_elf_new_section_hook): Likewise. * ieee.c (ieee_new_section_hook): Likewise. Call _bfd_generic_new_section_hook too. * mmo.c (mmo_new_section_hook): Likewise. * oasys.c (oasys_new_section_hook): Likewise. * som.c (som_new_section_hook): Likewise. * coff-w65.c (reloc_processing): Don't use bfd_abs_symbol. * bfd-in2.h: Regenerate. * libbfd.h: Regenerate. gas/ * subsegs.c (subseg_get): Don't call obj_sec_set_private_data. * config/obj-elf.h (obj_sec_set_private_data): Delete. * config/tc-hppa.c (tc_gen_reloc): Don't use bfd_abs_symbol. * config/tc-mn10300.c (tc_gen_reloc): Likewise.
This commit is contained in:
113
bfd/section.c
113
bfd/section.c
@@ -540,11 +540,6 @@ CODE_FRAGMENT
|
||||
. || ((SEC) == bfd_com_section_ptr) \
|
||||
. || ((SEC) == bfd_ind_section_ptr))
|
||||
.
|
||||
.extern const struct bfd_symbol * const bfd_abs_symbol;
|
||||
.extern const struct bfd_symbol * const bfd_com_symbol;
|
||||
.extern const struct bfd_symbol * const bfd_und_symbol;
|
||||
.extern const struct bfd_symbol * const bfd_ind_symbol;
|
||||
.
|
||||
.{* Macros to handle insertion and deletion of a bfd's sections. These
|
||||
. only handle the list pointers, ie. do not adjust section_count,
|
||||
. target_index etc. *}
|
||||
@@ -635,7 +630,7 @@ CODE_FRAGMENT
|
||||
.#define bfd_section_removed_from_list(ABFD, S) \
|
||||
. ((S)->next == NULL ? (ABFD)->section_last != (S) : (S)->next->prev != (S))
|
||||
.
|
||||
.#define BFD_FAKE_SECTION(SEC, FLAGS, SYM, SYM_PTR, NAME, IDX) \
|
||||
.#define BFD_FAKE_SECTION(SEC, FLAGS, SYM, NAME, IDX) \
|
||||
. {* name, id, index, next, prev, flags, user_set_vma, *} \
|
||||
. { NAME, IDX, 0, NULL, NULL, FLAGS, 0, \
|
||||
. \
|
||||
@@ -666,11 +661,8 @@ CODE_FRAGMENT
|
||||
. {* target_index, used_by_bfd, constructor_chain, owner, *} \
|
||||
. 0, NULL, NULL, NULL, \
|
||||
. \
|
||||
. {* symbol, *} \
|
||||
. (struct bfd_symbol *) SYM, \
|
||||
. \
|
||||
. {* symbol_ptr_ptr, *} \
|
||||
. (struct bfd_symbol **) SYM_PTR, \
|
||||
. {* symbol, symbol_ptr_ptr, *} \
|
||||
. (struct bfd_symbol *) SYM, &SEC.symbol, \
|
||||
. \
|
||||
. {* map_head, map_tail *} \
|
||||
. { NULL }, { NULL } \
|
||||
@@ -701,16 +693,14 @@ static const asymbol global_syms[] =
|
||||
GLOBAL_SYM_INIT (BFD_IND_SECTION_NAME, &bfd_ind_section)
|
||||
};
|
||||
|
||||
#define STD_SECTION(SEC, FLAGS, SYM, NAME, IDX) \
|
||||
const asymbol * const SYM = (asymbol *) &global_syms[IDX]; \
|
||||
asection SEC = BFD_FAKE_SECTION(SEC, FLAGS, &global_syms[IDX], &SYM, \
|
||||
#define STD_SECTION(SEC, FLAGS, NAME, IDX) \
|
||||
asection SEC = BFD_FAKE_SECTION(SEC, FLAGS, &global_syms[IDX], \
|
||||
NAME, IDX)
|
||||
|
||||
STD_SECTION (bfd_com_section, SEC_IS_COMMON, bfd_com_symbol,
|
||||
BFD_COM_SECTION_NAME, 0);
|
||||
STD_SECTION (bfd_und_section, 0, bfd_und_symbol, BFD_UND_SECTION_NAME, 1);
|
||||
STD_SECTION (bfd_abs_section, 0, bfd_abs_symbol, BFD_ABS_SECTION_NAME, 2);
|
||||
STD_SECTION (bfd_ind_section, 0, bfd_ind_symbol, BFD_IND_SECTION_NAME, 3);
|
||||
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);
|
||||
#undef STD_SECTION
|
||||
|
||||
/* Initialize an entry in the section hash table. */
|
||||
@@ -743,6 +733,26 @@ bfd_section_hash_newfunc (struct bfd_hash_entry *entry,
|
||||
((struct section_hash_entry *) \
|
||||
bfd_hash_lookup ((table), (string), (create), (copy)))
|
||||
|
||||
/* Create a symbol whose only job is to point to this section. This
|
||||
is useful for things like relocs which are relative to the base
|
||||
of a section. */
|
||||
|
||||
bfd_boolean
|
||||
_bfd_generic_new_section_hook (bfd *abfd, asection *newsect)
|
||||
{
|
||||
newsect->symbol = bfd_make_empty_symbol (abfd);
|
||||
if (newsect->symbol == NULL)
|
||||
return FALSE;
|
||||
|
||||
newsect->symbol->name = newsect->name;
|
||||
newsect->symbol->value = 0;
|
||||
newsect->symbol->section = newsect;
|
||||
newsect->symbol->flags = BSF_SECTION_SYM;
|
||||
|
||||
newsect->symbol_ptr_ptr = &newsect->symbol;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* Initializes a new section. NEWSECT->NAME is already set. */
|
||||
|
||||
static asection *
|
||||
@@ -754,20 +764,6 @@ bfd_section_init (bfd *abfd, asection *newsect)
|
||||
newsect->index = abfd->section_count;
|
||||
newsect->owner = abfd;
|
||||
|
||||
/* Create a symbol whose only job is to point to this section. This
|
||||
is useful for things like relocs which are relative to the base
|
||||
of a section. */
|
||||
newsect->symbol = bfd_make_empty_symbol (abfd);
|
||||
if (newsect->symbol == NULL)
|
||||
return NULL;
|
||||
|
||||
newsect->symbol->name = newsect->name;
|
||||
newsect->symbol->value = 0;
|
||||
newsect->symbol->section = newsect;
|
||||
newsect->symbol->flags = BSF_SECTION_SYM;
|
||||
|
||||
newsect->symbol_ptr_ptr = &newsect->symbol;
|
||||
|
||||
if (! BFD_SEND (abfd, _new_section_hook, (abfd, newsect)))
|
||||
return NULL;
|
||||
|
||||
@@ -964,7 +960,6 @@ DESCRIPTION
|
||||
asection *
|
||||
bfd_make_section_old_way (bfd *abfd, const char *name)
|
||||
{
|
||||
struct section_hash_entry *sh;
|
||||
asection *newsect;
|
||||
|
||||
if (abfd->output_has_begun)
|
||||
@@ -974,30 +969,38 @@ bfd_make_section_old_way (bfd *abfd, const char *name)
|
||||
}
|
||||
|
||||
if (strcmp (name, BFD_ABS_SECTION_NAME) == 0)
|
||||
return bfd_abs_section_ptr;
|
||||
|
||||
if (strcmp (name, BFD_COM_SECTION_NAME) == 0)
|
||||
return bfd_com_section_ptr;
|
||||
|
||||
if (strcmp (name, BFD_UND_SECTION_NAME) == 0)
|
||||
return bfd_und_section_ptr;
|
||||
|
||||
if (strcmp (name, BFD_IND_SECTION_NAME) == 0)
|
||||
return bfd_ind_section_ptr;
|
||||
|
||||
sh = section_hash_lookup (&abfd->section_htab, name, TRUE, FALSE);
|
||||
if (sh == NULL)
|
||||
return NULL;
|
||||
|
||||
newsect = &sh->section;
|
||||
if (newsect->name != NULL)
|
||||
newsect = bfd_abs_section_ptr;
|
||||
else if (strcmp (name, BFD_COM_SECTION_NAME) == 0)
|
||||
newsect = bfd_com_section_ptr;
|
||||
else if (strcmp (name, BFD_UND_SECTION_NAME) == 0)
|
||||
newsect = bfd_und_section_ptr;
|
||||
else if (strcmp (name, BFD_IND_SECTION_NAME) == 0)
|
||||
newsect = bfd_ind_section_ptr;
|
||||
else
|
||||
{
|
||||
/* Section already exists. */
|
||||
return newsect;
|
||||
struct section_hash_entry *sh;
|
||||
|
||||
sh = section_hash_lookup (&abfd->section_htab, name, TRUE, FALSE);
|
||||
if (sh == NULL)
|
||||
return NULL;
|
||||
|
||||
newsect = &sh->section;
|
||||
if (newsect->name != NULL)
|
||||
{
|
||||
/* Section already exists. */
|
||||
return newsect;
|
||||
}
|
||||
|
||||
newsect->name = name;
|
||||
return bfd_section_init (abfd, newsect);
|
||||
}
|
||||
|
||||
newsect->name = name;
|
||||
return bfd_section_init (abfd, newsect);
|
||||
/* Call new_section_hook when "creating" the standard abs, com, und
|
||||
and ind sections to tack on format specific section data.
|
||||
Also, create a proper section symbol. */
|
||||
if (! BFD_SEND (abfd, _new_section_hook, (abfd, newsect)))
|
||||
return NULL;
|
||||
return newsect;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user