[PATCH][gdb] Fix fbsd core matching

Tom de Vries tdevries@suse.de
Tue Jun 14 09:03:22 GMT 2022


On 6/14/22 02:05, Alan Modra wrote:
> On Thu, Jun 09, 2022 at 08:59:37AM -0700, John Baldwin wrote:
>> On 6/9/22 1:58 AM, Tom de Vries via Gdb-patches wrote:
>>> Hi,
>>>
>>> With an --enable-targets=all build and target board unix/-m32 I run into a
>>> FAIL in test-case gdb.base/corefile.exp:
>>> ...
>>> (gdb) file outputs/gdb.base/corefile/corefile^M
>>> Reading symbols from outputs/gdb.base/corefile/corefile...^M
>>> (gdb) core-file outputs/gdb.base/corefile/corefile.core^M
>>> warning: core file may not match specified executable file.^M
>>> [New LWP 12011]^M
>>> Core was generated by `outputs/gdb.base/corefile/co'.^M
>>> Program terminated with signal SIGABRT, Aborted.^M
>>> (gdb) FAIL: gdb.base/corefile.exp: core-file warning-free
>>> ...
>>>
>>> The warning is there because of this mismatch between core and exec:
>>> ...
>>> (gdb) p core_bfd->xvec
>>> $3 = (const struct bfd_target *) 0x20112a0 <i386_elf32_fbsd_vec>
>>> (gdb) p exec_bfd->xvec
>>> $4 = (const struct bfd_target *) 0x2010b00 <i386_elf32_vec>
>>> ...
>>>
>>> In the exec case, the detected architecture is i386_elf32_vec because this bit
>>> of code in elfcode.h:elf_object_p():
>>> ...
>>>     if (ebd->elf_machine_code != EM_NONE
>>>         && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi
>>>         && ebd->elf_osabi != ELFOSABI_NONE)
>>>       goto got_wrong_format_error;
>>> ...
>>> prevents i386_elf32_fbsd from matching.
>>>
>>> Fix the core matching by copying that code to elfcore.h:elf_core_file_p().
>>>
>>> Tested on x86_64-linux.
>>>
>>> Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=29227
>>>
>>> Any comments?
> 
> Looks good.
> 
>> Looking at elfcore.h, it seems to have not gotten changes made to elfcode.h over
>> time and is a bit rotted.  I suspect that all of changes made in commit 0aabe54e6222
>> that added these lines in elfcode.h (along with several other changes) need to
>> be applied to this function in elfcore.h, not just adding these lines.
> 
> Yes, the commit 0aabe54e6222 changes likely should go in too.  I'm a
> little wary of adding all the sanity checks to elf_core_file_p since
> that might result in some core files not being recognised at all.  For
> example, despite the FIXME I'd guess leaving out the EI_VERSION check
> was deliberate.  The following seems reasonable to me.  Please test.
> 

I've run the gdb testsuite on x86_64-linux with native and target board 
unix-/m32, no regressions and originally reported FAIL fixed.

Thanks,
- Tom

> diff --git a/bfd/elfcore.h b/bfd/elfcore.h
> index 809f6711aed..59b73bd57de 100644
> --- a/bfd/elfcore.h
> +++ b/bfd/elfcore.h
> @@ -149,37 +149,14 @@ elf_core_file_p (bfd *abfd)
>         && (ebd->elf_machine_alt1 == 0
>   	  || i_ehdrp->e_machine != ebd->elf_machine_alt1)
>         && (ebd->elf_machine_alt2 == 0
> -	  || i_ehdrp->e_machine != ebd->elf_machine_alt2))
> -    {
> -      const bfd_target * const *target_ptr;
> -
> -      if (ebd->elf_machine_code != EM_NONE)
> -	goto wrong;
> -
> -      /* This is the generic ELF target.  Let it match any ELF target
> -	 for which we do not have a specific backend.  */
> +	  || i_ehdrp->e_machine != ebd->elf_machine_alt2)
> +      && ebd->elf_machine_code != EM_NONE)
> +    goto wrong;
>   
> -      for (target_ptr = bfd_target_vector; *target_ptr != NULL; target_ptr++)
> -	{
> -	  const struct elf_backend_data *back;
> -
> -	  if ((*target_ptr)->flavour != bfd_target_elf_flavour)
> -	    continue;
> -	  back = xvec_get_elf_backend_data (*target_ptr);
> -	  if (back->s->arch_size != ARCH_SIZE)
> -	    continue;
> -	  if (back->elf_machine_code == i_ehdrp->e_machine
> -	      || (back->elf_machine_alt1 != 0
> -		  && i_ehdrp->e_machine == back->elf_machine_alt1)
> -	      || (back->elf_machine_alt2 != 0
> -		  && i_ehdrp->e_machine == back->elf_machine_alt2))
> -	    {
> -	      /* target_ptr is an ELF backend which matches this
> -		 object file, so reject the generic ELF target.  */
> -	      goto wrong;
> -	    }
> -	}
> -    }
> +  if (ebd->elf_machine_code != EM_NONE
> +      && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi
> +      && ebd->elf_osabi != ELFOSABI_NONE)
> +    goto wrong;
>   
>     /* If there is no program header, or the type is not a core file, then
>        we are hosed.  */
> @@ -199,6 +176,9 @@ elf_core_file_p (bfd *abfd)
>         Elf_Internal_Shdr i_shdr;
>         file_ptr where = (file_ptr) i_ehdrp->e_shoff;
>   
> +      if (i_ehdrp->e_shoff < sizeof (x_ehdr))
> +	goto wrong;
> +
>         /* Seek to the section header table in the file.  */
>         if (bfd_seek (abfd, where, SEEK_SET) != 0)
>   	goto fail;
> 
>> I've cc'd Alan who made that commit above to elfcore.h.  There also seem to be
>> some other inconsistencies between the functions in elfcore.h and and elfcode.h
>> and perhaps the common functionality in these functions could be refactored
>> into a separate function to avoid the code duplication?
>>
>> Note that the issue isn't really FreeBSD specific, I just suspect that the FreeBSD
>> i386 vec happens to be sorted first in the list for some reason.
>>> Thanks,
>>> - Tom
>>>
>>> [gdb] Fix fbsd core matching
>>>
>>> ---
>>>    bfd/elfcore.h | 5 +++++
>>>    1 file changed, 5 insertions(+)
>>>
>>> diff --git a/bfd/elfcore.h b/bfd/elfcore.h
>>> index 809f6711aed..4ce81e2e383 100644
>>> --- a/bfd/elfcore.h
>>> +++ b/bfd/elfcore.h
>>> @@ -272,6 +272,11 @@ elf_core_file_p (bfd *abfd)
>>>          && ebd->elf_machine_code != EM_NONE)
>>>        goto fail;
>>> +  if (ebd->elf_machine_code != EM_NONE
>>> +      && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi
>>> +      && ebd->elf_osabi != ELFOSABI_NONE)
>>> +    goto fail;
>>> +
>>>      /* Let the backend double check the format and override global
>>>         information.  We do this before processing the program headers
>>>         to allow the correct machine (as opposed to just the default
>>
>>
>> -- 
>> John Baldwin
> 


More information about the Binutils mailing list