summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--NEWS4
-rw-r--r--libdw/ChangeLog4
-rw-r--r--libdw/libdw.map6
-rw-r--r--libdwfl/ChangeLog16
-rw-r--r--libdwfl/dwfl_report_elf.c41
-rw-r--r--libdwfl/libdwfl.h17
-rw-r--r--libdwfl/libdwflP.h3
-rw-r--r--libdwfl/link_map.c2
-rw-r--r--libdwfl/linux-kernel-modules.c2
-rw-r--r--libdwfl/offline.c3
-rw-r--r--tests/ChangeLog4
-rw-r--r--tests/dwfl-report-elf-align.c2
13 files changed, 91 insertions, 17 deletions
diff --git a/ChangeLog b/ChangeLog
index 1fdcb588..bffe62d3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2013-04-28 Jan Kratochvil <jan.kratochvil@redhat.com>
+
+ * NEWS (Version 0.156): New.
+
2013-04-26 Mark Wielaard <mjw@redhat.com>
* configure.ac (AM_INIT_AUTOMAKE): Request parallel-tests.
diff --git a/NEWS b/NEWS
index e38e60c1..a71a87c8 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,7 @@
+Version 0.156
+
+libdwfl: dwfl_report_elf has new parameter add_p_vaddr.
+
Version 0.155
libelf: elf*_xlatetomd now works for cross-endian ELF note data.
diff --git a/libdw/ChangeLog b/libdw/ChangeLog
index b4d9dc31..ef9b3acd 100644
--- a/libdw/ChangeLog
+++ b/libdw/ChangeLog
@@ -1,3 +1,7 @@
+2013-04-28 Jan Kratochvil <jan.kratochvil@redhat.com>
+
+ * libdw.map (ELFUTILS_0.156): New.
+
2013-04-24 Mark Wielaard <mjw@redhat.com>
* Makefile.am: Use AM_CPPFLAGS instead of INCLUDES.
diff --git a/libdw/libdw.map b/libdw/libdw.map
index 1f71d03b..d38a8ef6 100644
--- a/libdw/libdw.map
+++ b/libdw/libdw.map
@@ -254,3 +254,9 @@ ELFUTILS_0.149 {
dwfl_dwarf_line;
} ELFUTILS_0.148;
+
+ELFUTILS_0.156 {
+ global:
+ # Replaced ELFUTILS_0.122 version, which has a wrapper without add_p_vaddr.
+ dwfl_report_elf;
+} ELFUTILS_0.149;
diff --git a/libdwfl/ChangeLog b/libdwfl/ChangeLog
index 42f720c9..74ede01d 100644
--- a/libdwfl/ChangeLog
+++ b/libdwfl/ChangeLog
@@ -1,3 +1,19 @@
+2013-04-30 Jan Kratochvil <jan.kratochvil@redhat.com>
+
+ * dwfl_report_elf.c (__libdwfl_report_elf): Add parameter add_p_vaddr.
+ Set it to true for ET_EXEC and ET_CORE. Provide alternative
+ setup of START and BIAS if !ADD_P_VADDR. Set END from BIAS, not BASE.
+ (dwfl_report_elf): Add parameter add_p_vaddr. Pass it down. Add
+ NEW_VERSION.
+ (_compat_without_add_p_vaddr_dwfl_report_elf) <SHARED>: New, with
+ COMPAT_VERSION.
+ * libdwfl.h (dwfl_report_elf): Add parameter add_p_vaddr. Describe it.
+ * libdwflP.h (__libdwfl_report_elf): Add parameter add_p_vaddr.
+ * link_map.c (report_r_debug): Use true add_p_vaddr for dwfl_report_elf.
+ * linux-kernel-modules.c (report_kernel): Use false add_p_vaddr for
+ dwfl_report_elf.
+ * offline.c (process_elf): Use true add_p_vaddr for dwfl_report_elf.
+
2013-04-27 Mark Wielaard <mjw@redhat.com>
* link_map.c: #include system.h.
diff --git a/libdwfl/dwfl_report_elf.c b/libdwfl/dwfl_report_elf.c
index d7061704..20d04da1 100644
--- a/libdwfl/dwfl_report_elf.c
+++ b/libdwfl/dwfl_report_elf.c
@@ -41,7 +41,8 @@
Dwfl_Module *
internal_function
__libdwfl_report_elf (Dwfl *dwfl, const char *name, const char *file_name,
- int fd, Elf *elf, GElf_Addr base, bool sanity)
+ int fd, Elf *elf, GElf_Addr base, bool add_p_vaddr,
+ bool sanity)
{
GElf_Ehdr ehdr_mem, *ehdr = gelf_getehdr (elf, &ehdr_mem);
if (ehdr == NULL)
@@ -166,6 +167,7 @@ __libdwfl_report_elf (Dwfl *dwfl, const char *name, const char *file_name,
case ET_CORE:
/* An assigned base address is meaningless for these. */
base = 0;
+ add_p_vaddr = true;
case ET_DYN:
default:;
@@ -181,11 +183,19 @@ __libdwfl_report_elf (Dwfl *dwfl, const char *name, const char *file_name,
{
vaddr = ph->p_vaddr & -ph->p_align;
address_sync = ph->p_vaddr + ph->p_memsz;
- start = base + vaddr;
break;
}
}
- bias = base;
+ if (add_p_vaddr)
+ {
+ start = base + vaddr;
+ bias = base;
+ }
+ else
+ {
+ start = base;
+ bias = base - vaddr;
+ }
for (size_t i = phnum; i-- > 0;)
{
@@ -195,7 +205,7 @@ __libdwfl_report_elf (Dwfl *dwfl, const char *name, const char *file_name,
if (ph->p_type == PT_LOAD
&& ph->p_vaddr + ph->p_memsz > 0)
{
- end = base + (ph->p_vaddr + ph->p_memsz);
+ end = bias + (ph->p_vaddr + ph->p_memsz);
break;
}
}
@@ -246,8 +256,8 @@ __libdwfl_report_elf (Dwfl *dwfl, const char *name, const char *file_name,
}
Dwfl_Module *
-dwfl_report_elf (Dwfl *dwfl, const char *name,
- const char *file_name, int fd, GElf_Addr base)
+dwfl_report_elf (Dwfl *dwfl, const char *name, const char *file_name, int fd,
+ GElf_Addr base, bool add_p_vaddr)
{
bool closefd = false;
if (fd < 0)
@@ -270,7 +280,7 @@ dwfl_report_elf (Dwfl *dwfl, const char *name,
}
Dwfl_Module *mod = __libdwfl_report_elf (dwfl, name, file_name,
- fd, elf, base, true);
+ fd, elf, base, add_p_vaddr, true);
if (mod == NULL)
{
elf_end (elf);
@@ -281,3 +291,20 @@ dwfl_report_elf (Dwfl *dwfl, const char *name,
return mod;
}
INTDEF (dwfl_report_elf)
+NEW_VERSION (dwfl_report_elf, ELFUTILS_0.156)
+
+#ifdef SHARED
+Dwfl_Module *
+ _compat_without_add_p_vaddr_dwfl_report_elf (Dwfl *dwfl, const char *name,
+ const char *file_name, int fd,
+ GElf_Addr base);
+COMPAT_VERSION_NEWPROTO (dwfl_report_elf, ELFUTILS_0.122, without_add_p_vaddr)
+
+Dwfl_Module *
+_compat_without_add_p_vaddr_dwfl_report_elf (Dwfl *dwfl, const char *name,
+ const char *file_name, int fd,
+ GElf_Addr base)
+{
+ return dwfl_report_elf (dwfl, name, file_name, fd, base, true);
+}
+#endif
diff --git a/libdwfl/libdwfl.h b/libdwfl/libdwfl.h
index 000d582f..2b70e284 100644
--- a/libdwfl/libdwfl.h
+++ b/libdwfl/libdwfl.h
@@ -137,14 +137,21 @@ extern int dwfl_report_segment (Dwfl *dwfl, int ndx,
extern Dwfl_Module *dwfl_report_module (Dwfl *dwfl, const char *name,
Dwarf_Addr start, Dwarf_Addr end);
-/* Report a module with start and end addresses computed from the ELF
- program headers in the given file, plus BASE. For an ET_REL file,
- does a simple absolute section layout starting at BASE.
+/* Report a module to address BASE with start and end addresses computed
+ from the ELF program headers in the given file - see the table below.
FD may be -1 to open FILE_NAME. On success, FD is consumed by the
- library, and the `find_elf' callback will not be used for this module. */
+ library, and the `find_elf' callback will not be used for this module.
+ ADD_P_VADDR BASE
+ ET_EXEC ignored ignored
+ ET_DYN false absolute address where to place the file
+ true start address relative to ELF's phdr p_vaddr
+ ET_REL ignored absolute address where to place the file
+ ET_CORE ignored ignored
+ ET_DYN ELF phdr p_vaddr address can be non-zero if the shared library
+ has been prelinked by tool prelink(8). */
extern Dwfl_Module *dwfl_report_elf (Dwfl *dwfl, const char *name,
const char *file_name, int fd,
- GElf_Addr base);
+ GElf_Addr base, bool add_p_vaddr);
/* Similar, but report the module for offline use. All ET_EXEC files
being reported must be reported before any relocatable objects.
diff --git a/libdwfl/libdwflP.h b/libdwfl/libdwflP.h
index 5aaa7785..37a9dff4 100644
--- a/libdwfl/libdwflP.h
+++ b/libdwfl/libdwflP.h
@@ -382,7 +382,8 @@ extern int __libdwfl_crc32_file (int fd, uint32_t *resp) attribute_hidden;
Consumes ELF on success, not on failure. */
extern Dwfl_Module *__libdwfl_report_elf (Dwfl *dwfl, const char *name,
const char *file_name, int fd,
- Elf *elf, GElf_Addr base, bool sanity)
+ Elf *elf, GElf_Addr base,
+ bool add_p_vaddr, bool sanity)
internal_function;
/* Meat of dwfl_report_offline. */
diff --git a/libdwfl/link_map.c b/libdwfl/link_map.c
index c6ec29c9..9f1b867e 100644
--- a/libdwfl/link_map.c
+++ b/libdwfl/link_map.c
@@ -384,7 +384,7 @@ report_r_debug (uint_fast8_t elfclass, uint_fast8_t elfdata,
// XXX hook for sysroot
mod = INTUSE(dwfl_report_elf) (dwfl, basename (name),
- name, -1, l_addr);
+ name, -1, l_addr, true);
}
if (mod != NULL)
diff --git a/libdwfl/linux-kernel-modules.c b/libdwfl/linux-kernel-modules.c
index 9bf5f255..dec1a598 100644
--- a/libdwfl/linux-kernel-modules.c
+++ b/libdwfl/linux-kernel-modules.c
@@ -217,7 +217,7 @@ report_kernel (Dwfl *dwfl, const char **release,
if (report)
{
Dwfl_Module *mod = INTUSE(dwfl_report_elf) (dwfl, KERNEL_MODNAME,
- fname, fd, 0);
+ fname, fd, 0, false);
if (mod == NULL)
result = -1;
else
diff --git a/libdwfl/offline.c b/libdwfl/offline.c
index 26a6bd66..28d2782e 100644
--- a/libdwfl/offline.c
+++ b/libdwfl/offline.c
@@ -127,7 +127,8 @@ process_elf (Dwfl *dwfl, const char *name, const char *file_name, int fd,
Elf *elf)
{
Dwfl_Module *mod = __libdwfl_report_elf (dwfl, name, file_name, fd, elf,
- dwfl->offline_next_address, false);
+ dwfl->offline_next_address, true,
+ false);
if (mod != NULL)
{
/* If this is an ET_EXEC file with fixed addresses, the address range
diff --git a/tests/ChangeLog b/tests/ChangeLog
index f6c004c7..4003851f 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,7 @@
+2013-04-30 Jan Kratochvil <jan.kratochvil@redhat.com>
+
+ * dwfl-report-elf-align.c: Use false add_p_vaddr for dwfl_report_elf.
+
2013-04-29 Mark Wielaard <mjw@redhat.com>
* test-subr.sh: Don't use pushd, just cd into test-dir.
diff --git a/tests/dwfl-report-elf-align.c b/tests/dwfl-report-elf-align.c
index 0e8bfe3e..a4e97d3c 100644
--- a/tests/dwfl-report-elf-align.c
+++ b/tests/dwfl-report-elf-align.c
@@ -53,7 +53,7 @@ main (int argc, char **argv)
uintptr_t base = strtoull (argv[2], &endptr, 0);
assert (endptr && !*endptr);
- Dwfl_Module *mod = dwfl_report_elf (dwfl, argv[1], argv[1], -1, base);
+ Dwfl_Module *mod = dwfl_report_elf (dwfl, argv[1], argv[1], -1, base, false);
assert (mod != NULL);
uintptr_t funcaddr = strtoull (argv[3], &endptr, 0);