]> code.ossystems Code Review - openembedded-core.git/commitdiff
binutils: Fix linking failures when using dwarf-5
authorKhem Raj <raj.khem@gmail.com>
Tue, 20 Apr 2021 18:28:37 +0000 (11:28 -0700)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Fri, 23 Apr 2021 09:10:43 +0000 (10:10 +0100)
Since GCC 11 will switch to dwarf-5 as default, this patch will be
required soon

Signed-off-by: Khem Raj <raj.khem@gmail.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
meta/recipes-devtools/binutils/binutils-2.36.inc
meta/recipes-devtools/binutils/binutils/0017-Add-support-for-the-DW_FORM_strx-forms-to-the-BFD-li.patch [new file with mode: 0644]

index d2ededb728ad9a0111cebfe1519c77cdf9d427f6..beddf601fddaaf90d716238f4455dc583d2a1652 100644 (file)
@@ -35,5 +35,6 @@ SRC_URI = "\
      file://0014-Fix-rpath-in-libtool-when-sysroot-is-enabled.patch \
      file://0015-sync-with-OE-libtool-changes.patch \
      file://0016-Check-for-clang-before-checking-gcc-version.patch \
+     file://0017-Add-support-for-the-DW_FORM_strx-forms-to-the-BFD-li.patch \
 "
 S  = "${WORKDIR}/git"
