This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[RFC 7/7] make psymbols and psymtabs independent of the program space


This patch finally makes partial symbols and partial symtabs
independent of the program space.

Specifically:

It changes add_psymbol_to_list to accept a section index, and changes
the psymbol readers to pass this.  At the same time it removes the
code to add the objfile's section offset to the psymbol.

It adds an objfile argument to the psymtab textlow and texthigh
accessors and changes some code to use the raw variants instead.

It removes the "relocate" method from struct quick_symbol_functions,
as it is no longer needed any more.

It removes the "0 *" from PSYMBOL_VALUE_ADDRESS, so that the relevant
offset is now applied at the point of use.

2014-02-20  Tom Tromey  <tromey@redhat.com>

	* dbxread.c (find_stab_function_addr): Use
	MSYMBOL_VALUE_RAW_ADDRESS.
	(read_dbx_symtab): Use PSYMTAB_RAW_TEXTLOW, PSYMTAB_RAW_TEXTHIGH.
	Don't add objfile offsets.
	(end_psymtab): Use PSYMTAB_RAW_TEXTLOW, PSYMTAB_RAW_TEXTHIGH,
	MSYMBOL_VALUE_RAW_ADDRESS.
	(read_ofile_symtab): 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): Update.
	(process_psymtab_comp_unit_reader, add_partial_symbol)
	(add_partial_subprogram, dwarf2_ranges_read): Don't add objfile
	offsets.  Update.
	(load_partial_dies): Update.
	(add_address_entry): Don't add objfile offsets.
	* 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
	PSYMTAB_RAW_TEXTLOW, PSYMTAB_RAW_TEXTHIGH.  Update.
	(handle_psymbol_enumerators, psymtab_to_symtab_1): Update.
	* objfiles.c (objfile_relocate1): Don't relocate psymtabs_addrmap
	or call 'relocate' quick function.
	* psympriv.h (PSYMBOL_VALUE_ADDRESS): Remove "0 *".
	(PSYMTAB_RAW_TEXTLOW, PSYMTAB_RAW_TEXTHIGH): New macros.
	(PSYMTAB_TEXTLOW, PSYMTAB_TEXTHIGH): Add 'objfile' parameter.
	(add_psymbol_to_bcache): Add 'section' parameter.
	* 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.
	* 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.
---
 gdb/ChangeLog       |  45 +++++++++++++++++
 gdb/dbxread.c       |  81 +++++++++++++------------------
 gdb/dwarf2read.c    |  80 +++++++++++--------------------
 gdb/mdebugread.c    | 131 ++++++++++++++++++++++++--------------------------
 gdb/objfiles.c      |   7 ---
 gdb/psympriv.h      |  14 ++++--
 gdb/psymtab.c       | 136 ++++++++++++++++------------------------------------
 gdb/symfile-debug.c |  17 -------
 gdb/symfile.h       |   6 ---
 gdb/xcoffread.c     |  27 +++++------
 10 files changed, 232 insertions(+), 312 deletions(-)

diff --git a/gdb/dbxread.c b/gdb/dbxread.c
index bdb81ce..2b8d224 100644
--- a/gdb/dbxread.c
+++ b/gdb/dbxread.c
@@ -1162,7 +1162,7 @@ find_stab_function_addr (char *namestring, const char *filename,
       msym = lookup_minimal_symbol (p, NULL, objfile);
     }
 
-  return msym.minsym == NULL ? 0 : BMSYMBOL_VALUE_ADDRESS (msym);
+  return msym.minsym == NULL ? 0 : MSYMBOL_VALUE_RAW_ADDRESS (msym.minsym);
 }
 
 static void
@@ -1357,18 +1357,15 @@ read_dbx_symtab (struct objfile *objfile)
 	      || (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 >= PSYMTAB_TEXTLOW (pst))
+		  && nlist.n_value >= PSYMTAB_RAW_TEXTLOW (pst))
 		{
 		  end_psymtab (objfile, pst, psymtab_include_list,
 			       includes_used, symnum * symbol_size,
-			       nlist.n_value > PSYMTAB_TEXTHIGH (pst)
-			       ? nlist.n_value : PSYMTAB_TEXTHIGH (pst),
+			       nlist.n_value > PSYMTAB_RAW_TEXTHIGH (pst)
+			       ? nlist.n_value : PSYMTAB_RAW_TEXTHIGH (pst),
 			       dependency_list, dependencies_used,
 			       textlow_not_set);
 		  pst = (struct partial_symtab *) 0;
@@ -1456,8 +1453,7 @@ read_dbx_symtab (struct objfile *objfile)
 	    static 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;
 
@@ -1484,8 +1480,8 @@ read_dbx_symtab (struct objfile *objfile)
 		  {
 		    end_psymtab (objfile, pst, psymtab_include_list,
 				 includes_used, symnum * symbol_size,
-				 (valu > PSYMTAB_TEXTHIGH (pst)
-				  ? valu : PSYMTAB_TEXTHIGH (pst)),
+				 (valu > PSYMTAB_RAW_TEXTHIGH (pst)
+				  ? valu : PSYMTAB_RAW_TEXTHIGH (pst)),
 				 dependency_list, dependencies_used,
 				 prev_textlow_not_set);
 		    pst = (struct partial_symtab *) 0;
@@ -1660,7 +1656,8 @@ read_dbx_symtab (struct objfile *objfile)
 		 function relative stabs, or the address of the function's
 		 end for old style stabs.  */
 	      valu = nlist.n_value + last_function_start;
-	      if (PSYMTAB_TEXTHIGH (pst) == 0 || valu > PSYMTAB_TEXTHIGH (pst))
+	      if (PSYMTAB_RAW_TEXTHIGH (pst) == 0
+		  || valu > PSYMTAB_RAW_TEXTHIGH (pst))
 		SET_PSYMTAB_TEXTHIGH (pst, valu);
 	      break;
 	    }
@@ -1704,26 +1701,23 @@ read_dbx_symtab (struct objfile *objfile)
 	  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,
 				   0, 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,
 				   0, nlist.n_value,
 				   psymtab_language, objfile);
