+2018-07-26  Tom Tromey  <tom@tromey.com>
+
+       * dwarf-index-write.c (add_address_entry): Don't add objfile
+       offsets.
+       * dbxread.c (find_stab_function): Rename from
+       find_stab_function_addr.  Return a bound_minimal_symbol.
+       (read_dbx_symtab): Use raw_text_low, raw_text_high.
+       Don't add objfile offsets.
+       (end_psymtab): Use raw_text_low, raw_text_high,
+       MSYMBOL_VALUE_RAW_ADDRESS.
+       (read_ofile_symtab): Update.
+       (process_one_symbol): Update.
+       * dwarf2read.c (create_addrmap_from_index): Don't add objfile
+       offsets.
+       (dw2_relocate): Remove.
+       (dw2_find_pc_sect_symtab): Bias PC by the text offset before
+       searching addrmap.
+       (dwarf2_gdb_index_functions, dwarf2_debug_names_functions):
+       Update.
+       (process_psymtab_comp_unit_reader, add_partial_symbol)
+       (add_partial_subprogram, dwarf2_ranges_read): Update.
+       (load_partial_dies): Update.
+       (add_address_entry): Don't add objfile offsets.
+       (dwarf2_build_include_psymtabs): Update.
+       (create_addrmap_from_aranges): Don't add objfile offsets.
+       (dw2_find_pc_sect_compunit_symtab): Update.
+       * mdebugread.c (parse_symbol): Don't add objfile offsets.
+       (parse_lines): Remove 'pst' parameter, replace with 'textlow'.
+       Update.
+       (parse_partial_symbols): Don't add objfile offsets.  Use
+       raw_text_low, raw_text_high.  Update.
+       (handle_psymbol_enumerators, psymtab_to_symtab_1): Update.
+       * objfiles.c (objfile_relocate1): Don't relocate psymtabs_addrmap
+       or call 'relocate' quick function.  Clear psymbol_map.
+       * psympriv.h (struct partial_symbol) <address>: Add section
+       offset.
+       <set_unrelocated_address>: Rename from set_address.
+       <raw_text_low, raw_text_high>: New methods.
+       <text_low, text_high>: Add objfile parameter.
+       (add_psymbol_to_bcache): Add 'section' parameter.  Call
+       set_unrelocated_address.
+       * psymtab.c (find_pc_sect_psymtab_closer, find_pc_sect_psymtab)
+       (find_pc_psymbol): Update.
+       (fixup_psymbol_section, relocate_psymtabs): Remove.
+       (dump_psymtab, psym_functions): Update.
+       (add_psymbol_to_bcache, add_psymbol_to_list): Add 'section'
+       parameter.
+       (maintenance_info_psymtabs, maintenance_check_psymtabs): Update.
+       (start_psymtab_common): Update.
+       * symfile-debug.c (debug_qf_relocate): Remove.
+       (debug_sym_quick_functions): Update.
+       * symfile.h (struct quick_symbol_functions) <relocate>: Remove.
+       * xcoffread.c (scan_xcoff_symtab): Don't add objfile offsets.
+       Update.
+
 2018-07-26  Tom Tromey  <tromey@redhat.com>
 
        * dbxread.c (end_psymtab): Use text_high_valid and
 
   return namestring;
 }
 
-static CORE_ADDR
-find_stab_function_addr (const char *namestring, const char *filename,
-                        struct objfile *objfile)
+static struct bound_minimal_symbol
+find_stab_function (const char *namestring, const char *filename,
+                   struct objfile *objfile)
 {
   struct bound_minimal_symbol msym;
   int n;
       msym = lookup_minimal_symbol (p, NULL, objfile);
     }
 
-  return msym.minsym == NULL ? 0 : BMSYMBOL_VALUE_ADDRESS (msym);
+  return msym;
 }
 
 static void
              || (namestring[(nsl = strlen (namestring)) - 1] == 'o'
                  && namestring[nsl - 2] == '.'))
            {
-             nlist.n_value += ANOFFSET (objfile->section_offsets,
-                                        SECT_OFF_TEXT (objfile));
-
              if (past_first_source_file && pst
                  /* The gould NP1 uses low values for .o and -l symbols
                     which are not the address.  */
-                 && nlist.n_value >= pst->text_low ())
+                 && nlist.n_value >= pst->raw_text_low ())
                {
                  dbx_end_psymtab (objfile, pst, psymtab_include_list,
                                   includes_used, symnum * symbol_size,
-                                  nlist.n_value > pst->text_high ()
-                                  ? nlist.n_value : pst->text_high (),
+                                  nlist.n_value > pst->raw_text_high ()
+                                  ? nlist.n_value : pst->raw_text_high (),
                                   dependency_list, dependencies_used,
                                   textlow_not_set);
                  pst = (struct partial_symtab *) 0;
            static const char *dirname_nso;
            int prev_textlow_not_set;
 
-           valu = nlist.n_value + ANOFFSET (objfile->section_offsets,
-                                            SECT_OFF_TEXT (objfile));
+           valu = nlist.n_value;
 
            prev_textlow_not_set = textlow_not_set;
 
                  {
                    dbx_end_psymtab (objfile, pst, psymtab_include_list,
                                     includes_used, symnum * symbol_size,
-                                    (valu > pst->text_high ()
-                                     ? valu : pst->text_high ()),
+                                    (valu > pst->raw_text_high ()
+                                     ? valu : pst->raw_text_high ()),
                                     dependency_list, dependencies_used,
                                     prev_textlow_not_set);
                    pst = (struct partial_symtab *) 0;
                 function relative stabs, or the address of the function's
                 end for old style stabs.  */
              valu = nlist.n_value + last_function_start;
-             if (pst->text_high () == 0 || valu > pst->text_high ())
+             if (pst->raw_text_high () == 0 || valu > pst->raw_text_high ())
                pst->set_text_high (valu);
              break;
            }
          switch (p[1])
            {
            case 'S':
-             nlist.n_value += ANOFFSET (objfile->section_offsets,
-                                        data_sect_index);
-
              if (gdbarch_static_transform_name_p (gdbarch))
                gdbarch_static_transform_name (gdbarch, namestring);
 
              add_psymbol_to_list (sym_name, sym_len, 1,
                                   VAR_DOMAIN, LOC_STATIC,
+                                  data_sect_index,
                                   &objfile->static_psymbols,
                                   nlist.n_value, psymtab_language, objfile);
              continue;
 
            case 'G':
-             nlist.n_value += ANOFFSET (objfile->section_offsets,
-                                        data_sect_index);
              /* The addresses in these entries are reported to be
                 wrong.  See the code that reads 'G's for symtabs.  */
              add_psymbol_to_list (sym_name, sym_len, 1,
                                   VAR_DOMAIN, LOC_STATIC,
+                                  data_sect_index,
                                   &objfile->global_psymbols,
                                   nlist.n_value, psymtab_language, objfile);
              continue;
                      && namestring[0] != ' '))
                {
                  add_psymbol_to_list (sym_name, sym_len, 1,
-                                      STRUCT_DOMAIN, LOC_TYPEDEF,
+                                      STRUCT_DOMAIN, LOC_TYPEDEF, -1,
                                       &objfile->static_psymbols,
                                       0, psymtab_language, objfile);
                  if (p[2] == 't')
                    {
                      /* Also a typedef with the same name.  */
                      add_psymbol_to_list (sym_name, sym_len, 1,
-                                          VAR_DOMAIN, LOC_TYPEDEF,
+                                          VAR_DOMAIN, LOC_TYPEDEF, -1,
                                           &objfile->static_psymbols,
                                           0, psymtab_language, objfile);
                      p += 1;
              if (p != namestring)      /* a name is there, not just :T...  */
                {
                  add_psymbol_to_list (sym_name, sym_len, 1,
-                                      VAR_DOMAIN, LOC_TYPEDEF,
+                                      VAR_DOMAIN, LOC_TYPEDEF, -1,
                                       &objfile->static_psymbols,
                                       0, psymtab_language, objfile);
                }
                      /* Note that the value doesn't matter for
                         enum constants in psymtabs, just in symtabs.  */
                      add_psymbol_to_list (p, q - p, 1,
-                                          VAR_DOMAIN, LOC_CONST,
+                                          VAR_DOMAIN, LOC_CONST, -1,
                                           &objfile->static_psymbols, 0,
                                           psymtab_language, objfile);
                      /* Point past the name.  */
            case 'c':
              /* Constant, e.g. from "const" in Pascal.  */
              add_psymbol_to_list (sym_name, sym_len, 1,
-                                  VAR_DOMAIN, LOC_CONST,
+                                  VAR_DOMAIN, LOC_CONST, -1,
                                   &objfile->static_psymbols, 0,
                                   psymtab_language, objfile);
              continue;
                  function_outside_compilation_unit_complaint (name);
                  xfree (name);
                }
-             nlist.n_value += ANOFFSET (objfile->section_offsets, 
-                                        SECT_OFF_TEXT (objfile));
              /* Kludges for ELF/STABS with Sun ACC.  */
              last_function_name = namestring;
              /* Do not fix textlow==0 for .o or NLM files, as 0 is a legit
                 value for the bottom of the text seg in those cases.  */
-             if (nlist.n_value == ANOFFSET (objfile->section_offsets, 
-                                            SECT_OFF_TEXT (objfile))
+             if (nlist.n_value == 0
                  && gdbarch_sofun_address_maybe_missing (gdbarch))
                {
-                 CORE_ADDR minsym_valu = 
-                   find_stab_function_addr (namestring, 
-                                            pst ? pst->filename : NULL, 
-                                            objfile);
-
-                 /* find_stab_function_addr will return 0 if the minimal
-                    symbol wasn't found.  (Unfortunately, this might also
-                    be a valid address.)  Anyway, if it *does* return 0,
-                    it is likely that the value was set correctly to begin
-                    with...  */
-                 if (minsym_valu != 0)
-                   nlist.n_value = minsym_valu;
+                 struct bound_minimal_symbol minsym
+                   = find_stab_function (namestring,
+                                         pst ? pst->filename : NULL,
+                                         objfile);
+                 if (minsym.minsym != NULL)
+                   nlist.n_value = MSYMBOL_VALUE_RAW_ADDRESS (minsym.minsym);
                }
              if (pst && textlow_not_set
                  && gdbarch_sofun_address_maybe_missing (gdbarch))
                 the partial symbol table.  */
              if (pst
                  && (textlow_not_set
-                     || (nlist.n_value < pst->text_low ()
-                         && (nlist.n_value
-                             != ANOFFSET (objfile->section_offsets,
-                                          SECT_OFF_TEXT (objfile))))))
+                     || (nlist.n_value < pst->raw_text_low ()
+                         && (nlist.n_value != 0))))
                {
                  pst->set_text_low (nlist.n_value);
                  textlow_not_set = 0;
                }
              add_psymbol_to_list (sym_name, sym_len, 1,
                                   VAR_DOMAIN, LOC_BLOCK,
+                                  SECT_OFF_TEXT (objfile),
                                   &objfile->static_psymbols,
                                   nlist.n_value, psymtab_language, objfile);
              continue;
                  function_outside_compilation_unit_complaint (name);
                  xfree (name);
                }
