Linux에서 이진 파일의 대상 ISA 확장 결정 (라이브러리 또는 실행 파일)
-
06-07-2019 - |
문제
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
이것은 바이너리에도 작동합니다.