LINUX에서 .a 라이브러리 / 아카이브 32 비트 또는 64 비트?


87

Linux에서 64 비트 및 32 비트 버전의 정적 라이브러리를 배포합니다. 고객의 문제를 해결할 때 진단 셸 스크립트가 .a 아카이브 파일을 확인하여 32 비트인지 64 비트인지 확인하여 문제를 신속하게 제거하고 싶습니다. 나에게 발생하는 방법은 우아하지 않습니다.

  1. .o 멤버를 추출하고 "file"명령을 요청합니다 (예 : ELF 32 비트 등).

  2. 예를 들어 32bit.o / 64bit.o를 나타내도록 코딩 된 더미 멤버를 포함하고 "ar -t"를 사용하여 확인합니다.

나는 "strings xyz.a | grep 32"를 시도했지만 이것은 버전에서 잘 작동하지 않습니다. 가슴 아픈 문제는 아니지만 우아한 해결책을 알고 있다면 알고 싶습니다.


나는 stackoverflow.com/questions/184502/… 에 대해 알고 있으며 더 나은 해결책을 찾고 있습니다.
cvsdave 2011

2
다른 질문의 해결책은 문제를 아주 깔끔하게 해결하는 것 같지만 빠른 방법은 nm foo.a | grep '^ 0'| 머리 -1 | wc -c-결과가 17이면 (16 + 1 == 8bytes + 1 char for line return), 64 비트, 9이면 32bit (8 + 1 == 4bytes + 1 char for line return)
Petesh

14 점을 받으면 어떻게됩니까? o_0
Almo 2015

답변:


123

objdump 가장 좋은 방법 인 것 같습니다.

objdump -f libfoo.a | grep ^architecture

1
file아래에 명시된 바와 같이 쉽게 읽을 수 stackoverflow.com/a/8909086/233906
Cerber

1
내가 얻을 architecture: i386:x86-64, flags 0x00000039:... 그것은 모두 있다는 뜻인가 ..? 그럴 것 같지 않습니다. 도와주세요 : D
graywolf

10
@Paladin : 64 비트입니다. x86 아키텍처는 objdump에서 i386(일반 이전 IA32), i386:x86-64(AMD64) 및i386:x64-32 (X32 32 비트 주소 공간 중 긴 모드 아키텍처)로 설명됩니다.
caf

1
'objdump'의 '-f'플래그는 라이브러리 'libfoo.a'의 전체 파일 헤더 내용을 표시하도록 지정합니다. 'objdump'의이 출력은 'architecture'라는 단어를 검색하는 grep 명령으로 파이프됩니다. 문자 '^'는 'architecture'가 줄을 시작해야 함을 나타냅니다.
Luke Purnell

3
정리하고 objdump -f lib.a | grep ^architecture | cut -d' ' -f-2 | sort -u
중복

33

가장 간단한 방법은 file 명령을 사용하는 것입니다.

$file <.so file or .a file>

31
msys 환경에서 이것은 단순히 타겟 아키텍처가 아닌 <file> : current ar archive 를 에코 합니다 .
스콘 2013.

11
현재의 Linux (Ubuntu) 환경에서도 마찬가지입니다.
Asherah

4
마찬가지로 centos7
Chaim Geretz

Ubuntu 16.04에서 잘 작동합니다. (1) 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
rpattabi

5
.so 파일과 .a 파일은 같은 것이 아닙니다. 이것이 공유 라이브러리에서 작동 함을 보여주는 것은 정적 라이브러리에서 작동 함을 보여주는 것과 동일하지 않습니다. 원래 질문은 정적 라이브러리 (.a 파일)에 관한 것입니다. 내 경우 (MSYS 사용) caf가 게시 한 objdump 솔루션은 파일을 사용하여 스콘이 가져 오는 것과 동일한 'ar 아카이브'를 인쇄하는 곳에서 작동합니다.
Sean Burton

17

파일 명령을 사용하십시오. 즉file library.so


질문은 특히 정적 라이브러리에 대한 것입니다.
pooya13

3

sed 누락은 많은 항목에 표시되고 있음을 의미합니다.

답변 :

count=$(nm foo.a | grep '^0' | head -1 | sed 's/ .*//' | wc -c)
((count == 17)) && echo 64bit
((count == 9)) && echo 32bit
((count == 0)) && echo '??bit'

작동 원리 :

  • nm-라이브러리에서 기호 가져 오기
  • grep-16 진 문자열로 시작하는 행 가져 오기 (파일의 기호 주소)
  • 머리-첫 번째 줄을 얻으십시오
  • sed-공백을 포함하여 공백 이후의 모든 것을 제거합니다.
  • wc-문자 수를 계산합니다.

32 비트 환경에서 8 개의 16 진수로 구성된 주소를 얻습니다. 새 줄을 추가하면 9, 64 비트 환경에서 16 진수로 구성된 주소를 얻습니다 17. 새 줄을 추가하면 .


1
거기에 sed -e 's /. * //'를 던지고 싶을 수도 있습니다
kowey

그건 그렇고 73을 얻습니다. 왜 작동해야하는지 설명 하시겠습니까?
프란체스코 돈디

sed 누락이 중요했습니다. 작동 방식에 대한 설명과 함께 답변이 업데이트되었습니다.
Petesh

1

특정 버전에 특정한 함수가있는 경우 nm를 시도한 다음 함수에 대해 grep을 시도 할 수 있습니다.


라이브러리에서 특정 바이트를 찾는 코드를 작성할 수 있습니다. 두 파일 모두에서 od를 사용하고 둘 사이의 차이점을 찾을 수 있습니다.
ColWhi 2011

1
또 다른 해결책은 라이브러리의 이름을 바꾸는 것입니다.
ColWhi 2011
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.