[From nobody Tue Sep 9 21:51:59 2014 From: Jan Kratochvil <jan.kratochvil@redhat.com> Date: Tue, 9 Sep 2014 22:58:26 +0200 Subject: [PATCH 1/2] Add is_executable to Dwfl_Module. Next patch will find module names from NT_FILE note so that main executable will no longer necessarily have the name "[exe]" or "[pie]". -e|--executable still should be able to override such module. libdwfl/ 2014-09-09 Jan Kratochvil <jan.kratochvil@redhat.com> * dwfl_build_id_find_elf.c (dwfl_build_id_find_elf): Use IS_EXECUTABLE. * dwfl_segment_report_module.c (dwfl_segment_report_module): Set IS_EXECUTABLE. * libdwflP.h (struct Dwfl_Module): New field is_executable. Signed-off-by: Jan Kratochvil <jan.kratochvil@redhat.com> --- libdwfl/ChangeLog | 7 +++++++ libdwfl/dwfl_build_id_find_elf.c | 7 +++---- libdwfl/dwfl_segment_report_module.c | 6 ++++++ libdwfl/libdwflP.h | 1 + 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/libdwfl/ChangeLog b/libdwfl/ChangeLog index 3de772e..37bedaf 100644 --- a/libdwfl/ChangeLog +++ b/libdwfl/ChangeLog @@ -1,3 +1,10 @@ +2014-09-09 Jan Kratochvil <jan.kratochvil@redhat.com> + + * dwfl_build_id_find_elf.c (dwfl_build_id_find_elf): Use IS_EXECUTABLE. + * dwfl_segment_report_module.c (dwfl_segment_report_module): Set + IS_EXECUTABLE. + * libdwflP.h (struct Dwfl_Module): New field is_executable. + 2014-08-28 Jan Kratochvil <jan.kratochvil@redhat.com> * dwfl_module_getdwarf.c (find_offsets): Add parameter main_bias, use diff --git a/libdwfl/dwfl_build_id_find_elf.c b/libdwfl/dwfl_build_id_find_elf.c index 1555008..062aad1 100644 --- a/libdwfl/dwfl_build_id_find_elf.c +++ b/libdwfl/dwfl_build_id_find_elf.c @@ -124,13 +124,12 @@ dwfl_build_id_find_elf (Dwfl_Module *mod, char **file_name, Elf **elfp) { *elfp = NULL; - if (modname != NULL && mod->dwfl->executable_for_core != NULL - && (strcmp (modname, "[exe]") == 0 || strcmp (modname, "[pie]") == 0)) + if (mod->is_executable && mod->dwfl->executable_for_core != NULL) { /* When dwfl_core_file_report was called with a non-NULL executable file name this callback will replace the Dwfl_Module main.name with the - recorded executable file when the modname is [exe] or [pie] (which - then triggers opening and reporting of the executable). */ + recorded executable file when MOD was identified as main executable + (which then triggers opening and reporting of the executable). */ int fd = open64 (mod->dwfl->executable_for_core, O_RDONLY); if (fd >= 0) { diff --git a/libdwfl/dwfl_segment_report_module.c b/libdwfl/dwfl_segment_report_module.c index dfecb51..3393b08 100644 --- a/libdwfl/dwfl_segment_report_module.c +++ b/libdwfl/dwfl_segment_report_module.c @@ -646,6 +646,12 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, Dwfl_Module *mod = INTUSE(dwfl_report_module) (dwfl, name, module_start, module_end); + + // !execlike && ET_EXEC is PIE. + // execlike && !ET_EXEC is a static executable. + if (mod != NULL && (execlike || ehdr.e32.e_type == ET_EXEC)) + mod->is_executable = true; + if (likely (mod != NULL) && build_id != NULL && unlikely (INTUSE(dwfl_module_report_build_id) (mod, build_id, diff --git a/libdwfl/libdwflP.h b/libdwfl/libdwflP.h index 30c0f8a..2b1cfdc 100644 --- a/libdwfl/libdwflP.h +++ b/libdwfl/libdwflP.h @@ -211,6 +211,7 @@ struct Dwfl_Module int segment; /* Index of first segment table entry. */ bool gc; /* Mark/sweep flag. */ + bool is_executable : 1; /* Use Dwfl::executable_for_core? */ }; /* This holds information common for all the threads/tasks/TIDs of one process -- 1.9.3 ]