diff options
Diffstat (limited to 'libebl')
| -rw-r--r-- | libebl/ChangeLog | 18 | ||||
| -rw-r--r-- | libebl/Makefile.am | 3 | ||||
| -rw-r--r-- | libebl/ebl-hooks.h | 3 | ||||
| -rw-r--r-- | libebl/eblnonerelocp.c | 2 | ||||
| -rw-r--r-- | libebl/eblopenbackend.c | 33 | ||||
| -rw-r--r-- | libebl/libebl.h | 6 | ||||
| -rw-r--r-- | libebl/libeblP.h | 6 |
7 files changed, 63 insertions, 8 deletions
diff --git a/libebl/ChangeLog b/libebl/ChangeLog index 1d9fcfd5..23a21535 100644 --- a/libebl/ChangeLog +++ b/libebl/ChangeLog @@ -1,3 +1,21 @@ +2006-07-05 Ulrich Drepper <[email protected]> + + * 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 <[email protected]> + + * 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 <[email protected]> * 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/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 <[email protected]>, 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/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 */ |