@@ -1741,7 +1735,7 @@ read_dbx_symtab (struct objfile *objfile)
 		      && namestring[0] != ' '))
 		{
 		  add_psymbol_to_list (sym_name, sym_len, 1,
-				       STRUCT_DOMAIN, LOC_TYPEDEF,
+				       STRUCT_DOMAIN, LOC_TYPEDEF, -1,
 				       &objfile->static_psymbols,
 				       nlist.n_value, 0,
 				       psymtab_language, objfile);
@@ -1749,7 +1743,7 @@ read_dbx_symtab (struct objfile *objfile)
 		    {
 		      /* 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,
 					   nlist.n_value, 0,
 					   psymtab_language, objfile);
@@ -1762,7 +1756,7 @@ read_dbx_symtab (struct objfile *objfile)
 	      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,
 				       nlist.n_value, 0,
 				       psymtab_language, objfile);
@@ -1824,7 +1818,7 @@ read_dbx_symtab (struct objfile *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,
 					   0, psymtab_language, objfile);
 		      /* Point past the name.  */
@@ -1842,7 +1836,7 @@ read_dbx_symtab (struct objfile *objfile)
 	    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, nlist.n_value,
 				   0, psymtab_language, objfile);
 	      continue;
@@ -1858,14 +1852,11 @@ read_dbx_symtab (struct objfile *objfile)
 		  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 = 
@@ -1899,16 +1890,15 @@ read_dbx_symtab (struct objfile *objfile)
 		 the partial symbol table.  */
 	      if (pst
 		  && (textlow_not_set
-		      || (nlist.n_value < PSYMTAB_TEXTLOW (pst)
-			  && (nlist.n_value
-			      != ANOFFSET (objfile->section_offsets,
-					   SECT_OFF_TEXT (objfile))))))
+		      || (nlist.n_value < PSYMTAB_RAW_TEXTLOW (pst)
+			  && (nlist.n_value != 0))))
 		{
 		  SET_PSYMTAB_TEXTLOW (pst, 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,
 				   0, nlist.n_value,
 				   psymtab_language, objfile);
@@ -1928,14 +1918,11 @@ read_dbx_symtab (struct objfile *objfile)
 		  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 = 
@@ -1969,16 +1956,15 @@ read_dbx_symtab (struct objfile *objfile)
 		 the partial symbol table.  */
 	      if (pst
 		  && (textlow_not_set
-		      || (nlist.n_value < PSYMTAB_TEXTLOW (pst)
-			  && (nlist.n_value
-			      != ANOFFSET (objfile->section_offsets,
-					   SECT_OFF_TEXT (objfile))))))
+		      || (nlist.n_value < PSYMTAB_RAW_TEXTLOW (pst)
+			  && (nlist.n_value != 0))))
 		{
 		  SET_PSYMTAB_TEXTLOW (pst, 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,
 				   0, nlist.n_value,
 				   psymtab_language, objfile);
@@ -2152,15 +2138,14 @@ read_dbx_symtab (struct objfile *objfile)
       /* Don't set pst->texthigh lower than it already 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;
 
       end_psymtab (objfile, pst, psymtab_include_list, includes_used,
 		   symnum * symbol_size,
-		   (text_end > PSYMTAB_TEXTHIGH (pst)
-		    ? text_end : PSYMTAB_TEXTHIGH (pst)),
+		   (text_end > PSYMTAB_RAW_TEXTHIGH (pst)
+		    ? text_end : PSYMTAB_RAW_TEXTHIGH (pst)),
 		   dependency_list, dependencies_used, textlow_not_set);
     }
 
@@ -2239,7 +2224,7 @@ end_psymtab (struct objfile *objfile, struct partial_symtab *pst,
      a reliable texthigh by taking the address plus size of the
      last function in the file.  */
 
-  if (PSYMTAB_TEXTHIGH (pst) == 0 && last_function_name
+  if (PSYMTAB_RAW_TEXTHIGH (pst) == 0 && last_function_name
       && gdbarch_sofun_address_maybe_missing (gdbarch))
     {
       char *p;
@@ -2266,7 +2251,7 @@ end_psymtab (struct objfile *objfile, struct partial_symtab *pst,
 	}
 
       if (minsym.minsym)
-	SET_PSYMTAB_TEXTHIGH (pst, (BMSYMBOL_VALUE_ADDRESS (minsym)
+	SET_PSYMTAB_TEXTHIGH (pst, (MSYMBOL_VALUE_RAW_ADDRESS (minsym.minsym)
 				    + MSYMBOL_SIZE (minsym.minsym)));
 
       last_function_name = NULL;
@@ -2276,7 +2261,7 @@ end_psymtab (struct objfile *objfile, struct partial_symtab *pst,
     ;
   /* This test will be true if the last .o file is only data.  */
   else if (textlow_not_set)
-    SET_PSYMTAB_TEXTLOW (pst, PSYMTAB_TEXTHIGH (pst));
+    SET_PSYMTAB_TEXTLOW (pst, PSYMTAB_RAW_TEXTHIGH (pst));
   else
     {
       struct partial_symtab *p1;
@@ -2289,7 +2274,7 @@ end_psymtab (struct objfile *objfile, struct partial_symtab *pst,
       ALL_OBJFILE_PSYMTABS (objfile, p1)
       {
 	if (!p1->texthigh_valid && p1->textlow_valid && p1 != pst)
-	  SET_PSYMTAB_TEXTHIGH (p1, PSYMTAB_TEXTLOW (pst));
+	  SET_PSYMTAB_TEXTHIGH (p1, PSYMTAB_RAW_TEXTLOW (pst));
       }
     }
 
@@ -2497,8 +2482,8 @@ read_ofile_symtab (struct objfile *objfile, struct partial_symtab *pst)
 
   sym_offset = LDSYMOFF (pst);
   sym_size = LDSYMLEN (pst);
-  text_offset = PSYMTAB_TEXTLOW (pst);
-  text_size = PSYMTAB_TEXTHIGH (pst) - PSYMTAB_TEXTLOW (pst);
+  text_offset = PSYMTAB_TEXTLOW (objfile, pst);
+  text_size = PSYMTAB_TEXTHIGH (objfile, pst) - PSYMTAB_TEXTLOW (objfile, pst);
   section_offsets = pst->section_offsets;
 
   dbxread_objfile = objfile;
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index df95d04..8fdc22d 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -2818,7 +2818,6 @@ create_addrmap_from_index (struct objfile *objfile, struct mapped_index *index)
   struct obstack temp_obstack;
   struct addrmap *mutable_map;
   struct cleanup *cleanup;
-  CORE_ADDR baseaddr;
 
   obstack_init (&temp_obstack);
   cleanup = make_cleanup_obstack_free (&temp_obstack);
@@ -2827,8 +2826,6 @@ create_addrmap_from_index (struct objfile *objfile, struct mapped_index *index)
   iter = index->address_table;
   end = iter + index->address_table_size;
 
-  baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
-
   while (iter < end)
     {
       ULONGEST hi, lo, cu_index;
@@ -2855,8 +2852,7 @@ create_addrmap_from_index (struct objfile *objfile, struct mapped_index *index)
 	  continue;
 	}
 
-      addrmap_set_empty (mutable_map, lo + baseaddr, hi + baseaddr - 1,
-			 dw2_get_cu (cu_index));
+      addrmap_set_empty (mutable_map, lo, hi - 1, dw2_get_cu (cu_index));
     }
 
   objfile->psymtabs_addrmap = addrmap_create_fixed (mutable_map,
@@ -3666,14 +3662,6 @@ dw2_dump (struct objfile *objfile)
 }
 
 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)
 {
@@ -3985,13 +3973,15 @@ dw2_find_pc_sect_symtab (struct objfile *objfile,
 {
   struct dwarf2_per_cu_data *data;
   struct symtab *result;
+  CORE_ADDR baseaddr
+    = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
 
   dw2_setup (objfile);
 
   if (!objfile->psymtabs_addrmap)
     return NULL;
 
-  data = addrmap_find (objfile->psymtabs_addrmap, pc);
+  data = addrmap_find (objfile->psymtabs_addrmap, pc - baseaddr);
   if (!data)
     return NULL;
 
@@ -4086,7 +4076,6 @@ const struct quick_symbol_functions dwarf2_gdb_index_functions =
   dw2_lookup_symbol,
   dw2_print_stats,
   dw2_dump,
-  dw2_relocate,
   dw2_expand_symtabs_for_function,
   dw2_expand_all_symtabs,
   dw2_expand_symtabs_with_fullname,
@@ -5965,7 +5954,6 @@ process_psymtab_comp_unit_reader (const struct die_reader_specs *reader,
   struct objfile *objfile = cu->objfile;
   struct dwarf2_per_cu_data *per_cu = cu->per_cu;
   struct attribute *attr;
-  CORE_ADDR baseaddr;
   CORE_ADDR best_lowpc = 0, best_highpc = 0;
   struct partial_symtab *pst;
   int has_pc_info;
@@ -5995,8 +5983,6 @@ process_psymtab_comp_unit_reader (const struct die_reader_specs *reader,
   if (attr != NULL)
     pst->dirname = DW_STRING (attr);
 
-  baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
-
   dwarf2_find_base_address (comp_unit_die, cu);
 
   /* Possibly set the default values of LOWPC and HIGHPC from
@@ -6007,8 +5993,7 @@ process_psymtab_comp_unit_reader (const struct die_reader_specs *reader,
     /* Store the contiguous range if it is not empty; it can be empty for
        CUs with no code.  */
     addrmap_set_empty (objfile->psymtabs_addrmap,
-		       best_lowpc + baseaddr,
-		       best_highpc + baseaddr - 1, pst);
+		       best_lowpc, best_highpc - 1, pst);
 
   /* Check if comp unit has_children.
      If so, read the rest of the partial symbols from this comp unit.
@@ -6039,8 +6024,8 @@ process_psymtab_comp_unit_reader (const struct die_reader_specs *reader,
 	  best_highpc = highpc;
 	}
     }
-  SET_PSYMTAB_TEXTLOW (pst, best_lowpc + baseaddr);
-  SET_PSYMTAB_TEXTHIGH (pst, best_highpc + baseaddr);
+  SET_PSYMTAB_TEXTLOW (pst, best_lowpc);
+  SET_PSYMTAB_TEXTHIGH (pst, best_highpc);
 
   pst->n_global_syms = objfile->global_psymbols.next -
     (objfile->global_psymbols.list + pst->globals_offset);
@@ -6081,8 +6066,8 @@ process_psymtab_comp_unit_reader (const struct die_reader_specs *reader,
 			  ", %d global, %d static syms\n",
 			  per_cu->is_debug_types ? "type" : "comp",
 			  per_cu->offset.sect_off,
-			  paddress (gdbarch, PSYMTAB_TEXTLOW (pst)),
-			  paddress (gdbarch, PSYMTAB_TEXTHIGH (pst)),
+			  paddress (gdbarch, PSYMTAB_TEXTLOW (objfile, pst)),
+			  paddress (gdbarch, PSYMTAB_TEXTHIGH (objfile, pst)),
 			  pst->n_global_syms, pst->n_static_syms);
     }
 }
@@ -6673,11 +6658,8 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
   struct objfile *objfile = cu->objfile;
   CORE_ADDR addr = 0;
   const char *actual_name = NULL;
-  CORE_ADDR baseaddr;
   char *built_actual_name;
 
-  baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
-
   built_actual_name = partial_die_full_name (pdi, cu);
   if (built_actual_name != NULL)
     actual_name = built_actual_name;
@@ -6699,8 +6681,9 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
 	  add_psymbol_to_list (actual_name, strlen (actual_name),
 			       built_actual_name != NULL,
 			       VAR_DOMAIN, LOC_BLOCK,
+			       SECT_OFF_TEXT (objfile),
 			       &objfile->global_psymbols,
-			       0, pdi->lowpc + baseaddr,
+			       0, pdi->lowpc,
 			       cu->language, objfile);
 	}
       else
@@ -6710,8 +6693,9 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
 	  add_psymbol_to_list (actual_name, strlen (actual_name),
 			       built_actual_name != NULL,
 			       VAR_DOMAIN, LOC_BLOCK,
+			       SECT_OFF_TEXT (objfile),
 			       &objfile->static_psymbols,
-			       0, pdi->lowpc + baseaddr,
+			       0, pdi->lowpc,
 			       cu->language, objfile);
 	}
       break;
@@ -6725,6 +6709,7 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
 	  list = &objfile->static_psymbols;
 	add_psymbol_to_list (actual_name, strlen (actual_name),
 			     built_actual_name != NULL, VAR_DOMAIN, LOC_STATIC,
+			     -1,
 			     list, 0, 0, cu->language, objfile);
       }
       break;
@@ -6760,8 +6745,9 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
 	    add_psymbol_to_list (actual_name, strlen (actual_name),
 				 built_actual_name != NULL,
 				 VAR_DOMAIN, LOC_STATIC,
+				 SECT_OFF_TEXT (objfile),
 				 &objfile->global_psymbols,
-				 0, addr + baseaddr,
+				 0, addr,
 				 cu->language, objfile);
 	}
       else
@@ -6777,8 +6763,9 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
 	  add_psymbol_to_list (actual_name, strlen (actual_name),
 			       built_actual_name != NULL,
 			       VAR_DOMAIN, LOC_STATIC,
+			       SECT_OFF_TEXT (objfile),
 			       &objfile->static_psymbols,
-			       0, addr + baseaddr,
+			       0, addr,
 			       cu->language, objfile);
 	}
       break;
@@ -6787,7 +6774,7 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
     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, (CORE_ADDR) 0, cu->language, objfile);
       break;
@@ -6795,14 +6782,14 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
     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, (CORE_ADDR) 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, (CORE_ADDR) 0, cu->language, objfile);
       break;
@@ -6826,7 +6813,7 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
 	 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
 			    || cu->language == language_java)
 			   ? &objfile->global_psymbols
@@ -6837,7 +6824,7 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
     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
 			    || cu->language == language_java)
 			   ? &objfile->global_psymbols
@@ -6911,14 +6898,10 @@ add_partial_subprogram (struct partial_die_info *pdi,
             *highpc = pdi->highpc;
 	  if (need_pc)
 	    {
-	      CORE_ADDR baseaddr;
 	      struct objfile *objfile = cu->objfile;
 
-	      baseaddr = ANOFFSET (objfile->section_offsets,
-				   SECT_OFF_TEXT (objfile));
 	      addrmap_set_empty (objfile->psymtabs_addrmap,
-				 pdi->lowpc + baseaddr,
-				 pdi->highpc - 1 + baseaddr,
+				 pdi->lowpc, pdi->highpc - 1,
 				 cu->per_cu->v.psymtab);
 	    }
         }
@@ -11615,9 +11598,7 @@ dwarf2_ranges_read (unsigned offset, CORE_ADDR *low_return,
 
       if (ranges_pst != NULL)
 	addrmap_set_empty (objfile->psymtabs_addrmap,
-			   range_beginning + baseaddr,
-			   range_end - 1 + baseaddr,
-			   ranges_pst);
+			   range_beginning, range_end - 1, ranges_pst);
 
       /* FIXME: This is recording everything as a low-high
 	 segment of consecutive addresses.  We should have a
@@ -15026,7 +15007,7 @@ load_partial_dies (const struct die_reader_specs *reader,
 	{
 	  if (building_psymtab && part_die->name != NULL)
 	    add_psymbol_to_list (part_die->name, strlen (part_die->name), 0,
-				 VAR_DOMAIN, LOC_TYPEDEF,
+				 VAR_DOMAIN, LOC_TYPEDEF, -1,
 				 &objfile->static_psymbols,
 				 0, (CORE_ADDR) 0, cu->language, objfile);
 	  info_ptr = locate_pdi_sibling (reader, part_die, info_ptr);
@@ -15062,7 +15043,7 @@ load_partial_dies (const struct die_reader_specs *reader,
 		       _("malformed enumerator DIE ignored"));
 	  else if (building_psymtab)
 	    add_psymbol_to_list (part_die->name, strlen (part_die->name), 0,
-				 VAR_DOMAIN, LOC_CONST,
+				 VAR_DOMAIN, LOC_CONST, -1,
 				 (cu->language == language_cplus
 				  || cu->language == language_java)
 				 ? &objfile->global_psymbols
@@ -21994,13 +21975,10 @@ add_address_entry (struct objfile *objfile, struct obstack *obstack,
 {
   offset_type cu_index_to_write;
   gdb_byte addr[8];
-  CORE_ADDR baseaddr;
-
-  baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
 
-  store_unsigned_integer (addr, 8, BFD_ENDIAN_LITTLE, start - baseaddr);
+  store_unsigned_integer (addr, 8, BFD_ENDIAN_LITTLE, start);
   obstack_grow (obstack, addr, 8);
-  store_unsigned_integer (addr, 8, BFD_ENDIAN_LITTLE, end - baseaddr);
+  store_unsigned_integer (addr, 8, BFD_ENDIAN_LITTLE, end);
   obstack_grow (obstack, addr, 8);
   cu_index_to_write = MAYBE_SWAP (cu_index);
   obstack_grow (obstack, &cu_index_to_write, sizeof (offset_type));
diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c
index 2cc9be4..5f63eaf 100644
--- a/gdb/mdebugread.c
+++ b/gdb/mdebugread.c
@@ -565,6 +565,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
   TIR tir;
   long svalue = sh->value;
   int bitsize;
+  int section;
 
   if (ext_sh == (char *) NULL)
     name = debug_info->ssext + sh->iss;
@@ -581,21 +582,26 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
          The value of a stBlock symbol is the displacement from the
          procedure address.  */
       if (sh->st != stEnd && sh->st != stBlock)
-	sh->value += PST_OFFSET (objfile, section_offsets,
-				   SECT_OFF_TEXT (objfile));
+	{
+	  if (section_offsets != NULL)
+	    sh->value += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
+	  section = SECT_OFF_TEXT (objfile);
+	}
       break;
     case scData:
     case scSData:
     case scRData:
     case scPData:
     case scXData:
-      sh->value += PST_OFFSET (objfile, section_offsets,
-			       SECT_OFF_DATA (objfile));
+      if (section_offsets != NULL)
+	sh->value += ANOFFSET (section_offsets, SECT_OFF_DATA (objfile));
+      section = SECT_OFF_DATA (objfile);
       break;
     case scBss:
     case scSBss:
-      sh->value += PST_OFFSET (objfile, section_offsets,
-			       SECT_OFF_BSS (objfile));
+      if (section_offsets != NULL)
+	sh->value += ANOFFSET (section_offsets, SECT_OFF_BSS (objfile));
+      section = SECT_OFF_BSS (objfile);
       break;
     }
 
@@ -2172,12 +2178,9 @@ parse_external (EXTR *es, int bigend, struct section_offsets *section_offsets,
    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;
@@ -2208,7 +2211,7 @@ parse_lines (FDR *fh, PDR *pr, struct linetable *lt, int maxlines,
 	halt = base + fh->cbLine;
       base += pr->cbLineOffset;
 
-      adr = PSYMTAB_TEXTLOW (pst) + pr->adr - lowest_pdr_addr;
+      adr = textlow + pr->adr - lowest_pdr_addr;
 
       l = adr >> 2;		/* in words */
       for (lineno = pr->lnLow; base < halt;)
@@ -2630,6 +2633,7 @@ parse_partial_symbols (struct objfile *objfile)
       struct partial_symtab *save_pst;
       EXTR *ext_ptr;
       CORE_ADDR textlow;
+      int section = -1;
 
       cur_fdr = fh = debug_info->fdr + f_idx;
 
@@ -2645,8 +2649,7 @@ parse_partial_symbols (struct objfile *objfile)
 	{
 	  textlow = fh->adr;
 	  if (relocatable || textlow != 0)
-	    textlow += ANOFFSET (objfile->section_offsets,
-				 SECT_OFF_TEXT (objfile));
+	    section = SECT_OFF_TEXT (objfile);
 	}
       else
 	textlow = 0;
@@ -2695,7 +2698,7 @@ parse_partial_symbols (struct objfile *objfile)
 	psymtab_language = prev_language;
       PST_PRIVATE (pst)->pst_language = psymtab_language;
 
-      SET_PSYMTAB_TEXTHIGH (pst, PSYMTAB_TEXTLOW (pst));
+      SET_PSYMTAB_TEXTHIGH (pst, PSYMTAB_RAW_TEXTLOW (pst));
 
       /* For stabs-in-ecoff files, the second symbol must be @stab.
          This symbol is emitted by mips-tfile to signal that the
@@ -2741,8 +2744,7 @@ parse_partial_symbols (struct objfile *objfile)
                                                  mst_file_text, sh.sc,
                                                  objfile);
 			}
-		      sh.value += ANOFFSET (objfile->section_offsets,
-					    SECT_OFF_TEXT (objfile));
+		      section = SECT_OFF_TEXT (objfile);
 		      procaddr = sh.value;
 
 		      isym = AUX_GET_ISYM (fh->fBigendian,
@@ -2761,9 +2763,9 @@ parse_partial_symbols (struct objfile *objfile)
 			  /* Kludge for Irix 5.2 zero fh->adr.  */
 			  if (!relocatable
 			      && (!pst->textlow_valid
-				  || procaddr < PSYMTAB_TEXTLOW (pst)))
+				  || procaddr < PSYMTAB_RAW_TEXTLOW (pst)))
 			    SET_PSYMTAB_TEXTLOW (pst, procaddr);
-			  if (high > PSYMTAB_TEXTHIGH (pst))
+			  if (high > PSYMTAB_RAW_TEXTHIGH (pst))
 			    SET_PSYMTAB_TEXTHIGH (pst, high);
 			}
 		    }
@@ -2786,8 +2788,7 @@ parse_partial_symbols (struct objfile *objfile)
                           record_minimal_symbol (namestring, sh.value,
                                                  mst_file_data, sh.sc,
                                                  objfile);
-			  sh.value += ANOFFSET (objfile->section_offsets,
-						SECT_OFF_DATA (objfile));
+			  section = SECT_OFF_DATA (objfile);
 			  break;
 
 			default:
@@ -2797,8 +2798,7 @@ parse_partial_symbols (struct objfile *objfile)
                           record_minimal_symbol (namestring, sh.value,
                                                  mst_file_bss, sh.sc,
                                                  objfile);
-			  sh.value += ANOFFSET (objfile->section_offsets,
-						SECT_OFF_BSS (objfile));
+			  section = SECT_OFF_BSS (objfile);
 			  break;
 			}
 		    }
@@ -2850,22 +2850,19 @@ parse_partial_symbols (struct objfile *objfile)
 
 		  case N_TEXT | N_EXT:
 		  case N_NBTEXT | N_EXT:
-		    sh.value += ANOFFSET (objfile->section_offsets,
-					  SECT_OFF_TEXT (objfile));
+		    section = 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));
+		    section = 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));
+		    section = SECT_OFF_BSS (objfile);
 		    goto record_it;
 
 		  case N_ABS | N_EXT:
