+2019-08-12 Mark Wielaard <mark@klomp.org>
+
+ * libdw.map (ELFUTILS_0.177): Add new version of dwelf_elf_begin.
+
2019-06-28 Mark Wielaard <mark@klomp.org>
* libdw.map (ELFUTILS_0.177): New section. Add
ELFUTILS_0.177 {
global:
dwelf_elf_e_machine_string;
+ # Replaced ELFUTILS_0.175 versions. Both versions point to the
+ # same implementation, but users of the new symbol version can
+ # presume that NULL is only returned on error (otherwise ELF_K_NONE).
+ dwelf_elf_begin;
} ELFUTILS_0.175;
+2019-08-12 Mark Wielaard <mark@klomp.org>
+
+ * libdwelf.h (dwelf_elf_begin): Update documentation.
+ * dwelf_elf_begin.c (dwelf_elf_begin): Don't suppress ELF_K_NONE.
+ Mark old and new version.
+
2019-06-28 Mark Wielaard <mark@klomp.org>
* Makefile.am (libdwelf_a_SOURCES): Add dwelf_elf_e_machine_string.c.
{
Elf *elf = NULL;
Dwfl_Error e = __libdw_open_elf (fd, &elf);
- if (elf != NULL && elf_kind (elf) != ELF_K_NONE)
+ if (e == DWFL_E_NOERROR)
return elf;
- /* Elf wasn't usable. Make sure there is a proper elf error message. */
-
- if (elf != NULL)
- elf_end (elf);
+ /* Elf wasn't usable. Make sure there is a proper elf error
+ message. This is probably not the real error, because there is
+ no good way to propagate errnos or decompression errors, but
+ better than nothing. */
if (e != DWFL_E_LIBELF)
{
return NULL;
}
+OLD_VERSION (dwelf_elf_begin, ELFUTILS_0.175)
+NEW_VERSION (dwelf_elf_begin, ELFUTILS_0.177)
/* Creates a read-only Elf handle from the given file handle. The
file may be compressed and/or contain a linux kernel image header,
in which case it is eagerly decompressed in full and the Elf handle
- is created as if created with elf_memory (). On error NULL is
- returned. The Elf handle should be closed with elf_end (). The
- file handle will not be closed. Does not return ELF_K_NONE handles. */
+ is created as if created with elf_memory (). On decompression or
+ file errors NULL is returned (and elf_errno will be set). If there
+ was no error, but the file is not an ELF file, then an ELF_K_NONE
+ Elf handle is returned (just like with elf_begin). The Elf handle
+ should be closed with elf_end (). The file handle will not be
+ closed. */
extern Elf *dwelf_elf_begin (int fd);
/* Returns a human readable string for the given ELF header e_machine
+2019-08-12 Mark Wielaard <mark@klomp.org>
+
+ * gzip.c (open_stream): Return DWFL_E_ERRNO on bad file operation.
+ * open.c (libdw_open_elf): New argument bad_elf_ok. Check it and
+ return DWFL_E_NOERROR in case it is set and error was DWFL_E_BADELF.
+ (__libdw_open_file): Call libdw_open_elf with bad_elf_ok false.
+ (__libdw_open_elf): Call libdw_open_elf with bad_elf_ok true.
+
2019-08-05 Omar Sandoval <osandov@fb.com>
* dwfl_segment_report_module.c (dwfl_segment_report_module): Assign
{
int d = dup (fd);
if (unlikely (d < 0))
- return DWFL_E_BADELF;
+ return DWFL_E_ERRNO;
if (start_offset != 0)
{
off_t off = lseek (d, start_offset, SEEK_SET);
if (off != start_offset)
{
close (d);
- return DWFL_E_BADELF;
+ return DWFL_E_ERRNO;
}
}
state->zf = gzdopen (d, "r");
if (result == DWFL_E_NOERROR && gzdirect (state.zf))
{
gzclose (state.zf);
+ /* Not a compressed stream after all. */
return fail (&state, DWFL_E_BADELF);
}
static Dwfl_Error
libdw_open_elf (int *fdp, Elf **elfp, bool close_on_fail, bool archive_ok,
- bool never_close_fd)
+ bool never_close_fd, bool bad_elf_ok)
{
bool may_close_fd = false;
&& !(archive_ok && kind == ELF_K_AR))
error = DWFL_E_BADELF;
+ /* This basically means, we keep a ELF_K_NONE Elf handle and return it. */
+ if (bad_elf_ok && error == DWFL_E_BADELF)
+ error = DWFL_E_NOERROR;
+
if (error != DWFL_E_NOERROR)
{
elf_end (elf);
Dwfl_Error internal_function
__libdw_open_file (int *fdp, Elf **elfp, bool close_on_fail, bool archive_ok)
{
- return libdw_open_elf (fdp, elfp, close_on_fail, archive_ok, false);
+ return libdw_open_elf (fdp, elfp, close_on_fail, archive_ok, false, false);
}
Dwfl_Error internal_function
__libdw_open_elf (int fd, Elf **elfp)
{
- return libdw_open_elf (&fd, elfp, false, true, true);
+ return libdw_open_elf (&fd, elfp, false, true, true, true);
}