Home | History | Annotate | Line # | Download | only in gdb
solib-frv.c revision 1.11
      1 /* Handle FR-V (FDPIC) shared libraries for GDB, the GNU Debugger.
      2    Copyright (C) 2004-2024 Free Software Foundation, Inc.
      3 
      4    This file is part of GDB.
      5 
      6    This program is free software; you can redistribute it and/or modify
      7    it under the terms of the GNU General Public License as published by
      8    the Free Software Foundation; either version 3 of the License, or
      9    (at your option) any later version.
     10 
     11    This program is distributed in the hope that it will be useful,
     12    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14    GNU General Public License for more details.
     15 
     16    You should have received a copy of the GNU General Public License
     17    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     18 
     19 
     20 #include "extract-store-integer.h"
     21 #include "gdbcore.h"
     22 #include "solib.h"
     23 #include "solist.h"
     24 #include "frv-tdep.h"
     25 #include "objfiles.h"
     26 #include "symtab.h"
     27 #include "elf/frv.h"
     28 #include "gdb_bfd.h"
     29 #include "inferior.h"
     30 
     31 /* FR-V pointers are four bytes wide.  */
     32 enum { FRV_PTR_SIZE = 4 };
     33 
     34 /* Representation of loadmap and related structs for the FR-V FDPIC ABI.  */
     35 
     36 /* External versions; the size and alignment of the fields should be
     37    the same as those on the target.  When loaded, the placement of
     38    the bits in each field will be the same as on the target.  */
     39 typedef gdb_byte ext_Elf32_Half[2];
     40 typedef gdb_byte ext_Elf32_Addr[4];
     41 typedef gdb_byte ext_Elf32_Word[4];
     42 
     43 struct ext_elf32_fdpic_loadseg
     44 {
     45   /* Core address to which the segment is mapped.  */
     46   ext_Elf32_Addr addr;
     47   /* VMA recorded in the program header.  */
     48   ext_Elf32_Addr p_vaddr;
     49   /* Size of this segment in memory.  */
     50   ext_Elf32_Word p_memsz;
     51 };
     52 
     53 struct ext_elf32_fdpic_loadmap {
     54   /* Protocol version number, must be zero.  */
     55   ext_Elf32_Half version;
     56   /* Number of segments in this map.  */
     57   ext_Elf32_Half nsegs;
     58   /* The actual memory map.  */
     59   struct ext_elf32_fdpic_loadseg segs[1 /* nsegs, actually */];
     60 };
     61 
     62 /* Internal versions; the types are GDB types and the data in each
     63    of the fields is (or will be) decoded from the external struct
     64    for ease of consumption.  */
     65 struct int_elf32_fdpic_loadseg
     66 {
     67   /* Core address to which the segment is mapped.  */
     68   CORE_ADDR addr;
     69   /* VMA recorded in the program header.  */
     70   CORE_ADDR p_vaddr;
     71   /* Size of this segment in memory.  */
     72   long p_memsz;
     73 };
     74 
     75 struct int_elf32_fdpic_loadmap {
     76   /* Protocol version number, must be zero.  */
     77   int version;
     78   /* Number of segments in this map.  */
     79   int nsegs;
     80   /* The actual memory map.  */
     81   struct int_elf32_fdpic_loadseg segs[1 /* nsegs, actually */];
     82 };
     83 
     84 /* Given address LDMADDR, fetch and decode the loadmap at that address.
     85    Return NULL if there is a problem reading the target memory or if
     86    there doesn't appear to be a loadmap at the given address.  The
     87    allocated space (representing the loadmap) returned by this
     88    function may be freed via a single call to xfree().  */
     89 
     90 static struct int_elf32_fdpic_loadmap *
     91 fetch_loadmap (CORE_ADDR ldmaddr)
     92 {
     93   bfd_endian byte_order = gdbarch_byte_order (current_inferior ()->arch ());
     94   struct ext_elf32_fdpic_loadmap ext_ldmbuf_partial;
     95   struct ext_elf32_fdpic_loadmap *ext_ldmbuf;
     96   struct int_elf32_fdpic_loadmap *int_ldmbuf;
     97   int ext_ldmbuf_size, int_ldmbuf_size;
     98   int version, seg, nsegs;
     99 
    100   /* Fetch initial portion of the loadmap.  */
    101   if (target_read_memory (ldmaddr, (gdb_byte *) &ext_ldmbuf_partial,
    102 			  sizeof ext_ldmbuf_partial))
    103     {
    104       /* Problem reading the target's memory.  */
    105       return NULL;
    106     }
    107 
    108   /* Extract the version.  */
    109   version = extract_unsigned_integer (ext_ldmbuf_partial.version,
    110 				      sizeof ext_ldmbuf_partial.version,
    111 				      byte_order);
    112   if (version != 0)
    113     {
    114       /* We only handle version 0.  */
    115       return NULL;
    116     }
    117 
    118   /* Extract the number of segments.  */
    119   nsegs = extract_unsigned_integer (ext_ldmbuf_partial.nsegs,
    120 				    sizeof ext_ldmbuf_partial.nsegs,
    121 				    byte_order);
    122 
    123   if (nsegs <= 0)
    124     return NULL;
    125 
    126   /* Allocate space for the complete (external) loadmap.  */
    127   ext_ldmbuf_size = sizeof (struct ext_elf32_fdpic_loadmap)
    128 	       + (nsegs - 1) * sizeof (struct ext_elf32_fdpic_loadseg);
    129   ext_ldmbuf = (struct ext_elf32_fdpic_loadmap *) xmalloc (ext_ldmbuf_size);
    130 
    131   /* Copy over the portion of the loadmap that's already been read.  */
    132   memcpy (ext_ldmbuf, &ext_ldmbuf_partial, sizeof ext_ldmbuf_partial);
    133 
    134   /* Read the rest of the loadmap from the target.  */
    135   if (target_read_memory (ldmaddr + sizeof ext_ldmbuf_partial,
    136 			  (gdb_byte *) ext_ldmbuf + sizeof ext_ldmbuf_partial,
    137 			  ext_ldmbuf_size - sizeof ext_ldmbuf_partial))
    138     {
    139       /* Couldn't read rest of the loadmap.  */
    140       xfree (ext_ldmbuf);
    141       return NULL;
    142     }
    143 
    144   /* Allocate space into which to put information extract from the
    145      external loadsegs.  I.e, allocate the internal loadsegs.  */
    146   int_ldmbuf_size = sizeof (struct int_elf32_fdpic_loadmap)
    147 	       + (nsegs - 1) * sizeof (struct int_elf32_fdpic_loadseg);
    148   int_ldmbuf = (struct int_elf32_fdpic_loadmap *) xmalloc (int_ldmbuf_size);
    149 
    150   /* Place extracted information in internal structs.  */
    151   int_ldmbuf->version = version;
    152   int_ldmbuf->nsegs = nsegs;
    153   for (seg = 0; seg < nsegs; seg++)
    154     {
    155       int_ldmbuf->segs[seg].addr
    156 	= extract_unsigned_integer (ext_ldmbuf->segs[seg].addr,
    157 				    sizeof (ext_ldmbuf->segs[seg].addr),
    158 				    byte_order);
    159       int_ldmbuf->segs[seg].p_vaddr
    160 	= extract_unsigned_integer (ext_ldmbuf->segs[seg].p_vaddr,
    161 				    sizeof (ext_ldmbuf->segs[seg].p_vaddr),
    162 				    byte_order);
    163       int_ldmbuf->segs[seg].p_memsz
    164 	= extract_unsigned_integer (ext_ldmbuf->segs[seg].p_memsz,
    165 				    sizeof (ext_ldmbuf->segs[seg].p_memsz),
    166 				    byte_order);
    167     }
    168 
    169   xfree (ext_ldmbuf);
    170   return int_ldmbuf;
    171 }
    172 
    173 /* External link_map and elf32_fdpic_loadaddr struct definitions.  */
    174 
    175 typedef gdb_byte ext_ptr[4];
    176 
    177 struct ext_elf32_fdpic_loadaddr
    178 {
    179   ext_ptr map;			/* struct elf32_fdpic_loadmap *map; */
    180   ext_ptr got_value;		/* void *got_value; */
    181 };
    182 
    183 struct ext_link_map
    184 {
    185   struct ext_elf32_fdpic_loadaddr l_addr;
    186 
    187   /* Absolute file name object was found in.  */
    188   ext_ptr l_name;		/* char *l_name; */
    189 
    190   /* Dynamic section of the shared object.  */
    191   ext_ptr l_ld;			/* ElfW(Dyn) *l_ld; */
    192 
    193   /* Chain of loaded objects.  */
    194   ext_ptr l_next, l_prev;	/* struct link_map *l_next, *l_prev; */
    195 };
    196 
    197 /* Link map info to include in an allocated so_list entry.  */
    198 
    199 struct lm_info_frv final : public lm_info
    200 {
    201   ~lm_info_frv ()
    202   {
    203     xfree (this->map);
    204     xfree (this->dyn_syms);
    205     xfree (this->dyn_relocs);
    206   }
    207 
    208   /* The loadmap, digested into an easier to use form.  */
    209   int_elf32_fdpic_loadmap *map = NULL;
    210   /* The GOT address for this link map entry.  */
    211   CORE_ADDR got_value = 0;
    212   /* The link map address, needed for frv_fetch_objfile_link_map().  */
    213   CORE_ADDR lm_addr = 0;
    214 
    215   /* Cached dynamic symbol table and dynamic relocs initialized and
    216      used only by find_canonical_descriptor_in_load_object().
    217 
    218      Note: kevinb/2004-02-26: It appears that calls to
    219      bfd_canonicalize_dynamic_reloc() will use the same symbols as
    220      those supplied to the first call to this function.  Therefore,
    221      it's important to NOT free the asymbol ** data structure
    222      supplied to the first call.  Thus the caching of the dynamic
    223      symbols (dyn_syms) is critical for correct operation.  The
    224      caching of the dynamic relocations could be dispensed with.  */
    225   asymbol **dyn_syms = NULL;
    226   arelent **dyn_relocs = NULL;
    227   int dyn_reloc_count = 0;	/* Number of dynamic relocs.  */
    228 };
    229 
    230 /* The load map, got value, etc. are not available from the chain
    231    of loaded shared objects.  ``main_executable_lm_info'' provides
    232    a way to get at this information so that it doesn't need to be
    233    frequently recomputed.  Initialized by frv_relocate_main_executable().  */
    234 static lm_info_frv *main_executable_lm_info;
    235 
    236 static void frv_relocate_main_executable (void);
    237 static CORE_ADDR main_got (void);
    238 static int enable_break2 (void);
    239 
    240 /* Implement the "open_symbol_file_object" solib_ops method.  */
    241 
    242 static int
    243 open_symbol_file_object (int from_tty)
    244 {
    245   /* Unimplemented.  */
    246   return 0;
    247 }
    248 
    249 /* Cached value for lm_base(), below.  */
    250 static CORE_ADDR lm_base_cache = 0;
    251 
    252 /* Link map address for main module.  */
    253 static CORE_ADDR main_lm_addr = 0;
    254 
    255 /* Return the address from which the link map chain may be found.  On
    256    the FR-V, this may be found in a number of ways.  Assuming that the
    257    main executable has already been relocated, the easiest way to find
    258    this value is to look up the address of _GLOBAL_OFFSET_TABLE_.  A
    259    pointer to the start of the link map will be located at the word found
    260    at _GLOBAL_OFFSET_TABLE_ + 8.  (This is part of the dynamic linker
    261    reserve area mandated by the ABI.)  */
    262 
    263 static CORE_ADDR
    264 lm_base (void)
    265 {
    266   bfd_endian byte_order = gdbarch_byte_order (current_inferior ()->arch ());
    267   struct bound_minimal_symbol got_sym;
    268   CORE_ADDR addr;
    269   gdb_byte buf[FRV_PTR_SIZE];
    270 
    271   /* One of our assumptions is that the main executable has been relocated.
    272      Bail out if this has not happened.  (Note that post_create_inferior()
    273      in infcmd.c will call solib_add prior to solib_create_inferior_hook().
    274      If we allow this to happen, lm_base_cache will be initialized with
    275      a bogus value.  */
    276   if (main_executable_lm_info == 0)
    277     return 0;
    278 
    279   /* If we already have a cached value, return it.  */
    280   if (lm_base_cache)
    281     return lm_base_cache;
    282 
    283   got_sym = lookup_minimal_symbol ("_GLOBAL_OFFSET_TABLE_", NULL,
    284 				   current_program_space->symfile_object_file);
    285   if (got_sym.minsym == 0)
    286     {
    287       solib_debug_printf ("_GLOBAL_OFFSET_TABLE_ not found.");
    288       return 0;
    289     }
    290 
    291   addr = got_sym.value_address () + 8;
    292 
    293   solib_debug_printf ("_GLOBAL_OFFSET_TABLE_ + 8 = %s",
    294 		      hex_string_custom (addr, 8));
    295 
    296   if (target_read_memory (addr, buf, sizeof buf) != 0)
    297     return 0;
    298   lm_base_cache = extract_unsigned_integer (buf, sizeof buf, byte_order);
    299 
    300   solib_debug_printf ("lm_base_cache = %s",
    301 		      hex_string_custom (lm_base_cache, 8));
    302 
    303   return lm_base_cache;
    304 }
    305 
    306 
    307 /* Implement the "current_sos" solib_ops method.  */
    308 
    309 static intrusive_list<solib>
    310 frv_current_sos ()
    311 {
    312   bfd_endian byte_order = gdbarch_byte_order (current_inferior ()->arch ());
    313   CORE_ADDR lm_addr, mgot;
    314   intrusive_list<solib> sos;
    315 
    316   /* Make sure that the main executable has been relocated.  This is
    317      required in order to find the address of the global offset table,
    318      which in turn is used to find the link map info.  (See lm_base()
    319      for details.)
    320 
    321      Note that the relocation of the main executable is also performed
    322      by solib_create_inferior_hook(), however, in the case of core
    323      files, this hook is called too late in order to be of benefit to
    324      solib_add.  solib_add eventually calls this this function,
    325      frv_current_sos, and also precedes the call to
    326      solib_create_inferior_hook().   (See post_create_inferior() in
    327      infcmd.c.)  */
    328   if (main_executable_lm_info == 0
    329       && current_program_space->core_bfd () != nullptr)
    330     frv_relocate_main_executable ();
    331 
    332   /* Fetch the GOT corresponding to the main executable.  */
    333   mgot = main_got ();
    334 
    335   /* Locate the address of the first link map struct.  */
    336   lm_addr = lm_base ();
    337 
    338   /* We have at least one link map entry.  Fetch the lot of them,
    339      building the solist chain.  */
    340   while (lm_addr)
    341     {
    342       struct ext_link_map lm_buf;
    343       CORE_ADDR got_addr;
    344 
    345       solib_debug_printf ("reading link_map entry at %s",
    346 			  hex_string_custom (lm_addr, 8));
    347 
    348       if (target_read_memory (lm_addr, (gdb_byte *) &lm_buf,
    349 			      sizeof (lm_buf)) != 0)
    350 	{
    351 	  warning (_("frv_current_sos: Unable to read link map entry.  "
    352 		     "Shared object chain may be incomplete."));
    353 	  break;
    354 	}
    355 
    356       got_addr
    357 	= extract_unsigned_integer (lm_buf.l_addr.got_value,
    358 				    sizeof (lm_buf.l_addr.got_value),
    359 				    byte_order);
    360       /* If the got_addr is the same as mgotr, then we're looking at the
    361 	 entry for the main executable.  By convention, we don't include
    362 	 this in the list of shared objects.  */
    363       if (got_addr != mgot)
    364 	{
    365 	  struct int_elf32_fdpic_loadmap *loadmap;
    366 	  CORE_ADDR addr;
    367 
    368 	  /* Fetch the load map address.  */
    369 	  addr = extract_unsigned_integer (lm_buf.l_addr.map,
    370 					   sizeof lm_buf.l_addr.map,
    371 					   byte_order);
    372 	  loadmap = fetch_loadmap (addr);
    373 	  if (loadmap == NULL)
    374 	    {
    375 	      warning (_("frv_current_sos: Unable to fetch load map.  "
    376 			 "Shared object chain may be incomplete."));
    377 	      break;
    378 	    }
    379 
    380 	  solib *sop = new solib;
    381 	  auto li = std::make_unique<lm_info_frv> ();
    382 	  li->map = loadmap;
    383 	  li->got_value = got_addr;
    384 	  li->lm_addr = lm_addr;
    385 	  /* Fetch the name.  */
    386 	  addr = extract_unsigned_integer (lm_buf.l_name,
    387 					   sizeof (lm_buf.l_name),
    388 					   byte_order);
    389 	  gdb::unique_xmalloc_ptr<char> name_buf
    390 	    = target_read_string (addr, SO_NAME_MAX_PATH_SIZE - 1);
    391 
    392 	  solib_debug_printf ("name = %s", name_buf.get ());
    393 
    394 	  if (name_buf == nullptr)
    395 	    warning (_("Can't read pathname for link map entry."));
    396 	  else
    397 	    {
    398 	      sop->so_name = name_buf.get ();
    399 	      sop->so_original_name = sop->so_name;
    400 	    }
    401 
    402 	  sos.push_back (*sop);
    403 	}
    404       else
    405 	{
    406 	  main_lm_addr = lm_addr;
    407 	}
    408 
    409       lm_addr = extract_unsigned_integer (lm_buf.l_next,
    410 					  sizeof (lm_buf.l_next), byte_order);
    411     }
    412 
    413   enable_break2 ();
    414 
    415   return sos;
    416 }
    417 
    418 
    419 /* Return 1 if PC lies in the dynamic symbol resolution code of the
    420    run time loader.  */
    421 
    422 static CORE_ADDR interp_text_sect_low;
    423 static CORE_ADDR interp_text_sect_high;
    424 static CORE_ADDR interp_plt_sect_low;
    425 static CORE_ADDR interp_plt_sect_high;
    426 
    427 static int
    428 frv_in_dynsym_resolve_code (CORE_ADDR pc)
    429 {
    430   return ((pc >= interp_text_sect_low && pc < interp_text_sect_high)
    431 	  || (pc >= interp_plt_sect_low && pc < interp_plt_sect_high)
    432 	  || in_plt_section (pc));
    433 }
    434 
    435 /* Given a loadmap and an address, return the displacement needed
    436    to relocate the address.  */
    437 
    438 static CORE_ADDR
    439 displacement_from_map (struct int_elf32_fdpic_loadmap *map,
    440 		       CORE_ADDR addr)
    441 {
    442   int seg;
    443 
    444   for (seg = 0; seg < map->nsegs; seg++)
    445     {
    446       if (map->segs[seg].p_vaddr <= addr
    447 	  && addr < map->segs[seg].p_vaddr + map->segs[seg].p_memsz)
    448 	{
    449 	  return map->segs[seg].addr - map->segs[seg].p_vaddr;
    450 	}
    451     }
    452 
    453   return 0;
    454 }
    455 
    456 /* Print a warning about being unable to set the dynamic linker
    457    breakpoint.  */
    458 
    459 static void
    460 enable_break_failure_warning (void)
    461 {
    462   warning (_("Unable to find dynamic linker breakpoint function.\n"
    463 	   "GDB will be unable to debug shared library initializers\n"
    464 	   "and track explicitly loaded dynamic code."));
    465 }
    466 
    467 /* Arrange for dynamic linker to hit breakpoint.
    468 
    469    The dynamic linkers has, as part of its debugger interface, support
    470    for arranging for the inferior to hit a breakpoint after mapping in
    471    the shared libraries.  This function enables that breakpoint.
    472 
    473    On the FR-V, using the shared library (FDPIC) ABI, the symbol
    474    _dl_debug_addr points to the r_debug struct which contains
    475    a field called r_brk.  r_brk is the address of the function
    476    descriptor upon which a breakpoint must be placed.  Being a
    477    function descriptor, we must extract the entry point in order
    478    to set the breakpoint.
    479 
    480    Our strategy will be to get the .interp section from the
    481    executable.  This section will provide us with the name of the
    482    interpreter.  We'll open the interpreter and then look up
    483    the address of _dl_debug_addr.  We then relocate this address
    484    using the interpreter's loadmap.  Once the relocated address
    485    is known, we fetch the value (address) corresponding to r_brk
    486    and then use that value to fetch the entry point of the function
    487    we're interested in.  */
    488 
    489 static int enable_break2_done = 0;
    490 
    491 static int
    492 enable_break2 (void)
    493 {
    494   bfd_endian byte_order = gdbarch_byte_order (current_inferior ()->arch ());
    495   asection *interp_sect;
    496 
    497   if (enable_break2_done)
    498     return 1;
    499 
    500   interp_text_sect_low = interp_text_sect_high = 0;
    501   interp_plt_sect_low = interp_plt_sect_high = 0;
    502 
    503   /* Find the .interp section; if not found, warn the user and drop
    504      into the old breakpoint at symbol code.  */
    505   interp_sect = bfd_get_section_by_name (current_program_space->exec_bfd (),
    506 					 ".interp");
    507   if (interp_sect)
    508     {
    509       unsigned int interp_sect_size;
    510       char *buf;
    511       int status;
    512       CORE_ADDR addr, interp_loadmap_addr;
    513       gdb_byte addr_buf[FRV_PTR_SIZE];
    514       struct int_elf32_fdpic_loadmap *ldm;
    515 
    516       /* Read the contents of the .interp section into a local buffer;
    517 	 the contents specify the dynamic linker this program uses.  */
    518       interp_sect_size = bfd_section_size (interp_sect);
    519       buf = (char *) alloca (interp_sect_size);
    520       bfd_get_section_contents (current_program_space->exec_bfd (),
    521 				interp_sect, buf, 0, interp_sect_size);
    522 
    523       /* Now we need to figure out where the dynamic linker was
    524 	 loaded so that we can load its symbols and place a breakpoint
    525 	 in the dynamic linker itself.
    526 
    527 	 This address is stored on the stack.  However, I've been unable
    528 	 to find any magic formula to find it for Solaris (appears to
    529 	 be trivial on GNU/Linux).  Therefore, we have to try an alternate
    530 	 mechanism to find the dynamic linker's base address.  */
    531 
    532       gdb_bfd_ref_ptr tmp_bfd;
    533       try
    534 	{
    535 	  tmp_bfd = solib_bfd_open (buf);
    536 	}
    537       catch (const gdb_exception &ex)
    538 	{
    539 	}
    540 
    541       if (tmp_bfd == NULL)
    542 	{
    543 	  enable_break_failure_warning ();
    544 	  return 0;
    545 	}
    546 
    547       status = frv_fdpic_loadmap_addresses (current_inferior ()->arch (),
    548 					    &interp_loadmap_addr, 0);
    549       if (status < 0)
    550 	{
    551 	  warning (_("Unable to determine dynamic linker loadmap address."));
    552 	  enable_break_failure_warning ();
    553 	  return 0;
    554 	}
    555 
    556       solib_debug_printf ("interp_loadmap_addr = %s",
    557 			  hex_string_custom (interp_loadmap_addr, 8));
    558 
    559       ldm = fetch_loadmap (interp_loadmap_addr);
    560       if (ldm == NULL)
    561 	{
    562 	  warning (_("Unable to load dynamic linker loadmap at address %s."),
    563 		   hex_string_custom (interp_loadmap_addr, 8));
    564 	  enable_break_failure_warning ();
    565 	  return 0;
    566 	}
    567 
    568       /* Record the relocated start and end address of the dynamic linker
    569 	 text and plt section for svr4_in_dynsym_resolve_code.  */
    570       interp_sect = bfd_get_section_by_name (tmp_bfd.get (), ".text");
    571       if (interp_sect)
    572 	{
    573 	  interp_text_sect_low = bfd_section_vma (interp_sect);
    574 	  interp_text_sect_low
    575 	    += displacement_from_map (ldm, interp_text_sect_low);
    576 	  interp_text_sect_high
    577 	    = interp_text_sect_low + bfd_section_size (interp_sect);
    578 	}
    579       interp_sect = bfd_get_section_by_name (tmp_bfd.get (), ".plt");
    580       if (interp_sect)
    581 	{
    582 	  interp_plt_sect_low = bfd_section_vma (interp_sect);
    583 	  interp_plt_sect_low
    584 	    += displacement_from_map (ldm, interp_plt_sect_low);
    585 	  interp_plt_sect_high =
    586 	    interp_plt_sect_low + bfd_section_size (interp_sect);
    587 	}
    588 
    589       addr = (gdb_bfd_lookup_symbol
    590 	      (tmp_bfd.get (),
    591 	       [] (const asymbol *sym)
    592 	       {
    593 		 return strcmp (sym->name, "_dl_debug_addr") == 0;
    594 	       }));
    595 
    596       if (addr == 0)
    597 	{
    598 	  warning (_("Could not find symbol _dl_debug_addr "
    599 		     "in dynamic linker"));
    600 	  enable_break_failure_warning ();
    601 	  return 0;
    602 	}
    603 
    604       solib_debug_printf ("_dl_debug_addr (prior to relocation) = %s",
    605 			  hex_string_custom (addr, 8));
    606 
    607       addr += displacement_from_map (ldm, addr);
    608 
    609       solib_debug_printf ("_dl_debug_addr (after relocation) = %s",
    610 			  hex_string_custom (addr, 8));
    611 
    612       /* Fetch the address of the r_debug struct.  */
    613       if (target_read_memory (addr, addr_buf, sizeof addr_buf) != 0)
    614 	{
    615 	  warning (_("Unable to fetch contents of _dl_debug_addr "
    616 		     "(at address %s) from dynamic linker"),
    617 		   hex_string_custom (addr, 8));
    618 	}
    619       addr = extract_unsigned_integer (addr_buf, sizeof addr_buf, byte_order);
    620 
    621       solib_debug_printf ("_dl_debug_addr[0..3] = %s",
    622 			  hex_string_custom (addr, 8));
    623 
    624       /* If it's zero, then the ldso hasn't initialized yet, and so
    625 	 there are no shared libs yet loaded.  */
    626       if (addr == 0)
    627 	{
    628 	  solib_debug_printf ("ldso not yet initialized");
    629 	  /* Do not warn, but mark to run again.  */
    630 	  return 0;
    631 	}
    632 
    633       /* Fetch the r_brk field.  It's 8 bytes from the start of
    634 	 _dl_debug_addr.  */
    635       if (target_read_memory (addr + 8, addr_buf, sizeof addr_buf) != 0)
    636 	{
    637 	  warning (_("Unable to fetch _dl_debug_addr->r_brk "
    638 		     "(at address %s) from dynamic linker"),
    639 		   hex_string_custom (addr + 8, 8));
    640 	  enable_break_failure_warning ();
    641 	  return 0;
    642 	}
    643       addr = extract_unsigned_integer (addr_buf, sizeof addr_buf, byte_order);
    644 
    645       /* Now fetch the function entry point.  */
    646       if (target_read_memory (addr, addr_buf, sizeof addr_buf) != 0)
    647 	{
    648 	  warning (_("Unable to fetch _dl_debug_addr->.r_brk entry point "
    649 		     "(at address %s) from dynamic linker"),
    650 		   hex_string_custom (addr, 8));
    651 	  enable_break_failure_warning ();
    652 	  return 0;
    653 	}
    654       addr = extract_unsigned_integer (addr_buf, sizeof addr_buf, byte_order);
    655 
    656       /* We're done with the loadmap.  */
    657       xfree (ldm);
    658 
    659       /* Remove all the solib event breakpoints.  Their addresses
    660 	 may have changed since the last time we ran the program.  */
    661       remove_solib_event_breakpoints ();
    662 
    663       /* Now (finally!) create the solib breakpoint.  */
    664       create_solib_event_breakpoint (current_inferior ()->arch (), addr);
    665 
    666       enable_break2_done = 1;
    667 
    668       return 1;
    669     }
    670 
    671   /* Tell the user we couldn't set a dynamic linker breakpoint.  */
    672   enable_break_failure_warning ();
    673 
    674   /* Failure return.  */
    675   return 0;
    676 }
    677 
    678 static int
    679 enable_break (void)
    680 {
    681   asection *interp_sect;
    682   CORE_ADDR entry_point;
    683 
    684   if (current_program_space->symfile_object_file == NULL)
    685     {
    686       solib_debug_printf ("No symbol file found.");
    687       return 0;
    688     }
    689 
    690   if (!entry_point_address_query (&entry_point))
    691     {
    692       solib_debug_printf ("Symbol file has no entry point.");
    693       return 0;
    694     }
    695 
    696   /* Check for the presence of a .interp section.  If there is no
    697      such section, the executable is statically linked.  */
    698 
    699   interp_sect = bfd_get_section_by_name (current_program_space->exec_bfd (),
    700 					 ".interp");
    701 
    702   if (interp_sect == NULL)
    703     {
    704       solib_debug_printf ("No .interp section found.");
    705       return 0;
    706     }
    707 
    708   create_solib_event_breakpoint (current_inferior ()->arch (), entry_point);
    709 
    710   solib_debug_printf ("solib event breakpoint placed at entry point: %s",
    711 		      hex_string_custom (entry_point, 8));
    712   return 1;
    713 }
    714 
    715 static void
    716 frv_relocate_main_executable (void)
    717 {
    718   int status;
    719   CORE_ADDR exec_addr, interp_addr;
    720   struct int_elf32_fdpic_loadmap *ldm;
    721   int changed;
    722 
    723   status = frv_fdpic_loadmap_addresses (current_inferior ()->arch (),
    724 					&interp_addr, &exec_addr);
    725 
    726   if (status < 0 || (exec_addr == 0 && interp_addr == 0))
    727     {
    728       /* Not using FDPIC ABI, so do nothing.  */
    729       return;
    730     }
    731 
    732   /* Fetch the loadmap located at ``exec_addr''.  */
    733   ldm = fetch_loadmap (exec_addr);
    734   if (ldm == NULL)
    735     error (_("Unable to load the executable's loadmap."));
    736 
    737   delete main_executable_lm_info;
    738   main_executable_lm_info = new lm_info_frv;
    739   main_executable_lm_info->map = ldm;
    740 
    741   objfile *objf = current_program_space->symfile_object_file;
    742   section_offsets new_offsets (objf->section_offsets.size ());
    743   changed = 0;
    744 
    745   for (obj_section *osect : objf->sections ())
    746     {
    747       CORE_ADDR orig_addr, addr, offset;
    748       int osect_idx;
    749       int seg;
    750 
    751       osect_idx = osect - objf->sections_start;
    752 
    753       /* Current address of section.  */
    754       addr = osect->addr ();
    755       /* Offset from where this section started.  */
    756       offset = objf->section_offsets[osect_idx];
    757       /* Original address prior to any past relocations.  */
    758       orig_addr = addr - offset;
    759 
    760       for (seg = 0; seg < ldm->nsegs; seg++)
    761 	{
    762 	  if (ldm->segs[seg].p_vaddr <= orig_addr
    763 	      && orig_addr < ldm->segs[seg].p_vaddr + ldm->segs[seg].p_memsz)
    764 	    {
    765 	      new_offsets[osect_idx]
    766 		= ldm->segs[seg].addr - ldm->segs[seg].p_vaddr;
    767 
    768 	      if (new_offsets[osect_idx] != offset)
    769 		changed = 1;
    770 	      break;
    771 	    }
    772 	}
    773     }
    774 
    775   if (changed)
    776     objfile_relocate (objf, new_offsets);
    777 
    778   /* Now that OBJF has been relocated, we can compute the GOT value
    779      and stash it away.  */
    780   main_executable_lm_info->got_value = main_got ();
    781 }
    782 
    783 /* Implement the "create_inferior_hook" target_solib_ops method.
    784 
    785    For the FR-V shared library ABI (FDPIC), the main executable needs
    786    to be relocated.  The shared library breakpoints also need to be
    787    enabled.  */
    788 
    789 static void
    790 frv_solib_create_inferior_hook (int from_tty)
    791 {
    792   /* Relocate main executable.  */
    793   frv_relocate_main_executable ();
    794 
    795   /* Enable shared library breakpoints.  */
    796   if (!enable_break ())
    797     {
    798       warning (_("shared library handler failed to enable breakpoint"));
    799       return;
    800     }
    801 }
    802 
    803 static void
    804 frv_clear_solib (program_space *pspace)
    805 {
    806   lm_base_cache = 0;
    807   enable_break2_done = 0;
    808   main_lm_addr = 0;
    809 
    810   delete main_executable_lm_info;
    811   main_executable_lm_info = NULL;
    812 }
    813 
    814 static void
    815 frv_relocate_section_addresses (solib &so, target_section *sec)
    816 {
    817   int seg;
    818   auto *li = gdb::checked_static_cast<lm_info_frv *> (so.lm_info.get ());
    819   int_elf32_fdpic_loadmap *map = li->map;
    820 
    821   for (seg = 0; seg < map->nsegs; seg++)
    822     {
    823       if (map->segs[seg].p_vaddr <= sec->addr
    824 	  && sec->addr < map->segs[seg].p_vaddr + map->segs[seg].p_memsz)
    825 	{
    826 	  CORE_ADDR displ = map->segs[seg].addr - map->segs[seg].p_vaddr;
    827 
    828 	  sec->addr += displ;
    829 	  sec->endaddr += displ;
    830 	  break;
    831 	}
    832     }
    833 }
    834 
    835 /* Return the GOT address associated with the main executable.  Return
    836    0 if it can't be found.  */
    837 
    838 static CORE_ADDR
    839 main_got (void)
    840 {
    841   struct bound_minimal_symbol got_sym;
    842 
    843   objfile *objf = current_program_space->symfile_object_file;
    844   got_sym = lookup_minimal_symbol ("_GLOBAL_OFFSET_TABLE_", NULL, objf);
    845   if (got_sym.minsym == 0)
    846     return 0;
    847 
    848   return got_sym.value_address ();
    849 }
    850 
    851 /* Find the global pointer for the given function address ADDR.  */
    852 
    853 CORE_ADDR
    854 frv_fdpic_find_global_pointer (CORE_ADDR addr)
    855 {
    856   for (const solib &so : current_program_space->solibs ())
    857     {
    858       int seg;
    859       auto *li = gdb::checked_static_cast<lm_info_frv *> (so.lm_info.get ());
    860       int_elf32_fdpic_loadmap *map = li->map;
    861 
    862       for (seg = 0; seg < map->nsegs; seg++)
    863 	{
    864 	  if (map->segs[seg].addr <= addr
    865 	      && addr < map->segs[seg].addr + map->segs[seg].p_memsz)
    866 	    return li->got_value;
    867 	}
    868     }
    869 
    870   /* Didn't find it in any of the shared objects.  So assume it's in the
    871      main executable.  */
    872   return main_got ();
    873 }
    874 
    875 /* Forward declarations for frv_fdpic_find_canonical_descriptor().  */
    876 static CORE_ADDR find_canonical_descriptor_in_load_object
    877   (CORE_ADDR, CORE_ADDR, const char *, bfd *, lm_info_frv *);
    878 
    879 /* Given a function entry point, attempt to find the canonical descriptor
    880    associated with that entry point.  Return 0 if no canonical descriptor
    881    could be found.  */
    882 
    883 CORE_ADDR
    884 frv_fdpic_find_canonical_descriptor (CORE_ADDR entry_point)
    885 {
    886   const char *name;
    887   CORE_ADDR addr;
    888   CORE_ADDR got_value;
    889   struct symbol *sym;
    890 
    891   /* Fetch the corresponding global pointer for the entry point.  */
    892   got_value = frv_fdpic_find_global_pointer (entry_point);
    893 
    894   /* Attempt to find the name of the function.  If the name is available,
    895      it'll be used as an aid in finding matching functions in the dynamic
    896      symbol table.  */
    897   sym = find_pc_function (entry_point);
    898   if (sym == 0)
    899     name = 0;
    900   else
    901     name = sym->linkage_name ();
    902 
    903   /* Check the main executable.  */
    904   objfile *objf = current_program_space->symfile_object_file;
    905   addr = find_canonical_descriptor_in_load_object
    906 	   (entry_point, got_value, name, objf->obfd.get (),
    907 	    main_executable_lm_info);
    908 
    909   /* If descriptor not found via main executable, check each load object
    910      in list of shared objects.  */
    911   if (addr == 0)
    912     {
    913       for (const solib &so : current_program_space->solibs ())
    914 	{
    915 	  auto *li = gdb::checked_static_cast<lm_info_frv *> (so.lm_info.get ());
    916 
    917 	  addr = find_canonical_descriptor_in_load_object
    918 		   (entry_point, got_value, name, so.abfd.get(), li);
    919 
    920 	  if (addr != 0)
    921 	    break;
    922 	}
    923     }
    924 
    925   return addr;
    926 }
    927 
    928 static CORE_ADDR
    929 find_canonical_descriptor_in_load_object
    930   (CORE_ADDR entry_point, CORE_ADDR got_value, const char *name, bfd *abfd,
    931    lm_info_frv *lm)
    932 {
    933   bfd_endian byte_order = gdbarch_byte_order (current_inferior ()->arch ());
    934   arelent *rel;
    935   unsigned int i;
    936   CORE_ADDR addr = 0;
    937 
    938   /* Nothing to do if no bfd.  */
    939   if (abfd == 0)
    940     return 0;
    941 
    942   /* Nothing to do if no link map.  */
    943   if (lm == 0)
    944     return 0;
    945 
    946   /* We want to scan the dynamic relocs for R_FRV_FUNCDESC relocations.
    947      (More about this later.)  But in order to fetch the relocs, we
    948      need to first fetch the dynamic symbols.  These symbols need to
    949      be cached due to the way that bfd_canonicalize_dynamic_reloc()
    950      works.  (See the comments in the declaration of struct lm_info
    951      for more information.)  */
    952   if (lm->dyn_syms == NULL)
    953     {
    954       long storage_needed;
    955       unsigned int number_of_symbols;
    956 
    957       /* Determine amount of space needed to hold the dynamic symbol table.  */
    958       storage_needed = bfd_get_dynamic_symtab_upper_bound (abfd);
    959 
    960       /* If there are no dynamic symbols, there's nothing to do.  */
    961       if (storage_needed <= 0)
    962 	return 0;
    963 
    964       /* Allocate space for the dynamic symbol table.  */
    965       lm->dyn_syms = (asymbol **) xmalloc (storage_needed);
    966 
    967       /* Fetch the dynamic symbol table.  */
    968       number_of_symbols = bfd_canonicalize_dynamic_symtab (abfd, lm->dyn_syms);
    969 
    970       if (number_of_symbols == 0)
    971 	return 0;
    972     }
    973 
    974   /* Fetch the dynamic relocations if not already cached.  */
    975   if (lm->dyn_relocs == NULL)
    976     {
    977       long storage_needed;
    978 
    979       /* Determine amount of space needed to hold the dynamic relocs.  */
    980       storage_needed = bfd_get_dynamic_reloc_upper_bound (abfd);
    981 
    982       /* Bail out if there are no dynamic relocs.  */
    983       if (storage_needed <= 0)
    984 	return 0;
    985 
    986       /* Allocate space for the relocs.  */
    987       lm->dyn_relocs = (arelent **) xmalloc (storage_needed);
    988 
    989       /* Fetch the dynamic relocs.  */
    990       lm->dyn_reloc_count
    991 	= bfd_canonicalize_dynamic_reloc (abfd, lm->dyn_relocs, lm->dyn_syms);
    992     }
    993 
    994   /* Search the dynamic relocs.  */
    995   for (i = 0; i < lm->dyn_reloc_count; i++)
    996     {
    997       rel = lm->dyn_relocs[i];
    998 
    999       /* Relocs of interest are those which meet the following
   1000 	 criteria:
   1001 
   1002 	   - the names match (assuming the caller could provide
   1003 	     a name which matches ``entry_point'').
   1004 	   - the relocation type must be R_FRV_FUNCDESC.  Relocs
   1005 	     of this type are used (by the dynamic linker) to
   1006 	     look up the address of a canonical descriptor (allocating
   1007 	     it if need be) and initializing the GOT entry referred
   1008 	     to by the offset to the address of the descriptor.
   1009 
   1010 	 These relocs of interest may be used to obtain a
   1011 	 candidate descriptor by first adjusting the reloc's
   1012 	 address according to the link map and then dereferencing
   1013 	 this address (which is a GOT entry) to obtain a descriptor
   1014 	 address.  */
   1015       if ((name == 0 || strcmp (name, (*rel->sym_ptr_ptr)->name) == 0)
   1016 	  && rel->howto->type == R_FRV_FUNCDESC)
   1017 	{
   1018 	  gdb_byte buf [FRV_PTR_SIZE];
   1019 
   1020 	  /* Compute address of address of candidate descriptor.  */
   1021 	  addr = rel->address + displacement_from_map (lm->map, rel->address);
   1022 
   1023 	  /* Fetch address of candidate descriptor.  */
   1024 	  if (target_read_memory (addr, buf, sizeof buf) != 0)
   1025 	    continue;
   1026 	  addr = extract_unsigned_integer (buf, sizeof buf, byte_order);
   1027 
   1028 	  /* Check for matching entry point.  */
   1029 	  if (target_read_memory (addr, buf, sizeof buf) != 0)
   1030 	    continue;
   1031 	  if (extract_unsigned_integer (buf, sizeof buf, byte_order)
   1032 	      != entry_point)
   1033 	    continue;
   1034 
   1035 	  /* Check for matching got value.  */
   1036 	  if (target_read_memory (addr + 4, buf, sizeof buf) != 0)
   1037 	    continue;
   1038 	  if (extract_unsigned_integer (buf, sizeof buf, byte_order)
   1039 	      != got_value)
   1040 	    continue;
   1041 
   1042 	  /* Match was successful!  Exit loop.  */
   1043 	  break;
   1044 	}
   1045     }
   1046 
   1047   return addr;
   1048 }
   1049 
   1050 /* Given an objfile, return the address of its link map.  This value is
   1051    needed for TLS support.  */
   1052 CORE_ADDR
   1053 frv_fetch_objfile_link_map (struct objfile *objfile)
   1054 {
   1055   /* Cause frv_current_sos() to be run if it hasn't been already.  */
   1056   if (main_lm_addr == 0)
   1057     solib_add (0, 0, 1);
   1058 
   1059   /* frv_current_sos() will set main_lm_addr for the main executable.  */
   1060   if (objfile == current_program_space->symfile_object_file)
   1061     return main_lm_addr;
   1062 
   1063   /* The other link map addresses may be found by examining the list
   1064      of shared libraries.  */
   1065   for (const solib &so : current_program_space->solibs ())
   1066     {
   1067       auto *li = gdb::checked_static_cast<lm_info_frv *> (so.lm_info.get ());
   1068 
   1069       if (so.objfile == objfile)
   1070 	return li->lm_addr;
   1071     }
   1072 
   1073   /* Not found!  */
   1074   return 0;
   1075 }
   1076 
   1077 const solib_ops frv_so_ops =
   1078 {
   1079   frv_relocate_section_addresses,
   1080   nullptr,
   1081   frv_clear_solib,
   1082   frv_solib_create_inferior_hook,
   1083   frv_current_sos,
   1084   open_symbol_file_object,
   1085   frv_in_dynsym_resolve_code,
   1086   solib_bfd_open,
   1087 };
   1088