-             nlist.n_value += ANOFFSET (objfile->section_offsets, 
-                                        SECT_OFF_TEXT (objfile));
              /* Kludges for ELF/STABS with Sun ACC.  */
              last_function_name = namestring;
              /* Do not fix textlow==0 for .o or NLM files, as 0 is a legit
                 value for the bottom of the text seg in those cases.  */
-             if (nlist.n_value == ANOFFSET (objfile->section_offsets, 
-                                            SECT_OFF_TEXT (objfile))
+             if (nlist.n_value == 0
                  && gdbarch_sofun_address_maybe_missing (gdbarch))
                {
-                 CORE_ADDR minsym_valu = 
-                   find_stab_function_addr (namestring, 
-                                            pst ? pst->filename : NULL, 
-                                            objfile);
-
-                 /* find_stab_function_addr will return 0 if the minimal
-                    symbol wasn't found.  (Unfortunately, this might also
-                    be a valid address.)  Anyway, if it *does* return 0,
-                    it is likely that the value was set correctly to begin
-                    with...  */
-                 if (minsym_valu != 0)
-                   nlist.n_value = minsym_valu;
+                 struct bound_minimal_symbol minsym
+                   = find_stab_function (namestring,
+                                         pst ? pst->filename : NULL,
+                                         objfile);
+                 if (minsym.minsym != NULL)
+                   nlist.n_value = MSYMBOL_VALUE_RAW_ADDRESS (minsym.minsym);
                }
              if (pst && textlow_not_set
                  && gdbarch_sofun_address_maybe_missing (gdbarch))
                 the partial symbol table.  */
              if (pst
                  && (textlow_not_set
-                     || (nlist.n_value < pst->text_low ()
-                         && (nlist.n_value
-                             != ANOFFSET (objfile->section_offsets,
-                                          SECT_OFF_TEXT (objfile))))))
+                     || (nlist.n_value < pst->raw_text_low ()
+                         && (nlist.n_value != 0))))
                {
                  pst->set_text_low (nlist.n_value);
                  textlow_not_set = 0;
                }
              add_psymbol_to_list (sym_name, sym_len, 1,
                                   VAR_DOMAIN, LOC_BLOCK,
+                                  SECT_OFF_TEXT (objfile),
                                   &objfile->global_psymbols,
                                   nlist.n_value, psymtab_language, objfile);
              continue;
         is.  */
       CORE_ADDR text_end =
        (lowest_text_address == (CORE_ADDR) -1
-        ? (text_addr + ANOFFSET (objfile->section_offsets,
-                                 SECT_OFF_TEXT (objfile)))
+        ? text_addr
         : lowest_text_address)
        + text_size;
 
       dbx_end_psymtab (objfile, pst, psymtab_include_list, includes_used,
                       symnum * symbol_size,
-                      (text_end > pst->text_high ()
-                       ? text_end : pst->text_high ()),
+                      (text_end > pst->raw_text_high ()
+                       ? text_end : pst->raw_text_high ()),
                       dependency_list, dependencies_used, textlow_not_set);
     }
 }
        }
 
       if (minsym.minsym)
-       pst->set_text_high (BMSYMBOL_VALUE_ADDRESS (minsym)
+       pst->set_text_high (MSYMBOL_VALUE_RAW_ADDRESS (minsym.minsym)
                            + MSYMBOL_SIZE (minsym.minsym));
 
       last_function_name = NULL;
     ;
   /* This test will be true if the last .o file is only data.  */
   else if (textlow_not_set)
-    pst->set_text_low (pst->text_high ());
+    pst->set_text_low (pst->raw_text_high ());
   else
     {
       struct partial_symtab *p1;
       ALL_OBJFILE_PSYMTABS (objfile, p1)
       {
        if (!p1->text_high_valid && p1->text_low_valid && p1 != pst)
-         p1->set_text_high (pst->text_low ());
+         p1->set_text_high (pst->raw_text_low ());
       }
     }
 
 
   sym_offset = LDSYMOFF (pst);
   sym_size = LDSYMLEN (pst);
-  text_offset = pst->text_low ();
-  text_size = pst->text_high () - pst->text_low ();
+  text_offset = pst->text_low (objfile);
+  text_size = pst->text_high (objfile) - pst->text_low (objfile);
   section_offsets = objfile->section_offsets;
 
   dbxread_objfile = objfile;
                                       SECT_OFF_TEXT (objfile))
                  && gdbarch_sofun_address_maybe_missing (gdbarch))
                {
-                 CORE_ADDR minsym_valu = 
-                   find_stab_function_addr (name, get_last_source_file (),
-                                            objfile);
-
-                 /* The function find_stab_function_addr will return
-                    0 if the minimal symbol wasn't found.
-                    (Unfortunately, this might also be a valid
-                    address.)  Anyway, if it *does* return 0, it is
-                    likely that the value was set correctly to begin
-                    with...  */
-                 if (minsym_valu != 0)
-                   valu = minsym_valu;
+                 struct bound_minimal_symbol minsym
+                   = find_stab_function (name, get_last_source_file (),
+                                         objfile);
+                 if (minsym.minsym != NULL)
+                   valu = BMSYMBOL_VALUE_ADDRESS (minsym);
                }
 
              /* These addresses are absolute.  */
 
 add_address_entry (struct objfile *objfile, data_buf &addr_vec,
                   CORE_ADDR start, CORE_ADDR end, unsigned int cu_index)
 {
-  CORE_ADDR baseaddr;
-
-  baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
-
-  addr_vec.append_uint (8, BFD_ENDIAN_LITTLE, start - baseaddr);
-  addr_vec.append_uint (8, BFD_ENDIAN_LITTLE, end - baseaddr);
+  addr_vec.append_uint (8, BFD_ENDIAN_LITTLE, start);
+  addr_vec.append_uint (8, BFD_ENDIAN_LITTLE, end);
   addr_vec.append_data (MAYBE_SWAP (cu_index));
 }
 
 
          continue;
        }
 
