diff --git a/core/includes/install.inc b/core/includes/install.inc
index a590d8dacd0856017f1717f6e519e373802c31b1..06d9500a99b4cd3701b62412981c306eb8a077e4 100644
--- a/core/includes/install.inc
+++ b/core/includes/install.inc
@@ -1126,7 +1126,9 @@ function install_profile_info($profile, $langcode = 'en') {
       'config_install_path' => NULL,
     ];
     $profile_path = \Drupal::service('extension.list.profile')->getPath($profile);
-    $info = \Drupal::service('info_parser')->parse("$profile_path/$profile.info.yml");
+    /** @var \Drupal\Core\Extension\InfoParserInterface $parser */
+    $parser = \Drupal::service('info_parser');
+    $info = $parser->parse("$profile_path/$profile.info.yml");
     $info += $defaults;
 
     $dependency_name_function = function ($dependency) {
@@ -1138,9 +1140,16 @@ function install_profile_info($profile, $langcode = 'en') {
     // Convert install key in [project:module] format.
     $info['install'] = array_map($dependency_name_function, $info['install']);
 
-    // drupal_required_modules() includes the current profile as a dependency.
-    // Remove that dependency, since a module cannot depend on itself.
-    $required = array_diff(drupal_required_modules(), [$profile]);
+    // Get a list of core's required modules.
+    $required = [];
+    $listing = new ExtensionDiscovery(\Drupal::root());
+    $files = $listing->scan('module');
+    foreach ($files as $name => $file) {
+      $parsed = $parser->parse($file->getPathname());
+      if (!empty($parsed) && !empty($parsed['required']) && $parsed['required']) {
+        $required[] = $name;
+      }
+    }
 
     $locale = !empty($langcode) && $langcode != 'en' ? ['locale'] : [];
 
diff --git a/core/includes/module.inc b/core/includes/module.inc
index 373d260a4b8a6a98af5c2a4a7ed1a839830899d3..a2012f3f4c2cde9a9f51fe4744f2e5fc49c40e6a 100644
--- a/core/includes/module.inc
+++ b/core/includes/module.inc
@@ -61,8 +61,14 @@ function module_load_include($type, $module, $name = NULL) {
 
 /**
  * Returns an array of modules required by core.
+ *
+ * @deprecated in drupal:9.4.0 and is removed from drupal:10.0.0. There's no
+ *   replacement.
+ *
+ * @see https://www.drupal.org/node/3262811
  */
 function drupal_required_modules() {
+  @trigger_error(__FUNCTION__ . "() is deprecated in drupal:9.4.0 and is removed from drupal:10.0.0. There's no replacement. See https://www.drupal.org/node/3262811", E_USER_DEPRECATED);
   $listing = new ExtensionDiscovery(\Drupal::root());
   $files = $listing->scan('module');
   $required = [];
diff --git a/core/tests/Drupal/KernelTests/Core/Extension/ModuleLegacyTest.php b/core/tests/Drupal/KernelTests/Core/Extension/ModuleLegacyTest.php
index 1b281c286a7297fc74e32e0fe036837021122a96..a3c86aabd5eae9fee4cd51d10d0acd604a7a9f2e 100644
--- a/core/tests/Drupal/KernelTests/Core/Extension/ModuleLegacyTest.php
+++ b/core/tests/Drupal/KernelTests/Core/Extension/ModuleLegacyTest.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\KernelTests\Core\Extension;
 
+use Drupal\Core\Extension\ExtensionDiscovery;
 use Drupal\KernelTests\KernelTestBase;
 
 /**
@@ -22,4 +23,24 @@ public function testModuleLoadInclude() {
 
   }
 
+  /**
+   * Test deprecation of drupal_required_modules() function.
+   */
+  public function testDrupalRequiredModules() {
+    $this->expectDeprecation("drupal_required_modules() is deprecated in drupal:9.4.0 and is removed from drupal:10.0.0. There's no replacement. See https://www.drupal.org/node/3262811");
+    /** @var \Drupal\Core\Extension\InfoParserInterface $parser */
+    $parser = \Drupal::service('info_parser');
+    $listing = new ExtensionDiscovery(\Drupal::root());
+    $files = $listing->scan('module');
+    // Empty as there's no install profile.
+    $required = [];
+    foreach ($files as $name => $file) {
+      $info = $parser->parse($file->getPathname());
+      if (!empty($info) && !empty($info['required']) && $info['required']) {
+        $required[] = $name;
+      }
+    }
+    $this->assertSame($required, drupal_required_modules());
+  }
+
 }