macos - मैक ओएसएक्स के तहत जीसीसी के साथ निष्पादन योग्य के रनटाइम पथ(-rpath) को कैसे सेट करें?



gcc linker (1)

मैं संकलन समय पर निष्पादन योग्य (लिंकर के लिए) के रनटाइम पथ के मैक ओएसएक्स के तहत सेट करना चाहता हूं, जैसे गैर-मानक स्थानों पर साझा लाइब्रेरी प्रोग्राम प्रारंभ में गतिशील लिंकर द्वारा पाई जाती हैं।

लिनक्स के तहत यह -Xlinker -rpath -Xlinker /path/to (या -Wl,-rpath,/path/to ) का उपयोग करके और सोलारिस के तहत -Wl,-rpath,/path/to आप कंपाइलर कमांड लाइन में -R/path/to जोड़ सकते हैं।

मुझे कुछ जानकारी मिली है कि मैक ओएस एक्स जीसीसी में 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

इस प्रकार सवाल: मैक ओएसएक्स के तहत लिंकर के लिए रनटाइम पथ कैसे सेट किया जाए?

DYLD_LIBRARY_PATH , DYLD_LIBRARY_PATH सेटिंग 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 केवल लाइब्रेरी नामों को मुद्रित करता है (और लिंक समय पर स्थानों को संभावित करता है) निष्पादन योग्य के साथ जुड़ा हुआ था और कोई रनटाइम पथ जानकारी नहीं थी।


प्रयोग द्वारा पाया गया, और डेव ड्रिबलिन द्वारा संदर्भ आरपीएथ डेमो प्रोजेक्ट के लिए एक्सकोड द्वारा उत्पन्न कमांड लाइनों का निरीक्षण करना:

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`




dyld