/* Handle Darwin shared libraries for GDB, the GNU Debugger.
- Copyright (C) 2009-2019 Free Software Foundation, Inc.
+ Copyright (C) 2009-2022 Free Software Foundation, Inc.
This file is part of GDB.
#include "solist.h"
#include "solib.h"
#include "solib-svr4.h"
+#include "solib-darwin.h"
#include "bfd-target.h"
#include "elf-bfd.h"
};
/* Per-program-space data key. */
-static program_space_key<darwin_info> solib_darwin_pspace_data;
+static const registry<program_space>::key<darwin_info>
+ solib_darwin_pspace_data;
/* Get the current darwin data. If none is found yet, add it now. This
function always returns a valid object. */
{
char *buf = NULL;
- /* If we have an exec_bfd, get the interpreter from the load commands. */
- if (exec_bfd)
+ /* If we have an current exec_bfd, get the interpreter from the load
+ commands. */
+ if (current_program_space->exec_bfd ())
{
bfd_mach_o_load_command *cmd;
- if (bfd_mach_o_lookup_command (exec_bfd,
- BFD_MACH_O_LC_LOAD_DYLINKER, &cmd) == 1)
- return cmd->command.dylinker.name_str;
+ if (bfd_mach_o_lookup_command (current_program_space->exec_bfd (),
+ BFD_MACH_O_LC_LOAD_DYLINKER, &cmd) == 1)
+ return cmd->command.dylinker.name_str;
}
/* If we didn't find it, read from memory.
darwin_current_sos (void)
{
struct type *ptr_type = builtin_type (target_gdbarch ())->builtin_data_ptr;
- enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
+ enum bfd_endian byte_order = type_byte_order (ptr_type);
int ptr_len = TYPE_LENGTH (ptr_type);
unsigned int image_info_size;
struct so_list *head = NULL;
CORE_ADDR path_addr;
struct mach_o_header_external hdr;
unsigned long hdr_val;
- gdb::unique_xmalloc_ptr<char> file_path;
- int errcode;
/* Read image info from inferior. */
if (target_read_memory (iinfo, buf, image_info_size))
break;
/* Discard wrong magic numbers. Shouldn't happen. */
hdr_val = extract_unsigned_integer
- (hdr.magic, sizeof (hdr.magic), byte_order);
+ (hdr.magic, sizeof (hdr.magic), byte_order);
if (hdr_val != BFD_MACH_O_MH_MAGIC && hdr_val != BFD_MACH_O_MH_MAGIC_64)
- continue;
+ continue;
/* Discard executable. Should happen only once. */
hdr_val = extract_unsigned_integer
- (hdr.filetype, sizeof (hdr.filetype), byte_order);
+ (hdr.filetype, sizeof (hdr.filetype), byte_order);
if (hdr_val == BFD_MACH_O_MH_EXECUTE)
- continue;
+ continue;
- target_read_string (path_addr, &file_path,
- SO_NAME_MAX_PATH_SIZE - 1, &errcode);
- if (errcode)
+ gdb::unique_xmalloc_ptr<char> file_path
+ = target_read_string (path_addr, SO_NAME_MAX_PATH_SIZE - 1);
+ if (file_path == nullptr)
break;
/* Create and fill the new so_list element. */
return NULL;
/* Create a bfd for the interpreter. */
- gdb_bfd_ref_ptr dyld_bfd (gdb_bfd_open (interp_name, gnutarget, -1));
+ gdb_bfd_ref_ptr dyld_bfd (gdb_bfd_open (interp_name, gnutarget));
if (dyld_bfd != NULL)
{
gdb_bfd_ref_ptr sub
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.get ()));
+ - bfd_get_start_address (dyld_bfd.get ()));
/* Now try to set a breakpoint in the dynamic linker. */
info->all_image_addr =
if (TYPE_LENGTH (ptr_type) > sizeof (buf))
return;
- len = target_read (current_top_target (), TARGET_OBJECT_DARWIN_DYLD_INFO,
+ len = target_read (current_inferior ()->top_target (),
+ TARGET_OBJECT_DARWIN_DYLD_INFO,
NULL, buf, 0, TYPE_LENGTH (ptr_type));
if (len <= 0)
return;
static void
darwin_solib_create_inferior_hook (int from_tty)
{
+ /* Everything below only makes sense if we have a running inferior. */
+ if (!target_has_execution ())
+ return;
+
struct darwin_info *info = get_darwin_info ();
CORE_ADDR load_addr;
load_addr = darwin_read_exec_load_addr_at_init (info);
}
- if (load_addr != 0 && symfile_objfile != NULL)
+ if (load_addr != 0 && current_program_space->symfile_object_file != NULL)
{
CORE_ADDR vmaddr;
/* Find the base address of the executable. */
- vmaddr = bfd_mach_o_get_base_address (exec_bfd);
+ vmaddr = bfd_mach_o_get_base_address (current_program_space->exec_bfd ());
/* Relocate. */
if (vmaddr != load_addr)
- objfile_rebase (symfile_objfile, load_addr - vmaddr);
+ objfile_rebase (current_program_space->symfile_object_file,
+ load_addr - vmaddr);
}
/* Set solib notifier (to reload list of shared libraries). */
{
/* Dyld hasn't yet relocated itself, so the notifier address may
be incorrect (as it has to be relocated). */
- CORE_ADDR start = bfd_get_start_address (exec_bfd);
+ CORE_ADDR start
+ = bfd_get_start_address (current_program_space->exec_bfd ());
if (start == 0)
notifier = 0;
else
- {
- gdb_bfd_ref_ptr dyld_bfd = darwin_get_dyld_bfd ();
- if (dyld_bfd != NULL)
- {
- CORE_ADDR dyld_bfd_start_address;
- CORE_ADDR dyld_relocated_base_address;
- CORE_ADDR pc;
-
- dyld_bfd_start_address = bfd_get_start_address (dyld_bfd.get());
-
- /* 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. */
-
- pc = regcache_read_pc (get_current_regcache ());
- dyld_relocated_base_address = pc - dyld_bfd_start_address;
-
- /* We get the proper notifier relocated address by
- adding the dyld relocated base address to the current
- notifier offset value. */
-
- notifier += dyld_relocated_base_address;
- }
- }
+ {
+ gdb_bfd_ref_ptr dyld_bfd = darwin_get_dyld_bfd ();
+ if (dyld_bfd != NULL)
+ {
+ CORE_ADDR dyld_bfd_start_address;
+ CORE_ADDR dyld_relocated_base_address;
+ CORE_ADDR pc;
+
+ dyld_bfd_start_address = bfd_get_start_address (dyld_bfd.get());
+
+ /* 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. */
+
+ pc = regcache_read_pc (get_current_regcache ());
+ dyld_relocated_base_address = pc - dyld_bfd_start_address;
+
+ /* We get the proper notifier relocated address by
+ adding the dyld relocated base address to the current
+ notifier offset value. */
+
+ notifier += dyld_relocated_base_address;
+ }
+ }
}
/* Add the breakpoint which is hit by dyld when the list of solib is
so->addr_low = sec->addr;
}
\f
-static struct block_symbol
-darwin_lookup_lib_symbol (struct objfile *objfile,
- const char *name,
- const domain_enum domain)
-{
- return {};
-}
-
static gdb_bfd_ref_ptr
darwin_bfd_open (const char *pathname)
{
/* The current filename for fat-binary BFDs is a name generated
by BFD, usually a string containing the name of the architecture.
Reset its value to the actual filename. */
- xfree (bfd_get_filename (res.get ()));
- res->filename = xstrdup (pathname);
+ bfd_set_filename (res.get (), pathname);
return res;
}
-struct target_so_ops darwin_so_ops;
-
-void
-_initialize_darwin_solib (void)
+const struct target_so_ops darwin_so_ops =
{
- 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.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;
-}
+ darwin_relocate_section_addresses,
+ darwin_free_so,
+ nullptr,
+ darwin_clear_solib,
+ darwin_solib_create_inferior_hook,
+ darwin_current_sos,
+ open_symbol_file_object,
+ darwin_in_dynsym_resolve_code,
+ darwin_bfd_open,
+};