00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00038 #include "blocxx/BLOCXX_config.h"
00039 #if defined(BLOCXX_USE_DYLD)
00040 #include "blocxx/dyldSharedLibraryLoader.hpp"
00041 #include "blocxx/dyldSharedLibrary.hpp"
00042 #include "blocxx/Format.hpp"
00043
00044 namespace BLOCXX_NAMESPACE
00045 {
00046
00047 namespace
00048 {
00049 String COMPONENT_NAME("blocxx.dyldSharedLibraryLoader");
00050 }
00051
00052 std::ostream& operator<<(std::ostream& o, NSObjectFileImageReturnCode code)
00053 {
00054 #define SIMPLE_NSOBJ_CASE(X) case X: o << ""#X
00055 switch (code)
00056 {
00057 SIMPLE_NSOBJ_CASE(NSObjectFileImageFailure);
00058 break;
00059 SIMPLE_NSOBJ_CASE(NSObjectFileImageSuccess);
00060 break;
00061 SIMPLE_NSOBJ_CASE(NSObjectFileImageInappropriateFile);
00062 break;
00063 SIMPLE_NSOBJ_CASE(NSObjectFileImageArch);
00064 break;
00065 SIMPLE_NSOBJ_CASE(NSObjectFileImageFormat);
00066 break;
00067 SIMPLE_NSOBJ_CASE(NSObjectFileImageAccess);
00068 break;
00069 }
00070 #undef SIMPLE_NSOBJ_CASE
00071 return o;
00072 }
00073
00075 SharedLibraryRef
00076 dyldSharedLibraryLoader::loadSharedLibrary(const String& filename) const
00077 {
00078 Logger logger(COMPONENT_NAME);
00079 BLOCXX_LOG_DEBUG2(logger, Format("Load request for %1 received.", filename));
00080 NSObjectFileImage image = 0;
00081 NSObjectFileImageReturnCode dsoerr = NSCreateObjectFileImageFromFile(filename.c_str(), &image);
00082 const char* err_msg = NULL;
00083 NSModule libhandle = NULL;
00084
00085 if (dsoerr == NSObjectFileImageSuccess)
00086 {
00087 libhandle = NSLinkModule(image, filename.c_str(), NSLINKMODULE_OPTION_RETURN_ON_ERROR | NSLINKMODULE_OPTION_PRIVATE);
00088 if (!libhandle)
00089 {
00090 NSLinkEditErrors errors;
00091 int errorNumber;
00092 const char *fileName;
00093 NSLinkEditError(&errors, &errorNumber, &fileName, &err_msg);
00094 }
00095 NSDestroyObjectFileImage(image);
00096 }
00097 else
00098 {
00099 err_msg = "cannot create object file image";
00100 BLOCXX_LOG_ERROR(logger, Format("NSCreateObject: %1 failed with error %2",
00101 filename, dsoerr));
00102 }
00103
00104
00105
00106 if (libhandle)
00107 {
00108 try
00109 {
00110 return SharedLibraryRef( new dyldSharedLibrary(libhandle,
00111 filename));
00112 }
00113 catch (...)
00114 {
00115 NSUnLinkModule(libhandle, FALSE);
00116 throw;
00117 }
00118 }
00119 else
00120 {
00121 BLOCXX_LOG_ERROR(logger, Format("dyldSharedLibraryLoader::loadSharedLibrary:"
00122 " %1", err_msg));
00123 return SharedLibraryRef( 0 );
00124 }
00125 }
00127 SharedLibraryLoaderRef
00128 SharedLibraryLoader::createSharedLibraryLoader()
00129 {
00130 return SharedLibraryLoaderRef(new dyldSharedLibraryLoader);
00131 }
00133 dyldSharedLibraryLoader::~dyldSharedLibraryLoader()
00134 {
00135 }
00136
00137 }
00138
00139 #endif // #if defined(BLOCXX_USE_DYLD)