在 Termux 中运行由 clang 编译的 C 代码

Tan*_*ent 3 c c++ clang termux

直到昨晚,我一直在 Android 上使用 CppDroid 编译代码。

更新应用程序后,它开始显示position independent executable错误。

我重新安装了旧版本,但仍然遇到相同的错误。

我知道这是Android 5.0及以上版本的问题。那么直到昨晚CppDroid 是如何工作的呢?有人可以给我答案或任何线索吗?

Termux 仅提供 Clang。谁能给我一个成功编译C代码的方法?

权限被拒绝错误

在此输入图像描述

iBu*_*Bug 5

即使是文件模式0777Android 也不允许通过挂载来执行共享存储上的文件noexec

如果你跑

/system/bin/mount | grep /storage
Run Code Online (Sandbox Code Playgroud)

你会发现类似这样的东西:

/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)
                                                                ^~~~~~
Run Code Online (Sandbox Code Playgroud)

实际的挂载点可能会有所不同( /storage/sdcard0),但它肯定是用 挂载的noexec

在尝试执行之前,您应该将可执行文件移动到 Termux 的主目录(或 ext4 安装点中的某个位置)。这就是 CppDroid 所做的。尽管源代码可以存储在任何地方,但它仅运行内部存储中的可执行文件。

如果您想在 Termux 中运行,请按照以下步骤操作:

$ cp <your-program> ~/a.out
$ chmod 777 ~/a.out
$ ~/a.out
program output
$
Run Code Online (Sandbox Code Playgroud)

对于“位置独立可执行文件(PIE)”问题,我建议您清除CppDroid的数据。它使用 GCC 作为编译器,需要-pie选项来生成 PIE 可执行文件。如果您知道哪些设置出了问题,您也可以尝试自行修复。

Termux 提供的 Clang 编译器默认生成 PIE 可执行文件。