diff options
author | Jan Kratochvil <jan.kratochvil@redhat.com> | 2013-10-30 10:48:20 +0100 |
---|---|---|
committer | Jan Kratochvil <jan.kratochvil@redhat.com> | 2013-10-30 10:48:20 +0100 |
commit | 3cf491ee10f10855a49e6a35cc9b8365a3197553 (patch) | |
tree | d5b8aa9232861fab2e5075988e87b3a668054d30 | |
parent | e6a9bb8c63adaeaceafc50301b085121c962b631 (diff) | |
download | elfutils-3cf491ee10f10855a49e6a35cc9b8365a3197553.tar.gz |
Fix executable_for_core for non-dwfl_standard_argp
./
2013-10-30 Jan Kratochvil <jan.kratochvil@redhat.com>
* NEWS (Version 0.158): New.
libdw/
2013-10-30 Jan Kratochvil <jan.kratochvil@redhat.com>
* libdw.map (ELFUTILS_0.158): New.
libdwfl/
2013-10-30 Jan Kratochvil <jan.kratochvil@redhat.com>
* argp-std.c (parse_opt): Use executable parameter of
dwfl_core_file_report.
* core-file.c (dwfl_core_file_report): Add parameter executable. Set
it to DWFL. Add NEW_VERSION for it.
(_compat_without_executable_dwfl_core_file_report): New. Twice.
* libdwfl.h (dwfl_core_file_report): Add parameter executable, update
the function comment.
Signed-off-by: Jan Kratochvil <jan.kratochvil@redhat.com>
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | NEWS | 4 | ||||
-rw-r--r-- | libdw/ChangeLog | 4 | ||||
-rw-r--r-- | libdw/libdw.map | 6 | ||||
-rw-r--r-- | libdwfl/ChangeLog | 10 | ||||
-rw-r--r-- | libdwfl/argp-std.c | 5 | ||||
-rw-r--r-- | libdwfl/core-file.c | 28 | ||||
-rw-r--r-- | libdwfl/libdwfl.h | 10 |
8 files changed, 62 insertions, 9 deletions
@@ -1,3 +1,7 @@ +2013-10-30 Jan Kratochvil <jan.kratochvil@redhat.com> + + * NEWS (Version 0.158): New. + 2013-09-30 Mark Wielaard <mjw@redhat.com> * NEWS: Update for readelf NT_SIGINFO and NT_FILE core notes. @@ -1,3 +1,7 @@ +Version 0.158 + +libdwfl: dwfl_core_file_report has new parameter executable. + Version 0.157 libdw: Add new functions dwarf_getlocations, dwarf_getlocation_attr diff --git a/libdw/ChangeLog b/libdw/ChangeLog index 1bf1de90..3fa6c0ef 100644 --- a/libdw/ChangeLog +++ b/libdw/ChangeLog @@ -1,3 +1,7 @@ +2013-10-30 Jan Kratochvil <jan.kratochvil@redhat.com> + + * libdw.map (ELFUTILS_0.158): New. + 2013-10-10 Mark Wielaard <mjw@redhat.com> * dwarf_getfuncs.c (struct visitor_info): Rename start_offset to diff --git a/libdw/libdw.map b/libdw/libdw.map index 09eae6a7..5fb6660e 100644 --- a/libdw/libdw.map +++ b/libdw/libdw.map @@ -267,3 +267,9 @@ ELFUTILS_0.157 { dwarf_getlocation_die; dwarf_getlocation_attr; } ELFUTILS_0.156; + +ELFUTILS_0.158 { + global: + # Replaced ELFUTILS_0.146 version, which has a wrapper without executable. + dwfl_core_file_report; +} ELFUTILS_0.157; diff --git a/libdwfl/ChangeLog b/libdwfl/ChangeLog index b6729c77..9581909e 100644 --- a/libdwfl/ChangeLog +++ b/libdwfl/ChangeLog @@ -1,3 +1,13 @@ +2013-10-30 Jan Kratochvil <jan.kratochvil@redhat.com> + + * argp-std.c (parse_opt): Use executable parameter of + dwfl_core_file_report. + * core-file.c (dwfl_core_file_report): Add parameter executable. Set + it to DWFL. Add NEW_VERSION for it. + (_compat_without_executable_dwfl_core_file_report): New. Twice. + * libdwfl.h (dwfl_core_file_report): Add parameter executable, update + the function comment. + 2013-10-15 Mark Wielaard <mjw@redhat.com> * linux-proc-maps.c (proc_maps_report): Ignore non-absolute file diff --git a/libdwfl/argp-std.c b/libdwfl/argp-std.c index c8843909..322cdf49 100644 --- a/libdwfl/argp-std.c +++ b/libdwfl/argp-std.c @@ -295,9 +295,6 @@ parse_opt (int key, char *arg, struct argp_state *state) if (opt->core) { - if (opt->e) - dwfl->executable_for_core = strdup (opt->e); - int fd = open64 (opt->core, O_RDONLY); if (fd < 0) { @@ -317,7 +314,7 @@ parse_opt (int key, char *arg, struct argp_state *state) return error == DWFL_E_ERRNO ? errno : EIO; } - int result = INTUSE(dwfl_core_file_report) (dwfl, core); + int result = INTUSE(dwfl_core_file_report) (dwfl, core, opt->e); if (result < 0) { elf_end (core); diff --git a/libdwfl/core-file.c b/libdwfl/core-file.c index 72075913..37613b83 100644 --- a/libdwfl/core-file.c +++ b/libdwfl/core-file.c @@ -398,7 +398,7 @@ clear_r_debug_info (struct r_debug_info *r_debug_info) } int -dwfl_core_file_report (Dwfl *dwfl, Elf *elf) +dwfl_core_file_report (Dwfl *dwfl, Elf *elf, const char *executable) { size_t phnum; if (unlikely (elf_getphdrnum (elf, &phnum) != 0)) @@ -407,6 +407,19 @@ dwfl_core_file_report (Dwfl *dwfl, Elf *elf) return -1; } + free (dwfl->executable_for_core); + if (executable == NULL) + dwfl->executable_for_core = NULL; + else + { + dwfl->executable_for_core = strdup (executable); + if (dwfl->executable_for_core == NULL) + { + __libdwfl_seterrno (DWFL_E_NOMEM); + return -1; + } + } + /* First report each PT_LOAD segment. */ GElf_Phdr notes_phdr; int ndx = dwfl_report_core_segments (dwfl, elf, phnum, ¬es_phdr); @@ -524,3 +537,16 @@ dwfl_core_file_report (Dwfl *dwfl, Elf *elf) return sniffed || listed >= 0 ? listed + sniffed : listed; } INTDEF (dwfl_core_file_report) +NEW_VERSION (dwfl_core_file_report, ELFUTILS_0.158) + +#ifdef SHARED +int _compat_without_executable_dwfl_core_file_report (Dwfl *dwfl, Elf *elf); +COMPAT_VERSION_NEWPROTO (dwfl_core_file_report, ELFUTILS_0.146, + without_executable) + +int +_compat_without_executable_dwfl_core_file_report (Dwfl *dwfl, Elf *elf) +{ + return dwfl_core_file_report (dwfl, elf, NULL); +} +#endif diff --git a/libdwfl/libdwfl.h b/libdwfl/libdwfl.h index 2b70e284..2ba82343 100644 --- a/libdwfl/libdwfl.h +++ b/libdwfl/libdwfl.h @@ -349,11 +349,13 @@ extern int dwfl_linux_kernel_report_offline (Dwfl *dwfl, const char *release, This can follow a dwfl_report_offline call to bootstrap the DT_DEBUG method of following the dynamic linker link_map chain, in case the core file does not contain enough of the executable's text - segment to locate its PT_DYNAMIC in the dump. This might call - dwfl_report_elf on file names found in the dump if reading some - link_map files is the only way to ascertain those modules' addresses. + segment to locate its PT_DYNAMIC in the dump. In such case you need to + supply non-NULL EXECUTABLE, otherwise dynamic libraries will not be loaded + into the DWFL map. This might call dwfl_report_elf on file names found in + the dump if reading some link_map files is the only way to ascertain those + modules' addresses. Returns the number of modules reported, or -1 for errors. */ -extern int dwfl_core_file_report (Dwfl *dwfl, Elf *elf); +extern int dwfl_core_file_report (Dwfl *dwfl, Elf *elf, const char *executable); /* Call dwfl_report_module for each file mapped into the address space of PID. Returns zero on success, -1 if dwfl_report_module failed, |