-      lo = gdbarch_adjust_dwarf2_addr (gdbarch, lo + baseaddr);
-      hi = gdbarch_adjust_dwarf2_addr (gdbarch, hi + baseaddr);
+      lo = gdbarch_adjust_dwarf2_addr (gdbarch, lo + baseaddr) - baseaddr;
+      hi = gdbarch_adjust_dwarf2_addr (gdbarch, hi + baseaddr) - baseaddr;
       addrmap_set_empty (mutable_map, lo, hi - 1,
                         dwarf2_per_objfile->get_cu (cu_index));
     }
              continue;
            }
          ULONGEST end = start + length;
-         start = gdbarch_adjust_dwarf2_addr (gdbarch, start + baseaddr);
-         end = gdbarch_adjust_dwarf2_addr (gdbarch, end + baseaddr);
+         start = (gdbarch_adjust_dwarf2_addr (gdbarch, start + baseaddr)
+                  - baseaddr);
+         end = (gdbarch_adjust_dwarf2_addr (gdbarch, end + baseaddr)
+                - baseaddr);
          addrmap_set_empty (mutable_map, start, end - 1, per_cu);
        }
     }
   printf_filtered ("\n");
 }
 
-static void
-dw2_relocate (struct objfile *objfile,
-             const struct section_offsets *new_offsets,
-             const struct section_offsets *delta)
-{
-  /* There's nothing to relocate here.  */
-}
-
 static void
 dw2_expand_symtabs_for_function (struct objfile *objfile,
                                 const char *func_name)
   if (!objfile->psymtabs_addrmap)
     return NULL;
 
+  CORE_ADDR baseaddr = ANOFFSET (objfile->section_offsets,
+                                SECT_OFF_TEXT (objfile));
   data = (struct dwarf2_per_cu_data *) addrmap_find (objfile->psymtabs_addrmap,
-                                                    pc);
+                                                    pc - baseaddr);
   if (!data)
     return NULL;
 
   dw2_lookup_symbol,
   dw2_print_stats,
   dw2_dump,
-  dw2_relocate,
   dw2_expand_symtabs_for_function,
   dw2_expand_all_symtabs,
   dw2_expand_symtabs_with_fullname,
   dw2_debug_names_lookup_symbol,
   dw2_print_stats,
   dw2_debug_names_dump,
-  dw2_relocate,
   dw2_debug_names_expand_symtabs_for_function,
   dw2_expand_all_symtabs,
   dw2_expand_symtabs_with_fullname,
   if (lh == NULL)
     return;  /* No linetable, so no includes.  */
 
-  /* NOTE: pst->dirname is DW_AT_comp_dir (if present).  */
+  /* NOTE: pst->dirname is DW_AT_comp_dir (if present).  Also note
+     that we pass in the raw text_low here; that is ok because we're
+     only decoding the line table to make include partial symtabs, and
+     so the addresses aren't really used.  */
   dwarf_decode_lines (lh.get (), pst->dirname, cu, pst,
-                     pst->text_low (), 1);
+                     pst->raw_text_low (), 1);
 }
 
 static hashval_t
   cu_bounds_kind = dwarf2_get_pc_bounds (comp_unit_die, &best_lowpc,
                                         &best_highpc, cu, pst);
   if (cu_bounds_kind == PC_BOUNDS_HIGH_LOW && best_lowpc < best_highpc)
