Gcc 如何在android上运行与glibc.so链接的应用程序

Gcc 如何在android上运行与glibc.so链接的应用程序,gcc,glibc,Gcc,Glibc,编译器是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

编译器是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
 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_s
root@test:/data/mine # ./test_s
starting
但是,如果我编译它,请使用命令:

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
 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 return:

/dev/block/platform/comip-mmc.1/by-name/userdata /data ext4 rw,seclabel,nosuid,nodev,noatime,noauto_da_alloc,data=ordered 0 0
运行后装载-o重新装载,执行/data 装载返回:

/dev/block/platform/comip-mmc.1/by-name/userdata /data ext4 rw,seclabel,relatime,noauto_da_alloc,data=ordered 0 0
我再次进行测试,每次都会得到相同的结果。 我认为“EACCES The filesystem is mounted noexec”不是根本原因,因为测试在同一个目录中,并且运行正常

我尝试使用以下命令编译:armlinux gnueabihf gcc-o test\u d\u 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复制到path/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\u d\u ndl给出错误原因,然后我可以做什么

更新

使用下面的命令效果很好

armlinux 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

如果我编译它,请使用命令:<代码>-Wl,-动态链接器=ld-2.21。所以

使用
--动态链接器的相对路径是不明智的:如果当前工作目录中有
/ld-2.21,则应用程序将运行

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

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

然而,这通常是通过
enoint
报告的,而不是
EPERM
,因此我不确定这是您真正的问题。运行
strace./test\u d
可以提供额外的线索

更新:

root@test:/data/mine#strace./test#d
execve(“./test\u d”、[”/test\u d”]、[/*25个变量*/])=-1个字符(权限被拒绝).

execve
显示:

这听起来可能是你犯错误的直接原因


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

编译器是gcc-linaro-5.5.0-2017.10-i686_arm-linux-gnueabihf无论你的权限问题如何,使可执行世界可写都不会有任何好处。是的,我已更改命令。
root@test:/data/mine#strace/test()d
execve(“./test(,[”/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
退出组(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。所以,它是有效的。非常感谢你!!