【问题标题】:running elf on (qemu emulated) ppc failed - strace error在(qemu 仿真)ppc 上运行 elf 失败 - strace 错误
【发布时间】:2017-10-02 16:19:17
【问题描述】:

我想执行一个为 ppc32 编译的 elf 可执行文件。 我正在使用 QEMU 来模拟 ppc 架构。

当我使用 strace 检查是否需要一些库文件或依赖项时,我在开始时遇到错误。

现有运行机器上的strace:

strace ./program
execve("./program", ["./program"], [/* 23 vars */]) = 0

QEMU 机器上的 strace:

strace ./program
execve("./program", ["./program"], [/* 16 vars */]) = -1 ENOENT (No such file or directory)

如何知道丢失了哪些文件?

非常感谢。

【问题讨论】:

    标签: elf qemu strace powerpc


    【解决方案1】:

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

    1. 二进制文件本身丢失;或
    2. 二进制文件请求的动态链接器丢失。

    我假设您已经检查了 (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 
    

    [参见INTERP 标头中的Requesting program interpreter 行]。

    一旦您知道这一点,您就需要实际提供该动态链接器。 qemu 的 -L 标志对于告诉 qemu 在哪里搜索链接器很有用。通常,您会将 -L 指向模拟架构的 sysroot。

    【讨论】:

    • 非常感谢您的回答!如果我在原始机器上执行命令,我会得到这个答案 [请求程序解释器:/lib/ld.so.1] 如果我在 qemu 机器上执行相同操作,我会得到:[请求程序解释器:ib/ld.so .1] 这对我来说没有任何意义吗?你的意思是,我执行qemu时必须添加动态链接器,还是我尝试执行elf文件时可以定义动态链接器?
    • 更新:二进制文件似乎有问题。我通过tftp下载了文件,我通过tftp尝试了几次,但似乎有问题。我通过 ftp 下载后,它可以工作了。这是一个非常大的elf文件,有很多依赖关系,有没有办法获得工作的powerpc机器的图像并在qemu中运行它?我认为这将是一个艰巨的挑战,只尝试在仿真的 powerpc linux 上运行“程序”文件。如果我现在启动精灵,它会在几秒钟后退出。
    猜你喜欢
    • 1970-01-01
    • 2023-03-19
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 2012-07-19
    • 2020-08-01
    • 1970-01-01
    相关资源
    最近更新 更多