-    /* Store the contiguous range if it is not empty; it can be empty for
-       CUs with no code.  */
-    addrmap_set_empty (objfile->psymtabs_addrmap,
-                      gdbarch_adjust_dwarf2_addr (gdbarch,
-                                                  best_lowpc + baseaddr),
-                      gdbarch_adjust_dwarf2_addr (gdbarch,
-                                                  best_highpc + baseaddr) - 1,
-                      pst);
+    {
+      CORE_ADDR low
+       = (gdbarch_adjust_dwarf2_addr (gdbarch, best_lowpc + baseaddr)
+          - baseaddr);
+      CORE_ADDR high
+       = (gdbarch_adjust_dwarf2_addr (gdbarch, best_highpc + baseaddr)
+          - baseaddr - 1);
+      /* Store the contiguous range if it is not empty; it can be
+        empty for CUs with no code.  */
+      addrmap_set_empty (objfile->psymtabs_addrmap, low, high, pst);
+    }
 
   /* Check if comp unit has_children.
      If so, read the rest of the partial symbols from this comp unit.
        }
     }
   pst->set_text_low (gdbarch_adjust_dwarf2_addr (gdbarch,
-                                                best_lowpc + baseaddr));
+                                                best_lowpc + baseaddr)
+                    - baseaddr);
   pst->set_text_high (gdbarch_adjust_dwarf2_addr (gdbarch,
-                                                 best_highpc + baseaddr));
+                                                 best_highpc + baseaddr)
+                     - baseaddr);
 
   end_psymtab_common (objfile, pst);
 
                          ", %d global, %d static syms\n",
                          per_cu->is_debug_types ? "type" : "comp",
                          sect_offset_str (per_cu->sect_off),
-                         paddress (gdbarch, pst->text_low ()),
-                         paddress (gdbarch, pst->text_high ()),
+                         paddress (gdbarch, pst->text_low (objfile)),
+                         paddress (gdbarch, pst->text_high (objfile)),
                          pst->n_global_syms, pst->n_static_syms);
     }
 }
     {
     case DW_TAG_inlined_subroutine:
     case DW_TAG_subprogram:
-      addr = gdbarch_adjust_dwarf2_addr (gdbarch, pdi->lowpc + baseaddr);
+      addr = (gdbarch_adjust_dwarf2_addr (gdbarch, pdi->lowpc + baseaddr)
+             - baseaddr);
       if (pdi->is_external || cu->language == language_ada)
        {
           /* brobecker/2007-12-26: Normally, only "external" DIEs are part
          add_psymbol_to_list (actual_name, strlen (actual_name),
                               built_actual_name != NULL,
                               VAR_DOMAIN, LOC_BLOCK,
+                              SECT_OFF_TEXT (objfile),
                               &objfile->global_psymbols,
-                              addr, cu->language, objfile);
+                              addr,
+                              cu->language, objfile);
        }
       else
        {
          add_psymbol_to_list (actual_name, strlen (actual_name),
                               built_actual_name != NULL,
                               VAR_DOMAIN, LOC_BLOCK,
+                              SECT_OFF_TEXT (objfile),
                               &objfile->static_psymbols,
                               addr, cu->language, objfile);
        }
          list = &objfile->static_psymbols;
        add_psymbol_to_list (actual_name, strlen (actual_name),
                             built_actual_name != NULL, VAR_DOMAIN, LOC_STATIC,
-                            list, 0, cu->language, objfile);
+                            -1, list, 0, cu->language, objfile);
       }
       break;
     case DW_TAG_variable:
            add_psymbol_to_list (actual_name, strlen (actual_name),
                                 built_actual_name != NULL,
                                 VAR_DOMAIN, LOC_STATIC,
+                                SECT_OFF_TEXT (objfile),
                                 &objfile->global_psymbols,
-                                addr + baseaddr,
-                                cu->language, objfile);
+                                addr, cu->language, objfile);
        }
       else
        {
          add_psymbol_to_list (actual_name, strlen (actual_name),
                               built_actual_name != NULL,
                               VAR_DOMAIN, LOC_STATIC,
+                              SECT_OFF_TEXT (objfile),
                               &objfile->static_psymbols,
-                              has_loc ? addr + baseaddr : (CORE_ADDR) 0,
+                              has_loc ? addr : 0,
                               cu->language, objfile);
        }
       break;
     case DW_TAG_subrange_type:
       add_psymbol_to_list (actual_name, strlen (actual_name),
                           built_actual_name != NULL,
-                          VAR_DOMAIN, LOC_TYPEDEF,
+                          VAR_DOMAIN, LOC_TYPEDEF, -1,
                           &objfile->static_psymbols,
                           0, cu->language, objfile);
       break;
     case DW_TAG_namespace:
       add_psymbol_to_list (actual_name, strlen (actual_name),
                           built_actual_name != NULL,
-                          VAR_DOMAIN, LOC_TYPEDEF,
+                          VAR_DOMAIN, LOC_TYPEDEF, -1,
                           &objfile->global_psymbols,
                           0, cu->language, objfile);
       break;
     case DW_TAG_module:
       add_psymbol_to_list (actual_name, strlen (actual_name),
                           built_actual_name != NULL,
-                          MODULE_DOMAIN, LOC_TYPEDEF,
+                          MODULE_DOMAIN, LOC_TYPEDEF, -1,
                           &objfile->global_psymbols,
                           0, cu->language, objfile);
       break;
         static vs. global.  */
       add_psymbol_to_list (actual_name, strlen (actual_name),
                           built_actual_name != NULL,
-                          STRUCT_DOMAIN, LOC_TYPEDEF,
+                          STRUCT_DOMAIN, LOC_TYPEDEF, -1,
                           cu->language == language_cplus
                           ? &objfile->global_psymbols
                           : &objfile->static_psymbols,
     case DW_TAG_enumerator:
       add_psymbol_to_list (actual_name, strlen (actual_name),
                           built_actual_name != NULL,
-                          VAR_DOMAIN, LOC_CONST,
+                          VAR_DOMAIN, LOC_CONST, -1,
                           cu->language == language_cplus
                           ? &objfile->global_psymbols
                           : &objfile->static_psymbols,
 
              baseaddr = ANOFFSET (objfile->section_offsets,
                                   SECT_OFF_TEXT (objfile));
-             lowpc = gdbarch_adjust_dwarf2_addr (gdbarch,
-                                                 pdi->lowpc + baseaddr);
-             highpc = gdbarch_adjust_dwarf2_addr (gdbarch,
-                                                  pdi->highpc + baseaddr);
+             lowpc = (gdbarch_adjust_dwarf2_addr (gdbarch,
+                                                  pdi->lowpc + baseaddr)
+                      - baseaddr);
+             highpc = (gdbarch_adjust_dwarf2_addr (gdbarch,
+                                                   pdi->highpc + baseaddr)
+                       - baseaddr);
              addrmap_set_empty (objfile->psymtabs_addrmap, lowpc, highpc - 1,
                                 cu->per_cu->v.psymtab);
            }
          CORE_ADDR lowpc;
          CORE_ADDR highpc;
 
-         lowpc = gdbarch_adjust_dwarf2_addr (gdbarch,
-                                             range_beginning + baseaddr);
-         highpc = gdbarch_adjust_dwarf2_addr (gdbarch,
-                                              range_end + baseaddr);
+         lowpc = (gdbarch_adjust_dwarf2_addr (gdbarch,
+                                              range_beginning + baseaddr)
+                  - baseaddr);
+         highpc = (gdbarch_adjust_dwarf2_addr (gdbarch,
+                                               range_end + baseaddr)
+                   - baseaddr);
          addrmap_set_empty (objfile->psymtabs_addrmap, lowpc, highpc - 1,
                             ranges_pst);
        }
        {
          if (building_psymtab && pdi.name != NULL)
            add_psymbol_to_list (pdi.name, strlen (pdi.name), 0,
-                                VAR_DOMAIN, LOC_TYPEDEF,
+                                VAR_DOMAIN, LOC_TYPEDEF, -1,
                                 &objfile->static_psymbols,
                                 0, cu->language, objfile);
          info_ptr = locate_pdi_sibling (reader, &pdi, info_ptr);
            complaint (_("malformed enumerator DIE ignored"));
          else if (building_psymtab)
            add_psymbol_to_list (pdi.name, strlen (pdi.name), 0,
-                                VAR_DOMAIN, LOC_CONST,
+                                VAR_DOMAIN, LOC_CONST, -1,
                                 cu->language == language_cplus
                                 ? &objfile->global_psymbols
                                 : &objfile->static_psymbols,
 
    numbers can go back and forth, apparently we can live
    with that and do not need to reorder our linetables.  */
 
-static void parse_lines (FDR *, PDR *, struct linetable *, int,
-                        struct partial_symtab *, CORE_ADDR);
-
 static void
 parse_lines (FDR *fh, PDR *pr, struct linetable *lt, int maxlines,
-            struct partial_symtab *pst, CORE_ADDR lowest_pdr_addr)
+            CORE_ADDR textlow, CORE_ADDR lowest_pdr_addr)
 {
   unsigned char *base;
   int j, k;
        halt = base + fh->cbLine;
       base += pr->cbLineOffset;
 
-      adr = pst->text_low () + pr->adr - lowest_pdr_addr;
+      adr = textlow + pr->adr - lowest_pdr_addr;
 
       l = adr >> 2;            /* in words */
       for (lineno = pr->lnLow; base < halt;)
       /* Determine the start address for this object file from the
          file header and relocate it, except for Irix 5.2 zero fh->adr.  */
       if (fh->cpd)
-       {
-         textlow = fh->adr;
-         if (relocatable || textlow != 0)
-           textlow += ANOFFSET (objfile->section_offsets,
-                                SECT_OFF_TEXT (objfile));
-       }
+       textlow = fh->adr;
       else
        textlow = 0;
       pst = start_psymtab_common (objfile,
        psymtab_language = prev_language;
       PST_PRIVATE (pst)->pst_language = psymtab_language;
 
-      pst->set_text_high (pst->text_low ());
+      pst->set_text_high (pst->raw_text_low ());
 
       /* For stabs-in-ecoff files, the second symbol must be @stab.
          This symbol is emitted by mips-tfile to signal that the
                                                  mst_file_text, sh.sc,
                                                  objfile);
                        }
-                     sh.value += ANOFFSET (objfile->section_offsets,
-                                           SECT_OFF_TEXT (objfile));
                      procaddr = sh.value;
 
                      isym = AUX_GET_ISYM (fh->fBigendian,
                          /* Kludge for Irix 5.2 zero fh->adr.  */
                          if (!relocatable
                              && (!pst->text_low_valid
-                                 || procaddr < pst->text_low ()))
+                                 || procaddr < pst->raw_text_low ()))
                            pst->set_text_low (procaddr);
-                         if (high > pst->text_high ())
+                         if (high > pst->raw_text_high ())
                            pst->set_text_high (high);
                        }
                    }
                           record_minimal_symbol (reader, namestring, sh.value,
                                                  mst_file_data, sh.sc,
                                                  objfile);
