Встраиваемая библиотека из двух файлов для поиска текущего исполняемого файла и текущего модуля в файловой системе.
Поддерживаемые платформы:
Окна
Линукс
Мак
iOS
Андроид
QNX Нейтрино
FreeBSD
NetBSD
Стрекоза БСД
СанОС
OpenBSD
Просто добавьте whereami.h
whereami.c
в свою сборку и приступайте к работе. (см. также настройку компиляции)
wai_getExecutablePath()
возвращает путь к исполняемому файлу, включающему его.
wai_getModulePath()
возвращает путь к включающему модулю.
Пример использования:
первый вызов int length = wai_getExecutablePath(NULL, 0, NULL);
чтобы получить длину пути
выделите целевой буфер с помощью path = (char*)malloc(length + 1);
снова вызовите wai_getExecutablePath(path, length, &dirname_length)
чтобы получить путь
добавьте терминальный NUL
-символ с path[length] = '�';
Вот результат примера:
$ 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
Вы можете настроить поведение библиотеки, определив следующие макросы:
WAI_FUNCSPEC
WAI_PREFIX
WAI_MALLOC
WAI_REALLOC
WAI_FREE
В папке _win-vs14/
имеется решение Visual Studio 2015.
В папке _gnu-make/
находится MakeFile
GNU Make 3.81:
$ make -j -C _gnu-make/
См. выше, если вы хотите скомпилировать из командной строки. В противном случае проект Xcode находится в папке _mac-xcode/
.
В папке _ios-xcode/
находится проект Xcode.
Если вы предпочитаете компилировать из командной строки и развертывать на взломанном устройстве через SSH, используйте:
$ 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'"
Вам нужно будет установить Android NDK и указать переменную среды $NDK_ROOT
на путь NDK: например, export NDK_ROOT=/opt/android-ndk
(без завершающего символа /
).
Далее, простой способ — создать автономную цепочку инструментов Android с помощью следующей команды:
$ $NDK_ROOT/build/tools/make_standalone_toolchain.py --arch=arm64 --api 21 --install-dir=/tmp/android-toolchain
Теперь вы можете скомпилировать пример, выполнив:
$ make -j -C _gnu-make/ platform=android architecture=arm64 CC=/tmp/android-toolchain/bin/aarch64-linux-android-gcc CXX=/tmp/android-toolchain/bin/aarch64-linux-android-g++
Поддерживается загрузка библиотеки с выравниванием по страницам прямо из APK. Для тестирования используйте следующее:
$ zip -Z store app bin/android/library.so $ zipalign -v -f -p 4 ./app.zip ./app.apk
Затем скопируйте bin/android/executable
и app.apk
на свое устройство Android и запустите:
$ ./executable --load-library=$PWD/app.apk!/bin/android/library.so