48

Mamy problem związany z aplikacją Java działającą pod (raczej starym) FC3 na płycie Advantech POS z procesorem Via C3. Aplikacja Java ma kilka skompilowanych udostępnionych bibliotek, do których można uzyskać dostęp za pośrednictwem JNI.Określić docelową architekturę pliku binarnego w systemie Linux (biblioteka lub plik wykonywalny)

Procesor C3 ma być zgodny z i686. Jakiś czas temu po zainstalowaniu Ubuntu 6.10 na płytce MiniItx z tym samym procesorem dowiedziałem się, że poprzednie stwierdzenie nie jest w 100% prawdziwe. Jądro Ubuntu zostało zawieszone przy starcie ze względu na brak konkretnych i opcjonalnych instrukcji zestawu i686 w procesorze C3. Te instrukcje, których brakuje w implementacji C3 zestawu i686, są używane domyślnie przez kompilator GCC podczas korzystania z optymalizacji i686. Rozwiązaniem w tym przypadku było zastosowanie skompilowanej wersji dystrybucji Ubuntu i386.

Podstawowym problemem związanym z aplikacją Java jest to, że dystrybucja FC3 została zainstalowana na HD poprzez klonowanie z obrazu HD innego komputera, tym razem Intel P4. Później dystrybucja wymagała hakowania, aby ją uruchomić, np. Zastąpienie niektórych pakietów (takich jak jądro) wersją skompilowaną i383.

Problem polega na tym, że po pewnym czasie pracy system całkowicie zawiesza się bez śladu. Obawiam się, że jakiś kod i686 został gdzieś w systemie i mógł być wykonany losowo w dowolnym momencie (na przykład po odzyskaniu z trybu zawieszenia lub coś podobnego).

Moje pytanie brzmi:

  • Czy istnieje narzędzie lub sposób, aby dowiedzieć się, na jakie konkretne architektura jest plik binarny (wykonywalny lub biblioteki) skierowany pod warunkiem, że „plik” nie daje tak wiele informacji ?

Odpowiedz

13

Myślę, że potrzebujesz narzędzia, które sprawdza każdą instrukcję, aby dokładnie określić, do którego zestawu należy. Czy istnieje nawet oficjalna nazwa konkretnego zestawu instrukcji implementowanych przez procesor C3? Jeśli nie, to jest jeszcze bardziej owłosione.

Szybkim wariantem może być surowe wyszukiwanie w pliku, jeśli można określić wzór bitowy niedozwolonych instrukcji. Po prostu przetestuj dla nich bezpośrednio, może to być na przykład prosty łańcuch objdump | grep.

+3

objdump -d powinien otrzymać ASM reprezentację, możesz po prostu grep na złe opkody. –

+0

Myślę, że pójdę tak, jak pan proponuje. Muszę tylko dowiedzieć się, jak dekompilować vmlinuz (nie mogę być pewien, czy samo jądro to i386 czy i686). –

+0

+1. W moim przypadku nie jest to zbyt pomocne, ale uwielbiam ten hackowy sposób! –

89

Polecenie "file" unix.linux doskonale nadaje się do tego. Zwykle może wykryć docelową architekturę i system operacyjny dla danego pliku binarnego (i był utrzymywany w stanie włączonym i wyłączonym od 1973 r.) Wow!)

Oczywiście, jeśli nie używasz systemu Unix/Linux - jesteś Trochę utknął. Obecnie próbuję znaleźć port w Javie, który można wywołać w czasie wykonywania .. ale nie ma takiego szczęścia.

polecenia UNIX 'plik' daje informacje, takie jak ten:

hex: ELF 32-bit LSB wykonywalny, ARM, wersja 1 (sysv), dynamicznie połączonej (używa współdzielonych bibliotekami), GNU/Linux 2.4.17, nie pozbawiony

Bardziej szczegółowe informacje o szczegółach architektury są zasugerował z polecenia (UNIX) 'objdump -f', który powraca:

architektura: ramię, flagi 0x00000112: EXEC_P, HAS_SYMS, D_PAGED adres początkowy 0x0000876c

Ten program został skompilowany przez gcc przekroju kompilatora (skompilowany na maszynie I86 dla procesora ARM jako cel)

+2

dotarłem tutaj z losowej wyszukiwarki Google, a była to ogromna pomoc, thnx – aaronstacy

+4

Pytanie prosi o wykroczenie poza ** plik **, ale przyjechałem tutaj na podstawie tytułu i ** plik ** jest dokładnie tym, czego chciałem.Jest więc wątpliwe, czy to naprawdę dobra odpowiedź, ponieważ nie odpowiadała na aktualną sytuację, ale odpowiedziała na moje i najwyraźniej także na aaronstację! – patrickvacek

+2

(Dodałem trochę informacji o (unix) komendzie "objdump -f", która wykracza poza polecenie 'file'. Niestety nie wiem, co oznaczają bity w 'flagach' - prawdopodobnie trzeba przeszukać kod gcc dla (lub użyj ich do porównania ustawień na różnych komputerach docelowych)) – Ribo

26

postanawiam dodać jeszcze jedno rozwiązanie dla każdego, kto tu mamy: osobiście w moim przypadku informacje provi dedowane przez file i objdump było niewystarczające, a grep nie jest zbyt pomocne - rozwiązuję moją sprawę przez readelf -a -W.

Należy pamiętać, że daje to bardzo dużo informacji. Informacje dotyczące łuku znajdują się na samym początku i na samym końcu. Oto przykład:

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

Zastrzeżenie: działa to tylko wtedy, gdy wiesz, że plik jest plikiem ELF. Pliki binarne Mach-O (działające na iPhone'ach i komputerach Macintosh) są przykładem formatu binarnego, który nie jest ELF. – ryanrhee

+0

Dobrze, jeśli jeszcze nie wiesz, czy to ELF czy nie, to po uruchomieniu polecenia na pewno wiesz ☺ –

+1

Chcę tylko informacji o architekturze, możesz użyć 'readelf -A' –

4

Rozwijając @ odpowiedź Hi-Anioła znalazłem łatwy sposób sprawdzić szerokość bitowa biblioteka statyczna:

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

Gdzie jest mój libsomefile.a statyczną bibliotekę. Powinien również działać dla innych plików ELF.

5

Aby odpowiedzieć na niejednoznaczność, czy Via C3 jest procesorem klasy i686: To nie jest procesor klasy i586.

Cyrix nigdy nie wyprodukował prawdziwego procesora klasy 686, pomimo reklamacji marketingowych z częściami 6x86MX i MII. Wśród innych brakujących instrukcji, dwie ważne, których nie posiadały, to CMPXCHG8b i CPUID, które były wymagane do uruchomienia systemu Windows XP i nie tylko.

National Semiconductor, AMD i VIA, wszystkie produkowały procesory oparte na rdzeniu Cyrix 5x86/6x86 (NxP MediaGX, AMD Geode, VIA C3/C7, VIA Corefusion itp.), Które doprowadziły do ​​dziwacznych projektów, w których procesor klasy 586 z zestawami instrukcji SSE1/2/3.

Moje zalecenie, jeśli natkniesz się na jeden z procesorów wymienionych powyżej i nie jest to dla rocznika projektu komputerowego (np. Windows 98SE i wcześniej), a następnie uciekaj od niego krzyczeć. Utkniesz na powolnym Linuxie i386/486 lub będziesz musiał przekompilować całe oprogramowanie za pomocą konkretnych optymalizacji Cyrix.

1

Najszybszy rzeczą znaleźć architekturę byłoby wykonać:

objdump -f testFile | grep architecture 

Działa to nawet dla binarny.

Powiązane problemy