Размещение символов в 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
, но ни один из них, похоже, не работал.)