diff --git a/gdb/NEWS b/gdb/NEWS
index 34c544c3d5..922010ed39 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -36,6 +36,9 @@
   ** gdb.Type has a new property 'objfile' which returns the objfile the
      type was defined in.
 
+  ** gdb.Objfile has a new method 'lookup_global_symbol' to lookup a symbol
+     from this objfile only.
+
 * New commands
 
 | [COMMAND] | SHELL_COMMAND
diff --git a/gdb/compile/compile-object-load.c b/gdb/compile/compile-object-load.c
index 4e70205195..3a765a345b 100644
--- a/gdb/compile/compile-object-load.c
+++ b/gdb/compile/compile-object-load.c
@@ -639,6 +639,7 @@ compile_object_load (const compile_file_names &file_names,
   objfile = objfile_holder.get ();
 
   func_sym = lookup_global_symbol_from_objfile (objfile,
+						GLOBAL_BLOCK,
 						GCC_FE_WRAPPER_FUNCTION,
 						VAR_DOMAIN).symbol;
   if (func_sym == NULL)
diff --git a/gdb/defs.h b/gdb/defs.h
index 81ab74c27f..4702f44afa 100644
--- a/gdb/defs.h
+++ b/gdb/defs.h
@@ -519,6 +519,15 @@ enum symbol_needs_kind
   SYMBOL_NEEDS_FRAME
 };
 
+/* * Special block numbers */
+
+enum block_enum
+{
+  GLOBAL_BLOCK = 0,
+  STATIC_BLOCK = 1,
+  FIRST_LOCAL_BLOCK = 2
+};
+
 /* Dynamic target-system-dependent parameters for GDB.  */
 #include "gdbarch.h"
 
@@ -628,15 +637,6 @@ extern int (*deprecated_ui_load_progress_hook) (const char *section,
 extern void initialize_progspace (void);
 extern void initialize_inferiors (void);
 
-/* * Special block numbers */
-
-enum block_enum
-{
-  GLOBAL_BLOCK = 0,
-  STATIC_BLOCK = 1,
-  FIRST_LOCAL_BLOCK = 2
-};
-
 /* User selection used in observable.h and multiple print functions.  */
 
 enum user_selected_what_flag
diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi
index f769ad03a2..320f583bbb 100644
--- a/gdb/doc/python.texi
+++ b/gdb/doc/python.texi
@@ -4443,6 +4443,18 @@ searches then this function can be used to add a debug info file
 from a different place.
 @end defun
 
+@defun Objfile.lookup_global_symbol (name @r{[}, domain@r{]})
+Searches for a global symbol named @var{name} in this objfile.  Optionally, the
+search scope can be restricted with the @var{domain} argument.
+The @var{domain} argument must be a domain constant defined in the @code{gdb}
+module and described in @ref{Symbols In Python}.  This function is similar to
+@code{gdb.lookup_global_symbol}, except that the search is limited to this
+objfile.
+
+The result is a @code{gdb.Symbol} object or @code{None} if the symbol
+is not found.
+@end defun
+
 @node Frames In Python
 @subsubsection Accessing inferior stack frames from Python
 
diff --git a/gdb/python/py-objfile.c b/gdb/python/py-objfile.c
index 199c567a04..a34b68dc49 100644
--- a/gdb/python/py-objfile.c
+++ b/gdb/python/py-objfile.c
@@ -406,7 +406,7 @@ objfpy_is_valid (PyObject *self, PyObject *args)
   Py_RETURN_TRUE;
 }
 
-/* Implementation of gdb.Objfile.add_separate_debug_file (self) -> Boolean.  */
+/* Implementation of gdb.Objfile.add_separate_debug_file (self, string) -> None.  */
 
 static PyObject *
 objfpy_add_separate_debug_file (PyObject *self, PyObject *args, PyObject *kw)
@@ -434,6 +434,44 @@ objfpy_add_separate_debug_file (PyObject *self, PyObject *args, PyObject *kw)
   Py_RETURN_NONE;
 }
 
+/* Implementation of gdb.Objfile.lookup_global_symbol (self, string [, int]) -> gdb.Symbol.  */
+
+static PyObject *
+objfpy_lookup_global_symbol (PyObject *self, PyObject *args, PyObject *kw)
+{
+  static const char *keywords[] = { "name", "domain", NULL };
+  objfile_object *obj = (objfile_object *) self;
+  const char *symbol_name;
+  int domain = VAR_DOMAIN;
+
+  OBJFPY_REQUIRE_VALID (obj);
+
+  if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "s|i", keywords, &symbol_name,
+					&domain))
+    return nullptr;
+
+  try
+    {
+      struct symbol *sym = lookup_global_symbol_from_objfile
+        (obj->objfile, GLOBAL_BLOCK, symbol_name, (domain_enum) domain).symbol;
+      if (sym == nullptr) {
+	sym = lookup_global_symbol_from_objfile
+	  (obj->objfile, STATIC_BLOCK, symbol_name, (domain_enum) domain)
+	  .symbol;
+	if (!sym)
+	  Py_RETURN_NONE;
+      }
+
+      return symbol_to_symbol_object (sym);
+    }
+  catch (const gdb_exception &except)
+    {
+      GDB_PY_HANDLE_EXCEPTION (except);
+    }
+
+  Py_RETURN_NONE;
+}
+
 /* Implement repr() for gdb.Objfile.  */
 
 static PyObject *
