svn commit: r260879 - projects/elftoolchain/contrib/elftoolchain/libdwarf

Kai Wang kaiw at FreeBSD.org
Sun Jan 19 13:42:49 UTC 2014


Author: kaiw
Date: Sun Jan 19 13:42:49 2014
New Revision: 260879
URL: http://svnweb.freebsd.org/changeset/base/260879

Log:
  * Allow API dwarf_loclist_n() and dwarf_loclist() to be called with
    attributes that have form DW_FORM_sec_offset.
  * If the .debug_info section conforms to DWARF4, do not allow the value
    of attributes with form DW_FORM_data[48] to be used as section
    offset.

Modified:
  projects/elftoolchain/contrib/elftoolchain/libdwarf/dwarf_loclist.c

Modified: projects/elftoolchain/contrib/elftoolchain/libdwarf/dwarf_loclist.c
==============================================================================
--- projects/elftoolchain/contrib/elftoolchain/libdwarf/dwarf_loclist.c	Sun Jan 19 13:38:40 2014	(r260878)
+++ projects/elftoolchain/contrib/elftoolchain/libdwarf/dwarf_loclist.c	Sun Jan 19 13:42:49 2014	(r260879)
@@ -56,8 +56,20 @@ dwarf_loclist_n(Dwarf_Attribute at, Dwar
 		switch (at->at_form) {
 		case DW_FORM_data4:
 		case DW_FORM_data8:
-			ret = _dwarf_loclist_find(at->at_die->die_dbg,
-			    at->at_die->die_cu, at->u[0].u64, &ll, error);
+			/*
+			 * DW_FORM_data[48] can not be used as section offset
+			 * since DWARF4. For DWARF[23], the application needs
+			 * to determine if DW_FORM_data[48] is representing
+			 * a constant or a section offset.
+			 */
+			if (at->at_die->die_cu->cu_version >= 4) {
+				DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY);
+				return (DW_DLV_NO_ENTRY);
+			}
+			/* FALLTHROUGH */
+		case DW_FORM_sec_offset:
+			ret = _dwarf_loclist_find(dbg, at->at_die->die_cu,
+			    at->u[0].u64, &ll, error);
 			if (ret == DW_DLE_NO_ENTRY) {
 				DWARF_SET_ERROR(dbg, error, ret);
 				return (DW_DLV_NO_ENTRY);
@@ -119,6 +131,19 @@ dwarf_loclist(Dwarf_Attribute at, Dwarf_
 		switch (at->at_form) {
 		case DW_FORM_data4:
 		case DW_FORM_data8:
+			/*
+			 * DW_FORM_data[48] can not be used as section offset
+			 * since DWARF4. For DWARF[23], the application needs
+			 * to determine if DW_FORM_data[48] is representing
+			 * a constant or a section offset.
+			 */
+			if (at->at_die->die_cu->cu_version >= 4) {
+				printf("called cu_version >= 4\n");
+				DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY);
+				return (DW_DLV_NO_ENTRY);
+			}
+			/* FALLTHROUGH */
+		case DW_FORM_sec_offset:
 			ret = _dwarf_loclist_find(at->at_die->die_dbg,
 			    at->at_die->die_cu, at->u[0].u64, &ll, error);
 			if (ret == DW_DLE_NO_ENTRY) {


More information about the svn-src-projects mailing list