debugedit.git
2 months agoAdd configure check for gdb-add-index vs dwz main
Mark Wielaard [Wed, 10 Sep 2025 13:25:59 +0000 (15:25 +0200)]
Add configure check for gdb-add-index vs dwz

Sadly gdb version >= 15 and dwz < 0.16 are incompatible.
gdb-add-index will produce .gdb_index version 9 which dwz cannot
handle (and silently throws away). Making gdb-add-index plus dwz tests
fail.  This is not very accurate, there are dwz versions 0.15 with the
gdb_index version 9 support backported where we currently also skip
testing.

* configure.ac: Add GDB_MAJOR, DWZ_MAJOR and DWZ_MINOR checks,
AC_SUBST GDB_ADD_INDEX_CHECKS_OK.
* tests/atlocal.in: Set GDB_ADD_INDEX_CHECKS_OK.
* tests/find-debuginfo.at: AT_SKIP_IF gdb-index index tests
when GDB_ADD_INDEX_CHECKS_OK is no.

Signed-off-by: Mark Wielaard <mark@klomp.org>
2 months agoFix debugedit-classify-ar ELF member (no debug) test on opensuse
Mark Wielaard [Tue, 9 Sep 2025 21:03:34 +0000 (23:03 +0200)]
Fix debugedit-classify-ar ELF member (no debug) test on opensuse

opensuse crt startup objects contain debug sections, so even without
-g you will get some debuginfo in your executable. So explicitly strip
the elf-no-debug file to make sure all .debug sections are gone for
the test.

Use eu-strip because we make sure that is installed in configure.

* tests/debugedit-classify-ar.at: Call eu-strip on
elf-no-debug.

Signed-off-by: Mark Wielaard <mark@klomp.org>
2 months agoAdd debugedit-classify-ar and use it before running do_ar_file
Mark Wielaard [Fri, 29 Aug 2025 15:10:48 +0000 (17:10 +0200)]
Add debugedit-classify-ar and use it before running do_ar_file

do_ar_file in find-debuginfo can be somewhat slow extracting archive
members and adding them to a new ar file after debugedit processing.

debugedit-classify-ar is a new helper that checks if an ar file has to
be processed, so no unnecessary work is done. It checks that the given
file is a regular archive containing ELF members that have .debug
sections and that no errors occur while reading the archive and
members. It can also check that there is a maximum number of members.

Use this in debuginfo with a limit of 768 members.

Add new tests/debugedit-classify-ar.at testcases.

 * tools/debugedit-classify-ar.c: New file.
 * scripts/find-debuginfo.in (do_file): Use
 debugedit-classify-ar before invoking do_ar_file.
 * Makefile.am (bin_PROGRAMS): Add debugedit-classify-ar.
 (debugedit_classify_ar_{SOURCES,CFLAGS,LDADD}): New variables.
 (dist_man_MANS): Add debugedit-classify-ar.1.
 (debugedit-classify-ar.1): New target.
 * .gitignore: Add debugedit-classify-ar[.1].
 * tests/debugedit-classify-ar.at: New tests.
 * tests/Makefile.am (TESTSUITE_AT): Add
 debugedit-classify-ar.at.
 * tests/testsuite.at: m4_include debugedit-classify-ar.at.

https://sourceware.org/bugzilla/show_bug.cgi?id=33305

Signed-off-by: Mark Wielaard <mark@klomp.org>
2 months agoconfigure.ac: Check for cpio, eu-strip, xz and gdb-add-index
Mark Wielaard [Mon, 1 Sep 2025 20:16:07 +0000 (22:16 +0200)]
configure.ac: Check for cpio, eu-strip, xz and gdb-add-index

Without those programs find-debuginfo will not work and make check
will produce some mysterious failures. Also error out when dwz cannot
be found.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 months agofind-debuginfo.at: Make sure foo, bar and baz have build-ids
Mark Wielaard [Tue, 8 Jul 2025 11:05:37 +0000 (13:05 +0200)]
find-debuginfo.at: Make sure foo, bar and baz have build-ids

There are still distros that don't configure gcc with
--enable-linker-build-id. So explicitly add -Wl,--build-id
to the test binaries generated.

https://sourceware.org/bugzilla/show_bug.cgi?id=33135

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 months agotests/debugedit.at: Replace 'type -p' bashism
Michał Górny [Tue, 8 Jul 2025 05:40:20 +0000 (07:40 +0200)]
tests/debugedit.at: Replace 'type -p' bashism

Replace 'type -p' with more portable 'command -v', in order to fix
running the test suite on non-bash shells.  Note that while the test
itself invokes bash, the backticks are evaluated within the context
of the shell used by autotest.

Signed-off-by: Michał Górny <mgorny@gentoo.org>
4 months agoREADME: update release URL
Jelle van der Waa [Mon, 7 Jul 2025 18:14:50 +0000 (20:14 +0200)]
README: update release URL

Signed-off-by: Jelle van der Waa <jelle@vdwaa.nl>
4 months agoconfigure: Set version to 5.2 debugedit-5.2
Mark Wielaard [Mon, 7 Jul 2025 14:27:30 +0000 (16:27 +0200)]
configure: Set version to 5.2

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 months agodebugedit: Handle EM_AMDGPU R_AMDGPU_ABS32 relocations
Mark Wielaard [Fri, 27 Jun 2025 13:38:50 +0000 (15:38 +0200)]
debugedit: Handle EM_AMDGPU R_AMDGPU_ABS32 relocations

* tools/debugedit.c (setup_relbuf): Define and handle
        R_AMDGPU_ABS32 for EM_AMDGPU.

https://sourceware.org/bugzilla/show_bug.cgi?id=33111

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 months agodebugedit: Add -p, --preserve-dates
Mark Wielaard [Thu, 19 Jun 2025 13:05:01 +0000 (15:05 +0200)]
debugedit: Add -p, --preserve-dates

When --preserve-dates is given to debugedit it will take the original
st_atim and st_mtim and put them back using utimensat after processing
the file (and setting back the original st_mode).

    * tools/debugedit.c (preserve_dates): New bool.
    (optionsTable): Add preserve-dates.
    (optionsChars): Add p.
    (helpText): Add -p|--preserve-dates.
    (main): Handle 'p'. Use utimensat if preserve_dates true.
    * tests/debugedit.at: Add new debugedit preserve timestamps test.

https://sourceware.org/bugzilla/show_bug.cgi?id=33096

4 months agoPR32760: find-debuginfo: handle static libraries quietly!
Frank Ch. Eigler [Wed, 2 Jul 2025 22:40:30 +0000 (18:40 -0400)]
PR32760: find-debuginfo: handle static libraries quietly!

A newly done "ar r foo.a" archive-initialization command
results in an unconditional output to stderr.  Choke it off
to /dev/null.

Signed-off-by: Frank Ch. Eigler <fche@redhat.com>
5 months agodebugedit.at: Deal with readelf with --wide default for buildid matching
Mark Wielaard [Fri, 27 Jun 2025 12:24:20 +0000 (14:24 +0200)]
debugedit.at: Deal with readelf with --wide default for buildid matching

We binutils readelf defaults to --wide it joins some lines when
printing ELF notes. This means the grep and awk to extract a buildid
don't work because the field numbers don't match up. Use grep -o to
only print out the matching (end) of the Build ID: line.

https://sourceware.org/bugzilla/show_bug.cgi?id=33110

Suggested-by: Vitaly Chikunov <vt@altlinux.org>
Signed-off-by: Mark Wielaard <mark@klomp.org>
5 months agoAdd basic find-debuginfo script tests
Mark Wielaard [Thu, 12 Jun 2025 21:27:50 +0000 (23:27 +0200)]
Add basic find-debuginfo script tests

