]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
Break out __libdwfl_getelf internal function.
authorRoland McGrath <roland@redhat.com>
Mon, 20 Apr 2009 01:27:01 +0000 (18:27 -0700)
committerRoland McGrath <roland@redhat.com>
Mon, 20 Apr 2009 01:27:01 +0000 (18:27 -0700)
libdwfl/ChangeLog
libdwfl/Makefile.am
libdwfl/dwfl_module_getdwarf.c
libdwfl/dwfl_module_getelf.c [new file with mode: 0644]
libdwfl/libdwflP.h

index d2c823fa313ec9005ec86ffd2c4d7c829b9f35af..7f42b43eca188c2fdcdc9e9505e6886ead48d93d 100644 (file)
@@ -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
index 605f9243c02bd1f6b3748437df9b6228849a719d..ebcb072af3008e6660b8dc47d8ca97c253b0af96 100644 (file)
@@ -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 \
index e99aa1f8f02b46ed653597395d1e6fe6ae99444f..0441eb31d067870f655dfe714e9586e96ef849c7 100644 (file)
@@ -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 (file)
index 0000000..6414a9d
--- /dev/null
@@ -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)
index 45eac21cfc00bfea2b9b982f1fbfc88adfc0b69d..be2ad828a2c1cda271da2c46448c278b5af859d4 100644 (file)
@@ -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,