linker generated list: provide an iterator to simplify list access

Given that the section name and boundary simbols can be inferred from
the struct object name, it makes sense to create an iterator that
abstracts away the access details and reduce the possibility for
mistakes.

Signed-off-by: Nicolas Pitre <npitre@baylibre.com>
diff --git a/kernel/timer.c b/kernel/timer.c
index 6bf8a54..cbb7968 100644
--- a/kernel/timer.c
+++ b/kernel/timer.c
@@ -12,9 +12,6 @@
 #include <stdbool.h>
 #include <spinlock.h>
 
-extern struct k_timer _k_timer_list_start[];
-extern struct k_timer _k_timer_list_end[];
-
 static struct k_spinlock lock;
 
 #ifdef CONFIG_OBJECT_TRACING
@@ -28,9 +25,7 @@
 {
 	ARG_UNUSED(dev);
 
-	struct k_timer *timer;
-
-	for (timer = _k_timer_list_start; timer < _k_timer_list_end; timer++) {
+	Z_STRUCT_SECTION_FOREACH(k_timer, timer) {
 		SYS_TRACING_OBJ_INIT(k_timer, timer);
 	}
 	return 0;