Запуск кода C в Termux, скомпилированного clang

До прошлой ночи я компилировал свой код с помощью CppDroid на Android.

После обновления приложение стало показывать ошибку position independent executable.

Я переустановил старую версию, но все равно получаю ту же ошибку.

Я знаю, что это проблема с Android 5.0 и выше. Но как тогда работал CppDroid до прошлой ночи? Может ли кто-нибудь дать мне ответ или какую-либо подсказку?

Termux предоставляет только Clang. Может ли кто-нибудь дать мне способ успешно скомпилировать код C?

Ошибка отказа в доступе

введите здесь описание изображения


person Tangent    schedule 17.11.2017    source источник
comment
Вы проверили разрешение и владельца a.out?   -  person klutt    schedule 17.11.2017
comment
@klutt Я только что добавил еще одно изображение. Пожалуйста, следите за собой. Я не понимаю символы разрешения.   -  person Tangent    schedule 17.11.2017
comment
Похоже, вам нужно быть root, чтобы выполнить его.   -  person klutt    schedule 17.11.2017
comment
И, пожалуйста, не размещайте изображения, когда в этом нет необходимости.   -  person klutt    schedule 17.11.2017
comment
Android — плохая платформа для изучения разработки на C или C++, простой и понятной.   -  person Jonathon Reinhart    schedule 17.11.2017
comment
@JonathonReinhart По крайней мере, это соответствует стандарту.   -  person iBug    schedule 17.11.2017
comment
Raspberry Pi с Raspbian был бы гораздо лучшей платформой.   -  person Jonathon Reinhart    schedule 17.11.2017
comment
@JonathonReinhart Согласен. По крайней мере, Raspbian — это полноценный дистрибутив GNU/Linux, который намного лучше, чем Android.   -  person iBug    schedule 17.11.2017
comment
Кроме того: каждый раз, когда я вижу результат компиляции, принадлежащий root, маленький кусочек внутри меня умирает.   -  person Markus W Mahlberg    schedule 17.11.2017
comment
Я знаю, что это поздний ответ, но проверьте это   -  person Yvain    schedule 03.07.2019


Ответы (1)


Несмотря на то, что файловый режим 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.

person iBug    schedule 17.11.2017
comment
Это не сработало. Снова показывает ту же ошибку даже после выполнения chmod 777 ~/a.out - person Tangent; 17.11.2017
comment
Здесь сработало отлично! - person João Paulo; 05.05.2018