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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gdb-7.1/] [gdb/] [solib-darwin.c] - Diff between revs 834 and 842

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 834 Rev 842
/* Handle Darwin shared libraries for GDB, the GNU Debugger.
/* Handle Darwin shared libraries for GDB, the GNU Debugger.
 
 
   Copyright (C) 2009, 2010 Free Software Foundation, Inc.
   Copyright (C) 2009, 2010 Free Software Foundation, Inc.
 
 
   This file is part of GDB.
   This file is part of GDB.
 
 
   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, see <http://www.gnu.org/licenses/>.  */
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 
#include "defs.h"
#include "defs.h"
 
 
#include "symtab.h"
#include "symtab.h"
#include "bfd.h"
#include "bfd.h"
#include "symfile.h"
#include "symfile.h"
#include "objfiles.h"
#include "objfiles.h"
#include "gdbcore.h"
#include "gdbcore.h"
#include "target.h"
#include "target.h"
#include "inferior.h"
#include "inferior.h"
#include "regcache.h"
#include "regcache.h"
#include "gdbthread.h"
#include "gdbthread.h"
 
 
#include "gdb_assert.h"
#include "gdb_assert.h"
 
 
#include "solist.h"
#include "solist.h"
#include "solib.h"
#include "solib.h"
#include "solib-svr4.h"
#include "solib-svr4.h"
 
 
#include "bfd-target.h"
#include "bfd-target.h"
#include "elf-bfd.h"
#include "elf-bfd.h"
#include "exec.h"
#include "exec.h"
#include "auxv.h"
#include "auxv.h"
#include "exceptions.h"
#include "exceptions.h"
#include "mach-o.h"
#include "mach-o.h"
 
 
struct gdb_dyld_image_info
struct gdb_dyld_image_info
{
{
  /* Base address (which corresponds to the Mach-O header).  */
  /* Base address (which corresponds to the Mach-O header).  */
  CORE_ADDR mach_header;
  CORE_ADDR mach_header;
  /* Image file path.  */
  /* Image file path.  */
  CORE_ADDR file_path;
  CORE_ADDR file_path;
  /* st.m_time of image file.  */
  /* st.m_time of image file.  */
  unsigned long mtime;
  unsigned long mtime;
};
};
 
 
/* Content of inferior dyld_all_image_infos structure.
/* Content of inferior dyld_all_image_infos structure.
   See /usr/include/mach-o/dyld_images.h for the documentation.  */
   See /usr/include/mach-o/dyld_images.h for the documentation.  */
