diff --git a/gdb/buildsym.c b/gdb/buildsym.c
index d0dfa4cd02..583c294790 100644
--- a/gdb/buildsym.c
+++ b/gdb/buildsym.c
@@ -106,11 +106,13 @@ struct buildsym_compunit
      (or NULL if not known).  */
 
   buildsym_compunit (struct objfile *objfile_, const char *name,
-		     const char *comp_dir_, enum language language_)
+		     const char *comp_dir_, enum language language_,
+		     CORE_ADDR last_addr)
     : objfile (objfile_),
       m_last_source_file (name == nullptr ? nullptr : xstrdup (name)),
       comp_dir (comp_dir_ == nullptr ? nullptr : xstrdup (comp_dir_)),
-      language (language_)
+      language (language_),
+      m_last_source_start_addr (last_addr)
   {
   }
 
@@ -196,6 +198,11 @@ struct buildsym_compunit
   /* True if symtab has line number info.  This prevents an otherwise
      empty symtab from being tossed.  */
   bool m_have_line_numbers = false;
+
+  /* Core address of start of text of current source file.  This too
+     comes from the N_SO symbol.  For Dwarf it typically comes from the
+     DW_AT_low_pc attribute of a DW_TAG_compile_unit DIE.  */
+  CORE_ADDR m_last_source_start_addr;
 };
 
 /* The work-in-progress of the compunit we are building.
@@ -1022,10 +1029,8 @@ get_macro_table (void)
    buildsym_init.  */
 
 static void
-prepare_for_building (CORE_ADDR start_addr)
+prepare_for_building ()
 {
-  last_source_start_addr = start_addr;
-
   local_symbols = NULL;
   local_using_directives = NULL;
   within_function = 0;
@@ -1058,10 +1063,10 @@ struct compunit_symtab *
 start_symtab (struct objfile *objfile, const char *name, const char *comp_dir,
 	      CORE_ADDR start_addr, enum language language)
 {
-  prepare_for_building (start_addr);
+  prepare_for_building ();
 
   buildsym_compunit = new struct buildsym_compunit (objfile, name, comp_dir,
-						    language);
+						    language, start_addr);
 
   /* Allocate the compunit symtab now.  The caller needs it to allocate
      non-primary symtabs.  It is also needed by get_macro_table.  */
@@ -1095,13 +1100,14 @@ void
 restart_symtab (struct compunit_symtab *cust,
 		const char *name, CORE_ADDR start_addr)
 {
-  prepare_for_building (start_addr);
+  prepare_for_building ();
 
   buildsym_compunit
     = new struct buildsym_compunit (COMPUNIT_OBJFILE (cust),
 				    name,
 				    COMPUNIT_DIRNAME (cust),
-				    compunit_language (cust));
+				    compunit_language (cust),
+				    start_addr);
   buildsym_compunit->compunit_symtab = cust;
 }
 
@@ -1297,8 +1303,8 @@ end_symtab_get_static_block (CORE_ADDR end_addr, int expandable, int required)
     {
       /* Define the STATIC_BLOCK.  */
       return finish_block_internal (NULL, &file_symbols, NULL, NULL,
-				    last_source_start_addr, end_addr,
-				    0, expandable);
+				    buildsym_compunit->m_last_source_start_addr,
+				    end_addr, 0, expandable);
     }
 }
 
@@ -1325,7 +1331,7 @@ end_symtab_with_blockvector (struct block *static_block,
 
   /* Create the GLOBAL_BLOCK and build the blockvector.  */
   finish_block_internal (NULL, &global_symbols, NULL, NULL,
-			 last_source_start_addr, end_addr,
+			 buildsym_compunit->m_last_source_start_addr, end_addr,
 			 1, expandable);
   blockvector = make_blockvector ();
 
@@ -1735,6 +1741,24 @@ get_last_source_file (void)
   return buildsym_compunit->m_last_source_file.get ();
 }
 
+/* See buildsym.h.  */
+
+void
+set_last_source_start_addr (CORE_ADDR addr)
+{
+  gdb_assert (buildsym_compunit != nullptr);
+  buildsym_compunit->m_last_source_start_addr = addr;
+}
+
+/* See buildsym.h.  */
+
+CORE_ADDR
+get_last_source_start_addr ()
+{
+  gdb_assert (buildsym_compunit != nullptr);
+  return buildsym_compunit->m_last_source_start_addr;
+}
+
 
 
 /* Initialize anything that needs initializing when starting to read a
diff --git a/gdb/buildsym.h b/gdb/buildsym.h
index 536d50a58e..61ffc0fd89 100644
--- a/gdb/buildsym.h
+++ b/gdb/buildsym.h
@@ -49,12 +49,6 @@ struct dynamic_prop;
 #define HASHSIZE 127		/* Size of things hashed via
 				   hashname().  */
 