-                         sh.value += ANOFFSET (objfile->section_offsets,
-                                               SECT_OFF_DATA (objfile));
                          break;
 
                        default:
                           record_minimal_symbol (reader, namestring, sh.value,
                                                  mst_file_bss, sh.sc,
                                                  objfile);
-                         sh.value += ANOFFSET (objfile->section_offsets,
-                                               SECT_OFF_BSS (objfile));
                          break;
                        }
                    }
 
                  case N_TEXT | N_EXT:
                  case N_NBTEXT | N_EXT:
-                   sh.value += ANOFFSET (objfile->section_offsets,
-                                         SECT_OFF_TEXT (objfile));
                    goto record_it;
 
                  case N_DATA | N_EXT:
                  case N_NBDATA | N_EXT:
-                   sh.value += ANOFFSET (objfile->section_offsets,
-                                         SECT_OFF_DATA (objfile));
                    goto record_it;
 
                  case N_BSS:
                  case N_BSS | N_EXT:
                  case N_NBBSS | N_EXT:
                  case N_SETV | N_EXT:          /* FIXME, is this in BSS?  */
-                   sh.value += ANOFFSET (objfile->section_offsets,
-                                         SECT_OFF_BSS (objfile));
                    goto record_it;
 
                  case N_ABS | N_EXT:
                    continue;
 
                  case N_DATA:
-                   sh.value += ANOFFSET (objfile->section_offsets,
-                                         SECT_OFF_DATA (objfile));
                    goto record_it;
 
                  case N_UNDF | N_EXT:
                    switch (p[1])
                      {
                      case 'S':
-                       sh.value += ANOFFSET (objfile->section_offsets,
-                                             SECT_OFF_DATA (objfile));
-
                        if (gdbarch_static_transform_name_p (gdbarch))
                          namestring = gdbarch_static_transform_name
                                         (gdbarch, namestring);
 
                        add_psymbol_to_list (namestring, p - namestring, 1,
                                             VAR_DOMAIN, LOC_STATIC,
+                                            SECT_OFF_DATA (objfile),
                                             &objfile->static_psymbols,
                                             sh.value,
                                             psymtab_language, objfile);
                        continue;
                      case 'G':
-                       sh.value += ANOFFSET (objfile->section_offsets,
-                                             SECT_OFF_DATA (objfile));
                        /* The addresses in these entries are reported
                           to be wrong.  See the code that reads 'G's
                           for symtabs.  */
                        add_psymbol_to_list (namestring, p - namestring, 1,
                                             VAR_DOMAIN, LOC_STATIC,
+                                            SECT_OFF_DATA (objfile),
                                             &objfile->global_psymbols,
                                             sh.value,
                                             psymtab_language, objfile);
                          {
                            add_psymbol_to_list (namestring, p - namestring, 1,
                                                 STRUCT_DOMAIN, LOC_TYPEDEF,
+                                                -1,
                                                 &objfile->static_psymbols,
                                                 0, psymtab_language, objfile);
                            if (p[2] == 't')
                                add_psymbol_to_list (namestring,
                                                     p - namestring, 1,
                                                     VAR_DOMAIN, LOC_TYPEDEF,
+                                                    -1,
                                                     &objfile->static_psymbols,
                                                     0, psymtab_language,
                                                     objfile);
                          {
                            add_psymbol_to_list (namestring, p - namestring, 1,
                                                 VAR_DOMAIN, LOC_TYPEDEF,
+                                                -1,
                                                 &objfile->static_psymbols,
                                                 0, psymtab_language, objfile);
                          }
                                   symtabs.  */
                                add_psymbol_to_list (p, q - p, 1,
                                                     VAR_DOMAIN, LOC_CONST,
+                                                    -1,
                                                     &objfile->static_psymbols,
                                                     0, psymtab_language,
                                                     objfile);
                      case 'c':
                        /* Constant, e.g. from "const" in Pascal.  */
                        add_psymbol_to_list (namestring, p - namestring, 1,
-                                            VAR_DOMAIN, LOC_CONST,
+                                            VAR_DOMAIN, LOC_CONST, -1,
                                             &objfile->static_psymbols,
                                             0, psymtab_language, objfile);
                        continue;
                            function_outside_compilation_unit_complaint (name);
                            xfree (name);
                          }
-                       sh.value += ANOFFSET (objfile->section_offsets,
-                                             SECT_OFF_TEXT (objfile));
                        add_psymbol_to_list (namestring, p - namestring, 1,
                                             VAR_DOMAIN, LOC_BLOCK,
+                                            SECT_OFF_TEXT (objfile),
                                             &objfile->static_psymbols,
                                             sh.value,
                                             psymtab_language, objfile);
                            function_outside_compilation_unit_complaint (name);
                            xfree (name);
                          }
-                       sh.value += ANOFFSET (objfile->section_offsets,
-                                             SECT_OFF_TEXT (objfile));
                        add_psymbol_to_list (namestring, p - namestring, 1,
                                             VAR_DOMAIN, LOC_BLOCK,
+                                            SECT_OFF_TEXT (objfile),
                                             &objfile->global_psymbols,
                                             sh.value,
                                             psymtab_language, objfile);
                    continue;
 
                  case N_RBRAC:
-                   if (sh.value > save_pst->text_high ())
+                   if (sh.value > save_pst->raw_text_high ())
                      save_pst->set_text_high (sh.value);
                    continue;
                  case N_EINCL:
              char *name;
              enum address_class theclass;
              CORE_ADDR minsym_value;
+             short section = -1;
 
              (*swap_sym_in) (cur_bfd,
                              ((char *) debug_info->external_sym
                  /* The value of a stEnd symbol is the displacement from the
                     corresponding start symbol value, do not relocate it.  */
                  if (sh.st != stEnd)
-                   sh.value += ANOFFSET (objfile->section_offsets,
-                                         SECT_OFF_TEXT (objfile));
+                   section = SECT_OFF_TEXT (objfile);
                  break;
                case scData:
                case scSData:
                case scRData:
                case scPData:
                case scXData:
-                 sh.value += ANOFFSET (objfile->section_offsets,
-                                       SECT_OFF_DATA (objfile));
+                 section = SECT_OFF_DATA (objfile);
                  break;
                case scBss:
                case scSBss:
-                 sh.value += ANOFFSET (objfile->section_offsets,
-                                       SECT_OFF_BSS (objfile));
+                 section = SECT_OFF_BSS (objfile);
                  break;
                }
 
                  if (sh.st == stProc)
                    add_psymbol_to_list (name, strlen (name), 1,
                                         VAR_DOMAIN, LOC_BLOCK,
+                                        section,
                                         &objfile->global_psymbols,
                                         sh.value, psymtab_language, objfile);
                  else
                    add_psymbol_to_list (name, strlen (name), 1,
                                         VAR_DOMAIN, LOC_BLOCK,
+                                        section,
                                         &objfile->static_psymbols,
                                         sh.value, psymtab_language, objfile);
 
                  /* Kludge for Irix 5.2 zero fh->adr.  */
                  if (!relocatable
                      && (!pst->text_low_valid
-                         || procaddr < pst->text_low ()))
+                         || procaddr < pst->raw_text_low ()))
                    pst->set_text_low (procaddr);
 
                  high = procaddr + sh.value;
-                 if (high > pst->text_high ())
+                 if (high > pst->raw_text_high ())
                    pst->set_text_high (high);
                  continue;
 
                      && sh.index != cur_sdx + 2)
                    {
                      add_psymbol_to_list (name, strlen (name), 1,
-                                          STRUCT_DOMAIN, LOC_TYPEDEF,
+                                          STRUCT_DOMAIN, LOC_TYPEDEF, -1,
                                           &objfile->static_psymbols,
                                           0, psymtab_language, objfile);
                    }
                }
              /* Use this gdb symbol.  */
              add_psymbol_to_list (name, strlen (name), 1,
-                                  VAR_DOMAIN, theclass,
+                                  VAR_DOMAIN, theclass, section,
                                   &objfile->static_psymbols,
                                   sh.value, psymtab_language, objfile);
            skip:
              SYMR *psh;
              char *name;
              CORE_ADDR svalue;
