debugedit: add recipe

This recipe provides find-debuginfo which is used by rpm, more
specifically rpmbuild.

RPM upstream removed find-debuginfo and switched to use debugedit
in the following commit.

  04b0805a75

Without debugedit, rpmbuild fails to generate debuginfo package when
%debug_package is added to spec file.

(From OE-Core rev: f7ada8b4d003473abce5b589cc38aec1e5e5f18a)

Signed-off-by: Chen Qi <Qi.Chen@windriver.com>
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Chen Qi
2023-03-23 16:11:15 +08:00
committed by Richard Purdie
parent a94ca827c2
commit 4ffcbe98e8
5 changed files with 252 additions and 0 deletions

View File

@@ -135,6 +135,7 @@ RECIPE_MAINTAINER:pn-dbus = "Chen Qi <Qi.Chen@windriver.com>"
RECIPE_MAINTAINER:pn-dbus-glib = "Chen Qi <Qi.Chen@windriver.com>"
RECIPE_MAINTAINER:pn-dbus-wait = "Chen Qi <Qi.Chen@windriver.com>"
RECIPE_MAINTAINER:pn-debianutils = "Yi Zhao <yi.zhao@windriver.com>"
RECIPE_MAINTAINER:pn-debugedit = "Chen Qi <Qi.Chen@windriver.com>"
RECIPE_MAINTAINER:pn-dejagnu = "Nathan Rossi <nathan@nathanrossi.com>"
RECIPE_MAINTAINER:pn-depmodwrapper-cross = "Unassigned <unassigned@yoctoproject.org>"
RECIPE_MAINTAINER:pn-desktop-file-utils = "Alexander Kanavin <alex.kanavin@gmail.com>"

View File

@@ -0,0 +1,28 @@
SUMMARY = "Tools for creating debuginfo and source file distributions"
DESCRIPTION = "debugedit provides programs and scripts for creating \
debuginfo and source file distributions, collect build-ids and rewrite \
source paths in DWARF data for debugging, tracing and profiling."
HOMEPAGE = "https://sourceware.org/debugedit/"
LICENSE = "GPL-2.0-only & GPL-3.0-only & LGPL-2.1-only"
LIC_FILES_CHKSUM = "file://COPYING;md5=59530bdf33659b29e73d4adb9f9f6552 \
file://COPYING.LIB;md5=2d5025d4aa3495befef8f17206a5b0a1 \
file://COPYING3;md5=d32239bcb673463ab874e80d47fae504"
SRC_URI = "https://sourceware.org/ftp/debugedit/${PV}/debugedit-${PV}.tar.xz"
SRC_URI:append:libc-musl = " \
file://0001-tools-Add-error.h-for-non-glibc-case.patch \
file://0002-sepdebugcrcfix.c-do-not-use-64bit-variants.patch \
file://0003-Makefile.am-do-not-update-manual.patch \
"
SRC_URI[sha256sum] = "e9ecd7d350bebae1f178ce6776ca19a648b6fe8fa22f5b3044b38d7899aa553e"
DEPENDS = "elfutils"
inherit pkgconfig autotools
RDEPENDS:${PN} += "bash elfutils-binutils"
BBCLASSEXTEND = "native nativesdk"

View File

@@ -0,0 +1,102 @@
From 4c797d3b559ba51bd9ccd9a2036245819acce843 Mon Sep 17 00:00:00 2001
From: Chen Qi <Qi.Chen@windriver.com>
Date: Thu, 23 Mar 2023 10:54:21 +0800
Subject: [PATCH] tools: Add error.h for non-glibc case
error is glibc specific API, so this patch will mostly not accepted
upstream given that elfutils has been closely tied to glibc
This is a OE specific workaround for musl.
Upstream-Status: Inappropriate [OE Specific]
Signed-off-by: Chen Qi <Qi.Chen@windriver.com>
---
tools/debugedit.c | 7 ++++++-
tools/error.h | 27 +++++++++++++++++++++++++++
tools/sepdebugcrcfix.c | 7 ++++++-
3 files changed, 39 insertions(+), 2 deletions(-)
create mode 100644 tools/error.h
diff --git a/tools/debugedit.c b/tools/debugedit.c
index 668777a..a72c3c0 100644
--- a/tools/debugedit.c
+++ b/tools/debugedit.c
@@ -25,7 +25,6 @@
#include <byteswap.h>
#include <endian.h>
#include <errno.h>
-#include <error.h>
#include <limits.h>
#include <string.h>
#include <stdlib.h>
@@ -40,6 +39,12 @@
#include <gelf.h>
#include <dwarf.h>
+#ifdef __GLIBC__
+#include <error.h>
+#else
+#include "error.h"
+#endif
+
#ifndef MAX
#define MAX(m, n) ((m) < (n) ? (n) : (m))
#endif
diff --git a/tools/error.h b/tools/error.h
new file mode 100644
index 0000000..9b24418
--- /dev/null
+++ b/tools/error.h
@@ -0,0 +1,27 @@
+#ifndef _ERROR_H_
+#define _ERROR_H_
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+static unsigned int error_message_count = 0;
+
+static inline void error(int status, int errnum, const char* format, ...)
+{
+ va_list ap;
+ fprintf(stderr, "%s: ", program_invocation_name);
+ va_start(ap, format);
+ vfprintf(stderr, format, ap);
+ va_end(ap);
+ if (errnum)
+ fprintf(stderr, ": %s", strerror(errnum));
+ fprintf(stderr, "\n");
+ error_message_count++;
+ if (status)
+ exit(status);
+}
+
+#endif /* _ERROR_H_ */
diff --git a/tools/sepdebugcrcfix.c b/tools/sepdebugcrcfix.c
index da50e6c..c4a9d56 100644
--- a/tools/sepdebugcrcfix.c
+++ b/tools/sepdebugcrcfix.c
@@ -29,10 +29,15 @@
#include <endian.h>
#include <stdio.h>
#include <stdlib.h>
-#include <error.h>
#include <libelf.h>
#include <gelf.h>
+#ifdef __GLIBC__
+#include <error.h>
+#else
+#include "error.h"
+#endif
+
#ifndef _
#define _(x) x
#endif
--
2.17.1

