diff options
author | Ulrich Drepper <drepper@redhat.com> | 2006-07-07 03:43:47 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2006-07-07 03:43:47 +0000 |
commit | 28ed895fdc303b2a793506bb1fcdd35d5fd14e70 (patch) | |
tree | 1385a2d5f0e844e26990b9da92b784ca73c73000 /libebl | |
parent | 1d3a64d70c8f2aec1fc3ae26d124823c1ef304a9 (diff) | |
download | elfutils-28ed895fdc303b2a793506bb1fcdd35d5fd14e70.tar.gz |
merge of 2d5572f10b65f0ac7fdf54361b4dae41ebbd51d0
and fda3a25581b7bfac581504e9e887e9b97f234f86
Diffstat (limited to 'libebl')
-rw-r--r-- | libebl/ChangeLog | 24 | ||||
-rw-r--r-- | libebl/Makefile.am | 3 | ||||
-rw-r--r-- | libebl/ebl-hooks.h | 3 | ||||
-rw-r--r-- | libebl/ebldynamictagcheck.c | 4 | ||||
-rw-r--r-- | libebl/ebldynamictagname.c | 7 | ||||
-rw-r--r-- | libebl/eblnonerelocp.c | 2 | ||||
-rw-r--r-- | libebl/eblopenbackend.c | 33 | ||||
-rw-r--r-- | libebl/eblrelativerelocp.c | 64 | ||||
-rw-r--r-- | libebl/eblsectiontypename.c | 4 | ||||
-rw-r--r-- | libebl/eblsysvhashentrysize.c | 63 | ||||
-rw-r--r-- | libebl/libebl.h | 6 | ||||
-rw-r--r-- | libebl/libeblP.h | 6 |
12 files changed, 205 insertions, 14 deletions
diff --git a/libebl/ChangeLog b/libebl/ChangeLog index 1d9fcfd5..c4f5c65a 100644 --- a/libebl/ChangeLog +++ b/libebl/ChangeLog @@ -1,3 +1,27 @@ +2006-07-06 Ulrich Drepper <drepper@redhat.com> + + * ebldynamictagname.c: Add support for DT_GNU_HASH. + * ebldynamictagcheck.c: Likewise. + * eblsectiontypename.c: Add support for SHT_GNU_HASH. + +2006-07-05 Ulrich Drepper <drepper@redhat.com> + + * Makefile.am (gen_SOURCES): Add eblsysvhashentrysize.c. + * libeblP.h (struct ebl): Add sysvhash_entrysize element. + * eblopenbackend.c (fill_defaults): Initialize sysvhash_entrysize. + + * eblopenbackend.c (openbackend): If possible, fill machine, class, + and data values in from the ELF file. + +2006-07-04 Ulrich Drepper <drepper@redhat.com> + + * Makefile.am (gen_SOURCES): Add eblrelativerelocp.c. + * eblrelativerelocp.c: New file. + * ebl-hooks.c: Add relative_reloc_p. + * eblopenbackend.c (default_relative_reloc_p): New function. + (fill_defaults): Hook it up. + * libebl.h: Declare ebl_relative_reloc_p. + 2006-06-12 Ulrich Drepper <drepper@redhat.com> * Makefile.am (gen_SOURCES): Add eblnonerelocp.c. diff --git a/libebl/Makefile.am b/libebl/Makefile.am index 98269272..278d93e0 100644 --- a/libebl/Makefile.am +++ b/libebl/Makefile.am @@ -56,7 +56,8 @@ gen_SOURCES = eblopenbackend.c eblclosebackend.c eblstrtab.c \ eblgotpcreloccheck.c eblcopyrelocp.c eblsectionstripp.c \ eblelfclass.c eblelfdata.c eblelfmachine.c \ ebl_check_special_symbol.c eblbsspltp.c eblretval.c \ - eblregname.c eblnonerelocp.c + eblregname.c eblnonerelocp.c eblrelativerelocp.c \ + eblsysvhashentrysize.c libebl_a_SOURCES = $(gen_SOURCES) diff --git a/libebl/ebl-hooks.h b/libebl/ebl-hooks.h index 4227c24f..e4923b2e 100644 --- a/libebl/ebl-hooks.h +++ b/libebl/ebl-hooks.h @@ -119,6 +119,9 @@ bool EBLHOOK(copy_reloc_p) (int); /* Check whether given relocation is a no-op relocation. */ bool EBLHOOK(none_reloc_p) (int); +/* Check whether given relocation is a relative relocation. */ +bool EBLHOOK(relative_reloc_p) (int); + /* Check whether given symbol's value is ok despite normal checks. */ bool EBLHOOK(check_special_symbol) (Elf *, GElf_Ehdr *, const GElf_Sym *, const char *, const GElf_Shdr *); diff --git a/libebl/ebldynamictagcheck.c b/libebl/ebldynamictagcheck.c index b082e83d..1953a9c0 100644 --- a/libebl/ebldynamictagcheck.c +++ b/libebl/ebldynamictagcheck.c @@ -1,5 +1,5 @@ /* Check dynamic tag. - Copyright (C) 2001, 2002 Red Hat, Inc. + Copyright (C) 2001, 2002, 2006 Red Hat, Inc. This file is part of Red Hat elfutils. Written by Ulrich Drepper <drepper@redhat.com>, 2001. @@ -66,7 +66,7 @@ ebl_dynamic_tag_check (ebl, tag) if (!res && ((tag >= 0 && tag < DT_NUM) || (tag >= DT_GNU_PRELINKED && tag <= DT_SYMINENT) - || (tag >= DT_GNU_CONFLICT && tag <= DT_SYMINFO) + || (tag >= DT_GNU_HASH && tag <= DT_SYMINFO) || tag == DT_VERSYM || (tag >= DT_RELACOUNT && tag <= DT_VERNEEDNUM) || tag == DT_AUXILIARY diff --git a/libebl/ebldynamictagname.c b/libebl/ebldynamictagname.c index 12677585..d9aa7df0 100644 --- a/libebl/ebldynamictagname.c +++ b/libebl/ebldynamictagname.c @@ -1,5 +1,5 @@ /* Return dynamic tag name. - Copyright (C) 2001, 2002 Red Hat, Inc. + Copyright (C) 2001, 2002, 2006 Red Hat, Inc. This file is part of Red Hat elfutils. Written by Ulrich Drepper <drepper@redhat.com>, 2001. @@ -96,15 +96,16 @@ ebl_dynamic_tag_name (ebl, tag, buf, len) res = valrntags[tag - DT_GNU_PRELINKED]; } - else if (tag >= DT_GNU_CONFLICT && tag <= DT_SYMINFO) + else if (tag >= DT_GNU_HASH && tag <= DT_SYMINFO) { static const char *addrrntags[] = { + "GNU_HASH", "TLSDESC_PLT", "TLSDESC_DOT", "GNU_CONFLICT", "GNU_LIBLIST", "CONFIG", "DEPAUDIT", "AUDIT", "PLTPAD", "MOVETAB", "SYMINFO" }; - res = addrrntags[tag - DT_GNU_CONFLICT]; + res = addrrntags[tag - DT_GNU_HASH]; } else if (tag >= DT_RELACOUNT && tag <= DT_VERNEEDNUM) { diff --git a/libebl/eblnonerelocp.c b/libebl/eblnonerelocp.c index 3d62a0b4..3bca98b1 100644 --- a/libebl/eblnonerelocp.c +++ b/libebl/eblnonerelocp.c @@ -1,4 +1,4 @@ -/* Check whether given relocation is a copy relocation. +/* Check whether given relocation is a no-op relocation. Copyright (C) 2006 Red Hat, Inc. This file is part of Red Hat elfutils. Written by Ulrich Drepper <drepper@redhat.com>, 2006. diff --git a/libebl/eblopenbackend.c b/libebl/eblopenbackend.c index 092068cb..5916e0de 100644 --- a/libebl/eblopenbackend.c +++ b/libebl/eblopenbackend.c @@ -54,7 +54,7 @@ #include <assert.h> #include <dlfcn.h> #include <error.h> -#include <gelf.h> +#include <libelfP.h> #include <stdlib.h> #include <string.h> #include <stdio.h> @@ -89,6 +89,7 @@ static const struct { "sparc", "elf_sparcv9", "sparc", 5, EM_SPARCV9, 0, 0 }, { "sparc", "elf_sparc", "sparc", 5, EM_SPARC, 0, 0 }, { "sparc", "elf_sparcv8plus", "sparc", 5, EM_SPARC32PLUS, 0, 0 }, + { "s390", "ebl_s390", "s390", 4, EM_S390, 0, 0 }, { "m32", "elf_m32", "m32", 3, EM_M32, 0, 0 }, { "m68k", "elf_m68k", "m68k", 4, EM_68K, 0, 0 }, @@ -99,7 +100,6 @@ static const struct { "vpp500", "elf_vpp500", "vpp500", 5, EM_VPP500, 0, 0 }, { "sparc", "elf_v8plus", "v8plus", 6, EM_SPARC32PLUS, 0, 0 }, { "i960", "elf_i960", "i960", 4, EM_960, 0, 0 }, - { "s390", "ebl_s390", "s390", 4, EM_S390, 0, 0 }, { "v800", "ebl_v800", "v800", 4, EM_V800, 0, 0 }, { "fr20", "ebl_fr20", "fr20", 4, EM_FR20, 0, 0 }, { "rh32", "ebl_rh32", "rh32", 4, EM_RH32, 0, 0 }, @@ -191,6 +191,7 @@ static bool default_object_note (const char *name, uint32_t type, static bool default_debugscn_p (const char *name); static bool default_copy_reloc_p (int reloc); static bool default_none_reloc_p (int reloc); +static bool default_relative_reloc_p (int reloc); static bool default_check_special_symbol (Elf *elf, GElf_Ehdr *ehdr, const GElf_Sym *sym, const char *name, @@ -231,11 +232,13 @@ fill_defaults (Ebl *result) result->debugscn_p = default_debugscn_p; result->copy_reloc_p = default_copy_reloc_p; result->none_reloc_p = default_none_reloc_p; + result->relative_reloc_p = default_relative_reloc_p; result->check_special_symbol = default_check_special_symbol; result->bss_plt_p = default_bss_plt_p; result->return_value_location = default_return_value_location; result->register_name = default_register_name; result->destr = default_destr; + result->sysvhash_entrysize = sizeof (Elf32_Word); } @@ -280,9 +283,28 @@ openbackend (elf, emulation, machine) /* Well, we know the emulation name now. */ result->emulation = machines[cnt].emulation; - result->machine = machines[cnt].em; - result->class = machines[cnt].class; - result->data = machines[cnt].data; + /* We access some data structures directly. Make sure the 32 and + 64 bit variants are laid out the same. */ + assert (offsetof (Elf32_Ehdr, e_machine) + == offsetof (Elf64_Ehdr, e_machine)); + assert (sizeof (((Elf32_Ehdr *) 0)->e_machine) + == sizeof (((Elf64_Ehdr *) 0)->e_machine)); + assert (offsetof (Elf, state.elf32.ehdr) + == offsetof (Elf, state.elf64.ehdr)); + + /* Prefer taking the information from the ELF file. */ + if (elf == NULL) + { + result->machine = machines[cnt].em; + result->class = machines[cnt].class; + result->data = machines[cnt].data; + } + else + { + result->machine = elf->state.elf32.ehdr->e_machine; + result->class = elf->state.elf32.ehdr->e_ident[EI_CLASS]; + result->data = elf->state.elf32.ehdr->e_ident[EI_DATA]; + } #ifndef LIBEBL_SUBDIR # define LIBEBL_SUBDIR PACKAGE @@ -608,6 +630,7 @@ default_copy_reloc_p (int reloc __attribute__ ((unused))) return false; } strong_alias (default_copy_reloc_p, default_none_reloc_p) +strong_alias (default_copy_reloc_p, default_relative_reloc_p) static bool default_check_special_symbol (Elf *elf __attribute__ ((unused)), diff --git a/libebl/eblrelativerelocp.c b/libebl/eblrelativerelocp.c new file mode 100644 index 00000000..8ea97b88 --- /dev/null +++ b/libebl/eblrelativerelocp.c @@ -0,0 +1,64 @@ +/* Check whether given relocation is a relocation relocation. + Copyright (C) 2006 Red Hat, Inc. + This file is part of Red Hat elfutils. + Written by Ulrich Drepper <drepper@redhat.com>, 2006. + + 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>. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <libeblP.h> + + +bool +ebl_relative_reloc_p (ebl, reloc) + Ebl *ebl; + int reloc; +{ + return ebl->relative_reloc_p (reloc); +} diff --git a/libebl/eblsectiontypename.c b/libebl/eblsectiontypename.c index 18cbd767..b62c37b3 100644 --- a/libebl/eblsectiontypename.c +++ b/libebl/eblsectiontypename.c @@ -1,5 +1,5 @@ /* Return section type name. - Copyright (C) 2001, 2002 Red Hat, Inc. + Copyright (C) 2001, 2002, 2006 Red Hat, Inc. This file is part of Red Hat elfutils. Written by Ulrich Drepper <drepper@redhat.com>, 2001. @@ -116,6 +116,8 @@ ebl_section_type_name (ebl, section, buf, len) res = "CHECKSUM"; else if (section == SHT_GNU_LIBLIST) res = "GNU_LIBLIST"; + else if (section == SHT_GNU_HASH) + res = "GNU_HASH"; /* Handle OS-specific section names. */ else { diff --git a/libebl/eblsysvhashentrysize.c b/libebl/eblsysvhashentrysize.c new file mode 100644 index 00000000..341979c1 --- /dev/null +++ b/libebl/eblsysvhashentrysize.c @@ -0,0 +1,63 @@ +/* Return OS ABI name + Copyright (C) 2006 Red Hat, Inc. + This file is part of Red Hat elfutils. + Written by Ulrich Drepper <drepper@redhat.com>, 2006. + + 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>. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <libeblP.h> + + +int +ebl_sysvhash_entrysize (ebl) + Ebl *ebl; +{ + return ebl->sysvhash_entrysize; +} diff --git a/libebl/libebl.h b/libebl/libebl.h index c27dfd4a..6969c550 100644 --- a/libebl/libebl.h +++ b/libebl/libebl.h @@ -192,6 +192,9 @@ extern bool ebl_copy_reloc_p (Ebl *ebl, int reloc); /* Check whether given relocation is a no-op relocation. */ extern bool ebl_none_reloc_p (Ebl *ebl, int reloc); +/* Check whether given relocation is a relative relocation. */ +extern bool ebl_relative_reloc_p (Ebl *ebl, int reloc); + /* Check whether section should be stripped. */ extern bool ebl_section_strip_p (Ebl *ebl, const GElf_Ehdr *ehdr, const GElf_Shdr *shdr, const char *name, @@ -200,6 +203,9 @@ extern bool ebl_section_strip_p (Ebl *ebl, const GElf_Ehdr *ehdr, /* Check if backend uses a bss PLT in this file. */ extern bool ebl_bss_plt_p (Ebl *ebl, GElf_Ehdr *ehdr); +/* Return size of entry in SysV-style hash table. */ +extern int ebl_sysvhash_entrysize (Ebl *ebl); + /* Return location expression to find return value given a DW_TAG_subprogram, DW_TAG_subroutine_type, or similar DIE describing function itself (whose DW_AT_type attribute describes its return type). diff --git a/libebl/libeblP.h b/libebl/libeblP.h index ff70b679..7bb4c376 100644 --- a/libebl/libeblP.h +++ b/libebl/libeblP.h @@ -1,5 +1,5 @@ /* Internal definitions for interface for libebl. - Copyright (C) 2000, 2001, 2002, 2004, 2005 Red Hat, Inc. + Copyright (C) 2000, 2001, 2002, 2004, 2005, 2006 Red Hat, Inc. This file is part of Red Hat elfutils. Red Hat elfutils is free software; you can redistribute it and/or modify @@ -77,6 +77,9 @@ struct ebl # include "ebl-hooks.h" # undef EBLHOOK + /* Size of entry in Sysv-style hash table. */ + int sysvhash_entrysize; + /* Internal data. */ void *dlhandle; }; @@ -87,6 +90,7 @@ typedef const char *(*ebl_bhinit_t) (Elf *, GElf_Half, Ebl *, size_t); /* gettext helper macros. */ +#undef _ #define _(Str) dgettext ("elfutils", Str) #endif /* libeblP.h */ |