diff --git a/makefile b/makefile index 9cdd151cdb..e4d31bfe01 100644 --- a/makefile +++ b/makefile @@ -82,7 +82,7 @@ endif ifeq ($(platform),darwin) build-cflags = $(common-cflags) -fPIC -fvisibility=hidden \ -I$(JAVA_HOME)/include/linux -I$(src) - lflags = $(common-lflags) -ldl + lflags = $(common-lflags) -ldl -framework CoreFoundation strip-all = -S -x binaryToMacho = $(native-build)/binaryToMacho endif diff --git a/src/posix.cpp b/src/posix.cpp index 4f3b46857a..635c7c088d 100644 --- a/src/posix.cpp +++ b/src/posix.cpp @@ -1,3 +1,7 @@ +#ifdef __APPLE__ +#include "CoreFoundation/CoreFoundation.h" +#undef assert +#endif #include "sys/mman.h" #include "sys/types.h" #include "sys/stat.h" @@ -116,6 +120,28 @@ allocate(System* s, unsigned size) return p; } +void +pathOfExecutable(System* s, const char** retBuf, unsigned* size) +{ +#ifdef __APPLE__ + CFBundleRef bundle = CFBundleGetMainBundle(); + CFURLRef url = CFBundleCopyExecutableURL(bundle); + CFStringRef path = CFURLCopyPath(url); + CFIndex pathSize = CFStringGetMaximumSizeOfFileSystemRepresentation(path); + char* buffer = reinterpret_cast(allocate(s, pathSize)); + if (CFStringGetFileSystemRepresentation(path, buffer, pathSize)) { + *size = pathSize; + *retBuf = buffer; + } else { + abort(); + } +#else + if (s) + *size = 0; + *retBuf = NULL; +#endif +} + const bool Verbose = false; const unsigned Waiting = 1 << 0; @@ -646,6 +672,7 @@ class MySystem: public System { bool mapName) { void* p; + bool alreadyAllocated = false; unsigned nameLength = (name ? strlen(name) : 0); if (mapName) { unsigned size = nameLength + 3 + sizeof(SO_SUFFIX); @@ -653,6 +680,10 @@ class MySystem: public System { snprintf(buffer, size, "lib%s" SO_SUFFIX, name); p = dlopen(buffer, RTLD_LAZY); } else { + if (!name) { + pathOfExecutable(this, &name, &nameLength); + alreadyAllocated = true; + } p = dlopen(name, RTLD_LAZY); } @@ -665,6 +696,9 @@ class MySystem: public System { if (name) { n = static_cast(allocate(this, nameLength + 1)); memcpy(n, name, nameLength + 1); + if (alreadyAllocated) { + free(name, nameLength, false); + } } else { n = 0; } diff --git a/src/process.cpp b/src/process.cpp index 6ab36f49ca..8f2d5e62ac 100644 --- a/src/process.cpp +++ b/src/process.cpp @@ -170,7 +170,7 @@ resolveNativeMethod2(Thread* t, object method) snprintf(decorated + decoratedSize - 1, 5, "@%d", footprint * BytesPerWord); - p = resolveNativeMethod(t, undecorated, decorated); + p = ::resolveNativeMethod(t, undecorated, decorated); if (p) { return p; }