build: symtab: Add a dummy entry at the end for the binary search
The `symtab_find_symbol_name()` is using an adapted binary
search function to get the entry between 2 addresses, we need
to add a dummy entry at the end so that the search function
can remain simple and straightforward without doing
out-of-bound checks:
20 \
|
|
50 x
|
|
90 x
. |
. |
. |
dummy /
Signed-off-by: Yong Cong Sin <ycsin@meta.com>
diff --git a/scripts/build/gen_symtab.py b/scripts/build/gen_symtab.py
index c924cfc..ef08456 100644
--- a/scripts/build/gen_symtab.py
+++ b/scripts/build/gen_symtab.py
@@ -55,8 +55,9 @@
class symtab_entry:
- def __init__(self, addr, offset, name):
+ def __init__(self, addr, size, offset, name):
self.addr = addr
+ self.size = size
self.offset = offset
self.name = name
@@ -90,11 +91,12 @@
for nsym, symbol in enumerate(symtab.iter_symbols()): # pylint: disable=unused-variable
symbol_type = describe_symbol_type(symbol['st_info']['type'])
symbol_addr = symbol['st_value']
+ symbol_size = symbol['st_size']
if symbol_type == 'FUNC' and symbol_addr != 0:
symbol_name = sanitize_func_name(symbol.name)
symtab_list.append(symtab_entry(
- symbol_addr, symbol_addr, symbol_name))
+ symbol_addr, symbol_addr, symbol_size, symbol_name))
log.debug('%6d: %s %.25s' % (
i,
hex(symbol_addr),
@@ -115,10 +117,21 @@
print("#include <zephyr/debug/symtab.h>", file=wf)
print("", file=wf)
print(
- f"const struct z_symtab_entry z_symtab_entries[{len(symtab_list)}] = {{", file=wf)
+ f"const struct z_symtab_entry z_symtab_entries[{len(symtab_list) + 1}] = {{", file=wf)
for i, entry in enumerate(symtab_list):
print(
- f"\t[{i}] = {{.offset = {hex(entry.offset)}, .name = \"{entry.name}\"}}, /* {hex(entry.addr)} */", file=wf)
+ f"\t/* ADDR: {hex(entry.addr)} SIZE: {hex(entry.size)} */", file=wf)
+ print(
+ f"\t[{i}] = {{.offset = {hex(entry.offset)}, .name = \"{entry.name}\"}},", file=wf)
+
+ # Append a dummy entry at the end to facilitate the binary search
+ if symtab_list[-1].size == 0:
+ dummy_offset = f"{hex(symtab_list[-1].offset)} + sizeof(uintptr_t)"
+ else:
+ dummy_offset = f"{hex(symtab_list[-1].offset + symtab_list[-1].size)}"
+ print("\t/* dummy entry */", file=wf)
+ print(
+ f"\t[{len(symtab_list)}] = {{.offset = {dummy_offset}, .name = \"?\"}},", file=wf)
print(f"}};\n", file=wf)
print(f"const struct symtab_info z_symtab = {{", file=wf)