2014-10-30 18 views
5

Ho avuto qualche problema con la versione installata di libsasl2 (Cyrus SASL).Is libsasl2 è rotto su OSX Yosemite? Manca sasl_client_done

In particolare, sembra che le intestazioni locali e la versione sasl_version riportino la versione 2.1.26, ma non viene fornito alcun simbolo per la funzione globale sasl_client_done.

Sono abbastanza sicuro che dovrei avere quel simbolo perché:

  • E 'lì nel sasl/intestazione sasl.h fornito
  • I cyrsus SASL NEWS elenchi di file "sasl_client_done Implementato()/sasl_server_done()" come una caratteristica 2.1.24
  • E 'lì tutto il mondo che fornisce 2.1.26 al di fuori di Yosemite

Per una riproduzione:

  • notare che l'esempio di seguito stampe
    • "impl: 'Cyrus SASL', versione: 33.619.994, importante: 2, minore: 1, step: 26"
  • campione compila ed esegue su un linux installazione con la stessa versione della libreria dopo decommentando il codice

il codice senza commenti produce un errore di collegamento su Yosemite

Undefined symbols for architecture x86_64: 
    "_sasl_client_done", referenced from: 
     _main in foo-072675.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

invocando il compilatore con:

clang -Wall -Werror -lsasl2 -o foo foo.c -v 

con clang -v di:

Apple LLVM version 6.0 (clang-600.0.54) (based on LLVM 3.5svn) 
Target: x86_64-apple-darwin14.0.0 
Thread model: posix 
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" -cc1 -triple x86_64-apple-macosx10.10.0 -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -main-file-name foo.c -mrelocation-model pic -pic-level 2 -mdisable-fp-elim -masm-verbose -munwind-tables -target-cpu core2 -target-linker-version 241.9 -v -resource-dir /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.0 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk -Wall -Werror -fdebug-compilation-dir /Users/jcarey/work -ferror-limit 19 -fmessage-length 0 -stack-protector 1 -mstackrealign -fblocks -fobjc-runtime=macosx-10.10.0 -fencode-extended-block-signature -fdiagnostics-show-option -vectorize-slp -o /var/folders/wq/jypwqgv976n0db5l5qxw900r0000gq/T/foo-92054e.o -x c foo.c 
clang -cc1 version 6.0 based upon LLVM 3.5svn default target x86_64-apple-darwin14.0.0 
ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/local/include" 
ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/Library/Frameworks" 
#include "..." search starts here: 
#include <...> search starts here: 
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.0/include 
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include 
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include 
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/System/Library/Frameworks (framework directory) 
End of search list. 
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -dynamic -arch x86_64 -macosx_version_min 10.10.0 -syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk -o foo -lsasl2 /var/folders/wq/jypwqgv976n0db5l5qxw900r0000gq/T/foo-92054e.o -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.0/lib/darwin/libclang_rt.osx.a 
Undefined symbols for architecture x86_64: 
    "_sasl_client_done", referenced from: 
     _main in foo-92054e.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

E il codice in questione:

#include <sasl/sasl.h> 
#include <stdio.h> 
#include <stdint.h> 

int main(int argc, char ** argv) { 
    const char *impl; 
    int version; 
    uint32_t buf; 
    uint16_t major; 
    uint8_t minor; 
    uint8_t step; 

    sasl_version(&impl, &version); 

    buf = version; 

    major = buf >> 24; 
    minor = (buf << 8) >> 24; 
    step = (buf << 24) >> 24; 

    printf("impl: '%s', version: %d, major: %d, minor: %d, step: %d\n", impl, version, major, minor, step); 

    /* 
    { 
     int (* scd)(void); 

     scd = &sasl_client_done; 

     printf("sasl_client_done: %p\n", scd); 
    } 
    */ 

    return 0; 
} 

sto pensando che qualcosa di irregolare, con la come cyrus sasl è stato confezionato per Yosemite (usando forse un elenco di simboli da Mavericks?).

+0

L'utilità che stai cercando è nm. Esegui 'nm/usr/lib/libsasl2.dylib' per vedere tutti i simboli. E scoprirai che in effetti non ha 'sasl_client_done' in Yosemite. La libreria è chiamata 'libsasl2.2 *', ma a quanto pare ciò non significa che non sia realmente versione 2.1.x diversa per OS X. – indiv

+0

Ho familiarità con nm, ma ho capito che la combinazione di un errore nel collegamento con un major.minor.step segnalato sasl_version() di 2.1.26 della stessa catena di collegamento è stato più utile. C'era il mondo in cui le intestazioni non corrispondevano al dylib spedito (sasl_version return (<2.1.24)), quindi a quello in cui credo di trovarmi (dove non hanno rispettato la macro di esportazione LIBSASL_API). nm non aiuta a differenziare – hanumantmk

risposta

2

Come una questione di interesse, ho appena controllato con 10.10.4 e vedo il simbolo è ora c'è:

$ nm /usr/lib/libsasl2.dylib |grep sasl_client_done 
000000000000724a T _sasl_client_done 

Il codice di esempio ora funziona bene (con la sezione commentata ora commentata). La stessa versione di Cyrus SASL viene comunque restituita:

impl: 'Cyrus SASL', version: 33619994, major: 2, minor: 1, step: 26 
sasl_client_done: 0x7fff8e3dc24a 
Problemi correlati