retdec/deps/whereami
Matula Peter cd4a8c491b deps/whereami: remove target for this module
Add its source and header directly to its only user. This is uglier, but much simpler than dealing with targets, exports, installs, etc. This will never be used outside of utils library.
2020-07-21 12:35:24 +02:00
..
whereami deps/whereami: remove target for this module 2020-07-21 12:35:24 +02:00
LICENSE deps/whereami: Remove useless trailing whitespace from LICENSE. 2018-03-17 20:19:40 +01:00
README.md utils: add getThisBinaryPath functions 2018-01-17 12:31:41 +01:00
retdec-whereami-config.cmake New build system (#730) 2020-04-05 16:50:56 +02:00

Where Am I?

A drop-in two files library to locate the current executable and the current module on the file system.

Supported platforms:

  • Windows
  • Linux
  • Mac
  • iOS
  • Android
  • QNX Neutrino
  • FreeBSD
  • SunOS

Just drop whereami.h and whereami.c into your build and get started. (see also customizing compilation)


Usage

  • wai_getExecutablePath() returns the path of the enclosing executable
  • wai_getModulePath() returns the path of the enclosing module

Example usage:

  • 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);
  • call wai_getExecutablePath(path, length, &dirname_length) again to retrieve the path
  • add a terminal NUL character with 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

Customizing compilation

You can customize the library's behavior by defining the following macros:

  • WAI_FUNCSPEC
  • WAI_PREFIX
  • WAI_MALLOC
  • WAI_REALLOC
  • WAI_FREE

Compiling for Windows

There is a Visual Studio 2015 solution in the _win-vs14/ folder.

Compiling for Linux or Mac

There is a GNU Make 3.81 MakeFile in the _gnu-make/ folder:

$ 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 _mac-xcode/ folder.

Compiling for iOS

There is an Xcode project located in the _ios-xcode/ folder.

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 $NDK_ROOT environment variable to the NDK path: e.g. export NDK_ROOT=/opt/android-ndk (without a trailing / character).

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 executables, add 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

Then copy bin/android/executable and app.apk to your Android device and there launch:

$ ./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.

If you use it in a commercial project, consider using Gittip.