我以前在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可执行文件。
关于c++ - 在clang编译的Termux中运行C代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47351340/