platform/upstream/elfutils.git
21 months agotests: varlocs workaround format-overflow errors 01/277301/1 accepted/tizen_7.0_base accepted/tizen_7.0_base_hotfix accepted/tizen_7.0_base_tool accepted/tizen_7.0_base_tool_hotfix tizen_7.0_base tizen_7.0_base_hotfix tizen_7.5_base accepted/tizen/7.0/base/20230714.002859 accepted/tizen/7.0/base/hotfix/20230714.003715 accepted/tizen/7.0/base/tool/20221028.113133 accepted/tizen/7.0/base/tool/hotfix/20221115.084921 accepted/tizen/base/tool/20220718.041500 submit/tizen_7.0_base/20221028.200901 submit/tizen_7.0_base_hotfix/20221115.161501 submit/tizen_base/20220706.012628 submit/tizen_base/20220707.010134 submit/tizen_base/20220715.044133 tizen_7.0_m2_release
Mark Wielaard [Sat, 4 Dec 2021 00:18:42 +0000 (01:18 +0100)]
tests: varlocs workaround format-overflow errors

In function ‘printf’,
    inlined from ‘handle_attr’ at varlocs.c:932:3:
error: ‘%s’ directive argument is null [-Werror=format-overflow=]

The warning is technically correct. A %s argument should not be
NULL. Although in practice all implementations will print it as
"(null)". Workaround this by simply changing the dwarf string
functions to return an "<unknown>" string. The test is for the correct
names, either "(null)" or "<unknown>" would make it fail (also remove
a now unnecessary assert, the switch statement will check for unknown
opcodes anyway).

Signed-off-by: Mark Wielaard <mark@klomp.org>
[sw0312.kim: partially pick upstream commit fd2cadbe4749f43551f7df90ee41837d83a6fbc4
   to fix build warning except src/ChangeLog]
Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Change-Id: I52273c671e9ecea250135096629e708163c5aa16

21 months agoreadelf: Workaround stringop-truncation error 00/277300/1
Mark Wielaard [Sat, 4 Dec 2021 00:08:48 +0000 (01:08 +0100)]
readelf: Workaround stringop-truncation error

In function ‘strncpy’,
    inlined from ‘print_ehdr’ at readelf.c:1175:4:
error: ‘__builtin_strncpy’ specified bound 512 equals destination size
       [-Werror=stringop-truncation]

strncpy doesn't terminate the copied string if there is not enough
room. We compensate later by explicitly adding a zero terminator at
buf[sizeof (buf) - 1]. Normally gcc does see this, but with
-fsanitize=address there is too much (checking) code in between. But
it is actually better to not let strncpy do too much work, so
substract one from the size.

Signed-off-by: Mark Wielaard <mark@klomp.org>
[sw0312.kim: partially pick upstream commit 3e1e249bfd8455457716cce798f3f91d01f2f00d
   to fix build warning except src/ChangeLog]
Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Change-Id: I6fae2d2f9698590f8555e931b30a49e948401f9d

2 years agopackaging: apply ASLR option 74/269374/1 accepted/tizen/base/tool/20220124.115727 submit/tizen_base/20220114.032248
Dongkyun Son [Thu, 13 Jan 2022 08:26:00 +0000 (17:26 +0900)]
packaging: apply ASLR option

Change-Id: I69ef5a6bf6d2e5186fd9ff05938383dcffdc82d9
Signed-off-by: Dongkyun Son <dongkyun.s@samsung.com>
4 years agopackaging: add libdw as build dependency 12/231712/3 accepted/tizen_6.0_base accepted/tizen_6.0_base_tool accepted/tizen_6.0_base_tool_hotfix tizen_6.0_base tizen_6.0_base_hotfix accepted/tizen/6.0/base/20201029.110508 accepted/tizen/6.0/base/20230713.142823 accepted/tizen/6.0/base/tool/20201029.111946 accepted/tizen/6.0/base/tool/hotfix/20201030.124707 accepted/tizen/6.0/base/tool/hotfix/20201102.085938 accepted/tizen/6.5/base/tool/20211027.115116 accepted/tizen/base/20200426.213224 submit/tizen_6.0_base/20201029.184801 submit/tizen_6.0_base_hotfix/20201030.192501 submit/tizen_6.0_base_hotfix/20201102.162701 submit/tizen_6.5_base/20211026.180901 submit/tizen_6.5_base/20211027.183101 submit/tizen_6.5_base/20211027.200601 submit/tizen_base/20200424.085441 tizen_6.0.m2_release tizen_6.5.m2_release
Dongkyun Son [Thu, 23 Apr 2020 21:53:33 +0000 (06:53 +0900)]
packaging: add libdw as build dependency

libdw is not installed in buildroot that can cause strip failure

eu-strip: error while loading shared libraries: libdw.so.1: cannot open
shared object file: No such file or directory

Change-Id: Ide7729dfa559ae8e59d992e7f8ee2ca7e0c90f46
Signed-off-by: Dongkyun Son <dongkyun.s@samsung.com>
4 years agopackaging: Fixed packaging to prevent conflicts 92/231292/1 submit/tizen_base/20200421.102835
Slava Barinov [Thu, 26 Mar 2020 13:06:16 +0000 (16:06 +0300)]
packaging: Fixed packaging to prevent conflicts

Change-Id: I58e09f257d147bff671ef2e9df73a5424ebc57d1
Signed-off-by: Slava Barinov <v.barinov@samsung.com>
4 years agoPackaging fix
Slava Barinov [Thu, 26 Mar 2020 13:06:16 +0000 (16:06 +0300)]
Packaging fix

Signed-off-by: Slava Barinov <v.barinov@samsung.com>
4 years agoEnable static libraries build
Slava Barinov [Thu, 26 Mar 2020 12:50:27 +0000 (15:50 +0300)]
Enable static libraries build

Signed-off-by: Slava Barinov <v.barinov@samsung.com>
4 years agoRemove libebl
Slava Barinov [Thu, 26 Mar 2020 12:47:59 +0000 (15:47 +0300)]
Remove libebl

libebl is now static compile-time only

Signed-off-by: Slava Barinov <v.barinov@samsung.com>
4 years agoadd packaging
Dongkyun Son [Thu, 26 Mar 2020 12:35:12 +0000 (21:35 +0900)]
add packaging

Signed-off-by: Dongkyun Son <dongkyun.s@samsung.com>
4 years agoelfutils.spec.in: Sync with fedora spec, remove rhel/fedora specifics. elfutils-0.178 upstream/0.178
Mark Wielaard [Tue, 26 Nov 2019 22:34:27 +0000 (23:34 +0100)]
elfutils.spec.in: Sync with fedora spec, remove rhel/fedora specifics.

