2012-07-10 52 views
0

我正在鏈接一個導入兩個從屬dylib中定義的符號的二進制文件,並且我無法讓ld選擇正確的符號。從鏈接上從錯誤的dylib中拾取的符號

符號爲_init_process,它在libSystem.dylib(隱式添加ld)和libida.dylib(我們的庫)中定義。我想ld挑選libida,但我不能讓它工作。

下面是最終鏈接器命令行:

/usr/libexec/gcc/i686-apple-darwin10/4.2.1/ld -dynamic -dylib 
-dylib_compatibility_version 1.0 -dylib_current_version 1.0 -arch 
i386 -macosx_version_min 10.5 -macosx_version_min 10.5 
-single_module -weak_reference_mismatches non-weak -w -o 
../../bin/x86_mac_gcc/plugins/python.pmc -ldylib1.10.5.o 
-L../../bin/x86_mac_gcc/ 
-L/Developer/SDKs/MacOSX10.5.sdk/usr/lib/i686-apple-darwin10/4.2.1 
-L/Developer/SDKs/MacOSX10.5.sdk/usr/lib 
-L/usr/lib/gcc/i686-apple-darwin10/4.2.1 
-L/usr/lib/gcc/i686-apple-darwin10/4.2.1 
-L/Developer/SDKs/MacOSX10.5.sdk/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../../i686-apple-darwin10/4.2.1 
-L/Developer/SDKs/MacOSX10.5.sdk/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../.. 
-v -lpthread ../../lib/x86_mac_gcc_32/libiconv.2.2.0.dylib 
obj/x86_mac_gcc_32/python.o32 obj/x86_mac_gcc_32/idaapi.o32 -lida 
-install_name python.pmc -lpython2.6 -ldl -why_load 
-search_paths_first -t -lstdc++ -lgcc_s.10.5 -lgcc -lSystem 

正如你所看到的,-lida來-lSystem之前,所以我希望ld先挑libida.dylib,但它不發生的事情:

dlopen(/home/test/build/bin/x86_mac_gcc/plugins/python.pmc): dlopen(/home/test/build/bin/x86_mac_gcc/plugins/python.pmc, 2): Symbol not found: _init_process 
    Referenced from: /home/test/build/bin/x86_mac_gcc/plugins/python.pmc 
    Expected in: /usr/lib/libSystem.B.dylib 
in /home/test/build/bin/x86_mac_gcc/plugins/python.pmc 
/home/test/build/bin/x86_mac_gcc/plugins/python.pmc: can't load file 

從鏈接器輸出調試:

Library search paths: 
    ../../bin/x86_mac_gcc/ 
    /Developer/SDKs/MacOSX10.5.sdk/usr/lib/i686-apple-darwin10/4.2.1 
    /Developer/SDKs/MacOSX10.5.sdk/usr/lib 
    /usr/lib/gcc/i686-apple-darwin10/4.2.1 
    /usr/lib/gcc/i686-apple-darwin10/4.2.1 
    /Developer/SDKs/MacOSX10.5.sdk/usr/lib/i686-apple-darwin10/4.2.1 
    /Developer/SDKs/MacOSX10.5.sdk/usr/lib 
    /usr/lib 
    /usr/local/lib 
Framework search paths: 
    /Library/Frameworks/ 
    /System/Library/Frameworks/ 
/Developer/SDKs/MacOSX10.5.sdk/usr/lib/dylib1.10.5.o 
/Developer/SDKs/MacOSX10.5.sdk/usr/lib/libpthread.dylib 
../../lib/x86_mac_gcc_32/libiconv.2.2.0.dylib 
obj/x86_mac_gcc_32/python.o32 
obj/x86_mac_gcc_32/idaapi.o32 
../../bin/x86_mac_gcc//libida.dylib 
/usr/lib/libpython2.6.dylib 
/Developer/SDKs/MacOSX10.5.sdk/usr/lib/libdl.dylib 
/Developer/SDKs/MacOSX10.5.sdk/usr/lib/i686-apple-darwin10/4.2.1/libstdc++.dylib 
/Developer/SDKs/MacOSX10.5.sdk/usr/lib/libgcc_s.10.5.dylib 
/usr/lib/gcc/i686-apple-darwin10/4.2.1/libgcc.a 
/Developer/SDKs/MacOSX10.5.sdk/usr/lib/libSystem.dylib 
/usr/lib/system/libmathCommon.A.dylib 

回答

0

解決它。罪魁禍首是-lpthread - pthread是一個符號鏈接libSystem中:

$ ls -la /Developer/SDKs/MacOSX10.5.sdk/usr/lib/libpthread.dylib 
lrwxr-xr-x 1 root wheel 15 Nov 9 2011 /Developer/SDKs/MacOSX10.5.sdk/usr/lib/libpthread.dylib -> libSystem.dylib 

-lida後轉移後,一切正常。