2017-11-13 34 views
0

필자의 리눅스 머신에는 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 버전을 변경한다는 것은 내게 비합리적으로 보입니다 ...

+0

libc 버전 관리의 복잡함에 익숙하지 않지만,'file'이 제공 한 버전은 실행 파일이 사용하는 실제 기능에 따라 달라집니다. 즉 첫 번째 실행 파일은 v2.2.0에서 마지막으로 변경된 기능을 사용하지만 두 번째 실행 파일은 v2.2.5에서 패치 된 일부 기능을 사용합니다 ...? – DevSolar

답변

0

glibc ABI는 커널 버전이며, 테스트 스위트는 새로 빌드 된 glibc가 공식 ABI를 준수하는지 확인하려고 시도합니다.

glibc 릴리스에서 요구되는 최소 커널 버전은 glibc 구성 시간에 지정할 수 있으며, 이는 .note.ABI-tag 섹션에서 끝납니다. glibc 소스를 패치 할 필요가 없습니다. 나는 구성된 최소 커널 버전이 동적으로 링크 된 바이너리에서 끝나는 것이 옳은 것인지 잘 모르겠다. (다른 커널에서 바이너리를 다르게 빌드 한 glibc로 실행 가능해야하기 때문이다.)

그러나 정적으로 링크 된 바이너리의 경우, 더 높은 최소 커널 버전을 구성하면 프로그램이 이전 커널에서 실행되지 않으므로 정확합니다.

+0

답장을 보내 주셔서 감사합니다. 그렇다면 지원되는 커널 버전에서 변경된 사항은 무엇이라고 생각하십니까? 링커가 어떤 커널 버전이 필요한지 결정하고 바이너리에 포함 된 다른 정적 라이브러리가 있으면 최소 커널 버전을 부풀릴 수 있습니까? –

+0

이 두 바이너리가 glibc의 다른 버전에 대해 정적으로 링크되었다고 가정합니다. –