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
00037 #include "blocxx/BLOCXX_config.h"
00038 #if defined(BLOCXX_USE_DYLD)
00039 #include "blocxx/dyldSharedLibraryLoader.hpp"
00040 #include "blocxx/dyldSharedLibrary.hpp"
00041 #include "blocxx/Format.hpp"
00042
00043 namespace BLOCXX_NAMESPACE
00044 {
00045
00046 std::ostream& operator<<(std::ostream& o, NSObjectFileImageReturnCode code)
00047 {
00048 #define SIMPLE_NSOBJ_CASE(X) case X: o << ""#X
00049 switch (code)
00050 {
00051 SIMPLE_NSOBJ_CASE(NSObjectFileImageFailure);
00052 break;
00053 SIMPLE_NSOBJ_CASE(NSObjectFileImageSuccess);
00054 break;
00055 SIMPLE_NSOBJ_CASE(NSObjectFileImageInappropriateFile);
00056 break;
00057 SIMPLE_NSOBJ_CASE(NSObjectFileImageArch);
00058 break;
00059 SIMPLE_NSOBJ_CASE(NSObjectFileImageFormat);
00060 break;
00061 SIMPLE_NSOBJ_CASE(NSObjectFileImageAccess);
00062 break;
00063 }
00064 #undef SIMPLE_NSOBJ_CASE
00065 return o;
00066 }
00067
00069 SharedLibraryRef
00070 dyldSharedLibraryLoader::loadSharedLibrary(const String& filename,
00071 const LoggerRef& logger) const
00072 {
00073 BLOCXX_LOG_DEBUG(logger, Format("Load request for %1 received.", filename));
00074 NSObjectFileImage image = 0;
00075 NSObjectFileImageReturnCode dsoerr = NSCreateObjectFileImageFromFile(filename.c_str(), &image);
00076 const char* err_msg = NULL;
00077 NSModule libhandle = NULL;
00078
00079 if (dsoerr == NSObjectFileImageSuccess)
00080 {
00081 libhandle = NSLinkModule(image, filename.c_str(), NSLINKMODULE_OPTION_RETURN_ON_ERROR | NSLINKMODULE_OPTION_PRIVATE);
00082 if (!libhandle)
00083 {
00084 NSLinkEditErrors errors;
00085 int errorNumber;
00086 const char *fileName;
00087 NSLinkEditError(&errors, &errorNumber, &fileName, &err_msg);
00088 }
00089 NSDestroyObjectFileImage(image);
00090 }
00091 else if ((dsoerr == NSObjectFileImageFormat ||
00092 dsoerr == NSObjectFileImageInappropriateFile) &&
00093 NSAddLibrary(filename.c_str()) == TRUE)
00094 {
00095 BLOCXX_LOG_ERROR(logger, Format("NSCreateObject: %1 failed with error \"%2\"",
00096 filename, dsoerr));
00097
00098 }
00099 else
00100 {
00101 err_msg = "cannot create object file image or add library";
00102 BLOCXX_LOG_ERROR(logger, Format("NSCreateObject: %1 failed with error %2",
00103 filename, dsoerr));
00104 }
00105
00106
00107
00108 if (libhandle)
00109 {
00110 try
00111 {
00112 return SharedLibraryRef( new dyldSharedLibrary(libhandle,
00113 filename));
00114 }
00115 catch (...)
00116 {
00117 NSUnLinkModule(libhandle, FALSE);
00118 throw;
00119 }
00120 }
00121 else
00122 {
00123 BLOCXX_LOG_ERROR(logger, Format("dyldSharedLibraryLoader::loadSharedLibrary:"
00124 " %1", err_msg));
00125 return SharedLibraryRef( 0 );
00126 }
00127 }
00129 SharedLibraryLoaderRef
00130 SharedLibraryLoader::createSharedLibraryLoader()
00131 {
00132 return SharedLibraryLoaderRef(new dyldSharedLibraryLoader);
00133 }
00135 dyldSharedLibraryLoader::~dyldSharedLibraryLoader()
00136 {
00137 }
00138
00139 }
00140
00141 #endif // #if defined(BLOCXX_USE_DYLD)