Re: [PATCH] Add missing null pointer check in get_sal_arch

Craig Blackmore <[email protected]>
Newsgroups gmane.comp.gdb.patches
Message-ID <[email protected]>
Hi Andrew,

On 31/07/2026 16:27, Andrew Burgess wrote:
> Andrew Burgess<[email protected]> writes:
>
>> Craig Blackmore<[email protected]> writes:
>>
>>> This fixes a GDB crash when trying to set a breakpoint on a function in
>>> an ELF where there is both no .text section and the first section within
>>> the ELF is not allocatable.
>> This tells us WHAT happened, but not WHY.  We understand the input as
>> you gave a description of the ELF, and you explained the end result, a
>> crash.  But it would be really useful if you could fill in the middle
>> bit.  Why does the objfile end up as NULL?
>>
>> When a fix is "add a NULL pointer check" my immediate question is: should the pointer even be NULL? Maybe 
>> there's a better fix elsewhere in GDB which prevents the pointer from 
>> ever becoming NULL. The goal of the "middle bit" that I asked for above is to convince the reviewers
>> that NULL is a valid possibility and that a NULL check should be added.
>>
>> This commit from April seems like it might be in a similar area of GDB:
>>
>>    commit cd289df068e39683576f95907b5dd06ae3e4e254
>>    Date:   Wed Apr 15 10:43:31 2026 +0100
>>
>>      gdb: don't use .text as default entry point section
>>
>> and might be worth a read.
> I looked at this a bit more and `init_objfile_sect_indices` ends with
> this code:
>
>    for (i = 0; i < objfile->section_offsets.size (); i++)
>      {
>        if (objfile->section_offsets[i] != 0)
> 	{
> 	  break;
> 	}
>      }
>    if (i == objfile->section_offsets.size ())
>      {
>        if (objfile->sect_index_text == -1)
> 	objfile->sect_index_text = 0;
>        if (objfile->sect_index_data == -1)
> 	objfile->sect_index_data = 0;
>        if (objfile->sect_index_bss == -1)
> 	objfile->sect_index_bss = 0;
>        if (objfile->sect_index_rodata == -1)
> 	objfile->sect_index_rodata = 0;
>      }
>
> With the idea being that if every section has a relocation offset of
> zero then we can just point at any section.  That's fine as far as the
> actual relocation offset is concerned, but sect_index_text is also used
> to find an objfile, and in this case, we need to point to an actual
> allocatable section.
>
> Maybe we should rewrite the 'if (objfile->sect_index_text == -1)' case
> so instead of always selecting index 0 we select the first allocatable
> and executable section?  I had a go at this, see the patch below, and
> your test case still passes.
>
> I also wondered if we should be adding an assert to catch this
> problematic case earlier on?  In
> buildsym_compunit::finish_block_internal where we do:
>
>        symbol->set_section_index (SECT_OFF_TEXT (m_objfile));
>
> this seems to be the first point where we could spot the problem maybe
> as this is where the offset to the wrong section is used for a symbol.
> Maybe here, or close to here, we could have an assert that the symbol
> has a valid objfile?  I haven't exactly figured this bit out, but could
> be something to investigate.
>
> Anyway, let me know what you think of this alternative approach.

Thanks for looking into this and sharing your analysis and alternative
fix. I much prefer your fix as it addresses the root cause and it works
on both my original test and the updated test that I just posted.

As you've written the fix, would you prefer to add my test to your patch
or for me to combine everything into a new submission?

Thanks,
Craig
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.