我正在我的 PC (12.04) 上为我的 beaglebone (12.04 precise armhf) 交叉编译一个程序。但是当我尝试在 beaglebone 上执行该程序时:
root@omap:/home/ubuntu/helloworld# ./helloworldtest
bash: ./helloworldtest: No such file or directory
以下是一些属性:
root@omap:/home/ubuntu/helloworld# file helloworldtest
helloworldtest: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.31, BuildID[sha1]=0xca0159e70b99493764b601a0195ee18be5e29b31, not stripped
root@omap:/home/ubuntu/helloworld# ls -la
total 80
drwxrwxr-x 2 ubuntu ubuntu 4096 Jul 20 07:51 .
drwxr-xr-x 5 ubuntu ubuntu 4096 Jul 20 07:50 ..
-rwxrwxrwx 1 ubuntu ubuntu 72739 Jul 20 07:42 helloworldtest
我搜索了网络,发现大多数遇到此问题的人都是因为他们使用 64 位机器来编译代码,但我的电脑的处理器是 32 位的,我的 beaglebone 也是 32 位的。
奇怪的是,如果我使用 Angstrom Linux,而不是 Ubuntu 12.04 Precise Armhf,我可以在 beaglebone 上运行这个程序。因此,我确信我的交叉编译过程和交叉编译的程序没有任何问题。
可能存在什么问题?
问候
编辑:也许你会说安装 ia32-libs 但是我无法安装 ia32-libs:
root@omap:~/helloworldtest# apt-get install ia32-libs 正在读取软件包列表... 完成 正在构建依赖关系树
正在读取状态信息... 完成 软件包 ia32-libs 不可用,但被另一个软件包引用。这可能意味着该软件包缺失、已被淘汰或只能从其他来源获得
E:软件包‘ia32-libs’没有安装候选项
编辑2:这是 ldd 输出:
root@omap:/home/ubuntu/helloworld# ldd helloworldtest
not a dynamic executable
我在目标机器(beaglebone)上编译了相同的程序并检查了它的 ldd 输出:
root@omap:~# ldd compiled_on_beaglebone
libgcc_s.so.1 => /lib/arm-linux-gnueabihf/libgcc_s.so.1 (0x400de000)
libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0x400ef000)
/lib/ld-linux-armhf.so.3 (0x40086000)
我的问题可能与此有关。有什么想法吗?
编辑:3 根据@JeremyKerr 的要求:
ubuntu@omap:~/helloworld$ readelf -hl helloworldtest
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: ARM
Version: 0x1
Entry point address: 0x85ad
Start of program headers: 52 (bytes into file)
Start of section headers: 68360 (bytes into file)
Flags: 0x5000002, has entry point, Version5 EABI
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 9
Size of section headers: 40 (bytes)
Number of section headers: 38
Section header string table index: 35
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
EXIDX 0x00071c 0x0000871c 0x0000871c 0x00018 0x00018 R 0x4
PHDR 0x000034 0x00008034 0x00008034 0x00120 0x00120 R E 0x4
INTERP 0x000154 0x00008154 0x00008154 0x00013 0x00013 R 0x1
[Requesting program interpreter: /lib/ld-linux.so.3]
LOAD 0x000000 0x00008000 0x00008000 0x00738 0x00738 R E 0x8000
LOAD 0x000ef8 0x00010ef8 0x00010ef8 0x00144 0x001dc RW 0x8000
DYNAMIC 0x000f08 0x00010f08 0x00010f08 0x000f8 0x000f8 RW 0x4
NOTE 0x000168 0x00008168 0x00008168 0x00044 0x00044 R 0x4
GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4
GNU_RELRO 0x000ef8 0x00010ef8 0x00010ef8 0x00108 0x00108 R 0x1
Section to Segment mapping:
Segment Sections...
00 .ARM.exidx
01
02 .interp
03 .interp .note.ABI-tag .note.gnu.build-id .gnu.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 .note.gnu.build-id
07
08 .init_array .fini_array .jcr .dynamic
编辑4:根据@izx的要求,在Angstrom Linux上交叉编译的可执行文件的ldd和readelf -hl输出:
root@beaglebone:~# ldd hello
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x401c3000)
libc.so.6 => /lib/libc.so.6 (0x401d4000)
/lib/ld-linux.so.3 (0x40098000)
root@beaglebone:~# readelf -hl hello
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: ARM
Version: 0x1
Entry point address: 0x8380
Start of program headers: 52 (bytes into file)
Start of section headers: 2696 (bytes into file)
Flags: 0x5000002, has entry point, Version5 EABI
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 8
Size of section headers: 40 (bytes)
Number of section headers: 38
Section header string table index: 35
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
EXIDX 0x0004e0 0x000084e0 0x000084e0 0x00050 0x00050 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 0x00534 0x00534 R E 0x8000
LOAD 0x000534 0x00010534 0x00010534 0x00124 0x00128 RW 0x8000
DYNAMIC 0x000540 0x00010540 0x00010540 0x000f0 0x000f0 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.extab .ARM.exidx .eh_frame
04 .init_array .fini_array .jcr .dynamic .got .data .bss
05 .dynamic
06 .note.ABI-tag
07
答案1
我通过安装和包解决了该问题libc6-armel
,libsfgcc1
如下libsfstdc++6
所述:https://bugs.launchpad.net/linaro-ubuntu/+bug/1095415
答案2
我通过将位于 /lib/arm-linux-gnueabihf/ 下的 ld-linux.so.3 复制到上层目录 /lib/ 解决了我的问题。
但是我没有在 /lib/ 下直接有一个 ld-linux.so.3,这难道不奇怪吗?
编辑:根据这个,这并不奇怪:https://wiki.linaro.org/OfficeofCTO/HardFloat/LinkerPathCallApr2012