struct gdb_dyld_all_image_infos
struct gdb_dyld_all_image_infos
{
{
  /* Version (1).  */
  /* Version (1).  */
  unsigned int version;
  unsigned int version;
  /* Number of images.  */
  /* Number of images.  */
  unsigned int count;
  unsigned int count;
  /* Image description.  */
  /* Image description.  */
  CORE_ADDR info;
  CORE_ADDR info;
  /* Notifier (function called when a library is added or removed).  */
  /* Notifier (function called when a library is added or removed).  */
  CORE_ADDR notifier;
  CORE_ADDR notifier;
};
};
 
 
/* Current all_image_infos version.  */
/* Current all_image_infos version.  */
#define DYLD_VERSION_MIN 1
#define DYLD_VERSION_MIN 1
#define DYLD_VERSION_MAX 7
#define DYLD_VERSION_MAX 7
 
 
/* Address of structure dyld_all_image_infos in inferior.  */
/* Address of structure dyld_all_image_infos in inferior.  */
static CORE_ADDR dyld_all_image_addr;
static CORE_ADDR dyld_all_image_addr;
 
 
/* Gdb copy of dyld_all_info_infos.  */
/* Gdb copy of dyld_all_info_infos.  */
static struct gdb_dyld_all_image_infos dyld_all_image;
static struct gdb_dyld_all_image_infos dyld_all_image;
 
 
/* Return non-zero if the version in dyld_all_image is known.  */
/* Return non-zero if the version in dyld_all_image is known.  */
 
 
static int
static int
darwin_dyld_version_ok (void)
darwin_dyld_version_ok (void)
{
{
  return dyld_all_image.version >= DYLD_VERSION_MIN
  return dyld_all_image.version >= DYLD_VERSION_MIN
    && dyld_all_image.version <= DYLD_VERSION_MAX;
    && dyld_all_image.version <= DYLD_VERSION_MAX;
}
}
 
 
/* Read dyld_all_image from inferior.  */
/* Read dyld_all_image from inferior.  */
 
 
static void
static void
darwin_load_image_infos (void)
darwin_load_image_infos (void)
{
{
  gdb_byte buf[24];
  gdb_byte buf[24];
  enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch);
  enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch);
  struct type *ptr_type = builtin_type (target_gdbarch)->builtin_data_ptr;
  struct type *ptr_type = builtin_type (target_gdbarch)->builtin_data_ptr;
  int len;
  int len;
 
 
  /* If the structure address is not known, don't continue.  */
  /* If the structure address is not known, don't continue.  */
  if (dyld_all_image_addr == 0)
  if (dyld_all_image_addr == 0)
    return;
    return;
 
 
  /* The structure has 4 fields: version (4 bytes), count (4 bytes),
  /* The structure has 4 fields: version (4 bytes), count (4 bytes),
     info (pointer) and notifier (pointer).  */
     info (pointer) and notifier (pointer).  */
  len = 4 + 4 + 2 * ptr_type->length;
  len = 4 + 4 + 2 * ptr_type->length;
  gdb_assert (len <= sizeof (buf));
  gdb_assert (len <= sizeof (buf));
  memset (&dyld_all_image, 0, sizeof (dyld_all_image));
  memset (&dyld_all_image, 0, sizeof (dyld_all_image));
 
 
  /* Read structure raw bytes from target.  */
  /* Read structure raw bytes from target.  */
  if (target_read_memory (dyld_all_image_addr, buf, len))
  if (target_read_memory (dyld_all_image_addr, buf, len))
    return;
    return;
 
 
  /* Extract the fields.  */
  /* Extract the fields.  */
  dyld_all_image.version = extract_unsigned_integer (buf, 4, byte_order);
  dyld_all_image.version = extract_unsigned_integer (buf, 4, byte_order);
  if (!darwin_dyld_version_ok ())
  if (!darwin_dyld_version_ok ())
    return;
    return;
 
 
  dyld_all_image.count = extract_unsigned_integer (buf + 4, 4, byte_order);
  dyld_all_image.count = extract_unsigned_integer (buf + 4, 4, byte_order);
  dyld_all_image.info = extract_typed_address (buf + 8, ptr_type);
  dyld_all_image.info = extract_typed_address (buf + 8, ptr_type);
  dyld_all_image.notifier = extract_typed_address
  dyld_all_image.notifier = extract_typed_address
    (buf + 8 + ptr_type->length, ptr_type);
    (buf + 8 + ptr_type->length, ptr_type);
}
}
 
 
/* Link map info to include in an allocated so_list entry.  */
/* Link map info to include in an allocated so_list entry.  */
 
 
struct lm_info
struct lm_info
{
{
  /* The target location of lm.  */
  /* The target location of lm.  */
  CORE_ADDR lm_addr;
  CORE_ADDR lm_addr;
};
};
 
 
struct darwin_so_list
struct darwin_so_list
{
{
  /* Common field.  */
  /* Common field.  */
  struct so_list sl;
  struct so_list sl;
  /* Darwin specific data.  */
  /* Darwin specific data.  */
  struct lm_info li;
  struct lm_info li;
};
};
 
 
/* Lookup the value for a specific symbol.  */
/* Lookup the value for a specific symbol.  */
 
 
static CORE_ADDR
static CORE_ADDR
lookup_symbol_from_bfd (bfd *abfd, char *symname)
lookup_symbol_from_bfd (bfd *abfd, char *symname)
{
{
  long storage_needed;
  long storage_needed;
  asymbol **symbol_table;
  asymbol **symbol_table;
  unsigned int number_of_symbols;
  unsigned int number_of_symbols;
  unsigned int i;
  unsigned int i;
  CORE_ADDR symaddr = 0;
  CORE_ADDR symaddr = 0;
 
 
  storage_needed = bfd_get_symtab_upper_bound (abfd);
  storage_needed = bfd_get_symtab_upper_bound (abfd);
 
 
  if (storage_needed <= 0)
  if (storage_needed <= 0)
    return 0;
    return 0;
 
 
  symbol_table = (asymbol **) xmalloc (storage_needed);
  symbol_table = (asymbol **) xmalloc (storage_needed);
  number_of_symbols = bfd_canonicalize_symtab (abfd, symbol_table);
  number_of_symbols = bfd_canonicalize_symtab (abfd, symbol_table);
 
 
  for (i = 0; i < number_of_symbols; i++)
  for (i = 0; i < number_of_symbols; i++)
    {
    {
      asymbol *sym = symbol_table[i];
      asymbol *sym = symbol_table[i];
      if (strcmp (sym->name, symname) == 0
      if (strcmp (sym->name, symname) == 0
          && (sym->section->flags & (SEC_CODE | SEC_DATA)) != 0)
          && (sym->section->flags & (SEC_CODE | SEC_DATA)) != 0)
        {
        {
          /* BFD symbols are section relative.  */
          /* BFD symbols are section relative.  */
          symaddr = sym->value + sym->section->vma;
          symaddr = sym->value + sym->section->vma;
          break;
          break;
        }
        }
    }
    }
  xfree (symbol_table);
  xfree (symbol_table);
 
 
  return symaddr;
  return symaddr;
}
}
 
 
/* Return program interpreter string.  */
/* Return program interpreter string.  */
 
 
static gdb_byte *
static gdb_byte *
find_program_interpreter (void)
find_program_interpreter (void)
{
{
  gdb_byte *buf = NULL;
  gdb_byte *buf = NULL;
 
 
  /* If we have an exec_bfd, get the interpreter from the load commands.  */
  /* If we have an exec_bfd, get the interpreter from the load commands.  */
  if (exec_bfd)
  if (exec_bfd)
    {
    {
      bfd_mach_o_load_command *cmd;
      bfd_mach_o_load_command *cmd;
 
 
      if (bfd_mach_o_lookup_command (exec_bfd,
      if (bfd_mach_o_lookup_command (exec_bfd,
                                     BFD_MACH_O_LC_LOAD_DYLINKER, &cmd) == 1)
                                     BFD_MACH_O_LC_LOAD_DYLINKER, &cmd) == 1)
        return cmd->command.dylinker.name_str;
        return cmd->command.dylinker.name_str;
    }
    }
 
 
  /* If we didn't find it, read from memory.
  /* If we didn't find it, read from memory.
     FIXME: todo.  */
     FIXME: todo.  */
  return buf;
  return buf;
}
}
 
 
/*  Not used.  I don't see how the main symbol file can be found: the
/*  Not used.  I don't see how the main symbol file can be found: the
    interpreter name is needed and it is known from the executable file.
    interpreter name is needed and it is known from the executable file.
    Note that darwin-nat.c implements pid_to_exec_file.  */
    Note that darwin-nat.c implements pid_to_exec_file.  */
 
 
