W systemie Linux dystrybuujemy statyczną bibliotekę w wersji 64-bitowej i 32-bitowej. Podczas rozwiązywania problemów z klientem chciałbym, aby mój diagnostyczny skrypt powłoki szybko wyeliminował problem, sprawdzając plik archiwum .a, aby określić, czy jest to plik 32-, czy 64-bitowy. Metody, które mi przychodzą do głowy, są mniej niż eleganckie:
rozpakuj element .o i zapytaj polecenie "plik" (np. 32-bitowy ELF itp.)
zacznij dołączać fikcyjny element członkowski zakodowany w celu wskazania, np. 32bit.o / 64bit.o i użyj „ar -t”, aby sprawdzić
Próbowałem "strings xyz.a | grep 32", ale to nie działa dobrze w wersjach. Nie jest to problem łamania serc, ale jeśli znasz eleganckie rozwiązanie, chciałbym wiedzieć.
linux
32bit-64bit
archive
cvsdave
źródło
źródło
Odpowiedzi:
objdump
wydaje się być najlepszym sposobem:źródło
file
jest łatwiejszy do odczytania, jak podano poniżej stackoverflow.com/a/8909086/233906architecture: i386:x86-64, flags 0x00000039:
… czy to znaczy, że to oba…? to mało prawdopodobne. prosze o pomoc: Di386
(zwykły stary IA32),i386:x86-64
(AMD64) ii386:x64-32
(architektura 32-bitowej przestrzeni adresowej X32 w trybie długim).objdump -f lib.a | grep ^architecture | cut -d' ' -f-2 | sort -u
:)Najprostszym sposobem jest użycie polecenia plik.
źródło
file armeabi/libpique.so
->libpique.so: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /system/bin/linker, stripped
. (2)file x86/libpique.so
->libpique.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, stripped
Po prostu użyj polecenia pliku; to znaczy
file library.so
źródło
Tylko w odpowiedzi:
Jak to ma działać:
W środowisku 32-bitowym otrzymujesz adresy składające się z 8 cyfr szesnastkowych, dodanie nowej linii daje ci.
9
W środowisku 64-bitowym otrzymujesz adresy złożone z 16 cyfr szesnastkowych, po dodaniu nowej linii otrzymasz17
.źródło
Jeśli istnieją funkcje, które są specyficzne dla określonej wersji, możesz wypróbować nm, a następnie grep dla funkcji.
źródło