This makes the sample elfutils.spec file more like the fedora
elfutils.spec but with all fedora and rhel specifics removed.
In particular it introduces a new elfutils-libs subpackage and
updates the requires accordingly.

Other cleanups are removal of Group tags, remove dot at end of
Summary tags, add post/postun ldconfig for elfutils-libs and
elfutils debuginfod-client subpackages, remove default
defattr(-,root,root) for file lists and order binaries by name.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agoPrepare for 0.178
Mark Wielaard [Tue, 26 Nov 2019 08:52:24 +0000 (09:52 +0100)]
Prepare for 0.178

Set version to 0.178.
Update NEWS and elfutils.spec.in.
Regenerate po/*.po files.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agoFix BUILD_STATIC build and enable gcov for debuginfod.
Mark Wielaard [Tue, 26 Nov 2019 07:56:44 +0000 (08:56 +0100)]
Fix BUILD_STATIC build and enable gcov for debuginfod.

libdw now always needs -lpthread and -ld even when BUILD_STATIC.
BUILD_STATIC is only used when doing a gcov enabled build.
Enable gcov coverage also for debuginfod.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agoelfutils.spec: Add BuildRequires: curl
Mark Wielaard [Mon, 25 Nov 2019 22:20:35 +0000 (23:20 +0100)]
elfutils.spec: Add BuildRequires: curl

The run-debuginfod-find.sh now relies on curl to fetch the metrics.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agodebuginfod: Tweak groom cycle for memory freeing
Frank Ch. Eigler [Mon, 25 Nov 2019 21:47:18 +0000 (16:47 -0500)]
debuginfod: Tweak groom cycle for memory freeing

Use the sqlite3_db_release_memory() call periodically.  It should
have no effect except hopefully smaller server memory usage.

Signed-off-by: Frank Ch. Eigler <fche@redhat.com>
4 years agotests: Don't sleep in run-debuginfod-find.sh, but wait till ready.
Mark Wielaard [Sun, 24 Nov 2019 16:38:18 +0000 (17:38 +0100)]
tests: Don't sleep in run-debuginfod-find.sh, but wait till ready.

Wait for the debuginfod server to finish and use the metrics to see
when a server is ready for the next test instead of sleeping. Also
remove DEBUGINFOD_TEST_WEBAPI_SLEEP.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agodebuginfod: Add found_{executable,debuginfo,sourcerefs}_total metrics.
Mark Wielaard [Sun, 24 Nov 2019 13:22:17 +0000 (14:22 +0100)]
debuginfod: Add found_{executable,debuginfo,sourcerefs}_total metrics.

Keeps metrics of how many executables, debuginfo and sourcerefs were
found in total for file and rpm scanners.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agotests: Use 127.0.0.1 in run-debuginfod-find.sh instead of localhost.
Mark Wielaard [Sat, 23 Nov 2019 13:09:42 +0000 (14:09 +0100)]
tests: Use 127.0.0.1 in run-debuginfod-find.sh instead of localhost.

The way curl does hostname lookups in multi_curl mode takes a very long
time under valgrind. Replace all localhosti hostnames with 127.0.0.1 so
no lookups are necessary.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agodebuginfod: add client context
Mark Wielaard [Sun, 17 Nov 2019 21:17:26 +0000 (22:17 +0100)]
debuginfod: add client context

Add a mandatory debuginfod_begin()/_end() call pair to manage a client
object that represents persistent but non-global state.  From libdwfl,
dlopen the debuginfod.so client library early on.  This hopefully
makes sure that the code (and the libcurl.so dependency) is loaded
before the program goes into multi-threaded mode.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agodebuginfod 5: add /metrics endpoint
Frank Ch. Eigler [Thu, 7 Nov 2019 09:00:16 +0000 (04:00 -0500)]
debuginfod 5: add /metrics endpoint

This webapi extensions allows admins to hook up debuginfod to a
prometheus-compatible monitoring system for general situational
statistics.  The metrics are simple enough that local curl requests
can give a user a sense of what's going on.  The metrics are
documented as unstable with respect to future versions.

4 years agodebuginfod 4: symbolic link traversal mode
Frank Ch. Eigler [Wed, 6 Nov 2019 23:53:31 +0000 (18:53 -0500)]
debuginfod 4: symbolic link traversal mode

In order to support file/rpm archives that are organized via symlink
trees, add an "-L" option to debuginfod, meaning about the same as for
find(1) or ls(1): to traverse rather than ignore symlinks.

4 years agodebuginfod 3/3: client interruptability
Frank Ch. Eigler [Mon, 4 Nov 2019 21:33:09 +0000 (16:33 -0500)]
debuginfod 3/3: client interruptability

For interactive clients such as gdb, interruptibility is important for
usability during longer downloads.  This patchset adds a
download-progress callback function to the debuginfod client library,
with which a caller app can interrupt a download as well as be
notified of its quantitative progress.

4 years agodebuginfod 2/2: server side
Frank Ch. Eigler [Mon, 28 Oct 2019 17:29:26 +0000 (13:29 -0400)]
debuginfod 2/2: server side

Add the server to the debuginfod/ subdirectory.  This is a highly
multithreaded c++11 program (still buildable on rhel7's gcc 4.8,
which is only partly c++11 compliant).  Includes an initial suite
of tests, man pages, and a sample systemd service.

Signed-off-by: Frank Ch. Eigler <fche@redhat.com>
Signed-off-by: Aaron Merey <amerey@redhat.com>
4 years agodebuginfod 1/2: client side
Aaron Merey [Mon, 28 Oct 2019 17:29:26 +0000 (13:29 -0400)]
debuginfod 1/2: client side

Introduce the debuginfod/ subdirectory, containing the client for a
new debuginfo-over-http service, in shared-library and command-line
forms.  Two functions in libdwfl make calls into the client library to
fetch elf/dwarf files by buildid, as a fallback.  Instead of normal
dynamic linking (thus pulling in a variety of curl dependencies),
the libdwfl hooks use dlopen/dlsym.  Server & tests coming in patch 2.

Signed-off-by: Aaron Merey <amerey@redhat.com>
Signed-off-by: Frank Ch. Eigler <fche@redhat.com>
4 years agorun-large-elf-file.sh: skip if free memory information is not available
Andreas Schwab [Thu, 14 Nov 2019 15:50:26 +0000 (16:50 +0100)]
run-large-elf-file.sh: skip if free memory information is not available

4 years agodwelf_elf_e_machine_string: Clear errno before calling strtol
Andreas Schwab [Thu, 14 Nov 2019 13:54:58 +0000 (14:54 +0100)]
dwelf_elf_e_machine_string: Clear errno before calling strtol

Avoid spurious failure if errno is modified by any other library call in
the test.

Signed-off-by: Andreas Schwab <schwab@suse.de>
4 years agolibdw: Introduce libdw_unalloc to stop Dwarf_Abbrev leaks.
Mark Wielaard [Sun, 10 Nov 2019 23:15:55 +0000 (00:15 +0100)]
libdw: Introduce libdw_unalloc to stop Dwarf_Abbrev leaks.

In the case of reading an invalid abbrev or when reading an abbrev
concurrently the Dwarf_Abbrev just created might leak because it isn't
needed after all. Introduce libdw_unalloc and libdw_typed_unalloc to
unallocate such Dwarf_Abbrevs so they don't leak.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agolibdw: Rewrite the memory handler to be more robust.
Jonathon Anderson [Sun, 25 Aug 2019 15:07:00 +0000 (10:07 -0500)]
libdw: Rewrite the memory handler to be more robust.

Pthread's thread-local variables are highly limited, which makes
it difficult to use many Dwarfs. This replaces that with a
less efficient (or elegant) but more robust method.

Signed-off-by: Jonathon Anderson <jma14@rice.edu>
4 years agoAdd configure options for Valgrind annotations.
Jonathon Anderson [Sun, 25 Aug 2019 14:53:50 +0000 (09:53 -0500)]
Add configure options for Valgrind annotations.

Signed-off-by: Jonathon Anderson <jma14@rice.edu>
4 years agolibdw: Add and use a concurrent version of the dynamic-size hash table.
Srđan Milaković [Mon, 4 Nov 2019 16:39:35 +0000 (10:39 -0600)]
libdw: Add and use a concurrent version of the dynamic-size hash table.

Signed-off-by: Srđan Milaković <sm108@rice.edu>
Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agolibdw: Don't free uninitialized Dwarf_Abbrev_Hash's of "fake" CUs.
Jonathon Anderson [Fri, 1 Nov 2019 13:14:05 +0000 (08:14 -0500)]
libdw: Don't free uninitialized Dwarf_Abbrev_Hash's of "fake" CUs.

fake_{loc,loclists,addr}_cu are Dwarf_CUs that are created separate from
all the others, so their contents are minimal and mostly initialized by
a calloc. On dwarf_end however, they are freed through the same code path
as all the others, so they call DAH_free like all the others. This changes
that so that these three are exempt from DAH and split-DWARF matters, and
swaps the calloc for a malloc so Memcheck will catch any others.

Signed-off-by: Jonathon Anderson <jma14@rice.edu>
4 years agolibdwfl: only use thread->unwound for initial frame
Omar Sandoval [Mon, 7 Oct 2019 09:05:36 +0000 (02:05 -0700)]
libdwfl: only use thread->unwound for initial frame

thread->unwound is only used for set_initial_registers (via
dwfl_thread_state_registers, dwfl_thread_state_register_pc, and a
special case in core_set_initial_registers). At that point,
thread->unwound is always the initial frame, so there's no need to
update it as we unwind the stack. Let's set it to NULL after we do the
initial setup. This simplifies the next change.

Signed-off-by: Omar Sandoval <osandov@fb.com>
4 years agolibdwfl: don't bother freeing frames outside of dwfl_thread_getframes
Omar Sandoval [Mon, 7 Oct 2019 09:05:35 +0000 (02:05 -0700)]
libdwfl: don't bother freeing frames outside of dwfl_thread_getframes

dwfl_thread_getframes always frees the state before returning, so
dwfl_getthreads and getthread don't need to do it. The only place
we allocate the state is from dwfl_thread_getframes and we always
free it before returning from that function.

Signed-off-by: Omar Sandoval <osandov@fb.com>
4 years agounstrip: Check symbol strings are terminated.
Mark Wielaard [Sat, 26 Oct 2019 20:54:49 +0000 (22:54 +0200)]
unstrip: Check symbol strings are terminated.

A corrupt ELF file could contain a .strtab section that wasn't
properly zero terminated. If so we could add a non-terminated string
to the dwelf_strtab functions, which could then crash because they
would read past the .strtab section data.

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

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agolibcpu: Fix bounds checks and replace asserts with errors.
Mark Wielaard [Sat, 19 Oct 2019 12:01:30 +0000 (14:01 +0200)]
libcpu: Fix bounds checks and replace asserts with errors.

Add a missing bounds check, fix an off-by-one bounds check and replace
asserts with error messages.

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

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agounstrip: Don't try to write extra bogus versym data.
Mark Wielaard [Sat, 19 Oct 2019 12:37:46 +0000 (14:37 +0200)]
unstrip: Don't try to write extra bogus versym data.

If the sh_entsize of the symver section was bogus (bigger than necessary)
then some bogus data would be written out (except that then fails because
pwrite would probably fail). Fix that by ignoring the bogus sh_entsize
and use the actual symver data size.

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

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agounstrip: Add sanity check for bogus sh_offset of allocated sections.
Mark Wielaard [Sun, 20 Oct 2019 15:26:29 +0000 (17:26 +0200)]
unstrip: Add sanity check for bogus sh_offset of allocated sections.

unstrip tries to preserve any allocated section offset in an
executable or shared library. If the offset is extremely large that
would cause the disk to fill up because we will write out a file with
lots of padding to put the section contents at that particular
offset. Add a sanity check that makes sure we just error out if there
is such a bogus offset by checking that no offset is larger than the
original ELF file size.

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

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agounstrip: Add various checks for bad input data.
Mark Wielaard [Mon, 21 Oct 2019 08:55:32 +0000 (10:55 +0200)]
unstrip: Add various checks for bad input data.

There were various ways to crash eu-unstrip with bad ELF input
data. Add various tests against bad data and allocate some structures
on the heap instead of on the stack.

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

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agolibdw: Rewrite the memory handler to be thread-safe.
Jonathon Anderson [Sun, 25 Aug 2019 15:07:00 +0000 (10:07 -0500)]
libdw: Rewrite the memory handler to be thread-safe.

Signed-off-by: Jonathon Anderson <jma14@rice.edu>
4 years agoAdd some supporting framework for C11-style atomics.
Jonathon Anderson [Sun, 25 Aug 2019 15:01:51 +0000 (10:01 -0500)]
Add some supporting framework for C11-style atomics.

Uses the stdatomic.h provided by FreeBSD when GCC doesn't (ie. GCC < 4.9)

Signed-off-by: Jonathon Anderson <jma14@rice.edu>
Signed-off-by: Srđan Milaković <sm108@rice.edu>
4 years agoelflint, readelf: enhance error diagnostics
Dmitry V. Levin [Mon, 30 Sep 2019 11:39:50 +0000 (14:39 +0300)]
elflint, readelf: enhance error diagnostics

When an input file cannot be opened, include its name
into the error diagnostics.

Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
4 years agoreadelf: Add --dyn-sym option.
Mark Wielaard [Mon, 2 Sep 2019 22:03:22 +0000 (00:03 +0200)]
readelf: Add --dyn-sym option.

It is already possible to select the symbol table to print by name,
using --symbols=SECTION. This allows printing the dynamic symbol table
with --symbols=.dynsym. binutils readelf allows printing just the
dynamic symbol table by type using --dyn-sym. Add the same option
and document it. Also add a testcase to show --symbols=.dynsym and
--dyn-sym produce the same output.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agolibebl: Don't install libebl.a, libebl.h and remove backends from spec.
Mark Wielaard [Thu, 29 Aug 2019 21:34:11 +0000 (23:34 +0200)]
libebl: Don't install libebl.a, libebl.h and remove backends from spec.

All archive members from libebl.a are now in libdw.a. We don't generate
separate backend shared libraries anymore. So remove them from the
elfutils.spec file.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agolibcpu: Make sure left shifts are done in unsigned context.
Mark Wielaard [Sat, 7 Sep 2019 19:45:26 +0000 (21:45 +0200)]
libcpu: Make sure left shifts are done in unsigned context.

Use UINT64_C (0) instead of INT64_C (0) to make sure the calculation
is done on unsigned values. Otherwise the gcc undefined sanitizer will
warn:

libcpu/riscv_disasm.c:457:57: runtime error: left shift of negative value -1

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agotests: Add new riscv64 test files to EXTRA_DIST
Mark Wielaard [Sat, 7 Sep 2019 19:35:10 +0000 (21:35 +0200)]
tests: Add new riscv64 test files to EXTRA_DIST

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agoFix whitespaces in RISC-V disasm code
Ulrich Drepper [Sat, 7 Sep 2019 09:06:13 +0000 (11:06 +0200)]
Fix whitespaces in RISC-V disasm code

4 years agoImplement RISC-V disassembler
Ulrich Drepper [Fri, 6 Sep 2019 21:49:54 +0000 (23:49 +0200)]
Implement RISC-V disassembler

4 years agoconfig: Fix spec file, add manpages and new GFDL license.
Mark Wielaard [Tue, 27 Aug 2019 22:33:41 +0000 (00:33 +0200)]
config: Fix spec file, add manpages and new GFDL license.

Now that we have manpages lets also package them. Rename COPYING to
COPYING-GFDL to make it not clash with the top-level COPYING file.
Also fix up the spec file so it can be used to create a srpm again.
Add eu-stack to the file list.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agoreadelf: Actually dump hex or strings when -p or -x get section number.
Mark Wielaard [Tue, 27 Aug 2019 14:09:39 +0000 (16:09 +0200)]
readelf: Actually dump hex or strings when -p or -x get section number.

The readelf code did parse section numbers, but then failed to actually
dump the section found. Fixed by actually calling the dump function
(either the hex or string variant). Add testcase for readelf -x num.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agonm: Fix latent memory leak in show_symbols.
Mark Wielaard [Thu, 29 Aug 2019 15:46:52 +0000 (17:46 +0200)]
nm: Fix latent memory leak in show_symbols.

If there are just a handful of symbols then memory for them is
allocated on the stack, otherwise the memory is malloced. So before
freeing the memory we need to check the number of entries to know if
the memory was heap allocated or not. But since not all entries might
be used we might have decreased the number of entries to the number
we will actually show. Remember the original symbol entries to not
have a memory leak.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agotests: Use smaller self test files.
Mark Wielaard [Thu, 29 Aug 2019 14:21:35 +0000 (16:21 +0200)]
tests: Use smaller self test files.

Don't use the largest executables/libraries to reduce the make check time.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agoDon't use dlopen() for libebl modules
Omar Sandoval [Mon, 26 Aug 2019 17:51:46 +0000 (10:51 -0700)]
Don't use dlopen() for libebl modules

Currently, architecture-specific code for libebl exists in separate
libebl_$ARCH.so libraries which libebl loads with dlopen() at runtime.
This makes it impossible to have standalone, statically-linked binaries
which use libdwfl if they depend on any architecture-specific
functionality. Additionally, when these libraries cannot be found, the
failure modes are non-obvious. So, let's get rid of libebl_$arch.so and
move it all into libdw.so/libdw.a, which simplifies things considerably.

Signed-off-by: Omar Sandoval <osandov@fb.com>
4 years agolibasm: Link against libebl_pic.a.
Mark Wielaard [Wed, 28 Aug 2019 21:55:24 +0000 (23:55 +0200)]
libasm: Link against libebl_pic.a.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agoAdd PIC and non-PIC variants of libcpu and libebl
Omar Sandoval [Mon, 26 Aug 2019 17:51:45 +0000 (10:51 -0700)]
Add PIC and non-PIC variants of libcpu and libebl

Currently, libcpu and libebl are always compiled as PIC. An upcoming
change will add the objects from libcpu.a and libebl.a to libdw.a, which
should not be PIC unless configured that way. So, make libcpu.a and
libebl.a non-PIC and add libcpu_pic.a and libebl_pic.a.

Signed-off-by: Omar Sandoval <osandov@fb.com>
4 years agolibcpu: merge libcpu_{i386,x86_64,bpf} into one library
Omar Sandoval [Mon, 26 Aug 2019 17:51:44 +0000 (10:51 -0700)]
libcpu: merge libcpu_{i386,x86_64,bpf} into one library

In preparation for combining the libebl backend modules, combine all of
the libcpu backends into libcpu.a.

Signed-off-by: Omar Sandoval <osandov@fb.com>
4 years agolibebl: remove unnecessary variable in Makefile.am
Omar Sandoval [Mon, 26 Aug 2019 17:51:43 +0000 (10:51 -0700)]
libebl: remove unnecessary variable in Makefile.am

gen_SOURCES is assigned to libebl_a_SOURCES and never used again. Get
rid of it.

Signed-off-by: Omar Sandoval <osandov@fb.com>
4 years agoAdd elfclassify to .gitignore
Omar Sandoval [Mon, 26 Aug 2019 17:58:31 +0000 (10:58 -0700)]
Add elfclassify to .gitignore

The tool was just added, but it's missing the ignore entry.

Signed-off-by: Omar Sandoval <osandov@fb.com>
4 years agoBegin adding some docs to elfutils
Ben Woodard [Fri, 23 Aug 2019 20:42:06 +0000 (13:42 -0700)]
Begin adding some docs to elfutils

- Added doc/README
- Updated doc/ChangeLog
- Added a eu-readelf manpage based on the one from binutils.
- Added a brand new manpage for eu-elfclassify the new utility.
- Add some new files in the doc directory and sync makefile with upstream.
- Reenable the compilation of doc directory.
- Disable sgml file building
- Build man pages the automake way

Since V1
- Put man pages in the proper directories.
- Added copy of Gnu Free Documentation License
- Modified eu-readelf.1 man page to match the supported options.

Signed-off-by: Ben Woodard <woodard@redhat.com>
Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agolibdw: fix latent bug in dwarf_getcfi.c not setting default_same_value.
Jonathon Anderson [Sun, 25 Aug 2019 15:07:00 +0000 (10:07 -0500)]
libdw: fix latent bug in dwarf_getcfi.c not setting default_same_value.

Signed-off-by: Jonathon Anderson <jma14@rice.edu>
4 years agoreadelf: Add optional "SECTION" argument for --notes.
Mark Wielaard [Wed, 21 Aug 2019 10:28:56 +0000 (12:28 +0200)]
readelf: Add optional "SECTION" argument for --notes.

There are multiple sections that can contain ELF Notes. It is sometimes
nice to just list the notes from a specific section.

  -n, --notes[=SECTION]      Display the ELF notes

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agoconfig/elfutils.spec.in: package eu-elfclassify
Dmitry V. Levin [Wed, 14 Aug 2019 20:45:56 +0000 (23:45 +0300)]
config/elfutils.spec.in: package eu-elfclassify

Package the new tool introduced by commit elfutils-0.177~1.

Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
4 years agoPrepare for 0.177 elfutils-0.177
Mark Wielaard [Tue, 13 Aug 2019 21:53:56 +0000 (23:53 +0200)]
Prepare for 0.177

Set version to 0.177.
Update NEWS and elfutils.spec.in.
Use git --get user.name and user.email for spec changelog.
Regenerate po/*.po files.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agoelfclassify: New tool to analyze ELF objects.
Florian Weimer [Tue, 13 Aug 2019 11:27:15 +0000 (13:27 +0200)]
elfclassify: New tool to analyze ELF objects.

Usage: elfclassify [OPTION...] FILE...
Determine the type of an ELF file.

All of the classification options must apply at the same time to a
particular file.  Classification options can be negated using a
"--not-" prefix.

Since modern ELF does not clearly distinguish between programs and
dynamic shared objects, you should normally use either --executable or
--shared to identify the primary purpose of a file.  Only one of the
--shared and --executable checks can pass for a file.

If you want to know whether an ELF object might a program or a shared
library (but could be both), then use --program or --library. Some ELF
files will classify as both a program and a library.

If you just want to know whether an ELF file is loadable (as program
or library) use --loadable.  Note that files that only contain
(separate) debug information (--debug-only) are never --loadable (even
though they might contain program headers).  Linux kernel modules are
also not --loadable (in the normal sense).

Without any of the --print options, the program exits with status 0 if
the requested checks pass for all input files, with 1 if a check fails
for any file, and 2 if there is an environmental issue (such as a file
read error or a memory allocation error).

When printing file names, the program exits with status 0 even if no
file names are printed, and exits with status 2 if there is an
environmental issue.

On usage error (e.g. a bad option was given), the program exits with a
status code larger than 2.

The --quiet or -q oose_filestion suppresses some error warning output,
but doesn't change the exit status.

Classification options
  --core                 File is an ELF core dump file
  --debug-only           File is a debug only ELF file (separate .debug,
                         .dwo or dwz multi-file)
  --elf                  File looks like an ELF object or archive/static
                         library (default)
  --elf-archive          File is an ELF archive or static library
  --elf-file             File is an regular ELF object (not an
                         archive/static library)
  --executable           File is (primarily) an ELF program executable (not
                         primarily a DSO)
  --library              File is an ELF shared object (DSO) (might also be
                         an executable)
  --linux-kernel-module  File is a linux kernel module
  --loadable             File is a loadable ELF object (program or shared
                         object)
  --program              File is an ELF program executable (might also be a
                         DSO)
  --shared               File is (primarily) an ELF shared object (DSO)
                         (not primarily an executable)
  --unstripped           File is an ELF file with symbol table or .debug_*
                         sections and can be stripped further

Input flags
  -f, --file             Only classify regular (not symlink nor special
                         device) files
  --no-stdin             Do not read files from standard input (default)
  --stdin                Also read file names to process from standard
                         input, separated by newlines
  --stdin0               Also read file names to process from standard
                         input, separated by ASCII NUL bytes
  -z, --compressed       Try to open compressed files or embedded (kernel)
                         ELF images

Output flags
  --matching             If printing file names, print matching files
                         (default)
  --no-print             Do not output file names
  --not-matching         If printing file names, print files that do not
                         match
  --print                Output names of files, separated by newline
  --print0               Output names of files, separated by ASCII NUL

Additional flags
  -q, --quiet            Suppress some error output (counterpart to
                         --verbose)
  -v, --verbose          Output additional information (can be specified
                         multiple times)

  -?, --help             Give this help list
      --usage            Give a short usage message
  -V, --version          Print program version

Report bugs to https://sourceware.org/bugzilla.

Signed-off-by: Florian Weimer <fweimer@redhat.com>
Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agolibdwelf: Make dwelf_elf_begin return NULL only when there is an error.
Mark Wielaard [Sun, 11 Aug 2019 22:43:22 +0000 (00:43 +0200)]
libdwelf: Make dwelf_elf_begin return NULL only when there is an error.

dwelf_elf_begin was slightly different from elf_begin in case the file
turned out to not be an ELF file. elf_begin would return an Elf handle
with ELF_K_NONE. But dwelf_elf_begin would return NULL. This made it
impossible to tell the difference between a file or decompression error
and a (decompressed) file not being an ELF file.

Since dwelf_elf_begin could still return different kinds of ELF files
(ELF_K_ELF or ELF_K_AR - and theoretically ELF_K_COFF) this was not
really useful anyway. So make it so that dwelf_elf_begin always returns
an Elf handle unless there was a real error reading or decompressing
the file. Otherwise return NULL to make clear there was a real error.

Make sure that the decompression function returns DWFL_E_BADELF only
when the file isn't compressed. In which case the Elf handle won't
be replaced and can be returned (as ELF_K_NONE).

Add a new version to dwelf_elf_begin so programs can rely on it
returning NULL only for real errors.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agolibdwfl: Fix fd leak/closing wrong fd after dwfl_core_file_report()
Omar Sandoval [Mon, 5 Aug 2019 10:40:05 +0000 (03:40 -0700)]
libdwfl: Fix fd leak/closing wrong fd after dwfl_core_file_report()

dwfl_segment_report_module() (used only by dwfl_core_file_report())
opens a file descriptor and/or an Elf handle, reports a module, and
assigns mod->main.elf. However, it doesn't assign mod->main.fd, so it is
left as 0. This causes two problems:

1. We leak the file descriptor for the module.
2. When we free the module, we close file descriptor 0 (stdin).

Fix it by assigning mod->main.fd.

Signed-off-by: Omar Sandoval <osandov@fb.com>
4 years agoAdd backend support for C-SKY
Mao Han [Tue, 16 Jul 2019 11:14:24 +0000 (19:14 +0800)]
Add backend support for C-SKY

C-SKY V2 ABI manual:
https://github.com/c-sky/csky-doc/blob/master/C-SKY_V2_CPU_Applications_Binary_Interface_Standards_Manual.pdf
C-SKY architecture user guide:
https://github.com/c-sky/csky-doc/blob/master/CSKY%20Architecture%20user_guide.pdf

Signed-off-by: Mao Han <han_mao@c-sky.com>
4 years agolibdwelf: Add dwelf_elf_e_machine_string and use it in readelf.
Mark Wielaard [Fri, 28 Jun 2019 17:21:59 +0000 (19:21 +0200)]
libdwelf: Add dwelf_elf_e_machine_string and use it in readelf.

To print eh human readable description of the ELF e_machine header field
we used the ebl name. But this is not set for most EM constants. Introduce
a new function dwelf_elf_e_machine_string that does work for all known
EM values. Use that in eu-readelf to print a string representation of the
e_machine value.

Since this was the only usage of ebl->name, remove that from struct ebl.

Also add a testcase that makes sure dwelf_elf_e_machine_string works for
all EM values in the libelf/elf.h header so we will immediately notice
when a new value appears.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agotests: Add 2GB to mem_needed running run-large-elf-file.sh with valgrind
Mark Wielaard [Mon, 1 Jul 2019 15:08:43 +0000 (17:08 +0200)]
tests: Add 2GB to mem_needed running run-large-elf-file.sh with valgrind

Running under valgrind just requires even more free memory.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agolibelf: Fix some 32bit offset/size issues that break updating 4G+ files.
Mark Wielaard [Sun, 24 Feb 2019 22:51:16 +0000 (23:51 +0100)]
libelf: Fix some 32bit offset/size issues that break updating 4G+ files.

Some years ago, in commit b1d0b0fc "libelf: Use int64_t for offsets in
libelf.h", we changed the public interface to use 64bit offsets/sizes.
This wasn't really a API change, before we relied on loff_t always
being 64bits on all platforms.

We didn't change the implementation to use the int64_t type though.
That was a little confusing, since the function definitions used a
different type, int64_t, from the function implementations, off_t.
Since we always build with _FILE_OFFSET_BITS=64 this should be fine.
But it was a bit sloppy and confusing.

Worse is that we got the translation of offset/sizes wrong in a
couple of places when translating to ELF types. In various places
we would use Elf32_Word or Elf64_Word. But both are 32bit (unsigned)
types! As is GElf_Word. Elf32_Off is 32bits and Elf64_Off is 64bits.
But we were not using those consistently.

This patch introduces comments for the usage of [G]Elf(32|64)Word in
libelf that are correct. And introduces Elf(32|64)_SizeWord in
elf32_updatenull.c where we want to make a difference between sizes
and offsets (the ELF variants are both unsigned, while int64_t/loff_t
is signed).

It also includes a new run-large-elf-file.sh test that creates a
large ELF files (one 64bit, little endian, rel and another big endian,
non-rel) and runs eu-strip, eu-elflint, eu-unstrip and eu-elfcmp.
Before this patch, that test case fails and creates corrupt ELF files.

The test is guarded by some checks that try to make sure there is
enough disk space and memory available on the machine. The test is
skipped otherwise.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agostack: Fix error message when dwfl_core_file_attach fails.
Mark Wielaard [Mon, 24 Jun 2019 22:21:42 +0000 (00:21 +0200)]
stack: Fix error message when dwfl_core_file_attach fails.

Reported-by: Mao Han <han_mao@c-sky.com>
Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agostrip don't mmap debug output file.
Mark Wielaard [Mon, 4 Mar 2019 19:04:18 +0000 (20:04 +0100)]
strip don't mmap debug output file.

Using ELF_C_WRITE_MMAP sometimes causes unexpected errors when disk
space is low. When writing out the file, the output file is first
extended so that it covers the whole file/mmap size. But it might
be that the file system allowed the extension as a sparse file. In
that case writing to the file through the mmap might still fail and
produce a SIGBUS if the disk is full. This is confusing to the user.

Using ELF_C_WRITE will produce "normal" errors when the file cannot
be written out. It also seems to use less memory because the debug
file is created from scratch. So the memory is first read into the
ELF data structure buffers, then written out as a whole. In this case
the mmap output buffer is just overhead.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agotests: elfcopy --reverse-offs should only swap sections next to each other.
Mark Wielaard [Mon, 3 Jun 2019 16:00:20 +0000 (18:00 +0200)]
tests: elfcopy --reverse-offs should only swap sections next to each other.

The run-reverse-sections-self.sh (which really should have been called
"swap-sections") could fail if the ELF file had sections that were not
directly next to each other swapped. Add a check to make sure the swapped
sections are actually directly next to each other.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agolibebl: Try harder to find backend library in bin and lib origin paths.
Mark Wielaard [Sat, 11 May 2019 14:55:01 +0000 (16:55 +0200)]
libebl: Try harder to find backend library in bin and lib origin paths.

eblopenbackend tries to find libraries based on the $ORIGIN/../$LIB/
path. But depending on whether the system is multilib or multiarch
this doesn't always work. On multilib systems $LIB is always just one
directory deep (it is either .../lib or .../lib64) but on multiarch
systems it can be multiple directories deep (.../lib/x86_64-linux-gnu).
This means that on multiarch systems $ORIGIN/../$LIB only works for
binaries (where origin is .../bin/), but not for libraries.

Most of the time it still works because of RPATH which is tried afterwards.
But RPATH processing does not always work reliable.

So try multiple paths first. The first time using the $ORIGIN as if it
came from an executable (in bin/) and then using the $ORIGIN as if it
came from an library (in lib[64]/ or lib/<arch>/). So first time using
../$LIB and second time just with the elfutils EBL_SUBDIR.

The first is what we do now and always work on multilib systems. The
second try works when loading relative to a library whether on a multilib
or multiarch system.

Then we use the same fallback (not using any path) we used already
(to take advantage of any RPATH or LD_LIBRARY_PATH setting).

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

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agolibelf: Mark shdr_flags dirty if offset or size changes during update.
Mark Wielaard [Sat, 11 May 2019 22:37:45 +0000 (00:37 +0200)]
libelf: Mark shdr_flags dirty if offset or size changes during update.

We forgot to mark the shdr_flags dirty when only the sh_size or
sh_offset changed during elf_update (). This meant that if there were
no other shdr changes we only wrote out the section data, but didn't
write out the shdr table to the file.

Add a testcase that puts some sections in the reverse order and then
writes out the resulting file again without doing any other
updates. This would show the issue after write out of the
(re-reversed) ELF file (the .shstrtab section offset would be wrong
causing all section names to be garbage). Also run a self test.

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agolibdw: Add DW_AT_GNU_numerator, DW_AT_GNU_denominator and DW_AT_GNU_bias.
Mark Wielaard [Thu, 16 May 2019 15:20:35 +0000 (17:20 +0200)]
libdw: Add DW_AT_GNU_numerator, DW_AT_GNU_denominator and DW_AT_GNU_bias.

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

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agoreadelf: Decode DW_AT_discr_list block attributes.
Mark Wielaard [Sun, 5 May 2019 21:18:36 +0000 (23:18 +0200)]
readelf: Decode DW_AT_discr_list block attributes.

Decode DW_AT_descr_list blocks using the DW_DSC values.
This requires knowing the signedness of the discriminant.
Which means the attr_callback function needs access to the
parent DIE. Pass the whole DIE path, plus the current level.
That way the type of the discriminant can be looked up in
the variant_part (parent) DIE of the variant DIE (which has
the discr_list attribute).

Add a testcase using both signed and unsigned discriminants.

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

Signed-off-by: Mark Wielaard <mark@klomp.org>
4 years agoreadelf: Clean up section lists after usage.
Mark Wielaard [Thu, 9 May 2019 11:15:14 +0000 (13:15 +0200)]
readelf: Clean up section lists after usage.

Signed-off-by: Mark Wielaard <mark@klomp.org>
5 years agolib/color: Fix compilation with uClibc
Rosen Penev [Fri, 3 May 2019 17:59:55 +0000 (10:59 -0700)]
lib/color: Fix compilation with uClibc

elfutils passed -Werror and this call errors on uClibc with a mismatching
pointer type. Cast to char * to fix.

Signed-off-by: Rosen Penev <rosenp@gmail.com>
5 years agolibelf: Add n_namesz offset overflow check to gelf_get_note.
Mark Wielaard [Wed, 1 May 2019 13:52:24 +0000 (15:52 +0200)]
libelf: Add n_namesz offset overflow check to gelf_get_note.

During fuzzing of the new xlate_notes testcase I noticed that
gelf_get_note didn't check whether the n_namesz of a note was
too big. This could lead to offset wrapping around. Causing an
infinite loop going over all ELF notes. Fix by adding an overflow
check before updating offset.

Signed-off-by: Mark Wielaard <mark@klomp.org>
5 years agolibelf: If xlate can only convert the ELF note header, just do that.
Mark Wielaard [Tue, 30 Apr 2019 11:00:17 +0000 (13:00 +0200)]
libelf: If xlate can only convert the ELF note header, just do that.

When we started parsing new style ELF_T_NHDR8 notes we added extra
checks on alignment and padding. When those failed we would stop
converting and just return the rest of the ELF Note unconverted.
In the case were we just had enough data for just the ELF Note header
and the destionation and source weren't the same we would then
accidentially throw away the Note header conversion we just did.

Fix that by indicating we did correctly convert just the header.

Adds testcase that compares parsing ELF notes with gelf_getnote
and parsing the raw data by hand using elf32_xlatetom using just
the Note header and ignoring the (raw) note data.

Signed-off-by: Mark Wielaard <mark@klomp.org>
5 years agotests: Don't printf a known NULL symname in backtrace-dwarf.c.
Mark Wielaard [Tue, 30 Apr 2019 18:48:13 +0000 (20:48 +0200)]
tests: Don't printf a known NULL symname in backtrace-dwarf.c.

GCC9 on 32bit systems might warn about '%s' directive argument is null
for symname in backtrace-dwarf.c. Just check whether symname is NULL.

This is an identical fix for the same issue as found in backtrace.c,
but now in backtrace-dwarf.c

Signed-off-by: Mark Wielaard <mark@klomp.org>
5 years agotests: Don't printf a known NULL symname.
Mark Wielaard [Tue, 30 Apr 2019 18:36:39 +0000 (20:36 +0200)]
tests: Don't printf a known NULL symname.

GCC9 on 32bit systems might warn about '%s' directive argument is null
for symname in backtrace.c. Just check whether symname is NULL.

Signed-off-by: Mark Wielaard <mark@klomp.org>
5 years agounstrip: Robustify gelf_getshdr and gelf_getsymshndx calls.
Mark Wielaard [Sun, 28 Apr 2019 16:07:03 +0000 (18:07 +0200)]
unstrip: Robustify gelf_getshdr and gelf_getsymshndx calls.

Signed-off-by: Mark Wielaard <mark@klomp.org>
5 years agosize: Robustify against gelf_getshdr returning NULL.
Mark Wielaard [Sun, 28 Apr 2019 16:02:05 +0000 (18:02 +0200)]
size: Robustify against gelf_getshdr returning NULL.

Signed-off-by: Mark Wielaard <mark@klomp.org>
5 years agonm: Simplify naming of invalid sections, check shdr isn't NULL.
Mark Wielaard [Sun, 28 Apr 2019 15:51:06 +0000 (17:51 +0200)]
nm: Simplify naming of invalid sections, check shdr isn't NULL.

When shdr is NULL or the sh_name index is invalid, don't try to use
it.  Just call the section "[invalid section name]". Don't try to be
too smart by creating a dynamic invalid name using alloca to simplify
memory usage in this exceptional case.

Signed-off-by: Mark Wielaard <mark@klomp.org>
5 years agoelfcmp: Handle bad sections without crashing.
Mark Wielaard [Sun, 28 Apr 2019 15:06:50 +0000 (17:06 +0200)]
elfcmp: Handle bad sections without crashing.

If we cannot get the Shdr of a section then don't try to use or
compare them.

Signed-off-by: Mark Wielaard <mark@klomp.org>
5 years agolibebl: Check ebl is not NULL in ebl_symbol_[binding|type]_name.
Mark Wielaard [Sun, 28 Apr 2019 11:40:45 +0000 (13:40 +0200)]
libebl: Check ebl is not NULL in ebl_symbol_[binding|type]_name.

For STB_GNU_UNIQUE and STT_GNU_IFUNC we need to check the elf of the
given ebl. Make sure the ebl given isn't NULL.

Signed-off-by: Mark Wielaard <mark@klomp.org>
5 years agolibdwfl: Make sure to left shift a unsigned 64bit value in expr_eval.
Mark Wielaard [Sun, 28 Apr 2019 11:29:53 +0000 (13:29 +0200)]
libdwfl: Make sure to left shift a unsigned 64bit value in expr_eval.

In frame_unwind.c expr_eval we left shift 1 up to 56 bits. We have to
make sure we don't left shift a 32bit signed value (that would be
undefined behavior). So shift a 1ULL value instead.

Signed-off-by: Mark Wielaard <mark@klomp.org>
5 years agolibdwfl: Don't call realloc with zero in cu.c addraranges.
Mark Wielaard [Sun, 28 Apr 2019 11:21:50 +0000 (13:21 +0200)]
libdwfl: Don't call realloc with zero in cu.c addraranges.

Calling realloc when naranges is zero will result is trying to free
aranges. If realloc does free aranges it returns NULL, which means
aranges is still assigned. This is likely not a problem, because in
most cases aranges will be NULL already. But if it was not and
naranges does turn out to be zero after reduction (which would be
invalid DWARF) we are left with a dangling pointer.

Signed-off-by: Mark Wielaard <mark@klomp.org>
5 years agolibdw: Remove unused variable initialization in dwarf_siblingof.
Mark Wielaard [Sun, 28 Apr 2019 11:04:28 +0000 (13:04 +0200)]
libdw: Remove unused variable initialization in dwarf_siblingof.

We immediately reassign the value of addr after declaration.

Signed-off-by: Mark Wielaard <mark@klomp.org>
5 years agolibdw: Call check_constant_offset with direct pointers.
Mark Wielaard [Sun, 28 Apr 2019 10:42:04 +0000 (12:42 +0200)]
libdw: Call check_constant_offset with direct pointers.

In dwarf_getlocation_addr pass the pointers to llbufs and listlens
indirectly by passing a pointer to the first array element. Simplify the
code by passing the pointers directly.

Signed-off-by: Mark Wielaard <mark@klomp.org>
5 years agolibdw: Reject DW_OP_implicit_value in CFI.
Mark Wielaard [Sat, 27 Apr 2019 21:58:57 +0000 (23:58 +0200)]
libdw: Reject DW_OP_implicit_value in CFI.

When we encounter a DW_OP_implicit_value we call store_implicit_value ()
which will try to store the value as part of the Dwarf dbg. But if we are
examining CFI there will be no Dwarf dbg. And DW_OP_implicit_value should
not be part of CFI. So explicitly reject it in store_implicit_value if
dbg is NULL.

Signed-off-by: Mark Wielaard <mark@klomp.org>
5 years agoconfig: Add git tag --verify to upload-release.sh.
Mark Wielaard [Mon, 15 Apr 2019 14:07:34 +0000 (16:07 +0200)]
config: Add git tag --verify to upload-release.sh.

Add a check to make sure we have to correct (signed) tag.

Signed-off-by: Mark Wielaard <mark@klomp.org>
5 years agobackends: riscv_cfi.c had a bad BACKEND define.
Mark Wielaard [Sun, 14 Apr 2019 20:40:53 +0000 (22:40 +0200)]
backends: riscv_cfi.c had a bad BACKEND define.

BACKEND should have been defined as riscv_ (not aarch64_).

Reported-by: Mao Han <han_mao@c-sky.com>
Signed-off-by: Mark Wielaard <mark@klomp.org>
5 years agolibelf: Sync elf.h from glibc
Mao Han [Wed, 10 Apr 2019 07:51:48 +0000 (15:51 +0800)]
libelf: Sync elf.h from glibc

Signed-off-by: Mao Han <han_mao@c-sky.com>
5 years agoreadelf: Print DW_AT_data_member_location as decimal offset, not hex number.
Mark Wielaard [Wed, 3 Apr 2019 14:54:15 +0000 (16:54 +0200)]
readelf: Print DW_AT_data_member_location as decimal offset, not hex number.

The data_member_location attribute was printed as a hex number, but other
constant attributes like bit_offset, byte_size or alignment were printed
as decimal numbers. This is confusing.

The reason that data_member_location was printed as hex seemed to have
been because it could also have been a location description, in which
case it might have been of DW_FORM_loclist, for which it makes sense
to print as hex offset (between square brackets).

Signed-off-by: Mark Wielaard <mark@klomp.org>
5 years agoreadelf: print_debug_macinfo_section, check cus[0] is not the sentinel.
Mark Wielaard [Fri, 29 Mar 2019 09:53:27 +0000 (10:53 +0100)]
readelf: print_debug_macinfo_section, check cus[0] is not the sentinel.

If there are no CUs at all we can not find any CU DIE file.

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

Signed-off-by: Mark Wielaard <mark@klomp.org>
5 years agolibdwfl: Sanity check partial core file phdrs data read.
Mark Wielaard [Wed, 27 Mar 2019 21:32:21 +0000 (22:32 +0100)]
libdwfl: Sanity check partial core file phdrs data read.

When reading the phdrs data from the core file check if we got everything,
or just part of the data.

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

Signed-off-by: Mark Wielaard <mark@klomp.org>
5 years agostrip: Files with symbols referring to non-existing sections are illformed
Mark Wielaard [Wed, 27 Mar 2019 20:54:06 +0000 (21:54 +0100)]
strip: Files with symbols referring to non-existing sections are illformed

The check added in commit 4540ea98c "strip: Fix check test for SHN_XINDEX
symbol" was not complete. The (extended) section index should also exist.
If it doesn't exist, mark the file as illformed.

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

Signed-off-by: Mark Wielaard <mark@klomp.org>
5 years agolibelf: Use posix_memalign instead of aligned_alloc.
Mark Wielaard [Thu, 7 Mar 2019 16:31:53 +0000 (17:31 +0100)]
libelf: Use posix_memalign instead of aligned_alloc.

Older glibc might not have aligned_alloc (it is C11).
Use posix_memalign instead. posix_memalign requires the alignment to
be a multiple of sizeof (void *). So use malloc for smaller alignments.

Signed-off-by: Mark Wielaard <mark@klomp.org>
5 years agolibasm: Check return value of gelf_update_ehdr in asm_end.
Mark Wielaard [Wed, 6 Mar 2019 19:02:52 +0000 (20:02 +0100)]
libasm: Check return value of gelf_update_ehdr in asm_end.

In theory the gelf_update_ehdr call could fail. Immediately report an
error in that case.

Signed-off-by: Mark Wielaard <mark@klomp.org>