static int
static int
open_symbol_file_object (void *from_ttyp)
open_symbol_file_object (void *from_ttyp)
{
{
  return 0;
  return 0;
}
}
 
 
/* Build a list of currently loaded shared objects.  See solib-svr4.c  */
/* Build a list of currently loaded shared objects.  See solib-svr4.c  */
 
 
static struct so_list *
static struct so_list *
darwin_current_sos (void)
darwin_current_sos (void)
{
{
  struct type *ptr_type = builtin_type (target_gdbarch)->builtin_data_ptr;
  struct type *ptr_type = builtin_type (target_gdbarch)->builtin_data_ptr;
  int ptr_len = TYPE_LENGTH (ptr_type);
  int ptr_len = TYPE_LENGTH (ptr_type);
  unsigned int image_info_size;
  unsigned int image_info_size;
  CORE_ADDR lm;
  CORE_ADDR lm;
  struct so_list *head = NULL;
  struct so_list *head = NULL;
  struct so_list *tail = NULL;
  struct so_list *tail = NULL;
  int i;
  int i;
 
 
  /* Be sure image infos are loaded.  */
  /* Be sure image infos are loaded.  */
  darwin_load_image_infos ();
  darwin_load_image_infos ();
 
 
  if (!darwin_dyld_version_ok ())
  if (!darwin_dyld_version_ok ())
    return NULL;
    return NULL;
 
 
  image_info_size = ptr_len * 3;
  image_info_size = ptr_len * 3;
 
 
  /* Read infos for each solib.
  /* Read infos for each solib.
     This first entry is ignored as this is the executable itself.  */
     This first entry is ignored as this is the executable itself.  */
  for (i = 1; i < dyld_all_image.count; i++)
  for (i = 1; i < dyld_all_image.count; i++)
    {
    {
      CORE_ADDR info = dyld_all_image.info + i * image_info_size;
      CORE_ADDR info = dyld_all_image.info + i * image_info_size;
      char buf[image_info_size];
      char buf[image_info_size];
      CORE_ADDR load_addr;
      CORE_ADDR load_addr;
      CORE_ADDR path_addr;
      CORE_ADDR path_addr;
      char *file_path;
      char *file_path;
      int errcode;
      int errcode;
      struct darwin_so_list *dnew;
      struct darwin_so_list *dnew;
      struct so_list *new;
      struct so_list *new;
      struct cleanup *old_chain;
      struct cleanup *old_chain;
 
 
      /* Read image info from inferior.  */
      /* Read image info from inferior.  */
      if (target_read_memory (info, buf, image_info_size))
      if (target_read_memory (info, buf, image_info_size))
        break;
        break;
 
 
      load_addr = extract_typed_address (buf, ptr_type);
      load_addr = extract_typed_address (buf, ptr_type);
      path_addr = extract_typed_address (buf + ptr_len, ptr_type);
      path_addr = extract_typed_address (buf + ptr_len, ptr_type);
 
 
      target_read_string (path_addr, &file_path,
      target_read_string (path_addr, &file_path,
                          SO_NAME_MAX_PATH_SIZE - 1, &errcode);
                          SO_NAME_MAX_PATH_SIZE - 1, &errcode);
      if (errcode)
      if (errcode)
        break;
        break;
 
 
      /* Create and fill the new so_list element.  */
      /* Create and fill the new so_list element.  */
      dnew = XZALLOC (struct darwin_so_list);
      dnew = XZALLOC (struct darwin_so_list);
      new = &dnew->sl;
      new = &dnew->sl;
      old_chain = make_cleanup (xfree, dnew);
      old_chain = make_cleanup (xfree, dnew);
 
 
      new->lm_info = &dnew->li;
      new->lm_info = &dnew->li;
 
 
      strncpy (new->so_name, file_path, SO_NAME_MAX_PATH_SIZE - 1);
      strncpy (new->so_name, file_path, SO_NAME_MAX_PATH_SIZE - 1);
      new->so_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0';
      new->so_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0';
      strcpy (new->so_original_name, new->so_name);
      strcpy (new->so_original_name, new->so_name);
      xfree (file_path);
      xfree (file_path);
      new->lm_info->lm_addr = load_addr;
      new->lm_info->lm_addr = load_addr;
 
 
      if (head == NULL)
      if (head == NULL)
        head = new;
        head = new;
      else
      else
        tail->next = new;
        tail->next = new;
      tail = new;
      tail = new;
 
 
      discard_cleanups (old_chain);
      discard_cleanups (old_chain);
    }
    }
 
 
  return head;
  return head;
}
}
 
 
/* Return 1 if PC lies in the dynamic symbol resolution code of the
/* Return 1 if PC lies in the dynamic symbol resolution code of the
   run time loader.  */
   run time loader.  */
 
 
