48

Via C3 프로세서가 장착 된 Advantech POS 보드에서 (다소 오래된) FC3에서 실행되는 Java 어플리케이션과 관련된 문제가 있습니다. Java 애플리케이션에는 JNI를 통해 액세스되는 여러 개의 컴파일 된 공유 라이브러리가 있습니다.Linux에서 바이너리 파일의 타겟 아키텍처 결정 (라이브러리 또는 실행 파일)

Via C3 프로세서는 i686 호환이 가능합니다. 몇 시간 전 동일한 프로세서를 가진 MiniItx 보드에 우분투 6.10을 설치 한 후 나는 이전의 진술이 100 % 사실이 아니라는 것을 발견했다. 우분투 커널은 C3 프로세서에 설정된 i686의 특정 및 선택적 명령이 없기 때문에 시작시 정지되었습니다. i686 세트의 C3 구현에서 누락 된 이러한 명령어는 i686 최적화를 사용할 때 GCC 컴파일러에서 기본적으로 사용됩니다. 이 경우의 해결책은 i386 컴파일 된 우분투 배포판을 사용하는 것이 었습니다.

Java 응용 프로그램의 기본 문제점은 다른 PC의 HD 이미지 (이번에는 Intel P4)에서 복제하여 FC3 배포가 HD에 설치되었다는 것입니다. 그 후 배포판에는 커널과 같은 일부 패키지를 i383 컴파일 된 버전으로 바꾸는 등의 해킹이 필요했습니다.

잠시 동안 작업 한 후 시스템이 추적없이 완전히 중단되는 것이 문제입니다. 일부 i686 코드는 시스템의 어딘가에 남겨 두어 언제든지 무작위로 실행할 수 있습니다 (예 : 일시 중지 모드 또는 이와 유사한 항목에서 복구 한 후).

내 질문은 :

  • 는 "파일는"너무 많은 정보를 제공하지 않습니다 제공을 목표로 (실행 파일 또는 라이브러리)는 이진 파일입니다 구체적으로 어떤 구조에서 알 수있는 도구 나 방법이 있나요 ?

답변

13

모든 명령어를 검사하여 그것이 속한 세트를 정확하게 결정할 도구가 필요하다고 생각합니다. C3 프로세서가 구현 한 특정 명령어 집합에 대한 공식 명칭이 있습니까? 그렇지 않다면, 그것은 더 털이 있습니다.

허용되지 않는 명령어의 비트 패턴을 결정할 수있는 경우 빠른 변형은 파일에서 원시 검색을 수행하는 것일 수 있습니다. 직접 테스트하는 것만으로도 간단한 objdump | grep 체인으로 수행 할 수 있습니다.

+3

objdump -d는 잘못된 opcode를 grep 할 수있는 ASM 표현을 가져와야합니다. –

+0

나는 당신이 제안하는 방식대로 갈 것이라고 생각합니다. vmlinuz를 디 컴파일하는 방법을 알아 내면됩니다 (커널 자체가 i386 또는 i686 버전인지는 확실하지 않습니다). –

+0

+1. 그것은 내 경우에는별로 도움이되지 않지만, 나는이 해킹 방법을 정말 좋아합니다! –

89

unix.linux 'file'명령이 좋습니다. 주어진 바이너리의 타겟 아키텍처와 운영체제를 일반적으로 감지 할 수 있습니다. (그리고 1973 년부터 계속 켜고 있습니다.)

물론 unix/linux에서 실행하지 않는다면 비트 붙어. 현재 런타임에서 호출 할 수있는 Java 기반 포트를 찾으려고합니다.하지만 그런 행운은 없습니다.

진수 : ELF 32 비트 LSB 실행, ARM, 버전 1 (SYSV), 동적 GNU/리눅스 2.4 (공유 libs와 사용) 연결

유닉스 '파일'명령은 다음과 같은 정보를 제공합니다.17, 제거하지

아키텍처의 세부 사항에 대한 더 자세한 정보는 반환 (유닉스) 'objdump를 -f'명령을 암시하는

:

아키텍처 : 팔, 플래그 0x00000112 : EXEC_P, HAS_SYMS, D_PAGED이 실행 파일 (대상으로 ARM 프로세서에 대한 I 86 시스템에서 컴파일) gcc의 크로스 컴파일러 내가 여기에있어 어떤 한 번 더 솔루션을 추가하기로 결정

+2

나는 무작위로 Google 검색에서 얻은 것이고 큰 도움이되었다. thnx – aaronstacy

+4

질문은 특별히 ** 파일 **을 넘어 설 것을 요청하지만, ** file **은 내가 원했던 것입니다.그래서 이것이 실제로 좋은 대답인지 의심 스럽습니다. 왜냐하면 그것은 실제 qeustion에 대답하지 않았기 때문에 의심 스럽습니다. 그러나 그것은 내 대답이었고 분명히 aaronstacy도 있습니다! – patrickvacek

