// // KSDynamicLinker.h // // Created by Karl Stenerud on 2013-10-02. // // Copyright (c) 2012 Karl Stenerud. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall remain in place // in this source code. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // #ifndef HDR_KSDynamicLinker_h #define HDR_KSDynamicLinker_h #ifdef __cplusplus extern "C" { #endif #include #include #include typedef struct { uint64_t address; uint64_t vmAddress; uint64_t size; const char* name; const uint8_t* uuid; int cpuType; int cpuSubType; uint64_t majorVersion; uint64_t minorVersion; uint64_t revisionVersion; const char* crashInfoMessage; const char* crashInfoMessage2; } KSBinaryImage; /** Get the number of loaded binary images. */ int ksdl_imageCount(void); /** Get information about a binary image. * * @param index The binary index. * * @param buffer A structure to hold the information. * * @return True if the image was successfully queried. */ bool ksdl_getBinaryImage(int index, KSBinaryImage* buffer); /** Get information about a binary image based on mach_header. * * @param header_ptr The pointer to mach_header of the image. * * @param image_name The name of the image. * * @param buffer A structure to hold the information. * * @return True if the image was successfully queried. */ bool ksdl_getBinaryImageForHeader(const void* const header_ptr, const char* const image_name, KSBinaryImage* buffer); /** Find a loaded binary image with the specified name. * * @param imageName The image name to look for. * * @param exactMatch If true, look for an exact match instead of a partial one. * * @return the index of the matched image, or UINT32_MAX if not found. */ uint32_t ksdl_imageNamed(const char* const imageName, bool exactMatch); /** Get the UUID of a loaded binary image with the specified name. * * @param imageName The image name to look for. * * @param exactMatch If true, look for an exact match instead of a partial one. * * @return A pointer to the binary (16 byte) UUID of the image, or NULL if it * wasn't found. */ const uint8_t* ksdl_imageUUID(const char* const imageName, bool exactMatch); /** async-safe version of dladdr. * * This method searches the dynamic loader for information about any image * containing the specified address. It may not be entirely successful in * finding information, in which case any fields it could not find will be set * to NULL. * * Unlike dladdr(), this method does not make use of locks, and does not call * async-unsafe functions. * * @param address The address to search for. * @param info Gets filled out by this function. * @return true if at least some information was found. */ bool ksdl_dladdr(const uintptr_t address, Dl_info* const info); #ifdef __cplusplus } #endif #endif // HDR_KSDynamicLinker_h