OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [tags/] [gnu-src/] [binutils-2.20.1/] [binutils-2.20.1-or32-1.0rc1/] [ld/] [ldemul.c] - Diff between revs 205 and 521

Only display areas with differences | Details | Blame | View Log

Rev 205 Rev 521
/* ldemul.c -- clearing house for ld emulation states
/* ldemul.c -- clearing house for ld emulation states
   Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
   Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
   2001, 2002, 2003, 2005, 2007, 2008, 2009
   2001, 2002, 2003, 2005, 2007, 2008, 2009
   Free Software Foundation, Inc.
   Free Software Foundation, Inc.
 
 
   This file is part of the GNU Binutils.
   This file is part of the GNU Binutils.
 
 
   This program is free software; you can redistribute it and/or modify
   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
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.
   (at your option) any later version.
 
 
   This program is distributed in the hope that it will be useful,
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   GNU General Public License for more details.
 
 
   You should have received a copy of the GNU General Public License
   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   along with this program; if not, write to the Free Software
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
   MA 02110-1301, USA.  */
   MA 02110-1301, USA.  */
 
 
#include "sysdep.h"
#include "sysdep.h"
#include "bfd.h"
#include "bfd.h"
#include "getopt.h"
#include "getopt.h"
#include "bfdlink.h"
#include "bfdlink.h"
 
 
#include "ld.h"
#include "ld.h"
#include "ldmisc.h"
#include "ldmisc.h"
#include "ldexp.h"
#include "ldexp.h"
#include "ldlang.h"
#include "ldlang.h"
#include "ldfile.h"
#include "ldfile.h"
#include "ldemul.h"
#include "ldemul.h"
#include "ldmain.h"
#include "ldmain.h"
#include "ldemul-list.h"
#include "ldemul-list.h"
 
 
static ld_emulation_xfer_type *ld_emulation;
static ld_emulation_xfer_type *ld_emulation;
 
 
void
void
ldemul_hll (char *name)
ldemul_hll (char *name)
{
{
  ld_emulation->hll (name);
  ld_emulation->hll (name);
}
}
 
 
void
void
ldemul_syslib (char *name)
ldemul_syslib (char *name)
{
{
  ld_emulation->syslib (name);
  ld_emulation->syslib (name);
}
}
 
 
void
void
ldemul_after_parse (void)
ldemul_after_parse (void)
{
{
  ld_emulation->after_parse ();
  ld_emulation->after_parse ();
}
}
 
 
void
void
ldemul_before_parse (void)
ldemul_before_parse (void)
{
{
  ld_emulation->before_parse ();
  ld_emulation->before_parse ();
}
}
 
 
void
void
ldemul_after_open (void)
ldemul_after_open (void)
{
{
  ld_emulation->after_open ();
  ld_emulation->after_open ();
}
}
 
 
void
void
ldemul_after_allocation (void)
ldemul_after_allocation (void)
{
{
  ld_emulation->after_allocation ();
  ld_emulation->after_allocation ();
}
}
 
 
void
void
ldemul_before_allocation (void)
ldemul_before_allocation (void)
{
{
  ld_emulation->before_allocation ();
  ld_emulation->before_allocation ();
}
}
 
 
void
void
ldemul_set_output_arch (void)
ldemul_set_output_arch (void)
{
{
  ld_emulation->set_output_arch ();
  ld_emulation->set_output_arch ();
}
}
 
 
void
void
ldemul_finish (void)
ldemul_finish (void)
{
{
  ld_emulation->finish ();
  ld_emulation->finish ();
}
}
 
 
void
void
ldemul_set_symbols (void)
ldemul_set_symbols (void)
{
{
  if (ld_emulation->set_symbols)
  if (ld_emulation->set_symbols)
    ld_emulation->set_symbols ();
    ld_emulation->set_symbols ();
}
}
 
 
void
void
ldemul_create_output_section_statements (void)
ldemul_create_output_section_statements (void)
{
{
  if (ld_emulation->create_output_section_statements)
  if (ld_emulation->create_output_section_statements)
    ld_emulation->create_output_section_statements ();
    ld_emulation->create_output_section_statements ();
}
}
 
 
char *
char *
ldemul_get_script (int *isfile)
ldemul_get_script (int *isfile)
{
{
  return ld_emulation->get_script (isfile);
  return ld_emulation->get_script (isfile);
}
}
 
 
bfd_boolean
bfd_boolean
ldemul_open_dynamic_archive (const char *arch, search_dirs_type *search,
ldemul_open_dynamic_archive (const char *arch, search_dirs_type *search,
                             lang_input_statement_type *entry)
                             lang_input_statement_type *entry)
{
{
  if (ld_emulation->open_dynamic_archive)
  if (ld_emulation->open_dynamic_archive)
    return (*ld_emulation->open_dynamic_archive) (arch, search, entry);
    return (*ld_emulation->open_dynamic_archive) (arch, search, entry);
  return FALSE;
  return FALSE;
}
}
 
 
lang_output_section_statement_type *
lang_output_section_statement_type *
ldemul_place_orphan (asection *s, const char *name, int constraint)
ldemul_place_orphan (asection *s, const char *name, int constraint)
{
{
  if (ld_emulation->place_orphan)
  if (ld_emulation->place_orphan)
    return (*ld_emulation->place_orphan) (s, name, constraint);
    return (*ld_emulation->place_orphan) (s, name, constraint);
  return NULL;
  return NULL;
}
}
 
 
void
void
ldemul_add_options (int ns, char **shortopts, int nl,
ldemul_add_options (int ns, char **shortopts, int nl,
                    struct option **longopts, int nrl,
                    struct option **longopts, int nrl,
                    struct option **really_longopts)
                    struct option **really_longopts)
{
{
  if (ld_emulation->add_options)
  if (ld_emulation->add_options)
    (*ld_emulation->add_options) (ns, shortopts, nl, longopts,
    (*ld_emulation->add_options) (ns, shortopts, nl, longopts,
                                  nrl, really_longopts);
                                  nrl, really_longopts);
}
}
 
 
bfd_boolean
bfd_boolean
ldemul_handle_option (int optc)
ldemul_handle_option (int optc)
{
{
  if (ld_emulation->handle_option)
  if (ld_emulation->handle_option)
    return (*ld_emulation->handle_option) (optc);
    return (*ld_emulation->handle_option) (optc);
  return FALSE;
  return FALSE;
}
}
 
 
bfd_boolean
bfd_boolean
ldemul_parse_args (int argc, char **argv)
ldemul_parse_args (int argc, char **argv)
{
{
  /* Try and use the emulation parser if there is one.  */
  /* Try and use the emulation parser if there is one.  */
  if (ld_emulation->parse_args)
  if (ld_emulation->parse_args)
    return (*ld_emulation->parse_args) (argc, argv);
    return (*ld_emulation->parse_args) (argc, argv);
  return FALSE;
  return FALSE;
}
}
 
 
/* Let the emulation code handle an unrecognized file.  */
/* Let the emulation code handle an unrecognized file.  */
 
 
bfd_boolean
bfd_boolean
ldemul_unrecognized_file (lang_input_statement_type *entry)
ldemul_unrecognized_file (lang_input_statement_type *entry)
{
{
  if (ld_emulation->unrecognized_file)
  if (ld_emulation->unrecognized_file)
    return (*ld_emulation->unrecognized_file) (entry);
    return (*ld_emulation->unrecognized_file) (entry);
  return FALSE;
  return FALSE;
}
}
 
 
/* Let the emulation code handle a recognized file.  */
/* Let the emulation code handle a recognized file.  */
 
 
bfd_boolean
bfd_boolean
ldemul_recognized_file (lang_input_statement_type *entry)
ldemul_recognized_file (lang_input_statement_type *entry)
{
{
  if (ld_emulation->recognized_file)
  if (ld_emulation->recognized_file)
    return (*ld_emulation->recognized_file) (entry);
    return (*ld_emulation->recognized_file) (entry);
  return FALSE;
  return FALSE;
}
}
 
 
char *
char *
ldemul_choose_target (int argc, char **argv)
ldemul_choose_target (int argc, char **argv)
{
{
  return ld_emulation->choose_target (argc, argv);
  return ld_emulation->choose_target (argc, argv);
}
}
 
 
 
 
/* The default choose_target function.  */
/* The default choose_target function.  */
 
 
char *
char *
ldemul_default_target (int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED)
ldemul_default_target (int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED)
{
{
  char *from_outside = getenv (TARGET_ENVIRON);
  char *from_outside = getenv (TARGET_ENVIRON);
  if (from_outside != (char *) NULL)
  if (from_outside != (char *) NULL)
    return from_outside;
    return from_outside;
  return ld_emulation->target_name;
  return ld_emulation->target_name;
}
}
 
 
/* If the entry point was not specified as an address, then add the
/* If the entry point was not specified as an address, then add the
   symbol as undefined.  This will cause ld to extract an archive
   symbol as undefined.  This will cause ld to extract an archive
   element defining the entry if ld is linking against such an archive.
   element defining the entry if ld is linking against such an archive.
 
 
   We don't do this when generating shared libraries unless given -e
   We don't do this when generating shared libraries unless given -e
   on the command line, because most shared libs are not designed to
   on the command line, because most shared libs are not designed to
   be run as an executable.  However, some are, eg. glibc ld.so and
   be run as an executable.  However, some are, eg. glibc ld.so and
   may rely on the default linker script supplying ENTRY.  So we can't
   may rely on the default linker script supplying ENTRY.  So we can't
   remove the ENTRY from the script, but would rather not insert
   remove the ENTRY from the script, but would rather not insert
   undefined _start syms.  */
   undefined _start syms.  */
 
 
