summaryrefslogtreecommitdiffstats
path: root/libdw
Commit message (Collapse)AuthorAgeFilesLines
* debuginfod 1/2: client sideAaron Merey2019-11-222-1/+5
| | | | | | | | | | | | 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>
* libdw: Introduce libdw_unalloc to stop Dwarf_Abbrev leaks.Mark Wielaard2019-11-124-1/+43
| | | | | | | | | 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>
* libdw: Rewrite the memory handler to be more robust.Jonathon Anderson2019-11-085-53/+122
| | | | | | | | 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>
* libdw: Add and use a concurrent version of the dynamic-size hash table.Srđan Milaković2019-11-088-9/+25
| | | | | Signed-off-by: Srđan Milaković <sm108@rice.edu> Signed-off-by: Mark Wielaard <mark@klomp.org>
* libdw: Don't free uninitialized Dwarf_Abbrev_Hash's of "fake" CUs.Jonathon Anderson2019-11-023-12/+35
| | | | | | | | | | | 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>
* libdw: Rewrite the memory handler to be thread-safe.Jonathon Anderson2019-10-246-36/+68
| | | | Signed-off-by: Jonathon Anderson <jma14@rice.edu>
* Don't use dlopen() for libebl modulesOmar Sandoval2019-08-292-7/+18
| | | | | | | | | | | | 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>
* Add PIC and non-PIC variants of libcpu and libeblOmar Sandoval2019-08-282-1/+5
| | | | | | | | | 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>
* libdw: fix latent bug in dwarf_getcfi.c not setting default_same_value.Jonathon Anderson2019-08-262-0/+5
| | | | Signed-off-by: Jonathon Anderson <jma14@rice.edu>
* libdwelf: Make dwelf_elf_begin return NULL only when there is an error.Mark Wielaard2019-08-132-0/+8
| | | | | | | | | | | | | | | | | | | | | | | 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>
* libdwelf: Add dwelf_elf_e_machine_string and use it in readelf.Mark Wielaard2019-07-102-1/+11
| | | | | | | | | | | | | | | | 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>
* libdw: Add DW_AT_GNU_numerator, DW_AT_GNU_denominator and DW_AT_GNU_bias.Mark Wielaard2019-05-162-0/+11
| | | | | | https://sourceware.org/bugzilla/show_bug.cgi?id=24550 Signed-off-by: Mark Wielaard <mark@klomp.org>
* libdw: Remove unused variable initialization in dwarf_siblingof.Mark Wielaard2019-04-282-1/+5
| | | | | | We immediately reassign the value of addr after declaration. Signed-off-by: Mark Wielaard <mark@klomp.org>
* libdw: Call check_constant_offset with direct pointers.Mark Wielaard2019-04-282-1/+6
| | | | | | | | 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>
* libdw: Reject DW_OP_implicit_value in CFI.Mark Wielaard2019-04-282-0/+7
| | | | | | | | | | 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>
* libdw: Check there is enough space for CU 64bit length, version and type.Mark Wielaard2019-02-012-3/+20
| | | | | | | | | | | 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>
* libdw: Check terminating NUL byte in dwarf_getsrclines for dir/file table.Mark Wielaard2019-01-222-3/+13
| | | | | | | | | | | | | 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>
* libdw: Enable building with -Og.Mark Wielaard2018-11-233-2/+7
| | | | | | | | | | | | When building with -Og gcc is unable to see that __libdw_dieabbrev () will initialize what the second argument points to when no error occurs as called by dwarf_child and dwarf_getattrs. Causing an possibly uninitialized error. Just initialize readp/die_addr to NULL, which is the value we would return if an error occurs anyway. https://sourceware.org/bugzilla/show_bug.cgi?id=23914 Signed-off-by: Mark Wielaard <mark@klomp.org>
* libdwelf: New function dwelf_elf_begin.Mark Wielaard2018-11-092-0/+9
| | | | | | | | | | | | | | | | | | This introduces a new function dwelf_elf_begin which creates a (read-only) ELF handle from a possibly compressed file handle or a file that start with a linux kernel header. This can be used in eu-readelf to (re)open a (pure) ELF. eu-readelf uses libdwfl to relocate addresses in the original file in case it is ET_REL. But to show the "raw" data it might need to (re)open the file. Which could fail if the file was compressed. And produced an obscure error message: "cannot create EBL handle". This rewrites __libdw_open_file a little so that the given file handle will never be closed (whether on success or failure) and introduces a new internal function __libdw_open_elf that dwelf_elf_begin wraps. Signed-off-by: Mark Wielaard <mark@klomp.org>
* Also find CFI in sections of type SHT_X86_64_UNWINDMilian Wolff2018-11-092-1/+5
| | | | | | | | | | | | | | | | | | | | | | On my system with g++ (GCC) 8.2.1 20180831 with GNU gold (GNU Binutils 2.31.1) 1.16, the .eh_frame section does not have type PROGBITS but rather is using X86_64_UNWIND nowadays: ``` $ echo "int main(){ return 0; }" > test.c $ gcc test.c $ readelf --sections a.out | grep .eh_frame [14] .eh_frame X86_64_UNWIND 0000000000000670 00000670 [15] .eh_frame_hdr X86_64_UNWIND 0000000000000724 00000724 ``` Without this patch, libdw refuses to use the available unwind information, leading to broken backtraces while unwinding. With the patch applied, unwinding works once more in such situations. Signed-off-by: Milian Wolff <milian.wolff@kdab.com> Signed-off-by: Mark Wielaard <mark@klomp.org> Tested-by: Milian Wolff <milian.wolff@kdab.com>
* libdw: dwarf_begin_elf should use elf_getshdrstrndx to get section names.Mark Wielaard2018-09-142-8/+28
| | | | | | | | | | | dwarf_begin_elf used the Ehdr e_shstrndx to get the shdr string table section. This does not work for ELF files with more than SHN_LORESERVE sections. Use elf_getshdrstrndx, and don't pass around the ehdr. Add a simple testcase that fails before the patch because dwarf_begin return an error. Signed-off-by: Mark Wielaard <mark@klomp.org>
* libdw: Check end of attributes list consistently.Mark Wielaard2018-08-183-3/+10
| | | | | | | | | | | | | | | | | | | | | | | dwarf_child (__libdw_find_attr), dwarf_getabbrevattr[_data] and dwarf_getattrs all assume the end of the attribute list is when both the name (code) and form of the attribute are zero. dwarf_getabbrev (__libdw_getabbrev) and dwarf_hasattr assume the end of the attribute list is when either the name (code) or the form of the attribute is zero. The DWARF spec says: "The series of attribute specifications ends with an entry containing 0 for the name and 0 for the form." So the first check is correct. Make sure dwarf_getabbrev and dwarf_hasattr use the same check. This is important since all other functions expect dwarf_getabbrev (__libdw_getabbrev) to have done a data sanity check of the attribute. So if the ending condition is different it could cause a crash. https://sourceware.org/bugzilla/show_bug.cgi?id=23529 Signed-off-by: Mark Wielaard <mark@klomp.org>
* libdw, readelf: Make sure there is enough data to read full aranges header.Mark Wielaard2018-08-182-0/+9
| | | | | | | | | | dwarf_getaranges didn't check if there was enough data left to read both the address and segment size. readelf didn't check there was enough data left to read the segment size. https://sourceware.org/bugzilla/show_bug.cgi?id=23541 Signed-off-by: Mark Wielaard <mark@klomp.org>
* Consolidate error.h inclusion in system.hRoss Burton2018-07-052-1/+4
| | | | | | | | | error.h isn't standard and so isn't part of the musl C library. To easy future porting, consolidate the inclusion of error.h into system.h. https://sourceware.org/bugzilla/show_bug.cgi?id=21008 Signed-off-by: Ross Burton <ross.burton@intel.com>
* libdw: Recognize zero terminator to end frame table in dwarf_next_cfi.Mark Wielaard2018-06-292-0/+12
| | | | | | | | | | | | | When the length is zero this is a the zero terminator that ends the frame table. Return 1 (end of table) instead of -1 (error) in that case. We cannot update next_off and don't want to caller to try again. Add testcase for dwarf_next_cfi to show both .eh_frame and .debug_frame tables and check consistency (FDEs should point to existing CIEs). Also add a self check to make sure we can read the table from the just build elfutils binaries. Signed-off-by: Mark Wielaard <mark@klomp.org>
* libdw: Allow .debug_frame only Dwarf.Mark Wielaard2018-06-292-1/+7
| | | | | | | | | .debug_frame is useful independent from the other .debug sections. Add a simplified variant of the addrcfi testcase dwarfcfi. dwarfcfi only uses dwarf_frame calls and no dwfl helpers. Signed-off-by: Mark Wielaard <mark@klomp.org>
* libdw: Remove dwarf_getscn_info from libdw.h and libdw.map.Mark Wielaard2018-06-293-4/+5
| | | | | | | This function was never actually implemented/provided by libdw. And it doesn't look like something we really want to implement. Signed-off-by: Mark Wielaard <mark@klomp.org>
* libdw: Add dwarf_next_lines to read .debug_line tables without CUs.Mark Wielaard2018-06-297-24/+248
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | It is sometimes useful to read .debug_line tables on their own without having an associated CU DIE. DWARF5 line tables are self-contained. Adjust dwarf_begin_elf to accept ELF files with just a .debug_line. Add a new function dwarf_next_lines that returns the Dwarf_Files and Dwarf_Lines while iterating over just the .debug_lines section. Since we parse and cache the information it also will try to match the CU a table is associated with. This is only necessary for DWARF4 line tables (we will need at least the compilation dir from the CU) and won't be done for DWARF5 line tables. It also isn't an error if there is no associated CU (but will mean for DWARF4 line tables the dir list and the file paths might not be complete). A typical way to call this new function is: Dwarf_Off off, next_off = 0; Dwarf_CU *cu = NULL; Dwarf_Files *files; size_t nfiles; Dwarf_Lines *lines; size_t nlines; int res; while ((res = dwarf_next_lines (dbg, off = next_off, &next_off, &cu, &files, &nfiles, &lines, &nlines)) == 0) { /* ... handle files and lines ... */ } if (res < 0) printf ("BAD dwarf_next_lines: %s\n", dwarf_errmsg (-1)); See libdw.h for the full documentation. For more examples on how to use the function see the new testcases next-files and next-lines. Also adjust the file paths for line tables missing a comp_dir. They are no longer made "absolute" by prepending a slash '/' in front of them. This really was not useful and didn't happen in any of the testcases. They are now just kept relative. Make eu-readelf --debug-dump=decodedline use dwarf_next_lines instead of iterating over the CUs to show the (decoded) line tables. This allows it to show decoded line tables even if there is no .debug_info section. New tests have been added that mimic the get-files and get-lines tests but use dwarf_next_lines instead of iterating over all CUs. They produce identical output (modulo the CU information). Also add a new test file that contains only a .debug_line section. Signed-off-by: Mark Wielaard <mark@klomp.org>
* libdw: Handle bogus CU length in dwarf_nextcu.Mark Wielaard2018-06-252-0/+10
| | | | | | | | | | The length field could be so big that it would wrap around the next_offset. We don't really care that length is bogus, but we don't want to use it to calculate the next offset if it is. Found by afl-fuzz. Signed-off-by: Mark Wielaard <mark@klomp.org>
* libdw: Break dwarf_aggregate_size recursion because of type cycles.Mark Wielaard2018-06-202-9/+27
| | | | | | | | Found by afl-fuzz. An array type (indirectly) referring to itself in the DIE tree could blow up the stack when dwarf_aggregate_size was called. Limit the recursion depth to MAX_DEPTH (256) entries. Signed-off-by: Mark Wielaard <mark@klomp.org>
* libdw: dwarf_peel_type break long chains/cycles.Mark Wielaard2018-06-202-9/+18
| | | | | | | | Limit the number of chained modifiers to 64 (that is 8 chains for all 8 modifiers, most of which cannot be chained). This prevents loops in the DWARF DIE DW_AT_type references. Signed-off-by: Mark Wielaard <mark@klomp.org>
* libdw: aggregate_size check NULL result from get_type.Mark Wielaard2018-06-202-0/+7
| | | | | | | | | | aggregate_size can be called recursively with the result of get_type. get_type can return NULL when dwarf_peel_type fails. Found by afl-fuzz. dwarf_aggregate_size when called directly doesn't need a NULL check because it calls and checks the result of dwarf_peel_type directly. Signed-off-by: Mark Wielaard <mark@klomp.org>
* libdw: Initialize filelist earlier in dwarf_getsrclines.c read_srclines.Luiz Angelo Daros de Luca2018-06-182-1/+6
| | | | | | | | | | | | | | I'm getting this error with 0.172: dwarf_getsrclines.c: In function 'read_srclines': dwarf_getsrclines.c:1074:7: error: 'filelist' may be used uninitialized in this function [-Werror=maybe-uninitialized] free (filelist); ^~~~~~~~~~~~~~~ It seems that gcc is right here as there is "ifs" that go to "out" (where filelist is freed) before freelist is initialized. Signed-off-by: Luiz Angelo Daros de Luca <luizluca@gmail.com>
* libdw, readelf: Don't handle DW_FORM_data16 as expression block/location.Mark Wielaard2018-06-172-13/+39
| | | | | | | | | | | Also found by afl-fuzz on the varlocs testcase. DW_FORM_data16 is constant form according to the DWARF5 spec. But since it is 128bits it isn't really representable as Dwarf_Word. So we treat it as block form. But we cannot treat it as an expression block. Make sure readelf prints it as a regular block and that dwarf_getlocation[s|_addr] doesn't treat it as location expression. Signed-off-by: Mark Wielaard <mark@klomp.org>
* readelf: Make sure print_form_data always consumes DW_FORM_strx[1234] data.Mark Wielaard2018-06-172-0/+9
| | | | | | | | | | Found by afl-fuzz. When printing DW_FORM_strx[1234] data eu-readelf didn't increase readp which meant eu-readelf would keep printing the same line dirs or files encoded with strx[1234] names. This meant that for insane large dir or file counts eu-readelf would just keep printing endlessly because we never reached and of the .debug_line buffer. Signed-off-by: Mark Wielaard <mark@klomp.org>
* libdw: Make __libdw_dieabbrev more robust on failure.Mark Wielaard2018-06-172-2/+8
| | | | | | | | Make sure to always set die->abbrev to DWARF_END_ABBREV on failure. DWARF_END_ABBREV is also what the function reports on failure. And it will prevent trying to lookup the abbrev ever again. Signed-off-by: Mark Wielaard <mark@klomp.org>
* libdw: Break long or circular DIE ref chains in dwarf_[has]attr_integrate.Mark Wielaard2018-06-113-4/+10
| | | | | | | | Bad DWARF could create a very long or circular DIE ref chain by linking DW_AT_abstract_origin or DW_AT_specification to the DIE itself. Break the chain after seeing a large number (16) of DIEs. Signed-off-by: Mark Wielaard <mark@klomp.org>
* libdw: Check validity of dwarf_getabbrev arguments.Mark Wielaard2018-06-112-3/+21
| | | | | | | When the given Dwarf_Die was invalid we might crash and when the offset was totally bogus we might succeed with a random abbrev. Signed-off-by: Mark Wielaard <mark@klomp.org>
* libdw: dwarf_get_units should handle existing failure to open Dwarf.Mark Wielaard2018-06-112-0/+9
| | | | | | | The other dwarf unit/cu iterators handle a NULL Dwarf handle as an existing error and return NULL. Don't crash. Signed-off-by: Mark Wielaard <mark@klomp.org>
* libdw: Detect bad DWARF in store_implicit_value.Mark Wielaard2018-06-102-6/+26
| | | | | | | | | | The afl fuzzer running against the varlocs test detected we didn't report the value block of a DW_OP_implicit_value consistently when the DWARF was bad. Although this doesn't cause a crash it might result in consumers using dwarf_getlocation_implicit_value seeing an inconsistent block length value. To fix this detect and report bad DWARF data earlier. Signed-off-by: Mark Wielaard <mark@klomp.org>
* readelf, libdw: Handle too many directories or files in the line table better.Mark Wielaard2018-06-102-0/+14
| | | | | | | | | | | | | The afl fuzzer found that the way we handle "too many" directories or files in the (DWARF5 style) line table badly. In the case of eu-readelf we would print an endless stream of "bad directory" or "bad file". Just stop printing when the end of data is reached. In the case of dwarf_getsrclines we would allocate a giant amount of memory, even if there was no data to actually read in. Sanity check that the directory and file counts seem reasonable compared to the amount of data left (assume we need at least 1 byte of data per form describing the dirs or files). Signed-off-by: Mark Wielaard <mark@klomp.org>
* libdw: Return an error in dwarf_getlocation_attr for missing .debug_addr.Mark Wielaard2018-06-102-4/+16
| | | | | | | | | | | | | | | | | | When constructing a "fake" Dwarf_Attribute for DW_OP_GNU_const_index, DW_OP_constx, DW_OP_GNU_addr_index or DW_OP_addrx, we would create a fake attribute pointing to the actual data in the .debug_addr section. We would even do that if there was no .debug_addr section assuming dwarf_formaddr or dwarf_formudata would generate an error. But when there is no .debug_addr there is also no fake_addr_cu, so the dwarf_form* functions cannot check the value is correct (and crash). Fix by returning an error early from dwarf_getlocation_attr indicating bad DWARF data. Found by the afl fuzzer running on the varlocs testcase. Signed-off-by: Mark Wielaard <mark@klomp.org>
* libdw: Make sure that address_size and offset_size are 4 or 8 bytes.Mark Wielaard2018-06-092-2/+17
| | | | | | | When interning a CU make sure that address_size and offset_size are either 4 or 8 bytes. We really don't (want to) handle any other size. Signed-off-by: Mark Wielaard <mark@klomp.org>
* libdw: Check DIE address fall inside the CU before reading abbrev code.Mark Wielaard2018-06-092-1/+5
| | | | | | | The afl fuzzer found a case where we tried reading an uleb for the DIE abbrev code without properly checking the DIE address is inside the CU. Signed-off-by: Mark Wielaard <mark@klomp.org>
* libdw: Report error in dwarf_getlocation_die for bogus opcode offset.Mark Wielaard2018-06-082-0/+13
| | | | | | | | | Found by afl fuzzer on varlocs test. varlocs sanity checks that the given offset in the opcode corresponds to the cuoffset of the returned DIE. In case the opcode offset was bogus this might fail because we might wrap around and return a random DIE instead of reporting an error. Signed-off-by: Mark Wielaard <mark@klomp.org>
* libdw: Explicitly check we could decode diridx in dwarf_getsrclines.Mark Wielaard2018-06-082-2/+8
| | | | | | | It is highly unlikely dwarf_formudata fails because we setup the attribute ourselves, but better to explicitly mark diridx as bad if it does. Signed-off-by: Mark Wielaard <mark@klomp.org>
* libdw: Don't leak arange if we cannot figure out which CU it belongs to.Mark Wielaard2018-06-082-1/+11
| | | | | | | | In the unlikely case that __libdw_findcu fails to find the associated CU we would leak one arange because it wasn't linked into the arangelist list yet. Make sure to free it immediately. Signed-off-by: Mark Wielaard <mark@klomp.org>
* libdw: Make sure dirarray is always properly freed in dwarf_getsrclines.Mark Wielaard2018-06-082-9/+18
| | | | | | | | | | If there were more than 256 directories in the table and there was illegal DWARF before we read them all, then we might not free the dirarray (or the wrong one). Fix by defining the dirarray early (before the first data sanity check) and making sure it is not (still) equal to dirstack before freeing. Signed-off-by: Mark Wielaard <mark@klomp.org>
* libdw: Make sure id_path can contain max number of build id bytes.Mark Wielaard2018-06-082-1/+6
| | | | | | | | | | | The MAX_BUILD_ID_BYTES is fairly large (64), while normally build-ids are only 20 bytes long. But if we would encounter a jumbo build-id we should have enough room to construct the full build-id path. We used to substract 2 bytes from the max, because 2 chars are used as subdir. But that should be 1 (2 hex chars is just one 8 bit byte). Signed-off-by: Mark Wielaard <mark@klomp.org>
* libdw: Try both the relative and absolute paths when finding a .dwo file.Mark Wielaard2018-06-012-46/+75
| | | | | | | | We would give up if one of them failed. With this fixed a self-test with make check succeeds when building elfutils itself with CFLAGS set to "-gdwarf-4 -gdwarf-split -O2". Signed-off-by: Mark Wielaard <mark@klomp.org>