Раньше я собирал свой код с помощью CppDroid на Android до прошлой ночи.
После обновления приложение стало показывать position independent executable
ошибка.
Я переустановил старую версию, но все еще получаю ту же ошибку.
Я знаю, что это проблема с Android 5.0 и выше. Но тогда как CppDroid работал до прошлой ночи? Кто-нибудь может дать мне ответ или какую-либо подсказку?
Termux предоставляет только Clang. Может кто-нибудь дать мне способ успешно скомпилировать код C?
Хотя режим файла 0777
, Android не позволяет выполнять файлы в общем хранилище путем монтажа с noexec
,
Если вы бежите
/system/bin/mount | grep /storage
Вы найдете что-то вроде этого:
/data/media on /storage/emulated type sdcardfs (rw,nosuid,nodev,noexec,noatime,low_uid=1023,low_gid=1023,gid=9997,multi_user,mask=0007,reserved=100MB)
^~~~~~
Фактическая точка монтирования может отличаться (/storage/sdcard0
), но он наверняка установлен с noexec
,
Вы должны переместить исполняемый файл в домашний каталог Termux (или где-нибудь в точке монтирования ext4), прежде чем пытаться выполнить его. Это то, что делает CppDroid. Он запускает только исполняемые файлы во внутреннем хранилище, хотя исходный код может храниться где угодно.
Если вы хотите работать в Termux, выполните следующие действия:
$ cp <your-program> ~/a.out
$ chmod 777 ~/a.out
$ ~/a.out
program output
$
Для проблемы «независимый от позиции исполняемый файл (PIE)» я предлагаю вам очистить данные для CppDroid. Он использует GCC в качестве компилятора, который требует -pie
возможность генерировать исполняемый PIE. Если вы знаете, какие настройки испорчены, вы также можете попробовать исправить это самостоятельно.
Компилятор Clang, предоставляемый Termux, генерирует исполняемые файлы PIE по умолчанию.
Других решений пока нет …