/* ADI Blackfin BFD support for 32-bit ELF.
- Copyright (C) 2005-2020 Free Software Foundation, Inc.
+ Copyright (C) 2005-2021 Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
/* Get the Blackfin ELF linker hash table from a link_info structure. */
-#define bfinfdpic_hash_table(info) \
- (elf_hash_table_id ((struct elf_link_hash_table *) ((info)->hash)) \
- == BFIN_ELF_DATA ? ((struct bfinfdpic_elf_link_hash_table *) ((info)->hash)) : NULL)
+#define bfinfdpic_hash_table(p) \
+ ((is_elf_hash_table ((p)->hash) \
+ && elf_hash_table_id (elf_hash_table (p)) == BFIN_ELF_DATA) \
+ ? (struct bfinfdpic_elf_link_hash_table *) (p)->hash : NULL)
#define bfinfdpic_got_section(info) \
(bfinfdpic_hash_table (info)->elf.sgot)
bfinfdpic_elf_link_hash_table_create (bfd *abfd)
{
struct bfinfdpic_elf_link_hash_table *ret;
- bfd_size_type amt = sizeof (struct bfinfdpic_elf_link_hash_table);
+ size_t amt = sizeof (struct bfinfdpic_elf_link_hash_table);
ret = bfd_zmalloc (amt);
if (ret == NULL)
h = NULL;
sym = NULL;
sec = NULL;
+ picrel = NULL;
if (r_symndx < symtab_hdr->sh_info)
{
case R_BFIN_FUNCDESC_GOTOFFLO:
case R_BFIN_FUNCDESC:
case R_BFIN_FUNCDESC_VALUE:
+ if ((input_section->flags & SEC_ALLOC) == 0)
+ break;
+
if (h != NULL)
picrel = bfinfdpic_relocs_info_for_global (bfinfdpic_relocs_info
(info), input_bfd, h,
input file basename is crt0.o only once. */
if (silence_segment_error == 1)
silence_segment_error =
- (strlen (input_bfd->filename) == 6
- && filename_cmp (input_bfd->filename, "crt0.o") == 0)
- || (strlen (input_bfd->filename) > 6
- && filename_cmp (input_bfd->filename
- + strlen (input_bfd->filename) - 7,
+ (strlen (bfd_get_filename (input_bfd)) == 6
+ && filename_cmp (bfd_get_filename (input_bfd), "crt0.o") == 0)
+ || (strlen (bfd_get_filename (input_bfd)) > 6
+ && filename_cmp (bfd_get_filename (input_bfd)
+ + strlen (bfd_get_filename (input_bfd)) - 7,
"/crt0.o") == 0)
? -1 : 0;
#endif
if (!_bfinfdpic_size_got_plt (output_bfd, &gpinfo))
return FALSE;
- if (elf_hash_table (info)->dynamic_sections_created)
- {
- if (bfinfdpic_got_section (info)->size)
- if (!_bfd_elf_add_dynamic_entry (info, DT_PLTGOT, 0))
- return FALSE;
-
- if (bfinfdpic_pltrel_section (info)->size)
- if (!_bfd_elf_add_dynamic_entry (info, DT_PLTRELSZ, 0)
- || !_bfd_elf_add_dynamic_entry (info, DT_PLTREL, DT_REL)
- || !_bfd_elf_add_dynamic_entry (info, DT_JMPREL, 0))
- return FALSE;
-
- if (bfinfdpic_gotrel_section (info)->size)
- if (!_bfd_elf_add_dynamic_entry (info, DT_REL, 0)
- || !_bfd_elf_add_dynamic_entry (info, DT_RELSZ, 0)
- || !_bfd_elf_add_dynamic_entry (info, DT_RELENT,
- sizeof (Elf32_External_Rel)))
- return FALSE;
- }
-
s = bfd_get_linker_section (dynobj, ".dynbss");
if (s && s->size == 0)
s->flags |= SEC_EXCLUDE;
if (s && s->size == 0)
s->flags |= SEC_EXCLUDE;
- return TRUE;
+ return _bfd_elf_add_dynamic_tags (output_bfd, info, TRUE);
}
static bfd_boolean
flagword old_flags, new_flags;
bfd_boolean error = FALSE;
+ /* FIXME: What should be checked when linking shared libraries? */
+ if ((ibfd->flags & DYNAMIC) != 0)
+ return TRUE;
+
new_flags = elf_elfheader (ibfd)->e_flags;
old_flags = elf_elfheader (obfd)->e_flags;
struct bfin_pcrel_relocs_copied *pcrel_relocs_copied;
};
-/* bfin ELF linker hash table. */
-
-struct bfin_link_hash_table
-{
- struct elf_link_hash_table root;
-
- /* Small local sym cache. */
- struct sym_cache sym_cache;
-};
-
#define bfin_hash_entry(ent) ((struct bfin_link_hash_entry *) (ent))
static struct bfd_hash_entry *
static struct bfd_link_hash_table *
bfin_link_hash_table_create (bfd * abfd)
{
- struct bfin_link_hash_table *ret;
- bfd_size_type amt = sizeof (struct bfin_link_hash_table);
+ struct elf_link_hash_table *ret;
+ size_t amt = sizeof (struct elf_link_hash_table);
ret = bfd_zmalloc (amt);
if (ret == NULL)
return NULL;
- if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
- bfin_link_hash_newfunc,
+ if (!_bfd_elf_link_hash_table_init (ret, abfd, bfin_link_hash_newfunc,
sizeof (struct elf_link_hash_entry),
BFIN_ELF_DATA))
{
return NULL;
}
- ret->sym_cache.abfd = NULL;
-
- return &ret->root.root;
+ return &ret->root;
}
/* The size in bytes of an entry in the procedure linkage table. */
strncpy ((char *) p + 4, targetsec->output_section->name, 8);
}
- if (isymbuf != NULL && symtab_hdr->contents != (unsigned char *) isymbuf)
+ if (symtab_hdr->contents != (unsigned char *) isymbuf)
free (isymbuf);
- if (internal_relocs != NULL
- && elf_section_data (datasec)->relocs != internal_relocs)
+ if (elf_section_data (datasec)->relocs != internal_relocs)
free (internal_relocs);
return TRUE;
-error_return:
- if (isymbuf != NULL && symtab_hdr->contents != (unsigned char *) isymbuf)
+ error_return:
+ if (symtab_hdr->contents != (unsigned char *) isymbuf)
free (isymbuf);
- if (internal_relocs != NULL
- && elf_section_data (datasec)->relocs != internal_relocs)
+ if (elf_section_data (datasec)->relocs != internal_relocs)
free (internal_relocs);
return FALSE;
}
#define bfd_elf32_bfd_is_local_label_name \
bfin_is_local_label_name
-#define bfin_hash_table(p) \
- ((struct bfin_link_hash_table *) (p)->hash)
-
-
#define elf_backend_create_dynamic_sections \
_bfd_elf_create_dynamic_sections