diff --git a/components/esp_pm/test_apps/esp_pm/pytest_esp_pm.py b/components/esp_pm/test_apps/esp_pm/pytest_esp_pm.py
index 1fca4267edf..f4a141fd674 100644
--- a/components/esp_pm/test_apps/esp_pm/pytest_esp_pm.py
+++ b/components/esp_pm/test_apps/esp_pm/pytest_esp_pm.py
@@ -12,8 +12,11 @@ from pytest_embedded_idf.utils import idf_parametrize
# When CONFIG_PM_ENABLE is set, the link must resolve to the strong (pm_impl.o)
# definitions. Verified post-build via the app .map cross-reference section,
# e.g. "esp_pm_impl_idle_hook esp-idf/esp_pm/libesp_pm.a(pm_impl.c.obj)".
+# The init_pm startup registration in pm_impl.c must also be linked: its
+# ESP_SYSTEM_INIT_FN table entry lands in the priority-201 init section.
_PM_HOOK_SYMBOLS = ('esp_pm_impl_idle_hook', 'esp_pm_impl_waiti')
_PM_TICKLESS_SYMBOLS = ('esp_pm_impl_tickless_waiti',)
+_PM_INIT_SECTION = '.esysev_inits.201'
def _map_symbol_providers(map_path: str, symbol: str) -> list[str]:
@@ -27,6 +30,36 @@ def _map_symbol_providers(map_path: str, symbol: str) -> list[str]:
return providers
+def _map_linked_section_providers(map_path: str, section: str) -> list[str]:
+ # Only look at the linked memory map, not at "Discarded input sections".
+ # A section name is followed by "