// binary.h -- binary input files for gold -*- C++ -*-// Copyright 2008 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.boolconvert(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_tconverted_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>boolsized_convert(const Task*);template<int size, bool big_endian>voidwrite_file_header(unsigned char**);template<int size, bool big_endian>voidwrite_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>voidwrite_symbol(const std::string&, const Stringpool_template<char>*,section_size_type, 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)