<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: &#39;exec_python_func() autogenerated&#39;, lineno: 2, function: &lt;module&gt;</div><div>     0001:</div><div> *** 0002:package_do_filedeps(d)</div><div>     0003:</div><div>File: &#39;/home/ross/Yocto/poky/meta/classes/package.bbclass&#39;, 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: &#39;/home/ross/Yocto/poky/meta/lib/oe/utils.py&#39;, 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: &#39;/usr/lib/python3.5/multiprocessing/pool.py&#39;, 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: &#39;/data/poky-tmp/master/build/work/corei7-64-poky-linux/libice/1_1.0.9-r0/recipe-sysroot-native/usr/lib/rpm/rpmdeps&#39;</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 &#39;1&#39;</div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On 10 November 2017 at 15:55, Alexander Kanavin <span dir="ltr">&lt;<a href="mailto:alexander.kanavin@linux.intel.com" target="_blank">alexander.kanavin@linux.intel.com</a>&gt;</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 &lt;<a href="mailto:alexander.kanavin@linux.intel.com">alexander.kanavin@linux.<wbr>intel.com</a>&gt;<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 ?= &#39;&#39;<br>
 ALL_MULTILIB_PACKAGE_ARCHS = &quot;${@all_multilib_tune_values(<wbr>d, &#39;PACKAGE_ARCHS&#39;)}&quot;<br>
<br>
 # rpm is used for the per-file dependency identification<br>
-PACKAGE_DEPENDS += &quot;rpm-native&quot;<br>
+# dwarfsrcfiles is used to determine the list of debug source files<br>
+PACKAGE_DEPENDS += &quot;rpm-native dwarfsrcfiles-native&quot;<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(&quot;\t&quot;):<br>
+            debugfiles[os.path.normpath(<wbr>line.split()[0])] = &quot;&quot;<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(&#39;PKGD&#39;)<br>
     objcopy = d.getVar(&quot;OBJCOPY&quot;)<br>
-    debugedit = d.expand(&quot;${STAGING_LIBDIR_<wbr>NATIVE}/rpm/debugedit&quot;)<br>
<br>
     # We ignore kernel modules, we don&#39;t generate debug info files.<br>
     if file.find(&quot;/lib/modules/&quot;) != -1 and file.endswith(&quot;.ko&quot;):<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 = &quot;&#39;%s&#39; -i -l &#39;%s&#39; &#39;%s&#39;&quot; % (debugedit, sourcefile, file)<br>
+        cmd = &quot;&#39;dwarfsrcfiles&#39; &#39;%s&#39;&quot; % (file)<br>
         (retval, output) = oe.utils.getstatusoutput(cmd)<br>
         if retval:<br>
-            bb.fatal(&quot;debugedit failed with exit code %s (cmd was %s)%s&quot; % (retval, cmd, &quot;:\n%s&quot; % output if output else &quot;&quot;))<br>
+            bb.fatal(&quot;dwarfsrcfiles failed with exit code %s (cmd was %s)%s&quot; % (retval, cmd, &quot;:\n%s&quot; % output if output else &quot;&quot;))<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&#39;s debugedit, which was writing them out that way, and the code elsewhere<br>
+        # is still assuming that.<br>
+        debuglistoutput = &#39;\0&#39;.join(debugsources) + &#39;\0&#39;<br>
+        open(sourcefile, &#39;a&#39;).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(&#39;PKGD&#39;)<br>
         strip = d.getVar(&quot;STRIP&quot;)<br>
         objcopy = d.getVar(&quot;OBJCOPY&quot;)<br>
-        debugedit = d.expand(&quot;${STAGING_LIBDIR_<wbr>NATIVE}/rpm/bin/debugedit&quot;)<br>
         workdir = d.getVar(&quot;WORKDIR&quot;)<br>
         workparentdir = os.path.dirname(os.path.<wbr>dirname(workdir))<br>
         workbasedir = os.path.basename(os.path.<wbr>dirname(workdir)) + &quot;/&quot; + 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 = &quot;A small utility for printing debig source file locations embedded in binaries&quot;<br>
+LICENSE = &quot;GPLv2+&quot;<br>
+LIC_FILES_CHKSUM = &quot;file://../dwarfsrcfiles.c;<wbr>md5=<wbr>31483894e453a77acbb67847565f1b<wbr>5c;beginline=1;endline=8&quot;<br>
+<br>
+SRC_URI = &quot;file://dwarfsrcfiles.c&quot;<br>
+BBCLASSEXTEND = &quot;native&quot;<br>
+DEPENDS = &quot;elfutils&quot;<br>
+DEPENDS_append_libc-musl = &quot; argp-standalone&quot;<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 &lt;<a href="mailto:mjw@redhat.com">mjw@redhat.com</a>&gt;<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 &lt;argp.h&gt;<br>
+#include &lt;stdio.h&gt;<br>
+<br>
+#include &lt;dwarf.h&gt;<br>
+#include &lt;elfutils/libdw.h&gt;<br>
+#include &lt;elfutils/libdwfl.h&gt;<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, &quot;DIE isn&#39;t a compile unit&quot;);<br>
+      return -1;<br>
+    }<br>
+<br>
+  if (dwarf_attr (cu_die, DW_AT_name, &amp;attr) == NULL)<br>
+    {<br>
+      fprintf(stderr, &quot;CU doesn&#39;t have a DW_AT_name&quot;);<br>
+      return -1;<br>
+    }<br>
+<br>
+  name = dwarf_formstring (&amp;attr);<br>
+  if (name == NULL)<br>
+    {<br>
+      fprintf(stderr, &quot;Couldn&#39;t get DW_AT_name as string, %s&quot;,<br>
+            dwarf_errmsg (-1));<br>
+      return -1;<br>
+    }<br>
+<br>
+  if (dwarf_attr (cu_die, DW_AT_comp_dir, &amp;attr) != NULL)<br>
+    {<br>
+      dir = dwarf_formstring (&amp;attr);<br>
+      if (dir == NULL)<br>
+       {<br>
+         fprintf(stderr, &quot;Couldn&#39;t get DW_AT_comp_die as string, %s&quot;,<br>
+                dwarf_errmsg (-1));<br>
+         return -1;<br>
+       }<br>
+    }<br>
+<br>
+  if (dir == NULL)<br>
+    printf (&quot;%s\n&quot;, name);<br>
+  else<br>
+    printf (&quot;%s/%s\n&quot;, dir, name);<br>
+<br>
+  if (dwarf_getsrcfiles (cu_die, &amp;files, &amp;n) != 0)<br>
+    {<br>
+      fprintf(stderr, &quot;Couldn&#39;t get CU file table, %s&quot;,<br>
+            dwarf_errmsg (-1));<br>
+      return -1;<br>
+    }<br>
+<br>
+  for (i = 1; i &lt; n; i++)<br>
+    {<br>
+      const char *file = dwarf_filesrc (files, i, NULL, NULL);<br>
+      if (dir != NULL &amp;&amp; file[0] != &#39;/&#39;)<br>
+       printf (&quot;\t%s/%s\n&quot;, dir, file);<br>
+      else<br>
+       printf (&quot;\t%s\n&quot;, 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, &quot;Usage %s &lt;file&gt;&quot;, argv[0]);<br>
+<br>
+  // Pretend &quot;dwarfsrcfiles -e &lt;file&gt;&quot; 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] = &quot;-e&quot;;<br>
+  args[2] = argv[1];<br>
+<br>
+  argp_parse (dwfl_standard_argp (), 3, args, 0, NULL, &amp;dwfl);<br>
+<br>
+  Dwarf_Die *cu = NULL;<br>
+  while ((cu = dwfl_nextcu (dwfl, cu, &amp;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>