Where Am I?
A drop-in two files library to locate the current executable and the current module on the file system.
- QNX Neutrino
whereami.c into your build and get started. (see
also customizing compilation)
wai_getExecutablePath()returns the path of the enclosing executable
wai_getModulePath()returns the path of the enclosing module
- first call
int length = wai_getExecutablePath(NULL, 0, NULL);to retrieve the length of the path
- allocate the destination buffer with
path = (char*)malloc(length + 1);
wai_getExecutablePath(path, length, &dirname_length)again to retrieve the path
- add a terminal
path[length] = '\0';
Here is the output of the example:
$ make -j -C _gnu-make $ cp ./bin/mac-x86_64/library.dylib /tmp/ $ ./bin/mac-x86_64/executable --load-library=/tmp/library.dylib executable path: /Users/gregory/Projects/whereami/bin/mac-x86_64/executable dirname: /Users/gregory/Projects/whereami/bin/mac-x86_64 basename: executable module path: /Users/gregory/Projects/whereami/bin/mac-x86_64/executable dirname: /Users/gregory/Projects/whereami/bin/mac-x86_64 basename: executable library loaded executable path: /Users/gregory/Projects/whereami/bin/mac-x86_64/executable dirname: /Users/gregory/Projects/whereami/bin/mac-x86_64 basename: executable module path: /private/tmp/library.dylib dirname: /private/tmp basename: library.dylib library unloaded
You can customize the library's behavior by defining the following macros:
Compiling for Windows
There is a Visual Studio 2015 solution in the
Compiling for Linux or Mac
There is a GNU Make 3.81
MakeFile in the
$ make -j -C _gnu-make/
Compiling for Mac
See above if you want to compile from command line. Otherwise there is an Xcode
project located in the
Compiling for iOS
There is an Xcode project located in the
If you prefer compiling from command line and deploying to a jailbroken device through SSH, use:
$ make -j -C _gnu-make/ binsubdir=ios CC="$(xcrun --sdk iphoneos --find clang) -isysroot $(xcrun --sdk iphoneos --show-sdk-path) -arch armv7 -arch armv7s -arch arm64" postbuild="codesign -s 'iPhone Developer'"
Compiling for Android
You will have to install the Android NDK, and point the
variable to the NDK path: e.g.
export NDK_ROOT=/opt/android-ndk (without a
Next, the easy way is to make a standalone Android toolchain with the following command:
$ $NDK_ROOT/build/tools/make_standalone_toolchain.py --arch=arm --install-dir=/tmp/android-toolchain
Now you can compile the example by running:
$ make -j -C _gnu-make/ libsuffix=.so binsubdir=android CC=/tmp/android-toolchain/bin/arm-linux-androideabi-gcc CXX=/tmp/android-toolchain/bin/arm-linux-androideabi-g++
Depending on whether you compile for an Android version that requires PIE
CFLAGS='-fpie' CXXFLAGS='-fpie' LDFLAGS='-pie' accordingly.
Loading page aligned library straight from APKs is supported. To test, use the following:
$ zip -Z store app bin/android/library.so $ zipalign -v -f -p 4 ./app.zip ./app.apk
app.apk to your Android device and
$ ./executable --load-library=app.apk!/bin/android/library.so
If you find this library useful and decide to use it in your own projects please drop me a line @gpakosz.