Размещение символов в macOS

У меня есть программа, которая ссылается на общую библиотеку. Я хочу переопределить одну из функций внутри моей программы, чтобы внутренние вызовы этой функции изнутри libfooразрешить определение в моей программе. (Для контекста я намерен имитировать библиотечную функцию для тестирования.)

Этот вопрос как бы связан с этим: поиск символов в разделяемых библиотеках . Это пример из этого вопроса:

      // foo.c
void dispatch_write_hello(void) {
    fprintf(stderr, "hello\n");
}

void print_hello(void) {
    dispatch_write_hello();
}

// main.c
extern void print_hello(void);

void dispatch_write_hello(void) {
    fprintf(stderr, "overridden\n");
}

int main(int argc, char **argv) {
    print_hello();
    return 0;
}

Вот что он делает в Linux:

      $ clang -shared -fPIC foo.c -o libfoo.so
$ clang main.c -L. -lfoo
$ LD_LIBRARY_PATH=. ./a.out
overridden

Это то поведение, которое я хочу, но в macOS я получаю следующее:

      $ clang -dynamiclib -fPIC foo.c -o libfoo.dylib
$ clang main.c -L. -lfoo
$ ./a.out
hello

Как я могу добиться поведения примера linux на macOS? Предпочтительно мне нужен один подход, который работает как в Linux, так и в MacOS, но я думаю, это нормально, если мне нужно использовать специфичные для Mac OS флаги сборки и / или переменные среды.

1 ответ

Я смог добиться этого, добавив -Wl,-flat_namespace при построении библиотеки.

(Я также пробовал другие фольклорные произведения из Интернета, включая -Wl,-force_flat_namespace при связывании программы или запуске программы с DYLD_FORCE_FLAT_NAMESPACE=1, но ни один из них, похоже, не работал.)

Другие вопросы по тегам