2017-10-02 3 views
1

ppc32 용으로 컴파일 된 elf 실행 파일을 실행하고 싶습니다. QEMU를 사용하여 ppc 아키텍처를 에뮬레이트하고 있습니다.elf on (qemu emulated) ppc failed - strace error

strace를 사용하여 라이브러리 파일이나 종속성이 필요한지 확인하기 위해 처음에는 오류가 발생합니다. 기존의 실행중인 컴퓨터에

strace를 :

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

어떻게 누락되는 파일을 알 수있다 다음 QEMU 기계에

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

strace를?

대단히 감사합니다.

답변

0

당신이 execve 동안 ENOENT, 그것은 가능성이 높습니다 얻을 경우 두 가지 중 하나 일

  1. 자체가 누락 된 바이너리; 또는
  2. 바이너리가 요청한 동적 링커가 없습니다.

(1)을 확인했다고 가정합니다.이 경우 아마도 동적 링커 일 것입니다. 확인할 수

는 프로그램 readelf --program-headers으로 요청 링커 :

[[email protected] 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에게 링커를 검색 할 위치를 알려주는 데 유용 할 수 있습니다. 일반적으로 에뮬레이트 된 아키텍처의 경우 sysroot로 -L을 지정합니다.

+0

답변 해 주셔서 감사합니다. 원래 컴퓨터에서 명령을 실행하면이 대답을 얻습니다. [프로그램 인터프리터 요청 : /lib/ld.so.1] qemu 컴퓨터에서 동일한 작업을 수행하면 다음과 같이 나타납니다. [요청 프로그램 인터프리터 : ib /ld.so.1] 이것은 나에게 어떤 이해가되지 않습니까? qemu를 실행할 때 동적 링커를 추가해야합니까, 아니면 elf 파일을 실행하려고 할 때 동적 링커를 정의 할 수 있습니까? – Manuel

+0

업데이트 : 바이너리에 문제가있는 것으로 보입니다. tftp를 통해 파일을 다운로드했는데 tftp를 통해 여러 번 시도했지만 문제가있는 것으로 보입니다. ftp를 통해 다운로드 한 후 작동합니다. 매우 큰 elf 파일입니다. 많은 의존성이 있습니다. 작동하는 powerpc 시스템의 이미지를 얻고 qemu에서 실행하는 방법이 있습니까? 나는 에뮬레이트 된 powerpc 리눅스에서만 "프로그램"파일을 실행하려고 시도하는 것이 어려운 도전이라고 생각한다. 지금 엘프를 시작하면 몇 초 후에 퇴장합니다. – Manuel