Определить, находится ли код в Framework или App vs. Bundle - PullRequest
0 голосов
/ 16 января 2019

Есть ли способ определить, находится ли компилируемый код в Framework, Bundle или динамической библиотеке?

Причина в том, что библиотека репортеров сбоев должна знать, существует ли переменная структуры, прежде чем получить ее адрес.

IE:

#ifdef MH_EXECUTE_SYM
return (uint8_t*)&_mh_execute_header;
#else
return (uint8_t*)&_mh_dylib_header;
#endif

Проблема в том, что MH_EXECUTE_SYM, MH_BUNDLE_SYM, MH_DYLIB_SYM всегда определены для каждого вида исполняемого файла, пакета, фреймворка.

Так что мне нужен способ определить, какая структурная переменная должна принимать адрес .. Есть идеи?

1 Ответ

0 голосов
/ 16 января 2019

Похоже, вы действительно хотите получить указатель на соответствующий mach_header_64 (или mach_header в 32-разрядных системах).

Если у вас есть указатель, вы можете использовать функцию dladdr, чтобы выяснить, с какой (если есть) машины, с которой он был загружен. Эта функция заполняет структуру Dl_info, которая включает, помимо прочего, указатель на mach_header_64 для mach-o.

// For TARGET_RT_64_BIT:
#import <TargetConditionals.h>

// For dladdr:
#import <dlfcn.h>

// For mach_header and mach_header_64:
#import <mach-o/loader.h>

#ifdef TARGET_RT_64_BIT

struct mach_header_64 *mach_header_for_address(const void *address) {
    Dl_info info;
    if (dladdr(address, &info) == 0) {
        // address doesn't point into a mach-o.
        return 0;
    }
    struct mach_header_64 *header = (struct mach_header_64 *)info.dli_fbase;
    if (header->magic != MH_MAGIC_64) {
        // Something went wrong...
        return 0;
    }

    return header;
}

#else

struct mach_header mach_header_for_address(const void *address) {
    Dl_info info;
    if (dladdr(address, &info) == 0) {
        // address doesn't point into a mach-o.
        return 0;
    }
    struct mach_header *header = (struct mach_header *)info.dli_fbase;
    if (header->magic != MH_MAGIC) {
        // Something went wrong...
        return 0;
    }

    return header;
}

#endif
...