View File

@@ -0,0 +1,56 @@
From 3e05bbc1f7909ab6f529e66f0d0f70fb1e60583a Mon Sep 17 00:00:00 2001
From: Chen Qi <Qi.Chen@windriver.com>
Date: Thu, 23 Mar 2023 11:55:53 +0800
Subject: [PATCH 2/2] sepdebugcrcfix.c: do not use 64bit variants
configure.ac checks for largefile support via AC_SYS_LARGEFILE
already, therefore use off_t, open and lseek instead of 64bit
variants. Musl e.g. does not define them without _LARGEFILE64_SOURCE
and error is not seen on glibc because _GNU_SOURCE defines
_LARGEFILE64_SOURCE.
This patch is marked as inappropriate as debugedit obviously only
wants to support glibc or some glibc compatible libcs. We can see
this from the error() usage. And this patch is only for musl.
Upstream-Status: Inappropriate [OE Specific]
Signed-off-by: Chen Qi <Qi.Chen@windriver.com>
---
tools/sepdebugcrcfix.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/tools/sepdebugcrcfix.c b/tools/sepdebugcrcfix.c
index c4a9d56..882e5f5 100644
--- a/tools/sepdebugcrcfix.c
+++ b/tools/sepdebugcrcfix.c
@@ -144,7 +144,7 @@ crc32 (const char *fname, const char *base_fname, uint32_t *crcp)
error (0, errno, _("cannot open \"%s\""), debugname);
return false;
}
- off64_t size = lseek64 (fd, 0, SEEK_END);
+ off_t size = lseek (fd, 0, SEEK_END);
if (size == -1)
{
error (0, errno, _("cannot get size of \"%s\""), debugname);
@@ -289,7 +289,7 @@ process (Elf *elf, int fd, const char *fname)
return true;
}
updated_count++;
- off64_t seekto = (shdr->sh_offset + data->d_off
+ off_t seekto = (shdr->sh_offset + data->d_off
+ (crcp - (const uint8_t *) data->d_buf));
uint32_t crc_targetendian = (ehdr->e_ident[EI_DATA] == ELFDATA2LSB
? htole32 (crc) : htobe32 (crc));
@@ -361,7 +361,7 @@ main (int argc, char **argv)
error (0, errno, _("cannot chmod \"%s\" to make sure we can read and write"), fname);
bool failed = false;
- int fd = open64 (fname, O_RDWR);
+ int fd = open (fname, O_RDWR);
if (fd == -1)
{
error (0, errno, _("cannot open \"%s\""), fname);
--
2.17.1

View File

@@ -0,0 +1,65 @@
From 4f0d7d2f4900ce8555e09854dc681278b7a3d9a9 Mon Sep 17 00:00:00 2001
From: Chen Qi <Qi.Chen@windriver.com>
Date: Thu, 23 Mar 2023 13:09:23 +0800
Subject: [PATCH 3/3] Makefile.am: do not update manual
The tarball ships these manuals, no need to re-generate them.
We have local patches for debugedit.c and sepdebugcrcfix.c,
this will triger re-generation of the manuals, which causes
error of missing help2man.
This is an OE specific patch. If we don't have local patches
patching debugedit.c and sepdebugcrcfix.c, this patch is also
not needed.
Upstream-Status: Inappropriate [OE Specific]
Signed-off-by: Chen Qi <Qi.Chen@windriver.com>
---
Makefile.am | 30 ------------------------------
1 file changed, 30 deletions(-)
diff --git a/Makefile.am b/Makefile.am
index 98b2f20..f91deea 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -52,36 +52,6 @@ sepdebugcrcfix_LDADD = @LIBELF_LIBS@
# Manual pages are generated for dist
dist_man_MANS = debugedit.1 sepdebugcrcfix.1 find-debuginfo.1
-# The 'case' ensures the man pages are only generated if the corresponding
-# source script (the first prerequisite) or configure.ac (for the version)
-# has been changed. The executable prerequisite is solely meant to force
-# these docs to be made only after the executable has been compiled.
-# This makes sure help2man is not normally necessary (since the generated
-# man pages are distributed).
-debugedit.1: tools/debugedit.c configure.ac debugedit$(EXEEXT)
- @case '$?' in \
- *$<* | *configure.ac* ) $(HELP2MAN) -N --output=$@ \
- --name='debug source path manipulation tool' \
- ./debugedit$(EXEEXT) ;; \
- * ) : ;; \
- esac
-
-sepdebugcrcfix.1: tools/sepdebugcrcfix.c configure.ac sepdebugcrcfix$(EXEEXT)
- @case '$?' in \
- *$<* | *configure.ac* ) $(HELP2MAN) -N --output=$@ \
- --name='fixes CRC for separate .debug files' \
- ./sepdebugcrcfix$(EXEEXT) ;;\
- * ) : ;; \
- esac
-
-find-debuginfo.1: $(top_srcdir)/scripts/find-debuginfo.in configure.ac find-debuginfo
- @case '$?' in \
- *$<* | *configure.ac* ) $(HELP2MAN) -N --output=$@ \
- --name='finds debuginfo and processes it' \
- ./find-debuginfo ;;\
- * ) : ;; \
- esac
-
noinst_HEADERS= tools/ansidecl.h \
tools/hashtab.h \
tools/md5.h \
--
2.17.1