# include <config.h>
#endif
+#include "libelfP.h"
#include "libdwflP.h"
#include <fcntl.h>
{
Dwfl_Module *mod = NULL;
/* elf_begin supports opening archives even with fd == -1 passed. */
- Elf *member = elf_begin (fd, ELF_C_READ_MMAP_PRIVATE, archive);
+ Elf *member = elf_begin (fd, archive->cmd, archive);
if (unlikely (member == NULL)) /* Empty archive. */
{
__libdwfl_seterrno (DWFL_E_BADELF);
while (process_archive_member (dwfl, name, file_name, predicate,
fd, member, &mod) != ELF_C_NULL)
- member = elf_begin (fd, ELF_C_READ_MMAP_PRIVATE, archive);
+ member = elf_begin (fd, archive->cmd, archive);
/* We can drop the archive Elf handle even if we're still using members
in live modules. When the last module's elf_end on a member returns
elf->state.ar.elf_ar_hdr.ar_name = "libdwfl is faking you out";
elf->state.ar.elf_ar_hdr.ar_size = elf->maximum_size - offset;
elf->state.ar.offset = offset - sizeof (struct ar_hdr);
- Elf *subelf = elf_begin (-1, ELF_C_READ_MMAP_PRIVATE, elf);
+ Elf *subelf = elf_begin (-1, elf->cmd, elf);
elf->kind = ELF_K_NONE;
if (unlikely (subelf == NULL))
error = DWFL_E_LIBELF;
{
return DWFL_E_LIBELF;
}
- /* Allow using this ELF as reference for subsequent elf_begin calls. */
- (*elfp)->cmd = ELF_C_READ_MMAP_PRIVATE;
return libdw_open_elf (&fd, elfp, false, archive_ok, true, false, true);
}
dwflsyms_LDADD = $(libdw) $(libelf) $(argp_LDADD)
dwfllines_LDADD = $(libeu) $(libdw) $(libelf) $(argp_LDADD)
dwfl_report_elf_align_LDADD = $(libeu) $(libdw)
-dwfl_report_offline_memory_LDADD = $(libeu) $(libdw)
+dwfl_report_offline_memory_LDADD = $(libeu) $(libdw) $(libelf)
dwfl_report_segment_contiguous_LDADD = $(libdw) $(libebl) $(libelf)
varlocs_LDADD = $(libeu) $(libdw) $(libelf) $(argp_LDADD)
backtrace_LDADD = $(libeu) $(libdw) $(libelf) $(argp_LDADD)
#include <config.h>
#include <assert.h>
+#include <errno.h>
+#include <error.h>
#include <fcntl.h>
#include <locale.h>
#include <stdio.h>
#include <stdio_ext.h>
#include <stdlib.h>
+#include <string.h>
#include <unistd.h>
+
#include ELFUTILS_HEADER(dwfl)
-#include "system.h"
+#include ELFUTILS_HEADER(elf)
+#include <gelf.h>
static const Dwfl_Callbacks offline_callbacks =
return DWARF_CB_OK;
}
+static int
+count_sections (Elf *elf)
+{
+ int result = 0;
+ Elf_Scn *section = NULL;
+ GElf_Shdr header;
+ while ((section = elf_nextscn (elf, section)) != NULL)
+ {
+ assert (gelf_getshdr (section, &header) != NULL);
+ result += 1;
+ }
+ return result;
+}
+
int
main (int argc, char **argv)
{
/* Set locale. */
(void) setlocale (LC_ALL, "");
- if (argc != 3)
+ if (argc != 4)
error (-1, 0,
"usage: dwfl_report_offline_memory [filename] "
- "[expected number of modules]");
+ "[expected number of modules] "
+ "[expected number of sections]");
const char *fname = argv[1];
int fd = open (fname, O_RDONLY);
assert (endptr && !*endptr);
assert (number_of_modules == expected_number_of_modules);
+ GElf_Addr loadbase = 0;
+ Elf *elf = dwfl_module_getelf (mod, &loadbase);
+ int number_of_sections = count_sections (elf);
+ int expected_number_of_sections = atoi (argv[3]);
+ assert (number_of_sections == expected_number_of_sections);
+
dwfl_end (dwfl);
free (data);
# bzip2 -zf test-ar-duplicates.a
testfiles test-ar-duplicates.a
-testrun ${abs_builddir}/dwfl-report-offline-memory ./testfile-dwfl-report-elf-align-shlib.so 1
-testrun ${abs_builddir}/dwfl-report-offline-memory ./testarchive64.a 3
-testrun ${abs_builddir}/dwfl-report-offline-memory ./test-ar-duplicates.a 1
+testrun ${abs_builddir}/dwfl-report-offline-memory ./testfile-dwfl-report-elf-align-shlib.so 1 24
+testrun ${abs_builddir}/dwfl-report-offline-memory ./testarchive64.a 3 10
+testrun ${abs_builddir}/dwfl-report-offline-memory ./test-ar-duplicates.a 1 7
exit 0