Как установить путь выполнения (-rpath) исполняемого файла с gcc под Mac OSX?
Я хочу установить в Mac OSX путь выполнения исполняемого файла (для компоновщика) во время компиляции, чтобы динамические компоновщики при запуске программы находили динамические компоновщики в нестандартных местах.
Под Linux это возможно с -Xlinker -rpath -Xlinker /path/to
(или используя -Wl,-rpath,/path/to
) а под солярис можно добавить -R/path/to
в командной строке компилятора.
Я нашел некоторую информацию о том, что Mac OS X gcc имеет поддержку -rpath с 10.5, то есть с ~ 2008 года.
Я попытался заставить его работать с минимальным примером - без успеха:
$ cat blah.c
int blah(int b)
{
return b+1;
}
А также:
$ cat main.c
#include <stdio.h>
int blah(int);
int main ()
{
printf("%d\n", blah(22));
return 0;
}
Скомпилировал это так:
$ gcc -c blah.c
$ gcc -dynamiclib blah.o -o libblah.dylib
$ gcc main.c -lblah -L`pwd` -Xlinker -rpath -Xlinker `pwd`/t
Теперь тест:
$ mkdir t
$ mv libblah.dylib t
$ ./a.out
dyld: Library not loaded: libblah.dylib
Referenced from: /Users/max/test/./a.out
Reason: image not found
Trace/BPT trap
Таким образом, вопрос: как установить путь выполнения для компоновщика под Mac OSX?
Кстати, настройка DYLD_LIBRARY_PATH
работает - но я не хочу использовать этот хак.
Изменить: Относительно otool -L
:
$ otool -L a.out
a.out:
libblah.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1)
Кажется, что otool -L
печатает только имена библиотек (и, вероятно, местоположения во время соединения), с которыми был связан исполняемый файл, а не информацию о пути выполнения.
1 ответ
Найден экспериментальным путем и проверкой командных строк, сгенерированных Xcode, для демонстрационного демонстрационного проекта rpath Дейва Дриблина:
otool -L
показывает имя установки связанных библиотек. Получить @rpath
Для работы необходимо изменить имя установки библиотеки:
$ gcc -dynamiclib blah.o -install_name @rpath/t/libblah.dylib -o libblah.dylib
$ mkdir t ; mv libblah.dylib t/
$ gcc main.c -lblah -L`pwd`/t -Xlinker -rpath -Xlinker `pwd`