summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorKhem Raj <[email protected]>2023-12-10 12:20:33 -0800
committerMark Wielaard <[email protected]>2023-12-21 01:45:05 +0100
commita2194f6b305bf0d0b9dd49dccd0a5c21994c8eea (patch)
treeb53d3887a8036334f0ee8f355448b82a415fa42e /lib
parent744e3ea84d756006c95a8c07382cfdbef5a3bf58 (diff)
Add helper function for basename
musl does not provide GNU version of basename and lately have removed the definiton from string.h [1] which exposes this problem. It can be made to work by providing a local implementation of basename which implements the GNU basename behavior, this makes it work across C libraries which have POSIX implementation only. [1] https://git.musl-libc.org/cgit/musl/commit/?id=725e17ed6dff4d0cd22487bb64470881e86a92e7 * lib/system.h (xbasename): New static inline functions. Poison basename. * libdw/dwarf_getsrc_file.c (dwarf_getsrc_file): Use xbasename. * libdwfl/core-file.c (dwfl_core_file_report): Likewise. * libdwfl/dwfl_module_getsrc_file.c (dwfl_module_getsrc_file): Likewise. * libdwfl/dwfl_segment_report_module.c (dwfl_segment_report_module): Likewise. * libdwfl/find-debuginfo.c (find_debuginfo_in_path): Likewise. * libdwfl/link_map.c (report_r_debug): Likewise. * libdwfl/linux-kernel-modules.c (try_kernel_name): Likewise. * src/addr2line.c (print_dwarf_function): Likewise. (print_src): Likewise. * src/ar.c (do_oper_insert): Likewise. And cast away const in entry.key assignment. * src/nm.c (show_symbols): Use xbasename. * src/stack.c (module_callback): Likewise. * src/strip.c (handle_elf): Likewise. * tests/show-die-info.c: Include system.h. (dwarf_tag_string): Use xbasename. * tests/varlocs.c: Likewise. * debuginfod/debuginfod.cxx: Move include system.h to the end. (register_file_name): Rename basename to filename. Signed-off-by: Khem Raj <[email protected]> Signed-off-by: Mark Wielaard <[email protected]>
Diffstat (limited to 'lib')
-rw-r--r--lib/system.h14
1 files changed, 14 insertions, 0 deletions
diff --git a/lib/system.h b/lib/system.h
index 1c914efc..0db12d99 100644
--- a/lib/system.h
+++ b/lib/system.h
@@ -1,6 +1,7 @@
/* Declarations for common convenience functions.
Copyright (C) 2006-2011 Red Hat, Inc.
Copyright (C) 2022 Mark J. Wielaard <[email protected]>
+ Copyright (C) 2023 Khem Raj.
This file is part of elfutils.
This file is free software; you can redistribute it and/or modify
@@ -211,4 +212,17 @@ extern char *__cxa_demangle (const char *mangled_name, char *output_buffer,
extern int never_defined_just_used_for_checking[(expr) ? 1 : -1] \
__attribute__ ((unused))
+/* We really want a basename implementation that doesn't modify the
+ input argument. Normally you get that from string.h with _GNU_SOURCE
+ define. But some libc implementations don't define it and other
+ define it, but provide an implementation that still modifies the
+ argument. So define our own and poison a bare basename symbol. */
+static inline const char *
+xbasename(const char *s)
+{
+ const char *p = strrchr(s, '/');
+ return p ? p+1 : s;
+}
+#pragma GCC poison basename
+
#endif /* system.h */