Компиляция Clang для iOS (arm64) с ошибкой общего формата LDFLAG — Exec

#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 связан со связанной платформой, а не со всем результатом компиляции