diff options
author | Ian Lance Taylor <iant@google.com> | 2007-09-22 04:42:09 +0000 |
---|---|---|
committer | Ian Lance Taylor <iant@google.com> | 2007-09-22 04:42:09 +0000 |
commit | bfd58944a64b0997a310b95fbe0423338961e71c (patch) | |
tree | ba78dccb512106e5eef43093c326272a679f08c3 /gold/layout.cc | |
parent | 306d9ef0484f1928594ce309c1239252fd4915c8 (diff) | |
download | binutils-gdb-bfd58944a64b0997a310b95fbe0423338961e71c.tar.gz |
Define __start and __stop symbols.
Diffstat (limited to 'gold/layout.cc')
-rw-r--r-- | gold/layout.cc | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/gold/layout.cc b/gold/layout.cc index 9d4b644d112..d72b7e70c0d 100644 --- a/gold/layout.cc +++ b/gold/layout.cc @@ -337,6 +337,58 @@ Layout::create_initial_dynamic_sections(const Input_objects* input_objects, this->dynamic_section_->add_output_section_data(this->dynamic_data_); } +// For each output section whose name can be represented as C symbol, +// define __start and __stop symbols for the section. This is a GNU +// extension. + +void +Layout::define_section_symbols(Symbol_table* symtab, const Target* target) +{ + for (Section_list::const_iterator p = this->section_list_.begin(); + p != this->section_list_.end(); + ++p) + { + const char* const name = (*p)->name(); + if (name[strspn(name, + ("0123456789" + "ABCDEFGHIJKLMNOPWRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "_"))] + == '\0') + { + const std::string name_string(name); + const std::string start_name("__start_" + name_string); + const std::string stop_name("__stop_" + name_string); + + symtab->define_in_output_data(target, + start_name.c_str(), + NULL, // version + *p, + 0, // value + 0, // symsize + elfcpp::STT_NOTYPE, + elfcpp::STB_GLOBAL, + elfcpp::STV_DEFAULT, + 0, // nonvis + false, // offset_is_from_end + false); // only_if_ref + + symtab->define_in_output_data(target, + stop_name.c_str(), + NULL, // version + *p, + 0, // value + 0, // symsize + elfcpp::STT_NOTYPE, + elfcpp::STB_GLOBAL, + elfcpp::STV_DEFAULT, + 0, // nonvis + true, // offset_is_from_end + false); // only_if_ref + } + } +} + // Find the first read-only PT_LOAD segment, creating one if // necessary. |