X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=elfcpp%2Felfcpp_internal.h;h=357ccc1937c9fa981c0807a4c46cfabb7437cbf8;hb=04d512e750b9c416fc15611649883ac5209d31c7;hp=696343a805d63dbf8c93b24aed2988c851f091be;hpb=39081c14cf1a644187199dcda485025ba01bb8e2;p=platform%2Fupstream%2Fbinutils.git diff --git a/elfcpp/elfcpp_internal.h b/elfcpp/elfcpp_internal.h index 696343a..357ccc1 100644 --- a/elfcpp/elfcpp_internal.h +++ b/elfcpp/elfcpp_internal.h @@ -1,12 +1,37 @@ // elfcpp_internal.h -- internals for elfcpp -*- C++ -*- +// Copyright (C) 2006-2014 Free Software Foundation, Inc. +// Written by Ian Lance Taylor . + +// This file is part of elfcpp. + +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public License +// as published by the Free Software Foundation; either version 2, or +// (at your option) any later version. + +// In addition to the permissions in the GNU Library General Public +// License, the Free Software Foundation gives you unlimited +// permission to link the compiled version of this file into +// combinations with other programs, and to distribute those +// combinations without any restriction coming from the use of this +// file. (The Library Public License restrictions do apply in other +// respects; for example, they cover modification of the file, and +/// distribution when not linked into a combined executable.) + +// This program 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 +// Library General Public License for more details. + +// You should have received a copy of the GNU Library General Public +// License along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +// 02110-1301, USA. + // This is included by elfcpp.h, the external interface, but holds // information which we want to keep private. -#include "elfcpp_config.h" - -#include - #ifndef ELFCPP_INTERNAL_H #define ELFCPP_INTERNAL_H @@ -16,154 +41,6 @@ namespace elfcpp namespace internal { -#ifdef WORDS_BIG_ENDIAN -const bool host_big_endian = true; -#else -const bool host_big_endian = false; -#endif - -// Conversion routines between target and host. - -// Convert Elf_Half. - -template -Elf_Half -convert_half_host(Elf_Half v); - -template<> -inline Elf_Half -convert_half_host(Elf_Half v) -{ - return v; -} - -template<> -inline Elf_Half -convert_half_host(Elf_Half v) -{ - return bswap_16(v); -} - -template -inline Elf_Half -convert_half(Elf_Half v) -{ - return convert_half_host(v); -} - -// Convert Elf_Word. - -template -Elf_Word -convert_word_host(Elf_Word v); - -template<> -inline Elf_Word -convert_word_host(Elf_Word v) -{ - return v; -} - -template<> -inline Elf_Word -convert_word_host(Elf_Word v) -{ - return bswap_32(v); -} - -template -inline Elf_Word -convert_word(Elf_Word v) -{ - return convert_word_host(v); -} - -// Convert Elf_Xword. - -template -Elf_Xword -convert_xword_host(Elf_Xword v); - -template<> -inline Elf_Xword -convert_xword_host(Elf_Xword v) -{ - return v; -} - -template<> -inline Elf_Xword -convert_xword_host(Elf_Xword v) -{ - return bswap_64(v); -} - -template -inline Elf_Xword -convert_xword(Elf_Xword v) -{ - return convert_xword_host(v); -} - -// Convert Elf_addr. - -template -typename Elf_types::Elf_Addr -convert_addr_size(typename Elf_types::Elf_Addr); - -template<> -inline Elf_types<32>::Elf_Addr -convert_addr_size<32, true>(Elf_types<32>::Elf_Addr v) -{ - return v; -} - -template<> -inline Elf_types<64>::Elf_Addr -convert_addr_size<64, true>(Elf_types<64>::Elf_Addr v) -{ - return v; -} - -template<> -inline Elf_types<32>::Elf_Addr -convert_addr_size<32, false>(Elf_types<32>::Elf_Addr v) -{ - return bswap_32(v); -} - -template<> -inline Elf_types<64>::Elf_Addr -convert_addr_size<64, false>(Elf_types<64>::Elf_Addr v) -{ - return bswap_64(v); -} - -template -inline typename Elf_types::Elf_Addr -convert_addr(typename Elf_types::Elf_Addr v) -{ - return convert_addr_size(v); -} - -// Convert Elf_Off. - -template -inline typename Elf_types::Elf_Off -convert_off(typename Elf_types::Elf_Off v) -{ - return convert_addr_size(v); -} - -// Convert Elf_WXword. - -template -inline typename Elf_types::Elf_Off -convert_wxword(typename Elf_types::Elf_Off v) -{ - return convert_addr_size(v); -} - // The ELF file header. template @@ -185,7 +62,7 @@ struct Ehdr_data Elf_Half e_shstrndx; }; -// An Elf section header. +// An ELF section header. template struct Shdr_data @@ -264,6 +141,98 @@ struct Sym_data<64> Elf_Xword st_size; }; +// ELF relocation table entries. + +template +struct Rel_data +{ + typename Elf_types::Elf_Addr r_offset; + typename Elf_types::Elf_WXword r_info; +}; + +template +struct Rela_data +{ + typename Elf_types::Elf_Addr r_offset; + typename Elf_types::Elf_WXword r_info; + typename Elf_types::Elf_Swxword r_addend; +}; + +// An entry in the ELF SHT_DYNAMIC section aka PT_DYNAMIC segment. + +template +struct Dyn_data +{ + typename Elf_types::Elf_Swxword d_tag; + typename Elf_types::Elf_WXword d_val; +}; + +// An entry in a SHT_GNU_verdef section. This structure is the same +// in 32-bit and 64-bit ELF files. + +struct Verdef_data +{ + // Version number of structure (VER_DEF_*). + Elf_Half vd_version; + // Bit flags (VER_FLG_*). + Elf_Half vd_flags; + // Version index. + Elf_Half vd_ndx; + // Number of auxiliary Verdaux entries. + Elf_Half vd_cnt; + // Hash of name. + Elf_Word vd_hash; + // Byte offset to first Verdaux entry. + Elf_Word vd_aux; + // Byte offset to next Verdef entry. + Elf_Word vd_next; +}; + +// An auxiliary entry in a SHT_GNU_verdef section. This structure is +// the same in 32-bit and 64-bit ELF files. + +struct Verdaux_data +{ + // Offset in string table of version name. + Elf_Word vda_name; + // Byte offset to next Verdaux entry. + Elf_Word vda_next; +}; + +// An entry in a SHT_GNU_verneed section. This structure is the same +// in 32-bit and 64-bit ELF files. + +struct Verneed_data +{ + // Version number of structure (VER_NEED_*). + Elf_Half vn_version; + // Number of auxiliary Vernaux entries. + Elf_Half vn_cnt; + // Offset in string table of library name. + Elf_Word vn_file; + // Byte offset to first Vernaux entry. + Elf_Word vn_aux; + // Byt eoffset to next Verneed entry. + Elf_Word vn_next; +}; + +// An auxiliary entry in a SHT_GNU_verneed section. This structure is +// the same in 32-bit and 64-bit ELF files. + +struct Vernaux_data +{ + // Hash of dependency name. + Elf_Word vna_hash; + // Bit flags (VER_FLG_*). + Elf_Half vna_flags; + // Version index used in SHT_GNU_versym entries. + Elf_Half vna_other; + // Offset in string table of version name. + Elf_Word vna_name; + // Byte offset to next Vernaux entry. + Elf_Word vna_next; +}; + } // End namespace internal. } // End namespace elfcpp.