[PATCH] objdump: sframe: fix multiple emission of SFrame and DWARF Frame
Jens Remus
jremus@linux.ibm.com
Thu Feb 5 10:44:20 GMT 2026
On 2/5/2026 10:04 AM, Indu Bhagat wrote:
> On 2/4/26 8:08 AM, Jens Remus wrote:
>> On 2/3/2026 11:37 PM, Indu Bhagat via Binutils wrote:
>
>>> diff --git a/binutils/objdump.c b/binutils/objdump.c
>>
>>> @@ -4983,33 +4979,40 @@ dump_ctf (bfd *abfd ATTRIBUTE_UNUSED, const char *sect_name ATTRIBUTE_UNUSED,
>>> #endif
>>> static void
>>> -dump_sframe_section (bfd *abfd, const char *sect_name, bool is_mainfile)
>>> +dump_sframe_section (bfd *abfd, const char *sect_name)
>>> {
>>> /* Error checking for user provided SFrame section name, if any. */
>>> - if (sect_name)
>>> + asection *sec = bfd_get_section_by_name (abfd, sect_name);
>>> + if (sec == NULL)
>>> {
>>> - asection *sec = bfd_get_section_by_name (abfd, sect_name);
>>> - if (sec == NULL)
>>> - {
>>> - printf (_("No %s section present\n\n"), sanitize_string (sect_name));
>>> - return;
>>> - }
>>> - /* Starting with Binutils 2.45, SFrame sections have section type
>>> - SHT_GNU_SFRAME. For SFrame sections from Binutils 2.44 or earlier,
>>> - check explcitly for SFrame sections of type SHT_PROGBITS and name
>>> - ".sframe" to allow them. */
>>> - else if (bfd_get_flavour (abfd) != bfd_target_elf_flavour
>>> - || (elf_section_type (sec) != SHT_GNU_SFRAME
>>> - && !(elf_section_type (sec) == SHT_PROGBITS
>>> - && strcmp (sect_name, ".sframe") == 0)))
>>> - {
>>> - printf (_("Section %s does not contain SFrame data\n\n"),
>>> - sanitize_string (sect_name));
>>> - return;
>>> - }
>>> + printf (_("No %s section present\n\n"), sanitize_string (sect_name));
>>> + return;
>>> + }
>>> + /* Starting with Binutils 2.45, SFrame sections have section type
>>> + SHT_GNU_SFRAME. For SFrame sections from Binutils 2.44 or earlier,
>>> + check explcitly for SFrame sections of type SHT_PROGBITS and name
>>> + ".sframe" to allow them. */
>>> + else if (bfd_get_flavour (abfd) != bfd_target_elf_flavour
>>> + || (elf_section_type (sec) != SHT_GNU_SFRAME
>>> + && !(elf_section_type (sec) == SHT_PROGBITS
>>> + && strcmp (sect_name, ".sframe") == 0)))
>>> + {
>>> + printf (_("Section %s does not contain SFrame data\n\n"),
>>> + sanitize_string (sect_name));
>>> + return;
>>> }
>>> - dump_dwarf (abfd, is_mainfile);
>>> +
>>> + /* Instead of invoking dump_dwarf () here, load the section and invoke the
>>> + display function directly. Otherwise, the textual dump may contain
>>> + duplicate output due to two invocations of dump_dwarf (). See PR
>>> + libsframe/33806. */
>>> + if (!load_specific_debug_section (sframe, sec, (void*) abfd))
>>> + return;
>>> +
>>> + struct dwarf_section *section = &debug_displays[sframe].section;
>>> + section->name = sect_name;
>>> + debug_displays[sframe].display (section, abfd);
>>
>> Why not free the loaded section afterwards, as dump_dwarf_section()
>> would have done?
>>
>> free_debug_section (sframe);
> free_debug_memory () invocation takes care of free'ing the debug section
> data (including sframe). So free_debug_section (sframe) looks unnecessary.
Thanks! That was not obvious to me. Given that dump_dwarf_section()
does it (and you will likely send a v2 anyway) I wonder whether it would
still make sense so that others are not confused as well.
Tracing objdump --sframe passing multiple objects with .sframe as input
and could confirm that free_debug_section() is called after processing
each input. I was worried, that the section data of all inputs would
accumulate in a single objdump run. Especially given it is only done for
(is_mainfile), while dump_sframe_section() might be called for
(is_mainfile || process_links). Can we rule out that the latter may
trigger dump_sframe_section()?
At least I was not able to trick objdump to follow a link to .sframe:
$ cd path-to-binutils-build/ld/tmpdir
$ ../ld-new -o sframe-sample sframe-foo.o sframe-bar.o
$ cp sframe-sample sframe-sample.full
$ ../../binutils/strip-new --strip-debug -R .sframe sframe-sample
$ ../../binutils/objcopy --add-gnu-debuglink=sframe-sample.full sframe-sample
$ ../../binutils/objdump --sframe sframe-sample
No .sframe section present
Regards,
Jens
--
Jens Remus
Linux on Z Development (D3303)
jremus@de.ibm.com / jremus@linux.ibm.com
IBM Deutschland Research & Development GmbH; Vorsitzender des Aufsichtsrats: Wolfgang Wendt; Geschäftsführung: David Faller; Sitz der Gesellschaft: Ehningen; Registergericht: Amtsgericht Stuttgart, HRB 243294
IBM Data Privacy Statement: https://www.ibm.com/privacy/
More information about the Binutils
mailing list