문제

VIA C3 프로세서가 장착 된 Advantech POS 보드에서 (오래된) FC3에서 실행되는 Java 응용 프로그램과 관련된 문제가 있습니다. Java 애플리케이션에는 JNI를 통해 액세스하는 여러 편집 된 공유 리브가 있습니다.

C3 프로세서를 통해 I686 호환됩니다. 얼마 전 동일한 프로세서가있는 Miniitx 보드에 Ubuntu 6.10을 설치 한 후, 이전 문은 100% 사실이 아니라는 것을 알았습니다. Ubuntu 커널은 C3 프로세서에 설정된 I686의 특정 및 선택적 지침이 부족하여 시작에 매달려있었습니다. I686 세트의 C3 구현에 누락 된이 지침은 i686 최적화를 사용할 때 GCC 컴파일러가 기본적으로 사용합니다. 이 경우 솔루션은 I386 컴파일 된 Ubuntu 배포판을 사용하는 것이 었습니다.

Java 응용 프로그램의 기본 문제는 FC3 분포가 다른 PC의 HD 이미지, 이번에는 인텔 P4의 이미지에서 클로닝하여 HD에 설치되었다는 것입니다. 그 후 배포는 일부 패키지 (예 : 커널 1)를 i386 컴파일 버전으로 교체하는 등의 해킹을 실행하기 위해 해킹이 필요했습니다.

문제는 잠시 동안 작업 한 후에 시스템이 흔적없이 완전히 매달린다는 것입니다. 일부 i686 코드가 시스템 어딘가에 남겨져 있으며 언제든지 무작위로 실행될 수 있습니다 (예 : 서스펜션 모드 또는 그와 비슷한 것을 복구 한 후).

내 질문은 다음과 같습니다.

  • 이진 파일 (실행 파일 또는 라이브러리)이 요구하는 특정 아키텍처 확장에서 어떤 특정 아키텍처 확장을 찾을 수있는 도구 나 방법이 있습니까? file 충분한 정보를 제공하지 않습니다.
도움이 되었습니까?

해결책

나는 당신이 어떤 세트에 속하는지를 정확하게 결정하기 위해 모든 명령을 확인하는 도구가 필요하다고 생각합니다. C3 프로세서에서 구현 한 특정 명령 세트에 대한 이름이 있습니까? 그렇지 않다면 더 털이 있습니다.

금지 된 지침의 비트 패턴을 결정할 수 있다면 빠른 ''디트 변형은 파일에서 원시 검색을 수행하는 것일 수 있습니다. 직접 테스트하고 간단하게 수행 할 수 있습니다. objdump | grep 예를 들어 체인.

다른 팁

Unix.linux file 명령은 이것에 좋습니다. 일반적으로 주어진 바이너리에 대한 대상 아키텍처 및 운영 체제를 감지 할 수 있습니다 (1973 년 이후로 유지 관리되었습니다. 와우!)

물론, UNIX/Linux에서 실행되지 않는다면 - 당신은 약간 붙어 있습니다. 나는 현재 런타임에 전화 할 수있는 Java 기반 포트를 찾으려고 노력하고 있습니다. 그러나 그런 행운은 없습니다.

유닉스 file 명령은 다음과 같은 정보를 제공합니다.

hex: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.4.17, not stripped

아키텍처의 세부 사항에 대한 자세한 정보는 (UNIX)와 함께 암시됩니다. objdump -f <fileName> 반환하는 명령 :

architecture: arm, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x0000876c

이 실행 파일은 GCC 크로스 컴파일러에 의해 컴파일되었습니다 (ARM 프로세서를 위해 I86 기계에서 대상으로 컴파일 됨)

나는 여기에 온 사람에 대해 하나의 솔루션을 추가하기로 결정합니다. 개인적으로 제 경우에는 file 그리고 objdump 충분하지 않았고 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

VIA C3가 i686 클래스 프로세서인지 여부의 모호성에 답하기 위해 : 그렇지 않습니다. I586 클래스 프로세서입니다.

사이릭스는 6x86MX 및 MII 부품에 대한 마케팅 주장에도 불구하고 진정한 686 클래스 프로세서를 제작 한 적이 없습니다. 다른 누락 된 지침 중에서도 그들이 가지고 있지 않은 두 가지 중요한 지침은 CMPXCHG8B와 CPUID였습니다.

National Semiconductor, AMD 및 VIA는 Cyrix 5x86/6x86 Core (NXP MediaGX, AMD Geode, C3/C7, Corefusion을 통해 NXP MediaGX, AMD Geode, Corefusion 등)를 기반으로 CPU 설계를 모두 생산했습니다. SSE1/2/3 명령 세트.

위에 나열된 CPU를 발견하고 빈티지 컴퓨터 프로젝트 (예 : Windows 98SE 및 Prior)가 아닌 경우 내 권장 사항이 있으면 비명을 지르지 않습니다. 느린 i386/486 Linux에 갇히거나 사이릭스 특정 최적화로 모든 소프트웨어를 다시 컴파일해야합니다.

@hi-angel의 답변을 확장하면서 정적 라이브러리의 비트 너비를 쉽게 확인하는 방법을 찾았습니다.

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

어디에 libsomefile.a 내 정적 라이브러리입니다. 다른 ELF 파일에서도 작동해야합니다.

아키텍처를 찾는 가장 빠른 것은 다음과 같습니다.

objdump -f testFile | grep architecture

이것은 바이너리에도 작동합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top