@@ -2888,8 +2885,7 @@ parse_partial_symbols (struct objfile *objfile)
 		    continue;
 
 		  case N_DATA:
-		    sh.value += ANOFFSET (objfile->section_offsets,
-					  SECT_OFF_DATA (objfile));
+		    section = SECT_OFF_DATA (objfile);
 		    goto record_it;
 
 		  case N_UNDF | N_EXT:
@@ -2935,8 +2931,8 @@ parse_partial_symbols (struct objfile *objfile)
 		      const char *p;
 		      int prev_textlow_not_set;
 
-		      valu = sh.value + ANOFFSET (objfile->section_offsets,
-						  SECT_OFF_TEXT (objfile));
+		      valu = sh.value;
+		      section = SECT_OFF_TEXT (objfile);
 
 		      prev_textlow_not_set = textlow_not_set;
 
@@ -3105,27 +3101,24 @@ parse_partial_symbols (struct objfile *objfile)
 		    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,
 					     0, 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,
 					     0, sh.value,
 					     psymtab_language, objfile);
@@ -3144,6 +3137,7 @@ parse_partial_symbols (struct objfile *objfile)
 			  {
 			    add_psymbol_to_list (namestring, p - namestring, 1,
 						 STRUCT_DOMAIN, LOC_TYPEDEF,
+						 -1,
 						 &objfile->static_psymbols,
 						 sh.value, 0,
 						 psymtab_language, objfile);
@@ -3153,6 +3147,7 @@ parse_partial_symbols (struct objfile *objfile)
 				add_psymbol_to_list (namestring,
 						     p - namestring, 1,
 						     VAR_DOMAIN, LOC_TYPEDEF,
+						     -1,
 						     &objfile->static_psymbols,
 						     sh.value, 0,
 						     psymtab_language,
@@ -3167,6 +3162,7 @@ parse_partial_symbols (struct objfile *objfile)
 			  {
 			    add_psymbol_to_list (namestring, p - namestring, 1,
 						 VAR_DOMAIN, LOC_TYPEDEF,
+						 -1,
 						 &objfile->static_psymbols,
 						 sh.value, 0,
 						 psymtab_language, objfile);
@@ -3232,6 +3228,7 @@ parse_partial_symbols (struct objfile *objfile)
 				   symtabs.  */
 				add_psymbol_to_list (p, q - p, 1,
 						     VAR_DOMAIN, LOC_CONST,
+						     -1,
 						     &objfile->static_psymbols,
 						     0, 0, psymtab_language,
 						     objfile);
@@ -3249,7 +3246,7 @@ parse_partial_symbols (struct objfile *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,
 					     sh.value, 0, psymtab_language,
 					     objfile);
@@ -3266,10 +3263,9 @@ parse_partial_symbols (struct objfile *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->static_psymbols,
 					     0, sh.value,
 					     psymtab_language, objfile);
@@ -3290,10 +3286,9 @@ parse_partial_symbols (struct objfile *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,
 					     0, sh.value,
 					     psymtab_language, objfile);
@@ -3366,7 +3361,7 @@ parse_partial_symbols (struct objfile *objfile)
 		    continue;
 
 		  case N_RBRAC:
-		    if (sh.value > PSYMTAB_TEXTHIGH (save_pst))
+		    if (sh.value > PSYMTAB_RAW_TEXTHIGH (save_pst))
 		      SET_PSYMTAB_TEXTHIGH (save_pst, sh.value);
 		    continue;
 		  case N_EINCL:
@@ -3423,6 +3418,7 @@ parse_partial_symbols (struct objfile *objfile)
 	      char *name;
 	      enum address_class class;
 	      CORE_ADDR minsym_value;
+	      short section = -1;
 
 	      (*swap_sym_in) (cur_bfd,
 			      ((char *) debug_info->external_sym
@@ -3457,21 +3453,18 @@ parse_partial_symbols (struct objfile *objfile)
 		  /* 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;
 		}
 
@@ -3537,11 +3530,13 @@ parse_partial_symbols (struct objfile *objfile)
 		  if (sh.st == stProc)
 		    add_psymbol_to_list (name, strlen (name), 1,
 					 VAR_DOMAIN, LOC_BLOCK,
+					 section,
 					 &objfile->global_psymbols,
 				    0, sh.value, psymtab_language, objfile);
 		  else
 		    add_psymbol_to_list (name, strlen (name), 1,
 					 VAR_DOMAIN, LOC_BLOCK,
+					 section,
 					 &objfile->static_psymbols,
 				    0, sh.value, psymtab_language, objfile);
 
@@ -3559,11 +3554,11 @@ parse_partial_symbols (struct objfile *objfile)
 		  /* Kludge for Irix 5.2 zero fh->adr.  */
 		  if (!relocatable
 		      && (!pst->textlow_valid
-			  || procaddr < PSYMTAB_TEXTLOW (pst)))
+			  || procaddr < PSYMTAB_RAW_TEXTLOW (pst)))
 		    SET_PSYMTAB_TEXTLOW (pst, procaddr);
 
 		  high = procaddr + sh.value;
-		  if (high > PSYMTAB_TEXTHIGH (pst))
+		  if (high > PSYMTAB_RAW_TEXTHIGH (pst))
 		    SET_PSYMTAB_TEXTHIGH (pst, high);
 		  continue;
 
@@ -3609,7 +3604,7 @@ parse_partial_symbols (struct objfile *objfile)
 		      && 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, (CORE_ADDR) 0,
 					   psymtab_language, objfile);
@@ -3650,7 +3645,7 @@ parse_partial_symbols (struct objfile *objfile)
 		}
 	      /* Use this gdb symbol.  */
 	      add_psymbol_to_list (name, strlen (name), 1,
-				   VAR_DOMAIN, class,
+				   VAR_DOMAIN, class, section,
 				   &objfile->static_psymbols,
 				   0, sh.value, psymtab_language, objfile);
 	    skip:
@@ -3668,6 +3663,7 @@ parse_partial_symbols (struct objfile *objfile)
 	      SYMR *psh;
 	      char *name;
 	      CORE_ADDR svalue;
+	      short section;
 
 	      if (ext_ptr->ifd != f_idx)
 		internal_error (__FILE__, __LINE__,
@@ -3681,23 +3677,21 @@ parse_partial_symbols (struct objfile *objfile)
 	      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;
 		}
 
@@ -3731,6 +3725,7 @@ parse_partial_symbols (struct objfile *objfile)
 	      name = debug_info->ssext + psh->iss;
 	      add_psymbol_to_list (name, strlen (name), 1,
 				   VAR_DOMAIN, class,
+				   section,
 				   &objfile->global_psymbols,
 				   0, svalue,
 				   psymtab_language, objfile);
@@ -3741,7 +3736,7 @@ parse_partial_symbols (struct objfile *objfile)
          empty and put on the free list.  */
       fdr_to_pst[f_idx].pst = end_psymtab (objfile, save_pst,
 					psymtab_include_list, includes_used,
-					   -1, PSYMTAB_TEXTHIGH (save_pst),
+					   -1, PSYMTAB_RAW_TEXTHIGH (save_pst),
 		       dependency_list, dependencies_used, textlow_not_set);
       includes_used = 0;
       dependencies_used = 0;
@@ -3765,9 +3760,9 @@ parse_partial_symbols (struct objfile *objfile)
 	  ALL_OBJFILE_PSYMTABS (objfile, pst)
 	  {
 	    if (save_pst != pst
-		&& PSYMTAB_TEXTLOW (save_pst) >= PSYMTAB_TEXTLOW (pst)
-		&& PSYMTAB_TEXTLOW (save_pst) < PSYMTAB_TEXTHIGH (pst)
-		&& PSYMTAB_TEXTHIGH (save_pst) > PSYMTAB_TEXTHIGH (pst))
+		&& PSYMTAB_RAW_TEXTLOW (save_pst) >= PSYMTAB_RAW_TEXTLOW (pst)
+		&& PSYMTAB_RAW_TEXTLOW (save_pst) < PSYMTAB_RAW_TEXTHIGH (pst)
+		&& PSYMTAB_RAW_TEXTHIGH (save_pst) > PSYMTAB_RAW_TEXTHIGH (pst))
 	      {
 		objfile->flags |= OBJF_REORDERED;
 		break;
@@ -3894,7 +3889,7 @@ handle_psymbol_enumerators (struct objfile *objfile, FDR *fh, int stype,
       /* 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,
+			   VAR_DOMAIN, LOC_CONST, -1,
 			   &objfile->static_psymbols, 0,
 			   (CORE_ADDR) 0, psymtab_language, objfile);
       ext_sym += external_sym_size;
@@ -4125,8 +4120,8 @@ psymtab_to_symtab_1 (struct objfile *objfile,
 
       if (! last_symtab_ended)
 	{
-	  st = end_symtab (PSYMTAB_TEXTHIGH (pst), objfile,
-			   SECT_OFF_TEXT (objfile));
+	  st = end_symtab (PSYMTAB_TEXTHIGH (objfile, pst),
+			   objfile, SECT_OFF_TEXT (objfile));
 	  end_stabs ();
 	}
 
@@ -4207,7 +4202,7 @@ psymtab_to_symtab_1 (struct objfile *objfile,
       top_stack->cur_st = st;
       top_stack->cur_block = BLOCKVECTOR_BLOCK (BLOCKVECTOR (st),
 						STATIC_BLOCK);
-      BLOCK_START (top_stack->cur_block) = PSYMTAB_TEXTLOW (pst);
+      BLOCK_START (top_stack->cur_block) = PSYMTAB_TEXTLOW (objfile, pst);
       BLOCK_END (top_stack->cur_block) = 0;
       top_stack->blocktype = stFile;
       top_stack->cur_type = 0;
@@ -4272,7 +4267,7 @@ psymtab_to_symtab_1 (struct objfile *objfile,
 		}
 
 	      parse_lines (fh, pr_block, lines, maxlines,
-			   pst, lowest_pdr_addr);
+			   PSYMTAB_TEXTLOW (objfile, pst), lowest_pdr_addr);
 	      if (lines->nitems < fh->cline)
 		lines = shrink_linetable (lines);
 
diff --git a/gdb/objfiles.c b/gdb/objfiles.c
index 83b8961..c9cbe80 100644
--- a/gdb/objfiles.c
+++ b/gdb/objfiles.c
@@ -794,13 +794,6 @@ objfile_relocate1 (struct objfile *objfile,
       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;
 
diff --git a/gdb/psympriv.h b/gdb/psympriv.h
index 6d732d6..0fe1025 100644
--- a/gdb/psympriv.h
+++ b/gdb/psympriv.h
@@ -59,7 +59,7 @@ struct partial_symbol
 #define PSYMBOL_VALUE_RAW_ADDRESS(symbol) ((symbol)->pginfo.value.address + 0)
 #define PSYMBOL_VALUE_ADDRESS(objfile, symbol)	\
   ((symbol)->pginfo.value.address \
-   + (0 * (ANOFFSET ((objfile)->section_offsets, ((symbol)->pginfo.section)))))
+   + (ANOFFSET ((objfile)->section_offsets, ((symbol)->pginfo.section))))
 #define PSYMBOL_LANGUAGE(symbol)	(symbol)->pginfo.language
 #define PSYMBOL_SECTION(symbol)		(symbol)->pginfo.section
 #define PSYMBOL_OBJ_SECTION(objfile, symbol)			\
@@ -255,8 +255,15 @@ struct partial_symtab
   (ANOFFSET ((OBJF)->section_offsets, (INDEX))			\
    + ((((OFFS) == NULL)) ? 0 : ANOFFSET ((OFFS), (INDEX))))
 
-#define PSYMTAB_TEXTLOW(PST) ((PST)->textlow_ + 0)
-#define PSYMTAB_TEXTHIGH(PST) ((PST)->texthigh_ + 0)
+#define PSYMTAB_RAW_TEXTLOW(PST) ((PST)->textlow_ + 0)
+#define PSYMTAB_RAW_TEXTHIGH(PST) ((PST)->texthigh_ + 0)
+
+#define PSYMTAB_TEXTLOW(OBJFILE, PST)					\
+  ((PST)->textlow_							\
+   + ANOFFSET ((OBJFILE)->section_offsets, SECT_OFF_TEXT (OBJFILE)))
+#define PSYMTAB_TEXTHIGH(OBJFILE, PST)					\
+  ((PST)->texthigh_							\
+   + ANOFFSET ((OBJFILE)->section_offsets, SECT_OFF_TEXT (OBJFILE)))
 
 /* Set the "textlow" field on the partial symbol table, and mark the
    field as valid.  */
@@ -288,6 +295,7 @@ extern void sort_pst_symbols (struct objfile *, struct partial_symtab *);
 extern void add_psymbol_to_list (const char *, int,
 				 int, domain_enum,
 				 enum address_class,
+				 short /* section */,
 				 struct psymbol_allocation_list *,
 				 long, CORE_ADDR,
 				 enum language, struct objfile *);
diff --git a/gdb/psymtab.c b/gdb/psymtab.c
index 4eaf05f..da3bcba 100644
--- a/gdb/psymtab.c
+++ b/gdb/psymtab.c
@@ -65,9 +65,6 @@ static struct partial_symbol *find_pc_sect_psymbol (struct objfile *,
 						    CORE_ADDR,
 						    struct obj_section *);
 
-static void fixup_psymbol_section (struct partial_symbol *psym,
-				   struct objfile *objfile);
-
 static struct symtab *psymtab_to_symtab (struct objfile *objfile,
 					 struct partial_symtab *pst);
 
@@ -230,7 +227,7 @@ find_pc_sect_psymtab_closer (struct objfile *objfile,
 {
   struct partial_symtab *tpst;
   struct partial_symtab *best_pst = pst;
-  CORE_ADDR best_addr = PSYMTAB_TEXTLOW (pst);
+  CORE_ADDR best_addr = PSYMTAB_TEXTLOW (objfile, pst);
 
   gdb_assert (!pst->psymtabs_addrmap_supported);
 
@@ -254,7 +251,8 @@ find_pc_sect_psymtab_closer (struct objfile *objfile,
      that is closest and still less than the given PC.  */
   for (tpst = pst; tpst != NULL; tpst = tpst->next)
     {
-      if (pc >= PSYMTAB_TEXTLOW (tpst) && pc < PSYMTAB_TEXTHIGH (tpst))
+      if (pc >= PSYMTAB_TEXTLOW (objfile, tpst)
+	  && pc < PSYMTAB_TEXTHIGH (objfile, tpst))
 	{
 	  struct partial_symbol *p;
 	  CORE_ADDR this_addr;
@@ -276,7 +274,7 @@ find_pc_sect_psymtab_closer (struct objfile *objfile,
 	  if (p != NULL)
 	    this_addr = PSYMBOL_VALUE_ADDRESS (objfile, p);
 	  else
-	    this_addr = PSYMTAB_TEXTLOW (tpst);
+	    this_addr = PSYMTAB_TEXTHIGH (objfile, tpst);
 
 	  /* Check whether it is closer than our current
 	     BEST_ADDR.  Since this symbol address is
@@ -308,13 +306,15 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
 		      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 = addrmap_find (objfile->psymtabs_addrmap, pc);
+      pst = addrmap_find (objfile->psymtabs_addrmap, pc - baseaddr);
       if (pst != NULL)
 	{
 	  /* FIXME: addrmaps currently do not handle overlayed sections,
@@ -358,7 +358,8 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
 
   ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst)
     if (!pst->psymtabs_addrmap_supported
-	&& pc >= PSYMTAB_TEXTLOW (pst) && pc < PSYMTAB_TEXTHIGH (pst))
+	&& pc >= PSYMTAB_TEXTLOW (objfile, pst)
+	&& pc < PSYMTAB_TEXTHIGH (objfile, pst))
       {
 	struct partial_symtab *best_pst;
 
@@ -404,12 +405,14 @@ find_pc_sect_psymbol (struct objfile *objfile,
 {
   struct partial_symbol *best = NULL, *p, **pp;
   CORE_ADDR best_pc;
+  CORE_ADDR baseaddr = ANOFFSET (objfile->section_offsets,
+				 SECT_OFF_TEXT (objfile));
+  const CORE_ADDR textlow = PSYMTAB_TEXTLOW (objfile, psymtab);
 
   gdb_assert (psymtab != NULL);
 
   /* Cope with programs that start at address 0.  */
-  best_pc = ((PSYMTAB_TEXTLOW (psymtab) != 0)
-	     ? PSYMTAB_TEXTLOW (psymtab) - 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
@@ -424,13 +427,12 @@ find_pc_sect_psymbol (struct objfile *objfile,
 	  && PSYMBOL_CLASS (p) == LOC_BLOCK
 	  && pc >= PSYMBOL_VALUE_ADDRESS (objfile, p)
 	  && (PSYMBOL_VALUE_ADDRESS (objfile, p) > best_pc
-	      || (PSYMTAB_TEXTLOW (psymtab) == 0
+	      || (textlow == 0
 		  && best_pc == 0
 		  && PSYMBOL_VALUE_ADDRESS (objfile, p) == 0)))
 	{
 	  if (section)		/* Match on a specific section.  */
 	    {
-	      fixup_psymbol_section (p, objfile);
 	      if (!matching_obj_sections (PSYMBOL_OBJ_SECTION (objfile, p),
 					  section))
 		continue;
@@ -450,13 +452,12 @@ find_pc_sect_psymbol (struct objfile *objfile,
 	  && PSYMBOL_CLASS (p) == LOC_BLOCK
 	  && pc >= PSYMBOL_VALUE_ADDRESS (objfile, p)
 	  && (PSYMBOL_VALUE_ADDRESS (objfile, p) > best_pc
-	      || (PSYMTAB_TEXTLOW (psymtab) == 0
+	      || (textlow == 0
 		  && best_pc == 0
 		  && PSYMBOL_VALUE_ADDRESS (objfile, p) == 0)))
 	{
 	  if (section)		/* Match on a specific section.  */
 	    {
-	      fixup_psymbol_section (p, objfile);
 	      if (!matching_obj_sections (PSYMBOL_OBJ_SECTION (objfile, p),
 					  section))
 		continue;
@@ -469,35 +470,6 @@ find_pc_sect_psymbol (struct objfile *objfile,
   return best;
 }
 
-static void
-fixup_psymbol_section (struct partial_symbol *psym, struct objfile *objfile)
-{
-  CORE_ADDR addr;
-
-  if (!psym)
-    return;
-
-  if (PSYMBOL_SECTION (psym) >= 0)
-    return;
-
-  gdb_assert (objfile);
-
-  switch (PSYMBOL_CLASS (psym))
-    {
-    case LOC_STATIC:
-    case LOC_LABEL:
-    case LOC_BLOCK:
-      addr = PSYMBOL_VALUE_ADDRESS (objfile, psym);
-      break;
-    default:
-      /* Nothing else will be listed in the minsyms -- no use looking
-	 it up.  */
-      return;
-    }
-
-  fixup_section (&psym->pginfo, addr, objfile);
-}
-
 static struct symtab *
 lookup_symbol_aux_psymtabs (struct objfile *objfile,
 			    int block_index, const char *name,
@@ -786,44 +758,6 @@ psymtab_to_symtab (struct objfile *objfile, struct partial_symtab *pst)
   return pst->symtab;
 }
 
-static void
-relocate_psymtabs (struct objfile *objfile,
-		   const struct section_offsets *new_offsets,
-		   const struct section_offsets *delta)
-{
-  struct partial_symbol **psym;
-  struct partial_symtab *p;
-
-  ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, p)
-    {
-      SET_PSYMTAB_TEXTLOW (p, (PSYMTAB_TEXTLOW (p)
-			       + ANOFFSET (delta, SECT_OFF_TEXT (objfile))));
-      SET_PSYMTAB_TEXTHIGH (p, (PSYMTAB_TEXTHIGH (p)
-				+ ANOFFSET (delta, SECT_OFF_TEXT (objfile))));
-    }
-
-  for (psym = objfile->global_psymbols.list;
-       psym < objfile->global_psymbols.next;
-       psym++)
-    {
-      fixup_psymbol_section (*psym, objfile);
-      if (PSYMBOL_SECTION (*psym) >= 0)
-	SET_PSYMBOL_VALUE_ADDRESS (*psym,
-				   PSYMBOL_VALUE_RAW_ADDRESS (*psym)
-				   + ANOFFSET (delta, PSYMBOL_SECTION (*psym)));
-    }
-  for (psym = objfile->static_psymbols.list;
-       psym < objfile->static_psymbols.next;
-       psym++)
-    {
-      fixup_psymbol_section (*psym, objfile);
-      if (PSYMBOL_SECTION (*psym) >= 0)
-	SET_PSYMBOL_VALUE_ADDRESS (*psym,
-				   PSYMBOL_VALUE_RAW_ADDRESS (*psym)
-				   + ANOFFSET (delta, PSYMBOL_SECTION (*psym)));
-    }
-}
-
 static struct symtab *
 find_last_source_symtab_from_partial (struct objfile *ofp)
 {
@@ -1013,9 +947,11 @@ dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab,
   fprintf_filtered (outfile, "\n");
 
   fprintf_filtered (outfile, "  Symbols cover text addresses ");
-  fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTLOW (psymtab)), outfile);
+  fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTLOW (objfile, psymtab)),
+		  outfile);
   fprintf_filtered (outfile, "-");
-  fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTHIGH (psymtab)), outfile);
+  fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTHIGH (objfile, psymtab)),
+		  outfile);
   fprintf_filtered (outfile, "\n");
   fprintf_filtered (outfile, "  Address map supported - %s.\n",
 		    psymtab->psymtabs_addrmap_supported ? "yes" : "no");
@@ -1438,7 +1374,6 @@ const struct quick_symbol_functions psym_functions =
   lookup_symbol_aux_psymtabs,
   print_psymtab_stats_for_objfile,
   dump_psymtabs_for_objfile,
-  relocate_psymtabs,
   read_symtabs_for_function,
   expand_partial_symbol_tables,
   read_psymtabs_with_fullname,
@@ -1590,6 +1525,7 @@ static const struct partial_symbol *
 add_psymbol_to_bcache (const char *name, int namelength, int copy_name,
 		       domain_enum domain,
 		       enum address_class class,
+		       short section,
 		       long val,	/* Value as a long */
 		       CORE_ADDR coreaddr,	/* Value as a CORE_ADDR */
 		       enum language language, struct objfile *objfile,
@@ -1611,7 +1547,7 @@ add_psymbol_to_bcache (const char *name, int namelength, int copy_name,
     {
       SET_PSYMBOL_VALUE_ADDRESS (&psymbol, coreaddr);
     }
-  PSYMBOL_SECTION (&psymbol) = -1;
+  PSYMBOL_SECTION (&psymbol) = section;
   PSYMBOL_SET_LANGUAGE (&psymbol, language, &objfile->objfile_obstack);
   PSYMBOL_DOMAIN (&psymbol) = domain;
   PSYMBOL_CLASS (&psymbol) = class;
@@ -1675,6 +1611,7 @@ void
 add_psymbol_to_list (const char *name, int namelength, int copy_name,
 		     domain_enum domain,
 		     enum address_class class,
+		     short section,
 		     struct psymbol_allocation_list *list, 
 		     long val,	/* Value as a long */
 		     CORE_ADDR coreaddr,	/* Value as a CORE_ADDR */
@@ -1686,7 +1623,8 @@ add_psymbol_to_list (const char *name, int namelength, int copy_name,
 
   /* Stash the partial symbol away in the cache.  */
   psym = add_psymbol_to_bcache (name, namelength, copy_name, domain, class,
-				val, coreaddr, language, objfile, &added);
+				section, val, coreaddr, language,
+				objfile, &added);
 
   /* Do not duplicate global partial symbols.  */
   if (list == &objfile->global_psymbols
@@ -1946,10 +1884,12 @@ maintenance_info_psymtabs (char *regexp, int from_tty)
 			       psymtab->fullname
 			       ? psymtab->fullname : "(null)");
 	      printf_filtered ("    text addresses ");
-	      fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTLOW (psymtab)),
+	      fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTLOW (objfile,
+								  psymtab)),
 			      gdb_stdout);
 	      printf_filtered (" -- ");
-	      fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTHIGH (psymtab)),
+	      fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTHIGH (objfile,
+								   psymtab)),
 			      gdb_stdout);
 	      printf_filtered ("\n");
 	      printf_filtered ("    psymtabs_addrmap_supported %s\n",
@@ -2028,14 +1968,16 @@ maintenance_check_psymtabs (char *ignore, int from_tty)
     s = ps->symtab;
 
     /* First do some checks that don't require the associated symtab.  */
-    if (PSYMTAB_TEXTHIGH (ps) < PSYMTAB_TEXTLOW (ps))
+    if (PSYMTAB_TEXTHIGH (objfile, ps) < PSYMTAB_TEXTLOW (objfile, ps))
       {
 	printf_filtered ("Psymtab ");
 	puts_filtered (ps->filename);
 	printf_filtered (" covers bad range ");
-	fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTLOW (ps)), gdb_stdout);
+	fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTLOW (objfile, ps)),
+			gdb_stdout);
 	printf_filtered (" - ");
-	fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTHIGH (ps)), gdb_stdout);
+	fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTHIGH (objfile, ps)),
+			gdb_stdout);
 	printf_filtered ("\n");
 	continue;
       }