+2

('유닉스' 'objdump -f'명령에 대한 정보를 'file'명령 이상으로 추가했습니다.) 유감스럽게도 '플래그'가 의미하는 비트가 무엇인지 모르겠다. 아마도 gcc 코드를 검색해야 할 필요가있을 것이다. (또는 다양한 대상 컴퓨터의 설정을 비교하는 데 사용하십시오) – Ribo

26

에 의해 컴파일 된

주소 0x0000876c을 시작 : 개인적으로 내 경우 정보 제공 fileobjdump으로 충분하지 않았습니다. grep은 많은 도움이되지 않습니다. readelf -a -W을 통해 사례를 해결합니다.

참고로 이것은 많은 정보를 제공합니다. 아치 관련 정보는 맨 처음과 맨 마지막에 있습니다.

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:    0x83f8 
    Start of program headers:   52 (bytes into file) 
    Start of section headers:   2388 (bytes into file) 
    Flags:        0x5000202, has entry point, Version5 EABI, soft-float ABI 
    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:   31 
    Section header string table index: 28 
... 
Displaying notes found at file offset 0x00000148 with length 0x00000020: 
    Owner     Data size Description 
    GNU     0x00000010 NT_GNU_ABI_TAG (ABI version tag) 
    OS: Linux, ABI: 2.6.16 
Attribute Section: aeabi 
File Attributes 
    Tag_CPU_name: "7-A" 
    Tag_CPU_arch: v7 
    Tag_CPU_arch_profile: Application 
    Tag_ARM_ISA_use: Yes 
    Tag_THUMB_ISA_use: Thumb-2 
    Tag_FP_arch: VFPv3 
    Tag_Advanced_SIMD_arch: NEONv1 
    Tag_ABI_PCS_wchar_t: 4 
    Tag_ABI_FP_rounding: Needed 
    Tag_ABI_FP_denormal: Needed 
    Tag_ABI_FP_exceptions: Needed 
    Tag_ABI_FP_number_model: IEEE 754 
    Tag_ABI_align_needed: 8-byte 
    Tag_ABI_align_preserved: 8-byte, except leaf SP 
    Tag_ABI_enum_size: int 
    Tag_ABI_HardFP_use: SP and DP 
    Tag_CPU_unaligned_access: v6 
+0

면책 조항 :이 파일이 이미 ELF 파일임을 알고있는 경우에만 작동합니다. Mach-O 바이너리 (iPhone 및 MacBook에서 실행되는)는 ELF가 아닌 바이너리 형식의 예입니다. – ryanrhee

+0

@ryanrhee 글쎄, 아직 ELF인지 아니오인지 알지 못하면 명령을 실행 한 후에 분명히 알게 될 것이다. –

+1

아키텍처 정보 만 원한다면'readelf -A'를 사용할 수있다. –

4

@에 내가 정적 라이브러리의 비트 폭을 확인하는 쉬운 방법을 발견 하이 천사의 답변을 확장 : 예를 들면 다음과 같습니다이다 libsomefile.a 내 정적 라이브러리입니다

readelf -a -W libsomefile.a | grep Class: | sort | uniq 

. 다른 ELF 파일에서도 작동해야합니다.

5

Via C3이 i686 클래스 프로세서인지 여부에 대한 모호성에 대답하려면 : i586 클래스 프로세서입니다.

Cyrix는 6x86MX 및 MII 부품에 대한 마케팅 주장에도 불구하고 진정한 686 클래스 프로세서를 제작하지 못했습니다. 다른 누락 된 명령들 중에는 Windows XP 이상을 실행하는 데 필요한 CMPXCHG8b 및 CPUID가 없었던 중요한 두 가지 명령이있었습니다.

내셔널 세미 컨덕터, AMD 및 VIA는 Cyrix 5x86/6x86 코어 (NxP MediaGX, AMD Geode, VIA C3/C7, VIA Corefusion 등)를 기반으로 한 모든 CPU 설계로 귀사의 SSE1/2/3 명령 세트가있는 586 클래스 프로세서.

위의 CPU 중 하나를 접했을 때 빈티지 컴퓨터 프로젝트 (Windows 98SE 이전 버전)가 아닌 경우 비명 소리가 나는 것이 좋습니다. 느린 i386/486 Linux에서 멈추거나 Cyrix 특정 최적화로 모든 소프트웨어를 다시 컴파일해야합니다. 아키텍처를 찾을 수

1

가장 빠른 것은 실행하는 것입니다 :

objdump -f testFile | grep architecture 

이도 진 작동합니다.