-/* Core address of start of text of current source file.  This too
-   comes from the N_SO symbol.  For Dwarf it typically comes from the
-   DW_AT_low_pc attribute of a DW_TAG_compile_unit DIE.  */
-
-EXTERN CORE_ADDR last_source_start_addr;
-
 /* The list of sub-source-files within the current individual
    compilation.  Each file gets its own symtab with its own linetable
    and associated info, but they all share one blockvector.  */
@@ -310,6 +304,16 @@ extern struct compunit_symtab *buildsym_compunit_symtab (void);
 
 extern struct macro_table *get_macro_table (void);
 
+/* Set the last source start address.  Can only be used between
+   start_symtab and end_symtab* calls.  */
+
+extern void set_last_source_start_addr (CORE_ADDR addr);
+
+/* Get the last source start address.  Can only be used between
+   start_symtab and end_symtab* calls.  */
+
+extern CORE_ADDR get_last_source_start_addr ();
+
 #undef EXTERN
 
 #endif /* defined (BUILDSYM_H) */
diff --git a/gdb/coffread.c b/gdb/coffread.c
index f24ec0713a..5c97e7b949 100644
--- a/gdb/coffread.c
+++ b/gdb/coffread.c
@@ -390,8 +390,8 @@ coff_start_symtab (struct objfile *objfile, const char *name)
 		 xstrdup (name),
   /* We never know the directory name for COFF.  */
 		 NULL,
-  /* The start address is irrelevant, since we set
-     last_source_start_addr in coff_end_symtab.  */
+  /* The start address is irrelevant, since we call
+     set_last_source_start_addr in coff_end_symtab.  */
 		 0,
   /* Let buildsym.c deduce the language for this symtab.  */
 		 language_unknown);
@@ -420,7 +420,7 @@ complete_symtab (const char *name, CORE_ADDR start_addr, unsigned int size)
 static void
 coff_end_symtab (struct objfile *objfile)
 {
-  last_source_start_addr = current_source_start_addr;
+  set_last_source_start_addr (current_source_start_addr);
 
   end_symtab (current_source_end_addr, SECT_OFF_TEXT (objfile));
 
diff --git a/gdb/dbxread.c b/gdb/dbxread.c
index d0926896e2..31de714cc7 100644
--- a/gdb/dbxread.c
+++ b/gdb/dbxread.c
@@ -2435,14 +2435,14 @@ read_ofile_symtab (struct objfile *objfile, struct partial_symtab *pst)
   /* In a Solaris elf file, this variable, which comes from the
      value of the N_SO symbol, will still be 0.  Luckily, text_offset,
      which comes from pst->textlow is correct.  */
-  if (last_source_start_addr == 0)
-    last_source_start_addr = text_offset;
+  if (get_last_source_start_addr () == 0)
+    set_last_source_start_addr (text_offset);
 
   /* In reordered executables last_source_start_addr may not be the
      lower bound for this symtab, instead use text_offset which comes
      from pst->textlow which is correct.  */
-  if (last_source_start_addr > text_offset)
-    last_source_start_addr = text_offset;
+  if (get_last_source_start_addr () > text_offset)
+    set_last_source_start_addr (text_offset);
 
   pst->compunit_symtab = end_symtab (text_offset + text_size,
 				     SECT_OFF_TEXT (objfile));
diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c
index 7cf5e259d9..8bb244618c 100644
--- a/gdb/xcoffread.c
+++ b/gdb/xcoffread.c
@@ -817,7 +817,7 @@ aix_process_linenos (struct objfile *objfile)
     return;
 
   /* Process line numbers and enter them into line vector.  */
-  process_linenos (last_source_start_addr, cur_src_end_addr);
+  process_linenos (get_last_source_start_addr (), cur_src_end_addr);
 }
 
 
@@ -904,7 +904,7 @@ enter_line_range (struct subfile *subfile, unsigned beginoffset,
 
 #define complete_symtab(name, start_addr) {	\
   set_last_source_file (name);			\
-  last_source_start_addr = start_addr;		\
+  set_last_source_start_addr (start_addr);	\
 }
 
 