@@ -2078,16 +2020,18 @@ maintenance_check_psymtabs (char *ignore, int from_tty)
 	  }
 	psym++;
       }
-    if (PSYMTAB_TEXTHIGH (ps) != 0
-	&& (PSYMTAB_TEXTLOW (ps) < BLOCK_START (b)
-	    || PSYMTAB_TEXTHIGH (ps) > BLOCK_END (b)))
+    if (PSYMTAB_RAW_TEXTHIGH (ps) != 0
+	&& (PSYMTAB_TEXTLOW (objfile, ps) < BLOCK_START (b)
+	    || PSYMTAB_TEXTHIGH (objfile, ps) > BLOCK_END (b)))
       {
 	printf_filtered ("Psymtab ");
 	puts_filtered (ps->filename);
 	printf_filtered (" covers ");
-	fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTLOW (ps)), gdb_stdout);
+	fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTLOW (objfile, ps)),
+			gdb_stdout);
 	printf_filtered (" - ");
-	fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTHIGH (ps)), gdb_stdout);
+	fputs_filtered (paddress (gdbarch, PSYMTAB_TEXTHIGH (objfile, ps)),
+			gdb_stdout);
 	printf_filtered (" but symtab covers only ");
 	fputs_filtered (paddress (gdbarch, BLOCK_START (b)), gdb_stdout);
 	printf_filtered (" - ");
