<div dir="ltr">I just had a build with these patches fail:<div><br></div><div><div>ERROR: libice-1_1.0.9-r0 do_package: Error executing a python function in exec_python_func() autogenerated:<br></div><div><br></div><div>The stack trace of python calls that resulted in this exception/failure was:</div><div>File: 'exec_python_func() autogenerated', lineno: 2, function: <module></div><div> 0001:</div><div> *** 0002:package_do_filedeps(d)</div><div> 0003:</div><div>File: '/home/ross/Yocto/poky/meta/classes/package.bbclass', lineno: 1500, function: package_do_filedeps</div><div> 1496: continue</div><div> 1497: for files in chunks(pkgfiles[pkg], 100):</div><div> 1498: pkglist.append((pkg, files, rpmdeps, pkgdest))</div><div> 1499:</div><div> *** 1500: processed = oe.utils.multiprocess_exec( pkglist, oe.package.filedeprunner)</div><div> 1501:</div><div> 1502: provides_files = {}</div><div> 1503: requires_files = {}</div><div> 1504:</div><div>File: '/home/ross/Yocto/poky/meta/lib/oe/utils.py', lineno: 240, function: multiprocess_exec</div><div> 0236: mapresult = pool.map_async(function, commands, error_callback=failures)</div><div> 0237:</div><div> 0238: pool.close()</div><div> 0239: pool.join()</div><div> *** 0240: results = mapresult.get()</div><div> 0241: except KeyboardInterrupt:</div><div> 0242: pool.terminate()</div><div> 0243: pool.join()</div><div> 0244: raise</div><div>File: '/usr/lib/python3.5/multiprocessing/pool.py', lineno: 608, function: get</div><div> 0604: raise TimeoutError</div><div> 0605: if self._success:</div><div> 0606: return self._value</div><div> 0607: else:</div><div> *** 0608: raise self._value</div><div> 0609:</div><div> 0610: def _set(self, i, obj):</div><div> 0611: self._success, self._value = obj</div><div> 0612: if self._callback and self._success:</div><div>Exception: FileNotFoundError: [Errno 2] No such file or directory: '/data/poky-tmp/master/build/work/corei7-64-poky-linux/libice/1_1.0.9-r0/recipe-sysroot-native/usr/lib/rpm/rpmdeps'</div><div><br></div><div>ERROR: libice-1_1.0.9-r0 do_package: Function failed: package_do_filedeps</div><div>ERROR: Logfile of failure stored in: /data/poky-tmp/master/build/work/corei7-64-poky-linux/libice/1_1.0.9-r0/temp/log.do_package.4349</div><div>ERROR: Task (/home/ross/Yocto/poky/meta/recipes-graphics/xorg-lib/libice_1.0.9.bb:do_package) failed with exit code '1'</div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On 10 November 2017 at 15:55, Alexander Kanavin <span dir="ltr"><<a href="mailto:alexander.kanavin@linux.intel.com" target="_blank">alexander.kanavin@linux.intel.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Debugedit provided by rpm 4.14 is rewriting binaries in-place, and was<br>
found to produce broken output at least for grub:<br>
<a href="http://lists.openembedded.org/pipermail/openembedded-core/2017-November/143989.html" rel="noreferrer" target="_blank">http://lists.openembedded.org/<wbr>pipermail/openembedded-core/<wbr>2017-November/143989.html</a><br>
<br>
A replacement utility was suggested via private mail:<br>
<a href="https://lists.fedorahosted.org/archives/list/elfutils-devel@lists.fedorahosted.org/message/VZP4G5N2ELYZEDAB3QYLXYHDGX4WMCUF/" rel="noreferrer" target="_blank">https://lists.fedorahosted.<wbr>org/archives/list/elfutils-<wbr>devel@lists.fedorahosted.org/<wbr>message/<wbr>VZP4G5N2ELYZEDAB3QYLXYHDGX4WMC<wbr>UF/</a><br>
<br>
Signed-off-by: Alexander Kanavin <<a href="mailto:alexander.kanavin@linux.intel.com">alexander.kanavin@linux.<wbr>intel.com</a>><br>
---<br>
meta/classes/package.bbclass | 26 ++++-<br>
.../dwarfsrcfiles/<a href="http://dwarfsrcfiles.bb" rel="noreferrer" target="_blank">dwarfsrcfile<wbr>s.bb</a> | 22 ++++<br>
.../dwarfsrcfiles/files/<wbr>dwarfsrcfiles.c | 111 +++++++++++++++++++++<br>
3 files changed, 154 insertions(+), 5 deletions(-)<br>
create mode 100644 meta/recipes-devtools/<wbr>dwarfsrcfiles/<a href="http://dwarfsrcfiles.bb" rel="noreferrer" target="_blank">dwarfsrcfiles.bb</a><br>
create mode 100644 meta/recipes-devtools/<wbr>dwarfsrcfiles/files/<wbr>dwarfsrcfiles.c<br>
<br>
diff --git a/meta/classes/package.bbclass b/meta/classes/package.bbclass<br>
index 2053d46395a..dd1cfa379b0 100644<br>
--- a/meta/classes/package.bbclass<br>
+++ b/meta/classes/package.bbclass<br>
@@ -52,7 +52,8 @@ LOCALE_SECTION ?= ''<br>
ALL_MULTILIB_PACKAGE_ARCHS = "${@all_multilib_tune_values(<wbr>d, 'PACKAGE_ARCHS')}"<br>
<br>
# rpm is used for the per-file dependency identification<br>
-PACKAGE_DEPENDS += "rpm-native"<br>
+# dwarfsrcfiles is used to determine the list of debug source files<br>
+PACKAGE_DEPENDS += "rpm-native dwarfsrcfiles-native"<br>
<br>
<br>
# If your postinstall can execute at rootfs creation time rather than on<br>
@@ -334,6 +335,16 @@ def checkbuildpath(file, d):<br>
<br>
return False<br>
<br>
+def parse_debugsources_from_<wbr>dwarfsrcfiles_output(<wbr>dwarfsrcfiles_output):<br>
+ debugfiles = {}<br>
+<br>
+ for line in dwarfsrcfiles_output.<wbr>splitlines():<br>
+ if line.startswith("\t"):<br>
+ debugfiles[os.path.normpath(<wbr>line.split()[0])] = ""<br>
+<br>
+ return debugfiles.keys()<br>
+<br>
+<br>
def splitdebuginfo(file, debugfile, debugsrcdir, sourcefile, d):<br>
# Function to split a single file into two components, one is the stripped<br>
# target system binary, the other contains any debugging information. The<br>
@@ -345,7 +356,6 @@ def splitdebuginfo(file, debugfile, debugsrcdir, sourcefile, d):<br>
<br>
dvar = d.getVar('PKGD')<br>
objcopy = d.getVar("OBJCOPY")<br>
- debugedit = d.expand("${STAGING_LIBDIR_<wbr>NATIVE}/rpm/debugedit")<br>
<br>
# We ignore kernel modules, we don't generate debug info files.<br>
if file.find("/lib/modules/") != -1 and file.endswith(".ko"):<br>
@@ -359,10 +369,17 @@ def splitdebuginfo(file, debugfile, debugsrcdir, sourcefile, d):<br>
<br>
# We need to extract the debug src information here...<br>
if debugsrcdir:<br>
- cmd = "'%s' -i -l '%s' '%s'" % (debugedit, sourcefile, file)<br>
+ cmd = "'dwarfsrcfiles' '%s'" % (file)<br>
(retval, output) = oe.utils.getstatusoutput(cmd)<br>
if retval:<br>
- bb.fatal("debugedit failed with exit code %s (cmd was %s)%s" % (retval, cmd, ":\n%s" % output if output else ""))<br>
+ bb.fatal("dwarfsrcfiles failed with exit code %s (cmd was %s)%s" % (retval, cmd, ":\n%s" % output if output else ""))<br>
+<br>
+ debugsources = parse_debugsources_from_<wbr>dwarfsrcfiles_output(output)<br>
+ # filenames are null-separated - this is an artefact of the previous use<br>
+ # of rpm's debugedit, which was writing them out that way, and the code elsewhere<br>
+ # is still assuming that.<br>
+ debuglistoutput = '\0'.join(debugsources) + '\0'<br>
+ open(sourcefile, 'a').write(debuglistoutput)<br>
<br>
bb.utils.mkdirhier(os.path.<wbr>dirname(debugfile))<br>
<br>
@@ -393,7 +410,6 @@ def copydebugsources(debugsrcdir, d):<br>
dvar = d.getVar('PKGD')<br>
strip = d.getVar("STRIP")<br>
objcopy = d.getVar("OBJCOPY")<br>
- debugedit = d.expand("${STAGING_LIBDIR_<wbr>NATIVE}/rpm/bin/debugedit")<br>
workdir = d.getVar("WORKDIR")<br>
workparentdir = os.path.dirname(os.path.<wbr>dirname(workdir))<br>
workbasedir = os.path.basename(os.path.<wbr>dirname(workdir)) + "/" + os.path.basename(workdir)<br>
diff --git a/meta/recipes-devtools/<wbr>dwarfsrcfiles/<a href="http://dwarfsrcfiles.bb" rel="noreferrer" target="_blank">dwarfsrcfiles.bb</a> b/meta/recipes-devtools/<wbr>dwarfsrcfiles/<a href="http://dwarfsrcfiles.bb" rel="noreferrer" target="_blank">dwarfsrcfiles.bb</a><br>
new file mode 100644<br>
index 00000000000..c59a006edae<br>
--- /dev/null<br>
+++ b/meta/recipes-devtools/<wbr>dwarfsrcfiles/<a href="http://dwarfsrcfiles.bb" rel="noreferrer" target="_blank">dwarfsrcfiles.bb</a><br>
@@ -0,0 +1,22 @@<br>
+SUMMARY = "A small utility for printing debig source file locations embedded in binaries"<br>
+LICENSE = "GPLv2+"<br>
+LIC_FILES_CHKSUM = "file://../dwarfsrcfiles.c;<wbr>md5=<wbr>31483894e453a77acbb67847565f1b<wbr>5c;beginline=1;endline=8"<br>
+<br>
+SRC_URI = "file://dwarfsrcfiles.c"<br>
+BBCLASSEXTEND = "native"<br>
+DEPENDS = "elfutils"<br>
+DEPENDS_append_libc-musl = " argp-standalone"<br>
+<br>
+do_compile () {<br>
+ ${CC} ${CFLAGS} ${LDFLAGS} -o dwarfsrcfiles ../dwarfsrcfiles.c -lelf -ldw<br>
+}<br>
+<br>
+do_compile_libc-musl () {<br>
+ ${CC} ${CFLAGS} ${LDFLAGS} -o dwarfsrcfiles ../dwarfsrcfiles.c -lelf -ldw -largp<br>
+}<br>
+<br>
+do_install () {<br>
+ install -d ${D}${bindir}<br>
+ install -t ${D}${bindir} dwarfsrcfiles<br>
+}<br>
+<br>
diff --git a/meta/recipes-devtools/<wbr>dwarfsrcfiles/files/<wbr>dwarfsrcfiles.c b/meta/recipes-devtools/<wbr>dwarfsrcfiles/files/<wbr>dwarfsrcfiles.c<br>
new file mode 100644<br>
index 00000000000..af7af524ebe<br>
--- /dev/null<br>
+++ b/meta/recipes-devtools/<wbr>dwarfsrcfiles/files/<wbr>dwarfsrcfiles.c<br>
@@ -0,0 +1,111 @@<br>
+// dwarfsrcfiles.c - Get source files associated with the dwarf in a elf file.<br>
+// gcc -Wall -g -O2 -lelf -ldw -o dwarfsrcfiles dwarfsrcfiles.c<br>
+//<br>
+// Copyright (C) 2011, Mark Wielaard <<a href="mailto:mjw@redhat.com">mjw@redhat.com</a>><br>
+//<br>
+// This file is free software. You can redistribute it and/or modify<br>
+// it under the terms of the GNU General Public License (GPL); either<br>
+// version 2, or (at your option) any later version.<br>
+<br>
+#include <argp.h><br>
+#include <stdio.h><br>
+<br>
+#include <dwarf.h><br>
+#include <elfutils/libdw.h><br>
+#include <elfutils/libdwfl.h><br>
+<br>
+static int<br>
+process_cu (Dwarf_Die *cu_die)<br>
+{<br>
+ Dwarf_Attribute attr;<br>
+ const char *name;<br>
+ const char *dir = NULL;<br>
+<br>
+ Dwarf_Files *files;<br>
+ size_t n;<br>
+ int i;<br>
+<br>
+ if (dwarf_tag (cu_die) != DW_TAG_compile_unit)<br>
+ {<br>
+ fprintf (stderr, "DIE isn't a compile unit");<br>
+ return -1;<br>
+ }<br>
+<br>
+ if (dwarf_attr (cu_die, DW_AT_name, &attr) == NULL)<br>
+ {<br>
+ fprintf(stderr, "CU doesn't have a DW_AT_name");<br>
+ return -1;<br>
+ }<br>
+<br>
+ name = dwarf_formstring (&attr);<br>
+ if (name == NULL)<br>
+ {<br>
+ fprintf(stderr, "Couldn't get DW_AT_name as string, %s",<br>
+ dwarf_errmsg (-1));<br>
+ return -1;<br>
+ }<br>
+<br>
+ if (dwarf_attr (cu_die, DW_AT_comp_dir, &attr) != NULL)<br>
+ {<br>
+ dir = dwarf_formstring (&attr);<br>
+ if (dir == NULL)<br>
+ {<br>
+ fprintf(stderr, "Couldn't get DW_AT_comp_die as string, %s",<br>
+ dwarf_errmsg (-1));<br>
+ return -1;<br>
+ }<br>
+ }<br>
+<br>
+ if (dir == NULL)<br>
+ printf ("%s\n", name);<br>
+ else<br>
+ printf ("%s/%s\n", dir, name);<br>
+<br>
+ if (dwarf_getsrcfiles (cu_die, &files, &n) != 0)<br>
+ {<br>
+ fprintf(stderr, "Couldn't get CU file table, %s",<br>
+ dwarf_errmsg (-1));<br>
+ return -1;<br>
+ }<br>
+<br>
+ for (i = 1; i < n; i++)<br>
+ {<br>
+ const char *file = dwarf_filesrc (files, i, NULL, NULL);<br>
+ if (dir != NULL && file[0] != '/')<br>
+ printf ("\t%s/%s\n", dir, file);<br>
+ else<br>
+ printf ("\t%s\n", file);<br>
+ }<br>
+<br>
+ return 0;<br>
+}<br>
+<br>
+int<br>
+main (int argc, char **argv)<br>
+{<br>
+ char* args[3];<br>
+ int res = 0;<br>
+ Dwfl *dwfl;<br>
+ Dwarf_Addr bias;<br>
+<br>
+ if (argc != 2)<br>
+ fprintf(stderr, "Usage %s <file>", argv[0]);<br>
+<br>
+ // Pretend "dwarfsrcfiles -e <file>" was given, so we can use standard<br>
+ // dwfl argp parser to open the file for us and get our Dwfl. Useful<br>
+ // in case argument is an ET_REL file (like kernel modules). libdwfl<br>
+ // will fix up relocations for us.<br>
+ args[0] = argv[0];<br>
+ args[1] = "-e";<br>
+ args[2] = argv[1];<br>
+<br>
+ argp_parse (dwfl_standard_argp (), 3, args, 0, NULL, &dwfl);<br>
+<br>
+ Dwarf_Die *cu = NULL;<br>
+ while ((cu = dwfl_nextcu (dwfl, cu, &bias)) != NULL)<br>
+ res |= process_cu (cu);<br>
+<br>
+ dwfl_end (dwfl);<br>
+<br>
+ return res;<br>
+}<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.14.2<br>
<br>
--<br>
______________________________<wbr>_________________<br>
Openembedded-core mailing list<br>
<a href="mailto:Openembedded-core@lists.openembedded.org">Openembedded-core@lists.<wbr>openembedded.org</a><br>
<a href="http://lists.openembedded.org/mailman/listinfo/openembedded-core" rel="noreferrer" target="_blank">http://lists.openembedded.org/<wbr>mailman/listinfo/openembedded-<wbr>core</a><br>
</font></span></blockquote></div><br></div>