+             short section;
 
              if (ext_ptr->ifd != f_idx)
                internal_error (__FILE__, __LINE__,
              svalue = psh->value;
              switch (psh->sc)
                {
+               default:
                case scText:
                case scRConst:
-                 svalue += ANOFFSET (objfile->section_offsets,
-                                     SECT_OFF_TEXT (objfile));
+                 section = SECT_OFF_TEXT (objfile);
                  break;
                case scData:
                case scSData:
                case scRData:
                case scPData:
                case scXData:
-                 svalue += ANOFFSET (objfile->section_offsets,
-                                     SECT_OFF_DATA (objfile));
+                 section = SECT_OFF_DATA (objfile);
                  break;
                case scBss:
                case scSBss:
-                 svalue += ANOFFSET (objfile->section_offsets,
-                                     SECT_OFF_BSS (objfile));
+                 section = SECT_OFF_BSS (objfile);
                  break;
                }
 
              name = debug_info->ssext + psh->iss;
              add_psymbol_to_list (name, strlen (name), 1,
                                   VAR_DOMAIN, theclass,
+                                  section,
                                   &objfile->global_psymbols,
                                   svalue, psymtab_language, objfile);
            }
       fdr_to_pst[f_idx].pst
        = dbx_end_psymtab (objfile, save_pst,
                           psymtab_include_list, includes_used,
-                          -1, save_pst->text_high (),
+                          -1, save_pst->raw_text_high (),
                           dependency_list, dependencies_used,
                           textlow_not_set);
       includes_used = 0;
          ALL_OBJFILE_PSYMTABS (objfile, pst)
          {
            if (save_pst != pst
-               && save_pst->text_low () >= pst->text_low ()
-               && save_pst->text_low () < pst->text_high ()
-               && save_pst->text_high () > pst->text_high ())
+               && save_pst->raw_text_low () >= pst->raw_text_low ()
+               && save_pst->raw_text_low () < pst->raw_text_high ()
+               && save_pst->raw_text_high () > pst->raw_text_high ())
              {
                objfile->flags |= OBJF_REORDERED;
                break;
       /* Note that the value doesn't matter for enum constants
          in psymtabs, just in symtabs.  */
       add_psymbol_to_list (name, strlen (name), 1,
-                          VAR_DOMAIN, LOC_CONST,
-                          &objfile->static_psymbols,
-                          0, psymtab_language, objfile);
+                          VAR_DOMAIN, LOC_CONST, -1,
+                          &objfile->static_psymbols, 0,
+                          psymtab_language, objfile);
       ext_sym += external_sym_size;
     }
 }
 
       if (! last_symtab_ended)
        {
-         cust = end_symtab (pst->text_high (), SECT_OFF_TEXT (objfile));
+         cust = end_symtab (pst->raw_text_high (), SECT_OFF_TEXT (objfile));
          end_stabs ();
        }
 
       top_stack->cur_st = COMPUNIT_FILETABS (cust);
       top_stack->cur_block
        = BLOCKVECTOR_BLOCK (COMPUNIT_BLOCKVECTOR (cust), STATIC_BLOCK);
-      BLOCK_START (top_stack->cur_block) = pst->text_low ();
+      BLOCK_START (top_stack->cur_block) = pst->text_low (objfile);
       BLOCK_END (top_stack->cur_block) = 0;
       top_stack->blocktype = stFile;
       top_stack->cur_type = 0;
                }
 
              parse_lines (fh, pr_block.data (), lines, maxlines,
-                          pst, lowest_pdr_addr);
+                          pst->text_low (objfile), lowest_pdr_addr);
              if (lines->nitems < fh->cline)
                lines = shrink_linetable (lines);
 
 
     }
   }
 
+  /* This stores relocated addresses and so must be cleared.  This
+     will cause it to be recreated on demand.  */
+  objfile->psymbol_map.clear ();
+
   /* Relocate isolated symbols.  */
   {
     struct symbol *iter;
       relocate_one_symbol (iter, objfile, delta);
   }
 
