From eb8dc40360f0cfef56fb6947cc817a547d6d9bc6 Mon Sep 17 00:00:00 2001 From: Dave Cobbley Date: Tue, 14 Aug 2018 10:05:37 -0700 Subject: [Subtree] Removing import-layers directory As part of the move to subtrees, need to bring all the import layers content to the top level. Change-Id: I4a163d10898cbc6e11c27f776f60e1a470049d8f Signed-off-by: Dave Cobbley Signed-off-by: Brad Bishop --- .../recipes-devtools/elfutils/elfutils_0.170.bb | 70 ++ ...-packed-structs-follow-the-gcc-memory-lay.patch | 34 + .../files/0001-Use-fallthrough-attribute.patch | 791 +++++++++++++++ .../elfutils/files/0001-dso-link-change.patch | 52 + ...0001-libasm-may-link-with-libbz2-if-found.patch | 39 + ...-elf_cvt_gunhash-if-dest-and-src-are-same.patch | 42 + .../elfutils/files/0003-fixheadercheck.patch | 40 + .../0004-Disable-the-test-to-convert-euc-jp.patch | 44 + .../files/0005-fix-a-stack-usage-warning.patch | 35 + .../files/0006-Fix-build-on-aarch64-musl.patch | 61 ++ ...-path-where-we-have-str-as-uninitialized-.patch | 45 + ...de-alternatives-for-glibc-assumptions-hel.patch | 1029 ++++++++++++++++++++ ...ferences-between-mips-machine-identifiers.patch | 35 + ...-support-for-mips64-abis-in-mips_retval.c.patch | 171 ++++ .../0003-Add-mips-n64-relocation-format-hack.patch | 229 +++++ .../elfutils/files/debian/arm_backend.diff | 603 ++++++++++++ .../elfutils/files/debian/hppa_backend.diff | 802 +++++++++++++++ .../elfutils/files/debian/mips_backend.patch | 715 ++++++++++++++ .../elfutils/files/debian/mips_readelf_w.patch | 25 + 19 files changed, 4862 insertions(+) create mode 100644 poky/meta/recipes-devtools/elfutils/elfutils_0.170.bb create mode 100644 poky/meta/recipes-devtools/elfutils/files/0001-Ensure-that-packed-structs-follow-the-gcc-memory-lay.patch create mode 100644 poky/meta/recipes-devtools/elfutils/files/0001-Use-fallthrough-attribute.patch create mode 100644 poky/meta/recipes-devtools/elfutils/files/0001-dso-link-change.patch create mode 100644 poky/meta/recipes-devtools/elfutils/files/0001-libasm-may-link-with-libbz2-if-found.patch create mode 100644 poky/meta/recipes-devtools/elfutils/files/0002-Fix-elf_cvt_gunhash-if-dest-and-src-are-same.patch create mode 100644 poky/meta/recipes-devtools/elfutils/files/0003-fixheadercheck.patch create mode 100644 poky/meta/recipes-devtools/elfutils/files/0004-Disable-the-test-to-convert-euc-jp.patch create mode 100644 poky/meta/recipes-devtools/elfutils/files/0005-fix-a-stack-usage-warning.patch create mode 100644 poky/meta/recipes-devtools/elfutils/files/0006-Fix-build-on-aarch64-musl.patch create mode 100644 poky/meta/recipes-devtools/elfutils/files/0007-Fix-control-path-where-we-have-str-as-uninitialized-.patch create mode 100644 poky/meta/recipes-devtools/elfutils/files/0008-build-Provide-alternatives-for-glibc-assumptions-hel.patch create mode 100644 poky/meta/recipes-devtools/elfutils/files/debian/0001-Ignore-differences-between-mips-machine-identifiers.patch create mode 100644 poky/meta/recipes-devtools/elfutils/files/debian/0002-Add-support-for-mips64-abis-in-mips_retval.c.patch create mode 100644 poky/meta/recipes-devtools/elfutils/files/debian/0003-Add-mips-n64-relocation-format-hack.patch create mode 100644 poky/meta/recipes-devtools/elfutils/files/debian/arm_backend.diff create mode 100644 poky/meta/recipes-devtools/elfutils/files/debian/hppa_backend.diff create mode 100644 poky/meta/recipes-devtools/elfutils/files/debian/mips_backend.patch create mode 100644 poky/meta/recipes-devtools/elfutils/files/debian/mips_readelf_w.patch (limited to 'poky/meta/recipes-devtools/elfutils') diff --git a/poky/meta/recipes-devtools/elfutils/elfutils_0.170.bb b/poky/meta/recipes-devtools/elfutils/elfutils_0.170.bb new file mode 100644 index 000000000..14ac22ee6 --- /dev/null +++ b/poky/meta/recipes-devtools/elfutils/elfutils_0.170.bb @@ -0,0 +1,70 @@ +SUMMARY = "Utilities and libraries for handling compiled object files" +HOMEPAGE = "https://sourceware.org/elfutils" +SECTION = "base" +LICENSE = "(GPLv3 & Elfutils-Exception)" +LIC_FILES_CHKSUM = "file://COPYING;md5=d32239bcb673463ab874e80d47fae504" +DEPENDS = "libtool bzip2 zlib virtual/libintl" +DEPENDS_append_libc-musl = " argp-standalone fts " +# The Debian patches below are from: +# http://ftp.de.debian.org/debian/pool/main/e/elfutils/elfutils_0.168-0.2.debian.tar.xz +SRC_URI = "https://sourceware.org/elfutils/ftp/${PV}/${BP}.tar.bz2 \ + file://0001-dso-link-change.patch \ + file://0002-Fix-elf_cvt_gunhash-if-dest-and-src-are-same.patch \ + file://0003-fixheadercheck.patch \ + file://0004-Disable-the-test-to-convert-euc-jp.patch \ + file://0005-fix-a-stack-usage-warning.patch \ + file://0006-Fix-build-on-aarch64-musl.patch \ + file://0007-Fix-control-path-where-we-have-str-as-uninitialized-.patch \ + file://0001-libasm-may-link-with-libbz2-if-found.patch \ + file://debian/hppa_backend.diff \ + file://debian/arm_backend.diff \ + file://debian/mips_backend.patch \ + file://debian/mips_readelf_w.patch \ + file://debian/0001-Ignore-differences-between-mips-machine-identifiers.patch \ + file://debian/0002-Add-support-for-mips64-abis-in-mips_retval.c.patch \ + file://debian/0003-Add-mips-n64-relocation-format-hack.patch \ + file://0001-Use-fallthrough-attribute.patch \ + file://0001-Ensure-that-packed-structs-follow-the-gcc-memory-lay.patch \ + " +SRC_URI_append_libc-musl = " file://0008-build-Provide-alternatives-for-glibc-assumptions-hel.patch" +SRC_URI[md5sum] = "03599aee98c9b726c7a732a2dd0245d5" +SRC_URI[sha256sum] = "1f844775576b79bdc9f9c717a50058d08620323c1e935458223a12f249c9e066" + +inherit autotools gettext + +EXTRA_OECONF = "--program-prefix=eu- --without-lzma" +EXTRA_OECONF_append_class-native = " --without-bzlib" + +do_install_append() { + if [ "${TARGET_ARCH}" != "x86_64" ] && [ -z `echo "${TARGET_ARCH}"|grep 'i.86'` ];then + rm -f ${D}${bindir}/eu-objdump + fi +} + +EXTRA_OEMAKE_class-native = "" +EXTRA_OEMAKE_class-nativesdk = "" + +ALLOW_EMPTY_${PN}_libc-musl = "1" + +BBCLASSEXTEND = "native nativesdk" + +# Package utilities separately +PACKAGES =+ "${PN}-binutils libelf libasm libdw" +FILES_${PN}-binutils = "\ + ${bindir}/eu-addr2line \ + ${bindir}/eu-ld \ + ${bindir}/eu-nm \ + ${bindir}/eu-readelf \ + ${bindir}/eu-size \ + ${bindir}/eu-strip" + +FILES_libelf = "${libdir}/libelf-${PV}.so ${libdir}/libelf.so.*" +FILES_libasm = "${libdir}/libasm-${PV}.so ${libdir}/libasm.so.*" +FILES_libdw = "${libdir}/libdw-${PV}.so ${libdir}/libdw.so.* ${libdir}/elfutils/lib*" +# Some packages have the version preceeding the .so instead properly +# versioned .so., so we need to reorder and repackage. +#FILES_${PN} += "${libdir}/*-${PV}.so ${base_libdir}/*-${PV}.so" +#FILES_SOLIBSDEV = "${libdir}/libasm.so ${libdir}/libdw.so ${libdir}/libelf.so" + +# The package contains symlinks that trip up insane +INSANE_SKIP_${MLPREFIX}libdw = "dev-so" diff --git a/poky/meta/recipes-devtools/elfutils/files/0001-Ensure-that-packed-structs-follow-the-gcc-memory-lay.patch b/poky/meta/recipes-devtools/elfutils/files/0001-Ensure-that-packed-structs-follow-the-gcc-memory-lay.patch new file mode 100644 index 000000000..cf4d1dfe7 --- /dev/null +++ b/poky/meta/recipes-devtools/elfutils/files/0001-Ensure-that-packed-structs-follow-the-gcc-memory-lay.patch @@ -0,0 +1,34 @@ +From 732913a8c35c7b25c0cbf6903cab1ad6b602b525 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Thu, 22 Mar 2018 22:44:03 -0700 +Subject: [PATCH] Ensure that packed structs follow the gcc memory layout + +Partial backport of +https://sourceware.org/git/?p=elfutils.git;a=commit;h=17d7194d291bf91d130b78e06cbe27b290e0376d + +Helps fixing alignment errors e.g. +linux-core-note.c:116:1: error: alignment 2 of 'struct m68k_prstatus +' is less than 4 [-Werror=packed-not-aligned] + ; + ^ + +Upstream-Status: Backport [https://sourceware.org/git/?p=elfutils.git;a=commit;h=17d7194d291bf91d130b78e06cbe27b290e0376d] + +Signed-off-by: Khem Raj +--- + backends/linux-core-note.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/backends/linux-core-note.c b/backends/linux-core-note.c +index 5f06c896..9faae4c3 100644 +--- a/backends/linux-core-note.c ++++ b/backends/linux-core-note.c +@@ -111,7 +111,7 @@ struct EBLHOOK(prstatus) + FIELD (INT, pr_fpvalid); + } + #ifdef ALIGN_PRSTATUS +- __attribute__ ((packed, aligned (ALIGN_PRSTATUS))) ++ attribute_packed __attribute__ ((aligned (ALIGN_PRSTATUS))) + #endif + ; + diff --git a/poky/meta/recipes-devtools/elfutils/files/0001-Use-fallthrough-attribute.patch b/poky/meta/recipes-devtools/elfutils/files/0001-Use-fallthrough-attribute.patch new file mode 100644 index 000000000..5e2155b3c --- /dev/null +++ b/poky/meta/recipes-devtools/elfutils/files/0001-Use-fallthrough-attribute.patch @@ -0,0 +1,791 @@ +From 5cb883f67d00a63531ef195c242763d36b1905ca Mon Sep 17 00:00:00 2001 +From: Joshua Watt +Date: Fri, 9 Feb 2018 12:46:38 -0600 +Subject: [PATCH] Use fallthrough attribute + +Use __attribute__ ((fallthrough)) to indicate switch case fall through +instead of a comment. This ensure that the fallthrough warning is not +triggered even if the file is pre-processed (hence stripping the +comments) before it is compiled. + +The actual fallback implementation is hidden behind a FALLBACK macro in +case the compiler doesn't support it. + +Finally, the -Wimplict-fallthrough warning was upgraded to only allow +the attribute to satisfy it; a comment alone is no longer sufficient. + +Signed-off-by: Joshua Watt + +Upstream-Status: Submitted [1] + +[1] https://sourceware.org/ml/elfutils-devel/2018-q1/msg00027.html +--- + backends/aarch64_retval.c | 2 +- + backends/alpha_retval.c | 4 ++-- + backends/arm_regs.c | 2 +- + backends/arm_retval.c | 2 +- + backends/i386_regs.c | 2 +- + backends/i386_retval.c | 4 ++-- + backends/ia64_retval.c | 2 +- + backends/linux-core-note.c | 2 +- + backends/m68k_retval.c | 4 ++-- + backends/mips_retval.c | 4 ++-- + backends/parisc_retval.c | 5 +++-- + backends/ppc64_retval.c | 6 +++--- + backends/ppc_regs.c | 2 +- + backends/ppc_retval.c | 4 ++-- + backends/s390_retval.c | 4 ++-- + backends/sh_retval.c | 2 +- + backends/sparc_retval.c | 2 +- + backends/tilegx_retval.c | 4 ++-- + backends/x86_64_regs.c | 2 +- + backends/x86_64_retval.c | 2 +- + config/eu.am | 4 +++- + configure.ac | 6 ++++++ + lib/eu-config.h | 7 +++++++ + libcpu/i386_disasm.c | 2 +- + libcpu/i386_parse.c | 4 ++-- + libdw/cfi.c | 4 ++-- + libdw/dwarf_frame_register.c | 2 +- + libdwfl/dwfl_report_elf.c | 2 +- + libdwfl/frame_unwind.c | 2 +- + libebl/eblobjnote.c | 2 +- + libelf/elf32_updatenull.c | 2 +- + libelf/elf_begin.c | 4 ++-- + libelf/elf_cntl.c | 2 +- + src/addr2line.c | 2 +- + src/elfcompress.c | 2 +- + src/elflint.c | 8 ++++---- + src/objdump.c | 2 +- + src/readelf.c | 8 ++++---- + src/strings.c | 2 +- + tests/backtrace.c | 2 +- + tests/elfstrmerge.c | 3 ++- + 41 files changed, 75 insertions(+), 58 deletions(-) + +diff --git a/backends/aarch64_retval.c b/backends/aarch64_retval.c +index 68de307..1308340 100644 +--- a/backends/aarch64_retval.c ++++ b/backends/aarch64_retval.c +@@ -292,7 +292,7 @@ aarch64_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp) + assert (count > 0); + if (count <= 4) + return pass_hfa (locp, base_size, count); +- /* Fall through. */ ++ FALLTHROUGH; + + case 1: + /* Not a HFA. */ +diff --git a/backends/alpha_retval.c b/backends/alpha_retval.c +index 53dbfa4..d9bae3b 100644 +--- a/backends/alpha_retval.c ++++ b/backends/alpha_retval.c +@@ -85,7 +85,7 @@ alpha_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp) + typedie = dwarf_formref_die (attr, &die_mem); + tag = DWARF_TAG_OR_RETURN (typedie); + } +- /* Fall through. */ ++ FALLTHROUGH; + + case DW_TAG_base_type: + case DW_TAG_enumeration_type: +@@ -131,7 +131,7 @@ alpha_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp) + } + } + +- /* Else fall through. */ ++ FALLTHROUGH; + + case DW_TAG_structure_type: + case DW_TAG_class_type: +diff --git a/backends/arm_regs.c b/backends/arm_regs.c +index 4ee1039..418c931 100644 +--- a/backends/arm_regs.c ++++ b/backends/arm_regs.c +@@ -81,7 +81,7 @@ arm_register_info (Ebl *ebl __attribute__ ((unused)), + * but gcc maps FPA registers here + */ + regno += 96 - 16; +- /* Fall through. */ ++ FALLTHROUGH; + case 96 + 0 ... 96 + 7: + *setname = "FPA"; + *type = DW_ATE_float; +diff --git a/backends/arm_retval.c b/backends/arm_retval.c +index 8687eab..313e4eb 100644 +--- a/backends/arm_retval.c ++++ b/backends/arm_retval.c +@@ -90,7 +90,7 @@ arm_return_value_location_ (Dwarf_Die *functypedie, const Dwarf_Op **locp, + typedie = dwarf_formref_die (attr, &die_mem); + tag = DWARF_TAG_OR_RETURN (typedie); + } +- /* Fall through. */ ++ FALLTHROUGH; + + case DW_TAG_base_type: + case DW_TAG_enumeration_type: +diff --git a/backends/i386_regs.c b/backends/i386_regs.c +index fd963a6..7ec93bb 100644 +--- a/backends/i386_regs.c ++++ b/backends/i386_regs.c +@@ -92,7 +92,7 @@ i386_register_info (Ebl *ebl __attribute__ ((unused)), + case 5: + case 8: + *type = DW_ATE_address; +- /* Fallthrough */ ++ FALLTHROUGH; + case 0 ... 3: + case 6 ... 7: + name[0] = 'e'; +diff --git a/backends/i386_retval.c b/backends/i386_retval.c +index 4aa646f..32fec72 100644 +--- a/backends/i386_retval.c ++++ b/backends/i386_retval.c +@@ -85,7 +85,7 @@ i386_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp) + typedie = dwarf_formref_die (attr, &die_mem); + tag = DWARF_TAG_OR_RETURN (typedie); + } +- /* Fall through. */ ++ FALLTHROUGH; + + case DW_TAG_base_type: + case DW_TAG_enumeration_type: +@@ -123,7 +123,7 @@ i386_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp) + if (size <= 8) + return nloc_intregpair; + } +- /* Fallthrough */ ++ FALLTHROUGH; + + case DW_TAG_structure_type: + case DW_TAG_class_type: +diff --git a/backends/ia64_retval.c b/backends/ia64_retval.c +index dcd5f28..03ea4d8 100644 +--- a/backends/ia64_retval.c ++++ b/backends/ia64_retval.c +@@ -260,7 +260,7 @@ ia64_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp) + typedie = dwarf_formref_die (attr, &die_mem); + tag = DWARF_TAG_OR_RETURN (typedie); + } +- /* Fall through. */ ++ FALLTHROUGH; + + case DW_TAG_base_type: + case DW_TAG_enumeration_type: +diff --git a/backends/linux-core-note.c b/backends/linux-core-note.c +index 67638d7..5f06c89 100644 +--- a/backends/linux-core-note.c ++++ b/backends/linux-core-note.c +@@ -226,7 +226,7 @@ EBLHOOK(core_note) (const GElf_Nhdr *nhdr, const char *name, + if (memcmp (name, "CORE", nhdr->n_namesz) == 0) + break; + /* Buggy old Linux kernels didn't terminate "LINUX". */ +- /* Fall through. */ ++ FALLTHROUGH; + + case sizeof "LINUX": + if (memcmp (name, "LINUX", nhdr->n_namesz) == 0) +diff --git a/backends/m68k_retval.c b/backends/m68k_retval.c +index c68ed02..a653ba3 100644 +--- a/backends/m68k_retval.c ++++ b/backends/m68k_retval.c +@@ -92,7 +92,7 @@ m68k_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp) + typedie = dwarf_formref_die (attr, &die_mem); + tag = DWARF_TAG_OR_RETURN (typedie); + } +- /* Fall through. */ ++ FALLTHROUGH; + + case DW_TAG_base_type: + case DW_TAG_enumeration_type: +@@ -135,7 +135,7 @@ m68k_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp) + if (size <= 8) + return nloc_intregpair; + } +- /* Fallthrough */ ++ FALLTHROUGH; + case DW_TAG_structure_type: + case DW_TAG_class_type: + case DW_TAG_union_type: +diff --git a/backends/mips_retval.c b/backends/mips_retval.c +index 57487bb..c6e1ffe 100644 +--- a/backends/mips_retval.c ++++ b/backends/mips_retval.c +@@ -306,7 +306,7 @@ mips_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp) + typedie = dwarf_formref_die (attr, &die_mem); + tag = dwarf_tag (typedie); + } +- /* Fall through. */ ++ FALLTHROUGH; + + case DW_TAG_base_type: + case DW_TAG_enumeration_type: +@@ -389,7 +389,7 @@ mips_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp) + } + } + +- /* Fallthrough to handle large types */ ++ FALLTHROUGH; /* Fallthrough to handle large types */ + + case DW_TAG_array_type: + large: +diff --git a/backends/parisc_retval.c b/backends/parisc_retval.c +index df7ec3a..1f1e91a 100644 +--- a/backends/parisc_retval.c ++++ b/backends/parisc_retval.c +@@ -116,7 +116,7 @@ parisc_return_value_location_ (Dwarf_Die *functypedie, const Dwarf_Op **locp, in + typedie = dwarf_formref_die (attr, &die_mem); + tag = dwarf_tag (typedie); + } +- /* Fall through. */ ++ FALLTHROUGH; + + case DW_TAG_base_type: + case DW_TAG_enumeration_type: +@@ -167,6 +167,7 @@ parisc_return_value_location_ (Dwarf_Die *functypedie, const Dwarf_Op **locp, in + + /* Else fall through. */ + } ++ FALLTHROUGH; + + case DW_TAG_structure_type: + case DW_TAG_class_type: +@@ -189,7 +190,7 @@ parisc_return_value_location_ (Dwarf_Die *functypedie, const Dwarf_Op **locp, in + *locp = loc_aggregate; + return nloc_aggregate; + #endif +- /* fall through. */ ++ FALLTHROUGH; + } + } + +diff --git a/backends/ppc64_retval.c b/backends/ppc64_retval.c +index a251983..eb1c11e 100644 +--- a/backends/ppc64_retval.c ++++ b/backends/ppc64_retval.c +@@ -96,7 +96,7 @@ ppc64_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp) + typedie = dwarf_formref_die (attr, &die_mem); + tag = DWARF_TAG_OR_RETURN (typedie); + } +- /* Fall through. */ ++ FALLTHROUGH; + + case DW_TAG_base_type: + case DW_TAG_enumeration_type: +@@ -141,7 +141,7 @@ ppc64_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp) + return nloc_intreg; + } + +- /* Else fall through. */ ++ FALLTHROUGH; + case DW_TAG_structure_type: + case DW_TAG_class_type: + case DW_TAG_union_type: +@@ -161,7 +161,7 @@ ppc64_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp) + return nloc_vmxreg; + } + } +- /* Fall through. */ ++ FALLTHROUGH; + + case DW_TAG_string_type: + if (dwarf_aggregate_size (typedie, &size) == 0 && size <= 8) +diff --git a/backends/ppc_regs.c b/backends/ppc_regs.c +index c2d5011..43d2534 100644 +--- a/backends/ppc_regs.c ++++ b/backends/ppc_regs.c +@@ -140,7 +140,7 @@ ppc_register_info (Ebl *ebl __attribute__ ((unused)), + case 100: + if (*bits == 32) + return stpcpy (name, "mq") + 1 - name; +- /* Fallthrough */ ++ FALLTHROUGH; + case 102 ... 107: + name[0] = 's'; + name[1] = 'p'; +diff --git a/backends/ppc_retval.c b/backends/ppc_retval.c +index b14a99f..39b42da 100644 +--- a/backends/ppc_retval.c ++++ b/backends/ppc_retval.c +@@ -108,7 +108,7 @@ ppc_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp) + typedie = dwarf_formref_die (attr, &die_mem); + tag = DWARF_TAG_OR_RETURN (typedie); + } +- /* Fall through. */ ++ FALLTHROUGH; + + case DW_TAG_base_type: + case DW_TAG_enumeration_type: +@@ -172,7 +172,7 @@ ppc_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp) + return nloc_intregquad; + } + } +- /* Fall through. */ ++ FALLTHROUGH; + + case DW_TAG_structure_type: + case DW_TAG_class_type: +diff --git a/backends/s390_retval.c b/backends/s390_retval.c +index a927d46..2043f98 100644 +--- a/backends/s390_retval.c ++++ b/backends/s390_retval.c +@@ -87,7 +87,7 @@ s390_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp) + typedie = dwarf_formref_die (attr, &die_mem); + tag = DWARF_TAG_OR_RETURN (typedie); + } +- /* Fall through. */ ++ FALLTHROUGH; + + case DW_TAG_base_type: + case DW_TAG_enumeration_type: +@@ -127,7 +127,7 @@ s390_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp) + return size <= asize ? nloc_intreg : nloc_intregpair; + } + } +- /* Fall through. */ ++ FALLTHROUGH; + + case DW_TAG_structure_type: + case DW_TAG_class_type: +diff --git a/backends/sh_retval.c b/backends/sh_retval.c +index d44f260..33d7d96 100644 +--- a/backends/sh_retval.c ++++ b/backends/sh_retval.c +@@ -84,7 +84,7 @@ sh_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp) + typedie = dwarf_formref_die (attr, &die_mem); + tag = DWARF_TAG_OR_RETURN (typedie); + } +- /* Fall through. */ ++ FALLTHROUGH; + + case DW_TAG_base_type: + case DW_TAG_enumeration_type: +diff --git a/backends/sparc_retval.c b/backends/sparc_retval.c +index e1b1775..fb81cdc 100644 +--- a/backends/sparc_retval.c ++++ b/backends/sparc_retval.c +@@ -91,7 +91,7 @@ sparc_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp) + typedie = dwarf_formref_die (attr, &die_mem); + tag = DWARF_TAG_OR_RETURN (typedie); + } +- /* Fall through. */ ++ FALLTHROUGH; + + case DW_TAG_base_type: + case DW_TAG_enumeration_type: +diff --git a/backends/tilegx_retval.c b/backends/tilegx_retval.c +index db81a20..7f7d24b 100644 +--- a/backends/tilegx_retval.c ++++ b/backends/tilegx_retval.c +@@ -79,7 +79,7 @@ tilegx_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp) + typedie = dwarf_formref_die (attr, &die_mem); + tag = DWARF_TAG_OR_RETURN (typedie); + } +- /* Fall through. */ ++ FALLTHROUGH; + + case DW_TAG_base_type: + case DW_TAG_enumeration_type: +@@ -113,7 +113,7 @@ tilegx_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp) + return nloc_intreg; + } + +- /* Else fall through. */ ++ FALLTHROUGH; + case DW_TAG_structure_type: + case DW_TAG_class_type: + case DW_TAG_union_type: +diff --git a/backends/x86_64_regs.c b/backends/x86_64_regs.c +index 8430440..ef987da 100644 +--- a/backends/x86_64_regs.c ++++ b/backends/x86_64_regs.c +@@ -87,7 +87,7 @@ x86_64_register_info (Ebl *ebl __attribute__ ((unused)), + + case 6 ... 7: + *type = DW_ATE_address; +- /* Fallthrough */ ++ FALLTHROUGH; + case 0 ... 5: + name[0] = 'r'; + name[1] = baseregs[regno][0]; +diff --git a/backends/x86_64_retval.c b/backends/x86_64_retval.c +index b3799ae..f9114cb 100644 +--- a/backends/x86_64_retval.c ++++ b/backends/x86_64_retval.c +@@ -100,7 +100,7 @@ x86_64_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp) + typedie = dwarf_formref_die (attr, &die_mem); + tag = DWARF_TAG_OR_RETURN (typedie); + } +- /* Fall through. */ ++ FALLTHROUGH; + + case DW_TAG_base_type: + case DW_TAG_enumeration_type: +diff --git a/config/eu.am b/config/eu.am +index 8fe1e25..b6ec581 100644 +--- a/config/eu.am ++++ b/config/eu.am +@@ -62,7 +62,9 @@ NULL_DEREFERENCE_WARNING= + endif + + if HAVE_IMPLICIT_FALLTHROUGH_WARNING +-IMPLICIT_FALLTHROUGH_WARNING=-Wimplicit-fallthrough ++# Use strict fallthrough. Only __attribute__((fallthrough)) will prevent the ++# warning ++IMPLICIT_FALLTHROUGH_WARNING=-Wimplicit-fallthrough=5 + else + IMPLICIT_FALLTHROUGH_WARNING= + endif +diff --git a/configure.ac b/configure.ac +index 1f1856d..698efbb 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -360,6 +360,12 @@ CFLAGS="$old_CFLAGS"]) + AM_CONDITIONAL(HAVE_IMPLICIT_FALLTHROUGH_WARNING, + [test "x$ac_cv_implicit_fallthrough" != "xno"]) + ++# Assume the fallthrough attribute is supported if -Wimplict-fallthrough is supported ++if test "$ac_cv_implicit_fallthrough" = "yes"; then ++ AC_DEFINE([HAVE_FALLTHROUGH], [1], ++ [Defined if __attribute__((fallthrough)) is supported]) ++fi ++ + dnl Check if we have argp available from our libc + AC_LINK_IFELSE( + [AC_LANG_PROGRAM( +diff --git a/lib/eu-config.h b/lib/eu-config.h +index 400cdc6..e8d4ec2 100644 +--- a/lib/eu-config.h ++++ b/lib/eu-config.h +@@ -186,5 +186,12 @@ asm (".section predict_data, \"aw\"; .previous\n" + # define COMPAT_VERSION(name, version, prefix) error "should use #ifdef SYMBOL_VERSIONING" + #endif + ++#ifndef FALLTHROUGH ++# ifdef HAVE_FALLTHROUGH ++# define FALLTHROUGH __attribute__ ((fallthrough)) ++# else ++# define FALLTHROUGH ((void) 0) ++# endif ++#endif + + #endif /* eu-config.h */ +diff --git a/libcpu/i386_disasm.c b/libcpu/i386_disasm.c +index 60fd6d4..837a3a8 100644 +--- a/libcpu/i386_disasm.c ++++ b/libcpu/i386_disasm.c +@@ -819,7 +819,7 @@ i386_disasm (Ebl *ebl __attribute__((unused)), + ++param_start; + break; + } +- /* Fallthrough */ ++ FALLTHROUGH; + default: + str = ""; + assert (! "INVALID not handled"); +diff --git a/libcpu/i386_parse.c b/libcpu/i386_parse.c +index ef1ac35..6fa7ce3 100644 +--- a/libcpu/i386_parse.c ++++ b/libcpu/i386_parse.c +@@ -1047,7 +1047,7 @@ yytnamerr (char *yyres, const char *yystr) + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; +- /* Fall through. */ ++ FALLTHROUGH; + default: + if (yyres) + yyres[yyn] = *yyp; +@@ -2042,7 +2042,7 @@ yyabortlab: + yyexhaustedlab: + yyerror (YY_("memory exhausted")); + yyresult = 2; +- /* Fall through. */ ++ FALLTHROUGH; + #endif + + yyreturn: +diff --git a/libdw/cfi.c b/libdw/cfi.c +index daa845f..341e055 100644 +--- a/libdw/cfi.c ++++ b/libdw/cfi.c +@@ -138,7 +138,7 @@ execute_cfi (Dwarf_CFI *cache, + + case DW_CFA_advance_loc1: + operand = *program++; +- /* Fallthrough */ ++ FALLTHROUGH; + case DW_CFA_advance_loc + 0 ... DW_CFA_advance_loc + CFI_PRIMARY_MAX: + advance_loc: + loc += operand * cie->code_alignment_factor; +@@ -301,7 +301,7 @@ execute_cfi (Dwarf_CFI *cache, + + case DW_CFA_restore_extended: + get_uleb128 (operand, program, end); +- /* Fallthrough */ ++ FALLTHROUGH; + case DW_CFA_restore + 0 ... DW_CFA_restore + CFI_PRIMARY_MAX: + + if (unlikely (abi_cfi) && likely (opcode == DW_CFA_restore)) +diff --git a/libdw/dwarf_frame_register.c b/libdw/dwarf_frame_register.c +index 37e8e91..d0159fb 100644 +--- a/libdw/dwarf_frame_register.c ++++ b/libdw/dwarf_frame_register.c +@@ -62,7 +62,7 @@ dwarf_frame_register (Dwarf_Frame *fs, int regno, Dwarf_Op *ops_mem, + /* Use the default rule for registers not yet mentioned in CFI. */ + if (fs->cache->default_same_value) + goto same_value; +- /*FALLTHROUGH*/ ++ FALLTHROUGH; + case reg_undefined: + /* The value is known to be unavailable. */ + break; +diff --git a/libdwfl/dwfl_report_elf.c b/libdwfl/dwfl_report_elf.c +index 6950a37..3fc9384 100644 +--- a/libdwfl/dwfl_report_elf.c ++++ b/libdwfl/dwfl_report_elf.c +@@ -174,7 +174,7 @@ __libdwfl_elf_address_range (Elf *elf, GElf_Addr base, bool add_p_vaddr, + /* An assigned base address is meaningless for these. */ + base = 0; + add_p_vaddr = true; +- /* Fallthrough. */ ++ FALLTHROUGH; + case ET_DYN: + default:; + size_t phnum; +diff --git a/libdwfl/frame_unwind.c b/libdwfl/frame_unwind.c +index 4dc9c43..eaea495 100644 +--- a/libdwfl/frame_unwind.c ++++ b/libdwfl/frame_unwind.c +@@ -442,7 +442,7 @@ expr_eval (Dwfl_Frame *state, Dwarf_Frame *frame, const Dwarf_Op *ops, + } + if (val1 == 0) + break; +- /* FALLTHRU */ ++ FALLTHROUGH; + case DW_OP_skip:; + Dwarf_Word offset = op->offset + 1 + 2 + (int16_t) op->number; + const Dwarf_Op *found = bsearch ((void *) (uintptr_t) offset, ops, nops, +diff --git a/libebl/eblobjnote.c b/libebl/eblobjnote.c +index f80a1a5..ca4f155 100644 +--- a/libebl/eblobjnote.c ++++ b/libebl/eblobjnote.c +@@ -223,7 +223,7 @@ ebl_object_note (Ebl *ebl, const char *name, uint32_t type, + free (buf); + break; + } +- /* FALLTHROUGH */ ++ FALLTHROUGH; + + default: + /* Unknown type. */ +diff --git a/libelf/elf32_updatenull.c b/libelf/elf32_updatenull.c +index a51bf70..5351518 100644 +--- a/libelf/elf32_updatenull.c ++++ b/libelf/elf32_updatenull.c +@@ -232,7 +232,7 @@ __elfw2(LIBELFBITS,updatenull_wrlock) (Elf *elf, int *change_bop, size_t shnum) + __libelf_seterrno (ELF_E_GROUP_NOT_REL); + return -1; + } +- /* FALLTHROUGH */ ++ FALLTHROUGH; + case SHT_SYMTAB_SHNDX: + sh_entsize = elf_typesize (32, ELF_T_WORD, 1); + break; +diff --git a/libelf/elf_begin.c b/libelf/elf_begin.c +index 6f85038..6de206a 100644 +--- a/libelf/elf_begin.c ++++ b/libelf/elf_begin.c +@@ -582,7 +582,7 @@ read_unmmaped_file (int fildes, off_t offset, size_t maxsize, Elf_Cmd cmd, + ? sizeof (Elf32_Ehdr) : sizeof (Elf64_Ehdr))) + return file_read_elf (fildes, NULL, mem.header, offset, maxsize, cmd, + parent); +- /* FALLTHROUGH */ ++ FALLTHROUGH; + + default: + break; +@@ -1097,7 +1097,7 @@ elf_begin (int fildes, Elf_Cmd cmd, Elf *ref) + retval = NULL; + break; + } +- /* FALLTHROUGH */ ++ FALLTHROUGH; + + case ELF_C_READ: + case ELF_C_READ_MMAP: +diff --git a/libelf/elf_cntl.c b/libelf/elf_cntl.c +index ab13ffb..fd68178 100644 +--- a/libelf/elf_cntl.c ++++ b/libelf/elf_cntl.c +@@ -62,7 +62,7 @@ elf_cntl (Elf *elf, Elf_Cmd cmd) + result = -1; + break; + } +- /* FALLTHROUGH */ ++ FALLTHROUGH; + + case ELF_C_FDDONE: + /* Mark the file descriptor as not usable. */ +diff --git a/src/addr2line.c b/src/addr2line.c +index ba414a7..444ee52 100644 +--- a/src/addr2line.c ++++ b/src/addr2line.c +@@ -618,7 +618,7 @@ handle_address (const char *string, Dwfl *dwfl) + case 1: + addr = 0; + j = i; +- /* Fallthrough */ ++ FALLTHROUGH; + case 2: + if (string[j] != '\0') + break; +diff --git a/src/elfcompress.c b/src/elfcompress.c +index 8e0d5c5..25378a4 100644 +--- a/src/elfcompress.c ++++ b/src/elfcompress.c +@@ -149,7 +149,7 @@ parse_opt (int key, char *arg __attribute__ ((unused)), + N_("Only one input file allowed together with '-o'")); + /* We only use this for checking the number of arguments, we don't + actually want to consume them. */ +- /* Fallthrough */ ++ FALLTHROUGH; + default: + return ARGP_ERR_UNKNOWN; + } +diff --git a/src/elflint.c b/src/elflint.c +index 51e53c2..df1b3a0 100644 +--- a/src/elflint.c ++++ b/src/elflint.c +@@ -1764,7 +1764,7 @@ section [%2d] '%s': entry %zu: pointer does not match address of section [%2d] ' + if (dyn->d_tag < DT_ADDRRNGLO || dyn->d_tag > DT_ADDRRNGHI) + /* Value is no pointer. */ + break; +- /* FALLTHROUGH */ ++ FALLTHROUGH; + + case DT_AUXILIARY: + case DT_FILTER: +@@ -3993,7 +3993,7 @@ section [%2zu] '%s': merge flag set but entry size is zero\n"), + case SHT_NOBITS: + if (is_debuginfo) + break; +- /* Fallthrough */ ++ FALLTHROUGH; + default: + ERROR (gettext ("\ + section [%2zu] '%s' has unexpected type %d for an executable section\n"), +@@ -4137,7 +4137,7 @@ section [%2zu] '%s': ELF header says this is the section header string table but + ERROR (gettext ("\ + section [%2zu] '%s': relocatable files cannot have dynamic symbol tables\n"), + cnt, section_name (ebl, cnt)); +- /* FALLTHROUGH */ ++ FALLTHROUGH; + case SHT_SYMTAB: + check_symtab (ebl, ehdr, shdr, cnt); + break; +@@ -4336,7 +4336,7 @@ section [%2d] '%s': unknown core file note type %" PRIu32 + if (nhdr.n_namesz == sizeof "Linux" + && !memcmp (data->d_buf + name_offset, "Linux", sizeof "Linux")) + break; +- /* Fallthrough */ ++ FALLTHROUGH; + default: + if (shndx == 0) + ERROR (gettext ("\ +diff --git a/src/objdump.c b/src/objdump.c +index 860cfac..0dd9a6a 100644 +--- a/src/objdump.c ++++ b/src/objdump.c +@@ -223,7 +223,7 @@ parse_opt (int key, char *arg, + } + /* We only use this for checking the number of arguments, we don't + actually want to consume them. */ +- /* Fallthrough */ ++ FALLTHROUGH; + default: + return ARGP_ERR_UNKNOWN; + } +diff --git a/src/readelf.c b/src/readelf.c +index 346eccd..6a27e7e 100644 +--- a/src/readelf.c ++++ b/src/readelf.c +@@ -465,7 +465,7 @@ parse_opt (int key, char *arg, + print_string_sections = true; + break; + } +- /* Fall through. */ ++ FALLTHROUGH; + case 'x': + add_dump_section (arg, false); + any_control_option = true; +@@ -6029,7 +6029,7 @@ attr_callback (Dwarf_Attribute *attrp, void *arg) + dwarf_form_name (form), (uintmax_t) num); + return DWARF_CB_OK; + } +- /* else fallthrough */ ++ FALLTHROUGH; + + /* These cases always take a loclistptr and no constant. */ + case DW_AT_location: +@@ -6195,7 +6195,7 @@ attr_callback (Dwarf_Attribute *attrp, void *arg) + print_block (block.length, block.data); + break; + } +- /* Fall through. */ ++ FALLTHROUGH; + + case DW_AT_location: + case DW_AT_data_location: +@@ -9227,7 +9227,7 @@ handle_auxv_note (Ebl *ebl, Elf *core, GElf_Word descsz, GElf_Off desc_pos) + printf (" %s\n", name); + break; + } +- /* Fall through */ ++ FALLTHROUGH; + case 'x': /* hex */ + case 'p': /* address */ + case 's': /* address of string */ +diff --git a/src/strings.c b/src/strings.c +index d214356..03d0f13 100644 +--- a/src/strings.c ++++ b/src/strings.c +@@ -246,7 +246,7 @@ parse_opt (int key, char *arg, + case 'b': + case 'B': + big_endian = true; +- /* FALLTHROUGH */ ++ FALLTHROUGH; + + case 'l': + case 'L': +diff --git a/tests/backtrace.c b/tests/backtrace.c +index 21abe8a..f5dd761 100644 +--- a/tests/backtrace.c ++++ b/tests/backtrace.c +@@ -127,7 +127,7 @@ callback_verify (pid_t tid, unsigned frameno, Dwarf_Addr pc, + assert (symname2 == NULL || strcmp (symname2, "jmp") != 0); + break; + } +- /* FALLTHRU */ ++ FALLTHROUGH; + case 4: + /* Some simple frame unwinders get this wrong and think sigusr2 + is calling itself again. Allow it and just pretend there is +diff --git a/tests/elfstrmerge.c b/tests/elfstrmerge.c +index 8d5b53c..62c549d 100644 +--- a/tests/elfstrmerge.c ++++ b/tests/elfstrmerge.c +@@ -578,7 +578,8 @@ main (int argc, char **argv) + break; + + case SHT_DYNAMIC: +- /* Fallthrough. There are string indexes in here, but ++ FALLTHROUGH; ++ /* There are string indexes in here, but + they (should) point to a allocated string table, + which we don't alter. */ + default: +-- +2.14.3 + diff --git a/poky/meta/recipes-devtools/elfutils/files/0001-dso-link-change.patch b/poky/meta/recipes-devtools/elfutils/files/0001-dso-link-change.patch new file mode 100644 index 000000000..28c57f236 --- /dev/null +++ b/poky/meta/recipes-devtools/elfutils/files/0001-dso-link-change.patch @@ -0,0 +1,52 @@ +From 0a69a26c9f7487daca900db87cd1195857a4603f Mon Sep 17 00:00:00 2001 +From: Hongxu Jia +Date: Tue, 15 Aug 2017 17:10:57 +0800 +Subject: [PATCH 1/7] dso link change + +Upstream-Status: Pending + +This patch makes the link to the dependencies of libdw explicit, as +recent ld no longer implicitly links them. See +http://lists.fedoraproject.org/pipermail/devel/2010-March/133601.html +as a similar example of the error message you can encounter without this +patch, and https://fedoraproject.org/wiki/UnderstandingDSOLinkChange and +https://fedoraproject.org/wiki/Features/ChangeInImplicitDSOLinking for +more details. + +Rebase to 0.170 + +Signed-off-by: Hongxu Jia +--- + src/Makefile.am | 2 +- + tests/Makefile.am | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/src/Makefile.am b/src/Makefile.am +index 2b1c0dc..9305b84 100644 +--- a/src/Makefile.am ++++ b/src/Makefile.am +@@ -44,7 +44,7 @@ libdw = ../libdw/libdw.a -lz $(zip_LIBS) $(libelf) $(libebl) -ldl + libelf = ../libelf/libelf.a -lz + else + libasm = ../libasm/libasm.so +-libdw = ../libdw/libdw.so ++libdw = ../libdw/libdw.so $(zip_LIBS) $(libelf) $(libebl) -ldl + libelf = ../libelf/libelf.so + endif + libebl = ../libebl/libebl.a +diff --git a/tests/Makefile.am b/tests/Makefile.am +index 3735084..528615d 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -400,7 +400,7 @@ libdw = ../libdw/libdw.a -lz $(zip_LIBS) $(libelf) $(libebl) -ldl + libelf = ../libelf/libelf.a -lz + libasm = ../libasm/libasm.a + else +-libdw = ../libdw/libdw.so ++libdw = ../libdw/libdw.so $(zip_LIBS) $(libelf) $(libebl) -ldl + libelf = ../libelf/libelf.so + libasm = ../libasm/libasm.so + endif +-- +1.8.3.1 + diff --git a/poky/meta/recipes-devtools/elfutils/files/0001-libasm-may-link-with-libbz2-if-found.patch b/poky/meta/recipes-devtools/elfutils/files/0001-libasm-may-link-with-libbz2-if-found.patch new file mode 100644 index 000000000..fb0b060b4 --- /dev/null +++ b/poky/meta/recipes-devtools/elfutils/files/0001-libasm-may-link-with-libbz2-if-found.patch @@ -0,0 +1,39 @@ +From 7672e363468271b4c63ff58770c5aac15ab8f722 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Wed, 4 Oct 2017 22:30:46 -0700 +Subject: [PATCH] libasm may link with libbz2 if found + +This can fail to link binaries like objdump +where indirect libraries may be not found by linker + +| /mnt/a/oe/build/tmp/work/riscv64-bec-linux/elfutils/0.170-r0/recipe-sysroot/usr/lib/libbz2.so.1: error adding symbols: DSO missing from command line +| collect2: error: ld returned 1 exit status + +Signed-off-by: Khem Raj +--- +Upstream-Status: Pending + + src/Makefile.am | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/src/Makefile.am b/src/Makefile.am +index e03bc32..9b7e853 100644 +--- a/src/Makefile.am ++++ b/src/Makefile.am +@@ -39,11 +39,11 @@ EXTRA_DIST += make-debug-archive.in + CLEANFILES += make-debug-archive + + if BUILD_STATIC +-libasm = ../libasm/libasm.a ++libasm = ../libasm/libasm.a $(zip_LIBS) + libdw = ../libdw/libdw.a -lz $(zip_LIBS) $(libelf) $(libebl) -ldl + libelf = ../libelf/libelf.a -lz + else +-libasm = ../libasm/libasm.so ++libasm = ../libasm/libasm.so $(zip_LIBS) + libdw = ../libdw/libdw.so $(zip_LIBS) $(libelf) $(libebl) -ldl + libelf = ../libelf/libelf.so + endif +-- +2.14.2 + diff --git a/poky/meta/recipes-devtools/elfutils/files/0002-Fix-elf_cvt_gunhash-if-dest-and-src-are-same.patch b/poky/meta/recipes-devtools/elfutils/files/0002-Fix-elf_cvt_gunhash-if-dest-and-src-are-same.patch new file mode 100644 index 000000000..2f718eb82 --- /dev/null +++ b/poky/meta/recipes-devtools/elfutils/files/0002-Fix-elf_cvt_gunhash-if-dest-and-src-are-same.patch @@ -0,0 +1,42 @@ +From e98670f7c7b4c73fb65534949716fd8d043960d5 Mon Sep 17 00:00:00 2001 +From: Hongxu Jia +Date: Tue, 15 Aug 2017 17:13:59 +0800 +Subject: [PATCH 2/7] Fix elf_cvt_gunhash if dest and src are same. + +Upstream-Status: Pending + +The 'dest' and 'src' can be same, we need to save the value of src32[2] +before swaping it. + +Signed-off-by: Baoshan Pang + +Rebase to 0.170 +Signed-off-by: Hongxu Jia +--- + libelf/gnuhash_xlate.h | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/libelf/gnuhash_xlate.h b/libelf/gnuhash_xlate.h +index 6faf113..04d9ca1 100644 +--- a/libelf/gnuhash_xlate.h ++++ b/libelf/gnuhash_xlate.h +@@ -40,6 +40,7 @@ elf_cvt_gnuhash (void *dest, const void *src, size_t len, int encode) + words. We must detangle them here. */ + Elf32_Word *dest32 = dest; + const Elf32_Word *src32 = src; ++ Elf32_Word save_src32_2 = src32[2]; // dest could be equal to src + + /* First four control words, 32 bits. */ + for (unsigned int cnt = 0; cnt < 4; ++cnt) +@@ -50,7 +51,7 @@ elf_cvt_gnuhash (void *dest, const void *src, size_t len, int encode) + len -= 4; + } + +- Elf32_Word bitmask_words = encode ? src32[2] : dest32[2]; ++ Elf32_Word bitmask_words = encode ? save_src32_2 : dest32[2]; + + /* Now the 64 bit words. */ + Elf64_Xword *dest64 = (Elf64_Xword *) &dest32[4]; +-- +1.8.3.1 + diff --git a/poky/meta/recipes-devtools/elfutils/files/0003-fixheadercheck.patch b/poky/meta/recipes-devtools/elfutils/files/0003-fixheadercheck.patch new file mode 100644 index 000000000..7c49fced1 --- /dev/null +++ b/poky/meta/recipes-devtools/elfutils/files/0003-fixheadercheck.patch @@ -0,0 +1,40 @@ +From 565d5935abf5b58773f9c8385c00189221980d98 Mon Sep 17 00:00:00 2001 +From: Hongxu Jia +Date: Tue, 15 Aug 2017 17:17:20 +0800 +Subject: [PATCH 3/7] fixheadercheck + +For some binaries we can get a invalid section alignment, for example if +sh_align = 1 and sh_addralign is 0. In the case of a zero size section +like +".note.GNU-stack", this is irrelavent as far as I can tell and we +shouldn't +error in this case. + +RP 2014/6/11 + +Upstream-Status: Pending + +Rebase to 0.170 +Signed-off-by: Hongxu Jia +--- + libelf/elf32_updatenull.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/libelf/elf32_updatenull.c b/libelf/elf32_updatenull.c +index d83c0b3..a51bf70 100644 +--- a/libelf/elf32_updatenull.c ++++ b/libelf/elf32_updatenull.c +@@ -339,8 +339,8 @@ __elfw2(LIBELFBITS,updatenull_wrlock) (Elf *elf, int *change_bop, size_t shnum) + we test for the alignment of the section being large + enough for the largest alignment required by a data + block. */ +- if (unlikely (! powerof2 (shdr->sh_addralign)) +- || unlikely ((shdr->sh_addralign ?: 1) < sh_align)) ++ if (shdr->sh_size && (unlikely (! powerof2 (shdr->sh_addralign)) ++ || unlikely ((shdr->sh_addralign ?: 1) < sh_align))) + { + __libelf_seterrno (ELF_E_INVALID_ALIGN); + return -1; +-- +1.8.3.1 + diff --git a/poky/meta/recipes-devtools/elfutils/files/0004-Disable-the-test-to-convert-euc-jp.patch b/poky/meta/recipes-devtools/elfutils/files/0004-Disable-the-test-to-convert-euc-jp.patch new file mode 100644 index 000000000..d893ad68f --- /dev/null +++ b/poky/meta/recipes-devtools/elfutils/files/0004-Disable-the-test-to-convert-euc-jp.patch @@ -0,0 +1,44 @@ +From bb7ed11950101798aae82f7fda8b3dcb05f755c5 Mon Sep 17 00:00:00 2001 +From: Hongxu Jia +Date: Tue, 15 Aug 2017 17:24:06 +0800 +Subject: [PATCH 4/7] Disable the test to convert euc-jp + +Remove the test "Test against HP-UX 11.11 bug: +No converter from EUC-JP to UTF-8 is provided" +since we don't support HP-UX and if the euc-jp is not +installed on the host, the dependence will be built without +iconv support and will cause guild-native building fail. + +Upstream-Status: Inappropriate [OE specific] + +Signed-off-by: Roy Li + +Rebase to 0.170 +Signed-off-by: Hongxu Jia +--- + m4/iconv.m4 | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/m4/iconv.m4 b/m4/iconv.m4 +index a503646..299f1eb 100644 +--- a/m4/iconv.m4 ++++ b/m4/iconv.m4 +@@ -159,6 +159,7 @@ int main () + } + } + #endif ++#if 0 + /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is + provided. */ + if (/* Try standardized names. */ +@@ -170,6 +171,7 @@ int main () + /* Try HP-UX names. */ + && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) + result |= 16; ++#endif + return result; + }]])], + [am_cv_func_iconv_works=yes], +-- +1.8.3.1 + diff --git a/poky/meta/recipes-devtools/elfutils/files/0005-fix-a-stack-usage-warning.patch b/poky/meta/recipes-devtools/elfutils/files/0005-fix-a-stack-usage-warning.patch new file mode 100644 index 000000000..22a01cfa7 --- /dev/null +++ b/poky/meta/recipes-devtools/elfutils/files/0005-fix-a-stack-usage-warning.patch @@ -0,0 +1,35 @@ +From dd6dbf6af396519380f48c0ef1ce6cf4dd77f6d7 Mon Sep 17 00:00:00 2001 +From: Hongxu Jia +Date: Tue, 15 Aug 2017 17:25:16 +0800 +Subject: [PATCH 5/7] fix a stack-usage warning + +Upstream-Status: Pending + +not use a variable to as a array size, otherwise the warning to error +that +stack usage might be unbounded [-Werror=stack-usage=] will happen + +Signed-off-by: Roy Li + +Rebase to 0.170 +Signed-off-by: Hongxu Jia +--- + backends/ppc_initreg.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/backends/ppc_initreg.c b/backends/ppc_initreg.c +index 69d623b..de41dec 100644 +--- a/backends/ppc_initreg.c ++++ b/backends/ppc_initreg.c +@@ -93,7 +93,7 @@ ppc_set_initial_registers_tid (pid_t tid __attribute__ ((unused)), + return false; + } + const size_t gprs = sizeof (user_regs.r.gpr) / sizeof (*user_regs.r.gpr); +- Dwarf_Word dwarf_regs[gprs]; ++ Dwarf_Word dwarf_regs[sizeof (user_regs.r.gpr) / sizeof (*user_regs.r.gpr)]; + for (unsigned gpr = 0; gpr < gprs; gpr++) + dwarf_regs[gpr] = user_regs.r.gpr[gpr]; + if (! setfunc (0, gprs, dwarf_regs, arg)) +-- +1.8.3.1 + diff --git a/poky/meta/recipes-devtools/elfutils/files/0006-Fix-build-on-aarch64-musl.patch b/poky/meta/recipes-devtools/elfutils/files/0006-Fix-build-on-aarch64-musl.patch new file mode 100644 index 000000000..5f29a0375 --- /dev/null +++ b/poky/meta/recipes-devtools/elfutils/files/0006-Fix-build-on-aarch64-musl.patch @@ -0,0 +1,61 @@ +From e57ad47fc8549353ca80c23b9b4f38f31fde13e5 Mon Sep 17 00:00:00 2001 +From: Hongxu Jia +Date: Tue, 15 Aug 2017 17:27:30 +0800 +Subject: [PATCH 6/7] Fix build on aarch64/musl + +Errors + +invalid operands to binary & (have 'long double' and 'unsigned int') + +error: redefinition + of 'struct iovec' + struct iovec { void *iov_base; size_t iov_len; }; + ^ +Upstream-Status: Pending +Signed-off-by: Khem Raj + +Rebase to 0.170 +Signed-off-by: Hongxu Jia +--- + backends/aarch64_initreg.c | 4 ++-- + backends/arm_initreg.c | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/backends/aarch64_initreg.c b/backends/aarch64_initreg.c +index daf6f37..6445276 100644 +--- a/backends/aarch64_initreg.c ++++ b/backends/aarch64_initreg.c +@@ -33,7 +33,7 @@ + #include "system.h" + #include + #if defined(__aarch64__) && defined(__linux__) +-# include ++# include + # include + # include + /* Deal with old glibc defining user_pt_regs instead of user_regs_struct. */ +@@ -82,7 +82,7 @@ aarch64_set_initial_registers_tid (pid_t tid __attribute__ ((unused)), + + Dwarf_Word dwarf_fregs[32]; + for (int r = 0; r < 32; r++) +- dwarf_fregs[r] = fregs.vregs[r] & 0xFFFFFFFF; ++ dwarf_fregs[r] = (unsigned int)fregs.vregs[r] & 0xFFFFFFFF; + + if (! setfunc (64, 32, dwarf_fregs, arg)) + return false; +diff --git a/backends/arm_initreg.c b/backends/arm_initreg.c +index efcabaf..062bb9e 100644 +--- a/backends/arm_initreg.c ++++ b/backends/arm_initreg.c +@@ -38,7 +38,7 @@ + #endif + + #ifdef __aarch64__ +-# include ++# include + # include + # include + /* Deal with old glibc defining user_pt_regs instead of user_regs_struct. */ +-- +1.8.3.1 + diff --git a/poky/meta/recipes-devtools/elfutils/files/0007-Fix-control-path-where-we-have-str-as-uninitialized-.patch b/poky/meta/recipes-devtools/elfutils/files/0007-Fix-control-path-where-we-have-str-as-uninitialized-.patch new file mode 100644 index 000000000..224770478 --- /dev/null +++ b/poky/meta/recipes-devtools/elfutils/files/0007-Fix-control-path-where-we-have-str-as-uninitialized-.patch @@ -0,0 +1,45 @@ +From 1e91c1d4e37c05cf95058b4b3c3f352d72886f58 Mon Sep 17 00:00:00 2001 +From: Hongxu Jia +Date: Tue, 15 Aug 2017 17:31:38 +0800 +Subject: [PATCH 7/7] Fix control path where we have str as uninitialized + string + +| +/home/ubuntu/work/oe/openembedded-core/build/tmp-musl/work/i586-oe-linux-musl/elfutils/0.164-r0/elfutils-0.164/libcpu/i386_disasm.c: +In function 'i386_disasm': +| +/home/ubuntu/work/oe/openembedded-core/build/tmp-musl/work/i586-oe-linux-musl/elfutils/0.164-r0/elfutils-0.164/libcpu/i386_disasm.c:310:5: +error: 'str' may be used uninitialized in this function +[-Werror=maybe-uninitialized] +| memcpy (buf + bufcnt, _str, _len); \ +| ^ +| +/home/ubuntu/work/oe/openembedded-core/build/tmp-musl/work/i586-oe-linux-musl/elfutils/0.164-r0/elfutils-0.164/libcpu/i386_disasm.c:709:17: +note: 'str' was declared here +| const char *str; + +Signed-off-by: Khem Raj +Upstream-Status: Pending + +Rebase to 0.170 + +Signed-off-by: Hongxu Jia +--- + libcpu/i386_disasm.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/libcpu/i386_disasm.c b/libcpu/i386_disasm.c +index 831afbe..60fd6d4 100644 +--- a/libcpu/i386_disasm.c ++++ b/libcpu/i386_disasm.c +@@ -821,6 +821,7 @@ i386_disasm (Ebl *ebl __attribute__((unused)), + } + /* Fallthrough */ + default: ++ str = ""; + assert (! "INVALID not handled"); + } + } +-- +1.8.3.1 + diff --git a/poky/meta/recipes-devtools/elfutils/files/0008-build-Provide-alternatives-for-glibc-assumptions-hel.patch b/poky/meta/recipes-devtools/elfutils/files/0008-build-Provide-alternatives-for-glibc-assumptions-hel.patch new file mode 100644 index 000000000..a42ce7b35 --- /dev/null +++ b/poky/meta/recipes-devtools/elfutils/files/0008-build-Provide-alternatives-for-glibc-assumptions-hel.patch @@ -0,0 +1,1029 @@ +From ef0981744669149a00dd0439a54dac30de7b56a7 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Wed, 16 Aug 2017 10:06:26 +0800 +Subject: [PATCH] build: Provide alternatives for glibc assumptions helps + compiling it on musl + +Upstream-Status: Pending +Signed-off-by: Khem Raj + +Rebase to 0.170 + +Signed-off-by: Hongxu Jia + +--- + Makefile.am | 2 +- + lib/color.c | 3 ++- + lib/fixedsizehash.h | 1 - + lib/system.h | 10 ++++++++++ + lib/xmalloc.c | 2 +- + libasm/asm_end.c | 2 +- + libasm/asm_newscn.c | 2 +- + libcpu/i386_gendis.c | 2 +- + libcpu/i386_lex.c | 2 +- + libcpu/i386_parse.c | 2 +- + libdw/Makefile.am | 3 ++- + libdw/libdw_alloc.c | 2 +- + libdwfl/dwfl_build_id_find_elf.c | 3 ++- + libdwfl/dwfl_error.c | 4 +++- + libdwfl/dwfl_module_getdwarf.c | 1 + + libdwfl/find-debuginfo.c | 2 +- + libdwfl/libdwfl_crc32_file.c | 9 +++++++++ + libdwfl/linux-kernel-modules.c | 1 + + libebl/eblopenbackend.c | 2 +- + libelf/elf.h | 8 ++++++-- + libelf/libelf.h | 1 + + libelf/libelfP.h | 1 + + src/addr2line.c | 2 +- + src/ar.c | 2 +- + src/arlib.c | 2 +- + src/arlib2.c | 2 +- + src/elfcmp.c | 2 +- + src/elflint.c | 2 +- + src/findtextrel.c | 2 +- + src/nm.c | 2 +- + src/objdump.c | 2 +- + src/ranlib.c | 2 +- + src/readelf.c | 2 +- + src/size.c | 2 +- + src/stack.c | 2 +- + src/strings.c | 2 +- + src/strip.c | 2 +- + src/unstrip.c | 2 +- + tests/addrscopes.c | 2 +- + tests/allregs.c | 2 +- + tests/backtrace-data.c | 2 +- + tests/backtrace-dwarf.c | 2 +- + tests/backtrace.c | 2 +- + tests/buildid.c | 2 +- + tests/debugaltlink.c | 2 +- + tests/debuglink.c | 2 +- + tests/deleted.c | 2 +- + tests/dwfl-addr-sect.c | 2 +- + tests/dwfl-bug-addr-overflow.c | 2 +- + tests/dwfl-bug-fd-leak.c | 2 +- + tests/dwfl-bug-getmodules.c | 2 +- + tests/dwfl-report-elf-align.c | 2 +- + tests/dwfllines.c | 2 +- + tests/dwflmodtest.c | 2 +- + tests/dwflsyms.c | 2 +- + tests/early-offscn.c | 2 +- + tests/ecp.c | 2 +- + tests/find-prologues.c | 2 +- + tests/funcretval.c | 2 +- + tests/funcscopes.c | 2 +- + tests/getsrc_die.c | 2 +- + tests/line2addr.c | 2 +- + tests/low_high_pc.c | 2 +- + tests/md5-sha1-test.c | 2 +- + tests/rdwrmmap.c | 2 +- + tests/saridx.c | 2 +- + tests/sectiondump.c | 2 +- + tests/varlocs.c | 2 +- + tests/vdsosyms.c | 2 +- + 69 files changed, 95 insertions(+), 64 deletions(-) + +diff --git a/Makefile.am b/Makefile.am +index 2ff444e7..41f77df8 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -28,7 +28,7 @@ pkginclude_HEADERS = version.h + + # Add doc back when we have some real content. + SUBDIRS = config m4 lib libelf libebl libdwelf libdwfl libdw libcpu libasm \ +- backends src po tests ++ backends po tests + + EXTRA_DIST = elfutils.spec GPG-KEY NOTES CONTRIBUTING \ + COPYING COPYING-GPLV2 COPYING-LGPLV3 +diff --git a/lib/color.c b/lib/color.c +index f62389d5..a2a84b46 100644 +--- a/lib/color.c ++++ b/lib/color.c +@@ -32,13 +32,14 @@ + #endif + + #include +-#include ++#include + #include + #include + #include + #include + #include "libeu.h" + #include "color.h" ++#include "system.h" + + /* Prototype for option handler. */ + static error_t parse_opt (int key, char *arg, struct argp_state *state); +diff --git a/lib/fixedsizehash.h b/lib/fixedsizehash.h +index dac2a5f5..43016fc3 100644 +--- a/lib/fixedsizehash.h ++++ b/lib/fixedsizehash.h +@@ -30,7 +30,6 @@ + #include + #include + #include +-#include + + #include + +diff --git a/lib/system.h b/lib/system.h +index 92033355..1a601319 100644 +--- a/lib/system.h ++++ b/lib/system.h +@@ -50,6 +50,16 @@ + #else + # error "Unknown byte order" + #endif ++#ifndef TEMP_FAILURE_RETRY ++#define TEMP_FAILURE_RETRY(expression) \ ++ (__extension__ \ ++ ({ long int __result; \ ++ do __result = (long int) (expression); \ ++ while (__result == -1L && errno == EINTR); \ ++ __result; })) ++#endif ++ ++#define error(status, errno, ...) err(status, __VA_ARGS__) + + #ifndef MAX + #define MAX(m, n) ((m) < (n) ? (n) : (m)) +diff --git a/lib/xmalloc.c b/lib/xmalloc.c +index 0cde384f..217b0541 100644 +--- a/lib/xmalloc.c ++++ b/lib/xmalloc.c +@@ -30,7 +30,7 @@ + # include + #endif + +-#include ++#include + #include + #include + #include +diff --git a/libasm/asm_end.c b/libasm/asm_end.c +index ced24f50..4ad918c4 100644 +--- a/libasm/asm_end.c ++++ b/libasm/asm_end.c +@@ -32,7 +32,7 @@ + #endif + + #include +-#include ++#include + #include + #include + #include +diff --git a/libasm/asm_newscn.c b/libasm/asm_newscn.c +index ddbb25df..74a598d9 100644 +--- a/libasm/asm_newscn.c ++++ b/libasm/asm_newscn.c +@@ -32,7 +32,7 @@ + #endif + + #include +-#include ++#include + #include + #include + #include +diff --git a/libcpu/i386_gendis.c b/libcpu/i386_gendis.c +index aae5eae6..6d760165 100644 +--- a/libcpu/i386_gendis.c ++++ b/libcpu/i386_gendis.c +@@ -31,7 +31,7 @@ + # include + #endif + +-#include ++#include + #include + #include + #include +diff --git a/libcpu/i386_lex.c b/libcpu/i386_lex.c +index ba5f4aa5..b1e41916 100644 +--- a/libcpu/i386_lex.c ++++ b/libcpu/i386_lex.c +@@ -577,7 +577,7 @@ char *i386_text; + #endif + + #include +-#include ++#include + #include + + #include +diff --git a/libcpu/i386_parse.c b/libcpu/i386_parse.c +index 6fa7ce3d..bb270061 100644 +--- a/libcpu/i386_parse.c ++++ b/libcpu/i386_parse.c +@@ -107,7 +107,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + #include +diff --git a/libdw/Makefile.am b/libdw/Makefile.am +index ff8c291e..89e792aa 100644 +--- a/libdw/Makefile.am ++++ b/libdw/Makefile.am +@@ -105,7 +105,8 @@ am_libdw_pic_a_OBJECTS = $(libdw_a_SOURCES:.c=.os) + libdw_so_LIBS = libdw_pic.a ../libdwelf/libdwelf_pic.a \ + ../libdwfl/libdwfl_pic.a ../libebl/libebl.a + libdw_so_DEPS = ../lib/libeu.a ../libelf/libelf.so +-libdw_so_LDLIBS = $(libdw_so_DEPS) -ldl -lz $(argp_LDADD) $(zip_LIBS) ++fts_LDADD = -lfts ++libdw_so_LDLIBS = $(libdw_so_DEPS) -ldl -lz $(argp_LDADD) $(zip_LIBS) $(fts_LDADD) + libdw_so_SOURCES = + libdw.so$(EXEEXT): $(srcdir)/libdw.map $(libdw_so_LIBS) $(libdw_so_DEPS) + # The rpath is necessary for libebl because its $ORIGIN use will +diff --git a/libdw/libdw_alloc.c b/libdw/libdw_alloc.c +index 28a8cf6e..29aeb3f7 100644 +--- a/libdw/libdw_alloc.c ++++ b/libdw/libdw_alloc.c +@@ -31,7 +31,7 @@ + # include + #endif + +-#include ++#include + #include + #include + #include "libdwP.h" +diff --git a/libdwfl/dwfl_build_id_find_elf.c b/libdwfl/dwfl_build_id_find_elf.c +index ee0c1646..b06ab596 100644 +--- a/libdwfl/dwfl_build_id_find_elf.c ++++ b/libdwfl/dwfl_build_id_find_elf.c +@@ -31,6 +31,7 @@ + #endif + + #include "libdwflP.h" ++#include "system.h" + #include + #include + #include +@@ -99,7 +100,7 @@ __libdwfl_open_by_build_id (Dwfl_Module *mod, bool debug, char **file_name, + { + if (*file_name != NULL) + free (*file_name); +- *file_name = canonicalize_file_name (name); ++ *file_name = realpath (name, NULL); + if (*file_name == NULL) + { + *file_name = name; +diff --git a/libdwfl/dwfl_error.c b/libdwfl/dwfl_error.c +index 7bcf61cc..c345797a 100644 +--- a/libdwfl/dwfl_error.c ++++ b/libdwfl/dwfl_error.c +@@ -140,6 +140,7 @@ __libdwfl_seterrno (Dwfl_Error error) + const char * + dwfl_errmsg (int error) + { ++ static __thread char s[64] = ""; + if (error == 0 || error == -1) + { + int last_error = global_error; +@@ -154,7 +155,8 @@ dwfl_errmsg (int error) + switch (error &~ 0xffff) + { + case OTHER_ERROR (ERRNO): +- return strerror_r (error & 0xffff, "bad", 0); ++ strerror_r (error & 0xffff, s, sizeof(s)); ++ return s; + case OTHER_ERROR (LIBELF): + return elf_errmsg (error & 0xffff); + case OTHER_ERROR (LIBDW): +diff --git a/libdwfl/dwfl_module_getdwarf.c b/libdwfl/dwfl_module_getdwarf.c +index 9775aced..511c4a6a 100644 +--- a/libdwfl/dwfl_module_getdwarf.c ++++ b/libdwfl/dwfl_module_getdwarf.c +@@ -35,6 +35,7 @@ + #include + #include + #include ++#include "system.h" + #include "../libdw/libdwP.h" /* DWARF_E_* values are here. */ + #include "../libelf/libelfP.h" + #include "system.h" +diff --git a/libdwfl/find-debuginfo.c b/libdwfl/find-debuginfo.c +index 6d5a42a6..9267788d 100644 +--- a/libdwfl/find-debuginfo.c ++++ b/libdwfl/find-debuginfo.c +@@ -389,7 +389,7 @@ dwfl_standard_find_debuginfo (Dwfl_Module *mod, + /* If FILE_NAME is a symlink, the debug file might be associated + with the symlink target name instead. */ + +- char *canon = canonicalize_file_name (file_name); ++ char *canon = realpath (file_name, NULL); + if (canon != NULL && strcmp (file_name, canon)) + fd = find_debuginfo_in_path (mod, canon, + debuglink_file, debuglink_crc, +diff --git a/libdwfl/libdwfl_crc32_file.c b/libdwfl/libdwfl_crc32_file.c +index f849128d..6f0aca1b 100644 +--- a/libdwfl/libdwfl_crc32_file.c ++++ b/libdwfl/libdwfl_crc32_file.c +@@ -29,6 +29,15 @@ + # include + #endif + ++#ifndef TEMP_FAILURE_RETRY ++#define TEMP_FAILURE_RETRY(expression) \ ++ (__extension__ \ ++ ({ long int __result; \ ++ do __result = (long int) (expression); \ ++ while (__result == -1L && errno == EINTR); \ ++ __result; })) ++#endif ++ + #define crc32_file attribute_hidden __libdwfl_crc32_file + #define crc32 __libdwfl_crc32 + #include +diff --git a/libdwfl/linux-kernel-modules.c b/libdwfl/linux-kernel-modules.c +index 9d0fef2c..9fc09b88 100644 +--- a/libdwfl/linux-kernel-modules.c ++++ b/libdwfl/linux-kernel-modules.c +@@ -40,6 +40,7 @@ + #include + + #include "libdwflP.h" ++#include "system.h" + #include + #include + #include +diff --git a/libebl/eblopenbackend.c b/libebl/eblopenbackend.c +index 53713963..2e66dfdd 100644 +--- a/libebl/eblopenbackend.c ++++ b/libebl/eblopenbackend.c +@@ -32,7 +32,7 @@ + + #include + #include +-#include ++#include + #include + #include + #include +diff --git a/libelf/elf.h b/libelf/elf.h +index 5cf2b934..990b3afb 100644 +--- a/libelf/elf.h ++++ b/libelf/elf.h +@@ -21,7 +21,9 @@ + + #include + +-__BEGIN_DECLS ++#ifdef __cplusplus ++extern "C" { ++#endif + + /* Standard ELF types. */ + +@@ -3705,6 +3707,8 @@ enum + #define R_BPF_NONE 0 /* No reloc */ + #define R_BPF_MAP_FD 1 /* Map fd to pointer */ + +-__END_DECLS ++#ifdef __cplusplus ++} ++#endif + + #endif /* elf.h */ +diff --git a/libelf/libelf.h b/libelf/libelf.h +index 547c0f50..dd78799e 100644 +--- a/libelf/libelf.h ++++ b/libelf/libelf.h +@@ -29,6 +29,7 @@ + #ifndef _LIBELF_H + #define _LIBELF_H 1 + ++#include + #include + #include + +diff --git a/libelf/libelfP.h b/libelf/libelfP.h +index 7ee6625a..58408997 100644 +--- a/libelf/libelfP.h ++++ b/libelf/libelfP.h +@@ -32,6 +32,7 @@ + + #include + #include ++#include + + #include + #include +diff --git a/src/addr2line.c b/src/addr2line.c +index 444ee52c..9596fa67 100644 +--- a/src/addr2line.c ++++ b/src/addr2line.c +@@ -23,7 +23,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + #include +diff --git a/src/ar.c b/src/ar.c +index ec32cee5..4efd729c 100644 +--- a/src/ar.c ++++ b/src/ar.c +@@ -22,7 +22,7 @@ + + #include + #include +-#include ++#include + #include + #include + #include +diff --git a/src/arlib.c b/src/arlib.c +index e0839aab..1143658f 100644 +--- a/src/arlib.c ++++ b/src/arlib.c +@@ -21,7 +21,7 @@ + #endif + + #include +-#include ++#include + #include + #include + #include +diff --git a/src/arlib2.c b/src/arlib2.c +index 553fc57b..46443d0e 100644 +--- a/src/arlib2.c ++++ b/src/arlib2.c +@@ -20,7 +20,7 @@ + # include + #endif + +-#include ++#include + #include + #include + #include +diff --git a/src/elfcmp.c b/src/elfcmp.c +index 50464207..cff183fa 100644 +--- a/src/elfcmp.c ++++ b/src/elfcmp.c +@@ -23,7 +23,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + #include +diff --git a/src/elflint.c b/src/elflint.c +index df1b3a03..67d8d134 100644 +--- a/src/elflint.c ++++ b/src/elflint.c +@@ -24,7 +24,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + #include +diff --git a/src/findtextrel.c b/src/findtextrel.c +index 8f1e239a..71463af3 100644 +--- a/src/findtextrel.c ++++ b/src/findtextrel.c +@@ -23,7 +23,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + #include +diff --git a/src/nm.c b/src/nm.c +index 969c6d35..3113c04c 100644 +--- a/src/nm.c ++++ b/src/nm.c +@@ -26,7 +26,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + #include +diff --git a/src/objdump.c b/src/objdump.c +index 0dd9a6aa..9c8bf149 100644 +--- a/src/objdump.c ++++ b/src/objdump.c +@@ -21,7 +21,7 @@ + #endif + + #include +-#include ++#include + #include + #include + #include +diff --git a/src/ranlib.c b/src/ranlib.c +index cc0ee233..ae851e40 100644 +--- a/src/ranlib.c ++++ b/src/ranlib.c +@@ -24,7 +24,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + #include +diff --git a/src/readelf.c b/src/readelf.c +index 6a27e7e0..4759a965 100644 +--- a/src/readelf.c ++++ b/src/readelf.c +@@ -25,7 +25,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + #include +diff --git a/src/size.c b/src/size.c +index ad8dbcbb..fd83be06 100644 +--- a/src/size.c ++++ b/src/size.c +@@ -21,7 +21,7 @@ + #endif + + #include +-#include ++#include + #include + #include + #include +diff --git a/src/stack.c b/src/stack.c +index 6f2ff69f..6da0243d 100644 +--- a/src/stack.c ++++ b/src/stack.c +@@ -18,7 +18,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + #include +diff --git a/src/strings.c b/src/strings.c +index 03d0f133..5c311cbd 100644 +--- a/src/strings.c ++++ b/src/strings.c +@@ -25,7 +25,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + #include +diff --git a/src/strip.c b/src/strip.c +index c7830ec6..0d7f148d 100644 +--- a/src/strip.c ++++ b/src/strip.c +@@ -24,7 +24,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + #include +diff --git a/src/unstrip.c b/src/unstrip.c +index 50749093..3d4f9525 100644 +--- a/src/unstrip.c ++++ b/src/unstrip.c +@@ -31,7 +31,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + #include +diff --git a/tests/addrscopes.c b/tests/addrscopes.c +index 791569f5..54f4311b 100644 +--- a/tests/addrscopes.c ++++ b/tests/addrscopes.c +@@ -25,7 +25,7 @@ + #include + #include + #include +-#include ++#include + #include + + +diff --git a/tests/allregs.c b/tests/allregs.c +index 286f7e3c..c9de0897 100644 +--- a/tests/allregs.c ++++ b/tests/allregs.c +@@ -21,7 +21,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + #include +diff --git a/tests/backtrace-data.c b/tests/backtrace-data.c +index a387d8ff..955c27d1 100644 +--- a/tests/backtrace-data.c ++++ b/tests/backtrace-data.c +@@ -27,7 +27,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + #if defined(__x86_64__) && defined(__linux__) +diff --git a/tests/backtrace-dwarf.c b/tests/backtrace-dwarf.c +index 2dc8a9a2..24ca7fb0 100644 +--- a/tests/backtrace-dwarf.c ++++ b/tests/backtrace-dwarf.c +@@ -22,7 +22,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + #include +diff --git a/tests/backtrace.c b/tests/backtrace.c +index f5dd761f..a93a8f03 100644 +--- a/tests/backtrace.c ++++ b/tests/backtrace.c +@@ -24,7 +24,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + #ifdef __linux__ +diff --git a/tests/buildid.c b/tests/buildid.c +index 87c18773..2953e6bb 100644 +--- a/tests/buildid.c ++++ b/tests/buildid.c +@@ -23,7 +23,7 @@ + #include ELFUTILS_HEADER(elf) + #include ELFUTILS_HEADER(dwelf) + #include +-#include ++#include + #include + #include + #include +diff --git a/tests/debugaltlink.c b/tests/debugaltlink.c +index 6d97d500..ee7e559e 100644 +--- a/tests/debugaltlink.c ++++ b/tests/debugaltlink.c +@@ -23,7 +23,7 @@ + #include ELFUTILS_HEADER(dw) + #include ELFUTILS_HEADER(dwelf) + #include +-#include ++#include + #include + #include + #include +diff --git a/tests/debuglink.c b/tests/debuglink.c +index 935d1029..741cb814 100644 +--- a/tests/debuglink.c ++++ b/tests/debuglink.c +@@ -21,7 +21,7 @@ + #include + #include ELFUTILS_HEADER(dwelf) + #include +-#include ++#include + #include + #include + #include +diff --git a/tests/deleted.c b/tests/deleted.c +index 6be35bc2..01907113 100644 +--- a/tests/deleted.c ++++ b/tests/deleted.c +@@ -21,7 +21,7 @@ + #include + #include + #include +-#include ++#include + #include + #ifdef __linux__ + #include +diff --git a/tests/dwfl-addr-sect.c b/tests/dwfl-addr-sect.c +index 21e470a3..1ea1e3b2 100644 +--- a/tests/dwfl-addr-sect.c ++++ b/tests/dwfl-addr-sect.c +@@ -23,7 +23,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + #include ELFUTILS_HEADER(dwfl) +diff --git a/tests/dwfl-bug-addr-overflow.c b/tests/dwfl-bug-addr-overflow.c +index aa8030e1..02c8bef9 100644 +--- a/tests/dwfl-bug-addr-overflow.c ++++ b/tests/dwfl-bug-addr-overflow.c +@@ -20,7 +20,7 @@ + #include + #include + #include +-#include ++#include + #include + #include ELFUTILS_HEADER(dwfl) + +diff --git a/tests/dwfl-bug-fd-leak.c b/tests/dwfl-bug-fd-leak.c +index 689cdd79..5973da39 100644 +--- a/tests/dwfl-bug-fd-leak.c ++++ b/tests/dwfl-bug-fd-leak.c +@@ -24,7 +24,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + +diff --git a/tests/dwfl-bug-getmodules.c b/tests/dwfl-bug-getmodules.c +index 1ee989f8..fd62e653 100644 +--- a/tests/dwfl-bug-getmodules.c ++++ b/tests/dwfl-bug-getmodules.c +@@ -18,7 +18,7 @@ + #include + #include ELFUTILS_HEADER(dwfl) + +-#include ++#include + + static const Dwfl_Callbacks callbacks = + { +diff --git a/tests/dwfl-report-elf-align.c b/tests/dwfl-report-elf-align.c +index a4e97d3c..f471587c 100644 +--- a/tests/dwfl-report-elf-align.c ++++ b/tests/dwfl-report-elf-align.c +@@ -20,7 +20,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + #include +diff --git a/tests/dwfllines.c b/tests/dwfllines.c +index 90379dd2..cbdf6c4c 100644 +--- a/tests/dwfllines.c ++++ b/tests/dwfllines.c +@@ -27,7 +27,7 @@ + #include + #include + #include +-#include ++#include + + int + main (int argc, char *argv[]) +diff --git a/tests/dwflmodtest.c b/tests/dwflmodtest.c +index 0027f96b..e68d3bca 100644 +--- a/tests/dwflmodtest.c ++++ b/tests/dwflmodtest.c +@@ -23,7 +23,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + #include ELFUTILS_HEADER(dwfl) +diff --git a/tests/dwflsyms.c b/tests/dwflsyms.c +index 49ac3346..cf078301 100644 +--- a/tests/dwflsyms.c ++++ b/tests/dwflsyms.c +@@ -25,7 +25,7 @@ + #include + #include + #include +-#include ++#include + #include + + static const char * +diff --git a/tests/early-offscn.c b/tests/early-offscn.c +index 924cb9ef..6f60d5a3 100644 +--- a/tests/early-offscn.c ++++ b/tests/early-offscn.c +@@ -19,7 +19,7 @@ + #endif + + #include +-#include ++#include + #include + #include + #include +diff --git a/tests/ecp.c b/tests/ecp.c +index 38a6859e..743cea5d 100644 +--- a/tests/ecp.c ++++ b/tests/ecp.c +@@ -20,7 +20,7 @@ + #endif + + #include +-#include ++#include + #include + #include + #include +diff --git a/tests/find-prologues.c b/tests/find-prologues.c +index ba8ae371..76f5f047 100644 +--- a/tests/find-prologues.c ++++ b/tests/find-prologues.c +@@ -25,7 +25,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + +diff --git a/tests/funcretval.c b/tests/funcretval.c +index 8d19d117..c8aaa93d 100644 +--- a/tests/funcretval.c ++++ b/tests/funcretval.c +@@ -25,7 +25,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + +diff --git a/tests/funcscopes.c b/tests/funcscopes.c +index 9c901858..dbccb89e 100644 +--- a/tests/funcscopes.c ++++ b/tests/funcscopes.c +@@ -25,7 +25,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + +diff --git a/tests/getsrc_die.c b/tests/getsrc_die.c +index 055aede0..9c394dd0 100644 +--- a/tests/getsrc_die.c ++++ b/tests/getsrc_die.c +@@ -19,7 +19,7 @@ + #endif + + #include +-#include ++#include + #include + #include + #include +diff --git a/tests/line2addr.c b/tests/line2addr.c +index e0d65d3d..9bf0023b 100644 +--- a/tests/line2addr.c ++++ b/tests/line2addr.c +@@ -26,7 +26,7 @@ + #include + #include + #include +-#include ++#include + + + static void +diff --git a/tests/low_high_pc.c b/tests/low_high_pc.c +index d0f43023..8da4fbdf 100644 +--- a/tests/low_high_pc.c ++++ b/tests/low_high_pc.c +@@ -25,7 +25,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + +diff --git a/tests/md5-sha1-test.c b/tests/md5-sha1-test.c +index d50355e9..3c41f40b 100644 +--- a/tests/md5-sha1-test.c ++++ b/tests/md5-sha1-test.c +@@ -19,7 +19,7 @@ + #endif + + #include +-#include ++#include + + #include "md5.h" + #include "sha1.h" +diff --git a/tests/rdwrmmap.c b/tests/rdwrmmap.c +index 6f027dfe..1ce5e6ed 100644 +--- a/tests/rdwrmmap.c ++++ b/tests/rdwrmmap.c +@@ -19,7 +19,7 @@ + #endif + + #include +-#include ++#include + #include + #include + #include +diff --git a/tests/saridx.c b/tests/saridx.c +index 8a450d82..b3878013 100644 +--- a/tests/saridx.c ++++ b/tests/saridx.c +@@ -17,7 +17,7 @@ + + #include + +-#include ++#include + #include + #include + #include +diff --git a/tests/sectiondump.c b/tests/sectiondump.c +index 3033fedc..8e888db3 100644 +--- a/tests/sectiondump.c ++++ b/tests/sectiondump.c +@@ -18,7 +18,7 @@ + #include + + #include +-#include ++#include + #include + #include + #include +diff --git a/tests/varlocs.c b/tests/varlocs.c +index c3fba89e..e043ea2c 100644 +--- a/tests/varlocs.c ++++ b/tests/varlocs.c +@@ -25,7 +25,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + #include +diff --git a/tests/vdsosyms.c b/tests/vdsosyms.c +index b876c10b..afb28232 100644 +--- a/tests/vdsosyms.c ++++ b/tests/vdsosyms.c +@@ -18,7 +18,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + #include diff --git a/poky/meta/recipes-devtools/elfutils/files/debian/0001-Ignore-differences-between-mips-machine-identifiers.patch b/poky/meta/recipes-devtools/elfutils/files/debian/0001-Ignore-differences-between-mips-machine-identifiers.patch new file mode 100644 index 000000000..e0291b4cf --- /dev/null +++ b/poky/meta/recipes-devtools/elfutils/files/debian/0001-Ignore-differences-between-mips-machine-identifiers.patch @@ -0,0 +1,35 @@ +From 77cb4a53c270d5854d3af24f19547bc3de825233 Mon Sep 17 00:00:00 2001 +From: James Cowgill +Date: Mon, 5 Jan 2015 15:16:58 +0000 +Subject: [PATCH 1/3] Ignore differences between mips machine identifiers + +Little endian binaries actually use EM_MIPS so you can't tell the endianness +from the elf machine id. Also, the EM_MIPS_RS3_LE machine is dead anyway (the +kernel will not load binaries containing it). + +Signed-off-by: James Cowgill + +Upstream-Status: Backport [from debian] +Signed-off-by: Hongxu Jia + +--- + backends/mips_init.c | 6 +----- + 1 file changed, 1 insertion(+), 5 deletions(-) + +Index: b/backends/mips_init.c +=================================================================== +--- a/backends/mips_init.c ++++ b/backends/mips_init.c +@@ -45,11 +45,7 @@ mips_init (Elf *elf __attribute__ ((unus + return NULL; + + /* We handle it. */ +- if (machine == EM_MIPS) +- eh->name = "MIPS R3000 big-endian"; +- else if (machine == EM_MIPS_RS3_LE) +- eh->name = "MIPS R3000 little-endian"; +- ++ eh->name = "MIPS"; + mips_init_reloc (eh); + HOOK (eh, reloc_simple_type); + HOOK (eh, return_value_location); diff --git a/poky/meta/recipes-devtools/elfutils/files/debian/0002-Add-support-for-mips64-abis-in-mips_retval.c.patch b/poky/meta/recipes-devtools/elfutils/files/debian/0002-Add-support-for-mips64-abis-in-mips_retval.c.patch new file mode 100644 index 000000000..b17498f5f --- /dev/null +++ b/poky/meta/recipes-devtools/elfutils/files/debian/0002-Add-support-for-mips64-abis-in-mips_retval.c.patch @@ -0,0 +1,171 @@ +From fdaab18a65ed2529656baa64cb6169f34d7e507b Mon Sep 17 00:00:00 2001 +From: James Cowgill +Date: Mon, 5 Jan 2015 15:17:01 +0000 +Subject: [PATCH 2/3] Add support for mips64 abis in mips_retval.c + +Signed-off-by: James Cowgill + +Upstream-Status: Backport [from debian] +Signed-off-by: Hongxu Jia +--- + backends/mips_retval.c | 104 ++++++++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 94 insertions(+), 10 deletions(-) + +diff --git a/backends/mips_retval.c b/backends/mips_retval.c +index 33f12a7..d5c6ef0 100644 +--- a/backends/mips_retval.c ++++ b/backends/mips_retval.c +@@ -91,6 +91,8 @@ enum mips_abi find_mips_abi(Elf *elf) + default: + if ((elf_flags & EF_MIPS_ABI2)) + return MIPS_ABI_N32; ++ else if ((ehdr->e_ident[EI_CLASS] == ELFCLASS64)) ++ return MIPS_ABI_N64; + } + + /* GCC creates a pseudo-section whose name describes the ABI. */ +@@ -195,6 +197,57 @@ static const Dwarf_Op loc_aggregate[] = + }; + #define nloc_aggregate 1 + ++/* Test if a struct member is a float */ ++static int is_float_child(Dwarf_Die *childdie) ++{ ++ /* Test if this is actually a struct member */ ++ if (dwarf_tag(childdie) != DW_TAG_member) ++ return 0; ++ ++ /* Get type of member */ ++ Dwarf_Attribute attr_mem; ++ Dwarf_Die child_type_mem; ++ Dwarf_Die *child_typedie = ++ dwarf_formref_die(dwarf_attr_integrate(childdie, ++ DW_AT_type, ++ &attr_mem), &child_type_mem); ++ ++ if (dwarf_tag(child_typedie) != DW_TAG_base_type) ++ return 0; ++ ++ /* Get base subtype */ ++ Dwarf_Word encoding; ++ if (dwarf_formudata (dwarf_attr_integrate (child_typedie, ++ DW_AT_encoding, ++ &attr_mem), &encoding) != 0) ++ return 0; ++ ++ return encoding == DW_ATE_float; ++} ++ ++/* Returns the number of fpregs which can be returned in the given struct */ ++static int get_struct_fpregs(Dwarf_Die *structtypedie) ++{ ++ Dwarf_Die child_mem; ++ int fpregs = 0; ++ ++ /* Get first structure member */ ++ if (dwarf_child(structtypedie, &child_mem) != 0) ++ return 0; ++ ++ do ++ { ++ /* Ensure this register is a float */ ++ if (!is_float_child(&child_mem)) ++ return 0; ++ ++ fpregs++; ++ } ++ while (dwarf_siblingof (&child_mem, &child_mem) == 0); ++ ++ return fpregs; ++} ++ + int + mips_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp) + { +@@ -240,6 +293,7 @@ mips_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp) + tag = dwarf_tag (typedie); + } + ++ Dwarf_Word size; + switch (tag) + { + case -1: +@@ -258,8 +312,6 @@ mips_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp) + case DW_TAG_enumeration_type: + case DW_TAG_pointer_type: + case DW_TAG_ptr_to_member_type: +- { +- Dwarf_Word size; + if (dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_byte_size, + &attr_mem), &size) != 0) + { +@@ -289,7 +341,7 @@ mips_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp) + if (size <= 4*regsize && abi == MIPS_ABI_O32) + return nloc_fpregquad; + +- goto aggregate; ++ goto large; + } + } + *locp = ABI_LOC(loc_intreg, regsize); +@@ -298,18 +350,50 @@ mips_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp) + if (size <= 2*regsize) + return nloc_intregpair; + +- /* Else fall through. Shouldn't happen though (at least with gcc) */ +- } ++ /* Else pass in memory. Shouldn't happen though (at least with gcc) */ ++ goto large; + + case DW_TAG_structure_type: + case DW_TAG_class_type: + case DW_TAG_union_type: +- case DW_TAG_array_type: +- aggregate: +- /* XXX TODO: Can't handle structure return with other ABI's yet :-/ */ +- if ((abi != MIPS_ABI_O32) && (abi != MIPS_ABI_O64)) +- return -2; ++ /* Handle special cases for structures <= 128 bytes in newer ABIs */ ++ if (abi == MIPS_ABI_EABI32 || abi == MIPS_ABI_EABI64 || ++ abi == MIPS_ABI_N32 || abi == MIPS_ABI_N64) ++ { ++ if (dwarf_aggregate_size (typedie, &size) == 0 && size <= 16) ++ { ++ /* ++ * Special case in N64 / N32 - ++ * structures containing only floats are returned in fp regs. ++ * Everything else is returned in integer regs. ++ */ ++ if (tag != DW_TAG_union_type && ++ (abi == MIPS_ABI_N32 || abi == MIPS_ABI_N64)) ++ { ++ int num_fpregs = get_struct_fpregs(typedie); ++ if (num_fpregs == 1 || num_fpregs == 2) ++ { ++ *locp = loc_fpreg; ++ if (num_fpregs == 1) ++ return nloc_fpreg; ++ else ++ return nloc_fpregpair; ++ } ++ } ++ ++ *locp = loc_intreg; ++ if (size <= 8) ++ return nloc_intreg; ++ else ++ return nloc_intregpair; ++ } ++ } ++ ++ /* Fallthrough to handle large types */ + ++ case DW_TAG_array_type: ++ large: ++ /* Return large structures in memory */ + *locp = loc_aggregate; + return nloc_aggregate; + } +-- +2.1.4 + diff --git a/poky/meta/recipes-devtools/elfutils/files/debian/0003-Add-mips-n64-relocation-format-hack.patch b/poky/meta/recipes-devtools/elfutils/files/debian/0003-Add-mips-n64-relocation-format-hack.patch new file mode 100644 index 000000000..2a5f8628d --- /dev/null +++ b/poky/meta/recipes-devtools/elfutils/files/debian/0003-Add-mips-n64-relocation-format-hack.patch @@ -0,0 +1,229 @@ +From 59d4b8c48e5040af7e02b34eb26ea602ec82a38e Mon Sep 17 00:00:00 2001 +From: James Cowgill +Date: Mon, 5 Jan 2015 15:17:02 +0000 +Subject: [PATCH 3/3] Add mips n64 relocation format hack + +MIPSEL N64 ELF files use a slightly different format for storing relocation +entries which is incompatible with the normal R_SYM / R_INFO macros. +To workaround this, we rearrange the bytes in the relocation's r_info field +when reading and writing the relocations. + +This patch also ensures that strip.c sets the correct value of e_machine +before manipulating relocations so that these changes take effect. + +Signed-off-by: James Cowgill + +Upstream-Status: Backport [from debian] +Signed-off-by: Hongxu Jia +--- + libelf/gelf_getrel.c | 25 +++++++++++++++++++++++-- + libelf/gelf_getrela.c | 25 +++++++++++++++++++++++-- + libelf/gelf_update_rel.c | 20 +++++++++++++++++++- + libelf/gelf_update_rela.c | 20 +++++++++++++++++++- + src/strip.c | 17 +++++++++++++++++ + 5 files changed, 101 insertions(+), 6 deletions(-) + +Index: b/libelf/gelf_getrel.c +=================================================================== +--- a/libelf/gelf_getrel.c ++++ b/libelf/gelf_getrel.c +@@ -36,6 +36,7 @@ + + #include "libelfP.h" + ++#define EF_MIPS_ABI 0x0000F000 + + GElf_Rel * + gelf_getrel (Elf_Data *data, int ndx, GElf_Rel *dst) +@@ -89,8 +90,28 @@ gelf_getrel (Elf_Data *data, int ndx, GE + result = NULL; + } + else +- result = memcpy (dst, &((Elf64_Rel *) data_scn->d.d_buf)[ndx], +- sizeof (Elf64_Rel)); ++ { ++ GElf_Ehdr hdr; ++ result = memcpy (dst, &((Elf64_Rel *) data_scn->d.d_buf)[ndx], ++ sizeof (Elf64_Rel)); ++ ++ if (gelf_getehdr(scn->elf, &hdr) != NULL && ++ hdr.e_ident[EI_DATA] == ELFDATA2LSB && ++ hdr.e_machine == EM_MIPS && ++ (hdr.e_flags & EF_MIPS_ABI) == 0) ++ { ++ /* ++ * The relocation format is mangled on MIPSEL N64 ++ * We'll adjust it so at least R_SYM will work on it ++ */ ++ GElf_Xword r_info = dst->r_info; ++ dst->r_info = (r_info << 32) | ++ ((r_info >> 8) & 0xFF000000) | ++ ((r_info >> 24) & 0x00FF0000) | ++ ((r_info >> 40) & 0x0000FF00) | ++ ((r_info >> 56) & 0x000000FF); ++ } ++ } + } + + rwlock_unlock (scn->elf->lock); +Index: b/libelf/gelf_getrela.c +=================================================================== +--- a/libelf/gelf_getrela.c ++++ b/libelf/gelf_getrela.c +@@ -36,6 +36,7 @@ + + #include "libelfP.h" + ++#define EF_MIPS_ABI 0x0000F000 + + GElf_Rela * + gelf_getrela (Elf_Data *data, int ndx, GElf_Rela *dst) +@@ -90,8 +91,28 @@ gelf_getrela (Elf_Data *data, int ndx, G + result = NULL; + } + else +- result = memcpy (dst, &((Elf64_Rela *) data_scn->d.d_buf)[ndx], +- sizeof (Elf64_Rela)); ++ { ++ GElf_Ehdr hdr; ++ result = memcpy (dst, &((Elf64_Rela *) data_scn->d.d_buf)[ndx], ++ sizeof (Elf64_Rela)); ++ ++ if (gelf_getehdr(scn->elf, &hdr) != NULL && ++ hdr.e_ident[EI_DATA] == ELFDATA2LSB && ++ hdr.e_machine == EM_MIPS && ++ (hdr.e_flags & EF_MIPS_ABI) == 0) ++ { ++ /* ++ * The relocation format is mangled on MIPSEL N64 ++ * We'll adjust it so at least R_SYM will work on it ++ */ ++ GElf_Xword r_info = dst->r_info; ++ dst->r_info = (r_info << 32) | ++ ((r_info >> 8) & 0xFF000000) | ++ ((r_info >> 24) & 0x00FF0000) | ++ ((r_info >> 40) & 0x0000FF00) | ++ ((r_info >> 56) & 0x000000FF); ++ } ++ } + } + + rwlock_unlock (scn->elf->lock); +Index: b/libelf/gelf_update_rel.c +=================================================================== +--- a/libelf/gelf_update_rel.c ++++ b/libelf/gelf_update_rel.c +@@ -36,6 +36,7 @@ + + #include "libelfP.h" + ++#define EF_MIPS_ABI 0x0000F000 + + int + gelf_update_rel (Elf_Data *dst, int ndx, GElf_Rel *src) +@@ -86,6 +87,9 @@ gelf_update_rel (Elf_Data *dst, int ndx, + } + else + { ++ GElf_Ehdr hdr; ++ GElf_Rel value = *src; ++ + /* Check whether we have to resize the data buffer. */ + if (INVALID_NDX (ndx, Elf64_Rel, &data_scn->d)) + { +@@ -93,7 +97,21 @@ gelf_update_rel (Elf_Data *dst, int ndx, + goto out; + } + +- ((Elf64_Rel *) data_scn->d.d_buf)[ndx] = *src; ++ if (gelf_getehdr(scn->elf, &hdr) != NULL && ++ hdr.e_ident[EI_DATA] == ELFDATA2LSB && ++ hdr.e_machine == EM_MIPS && ++ (hdr.e_flags & EF_MIPS_ABI) == 0) ++ { ++ /* Undo the MIPSEL N64 hack from gelf_getrel */ ++ GElf_Xword r_info = value.r_info; ++ value.r_info = (r_info >> 32) | ++ ((r_info << 8) & 0x000000FF00000000) | ++ ((r_info << 24) & 0x0000FF0000000000) | ++ ((r_info << 40) & 0x00FF000000000000) | ++ ((r_info << 56) & 0xFF00000000000000); ++ } ++ ++ ((Elf64_Rel *) data_scn->d.d_buf)[ndx] = value; + } + + result = 1; +Index: b/libelf/gelf_update_rela.c +=================================================================== +--- a/libelf/gelf_update_rela.c ++++ b/libelf/gelf_update_rela.c +@@ -36,6 +36,7 @@ + + #include "libelfP.h" + ++#define EF_MIPS_ABI 0x0000F000 + + int + gelf_update_rela (Elf_Data *dst, int ndx, GElf_Rela *src) +@@ -89,6 +90,9 @@ gelf_update_rela (Elf_Data *dst, int ndx + } + else + { ++ GElf_Ehdr hdr; ++ GElf_Rela value = *src; ++ + /* Check whether we have to resize the data buffer. */ + if (INVALID_NDX (ndx, Elf64_Rela, &data_scn->d)) + { +@@ -96,7 +100,21 @@ gelf_update_rela (Elf_Data *dst, int ndx + goto out; + } + +- ((Elf64_Rela *) data_scn->d.d_buf)[ndx] = *src; ++ if (gelf_getehdr(scn->elf, &hdr) != NULL && ++ hdr.e_ident[EI_DATA] == ELFDATA2LSB && ++ hdr.e_machine == EM_MIPS && ++ (hdr.e_flags & EF_MIPS_ABI) == 0) ++ { ++ /* Undo the MIPSEL N64 hack from gelf_getrel */ ++ GElf_Xword r_info = value.r_info; ++ value.r_info = (r_info >> 32) | ++ ((r_info << 8) & 0x000000FF00000000) | ++ ((r_info << 24) & 0x0000FF0000000000) | ++ ((r_info << 40) & 0x00FF000000000000) | ++ ((r_info << 56) & 0xFF00000000000000); ++ } ++ ++ ((Elf64_Rela *) data_scn->d.d_buf)[ndx] = value; + } + + result = 1; +Index: b/src/strip.c +=================================================================== +--- a/src/strip.c ++++ b/src/strip.c +@@ -532,6 +532,23 @@ handle_elf (int fd, Elf *elf, const char + goto fail; + } + ++ /* Copy identity part of the ELF header now */ ++ newehdr = gelf_getehdr (newelf, &newehdr_mem); ++ if (newehdr == NULL) ++ INTERNAL_ERROR (fname); ++ ++ memcpy (newehdr->e_ident, ehdr->e_ident, EI_NIDENT); ++ newehdr->e_type = ehdr->e_type; ++ newehdr->e_machine = ehdr->e_machine; ++ newehdr->e_version = ehdr->e_version; ++ ++ if (gelf_update_ehdr (newelf, newehdr) == 0) ++ { ++ error (0, 0, gettext ("%s: error while creating ELF header: %s"), ++ fname, elf_errmsg (-1)); ++ return 1; ++ } ++ + /* Copy over the old program header if needed. */ + if (ehdr->e_type != ET_REL) + for (cnt = 0; cnt < phnum; ++cnt) diff --git a/poky/meta/recipes-devtools/elfutils/files/debian/arm_backend.diff b/poky/meta/recipes-devtools/elfutils/files/debian/arm_backend.diff new file mode 100644 index 000000000..50f4b059e --- /dev/null +++ b/poky/meta/recipes-devtools/elfutils/files/debian/arm_backend.diff @@ -0,0 +1,603 @@ +Upstream-Status: Backport [from debian] +Signed-off-by: Hongxu Jia + +Index: b/backends/arm_init.c +=================================================================== +--- a/backends/arm_init.c ++++ b/backends/arm_init.c +@@ -35,20 +35,31 @@ + #define RELOC_PREFIX R_ARM_ + #include "libebl_CPU.h" + ++#include "libebl_arm.h" ++ + /* This defines the common reloc hooks based on arm_reloc.def. */ + #include "common-reloc.c" + + + const char * +-arm_init (Elf *elf __attribute__ ((unused)), ++arm_init (Elf *elf, + GElf_Half machine __attribute__ ((unused)), + Ebl *eh, + size_t ehlen) + { ++ int soft_float = 0; ++ + /* Check whether the Elf_BH object has a sufficent size. */ + if (ehlen < sizeof (Ebl)) + return NULL; + ++ if (elf) { ++ GElf_Ehdr ehdr_mem; ++ GElf_Ehdr *ehdr = gelf_getehdr (elf, &ehdr_mem); ++ if (ehdr && (ehdr->e_flags & EF_ARM_SOFT_FLOAT)) ++ soft_float = 1; ++ } ++ + /* We handle it. */ + eh->name = "ARM"; + arm_init_reloc (eh); +@@ -60,7 +71,10 @@ arm_init (Elf *elf __attribute__ ((unuse + HOOK (eh, core_note); + HOOK (eh, auxv_info); + HOOK (eh, check_object_attribute); +- HOOK (eh, return_value_location); ++ if (soft_float) ++ eh->return_value_location = arm_return_value_location_soft; ++ else ++ eh->return_value_location = arm_return_value_location_hard; + HOOK (eh, abi_cfi); + HOOK (eh, check_reloc_target_type); + HOOK (eh, symbol_type_name); +Index: b/backends/arm_regs.c +=================================================================== +--- a/backends/arm_regs.c ++++ b/backends/arm_regs.c +@@ -31,6 +31,7 @@ + #endif + + #include ++#include + #include + + #define BACKEND arm_ +@@ -76,6 +77,9 @@ arm_register_info (Ebl *ebl __attribute_ + break; + + case 16 + 0 ... 16 + 7: ++ /* AADWARF says that there are no registers in that range, ++ * but gcc maps FPA registers here ++ */ + regno += 96 - 16; + /* Fall through. */ + case 96 + 0 ... 96 + 7: +@@ -87,11 +91,139 @@ arm_register_info (Ebl *ebl __attribute_ + namelen = 2; + break; + ++ case 64 + 0 ... 64 + 9: ++ *setname = "VFP"; ++ *bits = 32; ++ *type = DW_ATE_float; ++ name[0] = 's'; ++ name[1] = regno - 64 + '0'; ++ namelen = 2; ++ break; ++ ++ case 64 + 10 ... 64 + 31: ++ *setname = "VFP"; ++ *bits = 32; ++ *type = DW_ATE_float; ++ name[0] = 's'; ++ name[1] = (regno - 64) / 10 + '0'; ++ name[2] = (regno - 64) % 10 + '0'; ++ namelen = 3; ++ break; ++ ++ case 104 + 0 ... 104 + 7: ++ /* XXX TODO: ++ * This can be either intel wireless MMX general purpose/control ++ * registers or xscale accumulator, which have different usage. ++ * We only have the intel wireless MMX here now. ++ * The name needs to be changed for the xscale accumulator too. */ ++ *setname = "MMX"; ++ *type = DW_ATE_unsigned; ++ *bits = 32; ++ memcpy(name, "wcgr", 4); ++ name[4] = regno - 104 + '0'; ++ namelen = 5; ++ break; ++ ++ case 112 + 0 ... 112 + 9: ++ *setname = "MMX"; ++ *type = DW_ATE_unsigned; ++ *bits = 64; ++ name[0] = 'w'; ++ name[1] = 'r'; ++ name[2] = regno - 112 + '0'; ++ namelen = 3; ++ break; ++ ++ case 112 + 10 ... 112 + 15: ++ *setname = "MMX"; ++ *type = DW_ATE_unsigned; ++ *bits = 64; ++ name[0] = 'w'; ++ name[1] = 'r'; ++ name[2] = '1'; ++ name[3] = regno - 112 - 10 + '0'; ++ namelen = 4; ++ break; ++ + case 128: ++ *setname = "state"; + *type = DW_ATE_unsigned; + return stpcpy (name, "spsr") + 1 - name; + ++ case 129: ++ *setname = "state"; ++ *type = DW_ATE_unsigned; ++ return stpcpy(name, "spsr_fiq") + 1 - name; ++ ++ case 130: ++ *setname = "state"; ++ *type = DW_ATE_unsigned; ++ return stpcpy(name, "spsr_irq") + 1 - name; ++ ++ case 131: ++ *setname = "state"; ++ *type = DW_ATE_unsigned; ++ return stpcpy(name, "spsr_abt") + 1 - name; ++ ++ case 132: ++ *setname = "state"; ++ *type = DW_ATE_unsigned; ++ return stpcpy(name, "spsr_und") + 1 - name; ++ ++ case 133: ++ *setname = "state"; ++ *type = DW_ATE_unsigned; ++ return stpcpy(name, "spsr_svc") + 1 - name; ++ ++ case 144 ... 150: ++ *setname = "integer"; ++ *type = DW_ATE_signed; ++ *bits = 32; ++ return sprintf(name, "r%d_usr", regno - 144 + 8) + 1; ++ ++ case 151 ... 157: ++ *setname = "integer"; ++ *type = DW_ATE_signed; ++ *bits = 32; ++ return sprintf(name, "r%d_fiq", regno - 151 + 8) + 1; ++ ++ case 158 ... 159: ++ *setname = "integer"; ++ *type = DW_ATE_signed; ++ *bits = 32; ++ return sprintf(name, "r%d_irq", regno - 158 + 13) + 1; ++ ++ case 160 ... 161: ++ *setname = "integer"; ++ *type = DW_ATE_signed; ++ *bits = 32; ++ return sprintf(name, "r%d_abt", regno - 160 + 13) + 1; ++ ++ case 162 ... 163: ++ *setname = "integer"; ++ *type = DW_ATE_signed; ++ *bits = 32; ++ return sprintf(name, "r%d_und", regno - 162 + 13) + 1; ++ ++ case 164 ... 165: ++ *setname = "integer"; ++ *type = DW_ATE_signed; ++ *bits = 32; ++ return sprintf(name, "r%d_svc", regno - 164 + 13) + 1; ++ ++ case 192 ... 199: ++ *setname = "MMX"; ++ *bits = 32; ++ *type = DW_ATE_unsigned; ++ name[0] = 'w'; ++ name[1] = 'c'; ++ name[2] = regno - 192 + '0'; ++ namelen = 3; ++ break; ++ + case 256 + 0 ... 256 + 9: ++ /* XXX TODO: Neon also uses those registers and can contain ++ * both float and integers */ + *setname = "VFP"; + *type = DW_ATE_float; + *bits = 64; +Index: b/backends/arm_retval.c +=================================================================== +--- a/backends/arm_retval.c ++++ b/backends/arm_retval.c +@@ -48,6 +48,13 @@ static const Dwarf_Op loc_intreg[] = + #define nloc_intreg 1 + #define nloc_intregs(n) (2 * (n)) + ++/* f1 */ /* XXX TODO: f0 can also have number 96 if program was compiled with -mabi=aapcs */ ++static const Dwarf_Op loc_fpreg[] = ++ { ++ { .atom = DW_OP_reg16 }, ++ }; ++#define nloc_fpreg 1 ++ + /* The return value is a structure and is actually stored in stack space + passed in a hidden argument by the caller. But, the compiler + helpfully returns the address of that space in r0. */ +@@ -58,8 +65,9 @@ static const Dwarf_Op loc_aggregate[] = + #define nloc_aggregate 1 + + +-int +-arm_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp) ++static int ++arm_return_value_location_ (Dwarf_Die *functypedie, const Dwarf_Op **locp, ++ int soft_float) + { + /* Start with the function's type, and get the DW_AT_type attribute, + which is the type of the return value. */ +@@ -98,6 +106,21 @@ arm_return_value_location (Dwarf_Die *fu + else + return -1; + } ++ if (tag == DW_TAG_base_type) ++ { ++ Dwarf_Word encoding; ++ if (dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_encoding, ++ &attr_mem), &encoding) != 0) ++ return -1; ++ ++ if ((encoding == DW_ATE_float) && !soft_float) ++ { ++ *locp = loc_fpreg; ++ if (size <= 8) ++ return nloc_fpreg; ++ goto aggregate; ++ } ++ } + if (size <= 16) + { + intreg: +@@ -106,6 +129,7 @@ arm_return_value_location (Dwarf_Die *fu + } + + aggregate: ++ /* XXX TODO sometimes aggregates are returned in r0 (-mabi=aapcs) */ + *locp = loc_aggregate; + return nloc_aggregate; + } +@@ -125,3 +149,18 @@ arm_return_value_location (Dwarf_Die *fu + DWARF and might be valid. */ + return -2; + } ++ ++/* return location for -mabi=apcs-gnu -msoft-float */ ++int ++arm_return_value_location_soft (Dwarf_Die *functypedie, const Dwarf_Op **locp) ++{ ++ return arm_return_value_location_ (functypedie, locp, 1); ++} ++ ++/* return location for -mabi=apcs-gnu -mhard-float (current default) */ ++int ++arm_return_value_location_hard (Dwarf_Die *functypedie, const Dwarf_Op **locp) ++{ ++ return arm_return_value_location_ (functypedie, locp, 0); ++} ++ +Index: b/libelf/elf.h +=================================================================== +--- a/libelf/elf.h ++++ b/libelf/elf.h +@@ -2593,6 +2593,9 @@ enum + #define EF_ARM_EABI_VER4 0x04000000 + #define EF_ARM_EABI_VER5 0x05000000 + ++/* EI_OSABI values */ ++#define ELFOSABI_ARM_AEABI 64 /* Contains symbol versioning. */ ++ + /* Additional symbol types for Thumb. */ + #define STT_ARM_TFUNC STT_LOPROC /* A Thumb function. */ + #define STT_ARM_16BIT STT_HIPROC /* A Thumb label. */ +@@ -2610,12 +2613,19 @@ enum + + /* Processor specific values for the Phdr p_type field. */ + #define PT_ARM_EXIDX (PT_LOPROC + 1) /* ARM unwind segment. */ ++#define PT_ARM_UNWIND PT_ARM_EXIDX + + /* Processor specific values for the Shdr sh_type field. */ + #define SHT_ARM_EXIDX (SHT_LOPROC + 1) /* ARM unwind section. */ + #define SHT_ARM_PREEMPTMAP (SHT_LOPROC + 2) /* Preemption details. */ + #define SHT_ARM_ATTRIBUTES (SHT_LOPROC + 3) /* ARM attributes section. */ + ++/* Processor specific values for the Dyn d_tag field. */ ++#define DT_ARM_RESERVED1 (DT_LOPROC + 0) ++#define DT_ARM_SYMTABSZ (DT_LOPROC + 1) ++#define DT_ARM_PREEMTMAB (DT_LOPROC + 2) ++#define DT_ARM_RESERVED2 (DT_LOPROC + 3) ++#define DT_ARM_NUM 4 + + /* AArch64 relocs. */ + +@@ -2908,6 +2918,7 @@ enum + TLS block (LDR, STR). */ + #define R_ARM_TLS_IE12GP 111 /* 12 bit GOT entry relative + to GOT origin (LDR). */ ++/* 112 - 127 private range */ + #define R_ARM_ME_TOO 128 /* Obsolete. */ + #define R_ARM_THM_TLS_DESCSEQ 129 + #define R_ARM_THM_TLS_DESCSEQ16 129 +Index: b/backends/libebl_arm.h +=================================================================== +--- /dev/null ++++ b/backends/libebl_arm.h +@@ -0,0 +1,9 @@ ++#ifndef _LIBEBL_ARM_H ++#define _LIBEBL_ARM_H 1 ++ ++#include ++ ++extern int arm_return_value_location_soft(Dwarf_Die *, const Dwarf_Op **locp); ++extern int arm_return_value_location_hard(Dwarf_Die *, const Dwarf_Op **locp); ++ ++#endif +Index: b/tests/run-allregs.sh +=================================================================== +--- a/tests/run-allregs.sh ++++ b/tests/run-allregs.sh +@@ -2672,7 +2672,28 @@ integer registers: + 13: sp (sp), address 32 bits + 14: lr (lr), address 32 bits + 15: pc (pc), address 32 bits +- 128: spsr (spsr), unsigned 32 bits ++ 144: r8_usr (r8_usr), signed 32 bits ++ 145: r9_usr (r9_usr), signed 32 bits ++ 146: r10_usr (r10_usr), signed 32 bits ++ 147: r11_usr (r11_usr), signed 32 bits ++ 148: r12_usr (r12_usr), signed 32 bits ++ 149: r13_usr (r13_usr), signed 32 bits ++ 150: r14_usr (r14_usr), signed 32 bits ++ 151: r8_fiq (r8_fiq), signed 32 bits ++ 152: r9_fiq (r9_fiq), signed 32 bits ++ 153: r10_fiq (r10_fiq), signed 32 bits ++ 154: r11_fiq (r11_fiq), signed 32 bits ++ 155: r12_fiq (r12_fiq), signed 32 bits ++ 156: r13_fiq (r13_fiq), signed 32 bits ++ 157: r14_fiq (r14_fiq), signed 32 bits ++ 158: r13_irq (r13_irq), signed 32 bits ++ 159: r14_irq (r14_irq), signed 32 bits ++ 160: r13_abt (r13_abt), signed 32 bits ++ 161: r14_abt (r14_abt), signed 32 bits ++ 162: r13_und (r13_und), signed 32 bits ++ 163: r14_und (r14_und), signed 32 bits ++ 164: r13_svc (r13_svc), signed 32 bits ++ 165: r14_svc (r14_svc), signed 32 bits + FPA registers: + 16: f0 (f0), float 96 bits + 17: f1 (f1), float 96 bits +@@ -2690,7 +2711,72 @@ FPA registers: + 101: f5 (f5), float 96 bits + 102: f6 (f6), float 96 bits + 103: f7 (f7), float 96 bits ++MMX registers: ++ 104: wcgr0 (wcgr0), unsigned 32 bits ++ 105: wcgr1 (wcgr1), unsigned 32 bits ++ 106: wcgr2 (wcgr2), unsigned 32 bits ++ 107: wcgr3 (wcgr3), unsigned 32 bits ++ 108: wcgr4 (wcgr4), unsigned 32 bits ++ 109: wcgr5 (wcgr5), unsigned 32 bits ++ 110: wcgr6 (wcgr6), unsigned 32 bits ++ 111: wcgr7 (wcgr7), unsigned 32 bits ++ 112: wr0 (wr0), unsigned 64 bits ++ 113: wr1 (wr1), unsigned 64 bits ++ 114: wr2 (wr2), unsigned 64 bits ++ 115: wr3 (wr3), unsigned 64 bits ++ 116: wr4 (wr4), unsigned 64 bits ++ 117: wr5 (wr5), unsigned 64 bits ++ 118: wr6 (wr6), unsigned 64 bits ++ 119: wr7 (wr7), unsigned 64 bits ++ 120: wr8 (wr8), unsigned 64 bits ++ 121: wr9 (wr9), unsigned 64 bits ++ 122: wr10 (wr10), unsigned 64 bits ++ 123: wr11 (wr11), unsigned 64 bits ++ 124: wr12 (wr12), unsigned 64 bits ++ 125: wr13 (wr13), unsigned 64 bits ++ 126: wr14 (wr14), unsigned 64 bits ++ 127: wr15 (wr15), unsigned 64 bits ++ 192: wc0 (wc0), unsigned 32 bits ++ 193: wc1 (wc1), unsigned 32 bits ++ 194: wc2 (wc2), unsigned 32 bits ++ 195: wc3 (wc3), unsigned 32 bits ++ 196: wc4 (wc4), unsigned 32 bits ++ 197: wc5 (wc5), unsigned 32 bits ++ 198: wc6 (wc6), unsigned 32 bits ++ 199: wc7 (wc7), unsigned 32 bits + VFP registers: ++ 64: s0 (s0), float 32 bits ++ 65: s1 (s1), float 32 bits ++ 66: s2 (s2), float 32 bits ++ 67: s3 (s3), float 32 bits ++ 68: s4 (s4), float 32 bits ++ 69: s5 (s5), float 32 bits ++ 70: s6 (s6), float 32 bits ++ 71: s7 (s7), float 32 bits ++ 72: s8 (s8), float 32 bits ++ 73: s9 (s9), float 32 bits ++ 74: s10 (s10), float 32 bits ++ 75: s11 (s11), float 32 bits ++ 76: s12 (s12), float 32 bits ++ 77: s13 (s13), float 32 bits ++ 78: s14 (s14), float 32 bits ++ 79: s15 (s15), float 32 bits ++ 80: s16 (s16), float 32 bits ++ 81: s17 (s17), float 32 bits ++ 82: s18 (s18), float 32 bits ++ 83: s19 (s19), float 32 bits ++ 84: s20 (s20), float 32 bits ++ 85: s21 (s21), float 32 bits ++ 86: s22 (s22), float 32 bits ++ 87: s23 (s23), float 32 bits ++ 88: s24 (s24), float 32 bits ++ 89: s25 (s25), float 32 bits ++ 90: s26 (s26), float 32 bits ++ 91: s27 (s27), float 32 bits ++ 92: s28 (s28), float 32 bits ++ 93: s29 (s29), float 32 bits ++ 94: s30 (s30), float 32 bits ++ 95: s31 (s31), float 32 bits + 256: d0 (d0), float 64 bits + 257: d1 (d1), float 64 bits + 258: d2 (d2), float 64 bits +@@ -2723,6 +2809,13 @@ VFP registers: + 285: d29 (d29), float 64 bits + 286: d30 (d30), float 64 bits + 287: d31 (d31), float 64 bits ++state registers: ++ 128: spsr (spsr), unsigned 32 bits ++ 129: spsr_fiq (spsr_fiq), unsigned 32 bits ++ 130: spsr_irq (spsr_irq), unsigned 32 bits ++ 131: spsr_abt (spsr_abt), unsigned 32 bits ++ 132: spsr_und (spsr_und), unsigned 32 bits ++ 133: spsr_svc (spsr_svc), unsigned 32 bits + EOF + + # See run-readelf-mixed-corenote.sh for instructions to regenerate +Index: b/tests/run-readelf-mixed-corenote.sh +=================================================================== +--- a/tests/run-readelf-mixed-corenote.sh ++++ b/tests/run-readelf-mixed-corenote.sh +@@ -31,12 +31,11 @@ Note segment of 892 bytes at offset 0x27 + pid: 11087, ppid: 11063, pgrp: 11087, sid: 11063 + utime: 0.000000, stime: 0.010000, cutime: 0.000000, cstime: 0.000000 + orig_r0: -1, fpvalid: 1 +- r0: 1 r1: -1091672508 r2: -1091672500 +- r3: 0 r4: 0 r5: 0 +- r6: 33728 r7: 0 r8: 0 +- r9: 0 r10: -1225703496 r11: -1091672844 +- r12: 0 sp: 0xbeee64f4 lr: 0xb6dc3f48 +- pc: 0x00008500 spsr: 0x60000010 ++ r0: 1 r1: -1091672508 r2: -1091672500 r3: 0 ++ r4: 0 r5: 0 r6: 33728 r7: 0 ++ r8: 0 r9: 0 r10: -1225703496 r11: -1091672844 ++ r12: 0 sp: 0xbeee64f4 lr: 0xb6dc3f48 pc: 0x00008500 ++ spsr: 0x60000010 + CORE 124 PRPSINFO + state: 0, sname: R, zomb: 0, nice: 0, flag: 0x00400500 + uid: 0, gid: 0, pid: 11087, ppid: 11063, pgrp: 11087, sid: 11063 +Index: b/tests/run-addrcfi.sh +=================================================================== +--- a/tests/run-addrcfi.sh ++++ b/tests/run-addrcfi.sh +@@ -3554,6 +3554,38 @@ dwarf_cfi_addrframe (.eh_frame): no matc + FPA reg21 (f5): undefined + FPA reg22 (f6): undefined + FPA reg23 (f7): undefined ++ VFP reg64 (s0): undefined ++ VFP reg65 (s1): undefined ++ VFP reg66 (s2): undefined ++ VFP reg67 (s3): undefined ++ VFP reg68 (s4): undefined ++ VFP reg69 (s5): undefined ++ VFP reg70 (s6): undefined ++ VFP reg71 (s7): undefined ++ VFP reg72 (s8): undefined ++ VFP reg73 (s9): undefined ++ VFP reg74 (s10): undefined ++ VFP reg75 (s11): undefined ++ VFP reg76 (s12): undefined ++ VFP reg77 (s13): undefined ++ VFP reg78 (s14): undefined ++ VFP reg79 (s15): undefined ++ VFP reg80 (s16): undefined ++ VFP reg81 (s17): undefined ++ VFP reg82 (s18): undefined ++ VFP reg83 (s19): undefined ++ VFP reg84 (s20): undefined ++ VFP reg85 (s21): undefined ++ VFP reg86 (s22): undefined ++ VFP reg87 (s23): undefined ++ VFP reg88 (s24): undefined ++ VFP reg89 (s25): undefined ++ VFP reg90 (s26): undefined ++ VFP reg91 (s27): undefined ++ VFP reg92 (s28): undefined ++ VFP reg93 (s29): undefined ++ VFP reg94 (s30): undefined ++ VFP reg95 (s31): undefined + FPA reg96 (f0): undefined + FPA reg97 (f1): undefined + FPA reg98 (f2): undefined +@@ -3562,7 +3594,66 @@ dwarf_cfi_addrframe (.eh_frame): no matc + FPA reg101 (f5): undefined + FPA reg102 (f6): undefined + FPA reg103 (f7): undefined +- integer reg128 (spsr): undefined ++ MMX reg104 (wcgr0): undefined ++ MMX reg105 (wcgr1): undefined ++ MMX reg106 (wcgr2): undefined ++ MMX reg107 (wcgr3): undefined ++ MMX reg108 (wcgr4): undefined ++ MMX reg109 (wcgr5): undefined ++ MMX reg110 (wcgr6): undefined ++ MMX reg111 (wcgr7): undefined ++ MMX reg112 (wr0): undefined ++ MMX reg113 (wr1): undefined ++ MMX reg114 (wr2): undefined ++ MMX reg115 (wr3): undefined ++ MMX reg116 (wr4): undefined ++ MMX reg117 (wr5): undefined ++ MMX reg118 (wr6): undefined ++ MMX reg119 (wr7): undefined ++ MMX reg120 (wr8): undefined ++ MMX reg121 (wr9): undefined ++ MMX reg122 (wr10): undefined ++ MMX reg123 (wr11): undefined ++ MMX reg124 (wr12): undefined ++ MMX reg125 (wr13): undefined ++ MMX reg126 (wr14): undefined ++ MMX reg127 (wr15): undefined ++ state reg128 (spsr): undefined ++ state reg129 (spsr_fiq): undefined ++ state reg130 (spsr_irq): undefined ++ state reg131 (spsr_abt): undefined ++ state reg132 (spsr_und): undefined ++ state reg133 (spsr_svc): undefined ++ integer reg144 (r8_usr): undefined ++ integer reg145 (r9_usr): undefined ++ integer reg146 (r10_usr): undefined ++ integer reg147 (r11_usr): undefined ++ integer reg148 (r12_usr): undefined ++ integer reg149 (r13_usr): undefined ++ integer reg150 (r14_usr): undefined ++ integer reg151 (r8_fiq): undefined ++ integer reg152 (r9_fiq): undefined ++ integer reg153 (r10_fiq): undefined ++ integer reg154 (r11_fiq): undefined ++ integer reg155 (r12_fiq): undefined ++ integer reg156 (r13_fiq): undefined ++ integer reg157 (r14_fiq): undefined ++ integer reg158 (r13_irq): undefined ++ integer reg159 (r14_irq): undefined ++ integer reg160 (r13_abt): undefined ++ integer reg161 (r14_abt): undefined ++ integer reg162 (r13_und): undefined ++ integer reg163 (r14_und): undefined ++ integer reg164 (r13_svc): undefined ++ integer reg165 (r14_svc): undefined ++ MMX reg192 (wc0): undefined ++ MMX reg193 (wc1): undefined ++ MMX reg194 (wc2): undefined ++ MMX reg195 (wc3): undefined ++ MMX reg196 (wc4): undefined ++ MMX reg197 (wc5): undefined ++ MMX reg198 (wc6): undefined ++ MMX reg199 (wc7): undefined + VFP reg256 (d0): undefined + VFP reg257 (d1): undefined + VFP reg258 (d2): undefined diff --git a/poky/meta/recipes-devtools/elfutils/files/debian/hppa_backend.diff b/poky/meta/recipes-devtools/elfutils/files/debian/hppa_backend.diff new file mode 100644 index 000000000..56f852a41 --- /dev/null +++ b/poky/meta/recipes-devtools/elfutils/files/debian/hppa_backend.diff @@ -0,0 +1,802 @@ +Upstream-Status: Backport [from debian] +Signed-off-by: Hongxu Jia + +Index: elfutils-0.170/backends/parisc_init.c +=================================================================== +--- /dev/null ++++ elfutils-0.170/backends/parisc_init.c +@@ -0,0 +1,73 @@ ++/* Initialization of PA-RISC specific backend library. ++ Copyright (C) 2002, 2005, 2006 Red Hat, Inc. ++ This file is part of Red Hat elfutils. ++ Written by Ulrich Drepper , 2002. ++ ++ Red Hat elfutils is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by the ++ Free Software Foundation; version 2 of the License. ++ ++ Red Hat elfutils is distributed in the hope that it will be useful, but ++ WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License along ++ with Red Hat elfutils; if not, write to the Free Software Foundation, ++ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA. ++ ++ Red Hat elfutils is an included package of the Open Invention Network. ++ An included package of the Open Invention Network is a package for which ++ Open Invention Network licensees cross-license their patents. No patent ++ license is granted, either expressly or impliedly, by designation as an ++ included package. Should you wish to participate in the Open Invention ++ Network licensing program, please visit www.openinventionnetwork.com ++ . */ ++ ++#ifdef HAVE_CONFIG_H ++# include ++#endif ++ ++#define BACKEND parisc_ ++#define RELOC_PREFIX R_PARISC_ ++#include "libebl_CPU.h" ++#include "libebl_parisc.h" ++ ++/* This defines the common reloc hooks based on parisc_reloc.def. */ ++#include "common-reloc.c" ++ ++ ++const char * ++parisc_init (Elf *elf __attribute__ ((unused)), ++ GElf_Half machine __attribute__ ((unused)), ++ Ebl *eh, ++ size_t ehlen) ++{ ++ int pa64 = 0; ++ ++ /* Check whether the Elf_BH object has a sufficent size. */ ++ if (ehlen < sizeof (Ebl)) ++ return NULL; ++ ++ if (elf) { ++ GElf_Ehdr ehdr_mem; ++ GElf_Ehdr *ehdr = gelf_getehdr (elf, &ehdr_mem); ++ if (ehdr && (ehdr->e_flags & EF_PARISC_WIDE)) ++ pa64 = 1; ++ } ++ /* We handle it. */ ++ eh->name = "PA-RISC"; ++ parisc_init_reloc (eh); ++ HOOK (eh, reloc_simple_type); ++ HOOK (eh, machine_flag_check); ++ HOOK (eh, symbol_type_name); ++ HOOK (eh, segment_type_name); ++ HOOK (eh, section_type_name); ++ HOOK (eh, register_info); ++ if (pa64) ++ eh->return_value_location = parisc_return_value_location_64; ++ else ++ eh->return_value_location = parisc_return_value_location_32; ++ ++ return MODVERSION; ++} +Index: elfutils-0.170/backends/parisc_regs.c +=================================================================== +--- /dev/null ++++ elfutils-0.170/backends/parisc_regs.c +@@ -0,0 +1,159 @@ ++/* Register names and numbers for PA-RISC DWARF. ++ Copyright (C) 2005, 2006 Red Hat, Inc. ++ This file is part of Red Hat elfutils. ++ ++ Red Hat elfutils is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by the ++ Free Software Foundation; version 2 of the License. ++ ++ Red Hat elfutils is distributed in the hope that it will be useful, but ++ WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License along ++ with Red Hat elfutils; if not, write to the Free Software Foundation, ++ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA. ++ ++ Red Hat elfutils is an included package of the Open Invention Network. ++ An included package of the Open Invention Network is a package for which ++ Open Invention Network licensees cross-license their patents. No patent ++ license is granted, either expressly or impliedly, by designation as an ++ included package. Should you wish to participate in the Open Invention ++ Network licensing program, please visit www.openinventionnetwork.com ++ . */ ++ ++#ifdef HAVE_CONFIG_H ++# include ++#endif ++ ++#include ++#include ++ ++#define BACKEND parisc_ ++#include "libebl_CPU.h" ++ ++ssize_t ++parisc_register_info (Ebl *ebl, int regno, char *name, size_t namelen, ++ const char **prefix, const char **setname, ++ int *bits, int *type) ++{ ++ int pa64 = 0; ++ ++ if (ebl->elf) { ++ GElf_Ehdr ehdr_mem; ++ GElf_Ehdr *ehdr = gelf_getehdr (ebl->elf, &ehdr_mem); ++ if (ehdr->e_flags & EF_PARISC_WIDE) ++ pa64 = 1; ++ } ++ ++ int nregs = pa64 ? 127 : 128; ++ ++ if (name == NULL) ++ return nregs; ++ ++ if (regno < 0 || regno >= nregs || namelen < 6) ++ return -1; ++ ++ *prefix = "%"; ++ ++ if (regno < 32) ++ { ++ *setname = "integer"; ++ *type = DW_ATE_signed; ++ if (pa64) ++ { ++ *bits = 64; ++ } ++ else ++ { ++ *bits = 32; ++ } ++ } ++ else if (regno == 32) ++ { ++ *setname = "special"; ++ if (pa64) ++ { ++ *bits = 6; ++ } ++ else ++ { ++ *bits = 5; ++ } ++ *type = DW_ATE_unsigned; ++ } ++ else ++ { ++ *setname = "FPU"; ++ *type = DW_ATE_float; ++ if (pa64) ++ { ++ *bits = 64; ++ } ++ else ++ { ++ *bits = 32; ++ } ++ } ++ ++ if (regno < 33) { ++ switch (regno) ++ { ++ case 0 ... 9: ++ name[0] = 'r'; ++ name[1] = regno + '0'; ++ namelen = 2; ++ break; ++ case 10 ... 31: ++ name[0] = 'r'; ++ name[1] = regno / 10 + '0'; ++ name[2] = regno % 10 + '0'; ++ namelen = 3; ++ break; ++ case 32: ++ *prefix = NULL; ++ name[0] = 'S'; ++ name[1] = 'A'; ++ name[2] = 'R'; ++ namelen = 3; ++ break; ++ } ++ } ++ else { ++ if (pa64 && ((regno - 72) % 2)) { ++ *setname = NULL; ++ return 0; ++ } ++ ++ switch (regno) ++ { ++ case 72 + 0 ... 72 + 11: ++ name[0] = 'f'; ++ name[1] = 'r'; ++ name[2] = (regno + 8 - 72) / 2 + '0'; ++ namelen = 3; ++ if ((regno + 8 - 72) % 2) { ++ name[3] = 'R'; ++ namelen++; ++ } ++ break; ++ case 72 + 12 ... 72 + 55: ++ name[0] = 'f'; ++ name[1] = 'r'; ++ name[2] = (regno + 8 - 72) / 2 / 10 + '0'; ++ name[3] = (regno + 8 - 72) / 2 % 10 + '0'; ++ namelen = 4; ++ if ((regno + 8 - 72) % 2) { ++ name[4] = 'R'; ++ namelen++; ++ } ++ break; ++ default: ++ *setname = NULL; ++ return 0; ++ } ++ } ++ name[namelen++] = '\0'; ++ return namelen; ++} +Index: elfutils-0.170/backends/parisc_reloc.def +=================================================================== +--- /dev/null ++++ elfutils-0.170/backends/parisc_reloc.def +@@ -0,0 +1,128 @@ ++/* List the relocation types for PA-RISC. -*- C -*- ++ Copyright (C) 2005 Red Hat, Inc. ++ This file is part of Red Hat elfutils. ++ ++ Red Hat elfutils is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by the ++ Free Software Foundation; version 2 of the License. ++ ++ Red Hat elfutils is distributed in the hope that it will be useful, but ++ WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License along ++ with Red Hat elfutils; if not, write to the Free Software Foundation, ++ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA. ++ ++ Red Hat elfutils is an included package of the Open Invention Network. ++ An included package of the Open Invention Network is a package for which ++ Open Invention Network licensees cross-license their patents. No patent ++ license is granted, either expressly or impliedly, by designation as an ++ included package. Should you wish to participate in the Open Invention ++ Network licensing program, please visit www.openinventionnetwork.com ++ . */ ++ ++/* NAME, REL|EXEC|DYN */ ++ ++RELOC_TYPE (NONE, EXEC|DYN) ++RELOC_TYPE (DIR32, REL|EXEC|DYN) ++RELOC_TYPE (DIR21L, REL|EXEC|DYN) ++RELOC_TYPE (DIR17R, REL) ++RELOC_TYPE (DIR17F, REL) ++RELOC_TYPE (DIR14R, REL|DYN) ++RELOC_TYPE (PCREL32, REL) ++RELOC_TYPE (PCREL21L, REL) ++RELOC_TYPE (PCREL17R, REL) ++RELOC_TYPE (PCREL17F, REL) ++RELOC_TYPE (PCREL14R, REL|EXEC) ++RELOC_TYPE (DPREL21L, REL) ++RELOC_TYPE (DPREL14WR, REL) ++RELOC_TYPE (DPREL14DR, REL) ++RELOC_TYPE (DPREL14R, REL) ++RELOC_TYPE (GPREL21L, 0) ++RELOC_TYPE (GPREL14R, 0) ++RELOC_TYPE (LTOFF21L, REL) ++RELOC_TYPE (LTOFF14R, REL) ++RELOC_TYPE (DLTIND14F, 0) ++RELOC_TYPE (SETBASE, 0) ++RELOC_TYPE (SECREL32, REL) ++RELOC_TYPE (BASEREL21L, 0) ++RELOC_TYPE (BASEREL17R, 0) ++RELOC_TYPE (BASEREL14R, 0) ++RELOC_TYPE (SEGBASE, 0) ++RELOC_TYPE (SEGREL32, REL) ++RELOC_TYPE (PLTOFF21L, 0) ++RELOC_TYPE (PLTOFF14R, 0) ++RELOC_TYPE (PLTOFF14F, 0) ++RELOC_TYPE (LTOFF_FPTR32, 0) ++RELOC_TYPE (LTOFF_FPTR21L, 0) ++RELOC_TYPE (LTOFF_FPTR14R, 0) ++RELOC_TYPE (FPTR64, 0) ++RELOC_TYPE (PLABEL32, REL|DYN) ++RELOC_TYPE (PCREL64, 0) ++RELOC_TYPE (PCREL22C, 0) ++RELOC_TYPE (PCREL22F, 0) ++RELOC_TYPE (PCREL14WR, 0) ++RELOC_TYPE (PCREL14DR, 0) ++RELOC_TYPE (PCREL16F, 0) ++RELOC_TYPE (PCREL16WF, 0) ++RELOC_TYPE (PCREL16DF, 0) ++RELOC_TYPE (DIR64, REL|DYN) ++RELOC_TYPE (DIR14WR, REL) ++RELOC_TYPE (DIR14DR, REL) ++RELOC_TYPE (DIR16F, REL) ++RELOC_TYPE (DIR16WF, REL) ++RELOC_TYPE (DIR16DF, REL) ++RELOC_TYPE (GPREL64, 0) ++RELOC_TYPE (GPREL14WR, 0) ++RELOC_TYPE (GPREL14DR, 0) ++RELOC_TYPE (GPREL16F, 0) ++RELOC_TYPE (GPREL16WF, 0) ++RELOC_TYPE (GPREL16DF, 0) ++RELOC_TYPE (LTOFF64, 0) ++RELOC_TYPE (LTOFF14WR, 0) ++RELOC_TYPE (LTOFF14DR, 0) ++RELOC_TYPE (LTOFF16F, 0) ++RELOC_TYPE (LTOFF16WF, 0) ++RELOC_TYPE (LTOFF16DF, 0) ++RELOC_TYPE (SECREL64, 0) ++RELOC_TYPE (BASEREL14WR, 0) ++RELOC_TYPE (BASEREL14DR, 0) ++RELOC_TYPE (SEGREL64, 0) ++RELOC_TYPE (PLTOFF14WR, 0) ++RELOC_TYPE (PLTOFF14DR, 0) ++RELOC_TYPE (PLTOFF16F, 0) ++RELOC_TYPE (PLTOFF16WF, 0) ++RELOC_TYPE (PLTOFF16DF, 0) ++RELOC_TYPE (LTOFF_FPTR64, 0) ++RELOC_TYPE (LTOFF_FPTR14WR, 0) ++RELOC_TYPE (LTOFF_FPTR14DR, 0) ++RELOC_TYPE (LTOFF_FPTR16F, 0) ++RELOC_TYPE (LTOFF_FPTR16WF, 0) ++RELOC_TYPE (LTOFF_FPTR16DF, 0) ++RELOC_TYPE (COPY, EXEC) ++RELOC_TYPE (IPLT, EXEC|DYN) ++RELOC_TYPE (EPLT, 0) ++RELOC_TYPE (TPREL32, DYN) ++RELOC_TYPE (TPREL21L, 0) ++RELOC_TYPE (TPREL14R, 0) ++RELOC_TYPE (LTOFF_TP21L, 0) ++RELOC_TYPE (LTOFF_TP14R, 0) ++RELOC_TYPE (LTOFF_TP14F, 0) ++RELOC_TYPE (TPREL64, 0) ++RELOC_TYPE (TPREL14WR, 0) ++RELOC_TYPE (TPREL14DR, 0) ++RELOC_TYPE (TPREL16F, 0) ++RELOC_TYPE (TPREL16WF, 0) ++RELOC_TYPE (TPREL16DF, 0) ++RELOC_TYPE (LTOFF_TP64, 0) ++RELOC_TYPE (LTOFF_TP14WR, 0) ++RELOC_TYPE (LTOFF_TP14DR, 0) ++RELOC_TYPE (LTOFF_TP16F, 0) ++RELOC_TYPE (LTOFF_TP16WF, 0) ++RELOC_TYPE (LTOFF_TP16DF, 0) ++RELOC_TYPE (TLS_DTPMOD32, DYN) ++RELOC_TYPE (TLS_DTPMOD64, DYN) ++ ++#define NO_RELATIVE_RELOC 1 +Index: elfutils-0.170/backends/parisc_retval.c +=================================================================== +--- /dev/null ++++ elfutils-0.170/backends/parisc_retval.c +@@ -0,0 +1,213 @@ ++/* Function return value location for Linux/PA-RISC ABI. ++ Copyright (C) 2005 Red Hat, Inc. ++ This file is part of Red Hat elfutils. ++ ++ Red Hat elfutils is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by the ++ Free Software Foundation; version 2 of the License. ++ ++ Red Hat elfutils is distributed in the hope that it will be useful, but ++ WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License along ++ with Red Hat elfutils; if not, write to the Free Software Foundation, ++ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA. ++ ++ Red Hat elfutils is an included package of the Open Invention Network. ++ An included package of the Open Invention Network is a package for which ++ Open Invention Network licensees cross-license their patents. No patent ++ license is granted, either expressly or impliedly, by designation as an ++ included package. Should you wish to participate in the Open Invention ++ Network licensing program, please visit www.openinventionnetwork.com ++ . */ ++ ++#ifdef HAVE_CONFIG_H ++# include ++#endif ++ ++#include ++#include ++ ++#define BACKEND parisc_ ++#include "libebl_CPU.h" ++#include "libebl_parisc.h" ++ ++/* %r28, or pair %r28, %r29. */ ++static const Dwarf_Op loc_intreg32[] = ++ { ++ { .atom = DW_OP_reg28 }, { .atom = DW_OP_piece, .number = 4 }, ++ { .atom = DW_OP_reg29 }, { .atom = DW_OP_piece, .number = 4 }, ++ }; ++ ++static const Dwarf_Op loc_intreg[] = ++ { ++ { .atom = DW_OP_reg28 }, { .atom = DW_OP_piece, .number = 8 }, ++ { .atom = DW_OP_reg29 }, { .atom = DW_OP_piece, .number = 8 }, ++ }; ++#define nloc_intreg 1 ++#define nloc_intregpair 4 ++ ++/* %fr4L, or pair %fr4L, %fr4R on pa-32 */ ++static const Dwarf_Op loc_fpreg32[] = ++ { ++ { .atom = DW_OP_regx, .number = 72 }, { .atom = DW_OP_piece, .number = 4 }, ++ { .atom = DW_OP_regx, .number = 73 }, { .atom = DW_OP_piece, .number = 4 }, ++ }; ++#define nloc_fpreg32 2 ++#define nloc_fpregpair32 4 ++ ++/* $fr4 */ ++static const Dwarf_Op loc_fpreg[] = ++ { ++ { .atom = DW_OP_regx, .number = 72 }, ++ }; ++#define nloc_fpreg 1 ++ ++#if 0 ++/* The return value is a structure and is actually stored in stack space ++ passed in a hidden argument by the caller. Address of the location is stored ++ in %r28 before function call, but it may be changed by function. */ ++static const Dwarf_Op loc_aggregate[] = ++ { ++ { .atom = DW_OP_breg28 }, ++ }; ++#define nloc_aggregate 1 ++#endif ++ ++static int ++parisc_return_value_location_ (Dwarf_Die *functypedie, const Dwarf_Op **locp, int pa64) ++{ ++ Dwarf_Word regsize = pa64 ? 8 : 4; ++ ++ /* Start with the function's type, and get the DW_AT_type attribute, ++ which is the type of the return value. */ ++ ++ Dwarf_Attribute attr_mem; ++ Dwarf_Attribute *attr = dwarf_attr_integrate (functypedie, DW_AT_type, &attr_mem); ++ if (attr == NULL) ++ /* The function has no return value, like a `void' function in C. */ ++ return 0; ++ ++ Dwarf_Die die_mem; ++ Dwarf_Die *typedie = dwarf_formref_die (attr, &die_mem); ++ int tag = dwarf_tag (typedie); ++ ++ /* Follow typedefs and qualifiers to get to the actual type. */ ++ while (tag == DW_TAG_typedef ++ || tag == DW_TAG_const_type || tag == DW_TAG_volatile_type ++ || tag == DW_TAG_restrict_type) ++ { ++ attr = dwarf_attr_integrate (typedie, DW_AT_type, &attr_mem); ++ typedie = dwarf_formref_die (attr, &die_mem); ++ tag = dwarf_tag (typedie); ++ } ++ ++ switch (tag) ++ { ++ case -1: ++ return -1; ++ ++ case DW_TAG_subrange_type: ++ if (! dwarf_hasattr_integrate (typedie, DW_AT_byte_size)) ++ { ++ attr = dwarf_attr_integrate (typedie, DW_AT_type, &attr_mem); ++ typedie = dwarf_formref_die (attr, &die_mem); ++ tag = dwarf_tag (typedie); ++ } ++ /* Fall through. */ ++ ++ case DW_TAG_base_type: ++ case DW_TAG_enumeration_type: ++ case DW_TAG_pointer_type: ++ case DW_TAG_ptr_to_member_type: ++ { ++ Dwarf_Word size; ++ if (dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_byte_size, ++ &attr_mem), &size) != 0) ++ { ++ if (tag == DW_TAG_pointer_type || tag == DW_TAG_ptr_to_member_type) ++ size = 4; ++ else ++ return -1; ++ } ++ if (tag == DW_TAG_base_type) ++ { ++ Dwarf_Word encoding; ++ if (dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_encoding, ++ &attr_mem), &encoding) != 0) ++ return -1; ++ ++ if (encoding == DW_ATE_float) ++ { ++ if (pa64) { ++ *locp = loc_fpreg; ++ if (size <= 8) ++ return nloc_fpreg; ++ } ++ else { ++ *locp = loc_fpreg32; ++ if (size <= 4) ++ return nloc_fpreg32; ++ else if (size <= 8) ++ return nloc_fpregpair32; ++ } ++ goto aggregate; ++ } ++ } ++ if (pa64) ++ *locp = loc_intreg; ++ else ++ *locp = loc_intreg32; ++ if (size <= regsize) ++ return nloc_intreg; ++ if (size <= 2 * regsize) ++ return nloc_intregpair; ++ ++ /* Else fall through. */ ++ } ++ ++ case DW_TAG_structure_type: ++ case DW_TAG_class_type: ++ case DW_TAG_union_type: ++ case DW_TAG_array_type: ++ aggregate: { ++ Dwarf_Word size; ++ if (dwarf_aggregate_size (typedie, &size) != 0) ++ return -1; ++ if (pa64) ++ *locp = loc_intreg; ++ else ++ *locp = loc_intreg32; ++ if (size <= regsize) ++ return nloc_intreg; ++ if (size <= 2 * regsize) ++ return nloc_intregpair; ++#if 0 ++ /* there should be some way to know this location... But I do not see it. */ ++ *locp = loc_aggregate; ++ return nloc_aggregate; ++#endif ++ /* fall through. */ ++ } ++ } ++ ++ /* XXX We don't have a good way to return specific errors from ebl calls. ++ This value means we do not understand the type, but it is well-formed ++ DWARF and might be valid. */ ++ return -2; ++} ++ ++int ++parisc_return_value_location_32 (Dwarf_Die *functypedie, const Dwarf_Op **locp) ++{ ++ return parisc_return_value_location_ (functypedie, locp, 0); ++} ++ ++int ++parisc_return_value_location_64 (Dwarf_Die *functypedie, const Dwarf_Op **locp) ++{ ++ return parisc_return_value_location_ (functypedie, locp, 1); ++} ++ +Index: elfutils-0.170/backends/parisc_symbol.c +=================================================================== +--- /dev/null ++++ elfutils-0.170/backends/parisc_symbol.c +@@ -0,0 +1,112 @@ ++/* PA-RISC specific symbolic name handling. ++ Copyright (C) 2002, 2005 Red Hat, Inc. ++ This file is part of Red Hat elfutils. ++ Written by Ulrich Drepper , 2002. ++ ++ Red Hat elfutils is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by the ++ Free Software Foundation; version 2 of the License. ++ ++ Red Hat elfutils is distributed in the hope that it will be useful, but ++ WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License along ++ with Red Hat elfutils; if not, write to the Free Software Foundation, ++ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA. ++ ++ Red Hat elfutils is an included package of the Open Invention Network. ++ An included package of the Open Invention Network is a package for which ++ Open Invention Network licensees cross-license their patents. No patent ++ license is granted, either expressly or impliedly, by designation as an ++ included package. Should you wish to participate in the Open Invention ++ Network licensing program, please visit www.openinventionnetwork.com ++ . */ ++ ++#ifdef HAVE_CONFIG_H ++# include ++#endif ++ ++#include ++#include ++ ++#define BACKEND parisc_ ++#include "libebl_CPU.h" ++ ++const char * ++parisc_segment_type_name (int segment, char *buf __attribute__ ((unused)), ++ size_t len __attribute__ ((unused))) ++{ ++ switch (segment) ++ { ++ case PT_PARISC_ARCHEXT: ++ return "PARISC_ARCHEXT"; ++ case PT_PARISC_UNWIND: ++ return "PARISC_UNWIND"; ++ default: ++ break; ++ } ++ return NULL; ++} ++ ++/* Return symbolic representation of symbol type. */ ++const char * ++parisc_symbol_type_name(int symbol, char *buf __attribute__ ((unused)), ++ size_t len __attribute__ ((unused))) ++{ ++ if (symbol == STT_PARISC_MILLICODE) ++ return "PARISC_MILLI"; ++ return NULL; ++} ++ ++/* Return symbolic representation of section type. */ ++const char * ++parisc_section_type_name (int type, ++ char *buf __attribute__ ((unused)), ++ size_t len __attribute__ ((unused))) ++{ ++ switch (type) ++ { ++ case SHT_PARISC_EXT: ++ return "PARISC_EXT"; ++ case SHT_PARISC_UNWIND: ++ return "PARISC_UNWIND"; ++ case SHT_PARISC_DOC: ++ return "PARISC_DOC"; ++ } ++ ++ return NULL; ++} ++ ++/* Check whether machine flags are valid. */ ++bool ++parisc_machine_flag_check (GElf_Word flags) ++{ ++ if (flags &~ (EF_PARISC_TRAPNIL | EF_PARISC_EXT | EF_PARISC_LSB | ++ EF_PARISC_WIDE | EF_PARISC_NO_KABP | ++ EF_PARISC_LAZYSWAP | EF_PARISC_ARCH)) ++ return 0; ++ ++ GElf_Word arch = flags & EF_PARISC_ARCH; ++ ++ return ((arch == EFA_PARISC_1_0) || (arch == EFA_PARISC_1_1) || ++ (arch == EFA_PARISC_2_0)); ++} ++ ++/* Check for the simple reloc types. */ ++Elf_Type ++parisc_reloc_simple_type (Ebl *ebl __attribute__ ((unused)), int type) ++{ ++ switch (type) ++ { ++ case R_PARISC_DIR64: ++ case R_PARISC_SECREL64: ++ return ELF_T_XWORD; ++ case R_PARISC_DIR32: ++ case R_PARISC_SECREL32: ++ return ELF_T_WORD; ++ default: ++ return ELF_T_NUM; ++ } ++} +Index: elfutils-0.170/backends/libebl_parisc.h +=================================================================== +--- /dev/null ++++ elfutils-0.170/backends/libebl_parisc.h +@@ -0,0 +1,9 @@ ++#ifndef _LIBEBL_HPPA_H ++#define _LIBEBL_HPPA_H 1 ++ ++#include ++ ++extern int parisc_return_value_location_32(Dwarf_Die *, const Dwarf_Op **locp); ++extern int parisc_return_value_location_64(Dwarf_Die *, const Dwarf_Op **locp); ++ ++#endif +Index: elfutils-0.170/backends/Makefile.am +=================================================================== +--- elfutils-0.170.orig/backends/Makefile.am ++++ elfutils-0.170/backends/Makefile.am +@@ -33,12 +33,12 @@ AM_CPPFLAGS += -I$(top_srcdir)/libebl -I + + + modules = i386 sh x86_64 ia64 alpha arm aarch64 sparc ppc ppc64 s390 \ +- tilegx m68k bpf ++ tilegx m68k bpf parisc + libebl_pic = libebl_i386_pic.a libebl_sh_pic.a libebl_x86_64_pic.a \ + libebl_ia64_pic.a libebl_alpha_pic.a libebl_arm_pic.a \ + libebl_aarch64_pic.a libebl_sparc_pic.a libebl_ppc_pic.a \ + libebl_ppc64_pic.a libebl_s390_pic.a libebl_tilegx_pic.a \ +- libebl_m68k_pic.a libebl_bpf_pic.a ++ libebl_m68k_pic.a libebl_bpf_pic.a libebl_parisc_pic.a + noinst_LIBRARIES = $(libebl_pic) + noinst_DATA = $(libebl_pic:_pic.a=.so) + +@@ -124,6 +124,9 @@ cpu_bpf = ../libcpu/libcpu_bpf.a + libebl_bpf_pic_a_SOURCES = $(bpf_SRCS) + am_libebl_bpf_pic_a_OBJECTS = $(bpf_SRCS:.c=.os) + ++parisc_SRCS = parisc_init.c parisc_symbol.c parisc_regs.c parisc_retval.c ++libebl_parisc_pic_a_SOURCES = $(parisc_SRCS) ++am_libebl_parisc_pic_a_OBJECTS = $(parisc_SRCS:.c=.os) + + libebl_%.so libebl_%.map: libebl_%_pic.a $(libelf) $(libdw) $(libeu) + @rm -f $(@:.so=.map) +Index: elfutils-0.170/libelf/elf.h +=================================================================== +--- elfutils-0.170.orig/libelf/elf.h ++++ elfutils-0.170/libelf/elf.h +@@ -2056,16 +2056,24 @@ enum + #define R_PARISC_PCREL17F 12 /* 17 bits of rel. address. */ + #define R_PARISC_PCREL14R 14 /* Right 14 bits of rel. address. */ + #define R_PARISC_DPREL21L 18 /* Left 21 bits of rel. address. */ ++#define R_PARISC_DPREL14WR 19 ++#define R_PARISC_DPREL14DR 20 + #define R_PARISC_DPREL14R 22 /* Right 14 bits of rel. address. */ + #define R_PARISC_GPREL21L 26 /* GP-relative, left 21 bits. */ + #define R_PARISC_GPREL14R 30 /* GP-relative, right 14 bits. */ + #define R_PARISC_LTOFF21L 34 /* LT-relative, left 21 bits. */ + #define R_PARISC_LTOFF14R 38 /* LT-relative, right 14 bits. */ ++#define R_PARISC_DLTIND14F 39 ++#define R_PARISC_SETBASE 40 + #define R_PARISC_SECREL32 41 /* 32 bits section rel. address. */ ++#define R_PARISC_BASEREL21L 42 ++#define R_PARISC_BASEREL17R 43 ++#define R_PARISC_BASEREL14R 46 + #define R_PARISC_SEGBASE 48 /* No relocation, set segment base. */ + #define R_PARISC_SEGREL32 49 /* 32 bits segment rel. address. */ + #define R_PARISC_PLTOFF21L 50 /* PLT rel. address, left 21 bits. */ + #define R_PARISC_PLTOFF14R 54 /* PLT rel. address, right 14 bits. */ ++#define R_PARISC_PLTOFF14F 55 + #define R_PARISC_LTOFF_FPTR32 57 /* 32 bits LT-rel. function pointer. */ + #define R_PARISC_LTOFF_FPTR21L 58 /* LT-rel. fct ptr, left 21 bits. */ + #define R_PARISC_LTOFF_FPTR14R 62 /* LT-rel. fct ptr, right 14 bits. */ +@@ -2074,6 +2082,7 @@ enum + #define R_PARISC_PLABEL21L 66 /* Left 21 bits of fdesc address. */ + #define R_PARISC_PLABEL14R 70 /* Right 14 bits of fdesc address. */ + #define R_PARISC_PCREL64 72 /* 64 bits PC-rel. address. */ ++#define R_PARISC_PCREL22C 73 + #define R_PARISC_PCREL22F 74 /* 22 bits PC-rel. address. */ + #define R_PARISC_PCREL14WR 75 /* PC-rel. address, right 14 bits. */ + #define R_PARISC_PCREL14DR 76 /* PC rel. address, right 14 bits. */ +@@ -2099,6 +2108,8 @@ enum + #define R_PARISC_LTOFF16WF 102 /* 16 bits LT-rel. address. */ + #define R_PARISC_LTOFF16DF 103 /* 16 bits LT-rel. address. */ + #define R_PARISC_SECREL64 104 /* 64 bits section rel. address. */ ++#define R_PARISC_BASEREL14WR 107 ++#define R_PARISC_BASEREL14DR 108 + #define R_PARISC_SEGREL64 112 /* 64 bits segment rel. address. */ + #define R_PARISC_PLTOFF14WR 115 /* PLT-rel. address, right 14 bits. */ + #define R_PARISC_PLTOFF14DR 116 /* PLT-rel. address, right 14 bits. */ diff --git a/poky/meta/recipes-devtools/elfutils/files/debian/mips_backend.patch b/poky/meta/recipes-devtools/elfutils/files/debian/mips_backend.patch new file mode 100644 index 000000000..2e0e54b0c --- /dev/null +++ b/poky/meta/recipes-devtools/elfutils/files/debian/mips_backend.patch @@ -0,0 +1,715 @@ +From 46d0d0ca718093486eeeedf1b44134e9e29b56f7 Mon Sep 17 00:00:00 2001 +From: Hongxu Jia +Date: Wed, 16 Aug 2017 09:18:59 +0800 +Subject: [PATCH] mips backends + +Upstream-Status: Backport [from debian] + +Rebase to 0.170 +Signed-off-by: Hongxu Jia +--- + backends/Makefile.am | 8 +- + backends/mips_init.c | 59 +++++++++ + backends/mips_regs.c | 104 ++++++++++++++++ + backends/mips_reloc.def | 79 ++++++++++++ + backends/mips_retval.c | 321 ++++++++++++++++++++++++++++++++++++++++++++++++ + backends/mips_symbol.c | 52 ++++++++ + libebl/eblopenbackend.c | 2 + + 7 files changed, 623 insertions(+), 2 deletions(-) + create mode 100644 backends/mips_init.c + create mode 100644 backends/mips_regs.c + create mode 100644 backends/mips_reloc.def + create mode 100644 backends/mips_retval.c + create mode 100644 backends/mips_symbol.c + +diff --git a/backends/Makefile.am b/backends/Makefile.am +index 7f1f5d4..91baf6e 100644 +--- a/backends/Makefile.am ++++ b/backends/Makefile.am +@@ -33,12 +33,12 @@ AM_CPPFLAGS += -I$(top_srcdir)/libebl -I$(top_srcdir)/libasm \ + + + modules = i386 sh x86_64 ia64 alpha arm aarch64 sparc ppc ppc64 s390 \ +- tilegx m68k bpf parisc ++ tilegx m68k bpf parisc mips + libebl_pic = libebl_i386_pic.a libebl_sh_pic.a libebl_x86_64_pic.a \ + libebl_ia64_pic.a libebl_alpha_pic.a libebl_arm_pic.a \ + libebl_aarch64_pic.a libebl_sparc_pic.a libebl_ppc_pic.a \ + libebl_ppc64_pic.a libebl_s390_pic.a libebl_tilegx_pic.a \ +- libebl_m68k_pic.a libebl_bpf_pic.a libebl_parisc_pic.a ++ libebl_m68k_pic.a libebl_bpf_pic.a libebl_parisc_pic.a libebl_mips_pic.a + noinst_LIBRARIES = $(libebl_pic) + noinst_DATA = $(libebl_pic:_pic.a=.so) + +@@ -128,6 +128,10 @@ parisc_SRCS = parisc_init.c parisc_symbol.c parisc_regs.c parisc_retval.c + libebl_parisc_pic_a_SOURCES = $(parisc_SRCS) + am_libebl_parisc_pic_a_OBJECTS = $(parisc_SRCS:.c=.os) + ++mips_SRCS = mips_init.c mips_symbol.c mips_regs.c mips_retval.c ++libebl_mips_pic_a_SOURCES = $(mips_SRCS) ++am_libebl_mips_pic_a_OBJECTS = $(mips_SRCS:.c=.os) ++ + libebl_%.so libebl_%.map: libebl_%_pic.a $(libelf) $(libdw) $(libeu) + @rm -f $(@:.so=.map) + $(AM_V_at)echo 'ELFUTILS_$(PACKAGE_VERSION) { global: $*_init; local: *; };' \ +diff --git a/backends/mips_init.c b/backends/mips_init.c +new file mode 100644 +index 0000000..975c04e +--- /dev/null ++++ b/backends/mips_init.c +@@ -0,0 +1,59 @@ ++/* Initialization of mips specific backend library. ++ Copyright (C) 2006 Red Hat, Inc. ++ This file is part of Red Hat elfutils. ++ ++ Red Hat elfutils is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by the ++ Free Software Foundation; version 2 of the License. ++ ++ Red Hat elfutils is distributed in the hope that it will be useful, but ++ WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License along ++ with Red Hat elfutils; if not, write to the Free Software Foundation, ++ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA. ++ ++ Red Hat elfutils is an included package of the Open Invention Network. ++ An included package of the Open Invention Network is a package for which ++ Open Invention Network licensees cross-license their patents. No patent ++ license is granted, either expressly or impliedly, by designation as an ++ included package. Should you wish to participate in the Open Invention ++ Network licensing program, please visit www.openinventionnetwork.com ++ . */ ++ ++#ifdef HAVE_CONFIG_H ++# include ++#endif ++ ++#define BACKEND mips_ ++#define RELOC_PREFIX R_MIPS_ ++#include "libebl_CPU.h" ++ ++/* This defines the common reloc hooks based on mips_reloc.def. */ ++#include "common-reloc.c" ++ ++const char * ++mips_init (Elf *elf __attribute__ ((unused)), ++ GElf_Half machine __attribute__ ((unused)), ++ Ebl *eh, ++ size_t ehlen) ++{ ++ /* Check whether the Elf_BH object has a sufficent size. */ ++ if (ehlen < sizeof (Ebl)) ++ return NULL; ++ ++ /* We handle it. */ ++ if (machine == EM_MIPS) ++ eh->name = "MIPS R3000 big-endian"; ++ else if (machine == EM_MIPS_RS3_LE) ++ eh->name = "MIPS R3000 little-endian"; ++ ++ mips_init_reloc (eh); ++ HOOK (eh, reloc_simple_type); ++ HOOK (eh, return_value_location); ++ HOOK (eh, register_info); ++ ++ return MODVERSION; ++} +diff --git a/backends/mips_regs.c b/backends/mips_regs.c +new file mode 100644 +index 0000000..44f86cb +--- /dev/null ++++ b/backends/mips_regs.c +@@ -0,0 +1,104 @@ ++/* Register names and numbers for MIPS DWARF. ++ Copyright (C) 2006 Red Hat, Inc. ++ This file is part of Red Hat elfutils. ++ ++ Red Hat elfutils is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by the ++ Free Software Foundation; version 2 of the License. ++ ++ Red Hat elfutils is distributed in the hope that it will be useful, but ++ WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License along ++ with Red Hat elfutils; if not, write to the Free Software Foundation, ++ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA. ++ ++ Red Hat elfutils is an included package of the Open Invention Network. ++ An included package of the Open Invention Network is a package for which ++ Open Invention Network licensees cross-license their patents. No patent ++ license is granted, either expressly or impliedly, by designation as an ++ included package. Should you wish to participate in the Open Invention ++ Network licensing program, please visit www.openinventionnetwork.com ++ . */ ++ ++#ifdef HAVE_CONFIG_H ++# include ++#endif ++ ++#include ++#include ++ ++#define BACKEND mips_ ++#include "libebl_CPU.h" ++ ++ssize_t ++mips_register_info (Ebl *ebl __attribute__((unused)), ++ int regno, char *name, size_t namelen, ++ const char **prefix, const char **setname, ++ int *bits, int *type) ++{ ++ if (name == NULL) ++ return 66; ++ ++ if (regno < 0 || regno > 65 || namelen < 4) ++ return -1; ++ ++ *prefix = "$"; ++ ++ if (regno < 32) ++ { ++ *setname = "integer"; ++ *type = DW_ATE_signed; ++ *bits = 32; ++ if (regno < 32 + 10) ++ { ++ name[0] = regno + '0'; ++ namelen = 1; ++ } ++ else ++ { ++ name[0] = (regno / 10) + '0'; ++ name[1] = (regno % 10) + '0'; ++ namelen = 2; ++ } ++ } ++ else if (regno < 64) ++ { ++ *setname = "FPU"; ++ *type = DW_ATE_float; ++ *bits = 32; ++ name[0] = 'f'; ++ if (regno < 32 + 10) ++ { ++ name[1] = (regno - 32) + '0'; ++ namelen = 2; ++ } ++ else ++ { ++ name[1] = (regno - 32) / 10 + '0'; ++ name[2] = (regno - 32) % 10 + '0'; ++ namelen = 3; ++ } ++ } ++ else if (regno == 64) ++ { ++ *type = DW_ATE_signed; ++ *bits = 32; ++ name[0] = 'h'; ++ name[1] = 'i'; ++ namelen = 2; ++ } ++ else ++ { ++ *type = DW_ATE_signed; ++ *bits = 32; ++ name[0] = 'l'; ++ name[1] = 'o'; ++ namelen = 2; ++ } ++ ++ name[namelen++] = '\0'; ++ return namelen; ++} +diff --git a/backends/mips_reloc.def b/backends/mips_reloc.def +new file mode 100644 +index 0000000..4579970 +--- /dev/null ++++ b/backends/mips_reloc.def +@@ -0,0 +1,79 @@ ++/* List the relocation types for mips. -*- C -*- ++ Copyright (C) 2006 Red Hat, Inc. ++ This file is part of Red Hat elfutils. ++ ++ Red Hat elfutils is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by the ++ Free Software Foundation; version 2 of the License. ++ ++ Red Hat elfutils is distributed in the hope that it will be useful, but ++ WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License along ++ with Red Hat elfutils; if not, write to the Free Software Foundation, ++ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA. ++ ++ Red Hat elfutils is an included package of the Open Invention Network. ++ An included package of the Open Invention Network is a package for which ++ Open Invention Network licensees cross-license their patents. No patent ++ license is granted, either expressly or impliedly, by designation as an ++ included package. Should you wish to participate in the Open Invention ++ Network licensing program, please visit www.openinventionnetwork.com ++ . */ ++ ++/* NAME, REL|EXEC|DYN */ ++ ++RELOC_TYPE (NONE, 0) ++RELOC_TYPE (16, 0) ++RELOC_TYPE (32, 0) ++RELOC_TYPE (REL32, 0) ++RELOC_TYPE (26, 0) ++RELOC_TYPE (HI16, 0) ++RELOC_TYPE (LO16, 0) ++RELOC_TYPE (GPREL16, 0) ++RELOC_TYPE (LITERAL, 0) ++RELOC_TYPE (GOT16, 0) ++RELOC_TYPE (PC16, 0) ++RELOC_TYPE (CALL16, 0) ++RELOC_TYPE (GPREL32, 0) ++ ++RELOC_TYPE (SHIFT5, 0) ++RELOC_TYPE (SHIFT6, 0) ++RELOC_TYPE (64, 0) ++RELOC_TYPE (GOT_DISP, 0) ++RELOC_TYPE (GOT_PAGE, 0) ++RELOC_TYPE (GOT_OFST, 0) ++RELOC_TYPE (GOT_HI16, 0) ++RELOC_TYPE (GOT_LO16, 0) ++RELOC_TYPE (SUB, 0) ++RELOC_TYPE (INSERT_A, 0) ++RELOC_TYPE (INSERT_B, 0) ++RELOC_TYPE (DELETE, 0) ++RELOC_TYPE (HIGHER, 0) ++RELOC_TYPE (HIGHEST, 0) ++RELOC_TYPE (CALL_HI16, 0) ++RELOC_TYPE (CALL_LO16, 0) ++RELOC_TYPE (SCN_DISP, 0) ++RELOC_TYPE (REL16, 0) ++RELOC_TYPE (ADD_IMMEDIATE, 0) ++RELOC_TYPE (PJUMP, 0) ++RELOC_TYPE (RELGOT, 0) ++RELOC_TYPE (JALR, 0) ++RELOC_TYPE (TLS_DTPMOD32, 0) ++RELOC_TYPE (TLS_DTPREL32, 0) ++RELOC_TYPE (TLS_DTPMOD64, 0) ++RELOC_TYPE (TLS_DTPREL64, 0) ++RELOC_TYPE (TLS_GD, 0) ++RELOC_TYPE (TLS_LDM, 0) ++RELOC_TYPE (TLS_DTPREL_HI16, 0) ++RELOC_TYPE (TLS_DTPREL_LO16, 0) ++RELOC_TYPE (TLS_GOTTPREL, 0) ++RELOC_TYPE (TLS_TPREL32, 0) ++RELOC_TYPE (TLS_TPREL64, 0) ++RELOC_TYPE (TLS_TPREL_HI16, 0) ++RELOC_TYPE (TLS_TPREL_LO16, 0) ++ ++#define NO_COPY_RELOC 1 ++#define NO_RELATIVE_RELOC 1 +diff --git a/backends/mips_retval.c b/backends/mips_retval.c +new file mode 100644 +index 0000000..656cd1f +--- /dev/null ++++ b/backends/mips_retval.c +@@ -0,0 +1,321 @@ ++/* Function return value location for Linux/mips ABI. ++ Copyright (C) 2005 Red Hat, Inc. ++ This file is part of Red Hat elfutils. ++ ++ Red Hat elfutils is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by the ++ Free Software Foundation; version 2 of the License. ++ ++ Red Hat elfutils is distributed in the hope that it will be useful, but ++ WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License along ++ with Red Hat elfutils; if not, write to the Free Software Foundation, ++ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA. ++ ++ Red Hat elfutils is an included package of the Open Invention Network. ++ An included package of the Open Invention Network is a package for which ++ Open Invention Network licensees cross-license their patents. No patent ++ license is granted, either expressly or impliedly, by designation as an ++ included package. Should you wish to participate in the Open Invention ++ Network licensing program, please visit www.openinventionnetwork.com ++ . */ ++ ++#ifdef HAVE_CONFIG_H ++# include ++#endif ++ ++#include ++#include ++#include ++#include ++ ++#include "../libebl/libeblP.h" ++#include "../libdw/libdwP.h" ++ ++#define BACKEND mips_ ++#include "libebl_CPU.h" ++ ++/* The ABI of the file. Also see EF_MIPS_ABI2 above. */ ++#define EF_MIPS_ABI 0x0000F000 ++ ++/* The original o32 abi. */ ++#define E_MIPS_ABI_O32 0x00001000 ++ ++/* O32 extended to work on 64 bit architectures */ ++#define E_MIPS_ABI_O64 0x00002000 ++ ++/* EABI in 32 bit mode */ ++#define E_MIPS_ABI_EABI32 0x00003000 ++ ++/* EABI in 64 bit mode */ ++#define E_MIPS_ABI_EABI64 0x00004000 ++ ++/* All the possible MIPS ABIs. */ ++enum mips_abi ++ { ++ MIPS_ABI_UNKNOWN = 0, ++ MIPS_ABI_N32, ++ MIPS_ABI_O32, ++ MIPS_ABI_N64, ++ MIPS_ABI_O64, ++ MIPS_ABI_EABI32, ++ MIPS_ABI_EABI64, ++ MIPS_ABI_LAST ++ }; ++ ++/* Find the mips ABI of the current file */ ++enum mips_abi find_mips_abi(Elf *elf) ++{ ++ GElf_Ehdr ehdr_mem; ++ GElf_Ehdr *ehdr = gelf_getehdr (elf, &ehdr_mem); ++ ++ if (ehdr == NULL) ++ return MIPS_ABI_LAST; ++ ++ GElf_Word elf_flags = ehdr->e_flags; ++ ++ /* Check elf_flags to see if it specifies the ABI being used. */ ++ switch ((elf_flags & EF_MIPS_ABI)) ++ { ++ case E_MIPS_ABI_O32: ++ return MIPS_ABI_O32; ++ case E_MIPS_ABI_O64: ++ return MIPS_ABI_O64; ++ case E_MIPS_ABI_EABI32: ++ return MIPS_ABI_EABI32; ++ case E_MIPS_ABI_EABI64: ++ return MIPS_ABI_EABI64; ++ default: ++ if ((elf_flags & EF_MIPS_ABI2)) ++ return MIPS_ABI_N32; ++ } ++ ++ /* GCC creates a pseudo-section whose name describes the ABI. */ ++ size_t shstrndx; ++ if (elf_getshdrstrndx (elf, &shstrndx) < 0) ++ return MIPS_ABI_LAST; ++ ++ const char *name; ++ Elf_Scn *scn = NULL; ++ while ((scn = elf_nextscn (elf, scn)) != NULL) ++ { ++ GElf_Shdr shdr_mem; ++ GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem); ++ if (shdr == NULL) ++ return MIPS_ABI_LAST; ++ ++ name = elf_strptr (elf, shstrndx, shdr->sh_name) ?: ""; ++ if (strncmp (name, ".mdebug.", 8) != 0) ++ continue; ++ ++ if (strcmp (name, ".mdebug.abi32") == 0) ++ return MIPS_ABI_O32; ++ else if (strcmp (name, ".mdebug.abiN32") == 0) ++ return MIPS_ABI_N32; ++ else if (strcmp (name, ".mdebug.abi64") == 0) ++ return MIPS_ABI_N64; ++ else if (strcmp (name, ".mdebug.abiO64") == 0) ++ return MIPS_ABI_O64; ++ else if (strcmp (name, ".mdebug.eabi32") == 0) ++ return MIPS_ABI_EABI32; ++ else if (strcmp (name, ".mdebug.eabi64") == 0) ++ return MIPS_ABI_EABI64; ++ else ++ return MIPS_ABI_UNKNOWN; ++ } ++ ++ return MIPS_ABI_UNKNOWN; ++} ++ ++unsigned int ++mips_abi_regsize (enum mips_abi abi) ++{ ++ switch (abi) ++ { ++ case MIPS_ABI_EABI32: ++ case MIPS_ABI_O32: ++ return 4; ++ case MIPS_ABI_N32: ++ case MIPS_ABI_N64: ++ case MIPS_ABI_O64: ++ case MIPS_ABI_EABI64: ++ return 8; ++ case MIPS_ABI_UNKNOWN: ++ case MIPS_ABI_LAST: ++ default: ++ return 0; ++ } ++} ++ ++ ++/* $v0 or pair $v0, $v1 */ ++static const Dwarf_Op loc_intreg_o32[] = ++ { ++ { .atom = DW_OP_reg2 }, { .atom = DW_OP_piece, .number = 4 }, ++ { .atom = DW_OP_reg3 }, { .atom = DW_OP_piece, .number = 4 }, ++ }; ++ ++static const Dwarf_Op loc_intreg[] = ++ { ++ { .atom = DW_OP_reg2 }, { .atom = DW_OP_piece, .number = 8 }, ++ { .atom = DW_OP_reg3 }, { .atom = DW_OP_piece, .number = 8 }, ++ }; ++#define nloc_intreg 1 ++#define nloc_intregpair 4 ++ ++/* $f0 (float), or pair $f0, $f1 (double). ++ * f2/f3 are used for COMPLEX (= 2 doubles) returns in Fortran */ ++static const Dwarf_Op loc_fpreg_o32[] = ++ { ++ { .atom = DW_OP_regx, .number = 32 }, { .atom = DW_OP_piece, .number = 4 }, ++ { .atom = DW_OP_regx, .number = 33 }, { .atom = DW_OP_piece, .number = 4 }, ++ { .atom = DW_OP_regx, .number = 34 }, { .atom = DW_OP_piece, .number = 4 }, ++ { .atom = DW_OP_regx, .number = 35 }, { .atom = DW_OP_piece, .number = 4 }, ++ }; ++ ++/* $f0, or pair $f0, $f2. */ ++static const Dwarf_Op loc_fpreg[] = ++ { ++ { .atom = DW_OP_regx, .number = 32 }, { .atom = DW_OP_piece, .number = 8 }, ++ { .atom = DW_OP_regx, .number = 34 }, { .atom = DW_OP_piece, .number = 8 }, ++ }; ++#define nloc_fpreg 1 ++#define nloc_fpregpair 4 ++#define nloc_fpregquad 8 ++ ++/* The return value is a structure and is actually stored in stack space ++ passed in a hidden argument by the caller. But, the compiler ++ helpfully returns the address of that space in $v0. */ ++static const Dwarf_Op loc_aggregate[] = ++ { ++ { .atom = DW_OP_breg2, .number = 0 } ++ }; ++#define nloc_aggregate 1 ++ ++int ++mips_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp) ++{ ++ /* First find the ABI used by the elf object */ ++ enum mips_abi abi = find_mips_abi(functypedie->cu->dbg->elf); ++ ++ /* Something went seriously wrong while trying to figure out the ABI */ ++ if (abi == MIPS_ABI_LAST) ++ return -1; ++ ++ /* We couldn't identify the ABI, but the file seems valid */ ++ if (abi == MIPS_ABI_UNKNOWN) ++ return -2; ++ ++ /* Can't handle EABI variants */ ++ if ((abi == MIPS_ABI_EABI32) || (abi == MIPS_ABI_EABI64)) ++ return -2; ++ ++ unsigned int regsize = mips_abi_regsize (abi); ++ if (!regsize) ++ return -2; ++ ++ /* Start with the function's type, and get the DW_AT_type attribute, ++ which is the type of the return value. */ ++ ++ Dwarf_Attribute attr_mem; ++ Dwarf_Attribute *attr = dwarf_attr_integrate (functypedie, DW_AT_type, &attr_mem); ++ if (attr == NULL) ++ /* The function has no return value, like a `void' function in C. */ ++ return 0; ++ ++ Dwarf_Die die_mem; ++ Dwarf_Die *typedie = dwarf_formref_die (attr, &die_mem); ++ int tag = dwarf_tag (typedie); ++ ++ /* Follow typedefs and qualifiers to get to the actual type. */ ++ while (tag == DW_TAG_typedef ++ || tag == DW_TAG_const_type || tag == DW_TAG_volatile_type ++ || tag == DW_TAG_restrict_type) ++ { ++ attr = dwarf_attr_integrate (typedie, DW_AT_type, &attr_mem); ++ typedie = dwarf_formref_die (attr, &die_mem); ++ tag = dwarf_tag (typedie); ++ } ++ ++ switch (tag) ++ { ++ case -1: ++ return -1; ++ ++ case DW_TAG_subrange_type: ++ if (! dwarf_hasattr_integrate (typedie, DW_AT_byte_size)) ++ { ++ attr = dwarf_attr_integrate (typedie, DW_AT_type, &attr_mem); ++ typedie = dwarf_formref_die (attr, &die_mem); ++ tag = dwarf_tag (typedie); ++ } ++ /* Fall through. */ ++ ++ case DW_TAG_base_type: ++ case DW_TAG_enumeration_type: ++ case DW_TAG_pointer_type: ++ case DW_TAG_ptr_to_member_type: ++ { ++ Dwarf_Word size; ++ if (dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_byte_size, ++ &attr_mem), &size) != 0) ++ { ++ if (tag == DW_TAG_pointer_type || tag == DW_TAG_ptr_to_member_type) ++ size = regsize; ++ else ++ return -1; ++ } ++ if (tag == DW_TAG_base_type) ++ { ++ Dwarf_Word encoding; ++ if (dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_encoding, ++ &attr_mem), &encoding) != 0) ++ return -1; ++ ++#define ABI_LOC(loc, regsize) ((regsize) == 4 ? (loc ## _o32) : (loc)) ++ ++ if (encoding == DW_ATE_float) ++ { ++ *locp = ABI_LOC(loc_fpreg, regsize); ++ if (size <= regsize) ++ return nloc_fpreg; ++ ++ if (size <= 2*regsize) ++ return nloc_fpregpair; ++ ++ if (size <= 4*regsize && abi == MIPS_ABI_O32) ++ return nloc_fpregquad; ++ ++ goto aggregate; ++ } ++ } ++ *locp = ABI_LOC(loc_intreg, regsize); ++ if (size <= regsize) ++ return nloc_intreg; ++ if (size <= 2*regsize) ++ return nloc_intregpair; ++ ++ /* Else fall through. Shouldn't happen though (at least with gcc) */ ++ } ++ ++ case DW_TAG_structure_type: ++ case DW_TAG_class_type: ++ case DW_TAG_union_type: ++ case DW_TAG_array_type: ++ aggregate: ++ /* XXX TODO: Can't handle structure return with other ABI's yet :-/ */ ++ if ((abi != MIPS_ABI_O32) && (abi != MIPS_ABI_O64)) ++ return -2; ++ ++ *locp = loc_aggregate; ++ return nloc_aggregate; ++ } ++ ++ /* XXX We don't have a good way to return specific errors from ebl calls. ++ This value means we do not understand the type, but it is well-formed ++ DWARF and might be valid. */ ++ return -2; ++} +diff --git a/backends/mips_symbol.c b/backends/mips_symbol.c +new file mode 100644 +index 0000000..ba465fe +--- /dev/null ++++ b/backends/mips_symbol.c +@@ -0,0 +1,52 @@ ++/* MIPS specific symbolic name handling. ++ Copyright (C) 2002, 2003, 2005 Red Hat, Inc. ++ This file is part of Red Hat elfutils. ++ Written by Jakub Jelinek , 2002. ++ ++ Red Hat elfutils is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by the ++ Free Software Foundation; version 2 of the License. ++ ++ Red Hat elfutils is distributed in the hope that it will be useful, but ++ WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License along ++ with Red Hat elfutils; if not, write to the Free Software Foundation, ++ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA. ++ ++ Red Hat elfutils is an included package of the Open Invention Network. ++ An included package of the Open Invention Network is a package for which ++ Open Invention Network licensees cross-license their patents. No patent ++ license is granted, either expressly or impliedly, by designation as an ++ included package. Should you wish to participate in the Open Invention ++ Network licensing program, please visit www.openinventionnetwork.com ++ . */ ++ ++#ifdef HAVE_CONFIG_H ++# include ++#endif ++ ++#include ++#include ++ ++#define BACKEND mips_ ++#include "libebl_CPU.h" ++ ++/* Check for the simple reloc types. */ ++Elf_Type ++mips_reloc_simple_type (Ebl *ebl __attribute__ ((unused)), int type) ++{ ++ switch (type) ++ { ++ case R_MIPS_16: ++ return ELF_T_HALF; ++ case R_MIPS_32: ++ return ELF_T_WORD; ++ case R_MIPS_64: ++ return ELF_T_XWORD; ++ default: ++ return ELF_T_NUM; ++ } ++} +diff --git a/libebl/eblopenbackend.c b/libebl/eblopenbackend.c +index 1f81477..5371396 100644 +--- a/libebl/eblopenbackend.c ++++ b/libebl/eblopenbackend.c +@@ -72,6 +72,8 @@ static const struct + { "sparc", "elf_sparc", "sparc", 5, EM_SPARC, 0, 0 }, + { "sparc", "elf_sparcv8plus", "sparc", 5, EM_SPARC32PLUS, 0, 0 }, + { "s390", "ebl_s390", "s390", 4, EM_S390, 0, 0 }, ++ { "mips", "elf_mips", "mips", 4, EM_MIPS, 0, 0 }, ++ { "mips", "elf_mipsel", "mipsel", 4, EM_MIPS_RS3_LE, 0, 0 }, + + { "m32", "elf_m32", "m32", 3, EM_M32, 0, 0 }, + { "m68k", "elf_m68k", "m68k", 4, EM_68K, ELFCLASS32, ELFDATA2MSB }, +-- +1.8.3.1 + diff --git a/poky/meta/recipes-devtools/elfutils/files/debian/mips_readelf_w.patch b/poky/meta/recipes-devtools/elfutils/files/debian/mips_readelf_w.patch new file mode 100644 index 000000000..790930cf3 --- /dev/null +++ b/poky/meta/recipes-devtools/elfutils/files/debian/mips_readelf_w.patch @@ -0,0 +1,25 @@ +From: Kurt Roeckx +Subject: Make readelf -w output debug information on mips +Bug-Debian: http://bugs.debian.org/662041 +Forwarded: not-needed + +Upstreams wants a change where this is handled by a hook that needs +to be filled in by the backend for the arch. + +Upstream-Status: Backport [from debian] +Signed-off-by: Hongxu Jia + +Index: b/src/readelf.c +=================================================================== +--- a/src/readelf.c ++++ b/src/readelf.c +@@ -8343,7 +8343,8 @@ print_debug (Dwfl_Module *dwflmod, Ebl * + GElf_Shdr shdr_mem; + GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem); + +- if (shdr != NULL && shdr->sh_type == SHT_PROGBITS) ++ if (shdr != NULL && ( ++ (shdr->sh_type == SHT_PROGBITS) || (shdr->sh_type == SHT_MIPS_DWARF))) + { + static const struct + { -- cgit v1.2.3