运行精灵(qemu模拟)ppc失败 - strace错误

时间:2017-10-02 16:19:17

标签: elf qemu strace powerpc

我想执行一个为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)

如何知道哪些文件丢失?

非常感谢。

1 个答案:

答案 0 :(得分:0)

如果您在ENOENT期间收到execve,可能是由于以下两种情况之一:

  1. 二进制本身缺失;或
  2. 缺少二进制文件请求的动态链接器。
  3. 我假设您已经检查过(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。