summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Kratochvil <jan.kratochvil@redhat.com>2013-10-30 10:48:20 +0100
committerJan Kratochvil <jan.kratochvil@redhat.com>2013-10-30 10:48:20 +0100
commit3cf491ee10f10855a49e6a35cc9b8365a3197553 (patch)
treed5b8aa9232861fab2e5075988e87b3a668054d30
parente6a9bb8c63adaeaceafc50301b085121c962b631 (diff)
downloadelfutils-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--ChangeLog4
-rw-r--r--NEWS4
-rw-r--r--libdw/ChangeLog4
-rw-r--r--libdw/libdw.map6
-rw-r--r--libdwfl/ChangeLog10
-rw-r--r--libdwfl/argp-std.c5
-rw-r--r--libdwfl/core-file.c28
-rw-r--r--libdwfl/libdwfl.h10
8 files changed, 62 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index 0b626eea..433450d3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
diff --git a/NEWS b/NEWS
index 7236f661..9d73f096 100644
--- a/NEWS
+++ b/NEWS
@@ -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, &notes_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,