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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
Ulrich Drepper [Sat, 7 Sep 2019 09:06:13 +0000 (11:06 +0200)]
Fix whitespaces in RISC-V disasm code
Ulrich Drepper [Fri, 6 Sep 2019 21:49:54 +0000 (23:49 +0200)]
Implement RISC-V disassembler
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
Mark Wielaard [Wed, 6 Mar 2019 18:56:54 +0000 (19:56 +0100)]
libelf: Fix possible resource leak in elf[32|64]_updatefile.
When we cannot allocate enough memory to convert the data in
updatemmap we should free the scns before returning an error.
Signed-off-by: Mark Wielaard <mark@klomp.org>
Mark Wielaard [Mon, 4 Mar 2019 19:10:35 +0000 (20:10 +0100)]
tests: Remove tgkill define from backtrace.c
tgkill is never used in the test and it might conflict with newer
glibc which might define tgkill themselves (just like gettid):
https://sourceware.org/bugzilla/show_bug.cgi?id=6399
Signed-off-by: Mark Wielaard <mark@klomp.org>
Mark Wielaard [Sat, 23 Feb 2019 19:44:24 +0000 (20:44 +0100)]
libelf: Remove unused __elf_xfctstof.
__elf_xfctstof is only used in case the memory size and file size of ELF
data structures are different. This is never the case.
Signed-off-by: Mark Wielaard <mark@klomp.org>
Mark Wielaard [Thu, 21 Feb 2019 23:28:01 +0000 (00:28 +0100)]
libelf: Remove unused internal __elf[32|64]_msize functions.
Those functions were intended for ELF versions where the memory and
file sizes of data structures are different. They were never used
because libelf depends on the file and memory sizes being equal
(otherwise using mmap wouldn't work).
Signed-off-by: Mark Wielaard <mark@klomp.org>
Mark Wielaard [Sun, 3 Feb 2019 18:05:13 +0000 (19:05 +0100)]
libelf: There is just one ELF version.
Remove (partially defined out) code and data structures dealing with
multiple ELF versions. There hasn't been a new ELF version in the
last 20 years. Simplify the code a bit by just assuming there will
only be one version (EV_CURRENT == 1).
Simplifies elf_version, gets rid of __libelf_version_initialized.
Removes one (or more) array (version) dimension from various tables
and accessor functions (__elf_xfctstom, shtype_map, __libelf_data_type,
__libelf_type_aligns and __libelf_type_sizes).
Signed-off-by: Mark Wielaard <mark@klomp.org>`
Mark Wielaard [Sun, 3 Feb 2019 18:03:26 +0000 (19:03 +0100)]
libdwfl: Initialize notes early in intuit_kernel_bounds.
We fake initialization of notes with an empty asm statement. But
it is simpler and less confusing to just initialize notes just
before the fopen.
Signed-off-by: Mark Wielaard <mark@klomp.org>
Mark Wielaard [Tue, 19 Feb 2019 15:27:40 +0000 (16:27 +0100)]
libelf: Handle zero size decompressed data.
This is a corner case that will most likely never occur in practice,
but we have several testcases that compress and decompress zero sized
data. In that case during decompression we might malloc a buffer of
size zero. It is allowed for malloc to return NULL in that case. But
we do need a non-NULL buffer to return and set as result. So make sure
to always at least allocate one byte. Also make sure that we don't
allocate a zero sized conversion buffer for the data.
https://sourceware.org/bugzilla/show_bug.cgi?id=24000
Signed-off-by: Mark Wielaard <mark@klomp.org>
Mark Wielaard [Fri, 15 Feb 2019 13:39:57 +0000 (14:39 +0100)]
s390: elflint should check if _GLOBAL_OFFSET_TABLE_ points to .got.
The _GLOBAL_OFFSET_TABLE_ symbol might point to the DT_PLTGOT,
which is in the .got section, even if the symbol itself is
associated with the .got.plt section.
See https://sourceware.org/ml/binutils/2018-07/msg00200.html
Signed-off-by: Mark Wielaard <mark@klomp.org>
Mark Wielaard [Thu, 14 Feb 2019 12:29:39 +0000 (13:29 +0100)]
Prepare for 0.176
Set version to 0.176.
Update NEWS and elfutils.spec.in.
Update GPG-KEY.
Regenerate po/*.po files.
Signed-off-by: Mark Wielaard <mark@klomp.org>
Mark Wielaard [Thu, 14 Feb 2019 10:47:59 +0000 (11:47 +0100)]
libelf: Make sure ar_size is terminated when reading ar long names.
The ar_size is given as a fixed size decimal string, right padded with
spaces. Make sure we read it properly even if there is no terminating
space. Also sanity check len early if we can.
https://sourceware.org/bugzilla/show_bug.cgi?id=24085
Signed-off-by: Mark Wielaard <mark@klomp.org>
Mark Wielaard [Fri, 1 Feb 2019 13:03:38 +0000 (14:03 +0100)]
libdw: Check there is enough space for CU 64bit length, version and type.
We only checked we could read the initial length and after knowing the
version and type whether the unit header was the right size. Also check
there are at least enough bytes to read the 64bit length, version and
unit type bytes.
https://sourceware.org/bugzilla/show_bug.cgi?id=24140
Signed-off-by: Mark Wielaard <mark@klomp.org>
Mark Wielaard [Fri, 1 Feb 2019 08:08:14 +0000 (09:08 +0100)]
readelf: Check there is enough data to read DWARF line opcodes arguments.
When reading the debug_line opcode arguments we have to make sure there
is enough data to read the arguments (if there are any(.
The similar code in dwarf_getsrclines already had these checks.
https://sourceware.org/bugzilla/show_bug.cgi?id=24116
Signed-off-by: Mark Wielaard <mark@klomp.org>
Mark Wielaard [Fri, 18 Jan 2019 13:18:22 +0000 (14:18 +0100)]
configure: Add new --enable-install-elfh option.
We explicitly test (with system-elf-libelf) that our include headers
work with the system elf.h header. But it might be helpful to install
the elf.h file for a private install. Our elf.h header really is just
a copy of the latest glibc elf.h. But it might be newer and include
more constants than the system installed elf.h.
Add a new configure option --enable-install-elfh to install elf.h.
But warn when it is enabled for the default /usr or /usr/local prefix
because it might clash with the glibc/system elf.h header in that case.
Signed-off-by: Mark Wielaard <mark@klomp.org>
Mark Wielaard [Thu, 31 Jan 2019 22:18:25 +0000 (23:18 +0100)]
tests: Remove assert (errno == 0) from tests.
When a function fails it might set errno. But it isn't a guarantee
that if a function succeeds that it sets errno to zero.
Signed-off-by: Mark Wielaard <mark@klomp.org>
Yonghong Song [Tue, 29 Jan 2019 21:33:03 +0000 (13:33 -0800)]
tests: parse inode in /proc/pid/maps/correctly in run-backtrace-data.sh
The backtrace-data.c parsed the inode in /proc/pid/maps with
format "%*x".
This caused failure if inode is big. For example,
7f269223d000-
7f269226b000 r-xp
00000000 00:50
10224326387095067468 /home/...
The error likes below:
-bash-4.4$ cat run-backtrace-data.sh.log
backtrace-data: /home/engshare/elfutils/0.174/src/elfutils-0.174/tests/backtrace-data.c:110:
maps_lookup: Assertion `errno == 0' failed.
/home/engshare/elfutils/0.174/src/elfutils-0.174/tests/test-subr.sh: line 84:
3123578 Aborted (core dumped)
LD_LIBRARY_PATH="${built_library_path}${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH" $VALGRIND_CMD "$@"
data: no main
-bash-4.4$
The reason is errno is ERANGE.
Fix the test with inode format string "%*u" as inode here is presented
as decimal numbers.
Suggested-by: Mark Wielaard <mark@klomp.org>
Signed-off-by: Yonghong Song <yhs@fb.com>
Mark Wielaard [Tue, 29 Jan 2019 23:04:11 +0000 (00:04 +0100)]
libebl: Check GNU property note data padding fits inside note.
The GNU property note data is padded. Make sure the extra padding
still fits in the note description.
https://sourceware.org/bugzilla/show_bug.cgi?id=24075
Signed-off-by: Mark Wielaard <mark@klomp.org>
Yonghong Song [Fri, 25 Jan 2019 21:20:08 +0000 (13:20 -0800)]
libdwfl: parse inode in /proc/pid/maps correctly
The inode number in /proc/pid/maps is displayed as "unsigned long"
type.
In one of our x64 system, we have inode number exceeding valid "long"
type range, which caused the following test failure:
FAIL: dwfl-bug-fd-leak
FAIL: run-backtrace-dwarf.sh
FAIL: vdsosyms
The offending map entry:
7f269246b000-
7f269246c000 rw-p
0002e000 00:50
10224326387095067468 /home/...
This patch changed sscanf inode number type from PRIi64 to PRIu64
and fixed the problem.
Signed-off-by: Yonghong Song <yhs@fb.com>
Ulf Hermann [Thu, 17 Jan 2019 14:00:46 +0000 (15:00 +0100)]
tests: Use separate files for strip outputs
This way we can verify that strip actually created all of them.
Also, check that strip, unstrip, elflint actually succeed in
run-strip-test-many.sh. This exposed the fact that the generated
testfile in run-strip-test-many.sh is considered as illformed by
strip -g.
Signed-off-by: Ulf Hermann <ulf.hermann@qt.io>
Mark Wielaard [Thu, 24 Jan 2019 15:00:49 +0000 (16:00 +0100)]
strip: Fix check test for SHN_XINDEX symbol.
The check for whether a symbol used the extended section table was
wrong causing the run-strip-test-many.sh testcase to declare the
testfile was an illformed file.
Fixing this exposed a strict elfutils check for the '.shstrtab'
section having this exact name and a SHT_STRTAB type. This might
be a little too strict, but easily worked around by changing the
name of the "old" shstrtab section in the addsections program.
Signed-off-by: Mark Wielaard <mark@klomp.org>
Mark Wielaard [Tue, 22 Jan 2019 14:55:18 +0000 (15:55 +0100)]
readelf: Don't go past end of line data reading unknown opcode parameters.
https://sourceware.org/bugzilla/show_bug.cgi?id=24116
Signed-off-by: Mark Wielaard <mark@klomp.org>
Mark Wielaard [Sun, 20 Jan 2019 21:10:18 +0000 (22:10 +0100)]
libdw: Check terminating NUL byte in dwarf_getsrclines for dir/file table.
For DWARF version < 5 the .debug_line directory and file tables consist
of a terminating NUL byte after all strings. The code used to just skip
this without checking it actually existed. This could case a spurious
read past the end of data.
Fix the same issue in readelf.
https://sourceware.org/bugzilla/show_bug.cgi?id=24102
Signed-off-by: Mark Wielaard <mark@klomp.org>
Mark Wielaard [Sun, 20 Jan 2019 22:05:56 +0000 (23:05 +0100)]
libdwfl: Sanity check partial core file dyn data read.
When reading the dyn data from the core file check if we got everything,
or just part of the data.
https://sourceware.org/bugzilla/show_bug.cgi?id=24103
Signed-off-by: Mark Wielaard <mark@klomp.org>
Mark Wielaard [Wed, 16 Jan 2019 14:41:31 +0000 (15:41 +0100)]
libebl: Check NT_PLATFORM core notes contain a zero terminated string.
Most strings in core notes are fixed size. But NT_PLATFORM contains just
a variable length string. Check that it is actually zero terminated
before passing to readelf to print.
https://sourceware.org/bugzilla/show_bug.cgi?id=24089
Signed-off-by: Mark Wielaard <mark@klomp.org>
Mark Wielaard [Wed, 16 Jan 2019 11:25:57 +0000 (12:25 +0100)]
libelf: Correct overflow check in note_xlate.
We want to make sure the note_len doesn't overflow and becomes shorter
than the note header. But the namesz and descsz checks got the note header
size wrong). Replace the wrong constant (8) with a sizeof cvt_Nhdr (12).
https://sourceware.org/bugzilla/show_bug.cgi?id=24084
Signed-off-by: Mark Wielaard <mark@klomp.org>
Mark Wielaard [Wed, 16 Jan 2019 10:57:35 +0000 (11:57 +0100)]
libebl: Check GNU property note pr_datasz fits inside note description.
Before printing the data values, make sure pr_datasz doesn't go beyond
the end of the note description data.
https://sourceware.org/bugzilla/show_bug.cgi?id=24075
Signed-off-by: Mark Wielaard <mark@klomp.org>