Covers basic find-debuginfo script functionality. Checks .debug files
are generated by eu-strip, .gnu_debugdata is generated, .gdb_index is
added by gdb-add-index, dwz multi file is created and all debugsources
are found, also does parallel runs. Skips dwz testing if .debug_addr
is generated (since dwz currently doesn't handle that).

    * configure.ac: Check whether -gdwarf-5 produced DWARF5 .debug_addr.
    * tests/atlocal.in: Add DWARF_5_DEBUGADDR.
    * tests/Makefile.am (TESTSUITE_AT): Add find-debuginfo.at.
    * tests/testsuite.at: m4_include find-debuginfo.at.
    * tests/find-debuginfo.at: Add 5 basic variants of find-debuginfo test.

Signed-off-by: Mark Wielaard <mark@klomp.org>
5 months agoPR32760: find-debuginfo: handle static libraries
Frank Ch. Eigler [Wed, 18 Jun 2025 18:40:59 +0000 (14:40 -0400)]
PR32760: find-debuginfo: handle static libraries

Formerly, static .a libraries with debuginfo were ignored by
find-debuginfo.  If unstripped, then the raw build-directory paths in
them would leak into the downstream package.  New code in
find-debuginfo looks for archive ".a" files in the build tree, and
runs debugedit only to enumerate and rewrite source paths.  This
allows ultimate users of the .a files to link in object files with all
the debuginfo, except with usable (and debuginfod-resolvable) source
file paths.

This works by having find-debuginfo find .a files, extracting all
the .o files one at a time, running debugedit, then repacking the
files back into the .a.  do_file() delegates to do_ar_file(),
doing rather less work than for .so/exec files.

New autotest case covers duplicate-member-name functionality,
including with cruelly whitespace named members.  Defaults off
& skips testing unless ar support "O" (binutils > v2.31).

Signed-off-by: Frank Ch. Eigler <fche@redhat.com>
7 months agodebugedit: Handle unused .debug_str_offsets entries
Mark Wielaard [Mon, 7 Apr 2025 14:27:11 +0000 (16:27 +0200)]
debugedit: Handle unused .debug_str_offsets entries

As a sanity check we would assert when rewriting a .debug_str index we
hadn't seen while processing the DWARF. This relies on the DWARF
producer/compiler to not emit strings that aren't used. So when
processing/rewriting the .debug_str_offsets we assume all indexes
point to .debugstr offsets we have seen before.

This assumption doesn't seem to hold for clang++ at the moment. It
does put strings in the .debug_str section referenced from the
.debug_str_offsets section that aren't used anywhere else. So
debugedit will fail with an assert when processing such files.

We don't want to process the .debug_str_offsets section multiple time
and possibly have to rewrite other str references in other
sections. So instead when we encounter an unseen/unused string we
replace it with a dummy string "<debugedit>".

To help DWARF producers indentify these unused strings we keep a
reference to the original string table and produce a warning
explaining which .debug_str_offsets table at which index points to the
unseen .debug_str offset.

  debugedit: Warning, .debug_str_offsets table at offset ce2d0 index
  [4213] .debug_str [48cad9] entry 'CrossThreadCopierBaseHelper' unused,
  replacing with '<debugedit>'

* tools/debugedit.c (debugedit_stridxentry): New static struct
        stridxentry.
(struct strings): Add new field orig_data.
(create_dummy_debugedit_stridxentry): New function.
(string_find_new_entry): Add boolean argument accept_missing.
Return &debugedit_stridxentry if no existing string index
could be found.
(setup_strings): Fill in orig_data field.
(update_strings): New function to set orig_data field.
(orig_str): New function returns the original string at index.
(edit_strp): Call string_find_entry with false.
(update_str_offsets): Call string_find_entry with true, emit
warning if entry returned is &debugedit_stridxentry.
(edit_dwarf2): Call update_strings and
create_dummy_debugedit_stridxentry.

https://sourceware.org/bugzilla/show_bug.cgi?id=32845

Signed-off-by: Mark Wielaard <mark@klomp.org>
8 months agofind-debuginfo: Allow overriding binutils tools
Mark Wielaard [Thu, 20 Feb 2025 15:30:07 +0000 (16:30 +0100)]
find-debuginfo: Allow overriding binutils tools

find-debuginfo relies on a couple of binutils tools (readelf, objcopy
and nm) that might not have been build with cross-arch support. Make
it possible to configure with specific (target) versions and to
override the specific binaries by setting READELF, OBJCOPY or NM
environment variables.

    * Makefile.am (do_subst): Add OBJCOPY and NM substitutions.
    * configure.ac: Add OBJCOPY and NM tools override.
    * scripts/find-debuginfo.in: Allow READELF, OBJCOPY and NM
    environment overrides.

Signed-off-by: Mark Wielaard <mark@klomp.org>
9 months agoAdd option to allow disabling inlined xxhash
Chen Qi [Wed, 19 Feb 2025 02:50:46 +0000 (18:50 -0800)]
Add option to allow disabling inlined xxhash

xxhash cannot always inline. For example, when using gcc14 and
'-Og' option, xxhash cannot inline. See links below:
https://github.com/Cyan4973/xxHash/commit/574aabad87b2ab9440403e92e1075ef48554eb87
https://github.com/Cyan4973/xxHash/issues/943#issuecomment-2563205130

To allow users successfully build debugedit with gcc14 and "-Og" option,
add an option to allow disabling inlined xxhash.

This patch refers to a similar patch for libabigail:
https://sourceware.org/cgit/libabigail/commit/?id=50497911e2590c21270e0763d277457cf7752c3f

Note that the default remains using inlined xxhash.

Signed-off-by: Chen Qi <Qi.Chen@windriver.com>
10 months agofind-debuginfo: Make return from do_file explicit
Mark Wielaard [Thu, 16 Jan 2025 18:05:37 +0000 (19:05 +0100)]
find-debuginfo: Make return from do_file explicit

Make all returns from do_file explicit so they don't implicitly return
the result of the last command. Also make sure the $temp/linked file
exists, even if it is empty. A file could have hardlinks to files not
under the buildroot.

https://bugzilla.redhat.com/show_bug.cgi?id=2334760

Signed-off-by: Mark Wielaard <mark@klomp.org>
10 months agofind-debuginfo: Fix skip_mini (".gnu_debugdata") handling
Mark Wielaard [Thu, 16 Jan 2025 11:02:11 +0000 (12:02 +0100)]
find-debuginfo: Fix skip_mini (".gnu_debugdata") handling

The conditional that tests $skip_mini for true/false was inadvertently
flipped, causing the add_minidebug() function to no longer run for the
otherwise eligible binary files.

Fixes: 971a74d79b48 ("find-debuginfo: Check files are writable before modifying them")

Reported-by: Michal Domonkos <mdomonko@redhat.com>
Signed-off-by: Mark Wielaard <mark@klomp.org>
11 months agofind-debuginfo: Check files are writable before modifying them
Mark Wielaard [Thu, 28 Nov 2024 16:58:54 +0000 (17:58 +0100)]
find-debuginfo: Check files are writable before modifying them

Since commit dfe1f7ff3 ("find-debuginfo.sh: Exit with real exit status
in parallel jobs") there is a check whether gdb-add-index worked
correctly and find-debuginfo would fail (even in parallel mode) if an
error occured.

This turned out to show that gdb-add-index needs write permission to
add the gdb index to the file. This is also the case for a couple of
other things, like running objcopy --merge-notes. debugedit and
add_minidebug already made sure it had write permission.

To make sure find-debuginfo doesn't (partially) fail extend the
writable check to include the gdb-add-index and objcopy --merge-notes
invocation.

Signed-off-by: Mark Wielaard <mark@klomp.org>
12 months agotests: Ignore stderr output of readelf in debugedit.at
Mark Wielaard [Tue, 5 Nov 2024 23:28:40 +0000 (00:28 +0100)]
tests: Ignore stderr output of readelf in debugedit.at

readelf might produce some warning messages that don't matter for the
specific tests in debugedit.at. So ignore stderr output and just check
stdout output is as expected.

https://sourceware.org/bugzilla/show_bug.cgi?id=31653

Signed-off-by: Mark Wielaard <mark@klomp.org>
13 months agotests/debugedit.at: Remove bashisms
Mark Wielaard [Wed, 30 Oct 2024 11:06:02 +0000 (12:06 +0100)]
tests/debugedit.at: Remove bashisms

The "==" test operator is a bashism, and doesn't work in non-bash
shells.

https://sourceware.org/bugzilla/show_bug.cgi?id=32321

Reported-by: Michał Górny <mgorny@gentoo.org>
Signed-off-by: Mark Wielaard <mark@klomp.org>
13 months agoconfigure: Set version to 5.1 debugedit-5.1
Mark Wielaard [Tue, 29 Oct 2024 11:44:07 +0000 (12:44 +0100)]
configure: Set version to 5.1

Signed-off-by: Mark Wielaard <mark@klomp.org>
13 months agoconfigure: Adjust READELF_REGEXP for OpenSuse
Mark Wielaard [Tue, 29 Oct 2024 02:24:12 +0000 (03:24 +0100)]
configure: Adjust READELF_REGEXP for OpenSuse

Leap readelf verion looks like:
GNU readelf (GNU Binutils; SUSE Linux Enterprise 15) 2.43.1.20240828-150100.7.49
Tumbleweed uses:
GNU readelf (GNU Binutils; openSUSE Tumbleweed) 2.43.1.20240828-2

So also allow ';' and numbers before the actual version.

Signed-off-by: Mark Wielaard <mark@klomp.org>
13 months agotests: Old binutils readelf doesn't handle compressed debugsections
Mark Wielaard [Tue, 29 Oct 2024 00:49:46 +0000 (01:49 +0100)]
tests: Old binutils readelf doesn't handle compressed debugsections

Older versions don't cope correctly with compressed debug sections
https://sourceware.org/bugzilla/show_bug.cgi?id=23919
It is difficult to do a feature check for this, so just do a version
check.

13 months agodebugedit: decompress (and recompress) DWARF sections
Morten Linderud [Sun, 6 Nov 2022 17:10:23 +0000 (18:10 +0100)]
debugedit: decompress (and recompress) DWARF sections

When encountering compressed DWARF section try to decompress them
before rewriting. Afterwards recompress them. All this is
automatic. No new command line options.

Decompression was added by Morten, Mark then added recompression.

The recompression support needed a bit of workaround for an elfutils
< 0.192 bug https://sourceware.org/bugzilla/show_bug.cgi?id=32102

Various new tests were added. In debugedit.at DEBUGEDIT_SETUP now
takes an (optional) second arg to set the -gz=... option. readelf is
now called with -zp to automatically decompress any compressed
data/string sections.

https://sourceware.org/bugzilla/show_bug.cgi?id=27636

Signed-off-by: Morten Linderud <morten@linderud.pw>
Signed-off-by: Mark Wielaard <mark@klomp.org>
13 months agoscripts: find-debuginfo: mention MiniDebugInfo for -m
Sam James [Fri, 30 Aug 2024 23:43:11 +0000 (00:43 +0100)]
scripts: find-debuginfo: mention MiniDebugInfo for -m

13 months agotools: sepdebugcrcfix: sort includes
Sam James [Fri, 30 Aug 2024 23:42:43 +0000 (00:42 +0100)]
tools: sepdebugcrcfix: sort includes

13 months agotools: sepdebugcrcfix: fix build with c23
Sam James [Fri, 30 Aug 2024 23:42:42 +0000 (00:42 +0100)]
tools: sepdebugcrcfix: fix build with c23

Avoid redefining bool:
```
  CC       tools/sepdebugcrcfix-sepdebugcrcfix.o
tools/sepdebugcrcfix.c:47:13: error: two or more data types in declaration specifiers
   47 | typedef int bool;
      |             ^~~~
tools/sepdebugcrcfix.c:47:1: warning: useless type name in empty declaration
   47 | typedef int bool;
      | ^~~~~~~
tools/sepdebugcrcfix.c:48:19: error: expected identifier or ‘(’ before ‘false’
   48 | static const bool false = 0, true = 1;
      |                   ^~~~~
```

While here, include `<stdbool.h>` for older C standards than C23.

13 months agodebugedit: switch to xxhash for buildid recomputation
Frank Ch. Eigler [Tue, 24 Sep 2024 19:34:44 +0000 (15:34 -0400)]
debugedit: switch to xxhash for buildid recomputation

When debugedit recomputes build-id (due to -i), it previously used md5
or sha1 (depending on length of incoming buildid).  This patch
replaces both those (including the code that does all the hashing)
with a 128-bit xxhash.  The 128-bit hash is truncated or padded to
whatever the incoming ELF note width was.

xxhash is much faster (8x over sha1) than either of those
crypto-flavoured hashes, and still produces fairly collision-free
values.  This was confirmed informally with a bulk build-id
recomputation of a few million binaries in the debuginfod server
corpus, yielding zero unexpected collisions.

Signed-off-by: Frank Ch. Eigler <fche@redhat.com>
13 months agodebugedit: Handle DWARF5 DW_UT_type (Unit type 2) in ET_EXE/DYN
Mark Wielaard [Sat, 28 Sep 2024 21:39:29 +0000 (23:39 +0200)]
debugedit: Handle DWARF5 DW_UT_type (Unit type 2) in ET_EXE/DYN

Handle DW_UT_type as if it is a DW_UT_compile unit by skipping the
type id and offset in the header. Which are the only differences with
DW_UT_compile. And the id and offset don't need to be rewritten. This
doesn't handle debug types in objects or partial linked (ET_REL) files
that contain COMDAT sections (because debugedit doesn't handle more
than one debug_info section). Add a testcase for foobarbaz.exe.

https://sourceware.org/bugzilla/show_bug.cgi?id=32157

Signed-off-by: Mark Wielaard <mark@klomp.org>
15 months agofind-debuginfo.sh: Exit with real exit status in parallel jobs
Keith Seitz [Fri, 16 Aug 2024 18:54:20 +0000 (11:54 -0700)]
find-debuginfo.sh: Exit with real exit status in parallel jobs

Currently, when the script is executed in parallel (-jN), the
resulting exit status will always be 0.

The script execs an appropriate number of clones of itself, calling
run_job to run the actual workload. This then calls do_file(), saving
the exit status into "res.$jobid".

In do_file(), though, if an error occurs, exit is called. This causes
the entire exec'd shell to exit with status 0 (since there are almost
always echo calls as the last executed statement). The real exit
status is therefor never written to the "res.$jobid" files by run_job().

The simple solution is to use 'return' instead of 'exit'. A number
of minor adjustments are also made to propagate this properly so that
it is reported as the correct exit status.

While at it, I've incorporated a patch for find-debuginfo/30505.
Using this patch and another patch to the RPM package (submitted as
github issue #3215), failures of gdb-add-index.sh will now properly fail
the build instead of being swallowed. It should be much easier for
developers to figure out why their builds have failed should gdb crash.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30505
Signed-off-by: Keith Seitz <keiths@redhat.com>
18 months agodebugedit: Handle DW_MACRO_{define,undef}_strx
Mark Wielaard [Sun, 19 May 2024 19:59:15 +0000 (21:59 +0200)]
debugedit: Handle DW_MACRO_{define,undef}_strx

For DW_MACRO_{define,undef}_strx we need to record the string index of
the macro. Since this is read through the .debug_str_offets we need to
know the relevant str_offsets_base of the CU associated with the macro
table. Add a macros_offs field to struct CU. Set this in when seeing a
DW_AT_macros. And make sure relocations against .debug_macros are
resolved when handling ET_REL files.

Now all (macro) tests pass with CC=clang even when clang defaults to
-gdwarf-5. The .debug_types tests are skipped because clang doesn't
emit that section.

Signed-off-by: Mark Wielaard <mark@klomp.org>
18 months agodebugedit: Track active CU
Mark Wielaard [Sat, 18 May 2024 22:18:02 +0000 (00:18 +0200)]
debugedit: Track active CU

The current CU is tracked indirectly by having static variables for
ptr_size, cu_version and str_offsets_base. These are used to
process/skip forms and resolve strx forms. Put all three in a new
struct CU which must be passed to do_read_str_form_relocated,
skip_form, edit_strp and edit_attributes. The struct CU can then also
be used when parsing the line table string forms.

This should make .debug_line tables which use strx forms work (no
producers have been found that use those though).

Signed-off-by: Mark Wielaard <mark@klomp.org>
18 months agodebug_str_offsets header version and padding are 2 bytes, not 4 bytes
Mark Wielaard [Sun, 5 May 2024 18:41:12 +0000 (20:41 +0200)]
debug_str_offsets header version and padding are 2 bytes, not 4 bytes

Reading too much bytes for the header made debugedit skip the first
actual string offsets table entry.

Signed-off-by: Mark Wielaard <mark@klomp.org>
18 months agoOnly process one file at a time in tests with binutils readelf
Mark Wielaard [Sun, 5 May 2024 16:06:46 +0000 (18:06 +0200)]
Only process one file at a time in tests with binutils readelf

Processing multiple files in one run with binutils readelf seems to
cause (extra) errors when there is an issue with one of the files.

Invoking readelf on one file at a time makes is slightly easier to
analyze test failures.

Signed-off-by: Mark Wielaard <mark@klomp.org>
18 months agoSimplify update_rela_data by checking rel_updated
Mark Wielaard [Sat, 18 May 2024 23:14:51 +0000 (01:14 +0200)]
Simplify update_rela_data by checking rel_updated

Now that we track whether relocations have been updated per section we
can just check the section rel_updated field in update_rela_data. This
also makes sure the relbuf is always freed.

Signed-off-by: Mark Wielaard <mark@klomp.org>
18 months agoMake relocation reading explicit
Mark Wielaard [Sun, 5 May 2024 12:46:31 +0000 (14:46 +0200)]
Make relocation reading explicit

Relocation handling used to be linear per section. But since handling
.debug_str_offsets (which can have relocations itself) we had to
"reset" the relocation handling when switching between reading
sections. This caused a lnear search from the start of the relocation
table each time section reading was switched. Since this was slow
do_read_32_relocated needed to be optimized using a binary search
(commit fbad879eb).

Since we do a binary search now, resetting the relocation
datastructure isn't really needed. It is also a little confusing and
fragile. Rewrite the relocation code so it works per section and
doesn't need "switching".

Make the relocation related data structures part of struct
debug_section. And change do_read_32_relocated to take a struct
debug_section. This way we make explicit from which section we are
reading.

Signed-off-by: Mark Wielaard <mark@klomp.org>
18 months ago.gitignore: Add config.guess and config.sub
Mark Wielaard [Thu, 16 May 2024 11:42:37 +0000 (13:42 +0200)]
.gitignore: Add config.guess and config.sub

Signed-off-by: Mark Wielaard <mark@klomp.org>
18 months agoOptimize do_read_32_relocated using binary search
Nikita Popov [Wed, 17 Apr 2024 06:34:19 +0000 (15:34 +0900)]
Optimize do_read_32_relocated using binary search

debugedit is currently very slow when processing DWARF 5 debuginfo
produced by clang. For some kernel modules, debugedit processing
takes hours.

The root cause of the issue is the loop for finding the correct
REL entry in do_read_32_relocated. This is currently a simple
linear scan. For large objects, it may loop for hundreds of
thousands of iterations.

As the relocations are sorted, we can use a binary search instead,
which is what this patch implements. The time to run debugedit on
a large kernel module (nouveau.ko) drops down to 3 seconds with
this change.

Signed-off-by: Nikita Popov <npopov@redhat.com>
20 months agodebugedit: Only write the ELF file when updating strings or build-id
Mark Wielaard [Mon, 18 Mar 2024 22:37:47 +0000 (23:37 +0100)]
debugedit: Only write the ELF file when updating strings or build-id

Only open the ELF file read/write and write out the data if we
actually did any elf structure update or updating the build-id.

* tools/debugedit.c (fdopen_dso): Call elf_begin with
ELF_C_READ when not changing dest_dir or build_id,
otherwise use ELF_C_RDWR.
(main): Call open with O_RDONLY when not changing dest_dir
or build_id, otherwise use O_RDWR. Call elf_update with
ELF_C_WRITE when rewriting any string, updating any ELF
structure or build_id.

https://sourceware.org/bugzilla/show_bug.cgi?id=31504

Signed-off-by: Mark Wielaard <mark@klomp.org>
23 months agodebugedit: Add support for .debug_str_offsets (DW_FORM_strx)
Mark Wielaard [Thu, 23 Mar 2023 17:07:40 +0000 (18:07 +0100)]
debugedit: Add support for .debug_str_offsets (DW_FORM_strx)

In theory supporting strx .debug_str_offsets is easy, the strings in
.debug_str are just read through an indirection table. When the
strings are updated in .debug_str we just need to rewrite the
indirection table.

The tricky part is the ET_REL (object files or kernel modules)
support. Relocation reading is "global" per section and we expect to
read a relocation only once. But we need to read the
DW_AT_str_offsets_base before reading any strx form attributes. So we
read that first, then reset the relptr. And when we read from the
.debug_str_offsets section we need to save and restore the .debug_info
relptr.

* tools/debugedit.c (do_read_24): New function.
(str_offsets_base): New static variable.
(buf_read_ule24): New function.
(buf_read_ube24): Likewise.
(setup_relbuf): Handle .debug_str_offsets.
(do_read_uleb128): New function.
(do_read_str_form_relocated): Likewise.
(read_abbrev): Handle DW_FORM_strx[1234].
(edit_strp): Take the actual string form as argument.
Use do_read_str_form_relocated.
(read_dwarf5_line_entries): Pass form to edit_strp.
(edit_attributes_str_comp_dir): Take the actual string
form as argument. Use do_read_str_form_relocated.
(edit_attributes): Handle DW_FORM_strx[1234].
(edit_info): Read DW_AT_str_offsets_base first.
(update_str_offsets): New function.
(edit_dwarf2): Setup do_read_24. Call update_str_offsets.

https://sourceware.org/bugzilla/show_bug.cgi?id=28728

Signed-off-by: Mark Wielaard <mark@klomp.org>
2 years agodebugedit: Fix missing space in --help output
Mark Wielaard [Mon, 28 Aug 2023 11:09:27 +0000 (13:09 +0200)]
debugedit: Fix missing space in --help output

    * tools/debugedit.c (helpText): Add space before -i.

Signed-off-by: Mark Wielaard <mark@klomp.org>
2 years agosepdebugcrcfix: Do not use LFS64 functions
Violet Purcell [Tue, 11 Jul 2023 19:52:57 +0000 (15:52 -0400)]
sepdebugcrcfix: Do not use LFS64 functions

The LFS64 function calls have been gated behind the _LARGEFILE64_SOURCE
macro in musl 1.2.4, and will be removed altogether in musl 1.2.5. Since
configure.ac has the AC_SYS_LARGEFILE macro, which ensures that all
functions on 32-bit glibc systems will be 64-bit, just replace the
interfaces with their normal variants.

Signed-off-by: Violet Purcell <vimproved@inventati.org>
2 years agoAlways run cpio with --quiet
Mark Wielaard [Sun, 2 Jul 2023 11:35:24 +0000 (13:35 +0200)]
Always run cpio with --quiet

Printing the number of blocks copied is never really useful.

Signed-off-by: Mark Wielaard <mark@klomp.org>
2 years agofind-debuginfo: Add -v,--verbose for per file messages
Denys Vlasenko [Thu, 22 Jun 2023 13:31:03 +0000 (15:31 +0200)]
find-debuginfo: Add -v,--verbose for per file messages

Only print messages what big steps we are at without --verbose.

For a reader of rpmbuild's log, it's rather unclear what find-debuginfo
is doing. It used to be too verbose, "extracting debug info from FILE"
for every file, and while this can be suppressed now, we still end up
with something semi-mysterious like this:

...
extracting debug info from /builddir/build/BUILDROOT/xyz
gdb-add-index: No index was created for /builddir/build/BUILDROOT/xyz
gdb-add-index: [Was there no debuginfo? Was there already an index?]
symlinked /usr/lib/debug/usr/lib64/libcpupower.so.0.0.1.debug to /usr/lib/debug/usr/lib64/libcpupower.so.debug
symlinked /usr/lib/debug/usr/lib64/libcpupower.so.0.0.1.debug to /usr/lib/debug/usr/lib64/libcpupower.so.0.debug
cpio: binutils-2.30/bfd: Cannot stat: No such file or directory
cpio: binutils-2.30/bfd/aout-target.h: Cannot stat: No such file or directory
cpio: binutils-2.30/bfd/aoutx.h: Cannot stat: No such file or directory
cpio: binutils-2.30/bfd/archive.c: Cannot stat: No such file or directory
cpio: binutils-2.30/bfd/archive64.c: Cannot stat: No such file or directory
...
775655 blocks
+ /usr/lib/rpm/check-buildroot
+ /usr/lib/rpm/redhat/brp-ldconfig
...

The reader is left confused. "What these cpio errors are about?
Why those sources are not found?" (Well, because not every source
name extracted by 'debugedit -l' has to exist, but this requires
considerable digging aroung to understand).

We can give a few messages explaining what general steps we go through:

    Extracting debug info from N files
    DWARF-compressing N files
    Creating .debug symlinks for symlinks to ELF files
    Copying sources found by 'debugedit -l'

This is also useful to get a feeling which steps are time consuming.
Kernel builds often need to investigate this aspect. To help a bit more,
add "find-debuginfo: starting" and "find-debuginfo: done" messages too.

This patch adds these messages.
The -q options suppress these messages too.

It also adds a --verbose flag to print per file messages.
Those per file messages are now suppressed by default and
only the general step messages are show. Unless -q is given,
which suppresses all non-error output.

Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
Signed-off-by: Mark Wielaard <mark@klomp.org>
2 years agofind-debuginfo: Prefix install_dir to PATH
Mark Wielaard [Thu, 29 Jun 2023 12:26:39 +0000 (14:26 +0200)]
find-debuginfo: Prefix install_dir to PATH

Some distros install a symlink to find-debuginfo[.sh] under the
old /usr/lib/rpm/ path. But don't have symlinks there for other
helper tools like debugedit and sepdebugcrcfix. So those tools
are then not under the install_dir as find-debuginfo calculates
it. So instead of invoking those helper tools with a full install
dir path, prefix the install dir to the PATH so the tools can be
found there (or anywhere else on the PATH).

Signed-off-by: Mark Wielaard <mark@klomp.org>
2 years agofind-debuginfo: remove duplicate filenames when creating debugsources.list
Denys Vlasenko [Wed, 14 Jun 2023 14:56:38 +0000 (16:56 +0200)]
find-debuginfo: remove duplicate filenames when creating debugsources.list

We remove duplicate filenames when we _process_ debugsources.list.
However, this means that momentarily we may have a very large
(in the range of *giga*bytes) debugsources.list.

This is unnecessary, we can also remove dups when we *create* it.

Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
2 years agodebugedit: Simplify and extend .debug_line tests
Mark Wielaard [Fri, 24 Mar 2023 23:49:36 +0000 (00:49 +0100)]
debugedit: Simplify and extend .debug_line tests

The debugedit .debug_line tests were only checking the directory
table, skipping the file name table assuming those would not be
include a directory element. But some compilers output the file
names as absolute paths (so ignoring the directory table entries,
which is slightly inefficient). Check both tables now using sed
to replace the directory strings.

Signed-off-by: Mark Wielaard <mark@klomp.org>
2 years agodebuginfo: check whether compiler needs -fdebug-macro
Mark Wielaard [Fri, 24 Mar 2023 17:05:41 +0000 (18:05 +0100)]
debuginfo: check whether compiler needs -fdebug-macro

Some compilers only generate a .debug_macro section when given the
-fdebug_macro flag.

Signed-off-by: Mark Wielaard <mark@klomp.org>
2 years agodebugedit: skip .debug_types tests if compiler doesn't generate section
Mark Wielaard [Fri, 24 Mar 2023 16:32:53 +0000 (17:32 +0100)]
debugedit: skip .debug_types tests if compiler doesn't generate section

Some compilers don't generate a .debug_types section even when compiling
with -fdebug-types-section. Skip testing the .debug_types tests in that
case.

Signed-off-by: Mark Wielaard <mark@klomp.org>
2 years agodebugedit: Use 'z', not 'Z' as conversion specifier
Mark Wielaard [Thu, 23 Mar 2023 16:08:45 +0000 (17:08 +0100)]
debugedit: Use 'z', not 'Z' as conversion specifier

Both are valid for size_t but 'z' is the standard one.

Signed-off-by: Mark Wielaard <mark@klomp.org>
2 years agoconfigure.ac: Update AC_PROG_CC for autoconf 2.70
Mark Wielaard [Sat, 28 Jan 2023 19:51:12 +0000 (20:51 +0100)]
configure.ac: Update AC_PROG_CC for autoconf 2.70

With autoconf 2.70 we must use AC_PROG_CC (which will check for
c11 and c99), for earlier versions we'll use AC_PROG_CC_C99.

Signed-off-by: Mark Wielaard <mark@klomp.org>
2 years agoscripts/find-debuginfo.in: Add -q|--quiet
Prarit Bhargava [Thu, 26 Jan 2023 21:08:57 +0000 (16:08 -0500)]
scripts/find-debuginfo.in: Add -q|--quiet

Projects with a large number of compiled files end up with a large number
of 'extracting debug info from' messages in the build log.  In the case of
the Fedora kernel these messages account for 8504 lines in the log, or 61%
of the entire log [1].

Removing these lines make the log easier to view and comprehend for some
projects, however, not all projects will want to silence these messages so
suppressing them must be optional.

Add a -q|--quiet which allows users to silence the non-error output from
the script.

[1] https://kojipkgs.fedoraproject.org//packages/kernel/6.2.0/0.rc5.20230123git2475bf0250de.38.fc38/data/logs/x86_64/build.log

Signed-off-by: Prarit Bhargava <prarit@redhat.com>
2 years agoconfigure.ac: Use AC_LANG_PROGRAM for AC_LINK_IFELSE -gz=none check
Mark Wielaard [Fri, 27 Jan 2023 16:03:33 +0000 (17:03 +0100)]
configure.ac: Use AC_LANG_PROGRAM for AC_LINK_IFELSE -gz=none check

We do need a real AC_LANG_PROGRAM instead of just AC_LANG_SOURCE since
commit 73652f configure.ac: Use AC_LINK_IFELSE for -gz=none check

Otherwise the check always fails because it will not have a main ().

Signed-off-by: Mark Wielaard <mark@klomp.org>
2 years agoconfigure.ac: Use AC_LINK_IFELSE for -gz=none check
Mark Wielaard [Fri, 27 Jan 2023 14:23:15 +0000 (15:23 +0100)]
configure.ac: Use AC_LINK_IFELSE for -gz=none check

Because of a bug in gcc 13.0 (pre-release) -gz=none does not work
correctly when linking the final binary in some situations (when
-gz=zstd isn't supported). Work around this by explicitly checking for
support with AC_LINK_IFELSE.

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108572

Signed-off-by: Mark Wielaard <mark@klomp.org>
2 years agofind-debuginfo: Pass -j down to dwz
Kalev Lember [Thu, 19 Jan 2023 16:03:18 +0000 (17:03 +0100)]
find-debuginfo: Pass -j down to dwz

Now that dwz 0.15 supports parallel jobs, add a way to control it from
here. find-debuginfo already has a -j parameter so we can just extend it
and pass the value down to dwz as well.

This should fix building large packages on memory constrained builders,
such as webkitgtk on s390x in Fedora koji build system, where we can now
use the -j option to tune down parallelism to avoid running out of
memory during dwz run.

Add a configure check to make sure the installed dwz supports the
-j option.

Signed-off-by: Kalev Lember <klember@redhat.com>
Signed-off-by: Mark Wielaard <mark@klomp.org>
2 years agodebugedit: Add support for loongarch
daifan [Tue, 10 Jan 2023 04:04:39 +0000 (12:04 +0800)]
debugedit: Add support for loongarch

* tools/debugedit.c (setup_relbuf): Handle EM_LOONGARCH

2 years agodebugedit: Skip calling edit_dwarf2 if not rewriting and/or listing source
Mark Wielaard [Wed, 28 Dec 2022 21:23:01 +0000 (22:23 +0100)]
debugedit: Skip calling edit_dwarf2 if not rewriting and/or listing source

We skipped calling edit_dwarf2 when no base and dest dir were given and
debugedit was invoked with -i -n. But we never need to call edit_dwarf2
if we aren't rewriting paths and we don't want to list the source files.

   * tools/debugedit.c (main): Adjust edit_dwarf2 call guard.

https://sourceware.org/bugzilla/show_bug.cgi?id=27639

3 years agodebugedit: Use standard libelf elf_strptr
Mark Wielaard [Wed, 20 Apr 2022 22:05:38 +0000 (00:05 +0200)]
debugedit: Use standard libelf elf_strptr

The strptr function in debugedit.c does the same thing as libelf
elf_strptr. But elf_strptr handles bounds checks and invalid section
offsets better. And elf_strptr handles compressed sections.

* tools/debugedit.c (strptr): Just call elf_strptr.

Signed-off-by: Mark Wielaard <mark@klomp.org>
3 years agodebugedit: Guard against NULL names returned by by strptr
Mark Wielaard [Thu, 24 Mar 2022 17:04:45 +0000 (18:04 +0100)]
debugedit: Guard against NULL names returned by by strptr

debugedit.c (edit_dwarf2): Check name is not NULL before
calling strncmp.
(main): Check name is not NULL before calling strcmp.

This is unlikely to happen, except when the ELF file is corrupt.

Signed-off-by: Mark Wielaard <mark@klomp.org>
3 years agoFix -u option
Allan McRae [Sun, 2 Jan 2022 05:23:34 +0000 (15:23 +1000)]
Fix -u option

The -u option was missing from optionsChars resulting in it being
unrecognised.

$ debugedit -u
debugedit: invalid option -- 'u'

Signed-off-by: Allan McRae <allan@archlinux.org>
4 years agodebugedit: Handle hppa EM_PARISC and R_PARISC_DIR32
Mark Wielaard [Thu, 18 Nov 2021 13:14:28 +0000 (14:14 +0100)]
debugedit: Handle hppa EM_PARISC and R_PARISC_DIR32

* tools/debugedit.c (setup_relbuf): Handle EM_PARISC

https://sourceware.org/bugzilla/show_bug.cgi?id=28598

Patch-provided-by: dave.anglin@bell.net
Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agodebugedit: Use original shdr sh_type to check for NOBITS
Mark Wielaard [Mon, 11 Oct 2021 11:57:15 +0000 (13:57 +0200)]
debugedit: Use original shdr sh_type to check for NOBITS

* tools/debugedit.c (handle_build_id): Check SHT_NOBITS
against dso->shdr[i].sh_type.

https://www.sourceware.org/bugzilla/show_bug.cgi?id=28408

Reported-by: Alexey Brodkin <alexey.brodkin@gmail.com>
Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agofind-debuginfo.sh: Remove bogus shift after --dwz-single-file-mode
Mark Wielaard [Fri, 24 Sep 2021 10:16:07 +0000 (12:16 +0200)]
find-debuginfo.sh: Remove bogus shift after --dwz-single-file-mode

https://sourceware.org/bugzilla/show_bug.cgi?id=28382

Reported-by: mls@suse.de
Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agotests: Handle zero directory entry in .debug_line DWARF5 debugedit.at
Mark Wielaard [Fri, 30 Jul 2021 16:09:46 +0000 (18:09 +0200)]
tests: Handle zero directory entry in .debug_line DWARF5 debugedit.at

We were skipping the zero directory entry, because it was always
the same as the directory entry at position one. But that isn't
true anymore with gcc 11.2.1. There the zero dir entry is unique.
Fix the debugedit.at .debug_line testcases using DWARF5 to also
include dir entry zero.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agouse $READELF, not readelf
Sergei Trofimovich [Sun, 1 Aug 2021 20:15:35 +0000 (21:15 +0100)]
use $READELF, not readelf

Allow user to specify own readelf. Use detected readelf,
not 'readelf'.

Noticed as a set of test failures on system with only
$host-prefixed tools:

  debugedit/tests/testsuite.dir/at-groups/4/test-source:
    line 40: readelf: command not found

* configure.ac: Add READELF user override.
* scripts/find-debuginfo.in: Use @READELF@ instead of 'readelf'.
* tests/atlocal.in: Populate READELF variable detected by configure.
* tests/debugedit.at: Use $READELF instad of 'readelf' in tests.
* Makefile.am (do_subst): Add READELF substitution.

Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org>
4 years agodebuginfo-find: simplify RPM env handling debugedit-5.0
Mark Wielaard [Mon, 26 Jul 2021 22:46:35 +0000 (00:46 +0200)]
debuginfo-find: simplify RPM env handling

As pointed out by Dmitry V. Levin the RPM env checking used redundant
trailing semicolons and wasn't somewhat verbose. Replace the three
checks with simpler for loop check over all env variables we are
expecting.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agofind-debuginfo: Move RPM env checks after --version/help processing
Mark Wielaard [Mon, 26 Jul 2021 22:32:50 +0000 (00:32 +0200)]
find-debuginfo: Move RPM env checks after --version/help processing

Checking before breaks --version and --help handling in the script.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agoSet version to 5.0
Mark Wielaard [Mon, 26 Jul 2021 22:18:49 +0000 (00:18 +0200)]
Set version to 5.0

First release. Version set higher than any rpm release.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agofind-debuginfo: Check RPM environment variables are there
Mark Wielaard [Mon, 26 Jul 2021 22:01:15 +0000 (00:01 +0200)]
find-debuginfo: Check RPM environment variables are there

find-debuginfo relies on a couple of RPM environment variables.
Ideally we provide command line arguments to set them. But they are
somewhat tied to how rpm sets things up.  So for now just warn and
exit if they aren't set.

See also https://sourceware.org/bugzilla/show_bug.cgi?id=27637

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agoRecord and write files in read_dwarf5_line_entries.
Mark Wielaard [Mon, 5 Jul 2021 16:35:04 +0000 (18:35 +0200)]
Record and write files in read_dwarf5_line_entries.

Without giving -d /foo/build/bar debugedit wouldn't actually output
any file from the line number table for DWARF5.

* tools/debugedit.c (read_dwarf5_line_entries): Don't make
collecting_dirs and writing_files depend on dest_dir. Always
read idx for strp or line_strp on phase 0. comp_dir_len is
zero when comp_dir is NULL.
* tests/debugedit.at: Add source list mode tests for DWARF4
and DWARF5.

https://bugzilla.redhat.com/show_bug.cgi?id=1966987

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agotests: Disable CFLAGS and LDFLAGS overrides
Mark Wielaard [Mon, 12 Jul 2021 20:19:02 +0000 (22:19 +0200)]
tests: Disable CFLAGS and LDFLAGS overrides

We do use the CC and LD found by configure, but explicitly keep
CFLAGS and LDFLAGS empty because the tests use specific flags.

https://sourceware.org/bugzilla/show_bug.cgi?id=27890

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agodebugedit: check write to list_file succeeds
Mark Wielaard [Thu, 1 Jul 2021 15:14:40 +0000 (17:14 +0200)]
debugedit: check write to list_file succeeds

We didn't check, or ignored, errors writing to the list_file. Always
produce an error if we cannot write to the list_file.

* debugedit.c (read_dwarf4_line): Produce error if write fails.
(read_dwarf5_line_entries): Likewise.
(edit_attributes): Likewise.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agoResync libiberty sha1.c
Mark Wielaard [Thu, 1 Jul 2021 14:48:26 +0000 (16:48 +0200)]
Resync libiberty sha1.c

This brings in the following commit:

  commit f6e9c1c9191c8b9998e03cb15de8600a2a4b9188
  Author: Nick Clifton <nickc@redhat.com>
  Date:   Tue Mar 16 14:43:17 2021 +0000

    Fix potentially undefined behaviour when computing a sha1 value.

    libiberty/
            * sha1.c (sha1_process_bytes): Use memmove in place of memcpy.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agodebugedit: Report errors if we cannot chmod the file.
Mark Wielaard [Thu, 1 Jul 2021 14:37:13 +0000 (16:37 +0200)]
debugedit: Report errors if we cannot chmod the file.

  * tools/debugedit.c (main): Check result of chmod and call error
  if necessary.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agosepdebugcrcfix: Report errors if we cannot chmod the file.
Mark Wielaard [Thu, 1 Jul 2021 14:30:24 +0000 (16:30 +0200)]
sepdebugcrcfix: Report errors if we cannot chmod the file.

* tools/sepdebugcrcfix.c (main): Check result of chmod and call error
if necessary.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agosepdebugcrcfix: Don't crash if .gnu_debuglink doesn't contain a file string.
Mark Wielaard [Thu, 1 Jul 2021 14:12:56 +0000 (16:12 +0200)]
sepdebugcrcfix: Don't crash if .gnu_debuglink doesn't contain a file string.

If the .gnu_debuglink section didn't contain a valid file string then we would crash.
Produce an error instead.

* tools/sepdebugcrcfix.c (process): Produce an error when zerop is NULL.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agodebugedit: Skip relocations with missing symbol/section offset.
Mark Wielaard [Thu, 1 Jul 2021 09:58:38 +0000 (11:58 +0200)]
debugedit: Skip relocations with missing symbol/section offset.

We tried to handle relocations that didn't have a symbol associated
with any section.  The would cause a message like: "Unhandled
relocation 1 in .debug_info section".  Which wasn't that helpful
either. So skip relocations without an associated symbol section index
and improve the error message a little.

    * debugedit.c (setup_relbuf): Continue when sym.st_shndx == 0.
    Add relocation index to error message.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agodebugedit: Handle realloc failure correctly.
Mark Wielaard [Thu, 1 Jul 2021 12:50:04 +0000 (14:50 +0200)]
debugedit: Handle realloc failure correctly.

Although we are already in trouble when realloc fails don't make it
worse.  When realloc fails we have to free the original pointer we
wanted to extend to not cause an even bigger memory leak.

* tools/debugedit.c (read_abbrev): Free original t after realloc
fails.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agoSet version to 0.3 debugedit-0.3
Mark Wielaard [Thu, 17 Jun 2021 13:14:35 +0000 (15:14 +0200)]
Set version to 0.3

Another pre-release, with find-debuginfo.sh -> find-debuginfo rename.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agofind-debuginfo: Generate and install as top-level build file.
Mark Wielaard [Wed, 19 May 2021 11:41:26 +0000 (13:41 +0200)]
find-debuginfo: Generate and install as top-level build file.

find-debuginfo relied on lib_rpm_dir to find other debugedit tools.
But the script itself was generated at configure time in a subdir.
This makes testing the (non-installed) build slightly inconvenient.
Add a automake rule to generate find-debuginfo at build time, instead
of configure time, in the top-level builddir next to the other tools.

* .gitignore: Move scripts/find-debuginfo to find-debuginfo.
* configure.ac: Explicitly check we have SED.
* Makefile.am (bin_SCRIPTS): Drop subdir scripts.
(CLEANFILES): New.
(do_subst): New.
(find-debuginfo): New generate using do_subst.
(find-debuginfo.1): Adjust location and protect against
parallel builds.
(EXTRA_DIST): Add .in suffix to scripts/find-debuginfo.
* scripts/find-debuginfo.in (lib_rpm_dir): Rename to...
(install_dir): ...this.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agotests: Remove RPM strings
Mark Wielaard [Wed, 19 May 2021 10:39:05 +0000 (12:39 +0200)]
tests: Remove RPM strings

The debugedit.at still contained some references to RPM even though it
doesn't depend on RPM anymore. Remove RPM from the banner and from the
DEBUGEDIT_SETUP m4 macro.

* tests/debugedit.at (AT_BANNER): Remove RPM from the name.
(RPM_DEBUGEDIT_SETUP): Rename to...
(DEBUGEDIT_SETUP): ...this.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agoRename find-debuginfo.sh to find-debuginfo
Mark Wielaard [Tue, 18 May 2021 17:03:31 +0000 (19:03 +0200)]
Rename find-debuginfo.sh to find-debuginfo

Even though it is currently a bash script we install it as a normal
program. So simply install it without the .sh suffix. To get the VERSION
right in the script make it an AC_CONFIG_FILE (from find-debuginfo.in).
This also fixes the man page name and version.

* .gitignore: Remove find-debuginfo.sh.1.
Add scripts/find-debuginfo and find-debuginfo.1
* configure.ac (AC_CONFIG_FILES): Add scripts/find-debuginfo.
* Makefile.am (bin_SCRIPTS): Rename find-debuginfo.sh to
find-debuginfo.
(dist_man_MANS): Rename find-debuginfo.sh.1 to find-debuginfo.1.
(find-debuginfo.sh.1): Rename to ...
(find-debuginfo.1): ...this and update invocation.
(EXTRA_DIST): Rename scripts/find-debuginfo.sh to
scripts/find-debuginfo.
* scripts/find-debuginfo.sh: Rename to ...
* scripts/find-debuginfo.in: ...this.
Change all find-debuginfo.sh to find-debuginfo.
Use @VERSION@ for --version.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agoupload-release.sh: Use xz, not bz2 for release tar
Mark Wielaard [Wed, 5 May 2021 22:06:56 +0000 (00:06 +0200)]
upload-release.sh: Use xz, not bz2 for release tar

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agoSet version to 0.2 and add upload-release.sh script. debugedit-0.2
Mark Wielaard [Wed, 5 May 2021 22:00:56 +0000 (00:00 +0200)]
Set version to 0.2 and add upload-release.sh script.

Another pre-release.
Now with the new documentation and an uploade-release.sh script.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agoMakefile.am: Don't try to recursively make binaries to run help2man
Mark Wielaard [Wed, 5 May 2021 21:33:14 +0000 (23:33 +0200)]
Makefile.am: Don't try to recursively make binaries to run help2man

We try to avoid having to run help2man unnecessary for a build from
a source distribution (which include the generated manpages). We did
this by not depending on the actual executable, but recursively calling
make to generate it when necessary. This causes trouble with parallel
makes because the two make processes don't know which objects have,
have not or are being build. Fix this by depending on the executable
but only running help2man if one of the sources has changed, not when
the executable has been regenerated.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agoMakefile.am: Add scripts/find-debuginfo.sh to EXTRA_DIST
Mark Wielaard [Wed, 5 May 2021 20:00:08 +0000 (22:00 +0200)]
Makefile.am: Add scripts/find-debuginfo.sh to EXTRA_DIST

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agoautomake: Add std-options to check --version and --help work as intended.
Mark Wielaard [Wed, 5 May 2021 19:22:29 +0000 (21:22 +0200)]
automake: Add std-options to check --version and --help work as intended.

Now that we rely on --version and --help to generate documentation make
sure that make distcheck checks those standard options work correctly.
Also adjust find-debuginfo.sh[.1] rules slightly to make sure they the
scripts are also checked (bin_SCRIPTS are, but dist_bin_SCRIPTS aren't).

* configure.ac (AM_INIT_AUTOMAKE): Add std-options.
* Makefile.am (dist_bin_SCRIPTS): Change into...
(bin_SCRIPTS): ... this, using top_srcdir.
(TOP_CONFIGURE_AC): New variable, with comment explaining when
.1 man pages are (re)generated.
(debugedit.1): Use TOP_CONFIGURE_AC as dependency.
(sepdebugcrcfix.1): Likewise.
(find-debuginfo.sh.1): Likewise and depend on top_srcdir script.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agofind-debuginfo.sh: Add --help, --version and man page.
Mark Wielaard [Thu, 29 Apr 2021 22:42:23 +0000 (00:42 +0200)]
find-debuginfo.sh: Add --help, --version and man page.

Add a --version and --help option to find-debuginfo.sh and use that to
generate a manual page.

* .gitignore: Add find-debuginfo.sh.1
* Makefile.am (dist_man_MANS): Add find-debuginfo.sh.1
(find-debuginfo.sh.1): New make rule.
* scripts/find-debuginfo.sh (help): New function.
Handle --version and --help.

https://sourceware.org/bugzilla/show_bug.cgi?id=27641

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agosepdebugcrcfix: Add --version, --help and man page.
Mark Wielaard [Thu, 29 Apr 2021 20:44:41 +0000 (22:44 +0200)]
sepdebugcrcfix: Add --version, --help and man page.

Add --version and --help support to sepdebugcrcfix. Use this to generate
a manual page using help2man.

* .gitignore: Add sepdebugcrcfix.1
* Makefile.am (dist_man_MANS): Add sepdebugcrcfix.1
(sepdebugcrcfix.1): New make rule.
* tools/sepdebugcrcfix.c (version): New static functions.
(help): Likewise.
(main): Call version or help depending on argc and argv.

https://sourceware.org/bugzilla/show_bug.cgi?id=27642

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agodebugedit: Add manual using help2man
Mark Wielaard [Thu, 29 Apr 2021 16:11:06 +0000 (18:11 +0200)]
debugedit: Add manual using help2man

This generates a debugedit.1 man page using help2man based on the
debugedit --help output.  The generated file is included in the dist
so help2man isn't normally needed to build debugedit.

* .gitignore: Add debugedit.1
* configure.ac: Add AM_MISSING_PROG for help2man.
* Makefile.am (dist_man_MANS): Add debugedit.1
(debugedit.1): New rules.
* tools/debugedit (helpText): Add FILE argument.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agodebugedit: consistently use error() instead of fprintf(stderr)
Dmitry V. Levin [Mon, 26 Apr 2021 20:00:00 +0000 (20:00 +0000)]
debugedit: consistently use error() instead of fprintf(stderr)

The error() function is already used in debugedit for printing some
of diagnostic messages, extend this practice to all such messages.
The user-visible side of this change is that all diagnostic messages
are now consistently prefixed.

* tools/debugedit.c (edit_attributes, handle_build_id, main): Replace
fprintf(stderr) with error().

4 years agodebugedit: strip extra newline characters from diagnostic messages
Dmitry V. Levin [Mon, 26 Apr 2021 20:00:00 +0000 (20:00 +0000)]
debugedit: strip extra newline characters from diagnostic messages

Since the output produced by error() is already terminated by a newline
character, no newline terminating characters are needed in diagnostic
messages printed using error().

* tools/debugedit.c (main): Remove terminating newline characters from
format strings passed to error().

4 years agodebugedit: Fix 'Unhandled relocation 0 in .debug_info section' on e2k
Vitaly Chikunov [Wed, 14 Apr 2021 16:39:08 +0000 (19:39 +0300)]
debugedit: Fix 'Unhandled relocation 0 in .debug_info section' on e2k

Fix handling of Elbrus ELF relocatables:

  /usr/lib/rpm/debugedit: ./lib/modules/5.4.58-elbrus-def-alt1/misc/xt_so.ko: Unhandled relocation 0 in .debug_info section

Reported-by: Michael Shigorin <mike@altlinux.org>
Tested-by: Andrey Savchenko <bircoph@altlinux.org>
Signed-off-by: Vitaly Chikunov <vt@altlinux.org>
4 years agodebugedit: add MIPS support
Ivan A. Melnikov [Fri, 13 Nov 2020 11:51:08 +0000 (15:51 +0400)]
debugedit: add MIPS support

According to the specification[1], all MIPS .debug_* sections are
marked with ELF type SHT_MIPS_DWARF.  The format of the section
data stays the same, so we have can handle e.g. .debug_info
section as we used to.

As SHT_MIPS_DWARF is from processor-specific range, we have to check
that we're actually dealing with MIPS ELF file before handling such
sections.

[1] MIPS Extensions to DWARF Version 2.0. -- Silicon Graphics
    Computer Systems, rev 1.17, 29 Aug 2001

Refs: https://bugzilla.altlinux.org/39284
Signed-off-by: Ivan A. Melnikov <iv@altlinux.org>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
4 years agotests: Use CC, CFLAGS, LD and LDFLAGS to create testcases
Mark Wielaard [Thu, 25 Mar 2021 23:00:42 +0000 (00:00 +0100)]
tests: Use CC, CFLAGS, LD and LDFLAGS to create testcases

Currently gcc is hardcoded in the tests. Use the configured tools to
make testing for a specfic target or alternative build tools easier.

     * configure.ac: Add AC_CHECK_TOOL for LD.
     * tests/atlocal.in: Set CC, CFLAGS, LD and LDFLAGS.
     * tests/debugedit.at (RPM_DEBUGEDIT_SETUP): Use CC, CFLAGS, LD
       and LDFLAGS.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agotests: Check gcc accepts -gz=none before usage
Mark Wielaard [Wed, 24 Mar 2021 23:23:43 +0000 (00:23 +0100)]
tests: Check gcc accepts -gz=none before usage

commit 4f138 "tests: fix for toolchains producing compressed debug
sections" used -gz=none unconditionally to compile the test
binaries. But not all gcc versions support -gz.

Add a configure check for -gz=none. Set GZ_NONE_FLAG in
atlocal.in. Use it instead of -gz=none in debugedit.at.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agotests: Check gcc accepts -gdwarf-5 otherwise skip DWARF5 tests
Mark Wielaard [Wed, 24 Mar 2021 01:01:19 +0000 (02:01 +0100)]
tests: Check gcc accepts -gdwarf-5 otherwise skip DWARF5 tests

Add a configure check for -gdawrf-5. Set GDWARF_5_FLAG in atlocal.in
to yes or no. Use AT_SKIP_IF([test "$GDWARF_5_FLAG" = "no"]) in
debugedit.at.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agotests: fix for toolchains producing compressed debug sections
Dmitry V. Levin [Mon, 22 Mar 2021 20:00:00 +0000 (20:00 +0000)]
tests: fix for toolchains producing compressed debug sections

When toolchain produces compressed debug sections by default,
quite a few debugedit tests fail because of unexpected
"debugedit: ./foo.o: DWARF version 0 unhandled" error diagnostic messages:
  3: debugedit .debug_str objects DWARF4          FAILED (debugedit.at:97)
  4: debugedit .debug_str/line_str objects DWARF5 FAILED (debugedit.at:129)
  9: debugedit .debug_info objects                FAILED (debugedit.at:291)
 12: debugedit .debug_types objects               FAILED (debugedit.at:370)
 15: debugedit .debug_line objects DWARF4         FAILED (debugedit.at:460)
 16: debugedit .debug_line objects DWARF5         FAILED (debugedit.at:484)
 21: debugedit .debug_macro objects               FAILED (debugedit.at:598)

Fix this by instructing gcc not to produce compressed debug sections
in object files prepared for debugedit tests.

* tests/debugedit.at: Add "-gz=none" to "gcc -g3" invocations.

Co-authored-by: Vitaly Chikunov <vt@altlinux.org>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
This page took 0.100368 seconds and 5 git commands to generate.