From owner-freebsd-toolchain@FreeBSD.ORG Thu Oct 2 09:11:55 2014 Return-Path: Delivered-To: freebsd-toolchain@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id A3B59196; Thu, 2 Oct 2014 09:11:55 +0000 (UTC) Received: from mail-yh0-x230.google.com (mail-yh0-x230.google.com [IPv6:2607:f8b0:4002:c01::230]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority G2" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 26D7214C; Thu, 2 Oct 2014 09:11:55 +0000 (UTC) Received: by mail-yh0-f48.google.com with SMTP id v1so548597yhn.7 for ; Thu, 02 Oct 2014 02:11:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=Cy++0p8RjpW05cvB1X1BTIs5XPUXlyfBlLnWUaNa6HQ=; b=tGGCYCXmXGORpYLrI3t1cuxIwFyZirWu7+3oo/vVAd8ArrQbRH+YYDaRmTHOeaixVQ WDGfGImPJrpT68Yz2qFd/i/f8Yuh8fbGkeom+0/gLM4HIHMlRglkPmRglbqRqasgtCF/ xprdQaOFoRgEpqPleWX0uKr4/jt+nFnonyviBWWqHNr9b7fg70P81jXxv5pwRQh3Nr3N u3v5GzO6zKmhhtcGap2vo6bahzamP5o3Zyu4P8I9et49/BhydldKNwkuDESTMvqVe81S b+GQT/2ctJXO6xxjOFVGBLjkJGXJP+ltoEqeavZFltpJgvgnTdwMbbeg8/8/4rWGNxQv xIiw== MIME-Version: 1.0 X-Received: by 10.236.208.2 with SMTP id p2mr71034yho.173.1412241114220; Thu, 02 Oct 2014 02:11:54 -0700 (PDT) Received: by 10.170.110.196 with HTTP; Thu, 2 Oct 2014 02:11:54 -0700 (PDT) In-Reply-To: References: Date: Thu, 2 Oct 2014 11:11:54 +0200 Message-ID: Subject: Re: elftoolchain update? From: Kai Wang To: Dimitry Andric Content-Type: multipart/mixed; boundary=001a11c1c7f6f3aeb405046d01fc X-Content-Filtered-By: Mailman/MimeDel 2.1.18-1 Cc: Justin Gibbs , jkoshy@freebsd.org, freebsd-toolchain@freebsd.org X-BeenThere: freebsd-toolchain@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: Maintenance of FreeBSD's integrated toolchain List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 02 Oct 2014 09:11:55 -0000 --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 : > On 18 Sep 2014, at 01:01, Will Andrews 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--