/* 32-bit ELF support for S+core.
   Copyright 2009 Free Software Foundation, Inc.
   Contributed by
   Brain.lin (brain.lin@sunplusct.com)
   Mei Ligang (ligang@sunnorth.com.cn)
   Pei-Lin Tsai (pltsai@sunplus.com)

   This file is part of BFD, the Binary File Descriptor library.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
   MA 02110-1301, USA.  */

#include "elf/common.h"
#include "elf/internal.h"

extern void
s7_bfd_score_elf_hide_symbol (struct bfd_link_info *,
                              struct elf_link_hash_entry *,
                              bfd_boolean);

extern void 
s7_bfd_score_info_to_howto (bfd *, arelent *, Elf_Internal_Rela *);

extern bfd_boolean 
s7_bfd_score_elf_relocate_section (bfd *,
                                   struct bfd_link_info *,
                                   bfd *,
                                   asection *,
                                   bfd_byte *,
                                   Elf_Internal_Rela *,
                                   Elf_Internal_Sym *,
                                   asection **);

extern bfd_boolean
s7_bfd_score_elf_check_relocs (bfd *,
                               struct bfd_link_info *,
                               asection *,
                               const Elf_Internal_Rela *);

extern bfd_boolean
s7_bfd_score_elf_add_symbol_hook (bfd *,
                                  struct bfd_link_info *,
                                  Elf_Internal_Sym *,
                                  const char **,
                                  flagword *,
                                  asection **,
                                  bfd_vma *);

extern void
s7_bfd_score_elf_symbol_processing (bfd *, asymbol *);

extern int
s7_bfd_score_elf_link_output_symbol_hook (struct bfd_link_info *,
                                          const char *,
                                          Elf_Internal_Sym *,
                                          asection *,
                                          struct elf_link_hash_entry *);

extern bfd_boolean
s7_bfd_score_elf_section_from_bfd_section (bfd *,
                                           asection *,
                                           int *);

extern bfd_boolean
s7_bfd_score_elf_adjust_dynamic_symbol (struct bfd_link_info *,
                                        struct elf_link_hash_entry *);

extern bfd_boolean
s7_bfd_score_elf_always_size_sections (bfd *, struct bfd_link_info *);

extern bfd_boolean
s7_bfd_score_elf_size_dynamic_sections (bfd *, struct bfd_link_info *);

extern bfd_boolean
s7_bfd_score_elf_create_dynamic_sections (bfd *, struct bfd_link_info *);

extern bfd_boolean
s7_bfd_score_elf_finish_dynamic_symbol (bfd *,
                                        struct bfd_link_info *,
                                        struct elf_link_hash_entry *,
                                        Elf_Internal_Sym *);

extern bfd_boolean
s7_bfd_score_elf_finish_dynamic_sections (bfd *, struct bfd_link_info *);

extern bfd_boolean
s7_bfd_score_elf_fake_sections (bfd *,
                                Elf_Internal_Shdr *,
                                asection *);

extern bfd_boolean
s7_bfd_score_elf_section_processing (bfd *, Elf_Internal_Shdr *);

extern bfd_boolean
s7_bfd_score_elf_write_section (bfd *, asection *, bfd_byte *);

extern void
s7_bfd_score_elf_copy_indirect_symbol (struct bfd_link_info *,
                                       struct elf_link_hash_entry *,
                                       struct elf_link_hash_entry *);

extern bfd_boolean
s7_bfd_score_elf_discard_info (bfd *, struct elf_reloc_cookie *,
                               struct bfd_link_info *);

extern bfd_boolean
s7_bfd_score_elf_ignore_discarded_relocs (asection *);

extern asection *
s7_bfd_score_elf_gc_mark_hook (asection *,
                               struct bfd_link_info *,
                               Elf_Internal_Rela *,
                               struct elf_link_hash_entry *,
                               Elf_Internal_Sym *);

extern bfd_boolean
s7_bfd_score_elf_grok_prstatus (bfd *, Elf_Internal_Note *);

extern bfd_boolean
s7_bfd_score_elf_grok_psinfo (bfd *, Elf_Internal_Note *);

extern reloc_howto_type *
s7_elf32_score_reloc_type_lookup (bfd *, bfd_reloc_code_real_type);

extern struct bfd_link_hash_table *
s7_elf32_score_link_hash_table_create (bfd *);

extern bfd_boolean
s7_elf32_score_print_private_bfd_data (bfd *, void *);

extern bfd_boolean
s7_elf32_score_merge_private_bfd_data (bfd *, bfd *);

extern bfd_boolean
s7_elf32_score_new_section_hook (bfd *, asection *);

extern bfd_boolean
_bfd_score_elf_common_definition (Elf_Internal_Sym *);

#define elf_backend_common_definition   _bfd_score_elf_common_definition
