Index: util/mac/mach_o_image_segment_reader.h |
diff --git a/util/mac/mach_o_image_segment_reader.h b/util/mac/mach_o_image_segment_reader.h |
deleted file mode 100644 |
index 2f5c57e0718f726b4a671bceffb6d1e59f0aad51..0000000000000000000000000000000000000000 |
--- a/util/mac/mach_o_image_segment_reader.h |
+++ /dev/null |
@@ -1,255 +0,0 @@ |
-// Copyright 2014 The Crashpad Authors. All rights reserved. |
-// |
-// Licensed under the Apache License, Version 2.0 (the "License"); |
-// you may not use this file except in compliance with the License. |
-// You may obtain a copy of the License at |
-// |
-// http://www.apache.org/licenses/LICENSE-2.0 |
-// |
-// Unless required by applicable law or agreed to in writing, software |
-// distributed under the License is distributed on an "AS IS" BASIS, |
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-// See the License for the specific language governing permissions and |
-// limitations under the License. |
- |
-#ifndef CRASHPAD_UTIL_MAC_MACH_O_IMAGE_SEGMENT_READER_H_ |
-#define CRASHPAD_UTIL_MAC_MACH_O_IMAGE_SEGMENT_READER_H_ |
- |
-#include <mach/mach.h> |
-#include <stdint.h> |
-#include <sys/types.h> |
- |
-#include <map> |
-#include <string> |
-#include <vector> |
- |
-#include "base/basictypes.h" |
-#include "util/mac/process_types.h" |
-#include "util/misc/initialization_state_dcheck.h" |
- |
-namespace crashpad { |
- |
-//! \brief A reader for `LC_SEGMENT` or `LC_SEGMENT_64` load commands in Mach-O |
-//! images mapped into another process. |
-//! |
-//! This class is capable of reading both `LC_SEGMENT` and `LC_SEGMENT_64` based |
-//! on the bitness of the remote process. |
-//! |
-//! A MachOImageSegmentReader will normally be instantiated by a |
-//! MachOImageReader. |
-class MachOImageSegmentReader { |
- public: |
- MachOImageSegmentReader(); |
- ~MachOImageSegmentReader(); |
- |
- //! \brief Reads the segment load command from another process. |
- //! |
- //! This method must only be called once on an object. This method must be |
- //! called successfully before any other method in this class may be called. |
- //! |
- //! \param[in] process_reader The reader for the remote process. |
- //! \param[in] load_command_address The address, in the remote process’ |
- //! address space, where the `LC_SEGMENT` or `LC_SEGMENT_64` load command |
- //! to be read is located. This address is determined by a Mach-O image |
- //! reader, such as MachOImageReader, as it walks Mach-O load commands. |
- //! \param[in] load_command_info A string to be used in logged messages. This |
- //! string is for diagnostic purposes only, and may be empty. |
- //! |
- //! \return `true` if the load command was read successfully. `false` |
- //! otherwise, with an appropriate message logged. |
- bool Initialize(ProcessReader* process_reader, |
- mach_vm_address_t load_command_address, |
- const std::string& load_command_info); |
- |
- //! \brief Sets the image’s slide value. |
- //! |
- //! This method must only be called once on an object, after Initialize() is |
- //! called successfully. It must be called before Address(), Size(), |
- //! GetSectionByName(), or GetSectionAtIndex() can be called. |
- //! |
- //! This method is provided because slide is a property of the image that |
- //! cannot be determined until at least some segments have been read. As such, |
- //! it is not necessarily known at the time that Initialize() is called. |
- void SetSlide(mach_vm_size_t slide); |
- |
- //! \brief Returns the segment’s name. |
- //! |
- //! The segment’s name is taken from the load command’s `segname` field. |
- //! Common segment names are `"__TEXT"`, `"__DATA"`, and `"__LINKEDIT"`. |
- //! Symbolic constants for these common names are defined in |
- //! `<mach-o/loader.h>`. |
- std::string Name() const; |
- |
- //! \return The segment’s actual load address in memory, adjusted for any |
- //! “slide”. |
- //! |
- //! \note For the segment’s preferred load address, not adjusted for slide, |
- //! use vmaddr(). |
- mach_vm_address_t Address() const; |
- |
- //! \return The segment’s actual size address in memory, adjusted for any |
- //! growth in the case of a nonsliding segment. |
- //! |
- //! \note For the segment’s preferred size, not adjusted for growth, use |
- //! vmsize(). |
- mach_vm_address_t Size() const; |
- |
- //! \brief The segment’s preferred load address. |
- //! |
- //! \return The segment’s preferred load address as stored in the Mach-O file. |
- //! |
- //! \note This value is not adjusted for any “slide” that may have occurred |
- //! when the image was loaded. Use Address() for a value adjusted for |
- //! slide. |
- //! |
- //! \sa MachOImageReader::GetSegmentByName() |
- mach_vm_address_t vmaddr() const { return segment_command_.vmaddr; } |
- |
- //! \brief Returns the segment’s size as mapped into memory. |
- //! |
- //! \note For non-sliding segments, this value is not adjusted for any growth |
- //! that may have occurred when the image was loaded. Use Size() for a |
- //! value adjusted for growth. |
- mach_vm_size_t vmsize() const { return segment_command_.vmsize; } |
- |
- //! \brief Returns the file offset of the mapped segment in the file from |
- //! which it was mapped. |
- //! |
- //! The file offset is the difference between the beginning of the |
- //! `mach_header` or `mach_header_64` and the beginning of the segment’s |
- //! mapped region. For segments that are not mapped from a file (such as |
- //! `__PAGEZERO` segments), this will be `0`. |
- mach_vm_size_t fileoff() const { return segment_command_.fileoff; } |
- |
- //! \brief Returns the number of sections in the segment. |
- //! |
- //! This will return `0` for a segment without any sections, typical for |
- //! `__PAGEZERO` and `__LINKEDIT` segments. |
- //! |
- //! Although the Mach-O file format uses a `uint32_t` for this field, there is |
- //! an overall limit of 255 sections in an entire Mach-O image file (not just |
- //! in a single segment) imposed by the symbol table format. Symbols will not |
- //! be able to reference anything in a section beyond the first 255 in a |
- //! Mach-O image file. |
- uint32_t nsects() const { return segment_command_.nsects; } |
- |
- //! \brief Obtain section information by section name. |
- //! |
- //! \param[in] section_name The name of the section to search for, without the |
- //! leading segment name. For example, use `"__text"`, not |
- //! `"__TEXT,__text"` or `"__TEXT.__text"`. |
- //! \param[out] address The actual address that the section was loaded at in |
- //! memory, taking any “slide” into account if the section did not load at |
- //! its preferred address as stored in the Mach-O image file. This |
- //! parameter can be `nullptr`. |
- //! |
- //! \return A pointer to the section information if it was found, or `nullptr` |
- //! if it was not found. The caller does not take ownership; the lifetime |
- //! of the returned object is scoped to the lifetime of this |
- //! MachOImageSegmentReader object. |
- //! |
- //! \note The process_types::section::addr field gives the section’s preferred |
- //! load address as stored in the Mach-O image file, and is not adjusted |
- //! for any “slide” that may have occurred when the image was loaded. |
- //! |
- //! \sa MachOImageReader::GetSectionByName() |
- const process_types::section* GetSectionByName( |
- const std::string& section_name, |
- mach_vm_address_t* address) const; |
- |
- //! \brief Obtain section information by section index. |
- //! |
- //! \param[in] index The index of the section to return, in the order that it |
- //! appears in the segment load command. Unlike |
- //! MachOImageReader::GetSectionAtIndex(), this is a 0-based index. This |
- //! parameter must be in the range of valid indices aas reported by |
- //! nsects(). |
- //! \param[out] address The actual address that the section was loaded at in |
- //! memory, taking any “slide” into account if the section did not load at |
- //! its preferred address as stored in the Mach-O image file. This |
- //! parameter can be `nullptr`. |
- //! |
- //! \return A pointer to the section information. If \a index is out of range, |
- //! execution is aborted. The caller does not take ownership; the |
- //! lifetime of the returned object is scoped to the lifetime of this |
- //! MachOImageSegmentReader object. |
- //! |
- //! \note The process_types::section::addr field gives the section’s preferred |
- //! load address as stored in the Mach-O image file, and is not adjusted |
- //! for any “slide” that may have occurred when the image was loaded. |
- //! \note Unlike MachOImageReader::GetSectionAtIndex(), this method does not |
- //! accept out-of-range values for \a index, and aborts execution instead |
- //! of returning `nullptr` upon encountering an out-of-range value. This |
- //! is because this method is expected to be used in a loop that can be |
- //! limited to nsects() iterations, so an out-of-range error can be |
- //! treated more harshly as a logic error, as opposed to a data error. |
- //! |
- //! \sa MachOImageReader::GetSectionAtIndex() |
- const process_types::section* GetSectionAtIndex( |
- size_t index, |
- mach_vm_address_t* address) const; |
- |
- //! Returns whether the segment slides. |
- //! |
- //! Most segments slide, but the `__PAGEZERO` segment does not, it grows |
- //! instead. This method identifies non-sliding segments in the same way that |
- //! the kernel does. |
- bool SegmentSlides() const; |
- |
- //! \brief Returns a segment name string. |
- //! |
- //! Segment names may be 16 characters long, and are not necessarily |
- //! `NUL`-terminated. This function will return a segment name based on up to |
- //! the first 16 characters found at \a segment_name_c. |
- static std::string SegmentNameString(const char* segment_name_c); |
- |
- //! \brief Returns a section name string. |
- //! |
- //! Section names may be 16 characters long, and are not necessarily |
- //! `NUL`-terminated. This function will return a section name based on up to |
- //! the first 16 characters found at \a section_name_c. |
- static std::string SectionNameString(const char* section_name_c); |
- |
- //! \brief Returns a segment and section name string. |
- //! |
- //! A segment and section name string is composed of a segment name string |
- //! (see SegmentNameString()) and a section name string (see |
- //! SectionNameString()) separated by a comma. An example is |
- //! `"__TEXT,__text"`. |
- static std::string SegmentAndSectionNameString(const char* segment_name_c, |
- const char* section_name_c); |
- |
- private: |
- //! \brief The internal implementation of Name(). |
- //! |
- //! This is identical to Name() but does not perform the |
- //! InitializationStateDcheck check. It may be called during initialization |
- //! provided that the caller only does so after segment_command_ has been |
- //! read successfully. |
- std::string NameInternal() const; |
- |
- // The segment command data read from the remote process. |
- process_types::segment_command segment_command_; |
- |
- // Section structures read from the remote process in the order that they are |
- // given in the remote process. |
- std::vector<process_types::section> sections_; |
- |
- // Maps section names to indices into the sections_ vector. |
- std::map<std::string, size_t> section_map_; |
- |
- // The image’s slide. Note that the segment’s slide may be 0 and not the value |
- // of the image’s slide if SegmentSlides() is false. In that case, the |
- // segment is extended instead of slid, so its size as loaded will be |
- // increased by this value. |
- mach_vm_size_t slide_; |
- |
- InitializationStateDcheck initialized_; |
- InitializationStateDcheck initialized_slide_; |
- |
- DISALLOW_COPY_AND_ASSIGN(MachOImageSegmentReader); |
-}; |
- |
-} // namespace crashpad |
- |
-#endif // CRASHPAD_UTIL_MAC_MACH_O_IMAGE_SEGMENT_READER_H_ |