У меня есть специализированная разделяемая библиотека, которая загружается динамически во время выполнения исполняемого файла. Эта библиотека предоставляет функцию b(). Эта функция, в свою очередь, вызывает функцию a().

Функция a определена в исполняемом файле, а не в самой библиотеке, поэтому я хотел бы иметь возможность вызывать часть моего исполняемого кода из библиотеки. Мне удалось использовать флаг -undefined dynamic_lookup, чтобы clang оставил эти символы для ленивого связывания, но dyld все еще жалуется, когда я пытаюсь запустить исполняемый файл:

dyld: lazy symbol binding failed: Symbol not found: _a
  Referenced from: /usr/local/lib/myLib.dylib
  Expected in: flat namespace

Как связать этот символ?

1
Alexis King 3 Фев 2013 в 13:58
Почему не dlopen() исполняемый файл и dlsym() функция? Я не думаю, что нынешний подход осуществим.
 – 
user529758
3 Фев 2013 в 14:01
Я уже dlopen загружаю библиотеку. Моя цель - затем иметь возможность вызывать функцию, которая находится в исполняемом файле, загружающем библиотеку.
 – 
Alexis King
3 Фев 2013 в 14:02
Прочтите мой комментарий еще раз. "Почему не dlopen() исполняемый файл ?"
 – 
user529758
3 Фев 2013 в 14:03
Я прочитал это, но этот ответ, кажется, указывает на то, что мне не нужно делать что. Даже если мне это нужно, как я могу определить местоположение исполняемого файла, загружающего библиотеку?
 – 
Alexis King
3 Фев 2013 в 23:40

1 ответ

Лучший ответ

Как оказалось, это было вызвано тем, что Xcode не экспортирует символ по умолчанию. Вы можете исправить это, изменив параметр «Символы, скрытые по умолчанию» в настройках сборки LLVM Code Generation. Если вы не используете Xcode, это определяет, следует ли использовать флаг -fvisiblity=hidden в командной строке.

Кроме того, вы можете оставить этот параметр включенным и выборочно экспортировать символы, добавив атрибут __attribute__((visibility("default"))) к функциям, которые вы хотите экспортировать.

0
Alexis King 3 Фев 2013 в 23:56