-rwxrwxrwx root root 8060 2013-01-16 13:57 lcd
root@android:/data # ./lcd
/system/bin/sh: ./lcd: No such file or directory
1|root@android:/data #
lcd是我生成的一个可执行文件,我执行它的时候居然找不到。
12 个解决方案
#1
正常,你的程序是动态编译的,系统找不到动态链接程序!
嗯,还说跟你说点东西,但有些忘记了,现在用的windows,我的资料都是linux下!
#2
怎么解决啊?
#3
执行命令时候用全路径/绝对路径试试?
#4
不行,目测是因为系统的动态链接器与lcd这个程序中的动态链接器的名字或路径不对……
#5
呵呵,回来了!
这里以我系统上的一个打印"hello world!"的程序为例,这个是arm平台的,我X86机器上是无法执行的。
执行shell命令:
“readelf -l hello-static” #这个是静态编译的,编译时使用了-static选项
命令输出:
执行shell命令:
“readelf -l hello-dynamic” #这个是动态编译的
命令输出:
看出两者的区别了么! 动态编译的程序有INTERP段,它指明了程序在加载过程中需要使用的动态链接加载器,如果指定的这个加载器未找到,那么就会提示“ No such file or directory”,如果,找到动态链接加载器,但未找到需要的库,那会有另外的提示。
关于你问题的解决操作:
使用readelf,关注“[Requesting program interpreter: /lib/ld-linux.so.3]”字段。检查目标机里该路径里有没有对应的加载器!
如果没有,你可以使用ln创建一个符号链接以指向你目标机里的动态链接加载器!目测你系统是android,这个我没玩过……
因为你的系统是androd, 它所使用的c库是bxx什么来着忘记了。如果你编译lcd这个程序的时候使用的编译器不是以bxx为内建c库的话,可能还是无法正常运行(感觉,未测试)……
最后,希望能帮到你……
这里以我系统上的一个打印"hello world!"的程序为例,这个是arm平台的,我X86机器上是无法执行的。
执行shell命令:
“readelf -l hello-static” #这个是静态编译的,编译时使用了-static选项
命令输出:
Elf file type is EXEC (Executable file)
Entry point 0x8b28
There are 6 program headers, starting at offset 52
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
EXIDX 0x077610 0x0007f610 0x0007f610 0x00768 0x00768 R 0x4
LOAD 0x000000 0x00008000 0x00008000 0x77d7c 0x77d7c R E 0x8000
LOAD 0x077d7c 0x00087d7c 0x00087d7c 0x00c58 0x020dc RW 0x8000
NOTE 0x0000f4 0x000080f4 0x000080f4 0x00020 0x00020 R 0x4
TLS 0x077d7c 0x00087d7c 0x00087d7c 0x00010 0x00028 R 0x4
GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4
Section to Segment mapping:
Segment Sections...
00 .ARM.exidx
01 .note.ABI-tag .init .text __libc_freeres_fn __libc_thread_freeres_fn .fini .rodata __libc_subfreeres __libc_atexit __libc_thread_subfreeres .ARM.extab .ARM.exidx .eh_frame
02 .tdata .init_array .fini_array .jcr .data.rel.ro .got .data .bss __libc_freeres_ptrs
03 .note.ABI-tag
04 .tdata .tbss
05
执行shell命令:
“readelf -l hello-dynamic” #这个是动态编译的
命令输出:
Elf file type is EXEC (Executable file)
Entry point 0x82c4
There are 8 program headers, starting at offset 52
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
EXIDX 0x00049c 0x0000849c 0x0000849c 0x00008 0x00008 R 0x4
PHDR 0x000034 0x00008034 0x00008034 0x00100 0x00100 R E 0x4
INTERP 0x000134 0x00008134 0x00008134 0x00013 0x00013 R 0x1
[Requesting program interpreter: /lib/ld-linux.so.3]
LOAD 0x000000 0x00008000 0x00008000 0x004a8 0x004a8 R E 0x8000
LOAD 0x0004a8 0x000104a8 0x000104a8 0x0011c 0x00120 RW 0x8000
DYNAMIC 0x0004b4 0x000104b4 0x000104b4 0x000e8 0x000e8 RW 0x4
NOTE 0x000148 0x00008148 0x00008148 0x00020 0x00020 R 0x4
GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4
Section to Segment mapping:
Segment Sections...
00 .ARM.exidx
01
02 .interp
03 .interp .note.ABI-tag .hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .plt .text .fini .rodata .ARM.exidx .eh_frame
04 .init_array .fini_array .jcr .dynamic .got .data .bss
05 .dynamic
06 .note.ABI-tag
07
看出两者的区别了么! 动态编译的程序有INTERP段,它指明了程序在加载过程中需要使用的动态链接加载器,如果指定的这个加载器未找到,那么就会提示“ No such file or directory”,如果,找到动态链接加载器,但未找到需要的库,那会有另外的提示。
关于你问题的解决操作:
使用readelf,关注“[Requesting program interpreter: /lib/ld-linux.so.3]”字段。检查目标机里该路径里有没有对应的加载器!
如果没有,你可以使用ln创建一个符号链接以指向你目标机里的动态链接加载器!目测你系统是android,这个我没玩过……
因为你的系统是androd, 它所使用的c库是bxx什么来着忘记了。如果你编译lcd这个程序的时候使用的编译器不是以bxx为内建c库的话,可能还是无法正常运行(感觉,未测试)……
最后,希望能帮到你……
#6
楼主,假设你的c文件名叫lcd.c
那么,请这么编译:
arm-linux-gcc -o lcd lcd.c -static
然后把lcd 放到目标板上执行就好了
保证没问题。
那么,请这么编译:
arm-linux-gcc -o lcd lcd.c -static
然后把lcd 放到目标板上执行就好了
保证没问题。
#7
这么自信,我马上试试。
#8
root@android:/data # ls -l lcd
-rwxrwxrwx root root 584626 2013-01-18 08:12 lcd
root@android:/data # ./l
lcd local/ lost+found/
root@android:/data # ./lcd
error
1|root@android:/data # ./lcd
error
1|root@android:/data #
提示error这又是什么原因?
#9
我用strace 追踪发现:
127|root@android:/system/bin # strace ./lcd
execve("./lcd", ["./lcd"], [/* 21 vars */]) = 0
uname({sys="Linux", node="localhost", ...}) = 0
brk(0) = 0x1268000
brk(0x1268d00) = 0x1268d00
syscall_983045(0x12684c0, 0x81fc4, 0, 0x82980, 0x82770, 0x8, 0x10, 0xf0005, 0x80
brk(0x1289d00) = 0x1289d00
brk(0x128a000) = 0x128a000
open("/dev/fb0", O_RDWR) = -1 ENOENT (No such file or directory)
ioctl(-1, 0x4600, 0xbedd49a4) = -1 EBADF (Bad file number)
fstat64(1, {st_mode=S_IFCHR|0600, st_rdev=makedev(5, 1), ...}) = 0
ioctl(1, TCGETS or SNDCTL_TMR_TIMEBASE, {B115200 opost isig icanon echo ...}) =0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40
write(1, "error\n", 6error
) = 6
SYS_248(0x1, 0x6eb14, 0x8, 0x1, 0x6eb28 <unfinished ... exit status 1>
root@android:/system/bin #
#10
open("/dev/fb0", O_RDWR) = -1 ENOENT (No such file or directory)
ioctl(-1, 0x4600, 0xbedd49a4) = -1 EBADF (Bad file number)
没有/dev/fb0?
/dev/graphics/fb0 呢?
#11
对这个应该在graphics下面,我已经修改可以打开了。
#12
碰到相同问题,交叉编译可执行文件在arm linux执行时报找不到文件。
-static虽然能解决问题,但编译出来的可执行文件比较大。
用readelf查看动态编译的结果发现其依赖ld-linux.so.3这个库,而我的arm linux的lib下面只有一个符号链接ld-linux-armhf.so.3->arm-linux-gnueabihf/ld-2.15.so,于是新增一个符号链接ld-linux.so.3->arm-linux-gnueabihf/ld-2.15.so。
问题解决。
-static虽然能解决问题,但编译出来的可执行文件比较大。
用readelf查看动态编译的结果发现其依赖ld-linux.so.3这个库,而我的arm linux的lib下面只有一个符号链接ld-linux-armhf.so.3->arm-linux-gnueabihf/ld-2.15.so,于是新增一个符号链接ld-linux.so.3->arm-linux-gnueabihf/ld-2.15.so。
问题解决。
#1
正常,你的程序是动态编译的,系统找不到动态链接程序!
嗯,还说跟你说点东西,但有些忘记了,现在用的windows,我的资料都是linux下!
#2
怎么解决啊?
#3
执行命令时候用全路径/绝对路径试试?
#4
不行,目测是因为系统的动态链接器与lcd这个程序中的动态链接器的名字或路径不对……
#5
呵呵,回来了!
这里以我系统上的一个打印"hello world!"的程序为例,这个是arm平台的,我X86机器上是无法执行的。
执行shell命令:
“readelf -l hello-static” #这个是静态编译的,编译时使用了-static选项
命令输出:
执行shell命令:
“readelf -l hello-dynamic” #这个是动态编译的
命令输出:
看出两者的区别了么! 动态编译的程序有INTERP段,它指明了程序在加载过程中需要使用的动态链接加载器,如果指定的这个加载器未找到,那么就会提示“ No such file or directory”,如果,找到动态链接加载器,但未找到需要的库,那会有另外的提示。
关于你问题的解决操作:
使用readelf,关注“[Requesting program interpreter: /lib/ld-linux.so.3]”字段。检查目标机里该路径里有没有对应的加载器!
如果没有,你可以使用ln创建一个符号链接以指向你目标机里的动态链接加载器!目测你系统是android,这个我没玩过……
因为你的系统是androd, 它所使用的c库是bxx什么来着忘记了。如果你编译lcd这个程序的时候使用的编译器不是以bxx为内建c库的话,可能还是无法正常运行(感觉,未测试)……
最后,希望能帮到你……
这里以我系统上的一个打印"hello world!"的程序为例,这个是arm平台的,我X86机器上是无法执行的。
执行shell命令:
“readelf -l hello-static” #这个是静态编译的,编译时使用了-static选项
命令输出:
Elf file type is EXEC (Executable file)
Entry point 0x8b28
There are 6 program headers, starting at offset 52
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
EXIDX 0x077610 0x0007f610 0x0007f610 0x00768 0x00768 R 0x4
LOAD 0x000000 0x00008000 0x00008000 0x77d7c 0x77d7c R E 0x8000
LOAD 0x077d7c 0x00087d7c 0x00087d7c 0x00c58 0x020dc RW 0x8000
NOTE 0x0000f4 0x000080f4 0x000080f4 0x00020 0x00020 R 0x4
TLS 0x077d7c 0x00087d7c 0x00087d7c 0x00010 0x00028 R 0x4
GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4
Section to Segment mapping:
Segment Sections...
00 .ARM.exidx
01 .note.ABI-tag .init .text __libc_freeres_fn __libc_thread_freeres_fn .fini .rodata __libc_subfreeres __libc_atexit __libc_thread_subfreeres .ARM.extab .ARM.exidx .eh_frame
02 .tdata .init_array .fini_array .jcr .data.rel.ro .got .data .bss __libc_freeres_ptrs
03 .note.ABI-tag
04 .tdata .tbss
05
执行shell命令:
“readelf -l hello-dynamic” #这个是动态编译的
命令输出:
Elf file type is EXEC (Executable file)
Entry point 0x82c4
There are 8 program headers, starting at offset 52
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
EXIDX 0x00049c 0x0000849c 0x0000849c 0x00008 0x00008 R 0x4
PHDR 0x000034 0x00008034 0x00008034 0x00100 0x00100 R E 0x4
INTERP 0x000134 0x00008134 0x00008134 0x00013 0x00013 R 0x1
[Requesting program interpreter: /lib/ld-linux.so.3]
LOAD 0x000000 0x00008000 0x00008000 0x004a8 0x004a8 R E 0x8000
LOAD 0x0004a8 0x000104a8 0x000104a8 0x0011c 0x00120 RW 0x8000
DYNAMIC 0x0004b4 0x000104b4 0x000104b4 0x000e8 0x000e8 RW 0x4
NOTE 0x000148 0x00008148 0x00008148 0x00020 0x00020 R 0x4
GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4
Section to Segment mapping:
Segment Sections...
00 .ARM.exidx
01
02 .interp
03 .interp .note.ABI-tag .hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .plt .text .fini .rodata .ARM.exidx .eh_frame
04 .init_array .fini_array .jcr .dynamic .got .data .bss
05 .dynamic
06 .note.ABI-tag
07
看出两者的区别了么! 动态编译的程序有INTERP段,它指明了程序在加载过程中需要使用的动态链接加载器,如果指定的这个加载器未找到,那么就会提示“ No such file or directory”,如果,找到动态链接加载器,但未找到需要的库,那会有另外的提示。
关于你问题的解决操作:
使用readelf,关注“[Requesting program interpreter: /lib/ld-linux.so.3]”字段。检查目标机里该路径里有没有对应的加载器!
如果没有,你可以使用ln创建一个符号链接以指向你目标机里的动态链接加载器!目测你系统是android,这个我没玩过……
因为你的系统是androd, 它所使用的c库是bxx什么来着忘记了。如果你编译lcd这个程序的时候使用的编译器不是以bxx为内建c库的话,可能还是无法正常运行(感觉,未测试)……
最后,希望能帮到你……
#6
楼主,假设你的c文件名叫lcd.c
那么,请这么编译:
arm-linux-gcc -o lcd lcd.c -static
然后把lcd 放到目标板上执行就好了
保证没问题。
那么,请这么编译:
arm-linux-gcc -o lcd lcd.c -static
然后把lcd 放到目标板上执行就好了
保证没问题。
#7
这么自信,我马上试试。
#8
root@android:/data # ls -l lcd
-rwxrwxrwx root root 584626 2013-01-18 08:12 lcd
root@android:/data # ./l
lcd local/ lost+found/
root@android:/data # ./lcd
error
1|root@android:/data # ./lcd
error
1|root@android:/data #
提示error这又是什么原因?
#9
我用strace 追踪发现:
127|root@android:/system/bin # strace ./lcd
execve("./lcd", ["./lcd"], [/* 21 vars */]) = 0
uname({sys="Linux", node="localhost", ...}) = 0
brk(0) = 0x1268000
brk(0x1268d00) = 0x1268d00
syscall_983045(0x12684c0, 0x81fc4, 0, 0x82980, 0x82770, 0x8, 0x10, 0xf0005, 0x80
brk(0x1289d00) = 0x1289d00
brk(0x128a000) = 0x128a000
open("/dev/fb0", O_RDWR) = -1 ENOENT (No such file or directory)
ioctl(-1, 0x4600, 0xbedd49a4) = -1 EBADF (Bad file number)
fstat64(1, {st_mode=S_IFCHR|0600, st_rdev=makedev(5, 1), ...}) = 0
ioctl(1, TCGETS or SNDCTL_TMR_TIMEBASE, {B115200 opost isig icanon echo ...}) =0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40
write(1, "error\n", 6error
) = 6
SYS_248(0x1, 0x6eb14, 0x8, 0x1, 0x6eb28 <unfinished ... exit status 1>
root@android:/system/bin #
#10
open("/dev/fb0", O_RDWR) = -1 ENOENT (No such file or directory)
ioctl(-1, 0x4600, 0xbedd49a4) = -1 EBADF (Bad file number)
没有/dev/fb0?
/dev/graphics/fb0 呢?
#11
对这个应该在graphics下面,我已经修改可以打开了。
#12
碰到相同问题,交叉编译可执行文件在arm linux执行时报找不到文件。
-static虽然能解决问题,但编译出来的可执行文件比较大。
用readelf查看动态编译的结果发现其依赖ld-linux.so.3这个库,而我的arm linux的lib下面只有一个符号链接ld-linux-armhf.so.3->arm-linux-gnueabihf/ld-2.15.so,于是新增一个符号链接ld-linux.so.3->arm-linux-gnueabihf/ld-2.15.so。
问题解决。
-static虽然能解决问题,但编译出来的可执行文件比较大。
用readelf查看动态编译的结果发现其依赖ld-linux.so.3这个库,而我的arm linux的lib下面只有一个符号链接ld-linux-armhf.so.3->arm-linux-gnueabihf/ld-2.15.so,于是新增一个符号链接ld-linux.so.3->arm-linux-gnueabihf/ld-2.15.so。
问题解决。