int
int
darwin_in_dynsym_resolve_code (CORE_ADDR pc)
darwin_in_dynsym_resolve_code (CORE_ADDR pc)
{
{
  return 0;
  return 0;
}
}
 
 
 
 
/* No special symbol handling.  */
/* No special symbol handling.  */
 
 
static void
static void
darwin_special_symbol_handling (void)
darwin_special_symbol_handling (void)
{
{
}
}
 
 
/* Shared library startup support.  See documentation in solib-svr4.c  */
/* Shared library startup support.  See documentation in solib-svr4.c  */
 
 
static void
static void
darwin_solib_create_inferior_hook (int from_tty)
darwin_solib_create_inferior_hook (int from_tty)
{
{
  struct minimal_symbol *msymbol;
  struct minimal_symbol *msymbol;
  char **bkpt_namep;
  char **bkpt_namep;
  asection *interp_sect;
  asection *interp_sect;
  gdb_byte *interp_name;
  gdb_byte *interp_name;
  CORE_ADDR sym_addr;
  CORE_ADDR sym_addr;
  CORE_ADDR load_addr = 0;
  CORE_ADDR load_addr = 0;
  int load_addr_found = 0;
  int load_addr_found = 0;
  int loader_found_in_list = 0;
  int loader_found_in_list = 0;
  struct so_list *so;
  struct so_list *so;
  bfd *dyld_bfd = NULL;
  bfd *dyld_bfd = NULL;
  struct inferior *inf = current_inferior ();
  struct inferior *inf = current_inferior ();
 
 
  /* First, remove all the solib event breakpoints.  Their addresses
  /* First, remove all the solib event breakpoints.  Their addresses
     may have changed since the last time we ran the program.  */
     may have changed since the last time we ran the program.  */
  remove_solib_event_breakpoints ();
  remove_solib_event_breakpoints ();
 
 
  /* Find the program interpreter.  */
  /* Find the program interpreter.  */
  interp_name = find_program_interpreter ();
  interp_name = find_program_interpreter ();
  if (!interp_name)
  if (!interp_name)
    return;
    return;
 
 
  /* Create a bfd for the interpreter.  */
  /* Create a bfd for the interpreter.  */
  sym_addr = 0;
  sym_addr = 0;
  dyld_bfd = bfd_openr (interp_name, gnutarget);
  dyld_bfd = bfd_openr (interp_name, gnutarget);
  if (dyld_bfd)
  if (dyld_bfd)
    {
    {
      bfd *sub;
      bfd *sub;
      sub = bfd_mach_o_fat_extract (dyld_bfd, bfd_object,
      sub = bfd_mach_o_fat_extract (dyld_bfd, bfd_object,
                                    gdbarch_bfd_arch_info (target_gdbarch));
                                    gdbarch_bfd_arch_info (target_gdbarch));
      if (sub)
      if (sub)
        dyld_bfd = sub;
        dyld_bfd = sub;
      else
      else
        {
        {
          bfd_close (dyld_bfd);
          bfd_close (dyld_bfd);
          dyld_bfd = NULL;
          dyld_bfd = NULL;
        }
        }
    }
    }
  if (!dyld_bfd)
  if (!dyld_bfd)
    return;
    return;
 
 
  if (!inf->attach_flag)
  if (!inf->attach_flag)
    {
    {
      /* We find the dynamic linker's base address by examining
      /* We find the dynamic linker's base address by examining
         the current pc (which should point at the entry point for the
         the current pc (which should point at the entry point for the
         dynamic linker) and subtracting the offset of the entry point.  */
         dynamic linker) and subtracting the offset of the entry point.  */
      load_addr = (regcache_read_pc (get_current_regcache ())
      load_addr = (regcache_read_pc (get_current_regcache ())
                   - bfd_get_start_address (dyld_bfd));
                   - bfd_get_start_address (dyld_bfd));
    }
    }
  else
  else
    {
    {
      /* FIXME: todo.
      /* FIXME: todo.
         Get address of __DATA.__dyld in exec_bfd, read address at offset 0.
         Get address of __DATA.__dyld in exec_bfd, read address at offset 0.
      */
      */
      return;
      return;
    }
    }
 
 
  /* Now try to set a breakpoint in the dynamic linker.  */
  /* Now try to set a breakpoint in the dynamic linker.  */
  dyld_all_image_addr =
  dyld_all_image_addr =
    lookup_symbol_from_bfd (dyld_bfd, "_dyld_all_image_infos");
    lookup_symbol_from_bfd (dyld_bfd, "_dyld_all_image_infos");
 
 
  bfd_close (dyld_bfd);
  bfd_close (dyld_bfd);
 
 
  if (dyld_all_image_addr == 0)
  if (dyld_all_image_addr == 0)
    return;
    return;
 
 
  dyld_all_image_addr += load_addr;
  dyld_all_image_addr += load_addr;
 
 
  darwin_load_image_infos ();
  darwin_load_image_infos ();
 
 
  if (darwin_dyld_version_ok ())
  if (darwin_dyld_version_ok ())
    create_solib_event_breakpoint (target_gdbarch, dyld_all_image.notifier);
    create_solib_event_breakpoint (target_gdbarch, dyld_all_image.notifier);
}
}
 
 
static void
static void
darwin_clear_solib (void)
darwin_clear_solib (void)
{
{
  dyld_all_image_addr = 0;
  dyld_all_image_addr = 0;
  dyld_all_image.version = 0;
  dyld_all_image.version = 0;
}
}
 
 
static void
static void
darwin_free_so (struct so_list *so)
darwin_free_so (struct so_list *so)
{
{
}
}
 
 
/* The section table is built from bfd sections using bfd VMAs.
/* The section table is built from bfd sections using bfd VMAs.
   Relocate these VMAs according to solib info.  */
   Relocate these VMAs according to solib info.  */
 
 
