From b3a54ed36961fbc5ef45c782077ff84669f79997 Mon Sep 17 00:00:00 2001 From: Zhaoqi Xu Date: Wed, 2 Sep 2026 05:21:13 +0800 Subject: [PATCH] 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 --- components/esp_rom/gen_gdbinit.py | 4 +++- components/esp_rom/test_esp_rom.py | 34 ++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/components/esp_rom/gen_gdbinit.py b/components/esp_rom/gen_gdbinit.py index 6e8d2b0007d..82a821cb75e 100644 --- a/components/esp_rom/gen_gdbinit.py +++ b/components/esp_rom/gen_gdbinit.py @@ -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 diff --git a/components/esp_rom/test_esp_rom.py b/components/esp_rom/test_esp_rom.py index a5f65b920a7..ccfea47c8ac 100644 --- a/components/esp_rom/test_esp_rom.py +++ b/components/esp_rom/test_esp_rom.py @@ -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