fix(esp_rom): posixpath.join ESP_ROM_ELF_DIR when generating gdb symbols

ESP_ROM_ELF_DIR from the Windows export scripts often has no trailing
separator. Concatenating it with the ROM ELF filename produced
.../20241011esp32c3_rev101_rom.elf. Use posixpath.join so GDB always
gets a POSIX path with a slash.

Closes https://github.com/espressif/esp-idf/issues/18418
This commit is contained in:
Zhaoqi Xu
2026-09-18 12:29:05 +07:00
committed by Alexey Lapshin
parent fd163d917c
commit b3a54ed369
2 changed files with 37 additions and 1 deletions
+3 -1
View File
@@ -4,6 +4,7 @@
# SPDX-License-Identifier: Apache-2.0
import json
import os
import posixpath
import sys
from textwrap import indent
@@ -46,10 +47,11 @@ def generate_gdbinit_rom_add_symbols(target: str) -> str:
for i, k in enumerate(roms[target], 1):
indent_str = base_ident * i
rom_file = f'{target}_rev{k["rev"]}_rom.elf'
rom_path = posixpath.join(rom_elfs_dir, rom_file)
build_date_addr = int(k['build_date_str_addr'], base=16)
r.append(indent(f'# if $_streq((char *) {hex(build_date_addr)}, "{k["build_date_str"]}")', indent_str))
r.append(indent(get_rom_if_condition_str(build_date_addr, k['build_date_str']), indent_str))
r.append(indent(f'add-symbol-file {rom_elfs_dir}{rom_file}', indent_str + base_ident))
r.append(indent(f'add-symbol-file {rom_path}', indent_str + base_ident))
r.append(indent('else', indent_str))
if i == len(roms[target]):
# In case no one known ROM ELF fits - print warning
+34
View File
@@ -1,6 +1,7 @@
#!/usr/bin/env python
# SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: Apache-2.0
import importlib.util
import json
import os
@@ -54,3 +55,36 @@ def test_roms_validate_build_date() -> None:
build_date_str = get_string_from_elf_by_addr(rom_file, int(k['build_date_str_addr'], base=16))
assert len(build_date_str) == 11
assert build_date_str == k['build_date_str']
def test_gen_gdbinit_joins_rom_elf_dir() -> None:
module_path = os.path.join(os.path.dirname(ROMS_JSON), 'gen_gdbinit.py')
spec = importlib.util.spec_from_file_location('gen_gdbinit', module_path)
assert spec is not None and spec.loader is not None
gen_gdbinit = importlib.util.module_from_spec(spec)
spec.loader.exec_module(gen_gdbinit)
rom_dir = '/tmp/esp-rom-elfs/20241011'
old = os.environ.get('ESP_ROM_ELF_DIR')
os.environ['ESP_ROM_ELF_DIR'] = rom_dir
try:
out = gen_gdbinit.generate_gdbinit_rom_add_symbols('esp32c3')
finally:
if old is None:
os.environ.pop('ESP_ROM_ELF_DIR', None)
else:
os.environ['ESP_ROM_ELF_DIR'] = old
assert f'add-symbol-file {rom_dir}/esp32c3_rev' in out
assert f'add-symbol-file {rom_dir}esp32c3_rev' not in out
os.environ['ESP_ROM_ELF_DIR'] = rom_dir + '/'
try:
out_slash = gen_gdbinit.generate_gdbinit_rom_add_symbols('esp32c3')
finally:
if old is None:
os.environ.pop('ESP_ROM_ELF_DIR', None)
else:
os.environ['ESP_ROM_ELF_DIR'] = old
assert f'add-symbol-file {rom_dir}/esp32c3_rev' in out_slash