我以前在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/

10-09 19:52