#c #ios #clang #clang #jailbreak
Вопрос:
Предупреждение новичка здесь, заранее извините, если этот вопрос дублируется (не нашел ответа в другом месте)!
Я столкнулся с проблемами при сборке простого двоичного файла hello для iOS (arm64) на компьютере macOS (x86_64).
Проблема в том, что когда я добавляю LDFLAGS с помощью общей платформы (т. Е. «-shared-framework CoreMedia» или другой платформы) для создания своего двоичного файла, он компилируется нормально, но когда он выполняется на устройстве, я получаю Exec format error
:
iPhone:/tmp root# ./hello
-sh: ./hello: cannot execute binary file: Exec format error
Сборка без -shared
флага выполняется по назначению:
iPhone:/tmp root# ./hello
Hello
Может ли кто-нибудь, пожалуйста, объяснить мне, почему этот флаг вызывает ошибку exec в двоичном файле? Связано ли это с другой платформой, на которой я строю, чем целевое устройство?
Должен ли я строить на платформе arm64, чтобы -shared
флаг работал нормально?
На всякий случай, сценарий сборки:
export CLANG_BIN=`xcrun --sdk iphoneos --find clang`
export CLANGXX_BIN=`xcrun --sdk iphoneos --find clang `
export SDK=`xcrun --sdk iphoneos --show-sdk-path`
export CFLAGS="-fno-builtin -fno-stack-protector -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/ -fno-stack-protector -Wno-builtin-requires-header -fno-stack-check"
#export LDFLAGS="-shared -framework CoreMedia" # <- exec error when this added to compile
export LDFLAGS="-framework CoreMedia" # <- with just this, bin executes fine
export CXX="$CLANGXX_BIN $CFLAGS -isysroot $SDK"
$CXX -arch arm64 -o hello hello.c $LDFLAGS -Wall -Wconversion
Ответ №1:
-shared
это означает, что вы создаете общую библиотеку.
Вы не можете запустить общую библиотеку.
Комментарии:
1. Спасибо за ответ! Я думал, что флаг-shared связан со связанной платформой, а не со всем результатом компиляции