[英]Running C code in Termux compiled by clang
直到昨晚,我一直在 Android 上使用 CppDroid 編譯我的代碼。
更新應用程序后,它開始顯示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 可執行文件。 如果您知道哪些設置搞砸了,您也可以嘗試自己修復。
Termux 提供的 Clang 編譯器默認生成 PIE 可執行文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.