123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- // binary.h -- binary input files for gold -*- C++ -*-
- // Copyright (C) 2008-2015 Free Software Foundation, Inc.
- // Written by Ian Lance Taylor <iant@google.com>.
- // This file is part of gold.
- // This program 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; either version 3 of the License, or
- // (at your option) any later version.
- // 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 General Public License for more details.
- // You should have received a copy of the GNU 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.
- // Support binary input files by making them look like an ELF file.
- #ifndef GOLD_BINARY_H
- #define GOLD_BINARY_H
- #include <string>
- #include "elfcpp.h"
- namespace gold
- {
- class Task;
- template<typename Stringpool_char>
- class Stringpool_template;
- // This class takes a file name and creates a buffer which looks like
- // an ELF file read into memory.
- class Binary_to_elf
- {
- public:
- Binary_to_elf(elfcpp::EM machine, int size, bool big_endian,
- const std::string& filename);
- ~Binary_to_elf();
- // Read contents and create an ELF buffer. Return true if this
- // succeeds, false otherwise.
- bool
- convert(const Task*);
- // Return a pointer to the contents of the ELF file.
- const unsigned char*
- converted_data() const
- { return this->data_; }
- // Return a pointer to the contents of the ELF file and let the
- // caller take charge of it. It was allocated using new[].
- unsigned char*
- converted_data_leak()
- {
- unsigned char* ret = this->data_;
- this->data_ = NULL;
- return ret;
- }
- // Return the size of the ELF file.
- size_t
- converted_size() const
- { return this->filesize_; }
- private:
- Binary_to_elf(const Binary_to_elf&);
- Binary_to_elf& operator=(const Binary_to_elf&);
- template<int size, bool big_endian>
- bool
- sized_convert(const Task*);
- template<int size, bool big_endian>
- void
- write_file_header(unsigned char**);
- template<int size, bool big_endian>
- void
- write_section_header(const char*, const Stringpool_template<char>*,
- elfcpp::SHT, unsigned int, section_size_type,
- section_size_type, unsigned int, unsigned int,
- unsigned int, unsigned int, unsigned char**);
- template<int size, bool big_endian>
- void
- write_symbol(const std::string&, const Stringpool_template<char>*,
- section_size_type, typename elfcpp::Elf_types<32>::Elf_WXword,
- unsigned int, unsigned char**);
- // The ELF machine code of the file to create.
- elfcpp::EM elf_machine_;
- // The size of the file to create, 32 or 64.
- int size_;
- // Whether to create a big endian file.
- bool big_endian_;
- // The name of the file to read.
- std::string filename_;
- // The ELF file data, allocated by new [].
- unsigned char* data_;
- // The ELF file size.
- section_size_type filesize_;
- };
- } // End namespace gold.
- #endif // !defined(GOLD_BINARY_H)
|