2009-02-04 16:47:56 +08:00
|
|
|
|
/* Handle Darwin shared libraries for GDB, the GNU Debugger.
|
|
|
|
|
|
2013-01-01 14:33:28 +08:00
|
|
|
|
Copyright (C) 2009-2013 Free Software Foundation, Inc.
|
2009-02-04 16:47:56 +08:00
|
|
|
|
|
|
|
|
|
This file is part of GDB.
|
|
|
|
|
|
|
|
|
|
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, see <http://www.gnu.org/licenses/>. */
|
|
|
|
|
|
|
|
|
|
#include "defs.h"
|
|
|
|
|
|
|
|
|
|
#include "symtab.h"
|
|
|
|
|
#include "bfd.h"
|
|
|
|
|
#include "symfile.h"
|
|
|
|
|
#include "objfiles.h"
|
|
|
|
|
#include "gdbcore.h"
|
|
|
|
|
#include "target.h"
|
|
|
|
|
#include "inferior.h"
|
2009-05-05 21:24:49 +08:00
|
|
|
|
#include "regcache.h"
|
2009-02-04 16:47:56 +08:00
|
|
|
|
#include "gdbthread.h"
|
* dwarf2read.c (try_open_dwo_file): Use gdb_bfd_ref and
gdb_bfd_unref.
(free_dwo_file): Use gdb_bfd_unref.
* cli/cli-dump.c: Include gdb_bfd.h.
(bfd_openw_with_cleanup): Use gdb_bfd_ref.
(bfd_openr_with_cleanup): Likewise.
* windows-nat.c (windows_make_so): Use gdb_bfd_ref,
gdb_bfd_unref.
* utils.c: Include gdb_bfd.h.
(do_bfd_close_cleanup): Use gdb_bfd_unref.
* symfile.c: Include gdb_bfd.h.
(separate_debug_file_exists): Use gdb_bfd_unref.
(bfd_open_maybe_remote): Use gdb_bfd_ref.
(symfile_bfd_open): Use gdb_bfd_ref, gdb_bfd_unref.
(generic_load): Use gdb_bfd_ref.
(reread_symbols): Use gdb_bfd_unref.
* symfile-mem.c: Include gdb_bfd.h.
(symbol_file_add_from_memory): Use make_cleanup_bfd_close.
* spu-linux-nat.c (spu_bfd_open): Use gdb_bfd_ref, gdb_bfd_unref.
* solib.c: Include gdb_bfd.h.
(solib_bfd_fopen): Use gdb_bfd_ref.
(solib_bfd_open): Use gdb_bfd_unref.
(free_so_symbols): Use gdb_bfd_unref.
(reload_shared_libraries_1): Use gdb_bfd_unref.
* solib-spu.c: Include gdb_bfd.h.
(spu_bfd_fopen): Use gdb_bfd_ref, gdb_bfd_unref.
* solib-pa64.c (pa64_solib_create_inferior_hook): Use gdb_bfd_ref,
gdb_bfd_unref.
* solib-frv.c: Include gdb_bfd.h.
(enable_break2): Use gdb_bfd_unref.
* solib-dsbt.c: Include gdb_bfd.h.
(enable_break2): Use gdb_bfd_unref.
* solib-darwin.c: Include gdb_bfd.h.
(darwin_solib_get_all_image_info_addr_at_init): Use gdb_bfd_ref,
gdb_bfd_unref.
(darwin_bfd_open): Use gdb_bfd_unref.
* rs6000-nat.c (add_vmap): Use gdb_bfd_ref, gdb_bfd_unref.
* remote-mips.c: Include gdb_bfd.h.
(mips_load_srec): Use gdb_bfd_ref.
(pmon_load_fast): Use gdb_bfd_ref.
* remote-m32r-sdi.c: Include gdb_bfd.h.
(m32r_load): Use gdb_bfd_ref.
* record.c: Include gdb_bfd.h.
(record_save_cleanups): Use gdb_bfd_unref.
(cmd_record_save): Use gdb_bfd_unref.
* procfs.c (insert_dbx_link_bpt_in_file): Use gdb_bfd_ref,
gdb_bfd_unref.
* objfiles.h (gdb_bfd_close_or_warn): Remove.
(gdb_bfd_ref, gdb_bfd_unref): Move to gdb_bfd.h.
* objfiles.c: Include gdb_bfd.h.
(free_objfile): Use gdb_bfd_unref.
(gdb_bfd_close_or_warn, gdb_bfd_ref, gdb_bfd_unref): Move to
gdb_bfd.c.
* machoread.c (macho_add_oso_symfile): Use gdb_bfd_unref.
(macho_symfile_read_all_oso): Use gdb_bfd_ref, gdb_bfd_unref.
(macho_check_dsym): Likewise.
* m32r-rom.c: Include gdb_bfd.h.
(m32r_load): Use gdb_bfd_ref.
(m32r_upload_command): Use gdb_bfd_ref.
* jit.c: Include gdb_bfd.h.
(jit_bfd_try_read_symtab): Use gdb_bfd_ref, gdb_bfd_unref.
* gdb_bfd.h: New file.
* gdb_bfd.c: New file.
* gcore.c: Include gdb_bfd.h.
(create_gcore_bfd): Use gdb_bfd_ref.
(do_bfd_delete_cleanup): Use gdb_bfd_unref.
(gcore_command): Use gdb_bfd_unref.
* exec.c: Include gdb_bfd.h.
(exec_close): Use gdb_bfd_unref.
(exec_close_1): Use gdb_bfd_unref.
(exec_file_attach): Use gdb_bfd_ref.
* elfread.c: Include gdb_bfd.h.
(build_id_verify): Use gdb_bfd_unref.
* dsrec.c: Include gdb_bfd.h.
(load_srec): Use gdb_bfd_ref.
* corelow.c: Include gdb_bfd.h.
(core_close): Use gdb_bfd_unref.
(core_open): Use gdb_bfd_ref.
* bfd-target.c: Include gdb_bfd.h.
(target_bfd_xclose): Use gdb_bfd_unref.
(target_bfd_reopen): Use gdb_bfd_ref.
* Makefile.in (SFILES): Add gdb_bfd.c.
(HFILES_NO_SRCDIR): Add gdb_bfd.h.
(COMMON_OBS): Add gdb_bfd.o.
2012-07-19 03:33:34 +08:00
|
|
|
|
#include "gdb_bfd.h"
|
2009-02-04 16:47:56 +08:00
|
|
|
|
|
|
|
|
|
#include "gdb_assert.h"
|
|
|
|
|
|
|
|
|
|
#include "solist.h"
|
|
|
|
|
#include "solib.h"
|
|
|
|
|
#include "solib-svr4.h"
|
|
|
|
|
|
|
|
|
|
#include "bfd-target.h"
|
|
|
|
|
#include "elf-bfd.h"
|
|
|
|
|
#include "exec.h"
|
|
|
|
|
#include "auxv.h"
|
|
|
|
|
#include "exceptions.h"
|
|
|
|
|
#include "mach-o.h"
|
2012-02-18 00:37:43 +08:00
|
|
|
|
#include "mach-o/external.h"
|
2009-02-04 16:47:56 +08:00
|
|
|
|
|
|
|
|
|
struct gdb_dyld_image_info
|
|
|
|
|
{
|
|
|
|
|
/* Base address (which corresponds to the Mach-O header). */
|
|
|
|
|
CORE_ADDR mach_header;
|
|
|
|
|
/* Image file path. */
|
|
|
|
|
CORE_ADDR file_path;
|
|
|
|
|
/* st.m_time of image file. */
|
|
|
|
|
unsigned long mtime;
|
|
|
|
|
};
|
|
|
|
|
|
2009-10-13 18:31:40 +08:00
|
|
|
|
/* Content of inferior dyld_all_image_infos structure.
|
|
|
|
|
See /usr/include/mach-o/dyld_images.h for the documentation. */
|
2009-02-04 16:47:56 +08:00
|
|
|
|
struct gdb_dyld_all_image_infos
|
|
|
|
|
{
|
|
|
|
|
/* Version (1). */
|
|
|
|
|
unsigned int version;
|
|
|
|
|
/* Number of images. */
|
|
|
|
|
unsigned int count;
|
|
|
|
|
/* Image description. */
|
|
|
|
|
CORE_ADDR info;
|
|
|
|
|
/* Notifier (function called when a library is added or removed). */
|
|
|
|
|
CORE_ADDR notifier;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/* Current all_image_infos version. */
|
2009-10-13 18:31:40 +08:00
|
|
|
|
#define DYLD_VERSION_MIN 1
|
2011-09-27 23:30:18 +08:00
|
|
|
|
#define DYLD_VERSION_MAX 12
|
2009-02-04 16:47:56 +08:00
|
|
|
|
|
2012-05-29 20:59:53 +08:00
|
|
|
|
/* Per PSPACE specific data. */
|
|
|
|
|
struct darwin_info
|
|
|
|
|
{
|
|
|
|
|
/* Address of structure dyld_all_image_infos in inferior. */
|
|
|
|
|
CORE_ADDR all_image_addr;
|
|
|
|
|
|
|
|
|
|
/* Gdb copy of dyld_all_info_infos. */
|
|
|
|
|
struct gdb_dyld_all_image_infos all_image;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/* Per-program-space data key. */
|
|
|
|
|
static const struct program_space_data *solib_darwin_pspace_data;
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
darwin_pspace_data_cleanup (struct program_space *pspace, void *arg)
|
|
|
|
|
{
|
|
|
|
|
struct darwin_info *info;
|
|
|
|
|
|
|
|
|
|
info = program_space_data (pspace, solib_darwin_pspace_data);
|
|
|
|
|
xfree (info);
|
|
|
|
|
}
|
2009-02-04 16:47:56 +08:00
|
|
|
|
|
2012-05-29 20:59:53 +08:00
|
|
|
|
/* Get the current darwin data. If none is found yet, add it now. This
|
|
|
|
|
function always returns a valid object. */
|
|
|
|
|
|
|
|
|
|
static struct darwin_info *
|
|
|
|
|
get_darwin_info (void)
|
|
|
|
|
{
|
|
|
|
|
struct darwin_info *info;
|
|
|
|
|
|
|
|
|
|
info = program_space_data (current_program_space, solib_darwin_pspace_data);
|
|
|
|
|
if (info != NULL)
|
|
|
|
|
return info;
|
|
|
|
|
|
|
|
|
|
info = XZALLOC (struct darwin_info);
|
|
|
|
|
set_program_space_data (current_program_space,
|
|
|
|
|
solib_darwin_pspace_data, info);
|
|
|
|
|
return info;
|
|
|
|
|
}
|
2009-02-04 16:47:56 +08:00
|
|
|
|
|
2009-10-13 18:31:40 +08:00
|
|
|
|
/* Return non-zero if the version in dyld_all_image is known. */
|
|
|
|
|
|
|
|
|
|
static int
|
2012-05-29 20:59:53 +08:00
|
|
|
|
darwin_dyld_version_ok (const struct darwin_info *info)
|
2009-10-13 18:31:40 +08:00
|
|
|
|
{
|
2012-05-29 20:59:53 +08:00
|
|
|
|
return info->all_image.version >= DYLD_VERSION_MIN
|
|
|
|
|
&& info->all_image.version <= DYLD_VERSION_MAX;
|
2009-10-13 18:31:40 +08:00
|
|
|
|
}
|
|
|
|
|
|
2009-02-04 16:47:56 +08:00
|
|
|
|
/* Read dyld_all_image from inferior. */
|
2009-10-13 18:31:40 +08:00
|
|
|
|
|
2009-02-04 16:47:56 +08:00
|
|
|
|
static void
|
2012-05-29 20:59:53 +08:00
|
|
|
|
darwin_load_image_infos (struct darwin_info *info)
|
2009-02-04 16:47:56 +08:00
|
|
|
|
{
|
|
|
|
|
gdb_byte buf[24];
|
* gdbarch.sh (target_gdbarch): Remove macro.
(get_target_gdbarch): Rename to target_gdbarch.
* gdbarch.c, gdbarch.h: Rebuild.
* ada-tasks.c, aix-thread.c, amd64-linux-nat.c, arch-utils.c,
arm-tdep.c, auxv.c, breakpoint.c, bsd-uthread.c, corefile.c,
darwin-nat-info.c, dcache.c, dsrec.c, exec.c, fbsd-nat.c,
filesystem.c, gcore.c, gnu-nat.c, i386-darwin-nat.c, i386-nat.c,
ia64-vms-tdep.c, inf-ptrace.c, infcmd.c, jit.c, linux-nat.c,
linux-tdep.c, linux-thread-db.c, m32r-rom.c, memattr.c,
mep-tdep.c, microblaze-tdep.c, mips-linux-nat.c,
mips-linux-tdep.c, mips-tdep.c, monitor.c, moxie-tdep.c,
nto-procfs.c, nto-tdep.c, ppc-linux-nat.c, proc-service.c,
procfs.c, progspace.c, ravenscar-thread.c, record.c,
remote-m32r-sdi.c, remote-mips.c, remote-sim.c, remote.c,
rl78-tdep.c, rs6000-nat.c, rx-tdep.c, s390-nat.c, sol-thread.c,
solib-darwin.c, solib-dsbt.c, solib-frv.c, solib-ia64-hpux.c,
solib-irix.c, solib-pa64.c, solib-som.c, solib-spu.c,
solib-sunos.c, solib-svr4.c, solib.c, spu-linux-nat.c,
spu-multiarch.c, spu-tdep.c, symfile-mem.c, symfile.c, symtab.c,
target-descriptions.c, target.c, target.h, tracepoint.c,
windows-nat.c, windows-tdep.c, xcoffsolib.c, cli/cli-dump.c,
common/agent.c, mi/mi-interp.c, python/py-finishbreakpoint.c,
python/py-inferior.c, python/python.c: Update.
2012-11-10 03:58:03 +08:00
|
|
|
|
enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
|
|
|
|
|
struct type *ptr_type = builtin_type (target_gdbarch ())->builtin_data_ptr;
|
2009-02-04 16:47:56 +08:00
|
|
|
|
int len;
|
|
|
|
|
|
|
|
|
|
/* If the structure address is not known, don't continue. */
|
2012-05-29 20:59:53 +08:00
|
|
|
|
if (info->all_image_addr == 0)
|
2009-02-04 16:47:56 +08:00
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
/* The structure has 4 fields: version (4 bytes), count (4 bytes),
|
|
|
|
|
info (pointer) and notifier (pointer). */
|
|
|
|
|
len = 4 + 4 + 2 * ptr_type->length;
|
|
|
|
|
gdb_assert (len <= sizeof (buf));
|
2012-05-29 20:59:53 +08:00
|
|
|
|
memset (&info->all_image, 0, sizeof (info->all_image));
|
2009-02-04 16:47:56 +08:00
|
|
|
|
|
|
|
|
|
/* Read structure raw bytes from target. */
|
2012-05-29 20:59:53 +08:00
|
|
|
|
if (target_read_memory (info->all_image_addr, buf, len))
|
2009-02-04 16:47:56 +08:00
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
/* Extract the fields. */
|
2012-05-29 20:59:53 +08:00
|
|
|
|
info->all_image.version = extract_unsigned_integer (buf, 4, byte_order);
|
|
|
|
|
if (!darwin_dyld_version_ok (info))
|
2009-02-04 16:47:56 +08:00
|
|
|
|
return;
|
|
|
|
|
|
2012-05-29 20:59:53 +08:00
|
|
|
|
info->all_image.count = extract_unsigned_integer (buf + 4, 4, byte_order);
|
|
|
|
|
info->all_image.info = extract_typed_address (buf + 8, ptr_type);
|
|
|
|
|
info->all_image.notifier = extract_typed_address
|
2009-02-04 16:47:56 +08:00
|
|
|
|
(buf + 8 + ptr_type->length, ptr_type);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Link map info to include in an allocated so_list entry. */
|
|
|
|
|
|
|
|
|
|
struct lm_info
|
|
|
|
|
{
|
|
|
|
|
/* The target location of lm. */
|
|
|
|
|
CORE_ADDR lm_addr;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct darwin_so_list
|
|
|
|
|
{
|
|
|
|
|
/* Common field. */
|
|
|
|
|
struct so_list sl;
|
|
|
|
|
/* Darwin specific data. */
|
|
|
|
|
struct lm_info li;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/* Lookup the value for a specific symbol. */
|
2009-10-13 18:31:40 +08:00
|
|
|
|
|
2009-02-04 16:47:56 +08:00
|
|
|
|
static CORE_ADDR
|
|
|
|
|
lookup_symbol_from_bfd (bfd *abfd, char *symname)
|
|
|
|
|
{
|
|
|
|
|
long storage_needed;
|
|
|
|
|
asymbol **symbol_table;
|
|
|
|
|
unsigned int number_of_symbols;
|
|
|
|
|
unsigned int i;
|
|
|
|
|
CORE_ADDR symaddr = 0;
|
|
|
|
|
|
|
|
|
|
storage_needed = bfd_get_symtab_upper_bound (abfd);
|
|
|
|
|
|
|
|
|
|
if (storage_needed <= 0)
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
symbol_table = (asymbol **) xmalloc (storage_needed);
|
|
|
|
|
number_of_symbols = bfd_canonicalize_symtab (abfd, symbol_table);
|
2009-10-14 21:15:34 +08:00
|
|
|
|
|
2009-02-04 16:47:56 +08:00
|
|
|
|
for (i = 0; i < number_of_symbols; i++)
|
|
|
|
|
{
|
|
|
|
|
asymbol *sym = symbol_table[i];
|
2010-05-17 07:49:58 +08:00
|
|
|
|
|
2009-02-04 16:47:56 +08:00
|
|
|
|
if (strcmp (sym->name, symname) == 0
|
|
|
|
|
&& (sym->section->flags & (SEC_CODE | SEC_DATA)) != 0)
|
|
|
|
|
{
|
|
|
|
|
/* BFD symbols are section relative. */
|
|
|
|
|
symaddr = sym->value + sym->section->vma;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
xfree (symbol_table);
|
|
|
|
|
|
|
|
|
|
return symaddr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Return program interpreter string. */
|
2009-08-10 17:35:24 +08:00
|
|
|
|
|
2009-02-04 16:47:56 +08:00
|
|
|
|
static gdb_byte *
|
|
|
|
|
find_program_interpreter (void)
|
|
|
|
|
{
|
|
|
|
|
gdb_byte *buf = NULL;
|
|
|
|
|
|
2009-08-10 17:35:24 +08:00
|
|
|
|
/* If we have an exec_bfd, get the interpreter from the load commands. */
|
2009-02-04 16:47:56 +08:00
|
|
|
|
if (exec_bfd)
|
|
|
|
|
{
|
2009-08-10 17:35:24 +08:00
|
|
|
|
bfd_mach_o_load_command *cmd;
|
2009-10-14 21:15:34 +08:00
|
|
|
|
|
2009-08-10 17:35:24 +08:00
|
|
|
|
if (bfd_mach_o_lookup_command (exec_bfd,
|
|
|
|
|
BFD_MACH_O_LC_LOAD_DYLINKER, &cmd) == 1)
|
|
|
|
|
return cmd->command.dylinker.name_str;
|
2009-02-04 16:47:56 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* If we didn't find it, read from memory.
|
|
|
|
|
FIXME: todo. */
|
|
|
|
|
return buf;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* 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.
|
|
|
|
|
Note that darwin-nat.c implements pid_to_exec_file. */
|
2009-10-13 18:31:40 +08:00
|
|
|
|
|
2009-02-04 16:47:56 +08:00
|
|
|
|
static int
|
|
|
|
|
open_symbol_file_object (void *from_ttyp)
|
|
|
|
|
{
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2011-01-12 05:53:25 +08:00
|
|
|
|
/* Build a list of currently loaded shared objects. See solib-svr4.c. */
|
2009-10-13 18:31:40 +08:00
|
|
|
|
|
2009-02-04 16:47:56 +08:00
|
|
|
|
static struct so_list *
|
|
|
|
|
darwin_current_sos (void)
|
|
|
|
|
{
|
* gdbarch.sh (target_gdbarch): Remove macro.
(get_target_gdbarch): Rename to target_gdbarch.
* gdbarch.c, gdbarch.h: Rebuild.
* ada-tasks.c, aix-thread.c, amd64-linux-nat.c, arch-utils.c,
arm-tdep.c, auxv.c, breakpoint.c, bsd-uthread.c, corefile.c,
darwin-nat-info.c, dcache.c, dsrec.c, exec.c, fbsd-nat.c,
filesystem.c, gcore.c, gnu-nat.c, i386-darwin-nat.c, i386-nat.c,
ia64-vms-tdep.c, inf-ptrace.c, infcmd.c, jit.c, linux-nat.c,
linux-tdep.c, linux-thread-db.c, m32r-rom.c, memattr.c,
mep-tdep.c, microblaze-tdep.c, mips-linux-nat.c,
mips-linux-tdep.c, mips-tdep.c, monitor.c, moxie-tdep.c,
nto-procfs.c, nto-tdep.c, ppc-linux-nat.c, proc-service.c,
procfs.c, progspace.c, ravenscar-thread.c, record.c,
remote-m32r-sdi.c, remote-mips.c, remote-sim.c, remote.c,
rl78-tdep.c, rs6000-nat.c, rx-tdep.c, s390-nat.c, sol-thread.c,
solib-darwin.c, solib-dsbt.c, solib-frv.c, solib-ia64-hpux.c,
solib-irix.c, solib-pa64.c, solib-som.c, solib-spu.c,
solib-sunos.c, solib-svr4.c, solib.c, spu-linux-nat.c,
spu-multiarch.c, spu-tdep.c, symfile-mem.c, symfile.c, symtab.c,
target-descriptions.c, target.c, target.h, tracepoint.c,
windows-nat.c, windows-tdep.c, xcoffsolib.c, cli/cli-dump.c,
common/agent.c, mi/mi-interp.c, python/py-finishbreakpoint.c,
python/py-inferior.c, python/python.c: Update.
2012-11-10 03:58:03 +08:00
|
|
|
|
struct type *ptr_type = builtin_type (target_gdbarch ())->builtin_data_ptr;
|
|
|
|
|
enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
|
2009-02-04 16:47:56 +08:00
|
|
|
|
int ptr_len = TYPE_LENGTH (ptr_type);
|
|
|
|
|
unsigned int image_info_size;
|
|
|
|
|
struct so_list *head = NULL;
|
|
|
|
|
struct so_list *tail = NULL;
|
|
|
|
|
int i;
|
2012-05-29 20:59:53 +08:00
|
|
|
|
struct darwin_info *info = get_darwin_info ();
|
2009-02-04 16:47:56 +08:00
|
|
|
|
|
|
|
|
|
/* Be sure image infos are loaded. */
|
2012-05-29 20:59:53 +08:00
|
|
|
|
darwin_load_image_infos (info);
|
2009-02-04 16:47:56 +08:00
|
|
|
|
|
2012-05-29 20:59:53 +08:00
|
|
|
|
if (!darwin_dyld_version_ok (info))
|
2009-02-04 16:47:56 +08:00
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
image_info_size = ptr_len * 3;
|
|
|
|
|
|
|
|
|
|
/* Read infos for each solib.
|
2012-02-18 00:37:43 +08:00
|
|
|
|
The first entry was rumored to be the executable itself, but this is not
|
|
|
|
|
true when a large number of shared libraries are used (table expanded ?).
|
|
|
|
|
We now check all entries, but discard executable images. */
|
2012-05-29 20:59:53 +08:00
|
|
|
|
for (i = 0; i < info->all_image.count; i++)
|
2009-02-04 16:47:56 +08:00
|
|
|
|
{
|
2012-05-29 20:59:53 +08:00
|
|
|
|
CORE_ADDR iinfo = info->all_image.info + i * image_info_size;
|
2009-02-04 16:47:56 +08:00
|
|
|
|
char buf[image_info_size];
|
|
|
|
|
CORE_ADDR load_addr;
|
|
|
|
|
CORE_ADDR path_addr;
|
2012-02-18 00:37:43 +08:00
|
|
|
|
struct mach_o_header_external hdr;
|
|
|
|
|
unsigned long hdr_val;
|
2009-02-04 16:47:56 +08:00
|
|
|
|
char *file_path;
|
|
|
|
|
int errcode;
|
|
|
|
|
struct darwin_so_list *dnew;
|
|
|
|
|
struct so_list *new;
|
|
|
|
|
struct cleanup *old_chain;
|
|
|
|
|
|
|
|
|
|
/* Read image info from inferior. */
|
2012-05-29 20:59:53 +08:00
|
|
|
|
if (target_read_memory (iinfo, buf, image_info_size))
|
2009-02-04 16:47:56 +08:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
load_addr = extract_typed_address (buf, ptr_type);
|
|
|
|
|
path_addr = extract_typed_address (buf + ptr_len, ptr_type);
|
|
|
|
|
|
2012-02-18 00:37:43 +08:00
|
|
|
|
/* Read Mach-O header from memory. */
|
|
|
|
|
if (target_read_memory (load_addr, (char *) &hdr, sizeof (hdr) - 4))
|
|
|
|
|
break;
|
|
|
|
|
/* Discard wrong magic numbers. Shouldn't happen. */
|
|
|
|
|
hdr_val = extract_unsigned_integer
|
|
|
|
|
(hdr.magic, sizeof (hdr.magic), byte_order);
|
|
|
|
|
if (hdr_val != BFD_MACH_O_MH_MAGIC && hdr_val != BFD_MACH_O_MH_MAGIC_64)
|
|
|
|
|
continue;
|
|
|
|
|
/* Discard executable. Should happen only once. */
|
|
|
|
|
hdr_val = extract_unsigned_integer
|
|
|
|
|
(hdr.filetype, sizeof (hdr.filetype), byte_order);
|
|
|
|
|
if (hdr_val == BFD_MACH_O_MH_EXECUTE)
|
|
|
|
|
continue;
|
|
|
|
|
|
2009-02-04 16:47:56 +08:00
|
|
|
|
target_read_string (path_addr, &file_path,
|
|
|
|
|
SO_NAME_MAX_PATH_SIZE - 1, &errcode);
|
|
|
|
|
if (errcode)
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
/* Create and fill the new so_list element. */
|
|
|
|
|
dnew = XZALLOC (struct darwin_so_list);
|
|
|
|
|
new = &dnew->sl;
|
|
|
|
|
old_chain = make_cleanup (xfree, dnew);
|
|
|
|
|
|
|
|
|
|
new->lm_info = &dnew->li;
|
|
|
|
|
|
|
|
|
|
strncpy (new->so_name, file_path, SO_NAME_MAX_PATH_SIZE - 1);
|
|
|
|
|
new->so_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0';
|
|
|
|
|
strcpy (new->so_original_name, new->so_name);
|
|
|
|
|
xfree (file_path);
|
|
|
|
|
new->lm_info->lm_addr = load_addr;
|
|
|
|
|
|
|
|
|
|
if (head == NULL)
|
|
|
|
|
head = new;
|
|
|
|
|
else
|
|
|
|
|
tail->next = new;
|
|
|
|
|
tail = new;
|
|
|
|
|
|
|
|
|
|
discard_cleanups (old_chain);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return head;
|
|
|
|
|
}
|
|
|
|
|
|
2012-12-18 14:19:54 +08:00
|
|
|
|
/* Get the load address of the executable. We assume that the dyld info are
|
|
|
|
|
correct. */
|
|
|
|
|
|
|
|
|
|
static CORE_ADDR
|
|
|
|
|
darwin_read_exec_load_addr (struct darwin_info *info)
|
|
|
|
|
{
|
|
|
|
|
struct type *ptr_type = builtin_type (target_gdbarch ())->builtin_data_ptr;
|
|
|
|
|
enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
|
|
|
|
|
int ptr_len = TYPE_LENGTH (ptr_type);
|
|
|
|
|
unsigned int image_info_size = ptr_len * 3;
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
/* Read infos for each solib. One of them should be the executable. */
|
|
|
|
|
for (i = 0; i < info->all_image.count; i++)
|
|
|
|
|
{
|
|
|
|
|
CORE_ADDR iinfo = info->all_image.info + i * image_info_size;
|
|
|
|
|
char buf[image_info_size];
|
|
|
|
|
CORE_ADDR load_addr;
|
|
|
|
|
struct mach_o_header_external hdr;
|
|
|
|
|
unsigned long hdr_val;
|
|
|
|
|
|
|
|
|
|
/* Read image info from inferior. */
|
|
|
|
|
if (target_read_memory (iinfo, buf, image_info_size))
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
load_addr = extract_typed_address (buf, ptr_type);
|
|
|
|
|
|
|
|
|
|
/* Read Mach-O header from memory. */
|
|
|
|
|
if (target_read_memory (load_addr, (char *) &hdr, sizeof (hdr) - 4))
|
|
|
|
|
break;
|
|
|
|
|
/* Discard wrong magic numbers. Shouldn't happen. */
|
|
|
|
|
hdr_val = extract_unsigned_integer
|
|
|
|
|
(hdr.magic, sizeof (hdr.magic), byte_order);
|
|
|
|
|
if (hdr_val != BFD_MACH_O_MH_MAGIC && hdr_val != BFD_MACH_O_MH_MAGIC_64)
|
|
|
|
|
continue;
|
|
|
|
|
/* Check executable. */
|
|
|
|
|
hdr_val = extract_unsigned_integer
|
|
|
|
|
(hdr.filetype, sizeof (hdr.filetype), byte_order);
|
|
|
|
|
if (hdr_val == BFD_MACH_O_MH_EXECUTE)
|
|
|
|
|
return load_addr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2009-02-04 16:47:56 +08:00
|
|
|
|
/* Return 1 if PC lies in the dynamic symbol resolution code of the
|
|
|
|
|
run time loader. */
|
2009-10-13 18:31:40 +08:00
|
|
|
|
|
2012-03-02 08:06:13 +08:00
|
|
|
|
static int
|
2009-02-04 16:47:56 +08:00
|
|
|
|
darwin_in_dynsym_resolve_code (CORE_ADDR pc)
|
|
|
|
|
{
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* No special symbol handling. */
|
2009-10-13 18:31:40 +08:00
|
|
|
|
|
2009-02-04 16:47:56 +08:00
|
|
|
|
static void
|
|
|
|
|
darwin_special_symbol_handling (void)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2012-11-29 02:48:38 +08:00
|
|
|
|
/* A wrapper for bfd_mach_o_fat_extract that handles reference
|
|
|
|
|
counting properly. This will either return NULL, or return a new
|
|
|
|
|
reference to a BFD. */
|
|
|
|
|
|
|
|
|
|
static bfd *
|
|
|
|
|
gdb_bfd_mach_o_fat_extract (bfd *abfd, bfd_format format,
|
|
|
|
|
const bfd_arch_info_type *arch)
|
|
|
|
|
{
|
|
|
|
|
bfd *result = bfd_mach_o_fat_extract (abfd, format, arch);
|
|
|
|
|
|
|
|
|
|
if (result == NULL)
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
if (result == abfd)
|
|
|
|
|
gdb_bfd_ref (result);
|
|
|
|
|
else
|
|
|
|
|
gdb_bfd_mark_parent (result, abfd);
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
2011-09-27 23:30:18 +08:00
|
|
|
|
/* Extract dyld_all_image_addr when the process was just created, assuming the
|
|
|
|
|
current PC is at the entry of the dynamic linker. */
|
2009-10-13 18:31:40 +08:00
|
|
|
|
|
2009-02-04 16:47:56 +08:00
|
|
|
|
static void
|
2012-05-29 20:59:53 +08:00
|
|
|
|
darwin_solib_get_all_image_info_addr_at_init (struct darwin_info *info)
|
2009-02-04 16:47:56 +08:00
|
|
|
|
{
|
|
|
|
|
gdb_byte *interp_name;
|
|
|
|
|
CORE_ADDR load_addr = 0;
|
|
|
|
|
bfd *dyld_bfd = NULL;
|
2012-07-19 03:38:39 +08:00
|
|
|
|
struct cleanup *cleanup;
|
2011-09-27 23:30:18 +08:00
|
|
|
|
|
|
|
|
|
/* This method doesn't work with an attached process. */
|
|
|
|
|
if (current_inferior ()->attach_flag)
|
|
|
|
|
return;
|
2009-02-04 16:47:56 +08:00
|
|
|
|
|
|
|
|
|
/* Find the program interpreter. */
|
|
|
|
|
interp_name = find_program_interpreter ();
|
|
|
|
|
if (!interp_name)
|
|
|
|
|
return;
|
|
|
|
|
|
2012-07-19 03:38:39 +08:00
|
|
|
|
cleanup = make_cleanup (null_cleanup, NULL);
|
|
|
|
|
|
2009-02-04 16:47:56 +08:00
|
|
|
|
/* Create a bfd for the interpreter. */
|
2012-08-23 00:24:39 +08:00
|
|
|
|
dyld_bfd = gdb_bfd_open (interp_name, gnutarget, -1);
|
2009-02-04 16:47:56 +08:00
|
|
|
|
if (dyld_bfd)
|
|
|
|
|
{
|
|
|
|
|
bfd *sub;
|
2010-05-17 07:49:58 +08:00
|
|
|
|
|
2012-07-19 03:42:26 +08:00
|
|
|
|
make_cleanup_bfd_unref (dyld_bfd);
|
2012-11-29 02:48:38 +08:00
|
|
|
|
sub = gdb_bfd_mach_o_fat_extract (dyld_bfd, bfd_object,
|
|
|
|
|
gdbarch_bfd_arch_info (target_gdbarch ()));
|
2009-02-04 16:47:56 +08:00
|
|
|
|
if (sub)
|
|
|
|
|
{
|
2012-07-23 22:56:11 +08:00
|
|
|
|
dyld_bfd = sub;
|
2012-07-19 03:42:26 +08:00
|
|
|
|
make_cleanup_bfd_unref (sub);
|
2009-02-04 16:47:56 +08:00
|
|
|
|
}
|
2012-07-19 03:38:39 +08:00
|
|
|
|
else
|
|
|
|
|
dyld_bfd = NULL;
|
2009-02-04 16:47:56 +08:00
|
|
|
|
}
|
|
|
|
|
if (!dyld_bfd)
|
2012-07-19 03:38:39 +08:00
|
|
|
|
{
|
|
|
|
|
do_cleanups (cleanup);
|
|
|
|
|
return;
|
|
|
|
|
}
|
2009-10-14 21:15:34 +08:00
|
|
|
|
|
2011-09-27 23:30:18 +08:00
|
|
|
|
/* We find the dynamic linker's base address by examining
|
|
|
|
|
the current pc (which should point at the entry point for the
|
|
|
|
|
dynamic linker) and subtracting the offset of the entry point. */
|
|
|
|
|
load_addr = (regcache_read_pc (get_current_regcache ())
|
|
|
|
|
- bfd_get_start_address (dyld_bfd));
|
2009-02-04 16:47:56 +08:00
|
|
|
|
|
|
|
|
|
/* Now try to set a breakpoint in the dynamic linker. */
|
2012-05-29 20:59:53 +08:00
|
|
|
|
info->all_image_addr =
|
2009-02-04 16:47:56 +08:00
|
|
|
|
lookup_symbol_from_bfd (dyld_bfd, "_dyld_all_image_infos");
|
2009-10-14 21:15:34 +08:00
|
|
|
|
|
2012-07-19 03:38:39 +08:00
|
|
|
|
do_cleanups (cleanup);
|
2009-02-04 16:47:56 +08:00
|
|
|
|
|
2012-05-29 20:59:53 +08:00
|
|
|
|
if (info->all_image_addr == 0)
|
2009-02-04 16:47:56 +08:00
|
|
|
|
return;
|
|
|
|
|
|
2012-05-29 20:59:53 +08:00
|
|
|
|
info->all_image_addr += load_addr;
|
2011-09-27 23:30:18 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Extract dyld_all_image_addr reading it from
|
|
|
|
|
TARGET_OBJECT_DARWIN_DYLD_INFO. */
|
|
|
|
|
|
|
|
|
|
static void
|
2012-05-29 20:59:53 +08:00
|
|
|
|
darwin_solib_read_all_image_info_addr (struct darwin_info *info)
|
2011-09-27 23:30:18 +08:00
|
|
|
|
{
|
|
|
|
|
gdb_byte buf[8 + 8 + 4];
|
|
|
|
|
LONGEST len;
|
* gdbarch.sh (target_gdbarch): Remove macro.
(get_target_gdbarch): Rename to target_gdbarch.
* gdbarch.c, gdbarch.h: Rebuild.
* ada-tasks.c, aix-thread.c, amd64-linux-nat.c, arch-utils.c,
arm-tdep.c, auxv.c, breakpoint.c, bsd-uthread.c, corefile.c,
darwin-nat-info.c, dcache.c, dsrec.c, exec.c, fbsd-nat.c,
filesystem.c, gcore.c, gnu-nat.c, i386-darwin-nat.c, i386-nat.c,
ia64-vms-tdep.c, inf-ptrace.c, infcmd.c, jit.c, linux-nat.c,
linux-tdep.c, linux-thread-db.c, m32r-rom.c, memattr.c,
mep-tdep.c, microblaze-tdep.c, mips-linux-nat.c,
mips-linux-tdep.c, mips-tdep.c, monitor.c, moxie-tdep.c,
nto-procfs.c, nto-tdep.c, ppc-linux-nat.c, proc-service.c,
procfs.c, progspace.c, ravenscar-thread.c, record.c,
remote-m32r-sdi.c, remote-mips.c, remote-sim.c, remote.c,
rl78-tdep.c, rs6000-nat.c, rx-tdep.c, s390-nat.c, sol-thread.c,
solib-darwin.c, solib-dsbt.c, solib-frv.c, solib-ia64-hpux.c,
solib-irix.c, solib-pa64.c, solib-som.c, solib-spu.c,
solib-sunos.c, solib-svr4.c, solib.c, spu-linux-nat.c,
spu-multiarch.c, spu-tdep.c, symfile-mem.c, symfile.c, symtab.c,
target-descriptions.c, target.c, target.h, tracepoint.c,
windows-nat.c, windows-tdep.c, xcoffsolib.c, cli/cli-dump.c,
common/agent.c, mi/mi-interp.c, python/py-finishbreakpoint.c,
python/py-inferior.c, python/python.c: Update.
2012-11-10 03:58:03 +08:00
|
|
|
|
enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
|
2011-09-27 23:30:18 +08:00
|
|
|
|
|
|
|
|
|
len = target_read (¤t_target, TARGET_OBJECT_DARWIN_DYLD_INFO, NULL,
|
|
|
|
|
buf, 0, sizeof (buf));
|
|
|
|
|
if (len != sizeof (buf))
|
|
|
|
|
return;
|
|
|
|
|
|
2012-05-29 20:59:53 +08:00
|
|
|
|
info->all_image_addr = extract_unsigned_integer (buf, 8, byte_order);
|
2011-09-27 23:30:18 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Shared library startup support. See documentation in solib-svr4.c. */
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
darwin_solib_create_inferior_hook (int from_tty)
|
|
|
|
|
{
|
2012-05-29 20:59:53 +08:00
|
|
|
|
struct darwin_info *info = get_darwin_info ();
|
2012-12-18 14:19:54 +08:00
|
|
|
|
CORE_ADDR load_addr;
|
2012-05-29 20:59:53 +08:00
|
|
|
|
|
|
|
|
|
info->all_image_addr = 0;
|
2011-09-27 23:30:18 +08:00
|
|
|
|
|
2012-05-29 20:59:53 +08:00
|
|
|
|
darwin_solib_read_all_image_info_addr (info);
|
2011-09-27 23:30:18 +08:00
|
|
|
|
|
2012-05-29 20:59:53 +08:00
|
|
|
|
if (info->all_image_addr == 0)
|
|
|
|
|
darwin_solib_get_all_image_info_addr_at_init (info);
|
2011-09-27 23:30:18 +08:00
|
|
|
|
|
2012-05-29 20:59:53 +08:00
|
|
|
|
if (info->all_image_addr == 0)
|
2011-09-27 23:30:18 +08:00
|
|
|
|
return;
|
2009-02-04 16:47:56 +08:00
|
|
|
|
|
2012-05-29 20:59:53 +08:00
|
|
|
|
darwin_load_image_infos (info);
|
2009-02-04 16:47:56 +08:00
|
|
|
|
|
2012-12-18 14:19:54 +08:00
|
|
|
|
if (!darwin_dyld_version_ok (info))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
create_solib_event_breakpoint (target_gdbarch (), info->all_image.notifier);
|
|
|
|
|
|
|
|
|
|
/* Possible relocate the main executable (PIE). */
|
|
|
|
|
load_addr = darwin_read_exec_load_addr (info);
|
|
|
|
|
if (load_addr != 0 && symfile_objfile != NULL)
|
|
|
|
|
{
|
|
|
|
|
CORE_ADDR vmaddr = 0;
|
|
|
|
|
struct mach_o_data_struct *md = bfd_mach_o_get_data (exec_bfd);
|
|
|
|
|
unsigned int i, num;
|
|
|
|
|
|
|
|
|
|
/* Find the base address of the executable. */
|
|
|
|
|
for (i = 0; i < md->header.ncmds; i++)
|
|
|
|
|
{
|
|
|
|
|
struct bfd_mach_o_load_command *cmd = &md->commands[i];
|
|
|
|
|
|
|
|
|
|
if (cmd->type != BFD_MACH_O_LC_SEGMENT
|
|
|
|
|
&& cmd->type != BFD_MACH_O_LC_SEGMENT_64)
|
|
|
|
|
continue;
|
|
|
|
|
if (cmd->command.segment.fileoff == 0
|
|
|
|
|
&& cmd->command.segment.vmaddr != 0
|
|
|
|
|
&& cmd->command.segment.filesize != 0)
|
|
|
|
|
{
|
|
|
|
|
vmaddr = cmd->command.segment.vmaddr;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Relocate. */
|
|
|
|
|
if (vmaddr != load_addr)
|
|
|
|
|
objfile_rebase (symfile_objfile, load_addr - vmaddr);
|
|
|
|
|
}
|
2009-02-04 16:47:56 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
darwin_clear_solib (void)
|
|
|
|
|
{
|
2012-05-29 20:59:53 +08:00
|
|
|
|
struct darwin_info *info = get_darwin_info ();
|
|
|
|
|
|
|
|
|
|
info->all_image_addr = 0;
|
|
|
|
|
info->all_image.version = 0;
|
2009-02-04 16:47:56 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
darwin_free_so (struct so_list *so)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* The section table is built from bfd sections using bfd VMAs.
|
|
|
|
|
Relocate these VMAs according to solib info. */
|
2009-10-13 18:31:40 +08:00
|
|
|
|
|
2009-02-04 16:47:56 +08:00
|
|
|
|
static void
|
|
|
|
|
darwin_relocate_section_addresses (struct so_list *so,
|
2009-05-23 07:49:14 +08:00
|
|
|
|
struct target_section *sec)
|
2009-02-04 16:47:56 +08:00
|
|
|
|
{
|
|
|
|
|
sec->addr += 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
|
|
|
|
|
'info sharedlibary'. */
|
|
|
|
|
if (so->addr_high == 0)
|
|
|
|
|
{
|
|
|
|
|
so->addr_low = sec->addr;
|
|
|
|
|
so->addr_high = sec->endaddr;
|
|
|
|
|
}
|
|
|
|
|
if (sec->endaddr > so->addr_high)
|
|
|
|
|
so->addr_high = sec->endaddr;
|
|
|
|
|
if (sec->addr < so->addr_low)
|
|
|
|
|
so->addr_low = sec->addr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static struct symbol *
|
|
|
|
|
darwin_lookup_lib_symbol (const struct objfile *objfile,
|
|
|
|
|
const char *name,
|
|
|
|
|
const domain_enum domain)
|
|
|
|
|
{
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static bfd *
|
|
|
|
|
darwin_bfd_open (char *pathname)
|
|
|
|
|
{
|
|
|
|
|
char *found_pathname;
|
|
|
|
|
int found_file;
|
|
|
|
|
bfd *abfd;
|
|
|
|
|
bfd *res;
|
|
|
|
|
|
|
|
|
|
/* Search for shared library file. */
|
|
|
|
|
found_pathname = solib_find (pathname, &found_file);
|
|
|
|
|
if (found_pathname == NULL)
|
|
|
|
|
perror_with_name (pathname);
|
|
|
|
|
|
|
|
|
|
/* Open bfd for shared library. */
|
|
|
|
|
abfd = solib_bfd_fopen (found_pathname, found_file);
|
|
|
|
|
|
2012-11-29 02:48:38 +08:00
|
|
|
|
res = gdb_bfd_mach_o_fat_extract (abfd, bfd_object,
|
|
|
|
|
gdbarch_bfd_arch_info (target_gdbarch ()));
|
2009-02-04 16:47:56 +08:00
|
|
|
|
if (!res)
|
|
|
|
|
{
|
2012-07-19 03:42:26 +08:00
|
|
|
|
make_cleanup_bfd_unref (abfd);
|
2009-02-04 16:47:56 +08:00
|
|
|
|
error (_("`%s': not a shared-library: %s"),
|
2012-07-19 03:34:57 +08:00
|
|
|
|
bfd_get_filename (abfd), bfd_errmsg (bfd_get_error ()));
|
2009-02-04 16:47:56 +08:00
|
|
|
|
}
|
2012-11-29 02:48:38 +08:00
|
|
|
|
|
|
|
|
|
gdb_bfd_unref (abfd);
|
2009-02-04 16:47:56 +08:00
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct target_so_ops darwin_so_ops;
|
|
|
|
|
|
2012-03-02 08:06:13 +08:00
|
|
|
|
/* -Wmissing-prototypes */
|
|
|
|
|
extern initialize_file_ftype _initialize_darwin_solib;
|
|
|
|
|
|
2009-02-04 16:47:56 +08:00
|
|
|
|
void
|
|
|
|
|
_initialize_darwin_solib (void)
|
|
|
|
|
{
|
2012-05-29 20:59:53 +08:00
|
|
|
|
solib_darwin_pspace_data
|
* auto-load.c (_initialize_auto_load): Update.
* solib-svr4.c (_initialize_svr4_solib): Update
* solib-dsbt.c (_initialize_dsbt_solib): Update.
* solib-darwin.c (_initialize_darwin_solib): Update.
* registry.h: New file.
* python/py-progspace.c (gdbpy_initialize_pspace): Update.
* python/py-inferior.c (gdbpy_initialize_inferior): Update.
* progspace.h: Include registry.h. Use DECLARE_REGISTRY.
(register_program_space_data_with_cleanup)
(register_program_space_data, program_space_alloc_data)
(clear_program_space_data, set_program_space_data)
(program_space_data): Don't declare.
* progspace.c: Use DEFINE_REGISTRY.
(struct program_space_data, struct
program_space_data_registration, struct
program_space_data_registry, program_space_data_registry)
(register_program_space_data_with_cleanup)
(register_program_space_data, program_space_alloc_data)
(program_space_free_data, clear_program_space_data)
(set_program_space_data, program_space_data): Remove.
* objfiles.h: Include registry.h. Use DECLARE_REGISTRY.
(struct objfile) <data, num_data>: Replace with REGISTRY_FIELDS.
(register_objfile_data_with_cleanup, register_objfile_data)
(clear_objfile_data, set_objfile_data, objfile_data): Don't
declare.
* objfiles.c: Use DEFINE_REGISTRY.
(struct objfile_data, struct objfile_data_registration, struct
objfile_data_registry, objfile_data_registry)
(register_objfile_data_with_cleanup, register_objfile_data)
(objfile_alloc_data, objfile_free_data, clear_objfile_data)
(set_objfile_data, objfile_data): Remove.
(_initialize_objfiles): Update.
* jit.c (_initialize_jit): Update.
* inflow.c (_initialize_inflow): Update.
* inferior.h: Include registry.h. Use DECLARE_REGISTRY.
(struct inferior) <data, num_data>: Replace with REGISTRY_FIELDS.
(register_inferior_data_with_cleanup, register_inferior_data)
(clear_inferior_data, set_inferior_data, inferior_data): Don't
declare.
* inferior.c: Use DEFINE_REGISTRY.
(struct inferior_data, struct inferior_data_registration, struct
inferior_data_registry, inferior_data_registry)
(register_inferior_data_with_cleanup, register_inferior_data)
(inferior_alloc_data, inferior_free_data clear_inferior_data)
(set_inferior_data, inferior_data): Remove.
* auxv.c (_initialize_auxv): Update.
* ada-lang.c (_initialize_ada_language): Update.
* breakpoint.c (_initialize_breakpoint): Update.
* i386-nat.c (i386_use_watchpoints): Update.
2012-08-22 23:17:21 +08:00
|
|
|
|
= register_program_space_data_with_cleanup (NULL,
|
|
|
|
|
darwin_pspace_data_cleanup);
|
2012-05-29 20:59:53 +08:00
|
|
|
|
|
2009-02-04 16:47:56 +08:00
|
|
|
|
darwin_so_ops.relocate_section_addresses = darwin_relocate_section_addresses;
|
|
|
|
|
darwin_so_ops.free_so = darwin_free_so;
|
|
|
|
|
darwin_so_ops.clear_solib = darwin_clear_solib;
|
|
|
|
|
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.current_sos = darwin_current_sos;
|
|
|
|
|
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.lookup_lib_global_symbol = darwin_lookup_lib_symbol;
|
|
|
|
|
darwin_so_ops.bfd_open = darwin_bfd_open;
|
|
|
|
|
}
|