Summary: | Unknown DWARF DW_FORM_0x25 (DW_FORM_strx) | ||
---|---|---|---|
Product: | debugedit | Reporter: | Vitaly Chikunov <vt> |
Component: | debugedit | Assignee: | Not yet assigned to anyone <unassigned> |
Status: | RESOLVED FIXED | ||
Severity: | normal | CC: | bero, debugedit, evangelos, jordan, mark, sam, seppo.yliolli, telans, tuliom |
Priority: | P2 | ||
Version: | unspecified | ||
Target Milestone: | --- | ||
Host: | Target: | ||
Build: | Last reconfirmed: | 2021-12-27 00:00:00 | |
Attachments: | Example of compiled module |
Description
Vitaly Chikunov
2021-12-27 07:23:56 UTC
Also, it seems, debugedit is unable to extract source list from such binary. (In reply to Vitaly Chikunov from comment #0) > When building Linux kernel with[1] CC=clang LLVM=1 and > CONFIG_DEBUG_INFO_DWARF5=y debugedit reports error when processing compiled > kernel modules, such as > > debugedit: > ./lib/modules/5.16.0+rc6.20211223-drm-tip-alt1/kernel/sound/usb/caiaq/snd- > usb-caiaq.ko: Unknown DWARF DW_FORM_0x25 That is DW_FORM_strx1, which is only partially supported by debugedit. Normally the DW_FORM_strx forms are only used when generating split DWARF (.dwo) files. Best workaround for now is to not use DWARF5 with llvm (which isn't the default for clang/llvm anyway). (In reply to Mark Wielaard from comment #2) > (In reply to Vitaly Chikunov from comment #0) > > When building Linux kernel with[1] CC=clang LLVM=1 and > > CONFIG_DEBUG_INFO_DWARF5=y debugedit reports error when processing compiled > > kernel modules, such as > > > > debugedit: > > ./lib/modules/5.16.0+rc6.20211223-drm-tip-alt1/kernel/sound/usb/caiaq/snd- > > usb-caiaq.ko: Unknown DWARF DW_FORM_0x25 > > That is DW_FORM_strx1, which is only partially supported by debugedit. > Normally the DW_FORM_strx forms are only used when generating split DWARF > (.dwo) files. Best workaround for now is to not use DWARF5 with llvm (which > isn't the default for clang/llvm anyway). DWARFv5 is now the default with the upcoming Clang 14.0.0 release: https://github.com/llvm/llvm-project/blob/e80c52986e1bb3afa6a92c58b1cb897877923a66/clang/docs/ReleaseNotes.rst#dwarf-support-in-clang At the moment debugedit warns for almost any binary compiled with Clang 14.0.0-rc1 Additionally from what I can tell the flags to re-enable DWARFv4, -gdwarf-4, and -fdebug-default-version=4 do nothing to silence this issue. (In reply to James Beddek from comment #4) > Additionally from what I can tell the flags to re-enable DWARFv4, -gdwarf-4, > and -fdebug-default-version=4 do nothing to silence this issue. CC=clang CFLAGS="-gdwarf-4 -fdebug-default-version=4" ... doesn't give a warning for me at least. This has been bugging me for a while, glad I found it. *** Bug 29773 has been marked as a duplicate of this bug. *** This is now reproducing basically everywhere where LLVM17 clang is used. The workaround to use DWARF4 seems quite unexpected now that DWARF5 is these days the norm for everything. commit 3e7aeeab4f744ad15108775685db68d3a35b0735 Author: Mark Wielaard <mark@klomp.org> Date: Thu Mar 23 18:07:40 2023 +0100 debugedit: Add support for .debug_str_offsets (DW_FORM_strx) In theory supporting strx .debug_str_offsets is easy, the strings in .debug_str are just read through an indirection table. When the strings are updated in .debug_str we just need to rewrite the indirection table. The tricky part is the ET_REL (object files or kernel modules) support. Relocation reading is "global" per section and we expect to read a relocation only once. But we need to read the DW_AT_str_offsets_base before reading any strx form attributes. So we read that first, then reset the relptr. And when we read from the .debug_str_offsets section we need to save and restore the .debug_info relptr. * tools/debugedit.c (do_read_24): New function. (str_offsets_base): New static variable. (buf_read_ule24): New function. (buf_read_ube24): Likewise. (setup_relbuf): Handle .debug_str_offsets. (do_read_uleb128): New function. (do_read_str_form_relocated): Likewise. (read_abbrev): Handle DW_FORM_strx[1234]. (edit_strp): Take the actual string form as argument. Use do_read_str_form_relocated. (read_dwarf5_line_entries): Pass form to edit_strp. (edit_attributes_str_comp_dir): Take the actual string form as argument. Use do_read_str_form_relocated. (edit_attributes): Handle DW_FORM_strx[1234]. (edit_info): Read DW_AT_str_offsets_base first. (update_str_offsets): New function. (edit_dwarf2): Setup do_read_24. Call update_str_offsets. https://sourceware.org/bugzilla/show_bug.cgi?id=28728 Signed-off-by: Mark Wielaard <mark@klomp.org> Mark, Thanks the fix! But, since LLVM 18 is started to produce DWARF 5 by default, maybe you can draft a release with it? (In reply to Vitaly Chikunov from comment #10) > Thanks the fix! But, since LLVM 18 is started to produce DWARF 5 by default, > maybe you can draft a release with it? I found some other bugs that cause issues with strx. Will post them soon. Current work in progress here: https://code.wildebeest.org/git/user/mjw/debugedit/log/?h=strx Then do a new release after those get integrated. |