Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set the runtime path (-rpath) of an executable with gcc under Mac OSX?

I want to set under Mac OSX the runtime path of an executable (for the linker) at compile time, such that shared libraries at non-standard locations are found by the dynamic linker at program start.

Under Linux this is possible with -Xlinker -rpath -Xlinker /path/to (or using -Wl,-rpath,/path/to) and under Solaris you can add -R/path/to to the compiler command line.

I found some information that Mac OS X gcc has -rpath support since 10.5, i.e. since ~ 2008.

I tried to get it working with a minimal example - without success:

$ cat blah.c  int blah(int b) {   return b+1; } 

And:

$ cat main.c   #include <stdio.h>  int blah(int);  int main () {   printf("%d\n", blah(22));   return 0; } 

Compiled it like this:

$ gcc -c  blah.c $ gcc -dynamiclib blah.o -o libblah.dylib $ gcc main.c -lblah -L`pwd`  -Xlinker -rpath -Xlinker `pwd`/t 

Now the test:

$ 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 

Thus the question: How to I set the runtime path for the linker under Mac OSX?

Btw, setting DYLD_LIBRARY_PATH works - but I don't want to use this hack.

Edit: Regarding 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) 

It seems that otool -L only prints the library names (and probable the locations at link time) the executable was linked against and no runtime path information.

like image 495
maxschlepzig Avatar asked Dec 22 '10 21:12

maxschlepzig


People also ask

What is Rpath on Mac?

@rpath stands for Runpath Search Path. In the Xcode, it's set with LD_RUNPATH_SEARCH_PATH setting. In ld command tool it's set with -rpath parameter when linking. So it's a search path for the linker. Runtime Search Path instructs the dynamic linker to search a list of paths in order, to locate the dynamic library.

What is Rpath in GCC?

In computing, rpath designates the run-time search path hard-coded in an executable file or library. Dynamic linking loaders use the rpath to find required libraries. Specifically, it encodes a path to shared libraries into the header of an executable (or another shared library).

What is rpath ORIGIN?

What is RPATH and $ORIGIN. RPATH stands for run-time search path. According to Wikipedia, “rpath designates the run-time search path hard-coded in an executable file or library.


1 Answers

Found by experimentation, and inspecting the command lines generated by Xcode for a reference rpath demo project by Dave Driblin:

otool -L shows you the install name of the linked libraries. To get @rpath to work, you need to change the install name of the library:

$ 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` 
like image 142
Ben Karel Avatar answered Sep 20 '22 18:09

Ben Karel