【问题标题】:How to run app linked with glibc.so on android如何在 android 上运行与 glibc.so 链接的应用程序
【发布时间】:2018-04-19 05:52:33
【问题描述】:

编译器为 gcc-linaro-5.5.0-2017.10-i686_arm-linux-gnueabihf.tar.xz,应用在 armv7 android4.4 设备上运行

我的 C 代码是 test.c,

#include"stdio.h"
int main(void)
{
        printf("starting...\n");
        return 0;
}

如果我编译它使用命令:

arm-linux-gnueabihf-gcc -o test_s test.c -g -Wl,-rpath=.:./lib -Wl,-rpath=.:./lib -Wl,-q -Wl,-dynamic-linker=ld-2.21.so -static

它可以很好地工作:

root@test:/data/mine # chmod 555 test_s
root@test:/data/mine # ./test_s
starting

但是,如果我编译它使用命令:

 arm-linux-gnueabihf-gcc -o test_d test.c -g -Wl,-rpath=.:./lib -Wl,-rpath=.:./lib -Wl,-q -Wl,-dynamic-linker=ld-2.21.so

它给了我错误:

root@test:/data/mine # chmod 555 test_d
root@test:/data/mine # ls -l test_d
-rwxrwxrwx root     root        12316 2018-04-19 13:37 test_d
root@test:/data/mine # ./test_d
/system/bin/sh: ./test_d: Permission denied

我已将所需的动态库复制到路径 /data/mine/lib

我应该如何处理这个问题?

更新

在运行命令之前 mount -o remount,exec /data mount 命令返回:

/dev/block/platform/comip-mmc.1/by-name/userdata /data ext4 rw,seclabel,nosuid,nodev,noatime,noauto_da_alloc,data=ordered 0 0

运行后mount -o remount,exec /data mount 返回:

/dev/block/platform/comip-mmc.1/by-name/userdata /data ext4 rw,seclabel,relatime,noauto_da_alloc,data=ordered 0 0

我再次运行 strace ./test_d,它给了我相同的结果 EACCES。 我认为“EACCES文件系统已挂载noexec”不是根本原因,因为test_s在同一目录中,并且运行正确

我尝试用命令编译:arm-linux-gnueabihf-gcc -o test_d_ndl test.c -g -Wl,-rpath=.:./lib

arm-linux-gnueabihf-readelf -d test_d_ndl
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 0x0000000f (RPATH)                      Library rpath: [.:./lib]

我将 libc.so.6 复制到路径 /data/mine 并运行 commond

root@test:/data/mine # ls -l
-rw-rw-rw- root     root       774660 2018-04-20 13:32 ld-2.21.so
drwxrwxr-x root     root              2018-04-17 14:43 lib
-rw-rw-rw- root     root      9180280 2018-04-20 16:50 libc.so.6
-rwxrwxrwx root     root        13808 2018-04-18 16:56 test
-rwxrwxrwx root     root        12316 2018-04-20 13:31 test_d
-r-xr-xr-x root     root        10520 2018-04-20 16:46 test_d_ndl
-rwxrwxrwx root     root         3348 2018-04-20 09:47 test_ld
-rwxrwxrwx root     root      3672356 2018-04-19 09:58 test_s

root@test:/data/mine # strace  ./test_d_ndl
execve("./test_d_ndl", ["./test_d_ndl"], [/* 25 vars */]) = -1 ENOENT (No such file or directory)
write(2, "strace: exec", 12strace: exec)            = 12
write(2, ": ", 2: )                       = 2
write(2, "No such file or directory", 25No such file or directory) = 25
write(2, "\n", 1
)                       = 1
exit_group(1)                           = ?

test_d_ndl 给出错误原因 ENOENT,接下来我该怎么办?

更新

使用以下命令效果很好

arm-linux-gnueabihf-gcc test.c -o test_r_dl -Wl,-rpath=/data/mine/libc/lib -Wl,-dynamic-linker=/data/mine/libc/lib/ld-2.21 .so

【问题讨论】:

  • 编译器是gcc-linaro-5.5.0-2017.10-i686_arm-linux-gnueabihf
  • 不管你的权限问题如何,让可执行世界可写永远不会有任何好处。
  • 是的,我已经更改了命令。

标签: gcc glibc


【解决方案1】:

如果我编译它使用命令: ... -Wl,-dynamic-linker=ld-2.21.so ...

不适建议使用--dynamic-linker 的相对路径:如果您当前的工作目录中有./ld-2.21.so,您的应用将运行。

我已将所需的动态库复制到路径/data/mine/lib

由于您在启动二进制文件时不在/data/mine/lib 中,并且假设您没有ld-2.21.so 复制到/data/mine,因此将找不到您的动态链接器。

但是,通常这是用ENOENT 而不是EPERM 报告的,所以我不确定这是你真正的问题。运行strace ./test_d 可能会提供更多线索。

更新:

root@test:/data/mine # strace ./test_d execve("./test_d", ["./test_d"], [/* 25 vars */]) = -1 EACCES (Permission denied) ...

execveman page 说:

EACCES The filesystem is mounted noexec.

这听起来可能是您的错误的直接原因。

(一旦你mount -o remount,exec /data/mine,它可能会以ENOENT 开始失败。)

【讨论】:


  • root@test:/data/mine # strace ./test_d
    execve("./test_d", ["./test_d"], [/* 25 vars */ ]) = -1 EACCES(权限被拒绝)
    write(2, "strace: exec", 12strace: exec) = 12
    write(2, ": ", 2: ) = 2
    write( 2, "权限被拒绝", 17权限被拒绝) = 17
    write(2, "\n", 1
    ) = 1
    exit_group(1) = ?
  • 很抱歉,我尝试添加空格、br 或换行来格式化评论,但不起作用...
  • 我无法格式化评论,所以我更新了问题,@Employed Russian
  • 你是对的!我试过 arm-linux-gnueabihf-gcc test.c -o test_r_dl -Wl,-rpath=/data/mine/libc/lib -Wl,-dynamic-linker=/data/mine/libc/lib /ld-2.21.so,它的工作原理。非常感谢你!! stackoverflow.com/questions/847179/…
猜你喜欢
  • 2017-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多