X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=elfcpp%2Felfcpp_file.h;h=92898c376469e29c6ba573f58f24029715d7d875;hb=3af96c0d99dedab49d2b82b730c74c27ce99bba4;hp=00ab28b36e11f000f9869dca338af2b0335552d9;hpb=c549a6949c8cbbbeafa79ab903b172bbc5f2b8ea;p=deliverable%2Fbinutils-gdb.git diff --git a/elfcpp/elfcpp_file.h b/elfcpp/elfcpp_file.h index 00ab28b36e..92898c3764 100644 --- a/elfcpp/elfcpp_file.h +++ b/elfcpp/elfcpp_file.h @@ -1,6 +1,6 @@ // elfcpp_file.h -- file access for elfcpp -*- C++ -*- -// Copyright 2006, 2007, Free Software Foundation, Inc. +// Copyright (C) 2006-2020 Free Software Foundation, Inc. // Written by Ian Lance Taylor . // This file is part of elfcpp. @@ -60,6 +60,8 @@ #include #include +#include "elfcpp.h" + namespace elfcpp { @@ -142,6 +144,15 @@ class Elf_file return this->shnum_; } + unsigned int + shnum() const + { + if (this->shnum_ == 0 && this->shoff_ != 0) + this->file_->error(_("ELF file has not been initialized yet" + " (internal error)")); + return this->shnum_; + } + // Return the section index of the section name string table. unsigned int shstrndx() @@ -150,6 +161,18 @@ class Elf_file return this->shstrndx_; } + unsigned int + shstrndx() const + { + if (this->shstrndx_ == SHN_XINDEX && this->shoff_ != 0) + { + this->file_->error(_("ELF file has not been initialized yet" + " (internal error)")); + return 0; + } + return this->shstrndx_; + } + // Return the value to subtract from section indexes >= // SHN_LORESERVE. See the comment in initialize_shnum. int @@ -159,6 +182,15 @@ class Elf_file return this->large_shndx_offset_; } + int + large_shndx_offset() const + { + if (this->shstrndx_ == SHN_XINDEX && this->shoff_ != 0) + this->file_->error(_("ELF file has not been initialized yet" + " (internal error)")); + return this->large_shndx_offset_; + } + // Return the location of the header of section SHNDX. typename File::Location section_header(unsigned int shndx) @@ -169,7 +201,7 @@ class Elf_file // Return the name of section SHNDX. std::string - section_name(unsigned int shndx); + section_name(unsigned int shndx) const; // Return the location of the contents of section SHNDX. typename File::Location @@ -214,7 +246,7 @@ class Elf_file // Return the file offset of the header of section SHNDX. off_t - section_header_offset(unsigned int shndx); + section_header_offset(unsigned int shndx) const; // The file we are reading. File* file_; @@ -228,6 +260,33 @@ class Elf_file int large_shndx_offset_; }; +// A small wrapper around SHT_STRTAB data mapped to memory. It checks that the +// index is not out of bounds and the string is NULL-terminated. + +class Elf_strtab +{ + public: + // Construct an Elf_strtab for a section with contents *P and size SIZE. + Elf_strtab(const unsigned char* p, size_t size); + + // Return the file offset to the section headers. + bool + get_c_string(size_t offset, const char** cstring) const + { + if (offset >= this->usable_size_) + return false; + *cstring = this->base_ + offset; + return true; + } + + private: + // Contents of the section mapped to memory. + const char* base_; + // One larger that the position of the last NULL character in the section. + // For valid SHT_STRTAB sections, this is the size of the section. + size_t usable_size_; +}; + // Inline function definitions. // Check for presence of the ELF magic number. @@ -436,7 +495,7 @@ Elf_file::find_section_by_type(unsigned int type) template off_t -Elf_file::section_header_offset(unsigned int shndx) +Elf_file::section_header_offset(unsigned int shndx) const { if (shndx >= this->shnum()) this->file_->error(_("section_header_offset: bad shndx %u >= %u"), @@ -448,7 +507,7 @@ Elf_file::section_header_offset(unsigned int shndx) template std::string -Elf_file::section_name(unsigned int shndx) +Elf_file::section_name(unsigned int shndx) const { File* const file = this->file_; @@ -463,7 +522,7 @@ Elf_file::section_name(unsigned int shndx) // Get the file offset for the section name string table data. off_t shstr_off; - off_t shstr_size; + typename Elf_types::Elf_WXword shstr_size; { const unsigned int shstrndx = this->shstrndx_; typename File::View v(file->view(this->section_header_offset(shstrndx), @@ -642,6 +701,18 @@ Elf_file::section_addralign(unsigned int shndx) return shdr.get_sh_addralign(); } +inline +Elf_strtab::Elf_strtab(const unsigned char* p, size_t size) +{ + // Check if the section is NUL-terminated. If it isn't, we ignore + // the last part to make sure we don't return non-NUL-terminated + // strings. + while (size > 0 && p[size - 1] != 0) + size--; + this->base_ = reinterpret_cast(p); + this->usable_size_ = size; +} + } // End namespace elfcpp. #endif // !defined(ELFCPP_FILE_H)