Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 2 Oct 2014 11:11:54 +0200
From:      Kai Wang <kaiw27@gmail.com>
To:        Dimitry Andric <dim@freebsd.org>
Cc:        Justin Gibbs <gibbs@freebsd.org>, jkoshy@freebsd.org, freebsd-toolchain@freebsd.org
Subject:   Re: elftoolchain update?
Message-ID:  <CAMf2Fe7F-1D6=7xE6toj=H7r2-PEy9RnAZHwtST5s5Etn2-7GA@mail.gmail.com>
In-Reply-To: <D44FDBD9-F6AF-48B1-A467-9C51C685E750@FreeBSD.org>
References:  <CADBaqmgasfbP6r09yAsmrw-eVHqm3AWSuBdA5tHf5U5rj8j2HA@mail.gmail.com> <D44FDBD9-F6AF-48B1-A467-9C51C685E750@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
--001a11c1c7f6f3aeb405046d01fc
Content-Type: text/plain; charset=UTF-8

Hello,

Thanks for the backtrace and analysis.

I attached a patch for libdwarf and ctfconvert to fix the crash issue.
The libdwarf patch is the same as Will submitted, it adds check for NULL
attribute.
The ctfconvert patch fixes some issue with die_name(). We can't let
die_name()
return NULL because we need the empty string "" for type name comparison.
Instead I added checks for empty string when creating variables and
functions.

However, this patch only fixes the crash issue. ctfconvert will still fail
and
complains "unresolved types" when invoked on devd (or other C++ objects)
The problem is that ctfconvert doesn't understand any C++ DWARF types,
for example: class, namespace, templates etc. Then I checked the Dtrace
CTF format:

sys/cddl/contrib/opensolaris/uts/common/sys/ctf.h

It seems to me that CTF can only support ANSI C ? Did anyone ever use
Dtrace with C++ program and get debugging info?

/Kai

2014-09-18 20:46 GMT+02:00 Dimitry Andric <dim@freebsd.org>:

