我的buntu手机是nexus 4。以下代码未被执行。
代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("Hello world!\n");
return 0;
}
编译
$ arm-linux-gnueabihf-g++ -static -o hello main.c
- 我将文件复制到
/home/phablet/Downloads
目录 - 打开 ubuntu 手机终端,
- 修改文件属性(
chmod a+x ./hello
) - 执行
./hello
但ubuntu手机提示如下错误
./hello permission denied
为什么?
答案1
我找到了解决办法。您无法从主目录运行二进制文件的原因是终端的 apparmor 配置文件阻止了它。如果您在尝试运行二进制文件后查看 dmesg 输出,您应该会看到类似以下内容:
[140792.471956] type=1400 audit(1431182253.050:175): apparmor="DENIED" operation="exec" profile="com.ubuntu.terminal_terminal_0.7.70" name="/home/phablet/apps/git/usr/bin/git" pid=28134 comm="bash" requested_mask="x" denied_mask="x" fsuid=32011 ouid=32011
它只是告诉你 apparmor 拒绝终端运行你的程序,除此之外,它还告诉你终端的 apparmor 配置文件名称 (com.ubuntu.terminal_terminal_0.7.70)。要允许运行任意二进制文件,我们需要更改该配置文件。
现在,您通常会在 /etc/apparmor.d 下找到 apparmor 配置文件,但在 ubuntu 手机上并非总是如此。似乎特别是点击包(终端是其中之一)会自行处理并将文件放在不同位置。我找到了终端 apparmor 配置文件的多个位置,正确的编辑位置似乎是:
sudo vi /var/lib/apparmor/profiles/click_com.ubuntu.terminal_terminal_0.7.70
应该有这样的部分:
# autopilot runs things in out of ~/autopilot/fakeenv, so lets allow running
# things pretty much everywhere but avoid exec conflicts with the autopilot
# include file which has this rule:
# owner @{HOMEDIRS}/autopilot/fakeenv/*/.local/share/@{APP_PKGNAME}/** mrwklix,
/[^h]** pix,
/[^h][^o][^m][^e]** pix,
@{HOMEDIRS}/*/autopilot/[^f][^a][^k][^e]*/** pix,
如果我理解正确的话,这应该已经允许在 /home 下执行几乎所有操作。注释似乎暗示了同样的意思。然而,由于我无法理解的原因,它不起作用。因此,要使其正常工作,您只需删除(或注释掉)整个部分并将其替换为:
/** pix,
这应该允许终端应用程序始终从任何地方运行所有内容。之后重新启动 apparmor:
sudo service apparmor restart
你就可以走了。