From 9dc9bf85f53c6712dd047df5fd718e9895946fd5 Mon Sep 17 00:00:00 2001 From: Khem Raj Date: Tue, 20 Apr 2021 11:28:37 -0700 Subject: binutils: Fix linking failures when using dwarf-5 Since GCC 11 will switch to dwarf-5 as default, this patch will be required soon Signed-off-by: Khem Raj Signed-off-by: Richard Purdie --- meta/recipes-devtools/binutils/binutils-2.36.inc | 1 + ...-for-the-DW_FORM_strx-forms-to-the-BFD-li.patch | 183 +++++++++++++++++++++ 2 files changed, 184 insertions(+) create mode 100644 meta/recipes-devtools/binutils/binutils/0017-Add-support-for-the-DW_FORM_strx-forms-to-the-BFD-li.patch diff --git a/meta/recipes-devtools/binutils/binutils-2.36.inc b/meta/recipes-devtools/binutils/binutils-2.36.inc index d2ededb728..beddf601fd 100644 --- a/meta/recipes-devtools/binutils/binutils-2.36.inc +++ b/meta/recipes-devtools/binutils/binutils-2.36.inc @@ -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 index 0000000000..b4880e0d14 --- /dev/null +++ b/meta/recipes-devtools/binutils/binutils/0017-Add-support-for-the-DW_FORM_strx-forms-to-the-BFD-li.patch @@ -0,0 +1,183 @@ +From a50c11a7a47b26e6a3e095dfb72aa2e465919fb6 Mon Sep 17 00:00:00 2001 +From: Nick Clifton +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 +--- + 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 ""; + } + + /* 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); -- cgit 1.2.3-korg