> On 18 Sep 2014, at 01:01, Will Andrews <will@freebsd.org> wrote:
> > I see there have been a lot of updates & fixes to elftoolchain since
> > the last import into FreeBSD/head nearly 8 months ago.  Are there any
> > plans to update the import?
> >
> > I'm asking because it appears that ctfconvert currently crashes
> > (specifically, due to a bug in dwarf_attrval_unsigned()), if you try
> > to use it on C++ object files.
> >
> > This is easily demonstrated by applying this patch to FreeBSD/head and
> > building sbin/devd with WITH_CTF=1:
> > http://people.freebsd.org/~will/add-ctfconvert-to-cpp-object-files.diff
> >
> > Justin Gibbs (cc'd) posted about this issue in February, and it's
> > still a problem:
> >
> http://lists.freebsd.org/pipermail/freebsd-toolchain/2014-February/001121.html
>
> In that previous thread, I was not able to reproduce any problems with
> ctfconvert or ctfmerge, but I have tried it again just now, and I think
> it is a problem in libdwarf.
>
> The crash goes like this:
>
> Program received signal SIGSEGV, Segmentation fault.
> [Switching to Thread 28803080 (LWP 100196)]
> 0x280bb75d in dwarf_attrval_unsigned (die=0x28941f10, attr=73,
> valp=0xbfbfdea0, err=0xbfbfe0a4) at
> /usr/src/lib/libdwarf/../../contrib/elftoolchain/libdwarf/dwarf_attrval.c:186
> 186             switch (at->at_form) {
> (gdb) bt
> #0  0x280bb75d in dwarf_attrval_unsigned (die=0x28941f10, attr=73,
> valp=0xbfbfdea0, err=0xbfbfe0a4) at
> /usr/src/lib/libdwarf/../../contrib/elftoolchain/libdwarf/dwarf_attrval.c:186
> #1  0x08052a45 in die_attr_ref (dw=0xbfbfe0a0, die=0x28941f10, name=73) at
> /usr/src/cddl/usr.bin/ctfconvert/../../../cddl/contrib/opensolaris/tools/ctf/cvt/dwarf.c:417
> #2  0x08052844 in die_lookup_pass1 (dw=0xbfbfe0a0, die=0x28941f10,
> name=73) at
> /usr/src/cddl/usr.bin/ctfconvert/../../../cddl/contrib/opensolaris/tools/ctf/cvt/dwarf.c:476
> #3  0x08052380 in die_variable_create (dw=0xbfbfe0a0, die=0x28941f10,
> off=83907, tdp=0x0) at
> /usr/src/cddl/usr.bin/ctfconvert/../../../cddl/contrib/opensolaris/tools/ctf/cvt/dwarf.c:1680
> #4  0x08050940 in die_create_one (dw=0xbfbfe0a0, die=0x28941f10) at
> /usr/src/cddl/usr.bin/ctfconvert/../../../cddl/contrib/opensolaris/tools/ctf/cvt/dwarf.c:1793
> #5  0x0804fa94 in die_create (dw=0xbfbfe0a0, die=0x28941f10) at
> /usr/src/cddl/usr.bin/ctfconvert/../../../cddl/contrib/opensolaris/tools/ctf/cvt/dwarf.c:1800
> #6  0x0804f368 in dw_read (td=0x2881c040, elf=0x28830040,
> filename=0xbfbfe83e "devd.o") at
> /usr/src/cddl/usr.bin/ctfconvert/../../../cddl/contrib/opensolaris/tools/ctf/cvt/dwarf.c:2003
> #7  0x0804eb6e in file_read (td=0x2881c040, filename=0xbfbfe83e "devd.o",
> ignore_non_c=0) at
> /usr/src/cddl/usr.bin/ctfconvert/../../../cddl/contrib/opensolaris/tools/ctf/cvt/ctfconvert.c:115
> #8  0x0804e7ca in main (argc=5, argv=0xbfbfe694) at
> /usr/src/cddl/usr.bin/ctfconvert/../../../cddl/contrib/opensolaris/tools/ctf/cvt/ctfconvert.c:236
> (gdb) print at
> $1 = (Dwarf_Attribute) 0x0
>
> Looking at dwarf_attrval_unsigned(), you can see 'at' being NULL-checked
> in line 163, but if the _dwarf_attr_find() call on line 164 then also
> returns NULL, the switch on line 186 will segfault as above:
>
>    140  int
>    141  dwarf_attrval_unsigned(Dwarf_Die die, Dwarf_Half attr,
> Dwarf_Unsigned *valp, Dwarf_Error *err)
>    142  {
>    143          Dwarf_Attribute at;
> ...
>    157          if ((at = _dwarf_attr_find(die, attr)) == NULL && attr !=
> DW_AT_type) {
>    158                  DWARF_SET_ERROR(dbg, err, DW_DLE_NO_ENTRY);
>    159                  return (DW_DLV_NO_ENTRY);
>    160          }
>    161
>    162          die1 = NULL;
>    163          if (at == NULL &&
>    164              (at = _dwarf_attr_find(die, DW_AT_abstract_origin)) !=
> NULL) {
> ...
>    184          }
>    185
>    186          switch (at->at_form) {
> ...
>
> I'm not sure what kind of error code should be returned when the second
> _dwarf_attr_find() fails, though.  Or if that is some sort of problem
> with a symbol?  If I go to frame 3 (die_variable_create), the name seems
> to be the empty string, but not a NULL pointer:
>
> (gdb) frame 3
> #3  0x08052380 in die_variable_create (dw=0xbfbfe0a0, die=0x28941f10,
> off=83907, tdp=0x0) at
> /usr/src/cddl/usr.bin/ctfconvert/../../../cddl/contrib/opensolaris/tools/ctf/cvt/dwarf.c:1680
> 1680            ii->ii_dtype = die_lookup_pass1(dw, die, DW_AT_type);
> (gdb) print name
> $2 = 0x2892dc90 ""
>
> The name is looked up on line 1674, where nameless objects are supposed
> to be skipped:
>
>   1666  static void
>   1667  die_variable_create(dwarf_t *dw, Dwarf_Die die, Dwarf_Off off,
> tdesc_t *tdp __unused)
>   1668  {
>   1669          iidesc_t *ii;
>   1670          char *name;
>   1671
>   1672          debug(3, "die %llu: creating object definition\n", off);
>   1673
>   1674          if (die_isdecl(dw, die) || (name = die_name(dw, die)) ==
> NULL)
>   1675                  return; /* skip prototypes and nameless objects */
>   1676
>   1677          ii = xcalloc(sizeof (iidesc_t));
>   1678          ii->ii_type = die_isglobal(dw, die) ? II_GVAR : II_SVAR;
>   1679          ii->ii_name = name;
>   1680          ii->ii_dtype = die_lookup_pass1(dw, die, DW_AT_type);
>
> However, die_name() does not ever seem to return NULL (the code to
> return the empty string was added by Kai in r261246):
>
>    425  static char *
>    426  die_name(dwarf_t *dw, Dwarf_Die die)
>    427  {
>    428          char *str = NULL;
>    429
>    430          (void) die_string(dw, die, DW_AT_name, &str, 0);
>    431          if (str == NULL)
>    432                  str = xstrdup("");
>    433
>    434          return (str);
>    435  }
>
> There are quite a lot of places in this file where the result of
> die_name() is explicitly checked against NULL, so maybe always returning
> an empty string was not such a good idea.  It may have been done to
> avoid another segfault.
>
> The way forward is probably to:
> * fix the situation in dwarf_attrval_unsigned(), returning a sensible
>   error value if both lookups fail.
> * make die_name() return a NULL pointer again, or explicitly check for
>   the empty string in die_variable_create().
>
> -Dimitry
>
>

--001a11c1c7f6f3aeb405046d01fc
Content-Type: text/plain; charset=US-ASCII; name="libdwarf_ctfconvert.txt"
Content-Disposition: attachment; filename="libdwarf_ctfconvert.txt"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_i0rvv6uy1

SW5kZXg6IGNkZGwvY29udHJpYi9vcGVuc29sYXJpcy90b29scy9jdGYvY3Z0L2R3YXJmLmMKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gY2RkbC9jb250cmliL29wZW5zb2xhcmlzL3Rvb2xzL2N0Zi9jdnQvZHdhcmYu
YwkocmV2aXNpb24gMjcyMzk0KQorKysgY2RkbC9jb250cmliL29wZW5zb2xhcmlzL3Rvb2xzL2N0
Zi9jdnQvZHdhcmYuYwkod29ya2luZyBjb3B5KQpAQCAtOTkwLDggKzk5MCw3IEBACiAJCSAqIGlu
Zm8gZm9yIGFub24gc3RydWN0cywgdGhvdWdoIHJlY2VudCB2ZXJzaW9ucyBhcmUgZml4ZWQgKGdj
YwogCQkgKiBidWcgMTE4MTYpLgogCQkgKi8KLQkJaWYgKChtbC0+bWxfbmFtZSA9IGRpZV9uYW1l
KGR3LCBtZW0pKSA9PSBOVUxMKQotCQkJbWwtPm1sX25hbWUgPSBOVUxMOworCQltbC0+bWxfbmFt
ZSA9IGRpZV9uYW1lKGR3LCBtZW0pOwogCiAJCW1sLT5tbF90eXBlID0gZGllX2xvb2t1cF9wYXNz
MShkdywgbWVtLCBEV19BVF90eXBlKTsKIAkJZGVidWcoMywgImRpZV9zb3VfY3JlYXRlKCk6IG1s
X3R5cGUgPSAlcCB0X2lkID0gJWRcbiIsCkBAIC0xMTMyLDcgKzExMzEsMTEgQEAKIAlmb3IgKG1s
ID0gdGRwLT50X21lbWJlcnM7IG1sICE9IE5VTEw7IG1sID0gbWwtPm1sX25leHQpIHsKIAkJaWYg
KG1sLT5tbF9zaXplID09IDApIHsKIAkJCW10ID0gdGRlc2NfYmFzZXR5cGUobWwtPm1sX3R5cGUp
OwotCisJCQlpZiAobXQgPT0gTlVMTCkgeworCQkJCS8qIFByb2JhYmx5IEMrKyB0eXBlcy4gKi8K
KwkJCQlkdy0+ZHdfbnVucmVzKys7CisJCQkJcmV0dXJuICgxKTsKKwkJCX0KIAkJCWlmICgobWwt
Pm1sX3NpemUgPSB0ZGVzY19iaXRzaXplKG10KSkgIT0gMCkKIAkJCQljb250aW51ZTsKIApAQCAt
MTU5NCwxMyArMTU5NywxNyBAQAogCQl9CiAJfQogCi0JaWYgKGRpZV9pc2RlY2woZHcsIGRpZSkg
fHwgKG5hbWUgPSBkaWVfbmFtZShkdywgZGllKSkgPT0gTlVMTCkgewotCQkvKgotCQkgKiBXZSBw
cm9jZXNzIG5laXRoZXIgcHJvdG90eXBlcyBub3Igc3VicHJvZ3JhbXMgd2l0aG91dAotCQkgKiBu
YW1lcy4KLQkJICovCisJLyoKKwkgKiBXZSBwcm9jZXNzIG5laXRoZXIgcHJvdG90eXBlcyBub3Ig
c3VicHJvZ3JhbXMgd2l0aG91dAorCSAqIG5hbWVzLgorCSAqLworCW5hbWUgPSBkaWVfbmFtZShk
dywgZGllKTsKKwlpZiAoKm5hbWUgPT0gJ1wwJykgeworCQlmcmVlKG5hbWUpOwogCQlyZXR1cm47
CiAJfQorCWlmIChkaWVfaXNkZWNsKGR3LCBkaWUpKQorCQlyZXR1cm47CiAKIAlpaSA9IHhjYWxs
b2Moc2l6ZW9mIChpaWRlc2NfdCkpOwogCWlpLT5paV90eXBlID0gZGllX2lzZ2xvYmFsKGR3LCBk
aWUpID8gSUlfR0ZVTiA6IElJX1NGVU47CkBAIC0xNjI2LDExICsxNjMzLDcgQEAKIAkJaWYgKGRp
ZV90YWcoZHcsIGFyZykgIT0gRFdfVEFHX2Zvcm1hbF9wYXJhbWV0ZXIpCiAJCQljb250aW51ZTsK
IAotCQlpZiAoKG5hbWUxID0gZGllX25hbWUoZHcsIGFyZykpID09IE5VTEwpIHsKLQkJCXRlcm1p
bmF0ZSgiZGllICVsbHU6IGZ1bmMgYXJnICVkIGhhcyBubyBuYW1lXG4iLAotCQkJICAgIG9mZiwg
aWktPmlpX25hcmdzICsgMSk7Ci0JCX0KLQorCQluYW1lMSA9IGRpZV9uYW1lKGR3LCBhcmcpOwog
CQlpZiAoc3RyY21wKG5hbWUxLCAiLi4uIikgPT0gMCkgewogCQkJZnJlZShuYW1lMSk7CiAJCQlp
aS0+aWlfdmFyZ3MgPSAxOwpAQCAtMTY3MSw4ICsxNjc0LDE0IEBACiAKIAlkZWJ1ZygzLCAiZGll
ICVsbHU6IGNyZWF0aW5nIG9iamVjdCBkZWZpbml0aW9uXG4iLCBvZmYpOwogCi0JaWYgKGRpZV9p
c2RlY2woZHcsIGRpZSkgfHwgKG5hbWUgPSBkaWVfbmFtZShkdywgZGllKSkgPT0gTlVMTCkKLQkJ
cmV0dXJuOyAvKiBza2lwIHByb3RvdHlwZXMgYW5kIG5hbWVsZXNzIG9iamVjdHMgKi8KKwkvKiBz
a2lwIHByb3RvdHlwZXMgYW5kIG5hbWVsZXNzIG9iamVjdHMgKi8KKwluYW1lID0gZGllX25hbWUo
ZHcsIGRpZSk7CisJaWYgKCpuYW1lID09ICdcMCcpIHsKKwkJZnJlZShuYW1lKTsKKwkJcmV0dXJu
OworCX0KKwlpZiAoZGllX2lzZGVjbChkdywgZGllKSkKKwkJcmV0dXJuOwogCiAJaWkgPSB4Y2Fs
bG9jKHNpemVvZiAoaWlkZXNjX3QpKTsKIAlpaS0+aWlfdHlwZSA9IGRpZV9pc2dsb2JhbChkdywg
ZGllKSA/IElJX0dWQVIgOiBJSV9TVkFSOwpAQCAtMTk5MSw3ICsyMDAwLDggQEAKIAkJZnJlZShw
cm9kKTsKIAl9CiAKLQlpZiAoKGR3LmR3X2N1bmFtZSA9IGRpZV9uYW1lKCZkdywgY3UpKSAhPSBO
VUxMKSB7CisJZHcuZHdfY3VuYW1lID0gZGllX25hbWUoJmR3LCBjdSk7CisJaWYgKCpkdy5kd19j
dW5hbWUgIT0gJ1wwJykgewogCQljaGFyICpiYXNlID0geHN0cmR1cChiYXNlbmFtZShkdy5kd19j
dW5hbWUpKTsKIAkJZnJlZShkdy5kd19jdW5hbWUpOwogCQlkdy5kd19jdW5hbWUgPSBiYXNlOwpJ
bmRleDogY29udHJpYi9lbGZ0b29sY2hhaW4vbGliZHdhcmYvZHdhcmZfYXR0cnZhbC5jCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIGNvbnRyaWIvZWxmdG9vbGNoYWluL2xpYmR3YXJmL2R3YXJmX2F0dHJ2YWwuYwko
cmV2aXNpb24gMjcyMzk0KQorKysgY29udHJpYi9lbGZ0b29sY2hhaW4vbGliZHdhcmYvZHdhcmZf
YXR0cnZhbC5jCSh3b3JraW5nIGNvcHkpCkBAIC0xNjAsOCArMTYwLDEyIEBACiAJfQogCiAJZGll
MSA9IE5VTEw7Ci0JaWYgKGF0ID09IE5VTEwgJiYKLQkgICAgKGF0ID0gX2R3YXJmX2F0dHJfZmlu
ZChkaWUsIERXX0FUX2Fic3RyYWN0X29yaWdpbikpICE9IE5VTEwpIHsKKwlpZiAoYXQgPT0gTlVM
TCkgeworCQlhdCA9IF9kd2FyZl9hdHRyX2ZpbmQoZGllLCBEV19BVF9hYnN0cmFjdF9vcmlnaW4p
OworCQlpZiAoYXQgPT0gTlVMTCkgeworCQkJRFdBUkZfU0VUX0VSUk9SKGRiZywgZXJyLCBEV19E
TEVfTk9fRU5UUlkpOworCQkJcmV0dXJuIChEV19ETFZfTk9fRU5UUlkpOworCQl9CiAJCXN3aXRj
aCAoYXQtPmF0X2Zvcm0pIHsKIAkJY2FzZSBEV19GT1JNX3JlZjE6CiAJCWNhc2UgRFdfRk9STV9y
ZWYyOgo=
--001a11c1c7f6f3aeb405046d01fc--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAMf2Fe7F-1D6=7xE6toj=H7r2-PEy9RnAZHwtST5s5Etn2-7GA>