summaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/elfutils
diff options
context:
space:
mode:
authorKhem Raj <raj.khem@gmail.com>2023-12-10 12:25:46 -0800
committerRichard Purdie <richard.purdie@linuxfoundation.org>2023-12-13 11:34:27 +0000
commit52ec79a6d305c6053acb3b9a761d1645ee5d502f (patch)
tree8ff5e0eabb9a5071a05e58b4facafbbe36418b19 /meta/recipes-devtools/elfutils
parentb8bbd1ca93115f2b1ceef63ff46bc66320c7e281 (diff)
downloadpoky-52ec79a6d305c6053acb3b9a761d1645ee5d502f.tar.gz
elfutils: Use own basename API implementation
This helps in building it for musl libc after this change [1] [1] https://git.musl-libc.org/cgit/musl/commit/?id=725e17ed6dff4d0cd22487bb64470881e86a92e7 (From OE-Core rev: ce0a4084fcb1f5da2c3210f681534cc4c4485589) Signed-off-by: Khem Raj <raj.khem@gmail.com> Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/recipes-devtools/elfutils')
-rw-r--r--meta/recipes-devtools/elfutils/elfutils_0.189.bb1
-rw-r--r--meta/recipes-devtools/elfutils/files/0001-Add-helper-function-for-basename.patch404
2 files changed, 405 insertions, 0 deletions
diff --git a/meta/recipes-devtools/elfutils/elfutils_0.189.bb b/meta/recipes-devtools/elfutils/elfutils_0.189.bb
index d69828131e..220f747cb9 100644
--- a/meta/recipes-devtools/elfutils/elfutils_0.189.bb
+++ b/meta/recipes-devtools/elfutils/elfutils_0.189.bb
@@ -21,6 +21,7 @@ SRC_URI = "https://sourceware.org/elfutils/ftp/${PV}/${BP}.tar.bz2 \
21 file://0001-skip-the-test-when-gcc-not-deployed.patch \ 21 file://0001-skip-the-test-when-gcc-not-deployed.patch \
22 file://ptest.patch \ 22 file://ptest.patch \
23 file://0001-tests-Makefile.am-compile-test_nlist-with-standard-C.patch \ 23 file://0001-tests-Makefile.am-compile-test_nlist-with-standard-C.patch \
24 file://0001-Add-helper-function-for-basename.patch \
24 " 25 "
25SRC_URI:append:libc-musl = " \ 26SRC_URI:append:libc-musl = " \
26 file://0003-musl-utils.patch \ 27 file://0003-musl-utils.patch \
diff --git a/meta/recipes-devtools/elfutils/files/0001-Add-helper-function-for-basename.patch b/meta/recipes-devtools/elfutils/files/0001-Add-helper-function-for-basename.patch
new file mode 100644
index 0000000000..3e6033fd75
--- /dev/null
+++ b/meta/recipes-devtools/elfutils/files/0001-Add-helper-function-for-basename.patch
@@ -0,0 +1,404 @@
1From 666372a5d8d5a23203c70d583904097c9e49c5a0 Mon Sep 17 00:00:00 2001
2From: Khem Raj <raj.khem@gmail.com>
3Date: Sat, 9 Dec 2023 18:23:03 -0800
4Subject: [PATCH] Add helper function for basename
5
6musl does not provide GNU version of basename and lately have removed
7the definiton from string.h [1] which exposes this problem. It can be
8made to work by providing a local implementation of basename which
9implements the GNU basename behavior, this makes it work across C
10libraries which have POSIX implementation only.
11
12Upstream-Status: Submitted [https://sourceware.org/pipermail/elfutils-devel/2023q4/006727.html]
13[1] https://git.musl-libc.org/cgit/musl/commit/?id=725e17ed6dff4d0cd22487bb64470881e86a92e7
14Signed-off-by: Khem Raj <raj.khem@gmail.com>
15---
16 lib/Makefile.am | 2 +-
17 lib/libeu.h | 1 +
18 lib/{libeu.h => xbasename.c} | 31 ++++++++++------------------
19 libdw/dwarf_getsrc_file.c | 3 ++-
20 libdwfl/core-file.c | 3 ++-
21 libdwfl/dwfl_module_getsrc_file.c | 3 ++-
22 libdwfl/dwfl_segment_report_module.c | 3 ++-
23 libdwfl/find-debuginfo.c | 7 ++++---
24 libdwfl/link_map.c | 3 ++-
25 libdwfl/linux-kernel-modules.c | 3 ++-
26 src/addr2line.c | 5 +++--
27 src/ar.c | 5 +++--
28 src/nm.c | 4 ++--
29 src/stack.c | 3 ++-
30 src/strip.c | 2 +-
31 tests/show-die-info.c | 2 +-
32 tests/varlocs.c | 2 +-
33 17 files changed, 42 insertions(+), 40 deletions(-)
34 copy lib/{libeu.h => xbasename.c} (57%)
35
36--- a/lib/Makefile.am
37+++ b/lib/Makefile.am
38@@ -33,7 +33,7 @@ AM_CPPFLAGS += -I$(srcdir)/../libelf
39
40 noinst_LIBRARIES = libeu.a
41
42-libeu_a_SOURCES = xasprintf.c xstrdup.c xstrndup.c xmalloc.c next_prime.c \
43+libeu_a_SOURCES = xasprintf.c xbasename.c xstrdup.c xstrndup.c xmalloc.c next_prime.c \
44 crc32.c crc32_file.c \
45 color.c error.c printversion.c
46
47--- a/lib/libeu.h
48+++ b/lib/libeu.h
49@@ -42,6 +42,7 @@ extern char *xstrndup (const char *, siz
50 extern char *xasprintf(const char *fmt, ...)
51 __attribute__ ((format (printf, 1, 2))) __attribute__ ((__malloc__));
52
53+extern const char *xbasename(const char *s);
54 extern uint32_t crc32 (uint32_t crc, unsigned char *buf, size_t len);
55 extern int crc32_file (int fd, uint32_t *resp);
56
57--- /dev/null
58+++ b/lib/xbasename.c
59@@ -0,0 +1,39 @@
60+/* Convenience function for basename extraction.
61+ Copyright (C) 2023 Khem Raj.
62+ This file is part of elfutils.
63+
64+ This file is free software; you can redistribute it and/or modify
65+ it under the terms of either
66+
67+ * the GNU Lesser General Public License as published by the Free
68+ Software Foundation; either version 3 of the License, or (at
69+ your option) any later version
70+
71+ or
72+
73+ * the GNU General Public License as published by the Free
74+ Software Foundation; either version 2 of the License, or (at
75+ your option) any later version
76+
77+ or both in parallel, as here.
78+
79+ elfutils is distributed in the hope that it will be useful, but
80+ WITHOUT ANY WARRANTY; without even the implied warranty of
81+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
82+ General Public License for more details.
83+
84+ You should have received copies of the GNU General Public License and
85+ the GNU Lesser General Public License along with this program. If
86+ not, see <http://www.gnu.org/licenses/>. */
87+
88+#ifdef HAVE_CONFIG_H
89+# include <config.h>
90+#endif
91+
92+#include <string.h>
93+
94+const char *
95+xbasename(const char *s) {
96+ const char *p = strrchr(s, '/');
97+ return p ? p+1 : s;
98+}
99--- a/libdw/dwarf_getsrc_file.c
100+++ b/libdw/dwarf_getsrc_file.c
101@@ -37,6 +37,7 @@
102 #include <string.h>
103
104 #include "libdwP.h"
105+#include "libeu.h"
106
107
108 int
109@@ -98,7 +99,7 @@ dwarf_getsrc_file (Dwarf *dbg, const cha
110 /* Match the name with the name the user provided. */
111 const char *fname2 = line->files->info[lastfile].name;
112 if (is_basename)
113- lastmatch = strcmp (basename (fname2), fname) == 0;
114+ lastmatch = strcmp (xbasename (fname2), fname) == 0;
115 else
116 lastmatch = strcmp (fname2, fname) == 0;
117 }
118--- a/libdwfl/core-file.c
119+++ b/libdwfl/core-file.c
120@@ -29,6 +29,7 @@
121
122 #include <config.h>
123 #include "libelfP.h" /* For NOTE_ALIGN. */
124+#include "libeu.h"
125 #include "libdwflP.h"
126 #include <gelf.h>
127
128@@ -595,7 +596,7 @@ dwfl_core_file_report (Dwfl *dwfl, Elf *
129 if (! __libdwfl_dynamic_vaddr_get (module->elf, &file_dynamic_vaddr))
130 continue;
131 Dwfl_Module *mod;
132- mod = __libdwfl_report_elf (dwfl, basename (module->name), module->name,
133+ mod = __libdwfl_report_elf (dwfl, xbasename (module->name), module->name,
134 module->fd, module->elf,
135 module->l_ld - file_dynamic_vaddr,
136 true, true);
137--- a/libdwfl/dwfl_module_getsrc_file.c
138+++ b/libdwfl/dwfl_module_getsrc_file.c
139@@ -31,6 +31,7 @@
140 #endif
141
142 #include "libdwflP.h"
143+#include "libeu.h"
144 #include "libdwP.h"
145
146
147@@ -103,7 +104,7 @@ dwfl_module_getsrc_file (Dwfl_Module *mo
148 {
149 /* Match the name with the name the user provided. */
150 lastfile = file;
151- lastmatch = !strcmp (is_basename ? basename (file) : file,
152+ lastmatch = !strcmp (is_basename ? xbasename (file) : file,
153 fname);
154 }
155 }
156--- a/libdwfl/dwfl_segment_report_module.c
157+++ b/libdwfl/dwfl_segment_report_module.c
158@@ -29,6 +29,7 @@
159
160 #include <config.h>
161 #include "libelfP.h" /* For NOTE_ALIGN4 and NOTE_ALIGN8. */
162+#include "libeu.h"
163 #include "libdwflP.h"
164 #include "common.h"
165
166@@ -718,7 +719,7 @@ dwfl_segment_report_module (Dwfl *dwfl,
167 bias += fixup;
168 if (module->name[0] != '\0')
169 {
170- name = basename (module->name);
171+ name = xbasename (module->name);
172 name_is_final = true;
173 }
174 break;
175--- a/libdwfl/find-debuginfo.c
176+++ b/libdwfl/find-debuginfo.c
177@@ -31,6 +31,7 @@
178 #endif
179
180 #include "libdwflP.h"
181+#include "libeu.h"
182 #include <stdio.h>
183 #include <fcntl.h>
184 #include <sys/stat.h>
185@@ -164,7 +165,7 @@ find_debuginfo_in_path (Dwfl_Module *mod
186 {
187 bool cancheck = debuglink_crc != (GElf_Word) 0;
188
189- const char *file_basename = file_name == NULL ? NULL : basename (file_name);
190+ const char *file_basename = file_name == NULL ? NULL : xbasename (file_name);
191 char *localname = NULL;
192
193 /* We invent a debuglink .debug name if NULL, but then want to try the
194@@ -278,7 +279,7 @@ find_debuginfo_in_path (Dwfl_Module *mod
195 else
196 {
197 subdir = NULL;
198- file = basename (debuglink_file);
199+ file = xbasename (debuglink_file);
200 }
201 try_file_basename = debuglink_null;
202 break;
203@@ -306,7 +307,7 @@ find_debuginfo_in_path (Dwfl_Module *mod
204 if (mod->dw != NULL && (p[0] == '\0' || p[0] == '/'))
205 {
206 fd = try_open (&main_stat, dir, ".dwz",
207- basename (file), &fname);
208+ xbasename (file), &fname);
209 if (fd < 0)
210 {
211 if (errno != ENOENT && errno != ENOTDIR)
212--- a/libdwfl/link_map.c
213+++ b/libdwfl/link_map.c
214@@ -29,6 +29,7 @@
215
216 #include <config.h>
217 #include "libdwflP.h"
218+#include "libeu.h"
219 #include "memory-access.h"
220 #include "system.h"
221
222@@ -469,7 +470,7 @@ report_r_debug (uint_fast8_t elfclass, u
223 if (r_debug_info_module == NULL)
224 {
225 // XXX hook for sysroot
226- mod = __libdwfl_report_elf (dwfl, basename (name),
227+ mod = __libdwfl_report_elf (dwfl, xbasename (name),
228 name, fd, elf, base,
229 true, true);
230 if (mod != NULL)
231--- a/libdwfl/linux-kernel-modules.c
232+++ b/libdwfl/linux-kernel-modules.c
233@@ -40,6 +40,7 @@
234 #include <system.h>
235
236 #include "libelfP.h"
237+#include "libeu.h"
238 #include "libdwflP.h"
239 #include <inttypes.h>
240 #include <errno.h>
241@@ -116,7 +117,7 @@ try_kernel_name (Dwfl *dwfl, char **fnam
242 /* Try the file's unadorned basename as DEBUGLINK_FILE,
243 to look only for "vmlinux" files. */
244 fd = INTUSE(dwfl_standard_find_debuginfo) (&fakemod, NULL, NULL, 0,
245- *fname, basename (*fname),
246+ *fname, xbasename (*fname),
247 0, &fakemod.debug.name);
248
249 if (fakemod.debug.name != NULL)
250--- a/src/addr2line.c
251+++ b/src/addr2line.c
252@@ -38,6 +38,7 @@
253
254 #include <system.h>
255 #include <printversion.h>
256+#include "libeu.h"
257
258
259 /* Name and version of program. */
260@@ -385,7 +386,7 @@ print_dwarf_function (Dwfl_Module *mod,
261 if (file == NULL)
262 file = "???";
263 else if (only_basenames)
264- file = basename (file);
265+ file = xbasename (file);
266 else if (use_comp_dir && file[0] != '/')
267 {
268 const char *const *dirs;
269@@ -568,7 +569,7 @@ print_src (const char *src, int lineno,
270 const char *comp_dir_sep = "";
271
272 if (only_basenames)
273- src = basename (src);
274+ src = xbasename (src);
275 else if (use_comp_dir && src[0] != '/')
276 {
277 Dwarf_Attribute attr;
278--- a/src/ar.c
279+++ b/src/ar.c
280@@ -42,6 +42,7 @@
281 #include <printversion.h>
282
283 #include "arlib.h"
284+#include "libeu.h"
285
286
287 /* Name and version of program. */
288@@ -1133,7 +1134,7 @@ do_oper_insert (int oper, const char *ar
289 for (int cnt = 0; cnt < argc; ++cnt)
290 {
291 ENTRY entry;
292- entry.key = full_path ? argv[cnt] : basename (argv[cnt]);
293+ entry.key = full_path ? argv[cnt] : (char*)xbasename (argv[cnt]);
294 entry.data = &argv[cnt];
295 if (hsearch (entry, ENTER) == NULL)
296 error_exit (errno, _("cannot insert into hash table"));
297@@ -1242,7 +1243,7 @@ do_oper_insert (int oper, const char *ar
298 /* Open all the new files, get their sizes and add all symbols. */
299 for (int cnt = 0; cnt < argc; ++cnt)
300 {
301- const char *bname = basename (argv[cnt]);
302+ const char *bname = xbasename (argv[cnt]);
303 size_t bnamelen = strlen (bname);
304 if (found[cnt] == NULL)
305 {
306--- a/src/nm.c
307+++ b/src/nm.c
308@@ -1417,7 +1417,7 @@ show_symbols (int fd, Ebl *ebl, GElf_Ehd
309 int lineno;
310 (void) dwarf_lineno (line, &lineno);
311 const char *file = dwarf_linesrc (line, NULL, NULL);
312- file = (file != NULL) ? basename (file) : "???";
313+ file = (file != NULL) ? xbasename (file) : "???";
314 int n;
315 n = obstack_printf (&whereob, "%s:%d%c", file,
316 lineno, '\0');
317@@ -1448,7 +1448,7 @@ show_symbols (int fd, Ebl *ebl, GElf_Ehd
318 {
319 /* We found the line. */
320 int n = obstack_printf (&whereob, "%s:%" PRIu64 "%c",
321- basename ((*found)->file),
322+ xbasename ((*found)->file),
323 (*found)->lineno,
324 '\0');
325 sym_mem[nentries_used].where = obstack_finish (&whereob);
326--- a/src/stack.c
327+++ b/src/stack.c
328@@ -31,6 +31,7 @@
329 #include <system.h>
330 #include <printversion.h>
331
332+#include "libeu.h"
333 /* Name and version of program. */
334 ARGP_PROGRAM_VERSION_HOOK_DEF = print_version;
335
336@@ -152,7 +153,7 @@ module_callback (Dwfl_Module *mod, void
337
338 int width = get_addr_width (mod);
339 printf ("0x%0*" PRIx64 "-0x%0*" PRIx64 " %s\n",
340- width, start, width, end, basename (name));
341+ width, start, width, end, xbasename (name));
342
343 const unsigned char *id;
344 GElf_Addr id_vaddr;
345--- a/src/strip.c
346+++ b/src/strip.c
347@@ -1807,7 +1807,7 @@ handle_elf (int fd, Elf *elf, const char
348 elf_errmsg (-1));
349 }
350
351- char *debug_basename = basename (debug_fname_embed ?: debug_fname);
352+ const char *debug_basename = xbasename (debug_fname_embed ?: debug_fname);
353 off_t crc_offset = strlen (debug_basename) + 1;
354 /* Align to 4 byte boundary */
355 crc_offset = ((crc_offset - 1) & ~3) + 4;
356--- a/tests/show-die-info.c
357+++ b/tests/show-die-info.c
358@@ -26,6 +26,7 @@
359 #include <string.h>
360 #include <unistd.h>
361
362+#include "../lib/libeu.h"
363 #include "../libdw/known-dwarf.h"
364
365 static const char *
366@@ -318,7 +319,7 @@ main (int argc, char *argv[])
367 int fd = open (argv[cnt], O_RDONLY);
368 Dwarf *dbg;
369
370- printf ("file: %s\n", basename (argv[cnt]));
371+ printf ("file: %s\n", xbasename (argv[cnt]));
372
373 dbg = dwarf_begin (fd, DWARF_C_READ);
374 if (dbg == NULL)
375--- a/tests/varlocs.c
376+++ b/tests/varlocs.c
377@@ -33,6 +33,7 @@
378
379 #include "system.h"
380 #include "../libdw/known-dwarf.h"
381+#include "../lib/libeu.h"
382
383 // The Dwarf, Dwarf_CFIs and address bias of
384 // cfi table to adjust DWARF addresses against.
385@@ -1120,7 +1121,7 @@ main (int argc, char *argv[])
386
387 const char *name = (modname[0] != '\0'
388 ? modname
389- : basename (mainfile));
390+ : xbasename (mainfile));
391 printf ("module '%s'\n", name);
392 print_die (&cudie, "CU", 0);
393
394--- a/tests/Makefile.am
395+++ b/tests/Makefile.am
396@@ -692,7 +692,7 @@ update1_LDADD = $(libelf)
397 update2_LDADD = $(libelf)
398 update3_LDADD = $(libdw) $(libelf)
399 update4_LDADD = $(libdw) $(libelf)
400-show_die_info_LDADD = $(libdw) $(libelf)
401+show_die_info_LDADD = $(libeu) $(libdw) $(libelf)
402 get_pubnames_LDADD = $(libdw) $(libelf)
403 show_abbrev_LDADD = $(libdw) $(libelf)
404 get_lines_LDADD = $(libdw) $(libelf)