1 // freebsd.h -- FreeBSD support for gold -*- C++ -*- 2 3 // Copyright (C) 2009-2014 Free Software Foundation, Inc. 4 // Written by Ian Lance Taylor <iant@google.com>. 5 6 // This file is part of gold. 7 8 // This program is free software; you can redistribute it and/or modify 9 // it under the terms of the GNU General Public License as published by 10 // the Free Software Foundation; either version 3 of the License, or 11 // (at your option) any later version. 12 13 // This program is distributed in the hope that it will be useful, 14 // but WITHOUT ANY WARRANTY; without even the implied warranty of 15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 // GNU General Public License for more details. 17 18 // You should have received a copy of the GNU General Public License 19 // along with this program; if not, write to the Free Software 20 // Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 21 // MA 02110-1301, USA. 22 23 #include "target.h" 24 #include "target-select.h" 25 26 #ifndef GOLD_FREEBSD_H 27 #define GOLD_FREEBSD_H 28 29 namespace gold 30 { 31 32 // FreeBSD 4.1 and later wants the EI_OSABI field in the ELF header to 33 // be set to ELFOSABI_FREEBSD. This is a target selector for targets 34 // which permit combining both FreeBSD and non-FreeBSD object files. 35 36 class Target_selector_freebsd : public Target_selector 37 { 38 public: Target_selector_freebsd(int machine,int size,bool is_big_endian,const char * bfd_name,const char * freebsd_bfd_name,const char * emulation)39 Target_selector_freebsd(int machine, int size, bool is_big_endian, 40 const char* bfd_name, 41 const char* freebsd_bfd_name, 42 const char* emulation) 43 : Target_selector(machine, size, is_big_endian, NULL, emulation), 44 bfd_name_(bfd_name), freebsd_bfd_name_(freebsd_bfd_name) 45 { } 46 47 protected: 48 // If we see a FreeBSD input file, mark the output file as using 49 // FreeBSD. 50 virtual Target* do_recognize(Input_file *,off_t,int,int osabi,int)51 do_recognize(Input_file*, off_t, int, int osabi, int) 52 { 53 Target* ret = this->instantiate_target(); 54 if (osabi == elfcpp::ELFOSABI_FREEBSD) 55 ret->set_osabi(static_cast<elfcpp::ELFOSABI>(osabi)); 56 return ret; 57 } 58 59 // Recognize two names. 60 virtual Target* do_recognize_by_bfd_name(const char * name)61 do_recognize_by_bfd_name(const char* name) 62 { 63 if (strcmp(name, this->bfd_name_) == 0) 64 return this->instantiate_target(); 65 else if (strcmp(name, this->freebsd_bfd_name_) == 0) 66 { 67 Target* ret = this->instantiate_target(); 68 ret->set_osabi(elfcpp::ELFOSABI_FREEBSD); 69 return ret; 70 } 71 else 72 return NULL; 73 } 74 75 // Print both names in --help output. 76 virtual void do_supported_bfd_names(std::vector<const char * > * names)77 do_supported_bfd_names(std::vector<const char*>* names) 78 { 79 names->push_back(this->bfd_name_); 80 names->push_back(this->freebsd_bfd_name_); 81 } 82 83 // Return appropriate BFD name. 84 virtual const char* do_target_bfd_name(const Target * target)85 do_target_bfd_name(const Target* target) 86 { 87 if (!this->is_our_target(target)) 88 return NULL; 89 return (target->osabi() == elfcpp::ELFOSABI_FREEBSD 90 ? this->freebsd_bfd_name_ 91 : this->bfd_name_); 92 } 93 94 private: 95 // The BFD name for the non-Freebsd target. 96 const char* bfd_name_; 97 // The BFD name for the Freebsd target. 98 const char* freebsd_bfd_name_; 99 }; 100 101 } // end namespace gold 102 103 #endif // !defined(GOLD_FREEBSD_H) 104