Home | History | Annotate | Download | only in gold
      1 // defstd.cc -- define standard symbols for gold.
      2 
      3 // Copyright (C) 2006-2016 Free Software Foundation, Inc.
      4 // Written by Ian Lance Taylor <iant (at) 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 "gold.h"
     24 
     25 #include "symtab.h"
     26 #include "layout.h"
     27 #include "defstd.h"
     28 
     29 // This is a simple file which defines the standard symbols like
     30 // "_end".
     31 
     32 namespace
     33 {
     34 
     35 using namespace gold;
     36 
     37 const Define_symbol_in_section in_section[] =
     38 {
     39   {
     40     "__preinit_array_start",	// name
     41     ".preinit_array",		// output_section
     42     0,				// value
     43     0,				// size
     44     elfcpp::STT_NOTYPE,		// type
     45     elfcpp::STB_GLOBAL,		// binding
     46     elfcpp::STV_HIDDEN,		// visibility
     47     0,				// nonvis
     48     false,			// offset_is_from_end
     49     true			// only_if_ref
     50   },
     51   {
     52     "__preinit_array_end",	// name
     53     ".preinit_array",		// output_section
     54     0,				// value
     55     0,				// size
     56     elfcpp::STT_NOTYPE,		// type
     57     elfcpp::STB_GLOBAL,		// binding
     58     elfcpp::STV_HIDDEN,		// visibility
     59     0,				// nonvis
     60     true,			// offset_is_from_end
     61     true			// only_if_ref
     62   },
     63   {
     64     "__init_array_start",	// name
     65     ".init_array",		// output_section
     66     0,				// value
     67     0,				// size
     68     elfcpp::STT_NOTYPE,		// type
     69     elfcpp::STB_GLOBAL,		// binding
     70     elfcpp::STV_HIDDEN,		// visibility
     71     0,				// nonvis
     72     false,			// offset_is_from_end
     73     true			// only_if_ref
     74   },
     75   {
     76     "__init_array_end",		// name
     77     ".init_array",		// output_section
     78     0,				// value
     79     0,				// size
     80     elfcpp::STT_NOTYPE,		// type
     81     elfcpp::STB_GLOBAL,		// binding
     82     elfcpp::STV_HIDDEN,		// visibility
     83     0,				// nonvis
     84     true,			// offset_is_from_end
     85     true			// only_if_ref
     86   },
     87   {
     88     "__fini_array_start",	// name
     89     ".fini_array",		// output_section
     90     0,				// value
     91     0,				// size
     92     elfcpp::STT_NOTYPE,		// type
     93     elfcpp::STB_GLOBAL,		// binding
     94     elfcpp::STV_HIDDEN,		// visibility
     95     0,				// nonvis
     96     false,			// offset_is_from_end
     97     true			// only_if_ref
     98   },
     99   {
    100     "__fini_array_end",		// name
    101     ".fini_array",		// output_section
    102     0,				// value
    103     0,				// size
    104     elfcpp::STT_NOTYPE,		// type
    105     elfcpp::STB_GLOBAL,		// binding
    106     elfcpp::STV_HIDDEN,		// visibility
    107     0,				// nonvis
    108     true,			// offset_is_from_end
    109     true			// only_if_ref
    110   },
    111   {
    112     "__stack",			// name
    113     ".stack",			// output_section
    114     0,				// value
    115     0,				// size
    116     elfcpp::STT_NOTYPE,		// type
    117     elfcpp::STB_GLOBAL,		// binding
    118     elfcpp::STV_DEFAULT,	// visibility
    119     0,				// nonvis
    120     false,			// offset_is_from_end
    121     true			// only_if_ref
    122   },
    123 };
    124 
    125 const int in_section_count = sizeof in_section / sizeof in_section[0];
    126 
    127 const Define_symbol_in_segment in_segment[] =
    128 {
    129   {
    130     "__executable_start",	// name
    131     elfcpp::PT_LOAD,		// segment_type
    132     elfcpp::PF(0),		// segment_flags_set
    133     elfcpp::PF(0),		// segment_flags_clear
    134     0,				// value
    135     0,				// size
    136     elfcpp::STT_NOTYPE,		// type
    137     elfcpp::STB_GLOBAL,		// binding
    138     elfcpp::STV_DEFAULT,	// visibility
    139     0,				// nonvis
    140     Symbol::SEGMENT_START,	// offset_from_base
    141     true			// only_if_ref
    142   },
    143   {
    144     "__ehdr_start",		// name
    145     elfcpp::PT_LOAD,		// segment_type
    146     elfcpp::PF(0),		// segment_flags_set
    147     elfcpp::PF(0),		// segment_flags_clear
    148     0,				// value
    149     0,				// size
    150     elfcpp::STT_NOTYPE,		// type
    151     elfcpp::STB_GLOBAL,		// binding
    152     elfcpp::STV_HIDDEN,		// visibility
    153     0,				// nonvis
    154     Symbol::SEGMENT_START,	// offset_from_base
    155     true			// only_if_ref
    156   },
    157   {
    158     "etext",			// name
    159     elfcpp::PT_LOAD,		// segment_type
    160     elfcpp::PF_X,		// segment_flags_set
    161     elfcpp::PF_W,		// segment_flags_clear
    162     0,				// value
    163     0,				// size
    164     elfcpp::STT_NOTYPE,		// type
    165     elfcpp::STB_GLOBAL,		// binding
    166     elfcpp::STV_DEFAULT,	// visibility
    167     0,				// nonvis
    168     Symbol::SEGMENT_END,	// offset_from_base
    169     true			// only_if_ref
    170   },
    171   {
    172     "_etext",			// name
    173     elfcpp::PT_LOAD,		// segment_type
    174     elfcpp::PF_X,		// segment_flags_set
    175     elfcpp::PF_W,		// segment_flags_clear
    176     0,				// value
    177     0,				// size
    178     elfcpp::STT_NOTYPE,		// type
    179     elfcpp::STB_GLOBAL,		// binding
    180     elfcpp::STV_DEFAULT,	// visibility
    181     0,				// nonvis
    182     Symbol::SEGMENT_END,	// offset_from_base
    183     true			// only_if_ref
    184   },
    185   {
    186     "__etext",			// name
    187     elfcpp::PT_LOAD,		// segment_type
    188     elfcpp::PF_X,		// segment_flags_set
    189     elfcpp::PF_W,		// segment_flags_clear
    190     0,				// value
    191     0,				// size
    192     elfcpp::STT_NOTYPE,		// type
    193     elfcpp::STB_GLOBAL,		// binding
    194     elfcpp::STV_DEFAULT,	// visibility
    195     0,				// nonvis
    196     Symbol::SEGMENT_END,	// offset_from_base
    197     true			// only_if_ref
    198   },
    199   {
    200     "_edata",			// name
    201     elfcpp::PT_LOAD,		// segment_type
    202     elfcpp::PF_W,		// segment_flags_set
    203     elfcpp::PF(0),		// segment_flags_clear
    204     0,				// value
    205     0,				// size
    206     elfcpp::STT_NOTYPE,		// type
    207     elfcpp::STB_GLOBAL,		// binding
    208     elfcpp::STV_DEFAULT,	// visibility
    209     0,				// nonvis
    210     Symbol::SEGMENT_BSS,	// offset_from_base
    211     false			// only_if_ref
    212   },
    213   {
    214     "edata",			// name
    215     elfcpp::PT_LOAD,		// segment_type
    216     elfcpp::PF_W,		// segment_flags_set
    217     elfcpp::PF(0),		// segment_flags_clear
    218     0,				// value
    219     0,				// size
    220     elfcpp::STT_NOTYPE,		// type
    221     elfcpp::STB_GLOBAL,		// binding
    222     elfcpp::STV_DEFAULT,	// visibility
    223     0,				// nonvis
    224     Symbol::SEGMENT_BSS,	// offset_from_base
    225     true			// only_if_ref
    226   },
    227   {
    228     "__bss_start",		// name
    229     elfcpp::PT_LOAD,		// segment_type
    230     elfcpp::PF_W,		// segment_flags_set
    231     elfcpp::PF(0),		// segment_flags_clear
    232     0,				// value
    233     0,				// size
    234     elfcpp::STT_NOTYPE,		// type
    235     elfcpp::STB_GLOBAL,		// binding
    236     elfcpp::STV_DEFAULT,	// visibility
    237     0,				// nonvis
    238     Symbol::SEGMENT_BSS,	// offset_from_base
    239     false			// only_if_ref
    240   },
    241   {
    242     "_end",			// name
    243     elfcpp::PT_LOAD,		// segment_type
    244     elfcpp::PF_W,		// segment_flags_set
    245     elfcpp::PF(0),		// segment_flags_clear
    246     0,				// value
    247     0,				// size
    248     elfcpp::STT_NOTYPE,		// type
    249     elfcpp::STB_GLOBAL,		// binding
    250     elfcpp::STV_DEFAULT,	// visibility
    251     0,				// nonvis
    252     Symbol::SEGMENT_END,	// offset_from_base
    253     false			// only_if_ref
    254   },
    255   {
    256     "end",			// name
    257     elfcpp::PT_LOAD,		// segment_type
    258     elfcpp::PF_W,		// segment_flags_set
    259     elfcpp::PF(0),		// segment_flags_clear
    260     0,				// value
    261     0,				// size
    262     elfcpp::STT_NOTYPE,		// type
    263     elfcpp::STB_GLOBAL,		// binding
    264     elfcpp::STV_DEFAULT,	// visibility
    265     0,				// nonvis
    266     Symbol::SEGMENT_END,	// offset_from_base
    267     true			// only_if_ref
    268   }
    269 };
    270 
    271 const int in_segment_count = sizeof in_segment / sizeof in_segment[0];
    272 
    273 } // End anonymous namespace.
    274 
    275 namespace gold
    276 {
    277 
    278 void
    279 define_standard_symbols(Symbol_table* symtab, const Layout* layout)
    280 {
    281   bool saw_sections_clause = layout->script_options()->saw_sections_clause();
    282   symtab->define_symbols(layout, in_section_count, in_section,
    283 			 saw_sections_clause);
    284   symtab->define_symbols(layout, in_segment_count, in_segment,
    285 			 saw_sections_clause);
    286 }
    287 
    288 } // End namespace gold.
    289