필자의 리눅스 머신에는 2 개의 ELF 바이너리가있다. 나는 그들에 file
를 실행하면 나는 다음과 같은 나타납니다동일한 C 라이브러리 버전의 GNU ABI 태그가 다릅니 까?
File#1: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, for GNU/Linux 2.2.0, not stripped
File#2: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, for GNU/Linux 2.2.5, stripped
for GNU/Linux 2.2.X
부분은 바이너리의
.note.ABI-tag
부분에서 줄기와 링커에 의해 추가
. 결과 값 2.2.X
은 이진 파일에 링크 된 C 라이브러리의 버전에 따라 다르며이 C 라이브러리 버전이 지원하는 가장 낮은 ABI 버전을 설명합니다. 즉, Linux 커널> = 2.2 인 컴퓨터에서 파일 # 1이 지원됩니다. Linux 커널> = 2.2.5 인 시스템에서는 0과 File # 2를 사용하십시오. (맞습니까? 아니면 이미 여기 잘못 있습니까?)
ABI 태그의 차이점은 두 개의 바이너리에 포함 된 두 개의 서로 다른 C 라이브러리 버전에서 비롯된 것이라고 생각합니다. 그러나 바이너리 문자열을 검사 할 때 두 문자열 모두 glibc 2.3.2
문자열을 포함합니다.
어떻게 가능합니까? 버전 번호가 변경되지 않은 GNU C 라이브러리에 대한 패치가 지원되는 ABI 버전을 변경한다는 것은 내게 비합리적으로 보입니다 ...
libc 버전 관리의 복잡함에 익숙하지 않지만,'file'이 제공 한 버전은 실행 파일이 사용하는 실제 기능에 따라 달라집니다. 즉 첫 번째 실행 파일은 v2.2.0에서 마지막으로 변경된 기능을 사용하지만 두 번째 실행 파일은 v2.2.5에서 패치 된 일부 기능을 사용합니다 ...? – DevSolar