diff --git a/gdb/symfile-debug.c b/gdb/symfile-debug.c
index e8491c8..841c202 100644
--- a/gdb/symfile-debug.c
+++ b/gdb/symfile-debug.c
@@ -198,22 +198,6 @@ debug_qf_dump (struct objfile *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 =
-    objfile_data (objfile, symfile_debug_objfile_data_key);
-
-  fprintf_filtered (gdb_stdlog, "qf->relocate (%s, %s, %s)\n",
-		    debug_objfile_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)
 {
@@ -362,7 +346,6 @@ static const struct quick_symbol_functions debug_sym_quick_functions =
   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,
diff --git a/gdb/symfile.h b/gdb/symfile.h
index 614af3c..36cade7 100644
--- a/gdb/symfile.h
+++ b/gdb/symfile.h
@@ -210,12 +210,6 @@ struct quick_symbol_functions
      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,
diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c
index 2a83894..840d21c 100644
--- a/gdb/xcoffread.c
+++ b/gdb/xcoffread.c
@@ -2347,10 +2347,10 @@ scan_xcoff_symtab (struct objfile *objfile)
 			CORE_ADDR highval =
 			  symbol.n_value + csect_aux.x_csect.x_scnlen.l;
 
-			if (highval > PSYMTAB_TEXTHIGH (pst))
+			if (highval > PSYMTAB_RAW_TEXTHIGH (pst))
 			  SET_PSYMTAB_TEXTHIGH (pst, highval);
 			if (!pst->textlow_valid
-			    || symbol.n_value < PSYMTAB_TEXTLOW (pst))
+			    || symbol.n_value < PSYMTAB_RAW_TEXTLOW (pst))
 			  SET_PSYMTAB_TEXTLOW (pst, symbol.n_value);
 		      }
 		    misc_func_recorded = 0;