static void
static void
darwin_relocate_section_addresses (struct so_list *so,
darwin_relocate_section_addresses (struct so_list *so,
                                   struct target_section *sec)
                                   struct target_section *sec)
{
{
  sec->addr += so->lm_info->lm_addr;
  sec->addr += so->lm_info->lm_addr;
  sec->endaddr += so->lm_info->lm_addr;
  sec->endaddr += so->lm_info->lm_addr;
 
 
  /* Best effort to set addr_high/addr_low.  This is used only by
  /* Best effort to set addr_high/addr_low.  This is used only by
     'info sharedlibary'.  */
     'info sharedlibary'.  */
  if (so->addr_high == 0)
  if (so->addr_high == 0)
    {
    {
      so->addr_low = sec->addr;
      so->addr_low = sec->addr;
      so->addr_high = sec->endaddr;
      so->addr_high = sec->endaddr;
    }
    }
  if (sec->endaddr > so->addr_high)
  if (sec->endaddr > so->addr_high)
    so->addr_high = sec->endaddr;
    so->addr_high = sec->endaddr;
  if (sec->addr < so->addr_low)
  if (sec->addr < so->addr_low)
    so->addr_low = sec->addr;
    so->addr_low = sec->addr;
}
}


static struct symbol *
static struct symbol *
darwin_lookup_lib_symbol (const struct objfile *objfile,
darwin_lookup_lib_symbol (const struct objfile *objfile,
                          const char *name,
                          const char *name,
                          const char *linkage_name,
                          const char *linkage_name,
                          const domain_enum domain)
                          const domain_enum domain)
{
{
  return NULL;
  return NULL;
}
}
 
 
static bfd *
static bfd *
darwin_bfd_open (char *pathname)
darwin_bfd_open (char *pathname)
{
{
  char *found_pathname;
  char *found_pathname;
  int found_file;
  int found_file;
  bfd *abfd;
  bfd *abfd;
  bfd *res;
  bfd *res;
 
 
  /* Search for shared library file.  */
  /* Search for shared library file.  */
  found_pathname = solib_find (pathname, &found_file);
  found_pathname = solib_find (pathname, &found_file);
  if (found_pathname == NULL)
  if (found_pathname == NULL)
    perror_with_name (pathname);
    perror_with_name (pathname);
 
 
  /* Open bfd for shared library.  */
  /* Open bfd for shared library.  */
  abfd = solib_bfd_fopen (found_pathname, found_file);
  abfd = solib_bfd_fopen (found_pathname, found_file);
 
 
  res = bfd_mach_o_fat_extract (abfd, bfd_object,
  res = bfd_mach_o_fat_extract (abfd, bfd_object,
                                gdbarch_bfd_arch_info (target_gdbarch));
                                gdbarch_bfd_arch_info (target_gdbarch));
  if (!res)
  if (!res)
    {
    {
      bfd_close (abfd);
      bfd_close (abfd);
      make_cleanup (xfree, found_pathname);
      make_cleanup (xfree, found_pathname);
      error (_("`%s': not a shared-library: %s"),
      error (_("`%s': not a shared-library: %s"),
             found_pathname, bfd_errmsg (bfd_get_error ()));
             found_pathname, bfd_errmsg (bfd_get_error ()));
    }
    }
  return res;
  return res;
}
}
 
 
struct target_so_ops darwin_so_ops;
struct target_so_ops darwin_so_ops;
 
 
void
void
_initialize_darwin_solib (void)
_initialize_darwin_solib (void)
{
{
  darwin_so_ops.relocate_section_addresses = darwin_relocate_section_addresses;
  darwin_so_ops.relocate_section_addresses = darwin_relocate_section_addresses;
  darwin_so_ops.free_so = darwin_free_so;
  darwin_so_ops.free_so = darwin_free_so;
  darwin_so_ops.clear_solib = darwin_clear_solib;
  darwin_so_ops.clear_solib = darwin_clear_solib;
  darwin_so_ops.solib_create_inferior_hook = darwin_solib_create_inferior_hook;
  darwin_so_ops.solib_create_inferior_hook = darwin_solib_create_inferior_hook;
  darwin_so_ops.special_symbol_handling = darwin_special_symbol_handling;
  darwin_so_ops.special_symbol_handling = darwin_special_symbol_handling;
  darwin_so_ops.current_sos = darwin_current_sos;
  darwin_so_ops.current_sos = darwin_current_sos;
  darwin_so_ops.open_symbol_file_object = open_symbol_file_object;
  darwin_so_ops.open_symbol_file_object = open_symbol_file_object;
  darwin_so_ops.in_dynsym_resolve_code = darwin_in_dynsym_resolve_code;
  darwin_so_ops.in_dynsym_resolve_code = darwin_in_dynsym_resolve_code;
  darwin_so_ops.lookup_lib_global_symbol = darwin_lookup_lib_symbol;
  darwin_so_ops.lookup_lib_global_symbol = darwin_lookup_lib_symbol;
  darwin_so_ops.bfd_open = darwin_bfd_open;
  darwin_so_ops.bfd_open = darwin_bfd_open;
}
}
 
 

powered by: WebSVN 2.1.0

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