From: Alan Hayward <Alan.Hayward@arm.com>
To: Joel Brobecker <brobecker@adacore.com>
Cc: Yao Qi <qiyaoltc@gmail.com>,
"gdb-patches@sourceware.org" <gdb-patches@sourceware.org>,
nd <nd@arm.com>
Subject: Re: [PATCH PR gdb/22736] [aarch64] gdb crashes on a conditional breakpoint with cast return type
Date: Mon, 05 Mar 2018 15:57:00 -0000 [thread overview]
Message-ID: <18C9D0DE-F18B-4F88-91F3-826208369A64@arm.com> (raw)
In-Reply-To: <20180302151824.dg4y23pwjmm6nqjb@adacore.com>
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset="utf-8", Size: 2961 bytes --]
> On 2 Mar 2018, at 15:18, Joel Brobecker <brobecker@adacore.com> wrote:
>
>>>> The cast to (int) is causing this - remove the cast and it finds the type.
>>>> Iâm assuming thatâs causing it to drop the debug info.
>>>
>>> It sounds like a bug to me. If this bug "TYPE_TARGET_TYPE
>>> (func_type) becomes NULL caused by cast" is fixed, the GDB segfault
>>> will go away accordingly.
>>>
>>> To be clear, your patch here is fine to me. My suggestion is that
>>> we'd better dig it deeper.
>>
>> Agreed. Iâll raise a new bug, and have a look into it too whilst Iâm
>> in the area.
>
> Having read what Yao said, and looking at the example you gave,
> I'm now thinking that one could very well be the cause of the other;
> it seems like the cast might indeed be returning a value with
> a struct type that's missing the return type. Even a subprogram
> which returns nothing has a TYPE_TARGET_TYPE set to a TYPE_CODE_VOID,
> right?
Been debugging this a little more (and learnt quite a few things about gdb along the way!)
Not sure if this reply is the best place to discuss, or if it should go onto the bug.
Butâ¦.
On x86, for strcmp the type and it's target types, as received in amd64_push_dummy_call are:
TYPE_CODE_FUNC -> TYPE_CODE_INT -> 0x0
Whereas on aarch64 in aarch64_push_dummy_call we get:
TYPE_CODE_FUNC -> 0x0
It turns out this occurs because strcmp has IFUNC vs FUNC differences:
X86:
$ readelf -s /lib/x86_64-linux-gnu/libc-2.19.so | grep strcmp
2085: 0000000000087380 60 IFUNC GLOBAL DEFAULT 12 strcmp@@GLIBC_2.2.5
Aarch64:
$ readelf -s /lib/aarch64-linux-gnu/libc-2.23.so | grep strcmp
2043: 0000000000076380 164 FUNC GLOBAL DEFAULT 12 strcmp@@GLIBC_2.17
I decided to test this on X86 using a FUNCâ¦.
$ readelf -s /lib/x86_64-linux-gnu/libc-2.19.so | grep strlen
769: 0000000000088dd0 436 FUNC GLOBAL DEFAULT 12 strlen@@GLIBC_2.2.5
Changed my test to do:
(gdb) b foo if (int)strlen(name) == 3
...Now the type received by the target code is TYPE_CODE_FUNC -> 0, the same as aarch64.
However, x86 does not segfault. This is because amd64_push_dummy_call doesnât bother to
check the function parameter.
Looking into the code, when reading a FUNC, readlf.c : elf_symtab_read() hits:
if (sym->flags & BSF_GNU_INDIRECT_FUNCTION)
ms_type = mst_text_gnu_ifunc;
else
ms_type = mst_text;
Setting the type to mst_text, which eventually causes find_minsym_type_and_address() to
set the type to objfile_type (objfile)->nodebug_text_symbol
Whereas an IFUNC gets set to objfile_type (objfile)->nodebug_text_gnu_ifunc_symbol.
So, I think probably either:
* Everything is correct
* mst_text needs handling differently
* FUNCs need a new minimal symbol type (mst_text_gnu_func?)
(Iâm not familiar enough with this part of the code to give a definitive answer).
Alan.\x16º&Öéj×!zÊÞ¶êç×{÷Ib²Ö«r\x18\x1dnr\x17¬
next prev parent reply other threads:[~2018-03-05 15:57 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-03-01 17:03 Alan Hayward
2018-03-02 3:32 ` Joel Brobecker
2018-03-02 12:09 ` Alan Hayward
[not found] ` <CAH=s-PP-Xy7TrP-0zKCuA2X4A8Xgx_gHNvYewm41LPs7ZZJniA@mail.gmail.com>
2018-03-02 14:05 ` Alan Hayward
2018-03-02 15:18 ` Joel Brobecker
2018-03-05 15:57 ` Alan Hayward [this message]
2018-03-05 16:45 ` Pedro Alves
2018-03-07 11:10 ` Alan Hayward
2018-03-09 8:51 ` Joel Brobecker
2018-03-09 16:04 ` Pedro Alves
2018-03-09 16:44 ` Yao Qi
2018-03-09 19:11 ` Alan Hayward
2018-03-02 10:07 ` Yao Qi
2018-05-26 0:59 Weimin Pan
2018-05-27 3:42 ` Simon Marchi
2018-05-29 17:43 ` Wei-min Pan
2018-05-29 21:37 ` Simon Marchi
2018-05-30 0:29 ` Weimin Pan
2018-05-29 17:46 ` Pedro Alves
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=18C9D0DE-F18B-4F88-91F3-826208369A64@arm.com \
--to=alan.hayward@arm.com \
--cc=brobecker@adacore.com \
--cc=gdb-patches@sourceware.org \
--cc=nd@arm.com \
--cc=qiyaoltc@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox