From: Petr Machata Date: Thu, 23 Apr 2009 15:40:03 +0000 (+0200) Subject: Introduce reader hooks X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=11c3d97a5b40ea15edf324092b03da3050610d01;p=thirdparty%2Felfutils.git Introduce reader hooks --- diff --git a/libdw/ChangeLog b/libdw/ChangeLog index 93a596733..953d2c277 100644 --- a/libdw/ChangeLog +++ b/libdw/ChangeLog @@ -1,3 +1,11 @@ +2009-04-23 Petr Machata + + * libdwP.h (__libdw_read_addr_inc, __libdw_read_off_inc, + __libdw_read_addr, __libdw_read_off): Declare four new internal + functions. + * dwarf_readhooks.c: New file, implements the above. + * Makefile.am (libdw_a_SOURCES): Add the new file + 2009-04-15 Roland McGrath * dwarf.h (DW_CIE_ID): Removed. diff --git a/libdw/Makefile.am b/libdw/Makefile.am index e624ac108..6d8d533f7 100644 --- a/libdw/Makefile.am +++ b/libdw/Makefile.am @@ -83,7 +83,7 @@ libdw_a_SOURCES = dwarf_begin.c dwarf_begin_elf.c dwarf_end.c dwarf_getelf.c \ dwarf_func_inline.c dwarf_getsrc_file.c \ libdw_findcu.c libdw_form.c libdw_alloc.c memory-access.c \ libdw_visit_scopes.c \ - dwarf_entry_breakpoints.c + dwarf_entry_breakpoints.c dwarf_readhooks.c if MAINTAINER_MODE BUILT_SOURCES = $(srcdir)/known-dwarf.h diff --git a/libdw/dwarf_readhooks.c b/libdw/dwarf_readhooks.c new file mode 100644 index 000000000..705a97309 --- /dev/null +++ b/libdw/dwarf_readhooks.c @@ -0,0 +1,103 @@ +/* Definition of reader hooks. + 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 + . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include "libdwP.h" + +int +__libdw_read_addr_inc (Dwarf *dbg, Dwarf_Word *ret, + unsigned char **addr, + bool addr64) +{ + if (addr64) + *ret = read_8ubyte_unaligned_inc (dbg, *addr); + else + *ret = read_4ubyte_unaligned_inc (dbg, *addr); + return 0; +} + +int +__libdw_read_off_inc (Dwarf *dbg, Dwarf_Word *ret, + int sec_index, Dwarf_Word *offset, + bool addr64) +{ + Elf_Data *data = dbg->sectiondata[sec_index]; + if (*offset >= data->d_size + || *offset + addr64 ? 8 : 4 >= data->d_size) + { + __libdw_seterrno (DWARF_E_INVALID_OFFSET); + return 1; + } + + unsigned char *buf = data->d_buf; + unsigned char *addr = buf + *offset; + int status = __libdw_read_addr_inc (dbg, ret, &addr, addr64); + *offset = addr - buf; + return status; +} + +int +__libdw_read_addr (Dwarf *dbg, Dwarf_Word *ret, + unsigned char *addr, + bool addr64) +{ + return __libdw_read_addr_inc (dbg, ret, &addr, addr64); +} + +int +__libdw_read_off (Dwarf *dbg, Dwarf_Word *ret, + int sec_index, Dwarf_Word offset, + bool addr64) +{ + return __libdw_read_off_inc (dbg, ret, sec_index, &offset, addr64); +} diff --git a/libdw/libdwP.h b/libdw/libdwP.h index 1d5a9b27f..793213431 100644 --- a/libdw/libdwP.h +++ b/libdw/libdwP.h @@ -419,6 +419,31 @@ extern int __libdw_visit_scopes (unsigned int depth, extern int __dwarf_errno_internal (void); +/* Reader hooks. */ + + +int __libdw_read_addr_inc (Dwarf *dbg, Dwarf_Word *ret, + unsigned char **addr, + bool addr64) + internal_function; + +int __libdw_read_off_inc (Dwarf *dbg, Dwarf_Word *ret, + int sec_index, Dwarf_Word *offset, + bool addr64) + internal_function; + +int __libdw_read_addr (Dwarf *dbg, Dwarf_Word *ret, + unsigned char *addr, + bool addr64) + internal_function; + +int __libdw_read_off (Dwarf *dbg, Dwarf_Word *ret, + int sec_index, Dwarf_Word offset, + bool addr64) + internal_function; + + + /* Aliases to avoid PLTs. */ INTDECL (dwarf_attr) INTDECL (dwarf_attr_integrate)