gdb/solib-dsbt.c - gdb
Global variables defined
Data types defined
Functions defined
Macros defined
Source code
- #include "defs.h"
- #include "inferior.h"
- #include "gdbcore.h"
- #include "solib.h"
- #include "solist.h"
- #include "objfiles.h"
- #include "symtab.h"
- #include "language.h"
- #include "command.h"
- #include "gdbcmd.h"
- #include "elf-bfd.h"
- #include "gdb_bfd.h"
- #define GOT_MODULE_OFFSET 4
- static unsigned int solib_dsbt_debug = 0;
- enum { TIC6X_PTR_SIZE = 4 };
- typedef gdb_byte ext_Elf32_Half[2];
- typedef gdb_byte ext_Elf32_Addr[4];
- typedef gdb_byte ext_Elf32_Word[4];
- struct ext_elf32_dsbt_loadseg
- {
-
- ext_Elf32_Addr addr;
-
- ext_Elf32_Addr p_vaddr;
-
- ext_Elf32_Word p_memsz;
- };
- struct ext_elf32_dsbt_loadmap {
-
- ext_Elf32_Word version;
-
- ext_Elf32_Word dsbt_table_ptr;
- ext_Elf32_Word dsbt_size;
- ext_Elf32_Word dsbt_index;
-
- ext_Elf32_Word nsegs;
-
- struct ext_elf32_dsbt_loadseg segs[1 ];
- };
- struct int_elf32_dsbt_loadseg
- {
-
- CORE_ADDR addr;
-
- CORE_ADDR p_vaddr;
-
- long p_memsz;
- };
- struct int_elf32_dsbt_loadmap
- {
-
- int version;
- CORE_ADDR dsbt_table_ptr;
-
- int dsbt_size, dsbt_index;
-
- int nsegs;
-
- struct int_elf32_dsbt_loadseg segs[1 ];
- };
- typedef gdb_byte ext_ptr[4];
- struct ext_elf32_dsbt_loadaddr
- {
- ext_ptr map;
- };
- struct ext_link_map
- {
- struct ext_elf32_dsbt_loadaddr l_addr;
-
- ext_ptr l_name;
-
- ext_ptr l_ld;
-
- ext_ptr l_next, l_prev;
- };
- struct lm_info
- {
-
- struct int_elf32_dsbt_loadmap *map;
- };
- struct dsbt_info
- {
-
- struct lm_info *main_executable_lm_info;
-
- struct int_elf32_dsbt_loadmap *exec_loadmap;
- struct int_elf32_dsbt_loadmap *interp_loadmap;
-
- CORE_ADDR lm_base_cache;
-
- CORE_ADDR main_lm_addr;
- CORE_ADDR interp_text_sect_low;
- CORE_ADDR interp_text_sect_high;
- CORE_ADDR interp_plt_sect_low;
- CORE_ADDR interp_plt_sect_high;
- };
- static const struct program_space_data *solib_dsbt_pspace_data;
- static void
- dsbt_pspace_data_cleanup (struct program_space *pspace, void *arg)
- {
- xfree (arg);
- }
- static struct dsbt_info *
- get_dsbt_info (void)
- {
- struct dsbt_info *info;
- info = program_space_data (current_program_space, solib_dsbt_pspace_data);
- if (info != NULL)
- return info;
- info = XCNEW (struct dsbt_info);
- set_program_space_data (current_program_space, solib_dsbt_pspace_data, info);
- info->lm_base_cache = 0;
- info->main_lm_addr = 0;
- return info;
- }
- static void
- dsbt_print_loadmap (struct int_elf32_dsbt_loadmap *map)
- {
- int i;
- if (map == NULL)
- printf_filtered ("(null)\n");
- else if (map->version != 0)
- printf_filtered (_("Unsupported map version: %d\n"), map->version);
- else
- {
- printf_filtered ("version %d\n", map->version);
- for (i = 0; i < map->nsegs; i++)
- printf_filtered ("%s:%s -> %s:%s\n",
- print_core_address (target_gdbarch (),
- map->segs[i].p_vaddr),
- print_core_address (target_gdbarch (),
- map->segs[i].p_vaddr
- + map->segs[i].p_memsz),
- print_core_address (target_gdbarch (), map->segs[i].addr),
- print_core_address (target_gdbarch (), map->segs[i].addr
- + map->segs[i].p_memsz));
- }
- }
- static struct int_elf32_dsbt_loadmap *
- decode_loadmap (gdb_byte *buf)
- {
- enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
- struct ext_elf32_dsbt_loadmap *ext_ldmbuf;
- struct int_elf32_dsbt_loadmap *int_ldmbuf;
- int version, seg, nsegs;
- int int_ldmbuf_size;
- ext_ldmbuf = (struct ext_elf32_dsbt_loadmap *) buf;
-
- version = extract_unsigned_integer (ext_ldmbuf->version,
- sizeof ext_ldmbuf->version,
- byte_order);
- if (version != 0)
- {
-
- return NULL;
- }
-
- nsegs = extract_unsigned_integer (ext_ldmbuf->nsegs,
- sizeof ext_ldmbuf->nsegs,
- byte_order);
- if (nsegs <= 0)
- return NULL;
-
- int_ldmbuf_size = (sizeof (struct int_elf32_dsbt_loadmap)
- + (nsegs - 1) * sizeof (struct int_elf32_dsbt_loadseg));
- int_ldmbuf = xmalloc (int_ldmbuf_size);
-
- int_ldmbuf->version = version;
- int_ldmbuf->nsegs = nsegs;
- for (seg = 0; seg < nsegs; seg++)
- {
- int_ldmbuf->segs[seg].addr
- = extract_unsigned_integer (ext_ldmbuf->segs[seg].addr,
- sizeof (ext_ldmbuf->segs[seg].addr),
- byte_order);
- int_ldmbuf->segs[seg].p_vaddr
- = extract_unsigned_integer (ext_ldmbuf->segs[seg].p_vaddr,
- sizeof (ext_ldmbuf->segs[seg].p_vaddr),
- byte_order);
- int_ldmbuf->segs[seg].p_memsz
- = extract_unsigned_integer (ext_ldmbuf->segs[seg].p_memsz,
- sizeof (ext_ldmbuf->segs[seg].p_memsz),
- byte_order);
- }
- xfree (ext_ldmbuf);
- return int_ldmbuf;
- }
- static struct dsbt_info *get_dsbt_info (void);
- static void
- dsbt_get_initial_loadmaps (void)
- {
- gdb_byte *buf;
- struct dsbt_info *info = get_dsbt_info ();
- if (0 >= target_read_alloc (¤t_target, TARGET_OBJECT_FDPIC,
- "exec", &buf))
- {
- info->exec_loadmap = NULL;
- error (_("Error reading DSBT exec loadmap"));
- }
- info->exec_loadmap = decode_loadmap (buf);
- if (solib_dsbt_debug)
- dsbt_print_loadmap (info->exec_loadmap);
- if (0 >= target_read_alloc (¤t_target, TARGET_OBJECT_FDPIC,
- "interp", &buf))
- {
- info->interp_loadmap = NULL;
- error (_("Error reading DSBT interp loadmap"));
- }
- info->interp_loadmap = decode_loadmap (buf);
- if (solib_dsbt_debug)
- dsbt_print_loadmap (info->interp_loadmap);
- }
- static struct int_elf32_dsbt_loadmap *
- fetch_loadmap (CORE_ADDR ldmaddr)
- {
- enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
- struct ext_elf32_dsbt_loadmap ext_ldmbuf_partial;
- struct ext_elf32_dsbt_loadmap *ext_ldmbuf;
- struct int_elf32_dsbt_loadmap *int_ldmbuf;
- int ext_ldmbuf_size, int_ldmbuf_size;
- int version, seg, nsegs;
-
- if (target_read_memory (ldmaddr, (gdb_byte *) &ext_ldmbuf_partial,
- sizeof ext_ldmbuf_partial))
- {
-
- return NULL;
- }
-
- version = extract_unsigned_integer (ext_ldmbuf_partial.version,
- sizeof ext_ldmbuf_partial.version,
- byte_order);
- if (version != 0)
- {
-
- return NULL;
- }
-
- nsegs = extract_unsigned_integer (ext_ldmbuf_partial.nsegs,
- sizeof ext_ldmbuf_partial.nsegs,
- byte_order);
- if (nsegs <= 0)
- return NULL;
-
- ext_ldmbuf_size = sizeof (struct ext_elf32_dsbt_loadmap)
- + (nsegs - 1) * sizeof (struct ext_elf32_dsbt_loadseg);
- ext_ldmbuf = xmalloc (ext_ldmbuf_size);
-
- memcpy (ext_ldmbuf, &ext_ldmbuf_partial, sizeof ext_ldmbuf_partial);
-
- if (target_read_memory (ldmaddr + sizeof ext_ldmbuf_partial,
- (gdb_byte *) ext_ldmbuf + sizeof ext_ldmbuf_partial,
- ext_ldmbuf_size - sizeof ext_ldmbuf_partial))
- {
-
- xfree (ext_ldmbuf);
- return NULL;
- }
-
- int_ldmbuf_size = sizeof (struct int_elf32_dsbt_loadmap)
- + (nsegs - 1) * sizeof (struct int_elf32_dsbt_loadseg);
- int_ldmbuf = xmalloc (int_ldmbuf_size);
-
- int_ldmbuf->version = version;
- int_ldmbuf->nsegs = nsegs;
- for (seg = 0; seg < nsegs; seg++)
- {
- int_ldmbuf->segs[seg].addr
- = extract_unsigned_integer (ext_ldmbuf->segs[seg].addr,
- sizeof (ext_ldmbuf->segs[seg].addr),
- byte_order);
- int_ldmbuf->segs[seg].p_vaddr
- = extract_unsigned_integer (ext_ldmbuf->segs[seg].p_vaddr,
- sizeof (ext_ldmbuf->segs[seg].p_vaddr),
- byte_order);
- int_ldmbuf->segs[seg].p_memsz
- = extract_unsigned_integer (ext_ldmbuf->segs[seg].p_memsz,
- sizeof (ext_ldmbuf->segs[seg].p_memsz),
- byte_order);
- }
- xfree (ext_ldmbuf);
- return int_ldmbuf;
- }
- static void dsbt_relocate_main_executable (void);
- static int enable_break (void);
- static int
- scan_dyntag (int dyntag, bfd *abfd, CORE_ADDR *ptr)
- {
- int arch_size, step, sect_size;
- long dyn_tag;
- CORE_ADDR dyn_ptr, dyn_addr;
- gdb_byte *bufend, *bufstart, *buf;
- Elf32_External_Dyn *x_dynp_32;
- Elf64_External_Dyn *x_dynp_64;
- struct bfd_section *sect;
- struct target_section *target_section;
- if (abfd == NULL)
- return 0;
- if (bfd_get_flavour (abfd) != bfd_target_elf_flavour)
- return 0;
- arch_size = bfd_get_arch_size (abfd);
- if (arch_size == -1)
- return 0;
-
- sect = bfd_get_section_by_name (abfd, ".dynamic");
- if (sect == NULL)
- return 0;
- for (target_section = current_target_sections->sections;
- target_section < current_target_sections->sections_end;
- target_section++)
- if (sect == target_section->the_bfd_section)
- break;
- if (target_section < current_target_sections->sections_end)
- dyn_addr = target_section->addr;
- else
- {
-
- dyn_addr = bfd_section_vma (abfd, sect);
- }
-
- sect_size = bfd_section_size (abfd, sect);
- buf = bufstart = alloca (sect_size);
- if (!bfd_get_section_contents (abfd, sect,
- buf, 0, sect_size))
- return 0;
-
- step = (arch_size == 32) ? sizeof (Elf32_External_Dyn)
- : sizeof (Elf64_External_Dyn);
- for (bufend = buf + sect_size;
- buf < bufend;
- buf += step)
- {
- if (arch_size == 32)
- {
- x_dynp_32 = (Elf32_External_Dyn *) buf;
- dyn_tag = bfd_h_get_32 (abfd, (bfd_byte *) x_dynp_32->d_tag);
- dyn_ptr = bfd_h_get_32 (abfd, (bfd_byte *) x_dynp_32->d_un.d_ptr);
- }
- else
- {
- x_dynp_64 = (Elf64_External_Dyn *) buf;
- dyn_tag = bfd_h_get_64 (abfd, (bfd_byte *) x_dynp_64->d_tag);
- dyn_ptr = bfd_h_get_64 (abfd, (bfd_byte *) x_dynp_64->d_un.d_ptr);
- }
- if (dyn_tag == DT_NULL)
- return 0;
- if (dyn_tag == dyntag)
- {
-
- if (ptr)
- {
- struct type *ptr_type;
- gdb_byte ptr_buf[8];
- CORE_ADDR ptr_addr;
- ptr_type = builtin_type (target_gdbarch ())->builtin_data_ptr;
- ptr_addr = dyn_addr + (buf - bufstart) + arch_size / 8;
- if (target_read_memory (ptr_addr, ptr_buf, arch_size / 8) == 0)
- dyn_ptr = extract_typed_address (ptr_buf, ptr_type);
- *ptr = dyn_ptr;
- }
- return 1;
- }
- }
- return 0;
- }
- static int
- open_symbol_file_object (void *from_ttyp)
- {
-
- return 0;
- }
- static CORE_ADDR
- displacement_from_map (struct int_elf32_dsbt_loadmap *map,
- CORE_ADDR addr)
- {
- int seg;
- for (seg = 0; seg < map->nsegs; seg++)
- if (map->segs[seg].p_vaddr <= addr
- && addr < map->segs[seg].p_vaddr + map->segs[seg].p_memsz)
- return map->segs[seg].addr - map->segs[seg].p_vaddr;
- return 0;
- }
- static CORE_ADDR
- lm_base (void)
- {
- enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
- struct bound_minimal_symbol got_sym;
- CORE_ADDR addr;
- gdb_byte buf[TIC6X_PTR_SIZE];
- struct dsbt_info *info = get_dsbt_info ();
-
- if (info->main_executable_lm_info == 0)
- return 0;
-
- if (info->lm_base_cache)
- return info->lm_base_cache;
- got_sym = lookup_minimal_symbol ("_GLOBAL_OFFSET_TABLE_", NULL,
- symfile_objfile);
- if (got_sym.minsym != 0)
- {
- addr = BMSYMBOL_VALUE_ADDRESS (got_sym);
- if (solib_dsbt_debug)
- fprintf_unfiltered (gdb_stdlog,
- "lm_base: get addr %x by _GLOBAL_OFFSET_TABLE_.\n",
- (unsigned int) addr);
- }
- else if (scan_dyntag (DT_PLTGOT, exec_bfd, &addr))
- {
- struct int_elf32_dsbt_loadmap *ldm;
- dsbt_get_initial_loadmaps ();
- ldm = info->exec_loadmap;
- addr += displacement_from_map (ldm, addr);
- if (solib_dsbt_debug)
- fprintf_unfiltered (gdb_stdlog,
- "lm_base: get addr %x by DT_PLTGOT.\n",
- (unsigned int) addr);
- }
- else
- {
- if (solib_dsbt_debug)
- fprintf_unfiltered (gdb_stdlog,
- "lm_base: _GLOBAL_OFFSET_TABLE_ not found.\n");
- return 0;
- }
- addr += GOT_MODULE_OFFSET;
- if (solib_dsbt_debug)
- fprintf_unfiltered (gdb_stdlog,
- "lm_base: _GLOBAL_OFFSET_TABLE_ + %d = %s\n",
- GOT_MODULE_OFFSET, hex_string_custom (addr, 8));
- if (target_read_memory (addr, buf, sizeof buf) != 0)
- return 0;
- info->lm_base_cache = extract_unsigned_integer (buf, sizeof buf, byte_order);
- if (solib_dsbt_debug)
- fprintf_unfiltered (gdb_stdlog,
- "lm_base: lm_base_cache = %s\n",
- hex_string_custom (info->lm_base_cache, 8));
- return info->lm_base_cache;
- }
- static struct so_list *
- dsbt_current_sos (void)
- {
- enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
- CORE_ADDR lm_addr;
- struct so_list *sos_head = NULL;
- struct so_list **sos_next_ptr = &sos_head;
- struct dsbt_info *info = get_dsbt_info ();
-
- if (info->main_executable_lm_info == 0 && core_bfd != NULL)
- dsbt_relocate_main_executable ();
-
- lm_addr = lm_base ();
-
- while (lm_addr)
- {
- struct ext_link_map lm_buf;
- ext_Elf32_Word indexword;
- CORE_ADDR map_addr;
- int dsbt_index;
- int ret;
- if (solib_dsbt_debug)
- fprintf_unfiltered (gdb_stdlog,
- "current_sos: reading link_map entry at %s\n",
- hex_string_custom (lm_addr, 8));
- ret = target_read_memory (lm_addr, (gdb_byte *) &lm_buf, sizeof (lm_buf));
- if (ret)
- {
- warning (_("dsbt_current_sos: Unable to read link map entry."
- " Shared object chain may be incomplete."));
- break;
- }
-
- map_addr = extract_unsigned_integer (lm_buf.l_addr.map,
- sizeof lm_buf.l_addr.map,
- byte_order);
- ret = target_read_memory (map_addr + 12, (gdb_byte *) &indexword,
- sizeof indexword);
- if (ret)
- {
- warning (_("dsbt_current_sos: Unable to read dsbt index."
- " Shared object chain may be incomplete."));
- break;
- }
- dsbt_index = extract_unsigned_integer (indexword, sizeof indexword,
- byte_order);
-
- if (dsbt_index != 0)
- {
- int errcode;
- char *name_buf;
- struct int_elf32_dsbt_loadmap *loadmap;
- struct so_list *sop;
- CORE_ADDR addr;
- loadmap = fetch_loadmap (map_addr);
- if (loadmap == NULL)
- {
- warning (_("dsbt_current_sos: Unable to fetch load map."
- " Shared object chain may be incomplete."));
- break;
- }
- sop = xcalloc (1, sizeof (struct so_list));
- sop->lm_info = xcalloc (1, sizeof (struct lm_info));
- sop->lm_info->map = loadmap;
-
- addr = extract_unsigned_integer (lm_buf.l_name,
- sizeof (lm_buf.l_name),
- byte_order);
- target_read_string (addr, &name_buf, SO_NAME_MAX_PATH_SIZE - 1,
- &errcode);
- if (errcode != 0)
- warning (_("Can't read pathname for link map entry: %s."),
- safe_strerror (errcode));
- else
- {
- if (solib_dsbt_debug)
- fprintf_unfiltered (gdb_stdlog, "current_sos: name = %s\n",
- name_buf);
- strncpy (sop->so_name, name_buf, SO_NAME_MAX_PATH_SIZE - 1);
- sop->so_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0';
- xfree (name_buf);
- strcpy (sop->so_original_name, sop->so_name);
- }
- *sos_next_ptr = sop;
- sos_next_ptr = &sop->next;
- }
- else
- {
- info->main_lm_addr = lm_addr;
- }
- lm_addr = extract_unsigned_integer (lm_buf.l_next,
- sizeof (lm_buf.l_next), byte_order);
- }
- return sos_head;
- }
- static int
- dsbt_in_dynsym_resolve_code (CORE_ADDR pc)
- {
- struct dsbt_info *info = get_dsbt_info ();
- return ((pc >= info->interp_text_sect_low && pc < info->interp_text_sect_high)
- || (pc >= info->interp_plt_sect_low && pc < info->interp_plt_sect_high)
- || in_plt_section (pc));
- }
- static void
- enable_break_failure_warning (void)
- {
- warning (_("Unable to find dynamic linker breakpoint function.\n"
- "GDB will be unable to debug shared library initializers\n"
- "and track explicitly loaded dynamic code."));
- }
- static int
- cmp_name (asymbol *sym, void *data)
- {
- return (strcmp (sym->name, (const char *) data) == 0);
- }
- static int
- enable_break (void)
- {
- enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
- asection *interp_sect;
- struct dsbt_info *info;
- if (exec_bfd == NULL)
- return 0;
- if (!target_has_execution)
- return 0;
- info = get_dsbt_info ();
- info->interp_text_sect_low = 0;
- info->interp_text_sect_high = 0;
- info->interp_plt_sect_low = 0;
- info->interp_plt_sect_high = 0;
-
- interp_sect = bfd_get_section_by_name (exec_bfd, ".interp");
- if (interp_sect)
- {
- unsigned int interp_sect_size;
- char *buf;
- bfd *tmp_bfd = NULL;
- CORE_ADDR addr;
- gdb_byte addr_buf[TIC6X_PTR_SIZE];
- struct int_elf32_dsbt_loadmap *ldm;
- volatile struct gdb_exception ex;
- int ret;
-
- interp_sect_size = bfd_section_size (exec_bfd, interp_sect);
- buf = alloca (interp_sect_size);
- bfd_get_section_contents (exec_bfd, interp_sect,
- buf, 0, interp_sect_size);
-
- TRY_CATCH (ex, RETURN_MASK_ALL)
- {
- tmp_bfd = solib_bfd_open (buf);
- }
- if (tmp_bfd == NULL)
- {
- enable_break_failure_warning ();
- return 0;
- }
- dsbt_get_initial_loadmaps ();
- ldm = info->interp_loadmap;
-
- interp_sect = bfd_get_section_by_name (tmp_bfd, ".text");
- if (interp_sect)
- {
- info->interp_text_sect_low
- = bfd_section_vma (tmp_bfd, interp_sect);
- info->interp_text_sect_low
- += displacement_from_map (ldm, info->interp_text_sect_low);
- info->interp_text_sect_high
- = info->interp_text_sect_low
- + bfd_section_size (tmp_bfd, interp_sect);
- }
- interp_sect = bfd_get_section_by_name (tmp_bfd, ".plt");
- if (interp_sect)
- {
- info->interp_plt_sect_low =
- bfd_section_vma (tmp_bfd, interp_sect);
- info->interp_plt_sect_low
- += displacement_from_map (ldm, info->interp_plt_sect_low);
- info->interp_plt_sect_high =
- info->interp_plt_sect_low + bfd_section_size (tmp_bfd, interp_sect);
- }
- addr = gdb_bfd_lookup_symbol (tmp_bfd, cmp_name, "_dl_debug_state");
- if (addr != 0)
- {
- if (solib_dsbt_debug)
- fprintf_unfiltered (gdb_stdlog,
- "enable_break: _dl_debug_state (prior to relocation) = %s\n",
- hex_string_custom (addr, 8));
- addr += displacement_from_map (ldm, addr);
- if (solib_dsbt_debug)
- fprintf_unfiltered (gdb_stdlog,
- "enable_break: _dl_debug_state (after relocation) = %s\n",
- hex_string_custom (addr, 8));
-
- create_solib_event_breakpoint (target_gdbarch (), addr);
- ret = 1;
- }
- else
- {
- if (solib_dsbt_debug)
- fprintf_unfiltered (gdb_stdlog,
- "enable_break: _dl_debug_state is not found\n");
- ret = 0;
- }
-
- gdb_bfd_unref (tmp_bfd);
-
- xfree (ldm);
- return ret;
- }
-
- enable_break_failure_warning ();
-
- return 0;
- }
- static void
- dsbt_special_symbol_handling (void)
- {
- }
- static void
- dsbt_relocate_main_executable (void)
- {
- struct int_elf32_dsbt_loadmap *ldm;
- struct cleanup *old_chain;
- struct section_offsets *new_offsets;
- int changed;
- struct obj_section *osect;
- struct dsbt_info *info = get_dsbt_info ();
- dsbt_get_initial_loadmaps ();
- ldm = info->exec_loadmap;
- xfree (info->main_executable_lm_info);
- info->main_executable_lm_info = xcalloc (1, sizeof (struct lm_info));
- info->main_executable_lm_info->map = ldm;
- new_offsets = xcalloc (symfile_objfile->num_sections,
- sizeof (struct section_offsets));
- old_chain = make_cleanup (xfree, new_offsets);
- changed = 0;
- ALL_OBJFILE_OSECTIONS (symfile_objfile, osect)
- {
- CORE_ADDR orig_addr, addr, offset;
- int osect_idx;
- int seg;
- osect_idx = osect - symfile_objfile->sections;
-
- addr = obj_section_addr (osect);
-
- offset = ANOFFSET (symfile_objfile->section_offsets, osect_idx);
-
- orig_addr = addr - offset;
- for (seg = 0; seg < ldm->nsegs; seg++)
- {
- if (ldm->segs[seg].p_vaddr <= orig_addr
- && orig_addr < ldm->segs[seg].p_vaddr + ldm->segs[seg].p_memsz)
- {
- new_offsets->offsets[osect_idx]
- = ldm->segs[seg].addr - ldm->segs[seg].p_vaddr;
- if (new_offsets->offsets[osect_idx] != offset)
- changed = 1;
- break;
- }
- }
- }
- if (changed)
- objfile_relocate (symfile_objfile, new_offsets);
- do_cleanups (old_chain);
-
- }
- static void
- dsbt_solib_create_inferior_hook (int from_tty)
- {
-
- dsbt_relocate_main_executable ();
-
- if (!enable_break ())
- {
- warning (_("shared library handler failed to enable breakpoint"));
- return;
- }
- }
- static void
- dsbt_clear_solib (void)
- {
- struct dsbt_info *info = get_dsbt_info ();
- info->lm_base_cache = 0;
- info->main_lm_addr = 0;
- if (info->main_executable_lm_info != 0)
- {
- xfree (info->main_executable_lm_info->map);
- xfree (info->main_executable_lm_info);
- info->main_executable_lm_info = 0;
- }
- }
- static void
- dsbt_free_so (struct so_list *so)
- {
- xfree (so->lm_info->map);
- xfree (so->lm_info);
- }
- static void
- dsbt_relocate_section_addresses (struct so_list *so,
- struct target_section *sec)
- {
- int seg;
- struct int_elf32_dsbt_loadmap *map;
- map = so->lm_info->map;
- for (seg = 0; seg < map->nsegs; seg++)
- {
- if (map->segs[seg].p_vaddr <= sec->addr
- && sec->addr < map->segs[seg].p_vaddr + map->segs[seg].p_memsz)
- {
- CORE_ADDR displ = map->segs[seg].addr - map->segs[seg].p_vaddr;
- sec->addr += displ;
- sec->endaddr += displ;
- break;
- }
- }
- }
- static void
- show_dsbt_debug (struct ui_file *file, int from_tty,
- struct cmd_list_element *c, const char *value)
- {
- fprintf_filtered (file, _("solib-dsbt debugging is %s.\n"), value);
- }
- struct target_so_ops dsbt_so_ops;
- extern initialize_file_ftype _initialize_dsbt_solib;
- void
- _initialize_dsbt_solib (void)
- {
- solib_dsbt_pspace_data
- = register_program_space_data_with_cleanup (NULL, dsbt_pspace_data_cleanup);
- dsbt_so_ops.relocate_section_addresses = dsbt_relocate_section_addresses;
- dsbt_so_ops.free_so = dsbt_free_so;
- dsbt_so_ops.clear_solib = dsbt_clear_solib;
- dsbt_so_ops.solib_create_inferior_hook = dsbt_solib_create_inferior_hook;
- dsbt_so_ops.special_symbol_handling = dsbt_special_symbol_handling;
- dsbt_so_ops.current_sos = dsbt_current_sos;
- dsbt_so_ops.open_symbol_file_object = open_symbol_file_object;
- dsbt_so_ops.in_dynsym_resolve_code = dsbt_in_dynsym_resolve_code;
- dsbt_so_ops.bfd_open = solib_bfd_open;
-
- add_setshow_zuinteger_cmd ("solib-dsbt", class_maintenance,
- &solib_dsbt_debug, _("\
- Set internal debugging of shared library code for DSBT ELF."), _("\
- Show internal debugging of shared library code for DSBT ELF."), _("\
- When non-zero, DSBT solib specific internal debugging is enabled."),
- NULL,
- show_dsbt_debug,
- &setdebuglist, &showdebuglist);
- }