@@ -2666,27 +2666,24 @@ scan_xcoff_symtab (struct objfile *objfile)
 	    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,
 				     0, 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,
 				     0, symbol.n_value,
 				     psymtab_language, objfile);
@@ -2704,7 +2701,7 @@ scan_xcoff_symtab (struct objfile *objfile)
 			&& namestring[0] != ' '))
 		  {
 		    add_psymbol_to_list (namestring, p - namestring, 1,
-					 STRUCT_DOMAIN, LOC_TYPEDEF,
+					 STRUCT_DOMAIN, LOC_TYPEDEF, -1,
 					 &objfile->static_psymbols,
 					 symbol.n_value, 0,
 					 psymtab_language, objfile);
@@ -2712,7 +2709,7 @@ scan_xcoff_symtab (struct objfile *objfile)
 		      {
 			/* 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,
 					     symbol.n_value, 0,
 					     psymtab_language, objfile);
@@ -2725,7 +2722,7 @@ scan_xcoff_symtab (struct objfile *objfile)
 		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,
 					 symbol.n_value, 0,
 					 psymtab_language, objfile);
@@ -2788,7 +2785,7 @@ scan_xcoff_symtab (struct objfile *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,
 					     0, psymtab_language, objfile);
 			/* Point past the name.  */
@@ -2806,7 +2803,7 @@ scan_xcoff_symtab (struct objfile *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, symbol.n_value,
 				     0, psymtab_language, objfile);
 		continue;
@@ -2822,10 +2819,9 @@ scan_xcoff_symtab (struct objfile *objfile)
 		    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,
 				     0, symbol.n_value,
 				     psymtab_language, objfile);
@@ -2853,10 +2849,9 @@ scan_xcoff_symtab (struct objfile *objfile)
 		if (strncmp (namestring, "@FIX", 4) == 0)
 		  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,
 				     0, symbol.n_value,
 				     psymtab_language, objfile);
-- 
1.8.1.4


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]