-  if (objfile->psymtabs_addrmap)
-    addrmap_relocate (objfile->psymtabs_addrmap,
-                     ANOFFSET (delta, SECT_OFF_TEXT (objfile)));
-
-  if (objfile->sf)
-    objfile->sf->qf->relocate (objfile, new_offsets, delta);
-
   {
     int i;
 
 
      the offsets provided in OBJFILE.  */
   CORE_ADDR address (const struct objfile *objfile) const
   {
-    return value.address;
+    return value.address + ANOFFSET (objfile->section_offsets, section);
   }
 
   /* Set the address of this partial symbol.  The address must be
      unrelocated.  */
-  void set_address (CORE_ADDR addr)
+  void set_unrelocated_address (CORE_ADDR addr)
   {
     value.address = addr;
   }
 
 struct partial_symtab
 {
-  /* Return the low text address of this partial_symtab.  */
-  CORE_ADDR text_low () const
+  /* Return the raw low text address of this partial_symtab.  */
+  CORE_ADDR raw_text_low () const
   {
     return m_text_low;
   }
 
-  /* Return the high text address of this partial_symtab.  */
-  CORE_ADDR text_high () const
+  /* Return the raw high text address of this partial_symtab.  */
+  CORE_ADDR raw_text_high () const
   {
     return m_text_high;
   }
 
+  /* Return the relocated low text address of this partial_symtab.  */
+  CORE_ADDR text_low (struct objfile *objfile) const
+  {
+    return m_text_low + ANOFFSET (objfile->section_offsets,
+                                 SECT_OFF_TEXT (objfile));
+  }
+
+  /* Return the relocated high text address of this partial_symtab.  */
+  CORE_ADDR text_high (struct objfile *objfile) const
+  {
+    return m_text_high + ANOFFSET (objfile->section_offsets,
+                                  SECT_OFF_TEXT (objfile));
+  }
+
   /* Set the low text address of this partial_symtab.  */
   void set_text_low (CORE_ADDR addr)
   {
 extern void add_psymbol_to_list (const char *, int,
                                 int, domain_enum,
                                 enum address_class,
+                                short /* section */,
                                 std::vector<partial_symbol *> *,
                                 CORE_ADDR,
                                 enum language, struct objfile *);
 
                                                    CORE_ADDR,
                                                    struct obj_section *);
 
-static void fixup_psymbol_section (struct partial_symbol *psym,
-                                  struct objfile *objfile);
-
 static struct compunit_symtab *psymtab_to_symtab (struct objfile *objfile,
                                                  struct partial_symtab *pst);
 
 {
   struct partial_symtab *tpst;
   struct partial_symtab *best_pst = pst;
-  CORE_ADDR best_addr = pst->text_low ();
+  CORE_ADDR best_addr = pst->text_low (objfile);
 
   gdb_assert (!pst->psymtabs_addrmap_supported);
 
      that is closest and still less than the given PC.  */
   for (tpst = pst; tpst != NULL; tpst = tpst->next)
     {
-      if (pc >= tpst->text_low () && pc < tpst->text_high ())
+      if (pc >= tpst->text_low (objfile) && pc < tpst->text_high (objfile))
        {
          struct partial_symbol *p;
          CORE_ADDR this_addr;
          if (p != NULL)
            this_addr = p->address (objfile);
          else
-           this_addr = tpst->text_low ();
+           this_addr = tpst->text_low (objfile);
 
          /* Check whether it is closer than our current
             BEST_ADDR.  Since this symbol address is
                      struct bound_minimal_symbol msymbol)
 {
   struct partial_symtab *pst;
+  CORE_ADDR baseaddr = ANOFFSET (objfile->section_offsets,
+                                SECT_OFF_TEXT (objfile));
 
   /* Try just the PSYMTABS_ADDRMAP mapping first as it has better granularity
      than the later used TEXTLOW/TEXTHIGH one.  */
   if (objfile->psymtabs_addrmap != NULL)
     {
       pst = ((struct partial_symtab *)
-            addrmap_find (objfile->psymtabs_addrmap, pc));
+            addrmap_find (objfile->psymtabs_addrmap, pc - baseaddr));
       if (pst != NULL)
        {
          /* FIXME: addrmaps currently do not handle overlayed sections,
 
   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst)
     if (!pst->psymtabs_addrmap_supported
-       && pc >= pst->text_low () && pc < pst->text_high ())
+       && pc >= pst->text_low (objfile) && pc < pst->text_high (objfile))
       {
        struct partial_symtab *best_pst;
 
 {
   struct partial_symbol *best = NULL;
   CORE_ADDR best_pc;
+  const CORE_ADDR textlow = psymtab->text_low (objfile);
 
   gdb_assert (psymtab != NULL);
 
   /* Cope with programs that start at address 0.  */
-  best_pc = ((psymtab->text_low () != 0)
-            ? psymtab->text_low () - 1 : 0);
+  best_pc = (textlow != 0) ? textlow - 1 : 0;
 
   /* Search the global symbols as well as the static symbols, so that
      find_pc_partial_function doesn't use a minimal symbol and thus
          && p->aclass == LOC_BLOCK
          && pc >= p->address (objfile)
          && (p->address (objfile) > best_pc
-             || (psymtab->text_low () == 0
+             || (psymtab->text_low (objfile) == 0
                  && best_pc == 0 && p->address (objfile) == 0)))
        {
          if (section != NULL)  /* Match on a specific section.  */
            {
-             fixup_psymbol_section (p, objfile);
              if (!matching_obj_sections (p->obj_section (objfile),
                                          section))
                continue;
          && p->aclass == LOC_BLOCK
          && pc >= p->address (objfile)
          && (p->address (objfile) > best_pc
-             || (psymtab->text_low () == 0
+             || (psymtab->text_low (objfile) == 0
                  && best_pc == 0 && p->address (objfile) == 0)))
        {
          if (section != NULL)  /* Match on a specific section.  */
            {
-             fixup_psymbol_section (p, objfile);
              if (!matching_obj_sections (p->obj_section (objfile),
                                          section))
                continue;
   return best;
 }
 
-static void
-fixup_psymbol_section (struct partial_symbol *psym, struct objfile *objfile)
-{
-  CORE_ADDR addr;
-
-  if (psym == NULL)
-    return;
-
-  if (psym->section >= 0)
-    return;
-
-  gdb_assert (objfile);
-
-  switch (psym->aclass)
-    {
-    case LOC_STATIC:
-    case LOC_LABEL:
-    case LOC_BLOCK:
-      addr = psym->address (objfile);
-      break;
-    default:
-      /* Nothing else will be listed in the minsyms -- no use looking
-        it up.  */
-      return;
-    }
-
-  fixup_section (psym, addr, objfile);
-}
-
 /* Psymtab version of lookup_symbol.  See its definition in
    the definition of quick_symbol_functions in symfile.h.  */
 
   return pst->compunit_symtab;
 }
 
-/* Psymtab version of relocate.  See its definition in
-   the definition of quick_symbol_functions in symfile.h.  */
-
-static void
-psym_relocate (struct objfile *objfile,
-              const struct section_offsets *new_offsets,
-              const struct section_offsets *delta)
-{
-  struct partial_symtab *p;
-
-  ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, p)
-    {
-      p->set_text_low (p->text_low ()
-                      + ANOFFSET (delta, SECT_OFF_TEXT (objfile)));
-      p->set_text_high (p->text_high ()
-                       + ANOFFSET (delta, SECT_OFF_TEXT (objfile)));
-    }
-
-  for (partial_symbol *psym : objfile->global_psymbols)
-    {
-      fixup_psymbol_section (psym, objfile);
-      if (psym->section >= 0)
-       psym->set_address (psym->unrelocated_address ()
-                          + ANOFFSET (delta, psym->section));
-    }
-  for (partial_symbol *psym : objfile->static_psymbols)
-    {
-      fixup_psymbol_section (psym, objfile);
-      if (psym->section >= 0)
-       psym->set_address (psym->unrelocated_address ()
-                          + ANOFFSET (delta, psym->section));
-    }
-
-  objfile->psymbol_map.clear ();
-}
-
 /* Psymtab version of find_last_source_symtab.  See its definition in
    the definition of quick_symbol_functions in symfile.h.  */
 
     }
 
   fprintf_filtered (outfile, "  Symbols cover text addresses ");
-  fputs_filtered (paddress (gdbarch, psymtab->text_low ()), outfile);
+  fputs_filtered (paddress (gdbarch, psymtab->text_low (objfile)), outfile);
   fprintf_filtered (outfile, "-");
-  fputs_filtered (paddress (gdbarch, psymtab->text_high ()), outfile);
+  fputs_filtered (paddress (gdbarch, psymtab->text_high (objfile)), outfile);
   fprintf_filtered (outfile, "\n");
   fprintf_filtered (outfile, "  Address map supported - %s.\n",
                    psymtab->psymtabs_addrmap_supported ? "yes" : "no");
   psym_lookup_symbol,
   psym_print_stats,
   psym_dump,
-  psym_relocate,
   psym_expand_symtabs_for_function,
   psym_expand_all_symtabs,
   psym_expand_symtabs_with_fullname,
 
   psymtab = allocate_psymtab (filename, objfile);
   psymtab->set_text_low (textlow);
-  psymtab->set_text_high (psymtab->text_low ()); /* default */
+  psymtab->set_text_high (psymtab->raw_text_low ()); /* default */
   psymtab->globals_offset = global_psymbols.size ();
   psymtab->statics_offset = static_psymbols.size ();
   return psymtab;
 add_psymbol_to_bcache (const char *name, int namelength, int copy_name,
                       domain_enum domain,
                       enum address_class theclass,
+                      short section,
                       CORE_ADDR coreaddr,
                       enum language language, struct objfile *objfile,
                       int *added)
 {
   struct partial_symbol psymbol;
 
-  psymbol.set_address (coreaddr);
-  psymbol.section = -1;
+  psymbol.set_unrelocated_address (coreaddr);
+  psymbol.section = section;
   psymbol.domain = domain;
   psymbol.aclass = theclass;
 
 add_psymbol_to_list (const char *name, int namelength, int copy_name,
                     domain_enum domain,
                     enum address_class theclass,
+                    short section,
                     std::vector<partial_symbol *> *list,
                     CORE_ADDR coreaddr,
                     enum language language, struct objfile *objfile)
 
   /* Stash the partial symbol away in the cache.  */
   psym = add_psymbol_to_bcache (name, namelength, copy_name, domain, theclass,
-                               coreaddr, language, objfile, &added);
+                               section, coreaddr, language, objfile, &added);
 
   /* Do not duplicate global partial symbols.  */
   if (list == &objfile->global_psymbols
                               psymtab->fullname
                               ? psymtab->fullname : "(null)");
              printf_filtered ("    text addresses ");
-             fputs_filtered (paddress (gdbarch, psymtab->text_low ()),
+             fputs_filtered (paddress (gdbarch, psymtab->text_low (objfile)),
                              gdb_stdout);
              printf_filtered (" -- ");
-             fputs_filtered (paddress (gdbarch, psymtab->text_high ()),
+             fputs_filtered (paddress (gdbarch, psymtab->text_high (objfile)),
                              gdb_stdout);
              printf_filtered ("\n");
              printf_filtered ("    psymtabs_addrmap_supported %s\n",
     cust = ps->compunit_symtab;
 
     /* First do some checks that don't require the associated symtab.  */
-    if (ps->text_high () < ps->text_low ())
+    if (ps->text_high (objfile) < ps->text_low (objfile))
       {
        printf_filtered ("Psymtab ");
        puts_filtered (ps->filename);
        printf_filtered (" covers bad range ");
-       fputs_filtered (paddress (gdbarch, ps->text_low ()), gdb_stdout);
+       fputs_filtered (paddress (gdbarch, ps->text_low (objfile)),
+                       gdb_stdout);
        printf_filtered (" - ");
-       fputs_filtered (paddress (gdbarch, ps->text_high ()), gdb_stdout);
+       fputs_filtered (paddress (gdbarch, ps->text_high (objfile)),
+                       gdb_stdout);
        printf_filtered ("\n");
        continue;
       }
          }
        psym++;
       }
-    if (ps->text_high () != 0
-       && (ps->text_low () < BLOCK_START (b)
-           || ps->text_high () > BLOCK_END (b)))
+    if (ps->raw_text_high () != 0
+       && (ps->text_low (objfile) < BLOCK_START (b)
+           || ps->text_high (objfile) > BLOCK_END (b)))
       {
        printf_filtered ("Psymtab ");
        puts_filtered (ps->filename);
        printf_filtered (" covers ");
-       fputs_filtered (paddress (gdbarch, ps->text_low ()), gdb_stdout);
+       fputs_filtered (paddress (gdbarch, ps->text_low (objfile)),
+                       gdb_stdout);
        printf_filtered (" - ");
-       fputs_filtered (paddress (gdbarch, ps->text_high ()), gdb_stdout);
+       fputs_filtered (paddress (gdbarch, ps->text_high (objfile)),
+                       gdb_stdout);
        printf_filtered (" but symtab covers only ");
        fputs_filtered (paddress (gdbarch, BLOCK_START (b)), gdb_stdout);
        printf_filtered (" - ");
 
   debug_data->real_sf->qf->dump (objfile);
 }
 
-static void
-debug_qf_relocate (struct objfile *objfile,
-                  const struct section_offsets *new_offsets,
-                  const struct section_offsets *delta)
-{
-  const struct debug_sym_fns_data *debug_data
-    = ((const struct debug_sym_fns_data *)
-       objfile_data (objfile, symfile_debug_objfile_data_key));
-
-  fprintf_filtered (gdb_stdlog, "qf->relocate (%s, %s, %s)\n",
-                   objfile_debug_name (objfile),
-                   host_address_to_string (new_offsets),
-                   host_address_to_string (delta));
-
-  debug_data->real_sf->qf->relocate (objfile, new_offsets, delta);
-}
-
 static void
 debug_qf_expand_symtabs_for_function (struct objfile *objfile,
                                      const char *func_name)
   debug_qf_lookup_symbol,
   debug_qf_print_stats,
   debug_qf_dump,
-  debug_qf_relocate,
   debug_qf_expand_symtabs_for_function,
   debug_qf_expand_all_symtabs,
   debug_qf_expand_symtabs_with_fullname,
 
      gdb_stdout.  This is used for "maint print objfiles".  */
   void (*dump) (struct objfile *objfile);
 
-  /* This is called by objfile_relocate to relocate any indices loaded
-     for OBJFILE.  */
-  void (*relocate) (struct objfile *objfile,
-                   const struct section_offsets *new_offsets,
-                   const struct section_offsets *delta);
-
   /* Find all the symbols in OBJFILE named FUNC_NAME, and ensure that
      the corresponding symbol tables are loaded.  */
   void (*expand_symtabs_for_function) (struct objfile *objfile,
 
                        CORE_ADDR highval =
                          symbol.n_value + csect_aux.x_csect.x_scnlen.l;
 
-                       if (highval > pst->text_high ())
+                       if (highval > pst->raw_text_high ())
                          pst->set_text_high (highval);
                        if (!pst->text_low_valid
-                           || symbol.n_value < pst->text_low ())
+                           || symbol.n_value < pst->raw_text_low ())
                          pst->set_text_low (symbol.n_value);
                      }
                    misc_func_recorded = 0;
            switch (p[1])
              {
              case 'S':
-               symbol.n_value += ANOFFSET (objfile->section_offsets,
-                                           SECT_OFF_DATA (objfile));
-
                if (gdbarch_static_transform_name_p (gdbarch))
                  namestring = gdbarch_static_transform_name
                                 (gdbarch, namestring);
 
                add_psymbol_to_list (namestring, p - namestring, 1,
                                     VAR_DOMAIN, LOC_STATIC,
+                                    SECT_OFF_DATA (objfile),
                                     &objfile->static_psymbols,
                                     symbol.n_value,
                                     psymtab_language, objfile);
                continue;
 
              case 'G':
-               symbol.n_value += ANOFFSET (objfile->section_offsets,
-                                           SECT_OFF_DATA (objfile));
                /* The addresses in these entries are reported to be
                   wrong.  See the code that reads 'G's for symtabs.  */
                add_psymbol_to_list (namestring, p - namestring, 1,
                                     VAR_DOMAIN, LOC_STATIC,
+                                    SECT_OFF_DATA (objfile),
                                     &objfile->global_psymbols,
                                     symbol.n_value,
                                     psymtab_language, objfile);
                        && namestring[0] != ' '))
                  {
                    add_psymbol_to_list (namestring, p - namestring, 1,
-                                        STRUCT_DOMAIN, LOC_TYPEDEF,
+                                        STRUCT_DOMAIN, LOC_TYPEDEF, -1,
                                         &objfile->static_psymbols,
                                         0, psymtab_language, objfile);
                    if (p[2] == 't')
                      {
                        /* Also a typedef with the same name.  */
                        add_psymbol_to_list (namestring, p - namestring, 1,
-                                            VAR_DOMAIN, LOC_TYPEDEF,
+                                            VAR_DOMAIN, LOC_TYPEDEF, -1,
                                             &objfile->static_psymbols,
                                             0, psymtab_language, objfile);
                        p += 1;
                if (p != namestring)    /* a name is there, not just :T...  */
                  {
                    add_psymbol_to_list (namestring, p - namestring, 1,
-                                        VAR_DOMAIN, LOC_TYPEDEF,
+                                        VAR_DOMAIN, LOC_TYPEDEF, -1,
                                         &objfile->static_psymbols,
                                         0, psymtab_language, objfile);
                  }
                        /* Note that the value doesn't matter for
                           enum constants in psymtabs, just in symtabs.  */
                        add_psymbol_to_list (p, q - p, 1,
-                                            VAR_DOMAIN, LOC_CONST,
+                                            VAR_DOMAIN, LOC_CONST, -1,
                                             &objfile->static_psymbols,
                                             0, psymtab_language, objfile);
                        /* Point past the name.  */
              case 'c':
                /* Constant, e.g. from "const" in Pascal.  */
                add_psymbol_to_list (namestring, p - namestring, 1,
-                                    VAR_DOMAIN, LOC_CONST,
+                                    VAR_DOMAIN, LOC_CONST, -1,
                                     &objfile->static_psymbols,
                                     0, psymtab_language, objfile);
                continue;
                    function_outside_compilation_unit_complaint (name);
                    xfree (name);
                  }
-               symbol.n_value += ANOFFSET (objfile->section_offsets,
-                                           SECT_OFF_TEXT (objfile));
                add_psymbol_to_list (namestring, p - namestring, 1,
                                     VAR_DOMAIN, LOC_BLOCK,
+                                    SECT_OFF_TEXT (objfile),
                                     &objfile->static_psymbols,
                                     symbol.n_value,
                                     psymtab_language, objfile);
                if (startswith (namestring, "@FIX"))
                  continue;
 
-               symbol.n_value += ANOFFSET (objfile->section_offsets,
-                                           SECT_OFF_TEXT (objfile));
                add_psymbol_to_list (namestring, p - namestring, 1,
                                     VAR_DOMAIN, LOC_BLOCK,
+                                    SECT_OFF_TEXT (objfile),
                                     &objfile->global_psymbols,
                                     symbol.n_value,
                                     psymtab_language, objfile);