diff options
Diffstat (limited to 'gold/merge.h')
-rw-r--r-- | gold/merge.h | 92 |
1 files changed, 68 insertions, 24 deletions
diff --git a/gold/merge.h b/gold/merge.h index cc554f2..630b593 100644 --- a/gold/merge.h +++ b/gold/merge.h @@ -31,6 +31,62 @@ namespace gold { +// This class manages mappings from input sections to offsets in an +// output section. This is used where input sections are merged. + +class Merge_map +{ + public: + Merge_map() + : merge_map_() + { } + + // Add a mapping for the bytes from OFFSET to OFFSET + LENGTH in the + // input section SHNDX in object OBJECT to OUTPUT_OFFSET in the + // output section. An OUTPUT_OFFSET of -1 means that the bytes are + // discarded. + void + add_mapping(Relobj* object, unsigned int shndx, off_t offset, off_t length, + off_t output_offset); + + // Return the output offset for an input address. The input address + // is at offset OFFSET in section SHNDX in OBJECT. This sets + // *OUTPUT_OFFSET to the offset in the output section; this will be + // -1 if the bytes are not being copied to the output. This returns + // true if the mapping is known, false otherwise. + bool + get_output_offset(const Relobj* object, unsigned int shndx, off_t offset, + off_t *output_offset) const; + + private: + // We build a mapping from OBJECT/SHNDX/OFFSET to an offset and + // length in the output section. + struct Merge_key + { + const Relobj* object; + unsigned int shndx; + off_t offset; + }; + + struct Merge_key_less + { + bool + operator()(const Merge_key&, const Merge_key&) const; + }; + + struct Merge_value + { + off_t length; + off_t output_offset; + }; + + typedef std::map<Merge_key, Merge_value, Merge_key_less> Merge_mapping; + + // A mapping from input object/section/offset to offset in output + // section. + Merge_mapping merge_map_; +}; + // A general class for SHF_MERGE data, to hold functions shared by // fixed-size constant data and string data. @@ -41,10 +97,10 @@ class Output_merge_base : public Output_section_data : Output_section_data(addralign), merge_map_(), entsize_(entsize) { } - // Return the output address for an input address. + // Return the output offset for an input offset. bool - do_output_address(const Relobj* object, unsigned int shndx, off_t offset, - uint64_t output_section_address, uint64_t* poutput) const; + do_output_offset(const Relobj* object, unsigned int shndx, off_t offset, + off_t* poutput) const; protected: // Return the entry size. @@ -56,30 +112,15 @@ class Output_merge_base : public Output_section_data // OBJECT to an OUTPUT_OFFSET in the output section. void add_mapping(Relobj* object, unsigned int shndx, off_t offset, - off_t output_offset); - - private: - // We build a mapping from OBJECT/SHNDX/OFFSET to an offset in the - // output section. - struct Merge_key + off_t length, off_t output_offset) { - const Relobj* object; - unsigned int shndx; - off_t offset; - }; - - struct Merge_key_less - { - bool - operator()(const Merge_key&, const Merge_key&) const; - }; - - typedef std::map<Merge_key, off_t, Merge_key_less> Merge_map; + this->merge_map_.add_mapping(object, shndx, offset, length, output_offset); + } + private: // A mapping from input object/section/offset to offset in output // section. Merge_map merge_map_; - // The entry size. For fixed-size constants, this is the size of // the constants. For strings, this is the size of a character. uint64_t entsize_; @@ -221,10 +262,13 @@ class Output_merge_string : public Output_merge_base off_t offset; // The string itself, a pointer into a Stringpool. const Char_type* string; + // The length of the string in bytes, including the null terminator. + size_t length; Merged_string(Relobj *objecta, unsigned int shndxa, off_t offseta, - const Char_type* stringa) - : object(objecta), shndx(shndxa), offset(offseta), string(stringa) + const Char_type* stringa, size_t lengtha) + : object(objecta), shndx(shndxa), offset(offseta), string(stringa), + length(lengtha) { } }; |