diff options
-rw-r--r-- | libdwfl/ChangeLog | 10 | ||||
-rw-r--r-- | libdwfl/Makefile.am | 4 | ||||
-rw-r--r-- | libdwfl/dwfl_module_getdwarf.c | 50 | ||||
-rw-r--r-- | libdwfl/dwfl_module_getelf.c | 88 | ||||
-rw-r--r-- | libdwfl/libdwflP.h | 2 |
5 files changed, 107 insertions, 47 deletions
diff --git a/libdwfl/ChangeLog b/libdwfl/ChangeLog index d2c823fa..7f42b43e 100644 --- a/libdwfl/ChangeLog +++ b/libdwfl/ChangeLog @@ -1,3 +1,13 @@ +2009-04-19 Roland McGrath <roland@redhat.com> + + * dwfl_module_getdwarf.c (find_file): Renamed to ... + (__libdwfl_getelf): ... this. Make it global. + (find_symtab, find_dw): Update callers. + (dwfl_module_getelf): Functions moved ... + * dwfl_module_getelf.c: ... here, new file. + * Makefile.am (libdwfl_a_SOURCES): Add it. + * libdwflP.h: Declare __libdwfl_getelf. + 2009-04-14 Roland McGrath <roland@redhat.com> * dwfl_segment_report_module.c: Handle DT_STRTAB value being either diff --git a/libdwfl/Makefile.am b/libdwfl/Makefile.am index 605f9243..ebcb072a 100644 --- a/libdwfl/Makefile.am +++ b/libdwfl/Makefile.am @@ -51,8 +51,8 @@ libdwfl_a_SOURCES = dwfl_begin.c dwfl_end.c dwfl_error.c dwfl_version.c \ dwfl_module.c dwfl_report_elf.c relocate.c \ dwfl_module_build_id.c dwfl_module_report_build_id.c \ derelocate.c offline.c segment.c \ - dwfl_module_info.c dwfl_getmodules.c \ - dwfl_module_getdwarf.c dwfl_getdwarf.c \ + dwfl_module_info.c dwfl_getmodules.c dwfl_getdwarf.c \ + dwfl_module_getdwarf.c dwfl_module_getelf.c \ dwfl_validate_address.c \ argp-std.c find-debuginfo.c \ dwfl_build_id_find_elf.c \ diff --git a/libdwfl/dwfl_module_getdwarf.c b/libdwfl/dwfl_module_getdwarf.c index e99aa1f8..0441eb31 100644 --- a/libdwfl/dwfl_module_getdwarf.c +++ b/libdwfl/dwfl_module_getdwarf.c @@ -120,8 +120,8 @@ open_elf (Dwfl_Module *mod, struct dwfl_file *file) /* Find the main ELF file for this module and open libelf on it. When we return success, MOD->main.elf and MOD->main.bias are set up. */ -static void -find_file (Dwfl_Module *mod) +void +__libdwfl_getelf (Dwfl_Module *mod) { if (mod->main.elf != NULL /* Already done. */ || mod->elferr != DWFL_E_NOERROR) /* Cached failure. */ @@ -496,7 +496,7 @@ find_symtab (Dwfl_Module *mod) || mod->symerr != DWFL_E_NOERROR) /* Cached previous failure. */ return; - find_file (mod); + __libdwfl_getelf (mod); mod->symerr = mod->elferr; if (mod->symerr != DWFL_E_NOERROR) return; @@ -592,7 +592,7 @@ __libdwfl_module_getebl (Dwfl_Module *mod) { if (mod->ebl == NULL) { - find_file (mod); + __libdwfl_getelf (mod); if (mod->elferr != DWFL_E_NOERROR) return mod->elferr; @@ -660,7 +660,7 @@ find_dw (Dwfl_Module *mod) || mod->dwerr != DWFL_E_NOERROR) /* Cached previous failure. */ return; - find_file (mod); + __libdwfl_getelf (mod); mod->dwerr = mod->elferr; if (mod->dwerr != DWFL_E_NOERROR) return; @@ -701,46 +701,6 @@ find_dw (Dwfl_Module *mod) mod->dwerr = __libdwfl_canon_error (mod->dwerr); } - -Elf * -dwfl_module_getelf (Dwfl_Module *mod, GElf_Addr *loadbase) -{ - if (mod == NULL) - return NULL; - - find_file (mod); - if (mod->elferr == DWFL_E_NOERROR) - { - if (mod->e_type == ET_REL && ! mod->main.relocated) - { - /* Before letting them get at the Elf handle, - apply all the relocations we know how to. */ - - mod->main.relocated = true; - if (likely (__libdwfl_module_getebl (mod) == DWFL_E_NOERROR)) - { - (void) __libdwfl_relocate (mod, mod->main.elf, false); - - if (mod->debug.elf == mod->main.elf) - mod->debug.relocated = true; - else if (mod->debug.elf != NULL && ! mod->debug.relocated) - { - mod->debug.relocated = true; - (void) __libdwfl_relocate (mod, mod->debug.elf, false); - } - } - } - - *loadbase = mod->main.bias; - return mod->main.elf; - } - - __libdwfl_seterrno (mod->elferr); - return NULL; -} -INTDEF (dwfl_module_getelf) - - Dwarf * dwfl_module_getdwarf (Dwfl_Module *mod, Dwarf_Addr *bias) { diff --git a/libdwfl/dwfl_module_getelf.c b/libdwfl/dwfl_module_getelf.c new file mode 100644 index 00000000..6414a9d3 --- /dev/null +++ b/libdwfl/dwfl_module_getelf.c @@ -0,0 +1,88 @@ +/* Find debugging and symbol information for a module in libdwfl. + Copyright (C) 2009 Red Hat, Inc. + This file is part of Red Hat elfutils. + + Red Hat elfutils is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by the + Free Software Foundation; version 2 of the License. + + Red Hat elfutils is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License along + with Red Hat elfutils; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA. + + In addition, as a special exception, Red Hat, Inc. gives You the + additional right to link the code of Red Hat elfutils with code licensed + under any Open Source Initiative certified open source license + (http://www.opensource.org/licenses/index.php) which requires the + distribution of source code with any binary distribution and to + distribute linked combinations of the two. Non-GPL Code permitted under + this exception must only link to the code of Red Hat elfutils through + those well defined interfaces identified in the file named EXCEPTION + found in the source code files (the "Approved Interfaces"). The files + of Non-GPL Code may instantiate templates or use macros or inline + functions from the Approved Interfaces without causing the resulting + work to be covered by the GNU General Public License. Only Red Hat, + Inc. may make changes or additions to the list of Approved Interfaces. + Red Hat's grant of this exception is conditioned upon your not adding + any new exceptions. If you wish to add a new Approved Interface or + exception, please contact Red Hat. You must obey the GNU General Public + License in all respects for all of the Red Hat elfutils code and other + code used in conjunction with Red Hat elfutils except the Non-GPL Code + covered by this exception. If you modify this file, you may extend this + exception to your version of the file, but you are not obligated to do + so. If you do not wish to provide this exception without modification, + you must delete this exception statement from your version and license + this file solely under the GPL without exception. + + Red Hat elfutils is an included package of the Open Invention Network. + An included package of the Open Invention Network is a package for which + Open Invention Network licensees cross-license their patents. No patent + license is granted, either expressly or impliedly, by designation as an + included package. Should you wish to participate in the Open Invention + Network licensing program, please visit www.openinventionnetwork.com + <http://www.openinventionnetwork.com>. */ + +#include "libdwflP.h" + +Elf * +dwfl_module_getelf (Dwfl_Module *mod, GElf_Addr *loadbase) +{ + if (mod == NULL) + return NULL; + + __libdwfl_getelf (mod); + if (mod->elferr == DWFL_E_NOERROR) + { + if (mod->e_type == ET_REL && ! mod->main.relocated) + { + /* Before letting them get at the Elf handle, + apply all the relocations we know how to. */ + + mod->main.relocated = true; + if (likely (__libdwfl_module_getebl (mod) == DWFL_E_NOERROR)) + { + (void) __libdwfl_relocate (mod, mod->main.elf, false); + + if (mod->debug.elf == mod->main.elf) + mod->debug.relocated = true; + else if (mod->debug.elf != NULL && ! mod->debug.relocated) + { + mod->debug.relocated = true; + (void) __libdwfl_relocate (mod, mod->debug.elf, false); + } + } + } + + *loadbase = mod->main.bias; + return mod->main.elf; + } + + __libdwfl_seterrno (mod->elferr); + return NULL; +} +INTDEF (dwfl_module_getelf) diff --git a/libdwfl/libdwflP.h b/libdwfl/libdwflP.h index 45eac21c..be2ad828 100644 --- a/libdwfl/libdwflP.h +++ b/libdwfl/libdwflP.h @@ -241,6 +241,8 @@ struct dwfl_arange extern void __libdwfl_module_free (Dwfl_Module *mod) internal_function; +/* Find the main ELF file, update MOD->elferr and/or MOD->main.elf. */ +extern void __libdwfl_getelf (Dwfl_Module *mod) internal_function; /* Process relocations in debugging sections in an ET_REL file. FILE must be opened with ELF_C_READ_MMAP_PRIVATE or ELF_C_READ, |