void
void
after_parse_default (void)
after_parse_default (void)
{
{
  if (entry_symbol.name != NULL
  if (entry_symbol.name != NULL
      && (link_info.executable || entry_from_cmdline))
      && (link_info.executable || entry_from_cmdline))
    {
    {
      bfd_boolean is_vma = FALSE;
      bfd_boolean is_vma = FALSE;
 
 
      if (entry_from_cmdline)
      if (entry_from_cmdline)
        {
        {
          const char *send;
          const char *send;
 
 
          bfd_scan_vma (entry_symbol.name, &send, 0);
          bfd_scan_vma (entry_symbol.name, &send, 0);
          is_vma = *send == '\0';
          is_vma = *send == '\0';
        }
        }
      if (!is_vma)
      if (!is_vma)
        ldlang_add_undef (entry_symbol.name);
        ldlang_add_undef (entry_symbol.name);
    }
    }
}
}
 
 
void
void
after_open_default (void)
after_open_default (void)
{
{
}
}
 
 
void
void
after_allocation_default (void)
after_allocation_default (void)
{
{
  lang_relax_sections (FALSE);
  lang_relax_sections (FALSE);
}
}
 
 
void
void
before_allocation_default (void)
before_allocation_default (void)
{
{
  if (!link_info.relocatable)
  if (!link_info.relocatable)
    strip_excluded_output_sections ();
    strip_excluded_output_sections ();
}
}
 
 
void
void
finish_default (void)
finish_default (void)
{
{
  if (!link_info.relocatable)
  if (!link_info.relocatable)
    _bfd_fix_excluded_sec_syms (link_info.output_bfd, &link_info);
    _bfd_fix_excluded_sec_syms (link_info.output_bfd, &link_info);
}
}
 
 
void
void
set_output_arch_default (void)
set_output_arch_default (void)
{
{
  /* Set the output architecture and machine if possible.  */
  /* Set the output architecture and machine if possible.  */
  bfd_set_arch_mach (link_info.output_bfd,
  bfd_set_arch_mach (link_info.output_bfd,
                     ldfile_output_architecture, ldfile_output_machine);
                     ldfile_output_architecture, ldfile_output_machine);
 
 
  bfd_emul_set_maxpagesize (output_target, config.maxpagesize);
  bfd_emul_set_maxpagesize (output_target, config.maxpagesize);
  bfd_emul_set_commonpagesize (output_target, config.commonpagesize);
  bfd_emul_set_commonpagesize (output_target, config.commonpagesize);
}
}
 
 
void
void
syslib_default (char *ignore ATTRIBUTE_UNUSED)
syslib_default (char *ignore ATTRIBUTE_UNUSED)
{
{
  info_msg (_("%S SYSLIB ignored\n"));
  info_msg (_("%S SYSLIB ignored\n"));
}
}
 
 
void
void
hll_default (char *ignore ATTRIBUTE_UNUSED)
hll_default (char *ignore ATTRIBUTE_UNUSED)
{
{
  info_msg (_("%S HLL ignored\n"));
  info_msg (_("%S HLL ignored\n"));
}
}
 
 
ld_emulation_xfer_type *ld_emulations[] = { EMULATION_LIST };
ld_emulation_xfer_type *ld_emulations[] = { EMULATION_LIST };
 
 
void
void
ldemul_choose_mode (char *target)
ldemul_choose_mode (char *target)
{
{
  ld_emulation_xfer_type **eptr = ld_emulations;
  ld_emulation_xfer_type **eptr = ld_emulations;
  /* Ignore "gld" prefix.  */
  /* Ignore "gld" prefix.  */
  if (target[0] == 'g' && target[1] == 'l' && target[2] == 'd')
  if (target[0] == 'g' && target[1] == 'l' && target[2] == 'd')
    target += 3;
    target += 3;
  for (; *eptr; eptr++)
  for (; *eptr; eptr++)
    {
    {
      if (strcmp (target, (*eptr)->emulation_name) == 0)
      if (strcmp (target, (*eptr)->emulation_name) == 0)
        {
        {
          ld_emulation = *eptr;
          ld_emulation = *eptr;
          return;
          return;
        }
        }
    }
    }
  einfo (_("%P: unrecognised emulation mode: %s\n"), target);
  einfo (_("%P: unrecognised emulation mode: %s\n"), target);
  einfo (_("Supported emulations: "));
  einfo (_("Supported emulations: "));
  ldemul_list_emulations (stderr);
  ldemul_list_emulations (stderr);
  einfo ("%F\n");
  einfo ("%F\n");
}
}
 
 
void
void
ldemul_list_emulations (FILE *f)
ldemul_list_emulations (FILE *f)
{
{
  ld_emulation_xfer_type **eptr = ld_emulations;
  ld_emulation_xfer_type **eptr = ld_emulations;
  bfd_boolean first = TRUE;
  bfd_boolean first = TRUE;
 
 
  for (; *eptr; eptr++)
  for (; *eptr; eptr++)
    {
    {
      if (first)
      if (first)
        first = FALSE;
        first = FALSE;
      else
      else
        fprintf (f, " ");
        fprintf (f, " ");
      fprintf (f, "%s", (*eptr)->emulation_name);
      fprintf (f, "%s", (*eptr)->emulation_name);
    }
    }
}
}
 
 
void
void
ldemul_list_emulation_options (FILE *f)
ldemul_list_emulation_options (FILE *f)
{
{
  ld_emulation_xfer_type **eptr;
  ld_emulation_xfer_type **eptr;
  int options_found = 0;
  int options_found = 0;
 
 
  for (eptr = ld_emulations; *eptr; eptr++)
  for (eptr = ld_emulations; *eptr; eptr++)
    {
    {
      ld_emulation_xfer_type *emul = *eptr;
      ld_emulation_xfer_type *emul = *eptr;
 
 
      if (emul->list_options)
      if (emul->list_options)
        {
        {
          fprintf (f, "%s: \n", emul->emulation_name);
          fprintf (f, "%s: \n", emul->emulation_name);
 
 
          emul->list_options (f);
          emul->list_options (f);
 
 
          options_found = 1;
          options_found = 1;
        }
        }
    }
    }
 
 
  if (! options_found)
  if (! options_found)
    fprintf (f, _("  no emulation specific options.\n"));
    fprintf (f, _("  no emulation specific options.\n"));
}
}
 
 
int
int
ldemul_find_potential_libraries (char *name, lang_input_statement_type *entry)
ldemul_find_potential_libraries (char *name, lang_input_statement_type *entry)
{
{
  if (ld_emulation->find_potential_libraries)
  if (ld_emulation->find_potential_libraries)
    return ld_emulation->find_potential_libraries (name, entry);
    return ld_emulation->find_potential_libraries (name, entry);
 
 
  return 0;
  return 0;
}
}
 
 
struct bfd_elf_version_expr *
struct bfd_elf_version_expr *
ldemul_new_vers_pattern (struct bfd_elf_version_expr *entry)
ldemul_new_vers_pattern (struct bfd_elf_version_expr *entry)
{
{
  if (ld_emulation->new_vers_pattern)
  if (ld_emulation->new_vers_pattern)
    entry = (*ld_emulation->new_vers_pattern) (entry);
    entry = (*ld_emulation->new_vers_pattern) (entry);
  return entry;
  return entry;
}
}
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.