@@ -652,6 +690,11 @@ Return true if this object file is valid, false if not." },
     "add_separate_debug_file (file_name).\n\
 Add FILE_NAME to the list of files containing debug info for the objfile." },
 
+  { "lookup_global_symbol", (PyCFunction) objfpy_lookup_global_symbol,
+    METH_VARARGS | METH_KEYWORDS,
+    "lookup_global_symbol (name [, domain]).\n\
+Looks up a global symbol in this objfile and returns it." },
+
   { NULL }
 };
 
diff --git a/gdb/solib-spu.c b/gdb/solib-spu.c
index c5dc8639f1..faa4ac3956 100644
--- a/gdb/solib-spu.c
+++ b/gdb/solib-spu.c
@@ -392,7 +392,8 @@ spu_lookup_lib_symbol (struct objfile *objfile,
 		       const domain_enum domain)
 {
   if (bfd_get_arch (objfile->obfd) == bfd_arch_spu)
-    return lookup_global_symbol_from_objfile (objfile, name, domain);
+    return lookup_global_symbol_from_objfile (objfile, GLOBAL_BLOCK, name,
+					      domain);
 
   if (svr4_so_ops.lookup_lib_global_symbol != NULL)
     return svr4_so_ops.lookup_lib_global_symbol (objfile, name, domain);
diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c
index 8cd5b7d8e7..c0c505acaa 100644
--- a/gdb/solib-svr4.c
+++ b/gdb/solib-svr4.c
@@ -3226,7 +3226,8 @@ elf_lookup_lib_symbol (struct objfile *objfile,
   if (abfd == NULL || scan_dyntag (DT_SYMBOLIC, abfd, NULL, NULL) != 1)
     return {};
 
-  return lookup_global_symbol_from_objfile (objfile, name, domain);
+  return lookup_global_symbol_from_objfile (objfile, GLOBAL_BLOCK, name,
+					    domain);
 }
 
 void
diff --git a/gdb/symtab.c b/gdb/symtab.c
index 4920d94a24..4e8c58f272 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -2223,15 +2223,18 @@ lookup_symbol_in_block (const char *name, symbol_name_match_type match_type,
 
 struct block_symbol
 lookup_global_symbol_from_objfile (struct objfile *main_objfile,
+				   enum block_enum block_index,
 				   const char *name,
 				   const domain_enum domain)
 {
+  gdb_assert (block_index == GLOBAL_BLOCK || block_index == STATIC_BLOCK);
+
   for (objfile *objfile : main_objfile->separate_debug_objfiles ())
     {
       struct block_symbol result
-        = lookup_symbol_in_objfile (objfile, GLOBAL_BLOCK, name, domain);
+        = lookup_symbol_in_objfile (objfile, block_index, name, domain);
 
-      if (result.symbol != NULL)
+      if (result.symbol != nullptr)
 	return result;
     }
 
diff --git a/gdb/symtab.h b/gdb/symtab.h
index e4ee7271a1..0e808a68c2 100644
--- a/gdb/symtab.h
+++ b/gdb/symtab.h
@@ -2051,10 +2051,12 @@ extern enum language main_language (void);
 /* Lookup symbol NAME from DOMAIN in MAIN_OBJFILE's global blocks.
    This searches MAIN_OBJFILE as well as any associated separate debug info
    objfiles of MAIN_OBJFILE.
+   block_index can be GLOBAL_BLOCK or STATIC_BLOCK.
    Upon success fixes up the symbol's section if necessary.  */
 
 extern struct block_symbol
   lookup_global_symbol_from_objfile (struct objfile *main_objfile,
+				     enum block_enum block_index,
 				     const char *name,
 				     const domain_enum domain);
 
diff --git a/gdb/testsuite/gdb.python/py-objfile.c b/gdb/testsuite/gdb.python/py-objfile.c
index ac41491234..6d751bddae 100644
--- a/gdb/testsuite/gdb.python/py-objfile.c
+++ b/gdb/testsuite/gdb.python/py-objfile.c
@@ -15,6 +15,9 @@
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
+int global_var = 42;
+static int static_var = 50;
+
 int
 main ()
 {
diff --git a/gdb/testsuite/gdb.python/py-objfile.exp b/gdb/testsuite/gdb.python/py-objfile.exp
index b5e0c5e760..3009d0711e 100644
--- a/gdb/testsuite/gdb.python/py-objfile.exp
+++ b/gdb/testsuite/gdb.python/py-objfile.exp
@@ -55,6 +55,13 @@ gdb_test "python print (gdb.lookup_objfile (\"${testfile}\").filename)" \
 gdb_test "python print (gdb.lookup_objfile (\"junk\"))" \
     "Objfile not found\\.\r\n${python_error_text}"
 
+gdb_test "python print (gdb.lookup_objfile (\"${testfile}\").lookup_global_symbol (\"global_var\").name)" \
+    "global_var" "lookup_global_symbol find a valid symbol"
+gdb_test "python print (gdb.lookup_objfile (\"${testfile}\").lookup_global_symbol (\"static_var\").name)" \
+    "static_var" "lookup_global_symbol find a valid static symbol"
+gdb_test "python print (gdb.lookup_objfile (\"${testfile}\").lookup_global_symbol (\"stdout\"))" \
+    "None" "lookup_global_symbol doesn't find symbol in other objfile"
+
 set binfile_build_id [get_build_id $binfile]
 if [string compare $binfile_build_id ""] {
     verbose -log "binfile_build_id = $binfile_build_id"
