我想执行一个为ppc32编译的elf可执行文件。 我正在使用QEMU来模拟ppc架构。
当我使用strace检查是否需要某些库文件或依赖项时,我在开始时会收到错误。
对现有的跑步机进行操作:
strace ./program
execve("./program", ["./program"], [/* 23 vars */]) = 0
在QEMU机器上进行操作:
strace ./program
execve("./program", ["./program"], [/* 16 vars */]) = -1 ENOENT (No such file or directory)
如何知道哪些文件丢失?
非常感谢。
答案 0 :(得分:0)
如果您在ENOENT
期间收到execve
,可能是由于以下两种情况之一:
我假设您已经检查过(1),在这种情况下,它可能是动态链接器。
您可以使用readelf --program-headers
检查程序请求的链接器:
[jk@pudge bin]$ readelf --program-headers ./program
Elf file type is EXEC (Executable file)
Entry point 0x10000ae4
There are 8 program headers, starting at offset 64
Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
PHDR 0x0000000000000040 0x0000000010000040 0x0000000010000040
0x00000000000001c0 0x00000000000001c0 R E 8
INTERP 0x0000000000000200 0x0000000010000200 0x0000000010000200
0x0000000000000011 0x0000000000000011 R 1
[Requesting program interpreter: /lib64/ld64.so.2]
LOAD 0x0000000000000000 0x0000000010000000 0x0000000010000000
0x000000000000133c 0x000000000000133c R E 10000
LOAD 0x000000000000fd28 0x000000001001fd28 0x000000001001fd28
0x0000000000000388 0x0000000000000398 RW 10000
DYNAMIC 0x000000000000fd50 0x000000001001fd50 0x000000001001fd50
0x00000000000001b0 0x00000000000001b0 RW 8
NOTE 0x0000000000000214 0x0000000010000214 0x0000000010000214
0x0000000000000044 0x0000000000000044 R 4
GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 RW 10
GNU_RELRO 0x000000000000fd28 0x000000001001fd28 0x000000001001fd28
0x00000000000002d8 0x00000000000002d8 R 1
Section to Segment mapping:
Segment Sections...
00
01 .interp
02 .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .text .fini .rodata .eh_frame
03 .ctors .dtors .jcr .dynamic .got .plt .data .bss
04 .dynamic
05 .note.ABI-tag .note.gnu.build-id
06
07 .ctors .dtors .jcr .dynamic .got
[请参阅Requesting program interpreter
标题中的INTERP
行。
一旦你知道这一点,你就需要实际提供那个动态链接器。 qemu的-L
标志可以告诉qemu在哪里搜索链接器。通常,您将-L
指向模拟体系结构的sysroot。