diff --git a/meta/recipes-devtools/binutils/binutils/0017-Add-support-for-the-DW_FORM_strx-forms-to-the-BFD-li.patch b/meta/recipes-devtools/binutils/binutils/0017-Add-support-for-the-DW_FORM_strx-forms-to-the-BFD-li.patch
new file mode 100644 (file)
index 0000000..b4880e0
--- /dev/null
@@ -0,0 +1,183 @@
+From a50c11a7a47b26e6a3e095dfb72aa2e465919fb6 Mon Sep 17 00:00:00 2001
+From: Nick Clifton <nickc@redhat.com>
+Date: Fri, 5 Mar 2021 17:06:59 +0000
+Subject: [PATCH] Add support for the DW_FORM_strx* forms to the BFD library.
+
+       PR 27521
+       * dwarf2.c (is_str_attr): Add DW_FORM_strx* forms.
+       (read_indexed_string): Placeholder function.
+       (read_attribute_value): Handle DW_FORM_strx* and DW_FORM_addrx*
+       forms.
+
+Upstream-Status: Backport [https://sourceware.org/bugzilla/show_bug.cgi?id=27521]
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ bfd/dwarf2.c | 105 ++++++++++++++++++++++++++++++++-------------------
+ 1 file changed, 67 insertions(+), 38 deletions(-)
+
+diff --git a/bfd/dwarf2.c b/bfd/dwarf2.c
+index 5651696c0f7..5ffcd93f54c 100644
+--- a/bfd/dwarf2.c
++++ b/bfd/dwarf2.c
+@@ -1160,8 +1160,23 @@ read_abbrevs (bfd *abfd, bfd_uint64_t offset, struct dwarf2_debug *stash,
+ static inline bfd_boolean
+ is_str_attr (enum dwarf_form form)
+ {
+-  return (form == DW_FORM_string || form == DW_FORM_strp
+-        || form == DW_FORM_line_strp || form == DW_FORM_GNU_strp_alt);
++  return (form == DW_FORM_string
++        || form == DW_FORM_strp
++        || form == DW_FORM_strx
++        || form == DW_FORM_strx1
++        || form == DW_FORM_strx2
++        || form == DW_FORM_strx3
++        || form == DW_FORM_strx4
++        || form == DW_FORM_line_strp
++        || form == DW_FORM_GNU_strp_alt);
++}
++
++static const char *
++read_indexed_string (bfd_uint64_t index ATTRIBUTE_UNUSED,
++                   struct comp_unit * unit ATTRIBUTE_UNUSED)
++{
++  /* FIXME: Add support for indexed strings.  */
++  return "<indexed strings not yet supported>";
+ }
+ /* Read and fill in the value of attribute ATTR as described by FORM.
+@@ -1192,6 +1207,9 @@ read_attribute_value (struct attribute *  attr,
+   switch (form)
+     {
++    case DW_FORM_flag_present:
++      attr->u.val = 1;
++      break;
+     case DW_FORM_ref_addr:
+       /* DW_FORM_ref_addr is an address in DWARF2, and an offset in
+        DWARF3.  */
+@@ -1237,15 +1255,32 @@ read_attribute_value (struct attribute *  attr,
+       info_ptr = read_n_bytes (info_ptr, info_ptr_end, blk);
+       attr->u.blk = blk;
+       break;
++    case DW_FORM_ref1:
++    case DW_FORM_flag:
++    case DW_FORM_data1:
++    case DW_FORM_addrx1:
++      attr->u.val = read_1_byte (abfd, info_ptr, info_ptr_end);
++      info_ptr += 1;
++      break;
+     case DW_FORM_data2:
++    case DW_FORM_ref2:
+       attr->u.val = read_2_bytes (abfd, info_ptr, info_ptr_end);
+       info_ptr += 2;
+       break;
++    case DW_FORM_addrx3:
++      attr->u.val = read_4_bytes (abfd, info_ptr, info_ptr_end);
++      attr->u.val &= 0xffffff;
++      info_ptr += 3;
++      break;
++    case DW_FORM_ref4:
+     case DW_FORM_data4:
++    case DW_FORM_addrx4:
+       attr->u.val = read_4_bytes (abfd, info_ptr, info_ptr_end);
+       info_ptr += 4;
+       break;
+     case DW_FORM_data8:
++    case DW_FORM_ref8:
++    case DW_FORM_ref_sig8:
+       attr->u.val = read_8_bytes (abfd, info_ptr, info_ptr_end);
+       info_ptr += 8;
+       break;
+@@ -1265,6 +1300,33 @@ read_attribute_value (struct attribute *  attr,
+       attr->u.str = read_alt_indirect_string (unit, info_ptr, info_ptr_end, &bytes_read);
+       info_ptr += bytes_read;
+       break;
++    case DW_FORM_strx1:
++      attr->u.val = read_1_byte (abfd, info_ptr, info_ptr_end);
++      info_ptr += 1;
++      attr->u.str = (char *) read_indexed_string (attr->u.val, unit);
++      break;
++    case DW_FORM_strx2:
++      attr->u.val = read_2_bytes (abfd, info_ptr, info_ptr_end);
++      info_ptr += 2;
++      attr->u.str = (char *) read_indexed_string (attr->u.val, unit);
++      break;
++    case DW_FORM_strx3:
++      attr->u.val = read_4_bytes (abfd, info_ptr, info_ptr_end);
++      info_ptr += 3;
++      attr->u.val &= 0xffffff;
++      attr->u.str = (char *) read_indexed_string (attr->u.val, unit);
++      break;
++    case DW_FORM_strx4:
++      attr->u.val = read_4_bytes (abfd, info_ptr, info_ptr_end);
++      info_ptr += 4;
++      attr->u.str = (char *) read_indexed_string (attr->u.val, unit);
++      break;
++    case DW_FORM_strx:
++      attr->u.val = _bfd_safe_read_leb128 (abfd, info_ptr, &bytes_read,
++                                       FALSE, info_ptr_end);
++      info_ptr += bytes_read;
++      attr->u.str = (char *) read_indexed_string (attr->u.val, unit);
++      break;
+     case DW_FORM_exprloc:
+     case DW_FORM_block:
+       amt = sizeof (struct dwarf_block);
+@@ -1287,48 +1349,14 @@ read_attribute_value (struct attribute *  attr,
+       info_ptr = read_n_bytes (info_ptr, info_ptr_end, blk);
+       attr->u.blk = blk;
+       break;
+-    case DW_FORM_data1:
+-      attr->u.val = read_1_byte (abfd, info_ptr, info_ptr_end);
+-      info_ptr += 1;
+-      break;
+-    case DW_FORM_flag:
+-      attr->u.val = read_1_byte (abfd, info_ptr, info_ptr_end);
+-      info_ptr += 1;
+-      break;
+-    case DW_FORM_flag_present:
+-      attr->u.val = 1;
+-      break;
+     case DW_FORM_sdata:
+       attr->u.sval = _bfd_safe_read_leb128 (abfd, info_ptr, &bytes_read,
+                                           TRUE, info_ptr_end);
+       info_ptr += bytes_read;
+       break;
+-    case DW_FORM_udata:
+-      attr->u.val = _bfd_safe_read_leb128 (abfd, info_ptr, &bytes_read,
+-                                         FALSE, info_ptr_end);
+-      info_ptr += bytes_read;
+-      break;
+-    case DW_FORM_ref1:
+-      attr->u.val = read_1_byte (abfd, info_ptr, info_ptr_end);
+-      info_ptr += 1;
+-      break;
+-    case DW_FORM_ref2:
+-      attr->u.val = read_2_bytes (abfd, info_ptr, info_ptr_end);
+-      info_ptr += 2;
+-      break;
+-    case DW_FORM_ref4:
+-      attr->u.val = read_4_bytes (abfd, info_ptr, info_ptr_end);
+-      info_ptr += 4;
+-      break;
+-    case DW_FORM_ref8:
+-      attr->u.val = read_8_bytes (abfd, info_ptr, info_ptr_end);
+-      info_ptr += 8;
+-      break;
+-    case DW_FORM_ref_sig8:
+-      attr->u.val = read_8_bytes (abfd, info_ptr, info_ptr_end);
+-      info_ptr += 8;
+-      break;
+     case DW_FORM_ref_udata:
++    case DW_FORM_udata:
++    case DW_FORM_addrx:
+       attr->u.val = _bfd_safe_read_leb128 (abfd, info_ptr, &bytes_read,
+                                          FALSE, info_ptr_end);
+       info_ptr += bytes_read;
+@@ -1361,6 +1389,7 @@ read_attribute_value (struct attribute *  attr,
+       info_ptr = read_n_bytes (info_ptr, info_ptr_end, blk);
+       attr->u.blk = blk;
+       break;
++
+     default:
+       _bfd_error_handler (_("DWARF error: invalid or unhandled FORM value: %#x"),
+                         form);